From 0cac0a0f20ec13c31701398478bf4ea3c1393b65 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 4 Mar 2013 11:07:10 +0100 Subject: [PATCH 01/62] initial release --- .gitignore | 2 + .jms.yml | 19 + .phppm.yml | 19 + LICENSE | 201 + NOTICE | 4 + README.md | 30 + bin/phpalizer | 12 + composer.json | 51 + composer.lock | 1082 ++ phpunit.xml.dist | 33 + res/PHPUnit-3.7.10.tar.gz | Bin 0 -> 126835 bytes res/php-5.2-core-api/PDO.php | 744 + res/php-5.2-core-api/Reflection.php | 1743 +++ res/php-5.2-core-api/SPL.php | 4954 ++++++ res/php-5.2-core-api/SQLite.php | 923 ++ res/php-5.2-core-api/SimpleXML.php | 254 + res/php-5.2-core-api/basic.php | 1133 ++ res/php-5.2-core-api/bcmath.php | 171 + res/php-5.2-core-api/bz2.php | 176 + res/php-5.2-core-api/calendar.php | 336 + res/php-5.2-core-api/com_dotnet.php | 895 ++ res/php-5.2-core-api/ctype.php | 156 + res/php-5.2-core-api/curl.php | 1554 ++ res/php-5.2-core-api/date.php | 1459 ++ res/php-5.2-core-api/dom.php | 4624 ++++++ res/php-5.2-core-api/exif.php | 147 + res/php-5.2-core-api/filter.php | 496 + res/php-5.2-core-api/ftp.php | 732 + res/php-5.2-core-api/gd.php | 2371 +++ res/php-5.2-core-api/gettext.php | 158 + res/php-5.2-core-api/hash.php | 207 + res/php-5.2-core-api/ibm_db2.php | 1844 +++ res/php-5.2-core-api/iconv.php | 458 + res/php-5.2-core-api/imagick.php | 5344 +++++++ res/php-5.2-core-api/imap.php | 1483 ++ res/php-5.2-core-api/intl.php | 2088 +++ res/php-5.2-core-api/json.php | 53 + res/php-5.2-core-api/ldap.php | 939 ++ res/php-5.2-core-api/libxml.php | 230 + res/php-5.2-core-api/mbstring.php | 1278 ++ res/php-5.2-core-api/mcrypt.php | 666 + res/php-5.2-core-api/mhash.php | 109 + res/php-5.2-core-api/mime_magic.php | 19 + res/php-5.2-core-api/mssql.php | 637 + res/php-5.2-core-api/mysql.php | 865 ++ res/php-5.2-core-api/mysqli.php | 2108 +++ res/php-5.2-core-api/oci8.php | 1904 +++ res/php-5.2-core-api/odbc.php | 996 ++ res/php-5.2-core-api/openssl.php | 956 ++ res/php-5.2-core-api/pcre.php | 459 + res/php-5.2-core-api/pdo_mysql.php | 5 + res/php-5.2-core-api/pdo_pgsql.php | 5 + res/php-5.2-core-api/pdo_sqlite.php | 5 + res/php-5.2-core-api/pgsql.php | 2018 +++ res/php-5.2-core-api/posix.php | 798 + res/php-5.2-core-api/session.php | 357 + res/php-5.2-core-api/soap.php | 468 + res/php-5.2-core-api/sockets.php | 1762 +++ res/php-5.2-core-api/standard.php | 12245 +++++++++++++++ res/php-5.2-core-api/tidy.php | 691 + res/php-5.2-core-api/tokenizer.php | 155 + res/php-5.2-core-api/wddx.php | 84 + res/php-5.2-core-api/xml.php | 600 + res/php-5.2-core-api/xmlreader.php | 285 + res/php-5.2-core-api/xmlwriter.php | 1025 ++ res/php-5.2-core-api/xsl.php | 143 + res/php-5.2-core-api/zip.php | 568 + res/php-5.2-core-api/zlib.php | 393 + res/php-5.3-core-api/Core.php | 1192 ++ res/php-5.3-core-api/PDO.php | 751 + res/php-5.3-core-api/Phar.php | 2175 +++ res/php-5.3-core-api/Reflection.php | 1891 +++ res/php-5.3-core-api/SPL.php | 6998 +++++++++ res/php-5.3-core-api/SQLite.php | 1026 ++ res/php-5.3-core-api/SimpleXML.php | 488 + res/php-5.3-core-api/basic.php | 97 + res/php-5.3-core-api/bcmath.php | 171 + res/php-5.3-core-api/bz2.php | 176 + res/php-5.3-core-api/calendar.php | 336 + res/php-5.3-core-api/com_dotnet.php | 898 ++ res/php-5.3-core-api/ctype.php | 156 + res/php-5.3-core-api/curl.php | 1584 ++ res/php-5.3-core-api/date.php | 1920 +++ res/php-5.3-core-api/dom.php | 4732 ++++++ res/php-5.3-core-api/ereg.php | 230 + res/php-5.3-core-api/exif.php | 147 + res/php-5.3-core-api/fileinfo.php | 194 + res/php-5.3-core-api/filter.php | 497 + res/php-5.3-core-api/ftp.php | 732 + res/php-5.3-core-api/gd.php | 2378 +++ res/php-5.3-core-api/gettext.php | 158 + res/php-5.3-core-api/hash.php | 219 + res/php-5.3-core-api/ibm_db2.php | 1844 +++ res/php-5.3-core-api/iconv.php | 458 + res/php-5.3-core-api/imagick.php | 5356 +++++++ res/php-5.3-core-api/imap.php | 1560 ++ res/php-5.3-core-api/json.php | 121 + res/php-5.3-core-api/ldap.php | 947 ++ res/php-5.3-core-api/libxml.php | 231 + res/php-5.3-core-api/mbstring.php | 1363 ++ res/php-5.3-core-api/mcrypt.php | 666 + res/php-5.3-core-api/mssql.php | 637 + res/php-5.3-core-api/mysql.php | 867 ++ res/php-5.3-core-api/mysqli.php | 2029 +++ res/php-5.3-core-api/mysqlnd.php | 5 + res/php-5.3-core-api/oci8.php | 1901 +++ res/php-5.3-core-api/odbc.php | 996 ++ res/php-5.3-core-api/openssl.php | 1085 ++ res/php-5.3-core-api/pcre.php | 479 + res/php-5.3-core-api/pdo_mysql.php | 5 + res/php-5.3-core-api/pdo_pgsql.php | 5 + res/php-5.3-core-api/pdo_sqlite.php | 5 + res/php-5.3-core-api/pgsql.php | 2164 +++ res/php-5.3-core-api/posix.php | 798 + res/php-5.3-core-api/session.php | 360 + res/php-5.3-core-api/soap.php | 494 + res/php-5.3-core-api/sockets.php | 1777 +++ res/php-5.3-core-api/sqlite3.php | 470 + res/php-5.3-core-api/standard.php | 12304 +++++++++++++++ res/php-5.3-core-api/tidy.php | 737 + res/php-5.3-core-api/tokenizer.php | 160 + res/php-5.3-core-api/wddx.php | 85 + res/php-5.3-core-api/xml.php | 600 + res/php-5.3-core-api/xmlreader.php | 285 + res/php-5.3-core-api/xmlwriter.php | 1038 ++ res/php-5.3-core-api/xsl.php | 153 + res/php-5.3-core-api/zip.php | 572 + res/php-5.3-core-api/zlib.php | 393 + res/php-5.4-core-api/Core.php | 1596 ++ res/php-5.4-core-api/PDO.php | 1448 ++ res/php-5.4-core-api/PDO_Firebird.php | 5 + res/php-5.4-core-api/PDO_ODBC.php | 5 + res/php-5.4-core-api/Phar.php | 2496 +++ res/php-5.4-core-api/Reflection.php | 2577 ++++ res/php-5.4-core-api/SPL.php | 9377 +++++++++++ res/php-5.4-core-api/SPPLUS.php | 56 + res/php-5.4-core-api/SQLite.php | 1089 ++ res/php-5.4-core-api/SimpleXML.php | 529 + res/php-5.4-core-api/ZendCache.php | 30 + res/php-5.4-core-api/ZendDebugger.php | 24 + res/php-5.4-core-api/ZendUtils.php | 24 + res/php-5.4-core-api/apc.php | 391 + res/php-5.4-core-api/basic.php | 100 + res/php-5.4-core-api/bcmath.php | 171 + res/php-5.4-core-api/bz2.php | 177 + res/php-5.4-core-api/calendar.php | 336 + res/php-5.4-core-api/ctype.php | 156 + res/php-5.4-core-api/curl.php | 1706 ++ res/php-5.4-core-api/date.php | 1641 ++ res/php-5.4-core-api/dba.php | 353 + res/php-5.4-core-api/dom.php | 5292 +++++++ res/php-5.4-core-api/enchant.php | 294 + res/php-5.4-core-api/ereg.php | 223 + res/php-5.4-core-api/exif.php | 147 + res/php-5.4-core-api/fileinfo.php | 168 + res/php-5.4-core-api/filter.php | 494 + res/php-5.4-core-api/ftp.php | 736 + res/php-5.4-core-api/gd.php | 2192 +++ res/php-5.4-core-api/geoip.php | 225 + res/php-5.4-core-api/gettext.php | 147 + res/php-5.4-core-api/gmp.php | 682 + res/php-5.4-core-api/hash.php | 333 + res/php-5.4-core-api/http.php | 4484 ++++++ res/php-5.4-core-api/iconv.php | 443 + res/php-5.4-core-api/imagick.php | 6364 ++++++++ res/php-5.4-core-api/imap.php | 1799 +++ res/php-5.4-core-api/interbase.php | 1243 ++ res/php-5.4-core-api/intl.php | 2974 ++++ res/php-5.4-core-api/json.php | 209 + res/php-5.4-core-api/ldap.php | 1063 ++ res/php-5.4-core-api/libxml.php | 266 + res/php-5.4-core-api/mbstring.php | 1445 ++ res/php-5.4-core-api/mcrypt.php | 671 + res/php-5.4-core-api/memcache.php | 294 + res/php-5.4-core-api/memcached.php | 1139 ++ res/php-5.4-core-api/mhash.php | 5 + res/php-5.4-core-api/mime_magic.php | 19 + res/php-5.4-core-api/ming.php | 485 + res/php-5.4-core-api/mssql.php | 1000 ++ res/php-5.4-core-api/mysql.php | 939 ++ res/php-5.4-core-api/mysqli.php | 2730 ++++ res/php-5.4-core-api/mysqlnd.php | 5 + res/php-5.4-core-api/ncurses.php | 1926 +++ res/php-5.4-core-api/oci8.php | 2458 +++ res/php-5.4-core-api/odbc.php | 1018 ++ res/php-5.4-core-api/openssl.php | 1099 ++ res/php-5.4-core-api/pcntl.php | 779 + res/php-5.4-core-api/pcre.php | 512 + res/php-5.4-core-api/pdo_dblib.php | 5 + res/php-5.4-core-api/pdo_mysql.php | 5 + res/php-5.4-core-api/pdo_pgsql.php | 5 + res/php-5.4-core-api/pdo_sqlite.php | 5 + res/php-5.4-core-api/pgsql.php | 2150 +++ res/php-5.4-core-api/posix.php | 798 + res/php-5.4-core-api/ps.php | 1637 ++ res/php-5.4-core-api/pspell.php | 329 + res/php-5.4-core-api/radius.php | 901 ++ res/php-5.4-core-api/readline.php | 164 + res/php-5.4-core-api/recode.php | 52 + res/php-5.4-core-api/removed.php | 81 + res/php-5.4-core-api/session.php | 519 + res/php-5.4-core-api/shmop.php | 114 + res/php-5.4-core-api/snmp.php | 656 + res/php-5.4-core-api/soap.php | 789 + res/php-5.4-core-api/sockets.php | 1962 +++ res/php-5.4-core-api/sqlite3.php | 512 + res/php-5.4-core-api/ssh2.php | 799 + res/php-5.4-core-api/standard.php | 12852 ++++++++++++++++ res/php-5.4-core-api/suhosin.php | 28 + res/php-5.4-core-api/svn.php | 1305 ++ res/php-5.4-core-api/sybase_ct.php | 232 + res/php-5.4-core-api/sysvmsg.php | 275 + res/php-5.4-core-api/sysvsem.php | 69 + res/php-5.4-core-api/sysvshm.php | 120 + res/php-5.4-core-api/tidy.php | 761 + res/php-5.4-core-api/tokenizer.php | 163 + res/php-5.4-core-api/wddx.php | 89 + res/php-5.4-core-api/xdebug.php | 114 + res/php-5.4-core-api/xml.php | 612 + res/php-5.4-core-api/xmlreader.php | 319 + res/php-5.4-core-api/xmlrpc.php | 181 + res/php-5.4-core-api/xmlwriter.php | 815 + res/php-5.4-core-api/xsl.php | 193 + res/php-5.4-core-api/zend.php | 879 ++ res/php-5.4-core-api/zip.php | 670 + res/php-5.4-core-api/zlib.php | 443 + res/test_database.sqlite | Bin 0 -> 1096704 bytes src/Scrutinizer/PhpAnalyzer/Analyzer.php | 226 + .../PhpAnalyzer/AnalyzerAwareInterface.php | 29 + .../ArgumentCheckerInterface.php | 51 + .../ChainableArgumentChecker.php | 78 + .../DefaultArgumentChecker.php | 71 + .../OverloadedCoreFunctionChecker.php | 105 + .../PhpUnitAssertionChecker.php | 63 + src/Scrutinizer/PhpAnalyzer/CliApp.php | 35 + .../Command/BuildTestDatabaseCommand.php | 66 + .../PhpAnalyzer/Command/OutputLogger.php | 43 + .../PhpAnalyzer/Command/RunCommand.php | 86 + .../Config/ArrayNodeDefinition.php | 58 + .../PhpAnalyzer/Config/NodeBuilder.php | 31 + .../ControlFlow/ControlFlowAnalysis.php | 819 + .../ControlFlow/ControlFlowGraph.php | 205 + .../ControlFlow/EdgeCallbackInterface.php | 36 + .../ControlFlow/FixedPointGraphTraversal.php | 90 + .../PhpAnalyzer/ControlFlow/GraphEdge.php | 103 + .../PhpAnalyzer/ControlFlow/GraphNode.php | 86 + .../ControlFlow/GraphReachability.php | 82 + .../ControlFlow/GraphvizSerializer.php | 85 + .../PhpAnalyzer/ControlFlow/PathChecker.php | 238 + .../PhpAnalyzer/DataFlow/BinaryJoinOp.php | 65 + .../BranchedForwardDataFlowAnalysis.php | 112 + .../PhpAnalyzer/DataFlow/DataFlowAnalysis.php | 275 + .../DataFlow/LatticeElementInterface.php | 39 + .../DataFlow/LiveVariableAnalysis/BitSet.php | 108 + .../LiveVariableLattice.php | 57 + .../LiveVariablesAnalysis.php | 339 + .../TypeInference/BooleanOutcomePair.php | 136 + .../TypeInference/FlatFlowScopeCache.php | 195 + .../TypeInference/FlowScopeInterface.php | 26 + .../ArrayFunctionInterpreter.php | 489 + .../ChainableFunctionInterpreter.php | 45 + .../CoreFunctionInterpreter.php | 113 + .../FunctionInterpreterInterface.php | 40 + .../TypeInference/LinkedFlowScope.php | 389 + .../DataFlow/TypeInference/LinkedFlowSlot.php | 33 + .../ChainableMethodInterpreter.php | 43 + .../CoreMethodInterpreter.php | 43 + .../MethodInterpreterInterface.php | 41 + .../PhpUnitMethodInterpreter.php | 49 + .../AbstractTypeRestrictionVisitor.php | 76 + .../ChainableReverseAbstractInterpreter.php | 265 + .../RestrictByFalseTypeResultVisitor.php | 83 + .../RestrictByGetClassResultVisitor.php | 185 + .../RestrictByGettypeResultVisitor.php | 119 + .../RestrictByTrueTypeResultVisitor.php | 71 + .../ReverseInterpreterInterface.php | 39 + .../SemanticReverseAbstractInterpreter.php | 813 + .../ScopeBuilder/AbstractScopeBuilder.php | 334 + .../ScopeBuilder/GlobalScopeBuilder.php | 35 + .../ScopeBuilder/LocalScopeBuilder.php | 88 + .../DataFlow/TypeInference/SimpleSlot.php | 62 + .../DataFlow/TypeInference/TypeInference.php | 1451 ++ .../TypeInference/TypedScopeCreator.php | 97 + .../VariableReachability/Definition.php | 81 + .../DefinitionLattice.php | 128 + .../MayBeReachingUseAnalysis.php | 269 + .../MustBeReachingDefAnalysis.php | 337 + .../VariableReachability/UseLattice.php | 172 + .../Exception/AnalysisFailedException.php | 45 + .../PhpAnalyzer/Exception/Exception.php | 23 + .../MaxIterationsExceededException.php | 23 + .../Exception/MaxMemoryExceededException.php | 54 + .../Exception/RuntimeException.php | 23 + .../PhpAnalyzer/Model/AbstractFunction.php | 219 + .../PhpAnalyzer/Model/CallGraph/Argument.php | 100 + .../PhpAnalyzer/Model/CallGraph/CallSite.php | 119 + .../CallGraph/FunctionToFunctionCallSite.php | 65 + .../CallGraph/FunctionToMethodCallSite.php | 66 + .../CallGraph/MethodToFunctionCallSite.php | 66 + .../CallGraph/MethodToMethodCallSite.php | 65 + .../PhpAnalyzer/Model/ClassConstant.php | 92 + .../PhpAnalyzer/Model/ClassMethod.php | 147 + .../PhpAnalyzer/Model/ClassProperty.php | 101 + src/Scrutinizer/PhpAnalyzer/Model/Clazz.php | 440 + src/Scrutinizer/PhpAnalyzer/Model/Comment.php | 195 + .../PhpAnalyzer/Model/CommentCollection.php | 59 + .../PhpAnalyzer/Model/Constant.php | 86 + .../Model/ConstantContainerInterface.php | 45 + .../Model/ContainerConstantInterface.php | 42 + .../Model/ContainerMethodInterface.php | 66 + .../Model/ContainerPropertyInterface.php | 42 + src/Scrutinizer/PhpAnalyzer/Model/File.php | 327 + .../PhpAnalyzer/Model/FileCollection.php | 471 + .../PhpAnalyzer/Model/FixedFile.php | 63 + .../PhpAnalyzer/Model/FixedPhpFile.php | 78 + .../PhpAnalyzer/Model/FunctionParameter.php | 47 + .../PhpAnalyzer/Model/GlobalConstant.php | 93 + .../PhpAnalyzer/Model/GlobalFunction.php | 179 + .../PhpAnalyzer/Model/InterfaceC.php | 238 + .../PhpAnalyzer/Model/InterfaceConstant.php | 97 + .../PhpAnalyzer/Model/InterfaceMethod.php | 105 + src/Scrutinizer/PhpAnalyzer/Model/Method.php | 259 + .../PhpAnalyzer/Model/MethodContainer.php | 221 + .../PhpAnalyzer/Model/MethodParameter.php | 47 + src/Scrutinizer/PhpAnalyzer/Model/Package.php | 138 + .../PhpAnalyzer/Model/PackageScanner.php | 94 + .../PhpAnalyzer/Model/PackageVersion.php | 400 + .../PhpAnalyzer/Model/Parameter.php | 112 + .../Model/Persister/ArgumentPersister.php | 50 + .../Model/Persister/CallSitePersister.php | 121 + .../Model/Persister/ConstantPersister.php | 101 + .../Model/Persister/FunctionPersister.php | 74 + .../Persister/GlobalConstantPersister.php | 50 + .../Persister/MethodContainerPersister.php | 143 + .../Model/Persister/MethodPersister.php | 129 + .../Persister/PackageVersionPersister.php | 76 + .../Model/Persister/ParameterPersister.php | 75 + .../Model/Persister/PropertyPersister.php | 96 + src/Scrutinizer/PhpAnalyzer/Model/PhpFile.php | 60 + .../PhpAnalyzer/Model/Property.php | 117 + .../Model/Repository/EntityTypeProvider.php | 232 + .../Model/Repository/PackageRepository.php | 218 + src/Scrutinizer/PhpAnalyzer/Model/TraitC.php | 110 + .../PhpAnalyzer/Model/Type/PhpTypeType.php | 245 + .../Pass/AnalysisPassInterface.php | 26 + .../PhpAnalyzer/Pass/AstAnalyzerPass.php | 88 + .../PhpAnalyzer/Pass/CallGraphPass.php | 183 + .../Pass/CallbackAnalysisPassInterface.php | 25 + .../Pass/CheckAccessControlPass.php | 197 + .../Pass/CheckBasicSemanticsPass.php | 109 + .../PhpAnalyzer/Pass/CheckForTyposPass.php | 255 + .../Pass/CheckParamExpectsRefPass.php | 95 + .../Pass/CheckUnreachableCodePass.php | 110 + .../Pass/CheckUsageContextPass.php | 317 + .../PhpAnalyzer/Pass/CheckVariablesPass.php | 124 + .../PhpAnalyzer/Pass/CheckstylePass.php | 264 + .../Pass/CheckstylePassConfiguration.php | 106 + .../Pass/ConfigurablePassInterface.php | 46 + .../PhpAnalyzer/Pass/ConfigurableTrait.php | 87 + .../Pass/DeadAssignmentsDetectionPass.php | 236 + .../PhpAnalyzer/Pass/DocCommentFixingPass.php | 656 + .../DocCommentFixingPassConfiguration.php | 37 + .../PhpAnalyzer/Pass/FixingAnalyzerPass.php | 102 + .../Pass/InferTypesFromCallSitesPass.php | 84 + .../Pass/InferTypesFromDocCommentsPass.php | 308 + .../PhpAnalyzer/Pass/LoggingPass.php | 47 + .../Pass/LoopsMustUseBracesPass.php | 124 + .../Pass/MarkPassedByRefArgsPass.php | 50 + .../PhpAnalyzer/Pass/OldCodingStylePass.php | 308 + .../Pass/PhpunitAssertionsPass.php | 199 + .../PhpAnalyzer/Pass/PrecedenceChecksPass.php | 217 + .../PhpAnalyzer/Pass/ReflectionFixerPass.php | 127 + .../Pass/ReflectionUsageCheckPass.php | 196 + .../PhpAnalyzer/Pass/RepeatedPass.php | 123 + .../Pass/RepeatedPassAwareInterface.php | 24 + .../Pass/ReturnTypeScanningPass.php | 138 + .../Pass/SimplifyBooleanReturnPass.php | 201 + .../Pass/SuccessiveTokenAndAstAnalzyer.php | 64 + .../PhpAnalyzer/Pass/SuspiciousCodePass.php | 640 + .../Pass/TokenAndAstStreamAnalyzerPass.php | 64 + .../Pass/TokenStreamAnalyzerPass.php | 56 + .../PhpAnalyzer/Pass/TypeInferencePass.php | 110 + .../PhpAnalyzer/Pass/TypeScanningPass.php | 349 + .../PhpAnalyzer/Pass/UnusedCodeChecksPass.php | 54 + .../Pass/UseStatementFixerPass.php | 515 + .../Pass/VariableReachabilityPass.php | 59 + .../Pass/VerifyPhpDocCommentsPass.php | 293 + src/Scrutinizer/PhpAnalyzer/PassConfig.php | 278 + .../PhpAnalyzer/PhpParser/ClassParser.php | 286 + .../PhpParser/DocCommentParser.php | 418 + .../PhpAnalyzer/PhpParser/FunctionParser.php | 56 + .../PhpAnalyzer/PhpParser/NodeTraversal.php | 236 + .../PhpAnalyzer/PhpParser/NodeUtil.php | 548 + .../PhpAnalyzer/PhpParser/ParameterParser.php | 57 + .../PhpParser/PreOrderCallback.php | 47 + .../PhpParser/Scope/MemoizedScopeCreator.php | 40 + .../PhpAnalyzer/PhpParser/Scope/Scope.php | 161 + .../PhpParser/Scope/ScopeCreatorInterface.php | 32 + .../PhpParser/Scope/StaticScopeInterface.php | 52 + .../PhpParser/Scope/StaticSlotInterface.php | 44 + .../PhpParser/Scope/SyntacticScopeCreator.php | 235 + .../PhpAnalyzer/PhpParser/Scope/Variable.php | 101 + .../Traversal/AbstractPostOrderCallback.php | 29 + .../Traversal/AbstractScopedCallback.php | 33 + .../PhpParser/Traversal/CallbackInterface.php | 46 + .../Traversal/ScopedCallbackInterface.php | 47 + .../PhpAnalyzer/PhpParser/TreeSerializer.php | 83 + .../PhpAnalyzer/PhpParser/Type/AllType.php | 77 + .../PhpAnalyzer/PhpParser/Type/ArrayType.php | 330 + .../PhpParser/Type/BooleanType.php | 76 + .../PhpParser/Type/CallableType.php | 56 + .../PhpAnalyzer/PhpParser/Type/DoubleType.php | 67 + .../PhpAnalyzer/PhpParser/Type/FalseType.php | 77 + .../PhpParser/Type/IntegerType.php | 67 + .../PhpParser/Type/MemoryTypeProvider.php | 103 + .../PhpAnalyzer/PhpParser/Type/NamedType.php | 101 + .../PhpParser/Type/NoObjectType.php | 94 + .../PhpAnalyzer/PhpParser/Type/NoType.php | 72 + .../PhpAnalyzer/PhpParser/Type/NullType.php | 76 + .../PhpParser/Type/NullTypeProvider.php | 49 + .../PhpAnalyzer/PhpParser/Type/ObjectType.php | 45 + .../PackageAwareTypeProviderInterface.php | 29 + .../PhpAnalyzer/PhpParser/Type/PhpType.php | 708 + .../PhpParser/Type/ProxyObjectType.php | 265 + .../PhpParser/Type/ResourceType.php | 51 + .../PhpAnalyzer/PhpParser/Type/StringType.php | 72 + .../PhpParser/Type/TernaryValue.php | 139 + .../PhpAnalyzer/PhpParser/Type/ThisType.php | 68 + .../PhpParser/Type/TypeChecker.php | 139 + .../PhpAnalyzer/PhpParser/Type/TypeLexer.php | 136 + .../PhpAnalyzer/PhpParser/Type/TypeParser.php | 313 + .../PhpParser/Type/TypeProviderInterface.php | 76 + .../PhpParser/Type/TypeRegistry.php | 804 + .../PhpAnalyzer/PhpParser/Type/UnionType.php | 371 + .../PhpParser/Type/UnionTypeBuilder.php | 143 + .../PhpParser/Type/UnknownType.php | 108 + .../PhpParser/Type/VisitorInterface.php | 97 + .../PhpAnalyzer/Util/DebugUtil.php | 50 + .../PhpAnalyzer/Util/TestUtils.php | 122 + .../OverloadedCoreFunctionCheckerTest.php | 174 + .../ControlFlow/ControlFlowAnalysisTest.php | 121 + .../FixedPointGraphTraversalTest.php | 61 + .../Regression/SymfonyPropertyUtil.dot | 21 + .../Regression/SymfonyPropertyUtil.php | 564 + .../Integration/Regression/array_get_elem.dot | 14 + .../Integration/Regression/array_get_elem.php | 3 + .../Integration/Regression/global_scope.dot | 17 + .../Integration/Regression/global_scope.php | 16 + .../symfony_property_util$getValue.dot | 44 + .../symfony_property_util$getValue.php | 21 + ...ny_property_util$writeProperty_excerpt.dot | 24 + ...ny_property_util$writeProperty_excerpt.php | 16 + .../Fixture/Integration/closure.dot | 9 + .../Fixture/Integration/closure.php | 7 + .../Fixture/Integration/closure2.dot | 9 + .../Fixture/Integration/closure2.php | 5 + .../Fixture/Integration/closure3.dot | 13 + .../Fixture/Integration/closure3.php | 11 + .../Fixture/Integration/do_while.dot | 10 + .../Fixture/Integration/do_while.php | 5 + .../Fixture/Integration/exception.dot | 24 + .../Fixture/Integration/exception.php | 11 + .../Fixture/Integration/exception2.dot | 24 + .../Fixture/Integration/exception2.php | 9 + .../Fixture/Integration/exit_die.dot | 28 + .../Fixture/Integration/exit_die.php | 13 + .../ControlFlow/Fixture/Integration/for.dot | 16 + .../ControlFlow/Fixture/Integration/for.php | 5 + .../Fixture/Integration/foreach.dot | 10 + .../Fixture/Integration/foreach.php | 6 + .../Fixture/Integration/function_call.dot | 14 + .../Fixture/Integration/function_call.php | 5 + .../function_with_default_param.dot | 9 + .../function_with_default_param.php | 5 + .../ControlFlow/Fixture/Integration/goto.dot | 13 + .../ControlFlow/Fixture/Integration/goto.php | 7 + .../Fixture/Integration/if_else.dot | 14 + .../Fixture/Integration/if_else.php | 7 + .../Fixture/Integration/if_elseif_else.dot | 25 + .../Fixture/Integration/if_elseif_else.php | 12 + .../Fixture/Integration/namespace.dot | 15 + .../Fixture/Integration/namespace.php | 30 + .../Integration/nested_exception_handlers.dot | 22 + .../Integration/nested_exception_handlers.php | 7 + .../Fixture/Integration/nested_for.dot | 39 + .../Fixture/Integration/nested_for.php | 17 + .../Fixture/Integration/switch.dot | 32 + .../Fixture/Integration/switch.php | 14 + .../Integration/switch_with_if_else.dot | 28 + .../Integration/switch_with_if_else.php | 13 + .../ControlFlow/Fixture/Integration/while.dot | 10 + .../ControlFlow/Fixture/Integration/while.php | 5 + .../ControlFlow/GraphReachabilityTest.php | 79 + .../ControlFlow/IntegrationTest.php | 82 + .../PhpAnalyzer/DataFlow/BinaryJoinOpTest.php | 75 + .../DataFlow/DataFlowAnalysisTest.php | 660 + .../DataFlow/LiveVariables/BitSetTest.php | 101 + .../LiveVariables/LiveVariableLatticeTest.php | 65 + .../LiveVariablesAnalysisTest.php | 187 + .../ArrayFunctionInterpreterTest.php | 269 + .../CoreFunctionInterpreterTest.php | 175 + .../TypeInference/LinkedFlowScopeTest.php | 359 + .../CoreMethodInterpreterTest.php | 87 + ...SemanticReverseAbstractInterpreterTest.php | 906 ++ .../TypeInference/TypeInferenceTest.php | 1134 ++ .../MayBeReachingUseAnalysisTest.php | 178 + .../MustBeReachingAnalysisTest.php | 253 + .../MustBeReachingJoinOpTest.php | 95 + .../Fixture/XmlSerializationVisitor.after.php | 308 + .../XmlSerializationVisitor.before.php | 284 + .../PhpAnalyzer/Fixture/YamlDriver.after.php | 214 + .../PhpAnalyzer/Fixture/YamlDriver.before.php | 193 + .../Tests/PhpAnalyzer/LibrariesTest.php | 145 + .../Tests/PhpAnalyzer/Model/ClazzTest.php | 78 + .../Model/CommentCollectionTest.php | 34 + .../PhpAnalyzer/Model/FileCollectionTest.php | 72 + .../Tests/PhpAnalyzer/Model/FileTest.php | 34 + .../Model/Fixture/Basic/DefaultFoo.php | 29 + .../Model/Fixture/Basic/FooInterface.php | 27 + .../.svn/vcs_dirs_should_be_ignored | 0 .../Model/Fixture/DirWithSomeFiles/A.php | 3 + .../Fixture/DirWithSomeFiles/Sub-Dir/B.php | 3 + .../Model/Fixture/DirWithSomeFiles/text.txt | 1 + .../PhpAnalyzer/Model/Fixture/zip-file.zip | Bin 0 -> 653 bytes .../Tests/PhpAnalyzer/Model/PackageTest.php | 41 + .../Model/Persister/IntegrationTest.php | 137 + .../Repository/EntityTypeProviderTest.php | 202 + .../Repository/Fixture/libraries/monolog.zip | Bin 0 -> 80338 bytes .../Repository/PackageRepositoryTest.php | 189 + .../Model/Type/PhpTypeTypeTest.php | 148 + .../Pass/BaseAnalyzingPassTest.php | 101 + .../PhpAnalyzer/Pass/BaseFixingPassTest.php | 105 + .../Tests/PhpAnalyzer/Pass/BasePassTest.php | 126 + .../Pass/BaseReviewingPassTest.php | 238 + .../PhpAnalyzer/Pass/BaseVisitorTest.php | 42 + .../PhpAnalyzer/Pass/CallGraphPassTest.php | 178 + .../Pass/CheckAccessControlPassTest.php | 39 + .../Pass/CheckBasicSemanticsPassTest.php | 38 + .../Pass/CheckForTyposPassTest.php | 41 + .../Pass/CheckParamExpectsRefPassTest.php | 39 + .../Pass/CheckUnreachableCodePassTest.php | 34 + .../Pass/CheckUsageContextPassTest.php | 39 + .../Pass/CheckVariablesPassTest.php | 37 + .../PhpAnalyzer/Pass/CheckstylePassTest.php | 39 + .../DeadAssignmentsEliminationPassTest.php | 35 + .../Pass/DocCommentFixingPassTest.php | 38 + .../Fixture/AccessControl/access_control.test | 48 + .../call_from_non_object_context.test | 34 + .../AccessControl/protected_method_call.test | 29 + .../protected_property_access.test | 36 + .../Fixture/AccessControl/static_usage.test | 21 + ...bstract_methods_in_non_abstract_class.test | 20 + .../properties_on_interface.test | 20 + .../Pass/Fixture/CallGraph/cache.php | 16 + .../class_defined_more_than_once.php | 21 + .../Pass/Fixture/CallGraph/mixed_calls.php | 22 + .../CallGraph/target_method_undefined.php | 31 + .../array_with_initializing.test | 12 + .../Fixture/CheckVariables/assign_by_ref.test | 8 + .../CheckVariables/assign_in_if_cond.test | 19 + ...n_initialized_variable_as_array_index.test | 9 + .../Fixture/CheckVariables/preg_match.test | 8 + .../Fixture/CheckVariables/static_assign.test | 6 + .../Fixture/CheckVariables/super_globals.test | 5 + .../CheckVariables/this_in_closure.test | 25 + .../CheckVariables/this_in_static_method.test | 17 + .../CheckVariables/typo_in_variable_name.test | 9 + .../CheckVariables/undeclared_variable.test | 6 + .../Fixture/Checkstyle/interface_naming.test | 9 + .../Pass/Fixture/Checkstyle/left_curlies.test | 28 + ...mplement_interface_or_abstract_method.test | 50 + .../method_with_boolean_return_type.test | 26 + .../Fixture/Checkstyle/mixed_return_type.test | 17 + .../Fixture/Checkstyle/no_get_prefix.test | 13 + .../Checkstyle/private_constructor.test | 30 + .../Fixture/Checkstyle/super_globals.test | 7 + .../Fixture/Checkstyle/utility_class.test | 17 + .../Fixture/ClassWithPropertyInitializer.php | 23 + .../CodingStyle/blank_line_before_return.test | 15 + .../constant_on_left_side_for_binary.test | 6 + .../CodingStyle/property_method_order2.test | 14 + .../CodingStyle/property_methods_order.test | 14 + .../Fixture/CodingStyle/property_order.test | 19 + .../Fixture/CodingStyle/property_order2.test | 15 + .../CodingStyle/short_opening_tags.test | 6 + .../CodingStyle/tabs_for_indentation.test | 7 + .../CodingStyle/trailing_whitespace.test | 7 + .../Fixture/CodingStyle/use_statements.test | 8 + .../Pass/Fixture/DeadAssignment/compact.test | 39 + .../DeadAssignment/dead_assign_in_list.test | 7 + .../DeadAssignment/dead_assignments.test | 9 + .../detects_uses_from_closure.test | 12 + .../DeadAssignment/dynamic_variables.test | 23 + .../DeadAssignment/get_defined_variables.test | 12 + .../ignore_assignments_to_superglobals.test | 5 + .../ignores_assignments_to_references.test | 6 + .../regr_assignment_in_for.test | 4 + .../DeadAssignment/require_or_include.test | 24 + .../DeadAssignment/self_assignment.test | 7 + .../DocCommentFixes/adding_doc_comment.test | 60 + .../Fixture/DocCommentFixes/adding_param.test | 50 + .../DocCommentFixes/adding_param2.test | 41 + .../DocCommentFixes/adding_return.test | 47 + .../DocCommentFixes/adding_return2.test | 41 + .../DocCommentFixes/boolean_and_return.test | 32 + ...do_not_restrict_nullable_object_types.test | 52 + .../DocCommentFixes/incorrect_param_type.test | 46 + .../DocCommentFixes/removing_params.test | 46 + .../respect_interface_types.test | 86 + .../respect_more_specific_type.test | 52 + .../Fixture/DocCommentFixes/return_type.test | 50 + .../return_type_more_specific.test | 38 + .../return_type_on_interfaces.test | 48 + .../Pass/Fixture/DocCommentFixes/typos.test | 23 + .../Fixture/Integration/return_type_bug.test | 26 + .../simplify_boolean_expression.test | 29 + .../Fixture/Integration/symfony_pr_4223.test | 82 + .../symfony_pr_4271_FunctionNode.test | 317 + .../comments_in_between.test | 10 + .../else_if_with_space.test | 10 + .../LoopsMustUseBraces/empty_loop.test | 10 + .../loops_without_braces.test | 19 + .../LoopsMustUseBraces/nested_ifs.test | 11 + .../ParamExpectsRef/function_call.test | 9 + .../Fixture/ParamExpectsRef/some_expr.test | 7 + .../Fixture/ParamExpectsRef/valid_args.test | 20 + .../PhpunitAssertions/assert_false.test | 25 + .../PhpunitAssertions/assert_true.test | 25 + .../access_char_on_empty_string.test | 14 + .../PrecedenceChecks/assignment_in_cond.test | 19 + .../comparison_bitwise_operation.test | 21 + .../Fixture/ReflectionFixer/get_name.test | 64 + .../ignores_all_except_objtypes.test | 9 + .../ReflectionUsage/is_subclass_of.test | 16 + .../properties_instead_of_methods.test | 22 + .../Fixture/ReturnType/builtin_function.php | 12 + .../Fixture/ReturnType/builtin_method.php | 6 + .../ReturnType/composite_return_type.php | 13 + .../Fixture/ReturnType/implicit_return.php | 4 + .../Pass/Fixture/ReturnType/interfaces.php | 7 + .../Fixture/ReturnType/simple_return_type.php | 5 + .../ReturnType/unknown_return_type.php | 5 + .../Pass/Fixture/Simplification/count.test | 6 + .../boolean_true_in_if.test | 15 + .../SimplifyBooleanReturn/if_else_cond.test | 15 + .../if_else_wo_boolean_cond.test | 15 + .../if_wo_else_cond.test | 15 + .../return_same_value.test | 24 + .../SuspiciousCode/alias_conflict.test | 16 + .../SuspiciousCode/alias_conflict_global.test | 15 + .../SuspiciousCode/alias_local_class.test | 12 + .../alias_without_namespace.test | 9 + .../assigning_null_return_value.test | 20 + .../assignment_to_closure_use.test | 9 + .../assignment_to_parameter.test | 16 + .../Fixture/SuspiciousCode/empty_catch.test | 42 + .../no_fallthrough_in_nested_switch.test | 37 + .../no_fallthrough_with_when_if_else.test | 19 + .../non_empty_fallthrough_case.test | 37 + .../non_existent_class_catch.test | 24 + .../non_existent_class_in_instanceof.test | 20 + .../overriding_private_members.test | 19 + .../SuspiciousCode/param_use_conflict.test | 7 + .../parameters_with_same_name.test | 6 + .../annotated-code/array_items.php | 75 + .../annotated-code/boolean_not.php | 31 + .../boolean_with_type_function.php | 16 + .../annotated-code/circular_property_def.php | 55 + .../annotated-code/list_assign.php | 23 + .../method_interpreter_integration.php | 17 + .../annotated-code/phpunit_mocks.php | 38 + .../annotated-code/phpunit_teardown.php | 34 + .../property_refined_in_closure.php | 15 + .../property_refined_in_global_scope.php | 12 + ...erse_interpretation_of_case_statements.php | 23 + .../annotated-code/this_in_closure.php | 31 + .../Pass/Fixture/TypeInference/array_pop.php | 6 + .../TypeInference/constant_as_default.php | 13 + .../TypeInference/constructor_injection.php | 18 + .../Fixture/TypeInference/deadlock_test.php | 42 + .../defining_expr_for_variable.php | 10 + .../Pass/Fixture/TypeInference/foo.php | 667 + .../TypeInference/foreach_with_object.php | 5 + .../TypeInference/global_constants.php | 5 + .../Pass/Fixture/TypeInference/if.php | 9 + .../Fixture/TypeInference/infinite_loop.php | 14 + .../TypeInference/inherited_doc_comment.php | 46 + .../instanceof_in_boolean_and.php | 15 + .../TypeInference/late_binding_types.php | 34 + .../TypeInference/late_binding_types2.php | 28 + .../TypeInference/late_binding_types3.php | 28 + .../Fixture/TypeInference/preg_replace.php | 11 + .../Pass/Fixture/TypeInference/properties.php | 18 + .../TypeInference/refined_property.php | 23 + .../TypeInference/refined_property_2.php | 21 + .../TypeInference/refined_static_property.php | 29 + .../TypeInference/refined_variable.php | 15 + .../TypeInference/refined_variable_2.php | 9 + .../Pass/Fixture/TypeInference/run_test.php | 20 + .../Pass/Fixture/TypeInference/run_test2.php | 72 + .../Fixture/TypeInference/static_and_self.php | 14 + .../TypeInference/typed-asts/array_pop.ast | 55 + .../typed-asts/constant_as_default.ast | 54 + .../typed-asts/defining_expr_for_variable.ast | 67 + .../typed-asts/foreach_with_object.ast | 32 + .../typed-asts/instanceof_in_boolean_and.ast | 109 + .../typed-asts/late_binding_types.ast | 217 + .../typed-asts/late_binding_types2.ast | 148 + .../typed-asts/late_binding_types3.ast | 189 + .../TypeInference/typed-asts/preg_replace.ast | 152 + .../typed-asts/refined_property.ast | 135 + .../typed-asts/refined_property_2.ast | 118 + .../typed-asts/refined_static_property.ast | 226 + .../typed-asts/refined_variable.ast | 88 + .../typed-asts/refined_variable_2.ast | 65 + .../TypeScanning/class_with_interfaces.php | 47 + .../Fixture/TypeScanning/doc_comments.php | 36 + .../Fixture/TypeScanning/global_constants.php | 4 + .../Fixture/TypeScanning/magic_properties.php | 12 + .../TypeScanning/method_wo_visibility.php | 7 + .../TypeScanning/optional_parameter.php | 7 + .../TypeScanning/overridden_method.php | 25 + .../TypeScanning/property_on_interface.php | 11 + .../TypeScanning/variable_parameters.php | 8 + .../Fixture/TypoChecks/SimpleXMLElement.test | 17 + .../Pass/Fixture/TypoChecks/__call.test | 36 + .../Pass/Fixture/TypoChecks/__get.test | 16 + .../Pass/Fixture/TypoChecks/__set.test | 16 + .../Fixture/TypoChecks/missing_method.test | 28 + .../Fixture/TypoChecks/missing_property.test | 22 + .../missing_property_on_interface.test | 12 + .../TypoChecks/property_inside_isset.test | 11 + .../Pass/Fixture/TypoChecks/stdClass.test | 15 + .../TypoChecks/undeclared_property.test | 17 + .../exception_with_include_require.test | 24 + .../Fixture/UnreachableCode/for_loop.test | 11 + .../Pass/Fixture/UnreachableCode/goto.test | 11 + .../Fixture/UnreachableCode/nested_expr.test | 12 + .../UnusedCode/unused_private_method.test | 15 + .../Fixture/UsageContext/__call_method.test | 18 + .../Pass/Fixture/UsageContext/__toString.test | 19 + .../Fixture/UsageContext/array_udiff.test | 12 + .../call_method_on_non_object.test | 27 + .../call_method_with_variable_parameters.test | 6 + .../UsageContext/callable_parameter.test | 22 + .../UsageContext/foreach_value_by_ref.test | 8 + .../foreach_with_non_traversable.test | 6 + .../UsageContext/ignore_null_pointer.test | 21 + .../UsageContext/ignore_unknown_type.test | 8 + .../integer_double_parameter_types.test | 25 + .../interface_subtype_checking.test | 22 + .../UsageContext/invalid_type_arg.test | 22 + .../UsageContext/missing_parameter.test | 26 + .../UsageContext/missing_parameters.test | 8 + .../UsageContext/phpunit_assertion.test | 30 + .../subtype_check_ignores_all_type.test | 18 + .../UsageContext/traversable_hint.test | 14 + .../traversable_ignores_all_type.test | 14 + .../UsageContext/unknown_type_passed.test | 17 + .../all_use_statement_removed.test | 18 + .../bug_used_statement_removed.test | 36 + .../multiple_groups_simplified.test | 21 + .../preserve_indentation.test | 22 + .../preserve_indentation_multiple.test | 24 + .../preserve_multiple_groups.test | 24 + .../preserve_only_multiple.test | 26 + .../preserving_multiple.test | 23 + .../UseStatementFixes/remove_unused.test | 40 + .../sorting_use_statements.test | 23 + .../UseStatementFixes/split_multiple.test | 23 + .../UseStatementFixes/use_with_comment.test | 16 + .../UseStatementFixes/use_with_comment2.test | 15 + .../UseStatementFixes/use_with_comment3.test | 14 + .../UseStatementFixes/use_with_comment4.test | 12 + .../UseStatementFixes/use_with_comments.test | 14 + .../UselessExpression/always_false_expr.test | 7 + .../always_true_expression.test | 7 + .../abstract_collection_persister.test | 46 + .../ask_for_additional_annotations.test | 45 + ...sk_for_additional_array_type_in_union.test | 21 + .../more_specific_array_in_union.test | 27 + .../VerifyDocComments/more_specific_type.test | 71 + .../param_type_mismatch.test | 28 + .../regr_abstract_query.test | 66 + .../VerifyDocComments/regr_paginator.test | 246 + .../return_type_mismatch.test | 21 + .../VerifyDocComments/shortest_imports.test | 31 + .../VerifyDocComments/type_from_comment.test | 24 + .../unprecise_param_type.test | 22 + .../unprecise_return_type.test | 19 + .../Pass/Fixture/scalar_values.php | 7 + .../PhpAnalyzer/Pass/IntegrationTest.php | 47 + .../Pass/LoopsMustUseBracesPassTest.php | 35 + .../Pass/PhpunitAssertionsPassTest.php | 38 + .../Pass/PrecedenceChecksPassTest.php | 38 + .../Pass/ReflectionFixerPassTest.php | 35 + .../Pass/ReflectionUsageCheckPassTest.php | 38 + .../Pass/ReturnTypeScanningPassTest.php | 98 + .../Pass/SimplifyBooleanReturnPassTest.php | 38 + .../Pass/SuspiciousCodePassTest.php | 38 + .../Pass/TypeInferencePassTest.php | 502 + .../PhpAnalyzer/Pass/TypeScanningPassTest.php | 154 + .../Pass/UnusedCodeChecksPassTest.php | 39 + .../Pass/UseStatementFixingPassTest.php | 37 + .../Pass/VerifyPhpDocCommentsPassTest.php | 39 + .../PhpParser/DocCommentParserTest.php | 169 + .../PhpParser/NodeTraversalTest.php | 186 + .../PhpAnalyzer/PhpParser/Scope/ScopeTest.php | 44 + .../Scope/SyntacticScopeCreatorTest.php | 56 + .../PhpParser/Type/ArrayTypeTest.php | 32 + .../PhpParser/Type/BaseTypeTest.php | 72 + .../PhpParser/Type/PhpTypeTest.php | 851 + .../PhpParser/Type/StringTypeTest.php | 45 + .../PhpParser/Type/TypeCheckerTest.php | 87 + .../PhpParser/Type/TypeRegistryTest.php | 246 + .../PhpParser/Type/UnionTypeBuilderTest.php | 105 + .../PhpParser/Type/UnionTypeTest.php | 52 + .../Tests/PhpAnalyzer/StubsTest.php | 47 + .../libraries/cg-library-comments.txt | 123 + .../libraries/cg-library-config.json | 5 + .../CG/Core/ClassGeneratorInterface.php.diff | 9 + .../src/CG/Generator/PhpClass.php.diff | 8 + .../src/CG/Generator/PhpParameter.php.diff | 10 + .../src/CG/Proxy/Enhancer.php.diff | 8 + .../CG/Proxy/InterceptionGenerator.php.diff | 10 + .../DefaultGeneratorStrategyTest.php.diff | 8 + .../CG/Tests/Generator/PhpClassTest.php.diff | 8 + .../Tests/Generator/PhpFunctionTest.php.diff | 8 + .../CG/Tests/Generator/PhpMethodTest.php.diff | 8 + .../CG/Tests/Proxy/EnhancerTest.php.diff | 8 + .../PhpAnalyzer/libraries/cg-library.zip | Bin 0 -> 54883 bytes tests/bootstrap.php | 9 + 832 files changed, 296204 insertions(+) create mode 100644 .gitignore create mode 100644 .jms.yml create mode 100644 .phppm.yml create mode 100644 LICENSE create mode 100644 NOTICE create mode 100644 README.md create mode 100755 bin/phpalizer create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 phpunit.xml.dist create mode 100644 res/PHPUnit-3.7.10.tar.gz create mode 100644 res/php-5.2-core-api/PDO.php create mode 100644 res/php-5.2-core-api/Reflection.php create mode 100644 res/php-5.2-core-api/SPL.php create mode 100644 res/php-5.2-core-api/SQLite.php create mode 100644 res/php-5.2-core-api/SimpleXML.php create mode 100644 res/php-5.2-core-api/basic.php create mode 100644 res/php-5.2-core-api/bcmath.php create mode 100644 res/php-5.2-core-api/bz2.php create mode 100644 res/php-5.2-core-api/calendar.php create mode 100644 res/php-5.2-core-api/com_dotnet.php create mode 100644 res/php-5.2-core-api/ctype.php create mode 100644 res/php-5.2-core-api/curl.php create mode 100644 res/php-5.2-core-api/date.php create mode 100644 res/php-5.2-core-api/dom.php create mode 100644 res/php-5.2-core-api/exif.php create mode 100644 res/php-5.2-core-api/filter.php create mode 100644 res/php-5.2-core-api/ftp.php create mode 100644 res/php-5.2-core-api/gd.php create mode 100644 res/php-5.2-core-api/gettext.php create mode 100644 res/php-5.2-core-api/hash.php create mode 100644 res/php-5.2-core-api/ibm_db2.php create mode 100644 res/php-5.2-core-api/iconv.php create mode 100644 res/php-5.2-core-api/imagick.php create mode 100644 res/php-5.2-core-api/imap.php create mode 100644 res/php-5.2-core-api/intl.php create mode 100644 res/php-5.2-core-api/json.php create mode 100644 res/php-5.2-core-api/ldap.php create mode 100644 res/php-5.2-core-api/libxml.php create mode 100644 res/php-5.2-core-api/mbstring.php create mode 100644 res/php-5.2-core-api/mcrypt.php create mode 100644 res/php-5.2-core-api/mhash.php create mode 100644 res/php-5.2-core-api/mime_magic.php create mode 100644 res/php-5.2-core-api/mssql.php create mode 100644 res/php-5.2-core-api/mysql.php create mode 100644 res/php-5.2-core-api/mysqli.php create mode 100644 res/php-5.2-core-api/oci8.php create mode 100644 res/php-5.2-core-api/odbc.php create mode 100644 res/php-5.2-core-api/openssl.php create mode 100644 res/php-5.2-core-api/pcre.php create mode 100644 res/php-5.2-core-api/pdo_mysql.php create mode 100644 res/php-5.2-core-api/pdo_pgsql.php create mode 100644 res/php-5.2-core-api/pdo_sqlite.php create mode 100644 res/php-5.2-core-api/pgsql.php create mode 100644 res/php-5.2-core-api/posix.php create mode 100644 res/php-5.2-core-api/session.php create mode 100644 res/php-5.2-core-api/soap.php create mode 100644 res/php-5.2-core-api/sockets.php create mode 100644 res/php-5.2-core-api/standard.php create mode 100644 res/php-5.2-core-api/tidy.php create mode 100644 res/php-5.2-core-api/tokenizer.php create mode 100644 res/php-5.2-core-api/wddx.php create mode 100644 res/php-5.2-core-api/xml.php create mode 100644 res/php-5.2-core-api/xmlreader.php create mode 100644 res/php-5.2-core-api/xmlwriter.php create mode 100644 res/php-5.2-core-api/xsl.php create mode 100644 res/php-5.2-core-api/zip.php create mode 100644 res/php-5.2-core-api/zlib.php create mode 100644 res/php-5.3-core-api/Core.php create mode 100644 res/php-5.3-core-api/PDO.php create mode 100644 res/php-5.3-core-api/Phar.php create mode 100644 res/php-5.3-core-api/Reflection.php create mode 100644 res/php-5.3-core-api/SPL.php create mode 100644 res/php-5.3-core-api/SQLite.php create mode 100644 res/php-5.3-core-api/SimpleXML.php create mode 100644 res/php-5.3-core-api/basic.php create mode 100644 res/php-5.3-core-api/bcmath.php create mode 100644 res/php-5.3-core-api/bz2.php create mode 100644 res/php-5.3-core-api/calendar.php create mode 100644 res/php-5.3-core-api/com_dotnet.php create mode 100644 res/php-5.3-core-api/ctype.php create mode 100644 res/php-5.3-core-api/curl.php create mode 100644 res/php-5.3-core-api/date.php create mode 100644 res/php-5.3-core-api/dom.php create mode 100644 res/php-5.3-core-api/ereg.php create mode 100644 res/php-5.3-core-api/exif.php create mode 100644 res/php-5.3-core-api/fileinfo.php create mode 100644 res/php-5.3-core-api/filter.php create mode 100644 res/php-5.3-core-api/ftp.php create mode 100644 res/php-5.3-core-api/gd.php create mode 100644 res/php-5.3-core-api/gettext.php create mode 100644 res/php-5.3-core-api/hash.php create mode 100644 res/php-5.3-core-api/ibm_db2.php create mode 100644 res/php-5.3-core-api/iconv.php create mode 100644 res/php-5.3-core-api/imagick.php create mode 100644 res/php-5.3-core-api/imap.php create mode 100644 res/php-5.3-core-api/json.php create mode 100644 res/php-5.3-core-api/ldap.php create mode 100644 res/php-5.3-core-api/libxml.php create mode 100644 res/php-5.3-core-api/mbstring.php create mode 100644 res/php-5.3-core-api/mcrypt.php create mode 100644 res/php-5.3-core-api/mssql.php create mode 100644 res/php-5.3-core-api/mysql.php create mode 100644 res/php-5.3-core-api/mysqli.php create mode 100644 res/php-5.3-core-api/mysqlnd.php create mode 100644 res/php-5.3-core-api/oci8.php create mode 100644 res/php-5.3-core-api/odbc.php create mode 100644 res/php-5.3-core-api/openssl.php create mode 100644 res/php-5.3-core-api/pcre.php create mode 100644 res/php-5.3-core-api/pdo_mysql.php create mode 100644 res/php-5.3-core-api/pdo_pgsql.php create mode 100644 res/php-5.3-core-api/pdo_sqlite.php create mode 100644 res/php-5.3-core-api/pgsql.php create mode 100644 res/php-5.3-core-api/posix.php create mode 100644 res/php-5.3-core-api/session.php create mode 100644 res/php-5.3-core-api/soap.php create mode 100644 res/php-5.3-core-api/sockets.php create mode 100644 res/php-5.3-core-api/sqlite3.php create mode 100644 res/php-5.3-core-api/standard.php create mode 100644 res/php-5.3-core-api/tidy.php create mode 100644 res/php-5.3-core-api/tokenizer.php create mode 100644 res/php-5.3-core-api/wddx.php create mode 100644 res/php-5.3-core-api/xml.php create mode 100644 res/php-5.3-core-api/xmlreader.php create mode 100644 res/php-5.3-core-api/xmlwriter.php create mode 100644 res/php-5.3-core-api/xsl.php create mode 100644 res/php-5.3-core-api/zip.php create mode 100644 res/php-5.3-core-api/zlib.php create mode 100644 res/php-5.4-core-api/Core.php create mode 100644 res/php-5.4-core-api/PDO.php create mode 100644 res/php-5.4-core-api/PDO_Firebird.php create mode 100644 res/php-5.4-core-api/PDO_ODBC.php create mode 100644 res/php-5.4-core-api/Phar.php create mode 100644 res/php-5.4-core-api/Reflection.php create mode 100644 res/php-5.4-core-api/SPL.php create mode 100644 res/php-5.4-core-api/SPPLUS.php create mode 100644 res/php-5.4-core-api/SQLite.php create mode 100644 res/php-5.4-core-api/SimpleXML.php create mode 100644 res/php-5.4-core-api/ZendCache.php create mode 100644 res/php-5.4-core-api/ZendDebugger.php create mode 100644 res/php-5.4-core-api/ZendUtils.php create mode 100644 res/php-5.4-core-api/apc.php create mode 100644 res/php-5.4-core-api/basic.php create mode 100644 res/php-5.4-core-api/bcmath.php create mode 100644 res/php-5.4-core-api/bz2.php create mode 100644 res/php-5.4-core-api/calendar.php create mode 100644 res/php-5.4-core-api/ctype.php create mode 100644 res/php-5.4-core-api/curl.php create mode 100644 res/php-5.4-core-api/date.php create mode 100644 res/php-5.4-core-api/dba.php create mode 100644 res/php-5.4-core-api/dom.php create mode 100644 res/php-5.4-core-api/enchant.php create mode 100644 res/php-5.4-core-api/ereg.php create mode 100644 res/php-5.4-core-api/exif.php create mode 100644 res/php-5.4-core-api/fileinfo.php create mode 100644 res/php-5.4-core-api/filter.php create mode 100644 res/php-5.4-core-api/ftp.php create mode 100644 res/php-5.4-core-api/gd.php create mode 100644 res/php-5.4-core-api/geoip.php create mode 100644 res/php-5.4-core-api/gettext.php create mode 100644 res/php-5.4-core-api/gmp.php create mode 100644 res/php-5.4-core-api/hash.php create mode 100644 res/php-5.4-core-api/http.php create mode 100644 res/php-5.4-core-api/iconv.php create mode 100644 res/php-5.4-core-api/imagick.php create mode 100644 res/php-5.4-core-api/imap.php create mode 100644 res/php-5.4-core-api/interbase.php create mode 100644 res/php-5.4-core-api/intl.php create mode 100644 res/php-5.4-core-api/json.php create mode 100644 res/php-5.4-core-api/ldap.php create mode 100644 res/php-5.4-core-api/libxml.php create mode 100644 res/php-5.4-core-api/mbstring.php create mode 100644 res/php-5.4-core-api/mcrypt.php create mode 100644 res/php-5.4-core-api/memcache.php create mode 100644 res/php-5.4-core-api/memcached.php create mode 100644 res/php-5.4-core-api/mhash.php create mode 100644 res/php-5.4-core-api/mime_magic.php create mode 100644 res/php-5.4-core-api/ming.php create mode 100644 res/php-5.4-core-api/mssql.php create mode 100644 res/php-5.4-core-api/mysql.php create mode 100644 res/php-5.4-core-api/mysqli.php create mode 100644 res/php-5.4-core-api/mysqlnd.php create mode 100644 res/php-5.4-core-api/ncurses.php create mode 100644 res/php-5.4-core-api/oci8.php create mode 100644 res/php-5.4-core-api/odbc.php create mode 100644 res/php-5.4-core-api/openssl.php create mode 100644 res/php-5.4-core-api/pcntl.php create mode 100644 res/php-5.4-core-api/pcre.php create mode 100644 res/php-5.4-core-api/pdo_dblib.php create mode 100644 res/php-5.4-core-api/pdo_mysql.php create mode 100644 res/php-5.4-core-api/pdo_pgsql.php create mode 100644 res/php-5.4-core-api/pdo_sqlite.php create mode 100644 res/php-5.4-core-api/pgsql.php create mode 100644 res/php-5.4-core-api/posix.php create mode 100644 res/php-5.4-core-api/ps.php create mode 100644 res/php-5.4-core-api/pspell.php create mode 100644 res/php-5.4-core-api/radius.php create mode 100644 res/php-5.4-core-api/readline.php create mode 100644 res/php-5.4-core-api/recode.php create mode 100644 res/php-5.4-core-api/removed.php create mode 100644 res/php-5.4-core-api/session.php create mode 100644 res/php-5.4-core-api/shmop.php create mode 100644 res/php-5.4-core-api/snmp.php create mode 100644 res/php-5.4-core-api/soap.php create mode 100644 res/php-5.4-core-api/sockets.php create mode 100644 res/php-5.4-core-api/sqlite3.php create mode 100644 res/php-5.4-core-api/ssh2.php create mode 100644 res/php-5.4-core-api/standard.php create mode 100644 res/php-5.4-core-api/suhosin.php create mode 100644 res/php-5.4-core-api/svn.php create mode 100644 res/php-5.4-core-api/sybase_ct.php create mode 100644 res/php-5.4-core-api/sysvmsg.php create mode 100644 res/php-5.4-core-api/sysvsem.php create mode 100644 res/php-5.4-core-api/sysvshm.php create mode 100644 res/php-5.4-core-api/tidy.php create mode 100644 res/php-5.4-core-api/tokenizer.php create mode 100644 res/php-5.4-core-api/wddx.php create mode 100644 res/php-5.4-core-api/xdebug.php create mode 100644 res/php-5.4-core-api/xml.php create mode 100644 res/php-5.4-core-api/xmlreader.php create mode 100644 res/php-5.4-core-api/xmlrpc.php create mode 100644 res/php-5.4-core-api/xmlwriter.php create mode 100644 res/php-5.4-core-api/xsl.php create mode 100644 res/php-5.4-core-api/zend.php create mode 100644 res/php-5.4-core-api/zip.php create mode 100644 res/php-5.4-core-api/zlib.php create mode 100644 res/test_database.sqlite create mode 100644 src/Scrutinizer/PhpAnalyzer/Analyzer.php create mode 100644 src/Scrutinizer/PhpAnalyzer/AnalyzerAwareInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ArgumentChecker/ArgumentCheckerInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ArgumentChecker/ChainableArgumentChecker.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ArgumentChecker/DefaultArgumentChecker.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ArgumentChecker/OverloadedCoreFunctionChecker.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ArgumentChecker/PhpUnitAssertionChecker.php create mode 100644 src/Scrutinizer/PhpAnalyzer/CliApp.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Command/OutputLogger.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Config/ArrayNodeDefinition.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Config/NodeBuilder.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowAnalysis.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowGraph.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ControlFlow/EdgeCallbackInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ControlFlow/FixedPointGraphTraversal.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphEdge.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphNode.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphReachability.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphvizSerializer.php create mode 100644 src/Scrutinizer/PhpAnalyzer/ControlFlow/PathChecker.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/BinaryJoinOp.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/BranchedForwardDataFlowAnalysis.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/DataFlowAnalysis.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/LatticeElementInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/BitSet.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/LiveVariableLattice.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/LiveVariablesAnalysis.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/BooleanOutcomePair.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FlatFlowScopeCache.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FlowScopeInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ArrayFunctionInterpreter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ChainableFunctionInterpreter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/CoreFunctionInterpreter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/FunctionInterpreterInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowScope.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowSlot.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/ChainableMethodInterpreter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/CoreMethodInterpreter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/MethodInterpreterInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/PhpUnitMethodInterpreter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/AbstractTypeRestrictionVisitor.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/ChainableReverseAbstractInterpreter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByFalseTypeResultVisitor.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByGetClassResultVisitor.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByGettypeResultVisitor.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByTrueTypeResultVisitor.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/ReverseInterpreterInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/SemanticReverseAbstractInterpreter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/AbstractScopeBuilder.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/GlobalScopeBuilder.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/LocalScopeBuilder.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/SimpleSlot.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/TypeInference.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/TypedScopeCreator.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/Definition.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/DefinitionLattice.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/MayBeReachingUseAnalysis.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingDefAnalysis.php create mode 100644 src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/UseLattice.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Exception/AnalysisFailedException.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Exception/Exception.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Exception/MaxIterationsExceededException.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Exception/MaxMemoryExceededException.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Exception/RuntimeException.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/AbstractFunction.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/CallGraph/Argument.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/CallGraph/CallSite.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/CallGraph/FunctionToFunctionCallSite.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/CallGraph/FunctionToMethodCallSite.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/CallGraph/MethodToFunctionCallSite.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/CallGraph/MethodToMethodCallSite.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/ClassConstant.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/ClassMethod.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/ClassProperty.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Clazz.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Comment.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/CommentCollection.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Constant.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/ConstantContainerInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/ContainerConstantInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/ContainerMethodInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/ContainerPropertyInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/File.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/FixedFile.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/FixedPhpFile.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/FunctionParameter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/GlobalConstant.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/GlobalFunction.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/InterfaceC.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/InterfaceConstant.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/InterfaceMethod.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Method.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/MethodContainer.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/MethodParameter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Package.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/PackageScanner.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/PackageVersion.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Parameter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Persister/ArgumentPersister.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Persister/CallSitePersister.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Persister/ConstantPersister.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Persister/FunctionPersister.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Persister/GlobalConstantPersister.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Persister/MethodContainerPersister.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Persister/MethodPersister.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Persister/PackageVersionPersister.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Persister/ParameterPersister.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Persister/PropertyPersister.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/PhpFile.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Property.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Repository/EntityTypeProvider.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Repository/PackageRepository.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/TraitC.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Type/PhpTypeType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/AnalysisPassInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/AstAnalyzerPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CallGraphPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CallbackAnalysisPassInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CheckAccessControlPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CheckBasicSemanticsPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CheckForTyposPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CheckParamExpectsRefPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CheckUnreachableCodePass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CheckUsageContextPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CheckVariablesPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePassConfiguration.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/ConfigurablePassInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/ConfigurableTrait.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/DeadAssignmentsDetectionPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/DocCommentFixingPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/DocCommentFixingPassConfiguration.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/FixingAnalyzerPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/InferTypesFromCallSitesPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/InferTypesFromDocCommentsPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/LoggingPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/LoopsMustUseBracesPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/MarkPassedByRefArgsPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/OldCodingStylePass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/PhpunitAssertionsPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/PrecedenceChecksPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/ReflectionFixerPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/ReflectionUsageCheckPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/RepeatedPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/RepeatedPassAwareInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/ReturnTypeScanningPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/SimplifyBooleanReturnPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/SuccessiveTokenAndAstAnalzyer.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/SuspiciousCodePass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/TokenAndAstStreamAnalyzerPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/TokenStreamAnalyzerPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/TypeInferencePass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/TypeScanningPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/UnusedCodeChecksPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/UseStatementFixerPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/VariableReachabilityPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Pass/VerifyPhpDocCommentsPass.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PassConfig.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/ClassParser.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/DocCommentParser.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/FunctionParser.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/NodeTraversal.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/NodeUtil.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/ParameterParser.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/PreOrderCallback.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/MemoizedScopeCreator.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/Scope.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/ScopeCreatorInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/StaticScopeInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/StaticSlotInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/SyntacticScopeCreator.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/Variable.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/AbstractPostOrderCallback.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/AbstractScopedCallback.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/CallbackInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/ScopedCallbackInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/TreeSerializer.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/AllType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ArrayType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/BooleanType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/CallableType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/DoubleType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/FalseType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/IntegerType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/MemoryTypeProvider.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NamedType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NoObjectType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NoType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NullType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NullTypeProvider.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ObjectType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PackageAwareTypeProviderInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PhpType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ProxyObjectType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ResourceType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/StringType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TernaryValue.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ThisType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeChecker.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeLexer.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeParser.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeProviderInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnionType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnionTypeBuilder.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnknownType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/PhpParser/Type/VisitorInterface.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Util/DebugUtil.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Util/TestUtils.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ArgumentChecker/OverloadedCoreFunctionCheckerTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/ControlFlowAnalysisTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/FixedPointGraphTraversalTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/SymfonyPropertyUtil.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/SymfonyPropertyUtil.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/array_get_elem.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/array_get_elem.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/global_scope.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/global_scope.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$getValue.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$getValue.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$writeProperty_excerpt.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$writeProperty_excerpt.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure2.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure2.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure3.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure3.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/do_while.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/do_while.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exception.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exception.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exception2.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exception2.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exit_die.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exit_die.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/for.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/for.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/foreach.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/foreach.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/function_call.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/function_call.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/function_with_default_param.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/function_with_default_param.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/goto.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/goto.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/if_else.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/if_else.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/if_elseif_else.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/if_elseif_else.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/namespace.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/namespace.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_exception_handlers.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_exception_handlers.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_for.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_for.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch_with_if_else.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch_with_if_else.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/while.dot create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/while.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/GraphReachabilityTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/IntegrationTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/BinaryJoinOpTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/DataFlowAnalysisTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/BitSetTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/LiveVariableLatticeTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/LiveVariablesAnalysisTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ArrayFunctionInterpreterTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/CoreFunctionInterpreterTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowScopeTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/CoreMethodInterpreterTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/SemanticReverseAbstractInterpreterTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/TypeInferenceTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MayBeReachingUseAnalysisTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingAnalysisTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingJoinOpTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/XmlSerializationVisitor.after.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/XmlSerializationVisitor.before.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/YamlDriver.after.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/YamlDriver.before.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/LibrariesTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/ClazzTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/CommentCollectionTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/Basic/DefaultFoo.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/Basic/FooInterface.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/DirWithSomeFiles/.svn/vcs_dirs_should_be_ignored create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/DirWithSomeFiles/A.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/DirWithSomeFiles/Sub-Dir/B.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/DirWithSomeFiles/text.txt create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/zip-file.zip create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/PackageTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Persister/IntegrationTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/EntityTypeProviderTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/Fixture/libraries/monolog.zip create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/PackageRepositoryTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Type/PhpTypeTypeTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseAnalyzingPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseFixingPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BasePassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseReviewingPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseVisitorTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CallGraphPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckAccessControlPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckBasicSemanticsPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckForTyposPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckParamExpectsRefPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckUnreachableCodePassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckUsageContextPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckVariablesPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckstylePassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/DeadAssignmentsEliminationPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/DocCommentFixingPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/access_control.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/call_from_non_object_context.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/protected_method_call.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/protected_property_access.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/static_usage.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/BasicSemantics/abstract_methods_in_non_abstract_class.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/BasicSemantics/properties_on_interface.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CallGraph/cache.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CallGraph/class_defined_more_than_once.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CallGraph/mixed_calls.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CallGraph/target_method_undefined.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/array_with_initializing.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/assign_by_ref.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/assign_in_if_cond.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/non_initialized_variable_as_array_index.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/preg_match.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/static_assign.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/super_globals.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/this_in_closure.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/this_in_static_method.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/typo_in_variable_name.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/undeclared_variable.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/interface_naming.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/left_curlies.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/method_that_implement_interface_or_abstract_method.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/method_with_boolean_return_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/mixed_return_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/no_get_prefix.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/private_constructor.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/super_globals.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/utility_class.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ClassWithPropertyInitializer.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CodingStyle/blank_line_before_return.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CodingStyle/constant_on_left_side_for_binary.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CodingStyle/property_method_order2.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CodingStyle/property_methods_order.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CodingStyle/property_order.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CodingStyle/property_order2.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CodingStyle/short_opening_tags.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CodingStyle/tabs_for_indentation.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CodingStyle/trailing_whitespace.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CodingStyle/use_statements.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/compact.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/dead_assign_in_list.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/dead_assignments.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/detects_uses_from_closure.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/dynamic_variables.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/get_defined_variables.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/ignore_assignments_to_superglobals.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/ignores_assignments_to_references.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/regr_assignment_in_for.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/require_or_include.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/self_assignment.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_doc_comment.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_param.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_param2.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_return.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_return2.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/boolean_and_return.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/do_not_restrict_nullable_object_types.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/incorrect_param_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/removing_params.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/respect_interface_types.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/respect_more_specific_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type_more_specific.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type_on_interfaces.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/typos.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/return_type_bug.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/simplify_boolean_expression.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/symfony_pr_4223.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/symfony_pr_4271_FunctionNode.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/comments_in_between.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/else_if_with_space.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/empty_loop.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/loops_without_braces.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/nested_ifs.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ParamExpectsRef/function_call.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ParamExpectsRef/some_expr.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ParamExpectsRef/valid_args.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PhpunitAssertions/assert_false.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PhpunitAssertions/assert_true.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PossibleNotices/access_char_on_empty_string.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PrecedenceChecks/assignment_in_cond.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PrecedenceChecks/comparison_bitwise_operation.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReflectionFixer/get_name.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReflectionUsage/ignores_all_except_objtypes.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReflectionUsage/is_subclass_of.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReflectionUsage/properties_instead_of_methods.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReturnType/builtin_function.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReturnType/builtin_method.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReturnType/composite_return_type.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReturnType/implicit_return.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReturnType/interfaces.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReturnType/simple_return_type.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReturnType/unknown_return_type.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Simplification/count.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/boolean_true_in_if.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_else_cond.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_else_wo_boolean_cond.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_wo_else_cond.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/return_same_value.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/alias_conflict.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/alias_conflict_global.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/alias_local_class.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/alias_without_namespace.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/assigning_null_return_value.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/assignment_to_closure_use.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/assignment_to_parameter.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/empty_catch.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/no_fallthrough_in_nested_switch.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/no_fallthrough_with_when_if_else.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/non_empty_fallthrough_case.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/non_existent_class_catch.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/non_existent_class_in_instanceof.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/overriding_private_members.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/param_use_conflict.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/parameters_with_same_name.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/array_items.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/boolean_not.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/boolean_with_type_function.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/circular_property_def.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/list_assign.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/method_interpreter_integration.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/phpunit_mocks.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/phpunit_teardown.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/property_refined_in_closure.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/property_refined_in_global_scope.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/reverse_interpretation_of_case_statements.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/this_in_closure.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/array_pop.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/constant_as_default.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/constructor_injection.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/deadlock_test.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/defining_expr_for_variable.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/foo.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/foreach_with_object.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/global_constants.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/if.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/infinite_loop.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/inherited_doc_comment.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/instanceof_in_boolean_and.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types2.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types3.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/preg_replace.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/properties.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_property.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_property_2.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_static_property.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_variable.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_variable_2.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/run_test.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/run_test2.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/static_and_self.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/array_pop.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/constant_as_default.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/defining_expr_for_variable.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/foreach_with_object.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/instanceof_in_boolean_and.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types2.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types3.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/preg_replace.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_property.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_property_2.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_static_property.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_variable.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_variable_2.ast create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/class_with_interfaces.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/doc_comments.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/global_constants.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/magic_properties.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/method_wo_visibility.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/optional_parameter.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/overridden_method.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/property_on_interface.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/variable_parameters.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/SimpleXMLElement.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__call.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__get.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__set.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_method.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_property.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_property_on_interface.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/property_inside_isset.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/stdClass.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/undeclared_property.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UnreachableCode/exception_with_include_require.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UnreachableCode/for_loop.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UnreachableCode/goto.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UnreachableCode/nested_expr.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UnusedCode/unused_private_method.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/__call_method.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/__toString.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/array_udiff.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/call_method_on_non_object.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/call_method_with_variable_parameters.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/callable_parameter.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/foreach_value_by_ref.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/foreach_with_non_traversable.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/ignore_null_pointer.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/ignore_unknown_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/integer_double_parameter_types.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/interface_subtype_checking.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/invalid_type_arg.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/missing_parameter.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/missing_parameters.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/phpunit_assertion.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/subtype_check_ignores_all_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/traversable_hint.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/traversable_ignores_all_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/unknown_type_passed.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/all_use_statement_removed.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/bug_used_statement_removed.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/multiple_groups_simplified.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserve_indentation.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserve_indentation_multiple.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserve_multiple_groups.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserve_only_multiple.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserving_multiple.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/remove_unused.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/sorting_use_statements.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/split_multiple.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/use_with_comment.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/use_with_comment2.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/use_with_comment3.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/use_with_comment4.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/use_with_comments.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UselessExpression/always_false_expr.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UselessExpression/always_true_expression.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/abstract_collection_persister.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/ask_for_additional_annotations.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/ask_for_additional_array_type_in_union.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/more_specific_array_in_union.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/more_specific_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/param_type_mismatch.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/regr_abstract_query.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/regr_paginator.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/return_type_mismatch.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/shortest_imports.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/type_from_comment.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/unprecise_param_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/unprecise_return_type.test create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/scalar_values.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/IntegrationTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/LoopsMustUseBracesPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/PhpunitAssertionsPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/PrecedenceChecksPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReflectionFixerPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReflectionUsageCheckPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReturnTypeScanningPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/SimplifyBooleanReturnPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/SuspiciousCodePassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/TypeInferencePassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/TypeScanningPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/UnusedCodeChecksPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/UseStatementFixingPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/VerifyPhpDocCommentsPassTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/DocCommentParserTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/NodeTraversalTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Scope/ScopeTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Scope/SyntacticScopeCreatorTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/ArrayTypeTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/BaseTypeTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/PhpTypeTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/StringTypeTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/TypeCheckerTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/TypeRegistryTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/UnionTypeBuilderTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/UnionTypeTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/StubsTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-comments.txt create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-config.json create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Core/ClassGeneratorInterface.php.diff create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpClass.php.diff create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpParameter.php.diff create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Proxy/Enhancer.php.diff create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Proxy/InterceptionGenerator.php.diff create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Core/DefaultGeneratorStrategyTest.php.diff create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpClassTest.php.diff create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpFunctionTest.php.diff create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpMethodTest.php.diff create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Proxy/EnhancerTest.php.diff create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library.zip create mode 100644 tests/bootstrap.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d27d80d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +phpunit.xml +vendor/ diff --git a/.jms.yml b/.jms.yml new file mode 100644 index 0000000..ae70d36 --- /dev/null +++ b/.jms.yml @@ -0,0 +1,19 @@ +filter: + paths: + - src/* + - tests/* + + excluded_paths: + - tests/*/Fixture/* + - tests/Scrutinizer/Tests/PhpAnalyzer/libraries/* + +default_config: + use_statement_fixes: + order_alphabetically: true + +path_configs: + tests: + path: tests/* + verify_php_doc_comments: false + checkstyle: false + doc_comment_fixes: false diff --git a/.phppm.yml b/.phppm.yml new file mode 100644 index 0000000..88f664b --- /dev/null +++ b/.phppm.yml @@ -0,0 +1,19 @@ +filter: + paths: [src/*, tests/*] + +license: | + /* + * Copyright 2013 Johannes M. Schmitt + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f49a4e1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..840a21c --- /dev/null +++ b/NOTICE @@ -0,0 +1,4 @@ +PHP Analyzer was created by Johannes M. Schmitt . + +It is part of the tool chain used on [scrutinizer-ci.com](https://scrutinizer-ci.com), +a continuous inspection service for open source and private development projects. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..5804674 --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# PHP Analyzer + +The PHP Analyzer performs static analysis on your source code to help you find errors and bugs, and also has built-in +heuristics to automatically fix some of them. + +Learn more in the [documentation](https://scrutinizer-ci.com/docs/tools/php/php-analyzer/). + +## Installation + +PHPAnalyzer can be installed via composer very easily: + +``` +composer create-project scrutinizer/php-analyzer:dev-master +``` + +## Usage + +### Via The Command Line + +``` +php bin/phpalizer run some-dir +``` + +The CLI is especially useful to analyze smaller libraries, or for testing purposes. + +### Via a Continuous Build System Like scrutinizer-ci.com + +For bigger libraries with dependencies, it is recommended to use a dedicated build system. You can set-up such a build +system on your own architecture, or use a hosted service like [scrutinizer-ci.com](https://scrutinizer-ci.com). + diff --git a/bin/phpalizer b/bin/phpalizer new file mode 100755 index 0000000..d2c82a5 --- /dev/null +++ b/bin/phpalizer @@ -0,0 +1,12 @@ +#!/usr/bin/env php +run(); \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..4a0c6a3 --- /dev/null +++ b/composer.json @@ -0,0 +1,51 @@ +{ + "name": "scrutinizer/php-analyzer", + "description": "Advanced Static Analysis of and Auto-Fixer for PHP Code", + "license": "Apache2", + + "authors": [ + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + + "repositories": [ + {"type": "vcs", "url": "https://github.com/schmittjoh/PHP-Parser"} + ], + + "minimum-stability": "dev", + + "require": { + "php": ">=5.4", + "scrutinizer/utils": "dev-master", + "jms/composer-deps-analyzer": "dev-master", + "jms/php-manipulator": "dev-master", + "jms/parser-lib": "1.*", + "jms/serializer": "0.12.*", + "nikic/php-parser": "dev-master", + "doctrine/common": "2.3.*", + "doctrine/dbal": "*", + "doctrine/orm": "*", + "symfony/finder": "2.*", + "symfony/filesystem": "2.*", + "symfony/process": "2.*", + "symfony/config": "2.*", + "symfony/console": "2.*", + "phpoption/phpoption": "1.*", + "phpcollection/phpcollection": "0.2.*", + "psr/log": "1.0.*" + }, + + "require-dev": { + "ext-pdo": "*", + "ext-pdo_sqlite": "*", + "ext-pdo_mysql": "*", + "doctrine/data-fixtures": "1.0.*@dev" + }, + + "bin": ["bin/phpalizer"], + + "autoload": { + "psr-0": { + "Scrutinizer": "src/" + } + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..2f88439 --- /dev/null +++ b/composer.lock @@ -0,0 +1,1082 @@ +{ + "hash": "6f265e2f3d6df730e80e13cdb61fa8ca", + "packages": [ + { + "name": "doctrine/annotations", + "version": "v1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "v1.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/doctrine/annotations/archive/v1.0.zip", + "reference": "v1.0", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": ">=5.3.2" + }, + "require-dev": { + "doctrine/cache": "1.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Doctrine\\Common\\Annotations\\": "lib/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2013-01-12 19:23:32" + }, + { + "name": "doctrine/common", + "version": "2.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "bb0aebbf234db52df476a2b473d434745b34221c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/bb0aebbf234db52df476a2b473d434745b34221c", + "reference": "bb0aebbf234db52df476a2b473d434745b34221c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common": "lib/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "collections", + "eventmanager", + "persistence", + "spl" + ], + "time": "2012-09-20 05:55:18" + }, + { + "name": "doctrine/dbal", + "version": "2.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "fd45c6f6baa618d871f3201fabe76df5043abb1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/fd45c6f6baa618d871f3201fabe76df5043abb1e", + "reference": "fd45c6f6baa618d871f3201fabe76df5043abb1e", + "shasum": "" + }, + "require": { + "doctrine/common": "2.3.*", + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\DBAL": "lib/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + } + ], + "description": "Database Abstraction Layer", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "persistence", + "queryobject" + ], + "time": "2013-01-20 11:50:36" + }, + { + "name": "doctrine/lexer", + "version": "v1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "v1.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/doctrine/lexer/archive/v1.0.zip", + "reference": "v1.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2013-01-12 18:59:04" + }, + { + "name": "doctrine/orm", + "version": "2.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/doctrine2.git", + "reference": "304acf0a1af15ebe049231b84a7630c75ecbe62d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/304acf0a1af15ebe049231b84a7630c75ecbe62d", + "reference": "304acf0a1af15ebe049231b84a7630c75ecbe62d", + "shasum": "" + }, + "require": { + "doctrine/dbal": "2.3.*", + "ext-pdo": "*", + "php": ">=5.3.2", + "symfony/console": "2.*" + }, + "suggest": { + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine", + "bin/doctrine.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\ORM": "lib/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "orm" + ], + "time": "2013-02-21 18:03:42" + }, + { + "name": "jms/composer-deps-analyzer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/composer-deps-analyzer.git", + "reference": "3170c1fba8067f18971972c55bcd52439206ba38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/composer-deps-analyzer/zipball/3170c1fba8067f18971972c55bcd52439206ba38", + "reference": "3170c1fba8067f18971972c55bcd52439206ba38", + "shasum": "" + }, + "require": { + "php": ">= 5.3.2" + }, + "require-dev": { + "composer/composer": "dev-master", + "symfony/filesystem": "2.1.*", + "symfony/process": "2.1.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "JMS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "description": "Builds a Dependency Graph from a composer.json file", + "time": "2013-01-21 16:28:25" + }, + { + "name": "jms/metadata", + "version": "1.2.0-RC", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/metadata", + "reference": "1.2.0-RC" + }, + "dist": { + "type": "zip", + "url": "https://github.com/schmittjoh/metadata/zipball/1.2.0-RC", + "reference": "1.2.0-RC", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "doctrine/common": ">=2.0,<2.4-dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Metadata\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "Apache" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Class/method/property metadata management in PHP", + "keywords": [ + "annotations", + "metadata", + "xml", + "yaml" + ], + "time": "2012-08-21 05:40:10" + }, + { + "name": "jms/parser-lib", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/parser-lib.git", + "reference": "4d469a70c6dd03f921cbdeadafbcb261bb23e8b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/4d469a70c6dd03f921cbdeadafbcb261bb23e8b0", + "reference": "4d469a70c6dd03f921cbdeadafbcb261bb23e8b0", + "shasum": "" + }, + "require": { + "phpoption/phpoption": ">=0.9,<2.0-dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "description": "A library for easily creating recursive-descent parsers.", + "time": "2012-11-30 08:11:04" + }, + { + "name": "jms/php-manipulator", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-manipulator.git", + "reference": "30945a72edf22aef6923e503b616dce53b048e5f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-manipulator/zipball/30945a72edf22aef6923e503b616dce53b048e5f", + "reference": "30945a72edf22aef6923e503b616dce53b048e5f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "phpoption/phpoption": "1.*" + }, + "require-dev": { + "nikic/php-parser": "0.9.1" + }, + "suggest": { + "nikic/php-parser": "If you'd like to have access to an AST" + }, + "type": "library", + "autoload": { + "psr-0": { + "JMS\\PhpManipulator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt" + } + ], + "description": "Library for Analyzing or Manipulating PHP files using the TokenStream, AST, or both", + "keywords": [ + "code", + "manipulator", + "modify", + "php", + "source" + ], + "time": "2013-02-05 00:09:37" + }, + { + "name": "jms/serializer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/serializer.git", + "reference": "0aded9426d08c920e299c302914f702fad6f8ee6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/0aded9426d08c920e299c302914f702fad6f8ee6", + "reference": "0aded9426d08c920e299c302914f702fad6f8ee6", + "shasum": "" + }, + "require": { + "doctrine/annotations": "1.*", + "jms/metadata": ">=1.1.0,<1.3-dev", + "jms/parser-lib": "1.*", + "php": ">=5.3.2", + "phpcollection/phpcollection": ">=0.1,<0.3-dev" + }, + "require-dev": { + "doctrine/orm": ">=2.1,<2.4-dev", + "symfony/filesystem": "2.*", + "symfony/form": ">=2.1,<2.2-dev", + "symfony/translation": ">=2.0,<2.2-dev", + "symfony/validator": ">=2.0,<2.2-dev", + "symfony/yaml": "2.*", + "twig/twig": ">=1.8,<2.0-dev" + }, + "suggest": { + "symfony/yaml": "Required if you'd like to serialize data to YAML format." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.12-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\Serializer": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", + "homepage": "http://jmsyst.com/libs/serializer", + "keywords": [ + "deserialization", + "jaxb", + "json", + "serialization", + "xml" + ], + "time": "2013-03-01 10:16:05" + }, + { + "name": "nikic/php-parser", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/PHP-Parser.git", + "reference": "958e1f4e2355ed22245920a8057a3d7c34a0fb4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/PHP-Parser/zipball/958e1f4e2355ed22245920a8057a3d7c34a0fb4c", + "reference": "958e1f4e2355ed22245920a8057a3d7c34a0fb4c", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "PHPParser": "lib/" + } + }, + "license": [ + "BSD" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "source": "https://github.com/schmittjoh/PHP-Parser/tree/master" + }, + "time": "2012-11-06 00:18:13" + }, + { + "name": "phpcollection/phpcollection", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-collection.git", + "reference": "3ce8ffb990e9511c7a843f20740373eb27e4c3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/3ce8ffb990e9511c7a843f20740373eb27e4c3bd", + "reference": "3ce8ffb990e9511c7a843f20740373eb27e4c3bd", + "shasum": "" + }, + "require": { + "phpoption/phpoption": "1.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.2-dev" + } + }, + "autoload": { + "psr-0": { + "PhpCollection": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "General-Purpose Collection Library for PHP", + "keywords": [ + "collection", + "list", + "map", + "sequence", + "set" + ], + "time": "2013-02-25 13:15:41" + }, + { + "name": "phpoption/phpoption", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "c8829c3b675f17aa465557f721d909deb67d904f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/c8829c3b675f17aa465557f721d909deb67d904f", + "reference": "c8829c3b675f17aa465557f721d909deb67d904f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-0": { + "PhpOption\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "time": "2013-03-03 09:30:51" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/php-fig/log/archive/1.0.0.zip", + "reference": "1.0.0", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "scrutinizer/utils", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/scrutinizer-ci/utils.git", + "reference": "84f098e3ba952f254a7df0ae4e616c5e8607a262" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scrutinizer-ci/utils/zipball/84f098e3ba952f254a7df0ae4e616c5e8607a262", + "reference": "84f098e3ba952f254a7df0ae4e616c5e8607a262", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "symfony/process": "2.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Scrutinizer": "src/" + } + }, + "support": { + "source": "https://github.com/scrutinizer-ci/utils/tree/master", + "issues": "https://github.com/scrutinizer-ci/utils/issues" + }, + "time": "2013-01-26 10:35:27" + }, + { + "name": "symfony/config", + "version": "dev-master", + "target-dir": "Symfony/Component/Config", + "source": { + "type": "git", + "url": "https://github.com/symfony/Config.git", + "reference": "2b8694ad7f46072b154faaf5e74f2a06cb828fa7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Config/zipball/2b8694ad7f46072b154faaf5e74f2a06cb828fa7", + "reference": "2b8694ad7f46072b154faaf5e74f2a06cb828fa7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Config\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "http://symfony.com", + "time": "2013-03-01 10:42:20" + }, + { + "name": "symfony/console", + "version": "dev-master", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "fae82dad073a491b91a2ad6cda2ef5d8b19a5152" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/fae82dad073a491b91a2ad6cda2ef5d8b19a5152", + "reference": "fae82dad073a491b91a2ad6cda2ef5d8b19a5152", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "http://symfony.com", + "time": "2013-03-01 06:43:27" + }, + { + "name": "symfony/filesystem", + "version": "dev-master", + "target-dir": "Symfony/Component/Filesystem", + "source": { + "type": "git", + "url": "https://github.com/symfony/Filesystem.git", + "reference": "414e4f741f2b0750a92925ada7a1864f94715388" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/414e4f741f2b0750a92925ada7a1864f94715388", + "reference": "414e4f741f2b0750a92925ada7a1864f94715388", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Filesystem\\": "" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "http://symfony.com", + "time": "2013-01-31 21:39:01" + }, + { + "name": "symfony/finder", + "version": "dev-master", + "target-dir": "Symfony/Component/Finder", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "0b33214ce24e33b6d11fd7de8784ff34ba16711f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/0b33214ce24e33b6d11fd7de8784ff34ba16711f", + "reference": "0b33214ce24e33b6d11fd7de8784ff34ba16711f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "http://symfony.com", + "time": "2013-03-01 06:43:27" + }, + { + "name": "symfony/process", + "version": "dev-master", + "target-dir": "Symfony/Component/Process", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "6ebe4ba544cfc0dd25bfe49402da4d5267ee1b43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/6ebe4ba544cfc0dd25bfe49402da4d5267ee1b43", + "reference": "6ebe4ba544cfc0dd25bfe49402da4d5267ee1b43", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "http://symfony.com", + "time": "2013-02-18 21:28:20" + } + ], + "packages-dev": [ + { + "name": "doctrine/data-fixtures", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "689bc2ae2a41dff1107d9d50e2daa4c349222869" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/689bc2ae2a41dff1107d9d50e2daa4c349222869", + "reference": "689bc2ae2a41dff1107d9d50e2daa4c349222869", + "shasum": "" + }, + "require": { + "doctrine/common": ">=2.2,<2.5-dev", + "php": ">=5.3.2" + }, + "require-dev": { + "doctrine/orm": ">=2.2,<2.5-dev" + }, + "suggest": { + "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", + "doctrine/orm": "For loading ORM fixtures", + "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\DataFixtures": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + } + ], + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database" + ], + "time": "2013-02-12 02:52:36" + } + ], + "aliases": [ + + ], + "minimum-stability": "dev", + "stability-flags": { + "scrutinizer/utils": 20, + "jms/composer-deps-analyzer": 20, + "jms/php-manipulator": 20, + "nikic/php-parser": 20, + "doctrine/data-fixtures": 20 + }, + "platform": { + "php": ">=5.4" + }, + "platform-dev": { + "ext-pdo": "*", + "ext-pdo_sqlite": "*", + "ext-pdo_mysql": "*" + } +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..16a143c --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + ./tests + + + + + + performance + + + diff --git a/res/PHPUnit-3.7.10.tar.gz b/res/PHPUnit-3.7.10.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..162d61d7dbb71951c899bedfd577885ee6b979b8 GIT binary patch literal 126835 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 m9GzRtaBu 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 + * This must be a valid SQL statement for the target database server. + *

+ * @param driver_options array[optional]

+ * This array holds one or more key=>value pairs to set + * attribute values for the PDOStatement object that this method + * returns. You would most commonly use this to set the + * PDO::ATTR_CURSOR value to + * PDO::CURSOR_SCROLL to request a scrollable cursor. + * Some drivers have driver specific options that may be set at + * prepare-time. + *

+ * @return PDOStatement If the database server successfully prepares the statement, + * PDO::prepare returns a + * PDOStatement object. + * If the database server cannot successfully prepare the statement, + * PDO::prepare returns false or emits + * PDOException (depending on error handling). + *

+ *

+ * Emulated prepared statements does not communicate with the database server + * so PDO::prepare does not check the statement. + */ + public function prepare ($statement, array $driver_options = null) {} + + /** + * Initiates a transaction + * @link http://www.php.net/manual/en/pdo.begintransaction.php + * @return bool Returns true on success or false on failure. + */ + public function beginTransaction () {} + + /** + * Commits a transaction + * @link http://www.php.net/manual/en/pdo.commit.php + * @return bool Returns true on success or false on failure. + */ + public function commit () {} + + /** + * Rolls back a transaction + * @link http://www.php.net/manual/en/pdo.rollback.php + * @return bool Returns true on success or false on failure. + */ + public function rollBack () {} + + /** + * Set an attribute + * @link http://www.php.net/manual/en/pdo.setattribute.php + * @param attribute int + * @param value mixed + * @return bool Returns true on success or false on failure. + */ + public function setAttribute ($attribute, $value) {} + + /** + * Execute an SQL statement and return the number of affected rows + * @link http://www.php.net/manual/en/pdo.exec.php + * @param statement string

+ * The SQL statement to prepare and execute. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return int PDO::exec returns the number of rows that were modified + * or deleted by the SQL statement you issued. If no rows were affected, + * PDO::exec returns 0. + *

+ * &return.falseproblem; + *

+ * The following example incorrectly relies on the return value of + * PDO::exec, wherein a statement that affected 0 rows + * results in a call to die: + * exec() or die(print_r($db->errorInfo(), true)); + * ?> + * ]]> + */ + public function exec ($statement) {} + + /** + * Executes an SQL statement, returning a result set as a PDOStatement object + * @link http://www.php.net/manual/en/pdo.query.php + * @param statement string

+ * The SQL statement to prepare and execute. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return PDOStatement PDO::query returns a PDOStatement object, or false + * on failure. + */ + public function query ($statement) {} + + /** + * Returns the ID of the last inserted row or sequence value + * @link http://www.php.net/manual/en/pdo.lastinsertid.php + * @param name string[optional]

+ * Name of the sequence object from which the ID should be returned. + *

+ * @return string If a sequence name was not specified for the name + * parameter, PDO::lastInsertId returns a + * string representing the row ID of the last row that was inserted into + * the database. + *

+ *

+ * If a sequence name was specified for the name + * parameter, PDO::lastInsertId returns a + * string representing the last value retrieved from the specified sequence + * object. + *

+ *

+ * If the PDO driver does not support this capability, + * PDO::lastInsertId triggers an + * IM001 SQLSTATE. + */ + public function lastInsertId ($name = null) {} + + /** + * Fetch the SQLSTATE associated with the last operation on the database handle + * @link http://www.php.net/manual/en/pdo.errorcode.php + * @return mixed a SQLSTATE, a five characters alphanumeric identifier defined in + * the ANSI SQL-92 standard. Briefly, an SQLSTATE consists of a + * two characters class value followed by a three characters subclass value. A + * class value of 01 indicates a warning and is accompanied by a return code + * of SQL_SUCCESS_WITH_INFO. Class values other than '01', except for the + * class 'IM', indicate an error. The class 'IM' is specific to warnings + * and errors that derive from the implementation of PDO (or perhaps ODBC, + * if you're using the ODBC driver) itself. The subclass value '000' in any + * class indicates that there is no subclass for that SQLSTATE. + *

+ *

+ * PDO::errorCode only retrieves error codes for operations + * performed directly on the database handle. If you create a PDOStatement + * object through PDO::prepare or + * PDO::query and invoke an error on the statement + * handle, PDO::errorCode will not reflect that error. + * You must call PDOStatement::errorCode to return the error + * code for an operation performed on a particular statement handle. + *

+ *

+ * Returns &null; if no operation has been run on the database handle. + */ + public function errorCode () {} + + /** + * Fetch extended error information associated with the last operation on the database handle + * @link http://www.php.net/manual/en/pdo.errorinfo.php + * @return array PDO::errorInfo returns an array of error information + * about the last operation performed by this database handle. The array + * consists of the following fields: + * + * Element + * Information + * + * + * 0 + * SQLSTATE error code (a five characters alphanumeric identifier defined + * in the ANSI SQL standard). + * + * + * 1 + * Driver-specific error code. + * + * + * 2 + * Driver-specific error message. + * + *

+ *

+ * If the SQLSTATE error code is not set or there is no driver-specific + * error, the elements following element 0 will be set to &null;. + *

+ *

+ * PDO::errorInfo only retrieves error information for + * operations performed directly on the database handle. If you create a + * PDOStatement object through PDO::prepare or + * PDO::query and invoke an error on the statement + * handle, PDO::errorInfo will not reflect the error + * from the statement handle. You must call + * PDOStatement::errorInfo to return the error + * information for an operation performed on a particular statement handle. + */ + public function errorInfo () {} + + /** + * Retrieve a database connection attribute + * @link http://www.php.net/manual/en/pdo.getattribute.php + * @param attribute int

+ * One of the PDO::ATTR_* constants. The constants that + * apply to database connections are as follows: + * PDO::ATTR_AUTOCOMMIT + * PDO::ATTR_CASE + * PDO::ATTR_CLIENT_VERSION + * PDO::ATTR_CONNECTION_STATUS + * PDO::ATTR_DRIVER_NAME + * PDO::ATTR_ERRMODE + * PDO::ATTR_ORACLE_NULLS + * PDO::ATTR_PERSISTENT + * PDO::ATTR_PREFETCH + * PDO::ATTR_SERVER_INFO + * PDO::ATTR_SERVER_VERSION + * PDO::ATTR_TIMEOUT + *

+ * @return mixed A successful call returns the value of the requested PDO attribute. + * An unsuccessful call returns null. + */ + public function getAttribute ($attribute) {} + + /** + * Quotes a string for use in a query. + * @link http://www.php.net/manual/en/pdo.quote.php + * @param string string

+ * The string to be quoted. + *

+ * @param parameter_type int[optional]

+ * Provides a data type hint for drivers that have alternate quoting styles. + *

+ * @return string a quoted string that is theoretically safe to pass into an + * SQL statement. Returns false if the driver does not support quoting in + * this way. + */ + public function quote ($string, $parameter_type = null) {} + + final public function __wakeup () {} + + final public function __sleep () {} + + /** + * Return an array of available PDO drivers + * @link http://www.php.net/manual/en/pdo.getavailabledrivers.php + * @return array PDO::getAvailableDrivers returns an array of PDO driver names. If + * no drivers are available, it returns an empty array. + */ + public static function getAvailableDrivers () {} + +} + +/** @jms-builtin */ +class PDOStatement implements Traversable { + public $queryString; + + + /** + * Executes a prepared statement + * @link http://www.php.net/manual/en/pdostatement.execute.php + * @param input_parameters array[optional]

+ * An array of values with as many elements as there are bound + * parameters in the SQL statement being executed. + * All values are treated as PDO::PARAM_STR. + *

+ *

+ * You cannot bind multiple values to a single parameter; for example, + * you cannot bind two values to a single named parameter in an IN() + * clause. + *

+ * @return bool Returns true on success or false on failure. + */ + public function execute (array $input_parameters = null) {} + + /** + * Fetches the next row from a result set + * @link http://www.php.net/manual/en/pdostatement.fetch.php + * @param fetch_style int[optional]

+ * Controls how the next row will be returned to the caller. This value + * must be one of the PDO::FETCH_* constants, + * defaulting to PDO::FETCH_BOTH. + *

+ * PDO::FETCH_ASSOC: returns an array indexed by column + * name as returned in your result set + *

+ * @param cursor_orientation int[optional]

+ * For a PDOStatement object representing a scrollable cursor, this + * value determines which row will be returned to the caller. This value + * must be one of the PDO::FETCH_ORI_* constants, + * defaulting to PDO::FETCH_ORI_NEXT. To request a + * scrollable cursor for your PDOStatement object, you must set the + * PDO::ATTR_CURSOR attribute to + * PDO::CURSOR_SCROLL when you prepare the SQL + * statement with PDO::prepare. + *

+ * @param cursor_offset int[optional] + * @return mixed The return value of this function on success depends on the fetch type. In + * all cases, false is returned on failure. + */ + public function fetch ($fetch_style = null, $cursor_orientation = null, $cursor_offset = null) {} + + /** + * Binds a parameter to the specified variable name + * @link http://www.php.net/manual/en/pdostatement.bindparam.php + * @param parameter mixed

+ * Parameter identifier. For a prepared statement using named + * placeholders, this will be a parameter name of the form + * :name. For a prepared statement using + * question mark placeholders, this will be the 1-indexed position of + * the parameter. + *

+ * @param variable mixed

+ * Name of the PHP variable to bind to the SQL statement parameter. + *

+ * @param data_type int[optional]

+ * Explicit data type for the parameter using the PDO::PARAM_* + * constants. + * To return an INOUT parameter from a stored procedure, + * use the bitwise OR operator to set the PDO::PARAM_INPUT_OUTPUT bits + * for the data_type parameter. + *

+ * @param length int[optional]

+ * Length of the data type. To indicate that a parameter is an OUT + * parameter from a stored procedure, you must explicitly set the + * length. + *

+ * @param driver_options mixed[optional]

+ *

+ * @return bool Returns true on success or false on failure. + */ + public function bindParam ($parameter, &$variable, $data_type = null, $length = null, $driver_options = null) {} + + /** + * Bind a column to a PHP variable + * @link http://www.php.net/manual/en/pdostatement.bindcolumn.php + * @param column mixed

+ * Number of the column (1-indexed) or name of the column in the result set. + * If using the column name, be aware that the name should match the + * case of the column, as returned by the driver. + *

+ * @param param mixed

+ * Name of the PHP variable to which the column will be bound. + *

+ * @param type int[optional]

+ * Data type of the parameter, specified by the PDO::PARAM_* constants. + *

+ * @param maxlen int[optional]

+ * A hint for pre-allocation. + *

+ * @param driverdata mixed[optional]

+ * Optional parameter(s) for the driver. + *

+ * @return bool Returns true on success or false on failure. + */ + public function bindColumn ($column, &$param, $type = null, $maxlen = null, $driverdata = null) {} + + /** + * Binds a value to a parameter + * @link http://www.php.net/manual/en/pdostatement.bindvalue.php + * @param parameter mixed

+ * Parameter identifier. For a prepared statement using named + * placeholders, this will be a parameter name of the form + * :name. For a prepared statement using + * question mark placeholders, this will be the 1-indexed position of + * the parameter. + *

+ * @param value mixed

+ * The value to bind to the parameter. + *

+ * @param data_type int[optional]

+ * Explicit data type for the parameter using the PDO::PARAM_* + * constants. + *

+ * @return bool Returns true on success or false on failure. + */ + public function bindValue ($parameter, $value, $data_type = null) {} + + /** + * Returns the number of rows affected by the last SQL statement + * @link http://www.php.net/manual/en/pdostatement.rowcount.php + * @return int the number of rows. + */ + public function rowCount () {} + + /** + * Returns a single column from the next row of a result set + * @link http://www.php.net/manual/en/pdostatement.fetchcolumn.php + * @param column_number int[optional]

+ * 0-indexed number of the column you wish to retrieve from the row. If + * no value is supplied, PDOStatement::fetchColumn + * fetches the first column. + *

+ * @return string PDOStatement::fetchColumn returns a single column + * in the next row of a result set. + *

+ *

+ * There is no way to return another column from the same row if you + * use PDOStatement::fetchColumn to retrieve data. + */ + public function fetchColumn ($column_number = null) {} + + /** + * Returns an array containing all of the result set rows + * @link http://www.php.net/manual/en/pdostatement.fetchall.php + * @param fetch_style int[optional]

+ * Controls the contents of the returned array as documented in + * PDOStatement::fetch. + *

+ *

+ * To return an array consisting of all values of a single column from + * the result set, specify PDO::FETCH_COLUMN. You + * can specify which column you want with the + * column-index parameter. + *

+ *

+ * To fetch only the unique values of a single column from the result set, + * bitwise-OR PDO::FETCH_COLUMN with + * PDO::FETCH_UNIQUE. + *

+ *

+ * To return an associative array grouped by the values of a specified + * column, bitwise-OR PDO::FETCH_COLUMN with + * PDO::FETCH_GROUP. + *

+ * @param column_index int[optional]

+ * Returns the indicated 0-indexed column when the value of + * fetch_style is + * PDO::FETCH_COLUMN. + *

+ * @param ctor_args array[optional]

+ * Arguments of custom class constructor. + *

+ * @return array PDOStatement::fetchAll returns an array containing + * all of the remaining rows in the result set. The array represents each + * row as either an array of column values or an object with properties + * corresponding to each column name. + *

+ *

+ * Using this method to fetch large result sets will result in a heavy + * demand on system and possibly network resources. Rather than retrieving + * all of the data and manipulating it in PHP, consider using the database + * server to manipulate the result sets. For example, use the WHERE and + * SORT BY clauses in SQL to restrict results before retrieving and + * processing them with PHP. + */ + public function fetchAll ($fetch_style = null, $column_index = null, array $ctor_args = null) {} + + /** + * Fetches the next row and returns it as an object. + * @link http://www.php.net/manual/en/pdostatement.fetchobject.php + * @param class_name string[optional]

+ * Name of the created class. + *

+ * @param ctor_args array[optional]

+ * Elements of this array are passed to the constructor. + *

+ * @return mixed an instance of the required class with property names that + * correspond to the column names &return.falseforfailure;. + */ + public function fetchObject ($class_name = null, array $ctor_args = null) {} + + /** + * Fetch the SQLSTATE associated with the last operation on the statement handle + * @link http://www.php.net/manual/en/pdostatement.errorcode.php + * @return string Identical to PDO::errorCode, except that + * PDOStatement::errorCode only retrieves error codes + * for operations performed with PDOStatement objects. + */ + public function errorCode () {} + + /** + * Fetch extended error information associated with the last operation on the statement handle + * @link http://www.php.net/manual/en/pdostatement.errorinfo.php + * @return array PDOStatement::errorInfo returns an array of + * error information about the last operation performed by this + * statement handle. The array consists of the following fields: + * + * Element + * Information + * + * + * 0 + * SQLSTATE error code (a five characters alphanumeric identifier defined + * in the ANSI SQL standard). + * + * + * 1 + * Driver specific error code. + * + * + * 2 + * Driver specific error message. + * + */ + public function errorInfo () {} + + /** + * Set a statement attribute + * @link http://www.php.net/manual/en/pdostatement.setattribute.php + * @param attribute int + * @param value mixed + * @return bool Returns true on success or false on failure. + */ + public function setAttribute ($attribute, $value) {} + + /** + * Retrieve a statement attribute + * @link http://www.php.net/manual/en/pdostatement.getattribute.php + * @param attribute int + * @return mixed the attribute value. + */ + public function getAttribute ($attribute) {} + + /** + * Returns the number of columns in the result set + * @link http://www.php.net/manual/en/pdostatement.columncount.php + * @return int the number of columns in the result set represented by the + * PDOStatement object. If there is no result set, + * PDOStatement::columnCount returns 0. + */ + public function columnCount () {} + + /** + * Returns metadata for a column in a result set + * @link http://www.php.net/manual/en/pdostatement.getcolumnmeta.php + * @param column int

+ * The 0-indexed column in the result set. + *

+ * @return array an associative array containing the following values representing + * the metadata for a single column: + *

+ * + * Column metadata + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameValue
native_typeThe PHP native type used to represent the column value.
driver:decl_typeThe SQL type used to represent the column value in the database. + * If the column in the result set is the result of a function, this value + * is not returned by PDOStatement::getColumnMeta. + *
flagsAny flags set for this column.
nameThe name of this column as returned by the database.
tableThe name of this column's table as returned by the database.
lenThe length of this column. Normally -1 for + * types other than floating point decimals.
precisionThe numeric precision of this column. Normally + * 0 for types other than floating point + * decimals.
pdo_typeThe type of this column as represented by the + * PDO::PARAM_* constants.
+ *

+ * Returns false if the requested column does not exist in the result set, + * or if no result set exists. + */ + public function getColumnMeta ($column) {} + + /** + * Set the default fetch mode for this statement + * @link http://www.php.net/manual/en/pdostatement.setfetchmode.php + * @param mode int

+ * The fetch mode must be one of the PDO::FETCH_* constants. + *

+ * @return bool 1 on success&return.falseforfailure;. + */ + public function setFetchMode ($mode) {} + + /** + * Advances to the next rowset in a multi-rowset statement handle + * @link http://www.php.net/manual/en/pdostatement.nextrowset.php + * @return bool Returns true on success or false on failure. + */ + public function nextRowset () {} + + /** + * Closes the cursor, enabling the statement to be executed again. + * @link http://www.php.net/manual/en/pdostatement.closecursor.php + * @return bool Returns true on success or false on failure. + */ + public function closeCursor () {} + + /** + * Dump a SQL prepared command + * @link http://www.php.net/manual/en/pdostatement.debugdumpparams.php + * @return bool + */ + public function debugDumpParams () {} + + final public function __wakeup () {} + + final public function __sleep () {} + +} + +final class PDORow { +} + +function pdo_drivers () {} + +// End of PDO v.1.0.4dev +?> diff --git a/res/php-5.2-core-api/Reflection.php b/res/php-5.2-core-api/Reflection.php new file mode 100644 index 0000000..433b12e --- /dev/null +++ b/res/php-5.2-core-api/Reflection.php @@ -0,0 +1,1743 @@ + + * The modifiers to get, which is from a numeric value. + *

+ * @return array An array of modifier names. + */ + public static function getModifierNames ($modifiers) {} + + /** + * Exports + * @link http://www.php.net/manual/en/reflection.export.php + * @param reflector Reflector

+ * &reflection.export.param.name; + *

+ * @param return string[optional]

+ * &reflection.export.param.return; + *

+ * @return void &reflection.export.return; + */ + public static function export ($reflector, $return = null) {} + +} + +interface Reflector { + + /** + * Exports + * @link http://www.php.net/manual/en/reflector.export.php + * @return string + */ + abstract public static function export () {} + + /** + * To string + * @link http://www.php.net/manual/en/reflector.tostring.php + * @return string + */ + abstract public function __toString () {} + +} + +/** @jms-builtin */ +class ReflectionFunctionAbstract implements Reflector { + abstract public $name; + + + /** + * Clones function + * @link http://www.php.net/manual/en/reflectionfunctionabstract.clone.php + * @return void + */ + final private function __clone () {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionfunctionabstract.tostring.php + * @return void The string. + */ + abstract public function __toString () {} + + /** + * Checks if is internal + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isinternal.php + * @return bool true if it's internal, otherwise false + */ + public function isInternal () {} + + /** + * Checks if user defined + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isuserdefined.php + * @return bool true if it's user-defined, otherwise false; + */ + public function isUserDefined () {} + + /** + * Gets function name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getname.php + * @return string The name of the function. + */ + public function getName () {} + + /** + * Gets file name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getfilename.php + * @return string The file name. + */ + public function getFileName () {} + + /** + * Gets starting line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstartline.php + * @return int The starting line number. + */ + public function getStartLine () {} + + /** + * Gets end line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getendline.php + * @return int The ending line number of the user defined class, or false if unknown. + */ + public function getEndLine () {} + + /** + * Gets doc comment + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getdoccomment.php + * @return string The doc comment if it exists, otherwise false + */ + public function getDocComment () {} + + /** + * Gets static variables + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php + * @return array An array of static variables. + */ + public function getStaticVariables () {} + + /** + * Checks if returns reference + * @link http://www.php.net/manual/en/reflectionfunctionabstract.returnsreference.php + * @return bool true if it returns a reference, otherwise false + */ + public function returnsReference () {} + + /** + * Gets parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getparameters.php + * @return array The parameters, as a ReflectionParameter object. + */ + public function getParameters () {} + + /** + * Gets number of parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofparameters.php + * @return int The number of parameters. + */ + public function getNumberOfParameters () {} + + /** + * Gets number of required parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofrequiredparameters.php + * @return int The number of required parameters. + */ + public function getNumberOfRequiredParameters () {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextension.php + * @return ReflectionExtension The extension information, as a ReflectionExtension object. + */ + public function getExtension () {} + + /** + * Gets extension name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * Checks if deprecated + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isdeprecated.php + * @return bool true if it's deprecated, otherwise false + */ + public function isDeprecated () {} + +} + +/** @jms-builtin */ +class ReflectionFunction extends ReflectionFunctionAbstract implements Reflector { + const IS_DEPRECATED = 262144; + + public $name; + + + /** + * Constructs a ReflectionFunction object + * @link http://www.php.net/manual/en/reflectionfunction.construct.php + * @param name + */ + public function __construct ($name) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionfunction.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Exports function + * @link http://www.php.net/manual/en/reflectionfunction.export.php + * @param name string

+ * &reflection.export.param.name; + *

+ * @param return string[optional]

+ * &reflection.export.param.return; + *

+ * @return string &reflection.export.return; + */ + public static function export ($name, $return = null) {} + + /** + * Checks if function is disabled + * @link http://www.php.net/manual/en/reflectionfunction.isdisabled.php + * @return bool true if it's disable, otherwise false + */ + public function isDisabled () {} + + /** + * Invokes function + * @link http://www.php.net/manual/en/reflectionfunction.invoke.php + * @param args string[optional]

+ * The passed in argument list. It accepts a variable number of + * arguments which are passed to the function much like + * call_user_func is. + *

+ * @return mixed + */ + public function invoke ($args = null) {} + + /** + * Invokes function args + * @link http://www.php.net/manual/en/reflectionfunction.invokeargs.php + * @param args array

+ * The args to invoke. + *

+ * @return mixed + */ + public function invokeArgs (array $args) {} + + /** + * Clones function + * @link http://www.php.net/manual/en/reflectionfunctionabstract.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Checks if is internal + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isinternal.php + * @return bool true if it's internal, otherwise false + */ + public function isInternal () {} + + /** + * Checks if user defined + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isuserdefined.php + * @return bool true if it's user-defined, otherwise false; + */ + public function isUserDefined () {} + + /** + * Gets function name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getname.php + * @return string The name of the function. + */ + public function getName () {} + + /** + * Gets file name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getfilename.php + * @return string The file name. + */ + public function getFileName () {} + + /** + * Gets starting line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstartline.php + * @return int The starting line number. + */ + public function getStartLine () {} + + /** + * Gets end line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getendline.php + * @return int The ending line number of the user defined class, or false if unknown. + */ + public function getEndLine () {} + + /** + * Gets doc comment + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getdoccomment.php + * @return string The doc comment if it exists, otherwise false + */ + public function getDocComment () {} + + /** + * Gets static variables + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php + * @return array An array of static variables. + */ + public function getStaticVariables () {} + + /** + * Checks if returns reference + * @link http://www.php.net/manual/en/reflectionfunctionabstract.returnsreference.php + * @return bool true if it returns a reference, otherwise false + */ + public function returnsReference () {} + + /** + * Gets parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getparameters.php + * @return array The parameters, as a ReflectionParameter object. + */ + public function getParameters () {} + + /** + * Gets number of parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofparameters.php + * @return int The number of parameters. + */ + public function getNumberOfParameters () {} + + /** + * Gets number of required parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofrequiredparameters.php + * @return int The number of required parameters. + */ + public function getNumberOfRequiredParameters () {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextension.php + * @return ReflectionExtension The extension information, as a ReflectionExtension object. + */ + public function getExtension () {} + + /** + * Gets extension name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * Checks if deprecated + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isdeprecated.php + * @return bool true if it's deprecated, otherwise false + */ + public function isDeprecated () {} + +} + +/** @jms-builtin */ +class ReflectionParameter implements Reflector { + public $name; + + + /** + * Clone + * @link http://www.php.net/manual/en/reflectionparameter.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Exports + * @link http://www.php.net/manual/en/reflectionparameter.export.php + * @param function string

+ * The function name. + *

+ * @param parameter string

+ * The parameter name. + *

+ * @param return bool[optional]

+ * &reflection.export.param.return; + *

+ * @return string The exported reflection. + */ + public static function export ($function, $parameter, $return = null) {} + + /** + * Construct + * @link http://www.php.net/manual/en/reflectionparameter.construct.php + * @param function + * @param parameter + */ + public function __construct ($function, $parameter) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionparameter.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Gets parameter name + * @link http://www.php.net/manual/en/reflectionparameter.getname.php + * @return string The name of the reflected parameter. + */ + public function getName () {} + + /** + * Checks if passed by reference + * @link http://www.php.net/manual/en/reflectionparameter.ispassedbyreference.php + * @return bool true if the parameter is passed in by reference, otherwise false + */ + public function isPassedByReference () {} + + /** + * Gets declaring function + * @link http://www.php.net/manual/en/reflectionparameter.getdeclaringfunction.php + * @return ReflectionFunction A ReflectionFunction object. + */ + public function getDeclaringFunction () {} + + /** + * Gets declaring class + * @link http://www.php.net/manual/en/reflectionparameter.getdeclaringclass.php + * @return ReflectionClass A ReflectionClass object. + */ + public function getDeclaringClass () {} + + /** + * Get class + * @link http://www.php.net/manual/en/reflectionparameter.getclass.php + * @return ReflectionClass A ReflectionClass object. + */ + public function getClass () {} + + /** + * Checks if parameter expects an array + * @link http://www.php.net/manual/en/reflectionparameter.isarray.php + * @return bool true if an array is expected, false otherwise. + */ + public function isArray () {} + + /** + * Checks if null is allowed + * @link http://www.php.net/manual/en/reflectionparameter.allowsnull.php + * @return bool true if &null; is allowed, otherwise false + */ + public function allowsNull () {} + + /** + * Gets parameter position + * @link http://www.php.net/manual/en/reflectionparameter.getposition.php + * @return int The position of the parameter, left to right, starting at position #0. + */ + public function getPosition () {} + + /** + * Checks if optional + * @link http://www.php.net/manual/en/reflectionparameter.isoptional.php + * @return bool true if the parameter is optional, otherwise false + */ + public function isOptional () {} + + /** + * Checks if a default value is available + * @link http://www.php.net/manual/en/reflectionparameter.isdefaultvalueavailable.php + * @return bool true if a default value is available, otherwise false + */ + public function isDefaultValueAvailable () {} + + /** + * Gets default parameter value + * @link http://www.php.net/manual/en/reflectionparameter.getdefaultvalue.php + * @return mixed The parameters default value. + */ + public function getDefaultValue () {} + +} + +/** @jms-builtin */ +class ReflectionMethod extends ReflectionFunctionAbstract implements Reflector { + const IS_STATIC = 1; + const IS_PUBLIC = 256; + const IS_PROTECTED = 512; + const IS_PRIVATE = 1024; + const IS_ABSTRACT = 2; + const IS_FINAL = 4; + + public $name; + public $class; + + + /** + * Export + * @link http://www.php.net/manual/en/reflectionmethod.export.php + * @param class string

+ * The class name. + *

+ * @param name string

+ * The name of the method. + *

+ * @param return bool[optional]

+ * &reflection.export.param.return; + *

+ * @return string &reflection.export.return; + */ + public static function export ($class, $name, $return = null) {} + + /** + * Constructs a ReflectionMethod + * @link http://www.php.net/manual/en/reflectionmethod.construct.php + * @param class_or_method + * @param name[optional] + */ + public function __construct ($class_or_method, $name) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionmethod.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Checks if method is public + * @link http://www.php.net/manual/en/reflectionmethod.ispublic.php + * @return bool true if the method is public, otherwise false + */ + public function isPublic () {} + + /** + * Checks if method is private + * @link http://www.php.net/manual/en/reflectionmethod.isprivate.php + * @return bool true if the method is private, otherwise false + */ + public function isPrivate () {} + + /** + * Checks if method is protected + * @link http://www.php.net/manual/en/reflectionmethod.isprotected.php + * @return bool true if the method is protected, otherwise false + */ + public function isProtected () {} + + /** + * Checks if method is abstract + * @link http://www.php.net/manual/en/reflectionmethod.isabstract.php + * @return bool true if the method is abstract, otherwise false + */ + public function isAbstract () {} + + /** + * Checks if method is final + * @link http://www.php.net/manual/en/reflectionmethod.isfinal.php + * @return bool true if the method is final, otherwise false + */ + public function isFinal () {} + + /** + * Checks if method is static + * @link http://www.php.net/manual/en/reflectionmethod.isstatic.php + * @return bool true if the method is static, otherwise false + */ + public function isStatic () {} + + /** + * Checks if method is a constructor + * @link http://www.php.net/manual/en/reflectionmethod.isconstructor.php + * @return bool true if the method is a constructor, otherwise false + */ + public function isConstructor () {} + + /** + * Checks if method is a destructor + * @link http://www.php.net/manual/en/reflectionmethod.isdestructor.php + * @return bool true if the method is a destructor, otherwise false; + */ + public function isDestructor () {} + + /** + * Gets modifiers + * @link http://www.php.net/manual/en/reflectionmethod.getmodifiers.php + * @return int A numeric representation of the modifiers. + */ + public function getModifiers () {} + + /** + * Invoke + * @link http://www.php.net/manual/en/reflectionmethod.invoke.php + * @param object $object

+ * The object to invoke. + *

+ * @param mixed $arg1 + * @param mixed $arg2 + * @param mixed $arg3

+ * The passed in argument list. It accepts a variable number of + * arguments which are passed to the function much like + * call_user_func is. + *

+ * + * @return mixed + * + * @jms-variable-parameters + */ + public function invoke ($object, $arg1 = null, $arg2 = null, $arg3 = null) {} + + /** + * Invoke args + * @link http://www.php.net/manual/en/reflectionmethod.invokeargs.php + * @param object $object

+ *

+ * @param array $args

+ *

+ * @return mixed + */ + public function invokeArgs ($object, array $args) {} + + /** + * Gets declaring class + * @link http://www.php.net/manual/en/reflectionmethod.getdeclaringclass.php + * @return ReflectionClass A ReflectionClass. + */ + public function getDeclaringClass () {} + + /** + * Gets prototype + * @link http://www.php.net/manual/en/reflectionmethod.getprototype.php + * @return void The prototype. + */ + public function getPrototype () {} + + /** + * Clones function + * @link http://www.php.net/manual/en/reflectionfunctionabstract.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Checks if is internal + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isinternal.php + * @return bool true if it's internal, otherwise false + */ + public function isInternal () {} + + /** + * Checks if user defined + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isuserdefined.php + * @return bool true if it's user-defined, otherwise false; + */ + public function isUserDefined () {} + + /** + * Gets function name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getname.php + * @return string The name of the function. + */ + public function getName () {} + + /** + * Gets file name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getfilename.php + * @return string The file name. + */ + public function getFileName () {} + + /** + * Gets starting line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstartline.php + * @return int The starting line number. + */ + public function getStartLine () {} + + /** + * Gets end line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getendline.php + * @return int The ending line number of the user defined class, or false if unknown. + */ + public function getEndLine () {} + + /** + * Gets doc comment + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getdoccomment.php + * @return string The doc comment if it exists, otherwise false + */ + public function getDocComment () {} + + /** + * Gets static variables + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php + * @return array An array of static variables. + */ + public function getStaticVariables () {} + + /** + * Checks if returns reference + * @link http://www.php.net/manual/en/reflectionfunctionabstract.returnsreference.php + * @return bool true if it returns a reference, otherwise false + */ + public function returnsReference () {} + + /** + * Gets parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getparameters.php + * @return array The parameters, as a ReflectionParameter object. + */ + public function getParameters () {} + + /** + * Gets number of parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofparameters.php + * @return int The number of parameters. + */ + public function getNumberOfParameters () {} + + /** + * Gets number of required parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofrequiredparameters.php + * @return int The number of required parameters. + */ + public function getNumberOfRequiredParameters () {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextension.php + * @return ReflectionExtension The extension information, as a ReflectionExtension object. + */ + public function getExtension () {} + + /** + * Gets extension name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * Checks if deprecated + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isdeprecated.php + * @return bool true if it's deprecated, otherwise false + */ + public function isDeprecated () {} + +} + +/** @jms-builtin */ +class ReflectionClass implements Reflector { + const IS_IMPLICIT_ABSTRACT = 16; + const IS_EXPLICIT_ABSTRACT = 32; + const IS_FINAL = 64; + + public $name; + + + /** + * Clones object + * @link http://www.php.net/manual/en/reflectionclass.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Exports a class + * @link http://www.php.net/manual/en/reflectionclass.export.php + * @param argument mixed

+ * &reflection.export.param.name; + *

+ * @param return bool[optional]

+ * &reflection.export.param.return; + *

+ * @return string &reflection.export.return; + */ + public static function export ($argument, $return = null) {} + + /** + * Constructs a ReflectionClass + * @link http://www.php.net/manual/en/reflectionclass.construct.php + * @param argument + */ + public function __construct ($argument) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionclass.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Gets class name + * @link http://www.php.net/manual/en/reflectionclass.getname.php + * @return string The class name. + */ + public function getName () {} + + /** + * Checks if internal + * @link http://www.php.net/manual/en/reflectionclass.isinternal.php + * @return bool Returns true on success or false on failure. + */ + public function isInternal () {} + + /** + * Checks if user defined + * @link http://www.php.net/manual/en/reflectionclass.isuserdefined.php + * @return bool Returns true on success or false on failure. + */ + public function isUserDefined () {} + + /** + * Checks if instantiable + * @link http://www.php.net/manual/en/reflectionclass.isinstantiable.php + * @return bool Returns true on success or false on failure. + */ + public function isInstantiable () {} + + /** + * Gets a filename + * @link http://www.php.net/manual/en/reflectionclass.getfilename.php + * @return string The filename. + */ + public function getFileName () {} + + /** + * Gets starting line number + * @link http://www.php.net/manual/en/reflectionclass.getstartline.php + * @return int The starting line number, as an integer. + */ + public function getStartLine () {} + + /** + * Gets end line + * @link http://www.php.net/manual/en/reflectionclass.getendline.php + * @return int The ending line number of the user defined class, or false if unknown. + */ + public function getEndLine () {} + + /** + * Gets doc comments + * @link http://www.php.net/manual/en/reflectionclass.getdoccomment.php + * @return string The doc comment if it exists, otherwise false + */ + public function getDocComment () {} + + /** + * Gets constructor + * @link http://www.php.net/manual/en/reflectionclass.getconstructor.php + * @return object A ReflectionMethod object. + */ + public function getConstructor () {} + + /** + * Checks if method is defined + * @link http://www.php.net/manual/en/reflectionclass.hasmethod.php + * @param name string

+ * Name of the method being checked for. + *

+ * @return bool true if it has the method, otherwise false + */ + public function hasMethod ($name) {} + + /** + * Gets a ReflectionMethod + * @link http://www.php.net/manual/en/reflectionclass.getmethod.php + * @param name string

+ * The method name to reflect. + *

+ * @return object A ReflectionMethod. + */ + public function getMethod ($name) {} + + /** + * Gets a list of methods + * @link http://www.php.net/manual/en/reflectionclass.getmethods.php + * @param filter string[optional]

+ * Any combination of ReflectionMethod::IS_STATIC, + * ReflectionMethod::IS_PUBLIC, + * ReflectionMethod::IS_PROTECTED, + * ReflectionMethod::IS_PRIVATE, + * ReflectionMethod::IS_ABSTRACT, + * ReflectionMethod::IS_FINAL. + *

+ * @return array An array of methods. + */ + public function getMethods ($filter = null) {} + + /** + * Checks if property is defined + * @link http://www.php.net/manual/en/reflectionclass.hasproperty.php + * @param name string

+ * Name of the property being checked for. + *

+ * @return bool true if it has the property, otherwise false + */ + public function hasProperty ($name) {} + + /** + * Gets property + * @link http://www.php.net/manual/en/reflectionclass.getproperty.php + * @param name string

+ * The property name. + *

+ * @return ReflectionProperty A ReflectionProperty. + */ + public function getProperty ($name) {} + + /** + * Gets properties + * @link http://www.php.net/manual/en/reflectionclass.getproperties.php + * @param filter int[optional]

+ * The optional filter, for filtering desired property types. It's configured using + * the ReflectionProperty constants, + * and defaults to all property types. + *

+ * @return array An array of ReflectionProperty objects. + */ + public function getProperties ($filter = null) {} + + /** + * Checks if constant is defined + * @link http://www.php.net/manual/en/reflectionclass.hasconstant.php + * @param name string

+ * The name of the constant being checked for. + *

+ * @return bool true if the constant is defined, otherwise false. + */ + public function hasConstant ($name) {} + + /** + * Gets constants + * @link http://www.php.net/manual/en/reflectionclass.getconstants.php + * @return array An array of constants. + */ + public function getConstants () {} + + /** + * Gets defined constants + * @link http://www.php.net/manual/en/reflectionclass.getconstant.php + * @param name string

+ *

+ * @return mixed + */ + public function getConstant ($name) {} + + /** + * Gets the interfaces + * @link http://www.php.net/manual/en/reflectionclass.getinterfaces.php + * @return array An associative array of interfaces, with keys as interface + * names and the array values as ReflectionClass objects. + */ + public function getInterfaces () {} + + /** + * Gets the interface names + * @link http://www.php.net/manual/en/reflectionclass.getinterfacenames.php + * @return array A numerical array with interface names as the values. + */ + public function getInterfaceNames () {} + + /** + * Checks if interface + * @link http://www.php.net/manual/en/reflectionclass.isinterface.php + * @return bool Returns true on success or false on failure. + */ + public function isInterface () {} + + /** + * Checks if class is abstract + * @link http://www.php.net/manual/en/reflectionclass.isabstract.php + * @return bool Returns true on success or false on failure. + */ + public function isAbstract () {} + + /** + * Checks if class is final + * @link http://www.php.net/manual/en/reflectionclass.isfinal.php + * @return bool Returns true on success or false on failure. + */ + public function isFinal () {} + + /** + * Gets modifiers + * @link http://www.php.net/manual/en/reflectionclass.getmodifiers.php + * @return int + */ + public function getModifiers () {} + + /** + * Checks class for instance + * @link http://www.php.net/manual/en/reflectionclass.isinstance.php + * @param object object

+ * The object being compared to. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isInstance ($object) {} + + /** + * New instance + * @link http://www.php.net/manual/en/reflectionclass.newinstance.php + * @param args mixed

+ * Accepts a variable number of arguments which are passed to the function + * much like call_user_func. + *

+ * @param _ mixed[optional] + * @return object + */ + public function newInstance ($args, $_ = null) {} + + /** + * New instance args + * @link http://www.php.net/manual/en/reflectionclass.newinstanceargs.php + * @param args array[optional]

+ *

+ * @return object + */ + public function newInstanceArgs (array $args = null) {} + + /** + * Gets parent class + * @link http://www.php.net/manual/en/reflectionclass.getparentclass.php + * @return object A ReflectionClass. + */ + public function getParentClass () {} + + /** + * Checks if a subclass + * @link http://www.php.net/manual/en/reflectionclass.issubclassof.php + * @param class string

+ * The class name being checked against. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSubclassOf ($class) {} + + /** + * Gets static properties + * @link http://www.php.net/manual/en/reflectionclass.getstaticproperties.php + * @return array The static properties, as an array. + */ + public function getStaticProperties () {} + + /** + * Gets static property value + * @link http://www.php.net/manual/en/reflectionclass.getstaticpropertyvalue.php + * @param name string

+ *

+ * @param default string[optional]

+ *

+ * @return mixed + */ + public function getStaticPropertyValue ($name, $default = null) {} + + /** + * Sets static property value + * @link http://www.php.net/manual/en/reflectionclass.setstaticpropertyvalue.php + * @param name string

+ * Property name. + *

+ * @param value string

+ * New property value. + *

+ * @return void + */ + public function setStaticPropertyValue ($name, $value) {} + + /** + * Gets default properties + * @link http://www.php.net/manual/en/reflectionclass.getdefaultproperties.php + * @return array An array of default properties. + */ + public function getDefaultProperties () {} + + /** + * Checks if iterateable + * @link http://www.php.net/manual/en/reflectionclass.isiterateable.php + * @return bool Returns true on success or false on failure. + */ + public function isIterateable () {} + + /** + * Implements interface + * @link http://www.php.net/manual/en/reflectionclass.implementsinterface.php + * @param interface string

+ * The interface name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function implementsInterface ($interface) {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionclass.getextension.php + * @return ReflectionExtension A ReflectionExtension object. + */ + public function getExtension () {} + + /** + * Gets an extensions name + * @link http://www.php.net/manual/en/reflectionclass.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + +} + +/** @jms-builtin */ +class ReflectionObject extends ReflectionClass implements Reflector { + const IS_IMPLICIT_ABSTRACT = 16; + const IS_EXPLICIT_ABSTRACT = 32; + const IS_FINAL = 64; + + public $name; + + + /** + * Export + * @link http://www.php.net/manual/en/reflectionobject.export.php + * @param argument string

+ * &reflection.export.param.name; + *

+ * @param return bool[optional]

+ * &reflection.export.param.return; + *

+ * @return string &reflection.export.return; + */ + public static function export ($argument, $return = null) {} + + /** + * Constructs a ReflectionObject + * @link http://www.php.net/manual/en/reflectionobject.construct.php + * @param argument + */ + public function __construct ($argument) {} + + /** + * Clones object + * @link http://www.php.net/manual/en/reflectionclass.clone.php + * @return void + */ + final private function __clone () {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionclass.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Gets class name + * @link http://www.php.net/manual/en/reflectionclass.getname.php + * @return string The class name. + */ + public function getName () {} + + /** + * Checks if internal + * @link http://www.php.net/manual/en/reflectionclass.isinternal.php + * @return bool Returns true on success or false on failure. + */ + public function isInternal () {} + + /** + * Checks if user defined + * @link http://www.php.net/manual/en/reflectionclass.isuserdefined.php + * @return bool Returns true on success or false on failure. + */ + public function isUserDefined () {} + + /** + * Checks if instantiable + * @link http://www.php.net/manual/en/reflectionclass.isinstantiable.php + * @return bool Returns true on success or false on failure. + */ + public function isInstantiable () {} + + /** + * Gets a filename + * @link http://www.php.net/manual/en/reflectionclass.getfilename.php + * @return string The filename. + */ + public function getFileName () {} + + /** + * Gets starting line number + * @link http://www.php.net/manual/en/reflectionclass.getstartline.php + * @return int The starting line number, as an integer. + */ + public function getStartLine () {} + + /** + * Gets end line + * @link http://www.php.net/manual/en/reflectionclass.getendline.php + * @return int The ending line number of the user defined class, or false if unknown. + */ + public function getEndLine () {} + + /** + * Gets doc comments + * @link http://www.php.net/manual/en/reflectionclass.getdoccomment.php + * @return string The doc comment if it exists, otherwise false + */ + public function getDocComment () {} + + /** + * Gets constructor + * @link http://www.php.net/manual/en/reflectionclass.getconstructor.php + * @return object A ReflectionMethod object. + */ + public function getConstructor () {} + + /** + * Checks if method is defined + * @link http://www.php.net/manual/en/reflectionclass.hasmethod.php + * @param name string

+ * Name of the method being checked for. + *

+ * @return bool true if it has the method, otherwise false + */ + public function hasMethod ($name) {} + + /** + * Gets a ReflectionMethod + * @link http://www.php.net/manual/en/reflectionclass.getmethod.php + * @param name string

+ * The method name to reflect. + *

+ * @return object A ReflectionMethod. + */ + public function getMethod ($name) {} + + /** + * Gets a list of methods + * @link http://www.php.net/manual/en/reflectionclass.getmethods.php + * @param filter string[optional]

+ * Any combination of ReflectionMethod::IS_STATIC, + * ReflectionMethod::IS_PUBLIC, + * ReflectionMethod::IS_PROTECTED, + * ReflectionMethod::IS_PRIVATE, + * ReflectionMethod::IS_ABSTRACT, + * ReflectionMethod::IS_FINAL. + *

+ * @return array An array of methods. + */ + public function getMethods ($filter = null) {} + + /** + * Checks if property is defined + * @link http://www.php.net/manual/en/reflectionclass.hasproperty.php + * @param name string

+ * Name of the property being checked for. + *

+ * @return bool true if it has the property, otherwise false + */ + public function hasProperty ($name) {} + + /** + * Gets property + * @link http://www.php.net/manual/en/reflectionclass.getproperty.php + * @param name string

+ * The property name. + *

+ * @return ReflectionProperty A ReflectionProperty. + */ + public function getProperty ($name) {} + + /** + * Gets properties + * @link http://www.php.net/manual/en/reflectionclass.getproperties.php + * @param filter int[optional]

+ * The optional filter, for filtering desired property types. It's configured using + * the ReflectionProperty constants, + * and defaults to all property types. + *

+ * @return array An array of ReflectionProperty objects. + */ + public function getProperties ($filter = null) {} + + /** + * Checks if constant is defined + * @link http://www.php.net/manual/en/reflectionclass.hasconstant.php + * @param name string

+ * The name of the constant being checked for. + *

+ * @return bool true if the constant is defined, otherwise false. + */ + public function hasConstant ($name) {} + + /** + * Gets constants + * @link http://www.php.net/manual/en/reflectionclass.getconstants.php + * @return array An array of constants. + */ + public function getConstants () {} + + /** + * Gets defined constants + * @link http://www.php.net/manual/en/reflectionclass.getconstant.php + * @param name string

+ *

+ * @return mixed + */ + public function getConstant ($name) {} + + /** + * Gets the interfaces + * @link http://www.php.net/manual/en/reflectionclass.getinterfaces.php + * @return array An associative array of interfaces, with keys as interface + * names and the array values as ReflectionClass objects. + */ + public function getInterfaces () {} + + /** + * Gets the interface names + * @link http://www.php.net/manual/en/reflectionclass.getinterfacenames.php + * @return array A numerical array with interface names as the values. + */ + public function getInterfaceNames () {} + + /** + * Checks if interface + * @link http://www.php.net/manual/en/reflectionclass.isinterface.php + * @return bool Returns true on success or false on failure. + */ + public function isInterface () {} + + /** + * Checks if class is abstract + * @link http://www.php.net/manual/en/reflectionclass.isabstract.php + * @return bool Returns true on success or false on failure. + */ + public function isAbstract () {} + + /** + * Checks if class is final + * @link http://www.php.net/manual/en/reflectionclass.isfinal.php + * @return bool Returns true on success or false on failure. + */ + public function isFinal () {} + + /** + * Gets modifiers + * @link http://www.php.net/manual/en/reflectionclass.getmodifiers.php + * @return int + */ + public function getModifiers () {} + + /** + * Checks class for instance + * @link http://www.php.net/manual/en/reflectionclass.isinstance.php + * @param object object

+ * The object being compared to. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isInstance ($object) {} + + /** + * New instance + * @link http://www.php.net/manual/en/reflectionclass.newinstance.php + * @param args mixed

+ * Accepts a variable number of arguments which are passed to the function + * much like call_user_func. + *

+ * @param _ mixed[optional] + * @return object + */ + public function newInstance ($args, $_ = null) {} + + /** + * New instance args + * @link http://www.php.net/manual/en/reflectionclass.newinstanceargs.php + * @param args array[optional]

+ *

+ * @return object + */ + public function newInstanceArgs (array $args = null) {} + + /** + * Gets parent class + * @link http://www.php.net/manual/en/reflectionclass.getparentclass.php + * @return object A ReflectionClass. + */ + public function getParentClass () {} + + /** + * Checks if a subclass + * @link http://www.php.net/manual/en/reflectionclass.issubclassof.php + * @param class string

+ * The class name being checked against. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSubclassOf ($class) {} + + /** + * Gets static properties + * @link http://www.php.net/manual/en/reflectionclass.getstaticproperties.php + * @return array The static properties, as an array. + */ + public function getStaticProperties () {} + + /** + * Gets static property value + * @link http://www.php.net/manual/en/reflectionclass.getstaticpropertyvalue.php + * @param name string

+ *

+ * @param default string[optional]

+ *

+ * @return mixed + */ + public function getStaticPropertyValue ($name, $default = null) {} + + /** + * Sets static property value + * @link http://www.php.net/manual/en/reflectionclass.setstaticpropertyvalue.php + * @param name string

+ * Property name. + *

+ * @param value string

+ * New property value. + *

+ * @return void + */ + public function setStaticPropertyValue ($name, $value) {} + + /** + * Gets default properties + * @link http://www.php.net/manual/en/reflectionclass.getdefaultproperties.php + * @return array An array of default properties. + */ + public function getDefaultProperties () {} + + /** + * Checks if iterateable + * @link http://www.php.net/manual/en/reflectionclass.isiterateable.php + * @return bool Returns true on success or false on failure. + */ + public function isIterateable () {} + + /** + * Implements interface + * @link http://www.php.net/manual/en/reflectionclass.implementsinterface.php + * @param interface string

+ * The interface name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function implementsInterface ($interface) {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionclass.getextension.php + * @return ReflectionExtension A ReflectionExtension object. + */ + public function getExtension () {} + + /** + * Gets an extensions name + * @link http://www.php.net/manual/en/reflectionclass.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + +} + +/** @jms-builtin */ +class ReflectionProperty implements Reflector { + const IS_STATIC = 1; + const IS_PUBLIC = 256; + const IS_PROTECTED = 512; + const IS_PRIVATE = 1024; + + public $name; + public $class; + + + /** + * Clone + * @link http://www.php.net/manual/en/reflectionproperty.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Export + * @link http://www.php.net/manual/en/reflectionproperty.export.php + * @param class mixed + * @param name string

+ * The property name. + *

+ * @param return bool[optional]

+ * &reflection.export.param.return; + *

+ * @return string + */ + public static function export ($class, $name, $return = null) {} + + /** + * Construct a ReflectionProperty object + * @link http://www.php.net/manual/en/reflectionproperty.construct.php + * @param argument + */ + public function __construct ($argument) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionproperty.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Gets property name + * @link http://www.php.net/manual/en/reflectionproperty.getname.php + * @return string The name of the reflected property. + */ + public function getName () {} + + /** + * Gets value + * @link http://www.php.net/manual/en/reflectionproperty.getvalue.php + * @param object string[optional]

+ * The object being reflected. + *

+ * @return mixed The current value of the property. + */ + public function getValue ($object = null) {} + + /** + * Set property value + * @link http://www.php.net/manual/en/reflectionproperty.setvalue.php + * @param object object

+ * The object name. + *

+ * @param value mixed

+ * The new value. + *

+ * @return void + */ + public function setValue ($object, $value) {} + + /** + * Checks if property is public + * @link http://www.php.net/manual/en/reflectionproperty.ispublic.php + * @return bool true if the property is public, false otherwise. + */ + public function isPublic () {} + + /** + * Checks if property is private + * @link http://www.php.net/manual/en/reflectionproperty.isprivate.php + * @return bool true if the property is private, false otherwise. + */ + public function isPrivate () {} + + /** + * Checks if property is protected + * @link http://www.php.net/manual/en/reflectionproperty.isprotected.php + * @return bool true if the property is protected, false otherwise. + */ + public function isProtected () {} + + /** + * Checks if property is static + * @link http://www.php.net/manual/en/reflectionproperty.isstatic.php + * @return bool true if the property is static, false otherwise. + */ + public function isStatic () {} + + /** + * Checks if default value + * @link http://www.php.net/manual/en/reflectionproperty.isdefault.php + * @return bool true if the property was declared at compile-time, or false if + * it was created at run-time. + */ + public function isDefault () {} + + /** + * Gets modifiers + * @link http://www.php.net/manual/en/reflectionproperty.getmodifiers.php + * @return int A numeric representation of the modifiers. + */ + public function getModifiers () {} + + /** + * Gets declaring class + * @link http://www.php.net/manual/en/reflectionproperty.getdeclaringclass.php + * @return ReflectionClass A ReflectionClass object. + */ + public function getDeclaringClass () {} + + /** + * Gets doc comment + * @link http://www.php.net/manual/en/reflectionproperty.getdoccomment.php + * @return string The doc comment. + */ + public function getDocComment () {} + +} + +/** @jms-builtin */ +class ReflectionExtension implements Reflector { + public $name; + + + /** + * Clones + * @link http://www.php.net/manual/en/reflectionextension.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Export + * @link http://www.php.net/manual/en/reflectionextension.export.php + * @param name string

+ * &reflection.export.param.name; + *

+ * @param return string[optional]

+ * &reflection.export.param.return; + *

+ * @return string &reflection.export.return; + */ + public static function export ($name, $return = null) {} + + /** + * Constructs a ReflectionExtension + * @link http://www.php.net/manual/en/reflectionextension.construct.php + * @param name + */ + public function __construct ($name) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionextension.tostring.php + * @return string A string. + */ + public function __toString () {} + + /** + * Gets extension name + * @link http://www.php.net/manual/en/reflectionextension.getname.php + * @return string The extensions name. + */ + public function getName () {} + + /** + * Gets extension version + * @link http://www.php.net/manual/en/reflectionextension.getversion.php + * @return string The version of the extension. + */ + public function getVersion () {} + + /** + * Gets extension functions + * @link http://www.php.net/manual/en/reflectionextension.getfunctions.php + * @return array An associative array of ReflectionFunction objects, + * for each function defined in the extension with the keys being the function + * names. If no function are defined, an empty array is returned. + */ + public function getFunctions () {} + + /** + * Gets constants + * @link http://www.php.net/manual/en/reflectionextension.getconstants.php + * @return array An associative array with constant names as keys. + */ + public function getConstants () {} + + /** + * Gets extension ini entries + * @link http://www.php.net/manual/en/reflectionextension.getinientries.php + * @return array An associative array with the ini entries as keys, + * with their defined values as values. + */ + public function getINIEntries () {} + + /** + * Gets classes + * @link http://www.php.net/manual/en/reflectionextension.getclasses.php + * @return array An array of ReflectionClass objects, one + * for each class within the extension. If no classes are defined, + * an empty array is returned. + */ + public function getClasses () {} + + /** + * Gets class names + * @link http://www.php.net/manual/en/reflectionextension.getclassnames.php + * @return array An array of class names, as defined in the extension. + * If no classes are defined, an empty array is returned. + */ + public function getClassNames () {} + + /** + * Gets dependencies + * @link http://www.php.net/manual/en/reflectionextension.getdependencies.php + * @return array An associative array with dependencies as keys and + * either Required or Conflicts + * as the values. + */ + public function getDependencies () {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionextension.info.php + * @return string Information about the extension. + */ + public function info () {} + +} +// End of Reflection v.0.1 +?> diff --git a/res/php-5.2-core-api/SPL.php b/res/php-5.2-core-api/SPL.php new file mode 100644 index 0000000..ba4c9a6 --- /dev/null +++ b/res/php-5.2-core-api/SPL.php @@ -0,0 +1,4954 @@ + + * The maximum allowed depth. -1 is used + * for any depth. + *

+ * @return void + */ + public function setMaxDepth ($max_depth = null) {} + + /** + * Get max depth + * @link http://www.php.net/manual/en/recursiveiteratoriterator.getmaxdepth.php + * @return mixed The maximum accepted depth, or false if any depth is allowed. + */ + public function getMaxDepth () {} + +} + +interface OuterIterator extends Iterator, Traversable { + + /** + * Returns the inner iterator for the current entry. + * @link http://www.php.net/manual/en/outeriterator.getchildren.php + * @return Iterator The inner iterator for the current entry. + */ + abstract public function getInnerIterator () {} + + abstract public function current () {} + + abstract public function next () {} + + abstract public function key () {} + + abstract public function valid () {} + + abstract public function rewind () {} + +} + +/** @jms-builtin */ +class IteratorIterator implements Iterator, Traversable, OuterIterator { + + /** + * Create an iterator from anything that is traversable + * @link http://www.php.net/manual/en/iteratoriterator.construct.php + * @param iterator Traversable + */ + public function __construct (Traversable $iterator) {} + + /** + * Rewind to the first element + * @link http://www.php.net/manual/en/iteratoriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Checks if the iterator is valid + * @link http://www.php.net/manual/en/iteratoriterator.valid.php + * @return bool true if the iterator is valid, otherwise false + */ + public function valid () {} + + /** + * Get the key of the current element + * @link http://www.php.net/manual/en/iteratoriterator.key.php + * @return void The key of the current element. + */ + public function key () {} + + /** + * Get the current value + * @link http://www.php.net/manual/en/iteratoriterator.current.php + * @return void The value of the current element. + */ + public function current () {} + + /** + * Forward to the next element + * @link http://www.php.net/manual/en/iteratoriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/iteratoriterator.getinneriterator.php + * @return void The inner iterator as passed to IteratorIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class FilterIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * Construct a filterIterator + * @link http://www.php.net/manual/en/filteriterator.construct.php + * @param iterator Iterator + */ + public function __construct (Iterator $iterator) {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/filteriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/filteriterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current element value + * @link http://www.php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/filteriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + + /** + * Check whether the current element of the iterator is acceptable + * @link http://www.php.net/manual/en/filteriterator.accept.php + * @return bool true if the current element is acceptable, otherwise false. + */ + abstract public function accept () {} + +} + +/** @jms-builtin */ +class RecursiveFilterIterator extends FilterIterator implements Iterator, Traversable, OuterIterator, RecursiveIterator { + + /** + * Create a RecursiveFilterIterator from a RecursiveIterator + * @link http://www.php.net/manual/en/recursivefilteriterator.construct.php + * @param iterator RecursiveIterator + */ + public function __construct (RecursiveIterator $iterator) {} + + /** + * Check whether the inner iterator's current element has children + * @link http://www.php.net/manual/en/recursivefilteriterator.haschildren.php + * @return void true if the inner iterator has children, otherwise false + */ + public function hasChildren () {} + + /** + * Return the inner iterator's children contained in a RecursiveFilterIterator + * @link http://www.php.net/manual/en/recursivefilteriterator.getchildren.php + * @return void a RecursiveFilterIterator containing the inner iterator's children. + */ + public function getChildren () {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/filteriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/filteriterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current element value + * @link http://www.php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/filteriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + + /** + * Check whether the current element of the iterator is acceptable + * @link http://www.php.net/manual/en/filteriterator.accept.php + * @return bool true if the current element is acceptable, otherwise false. + */ + abstract public function accept () {} + +} + +/** @jms-builtin */ +class ParentIterator extends RecursiveFilterIterator implements RecursiveIterator, OuterIterator, Traversable, Iterator { + + /** + * Constructs a ParentIterator + * @link http://www.php.net/manual/en/parentiterator.construct.php + * @param iterator RecursiveIterator + */ + public function __construct (RecursiveIterator $iterator) {} + + /** + * Determines acceptability + * @link http://www.php.net/manual/en/parentiterator.accept.php + * @return bool true if the current element is acceptable, otherwise false. + */ + public function accept () {} + + /** + * Check whether the inner iterator's current element has children + * @link http://www.php.net/manual/en/recursivefilteriterator.haschildren.php + * @return void true if the inner iterator has children, otherwise false + */ + public function hasChildren () {} + + /** + * Return the inner iterator's children contained in a RecursiveFilterIterator + * @link http://www.php.net/manual/en/recursivefilteriterator.getchildren.php + * @return void a RecursiveFilterIterator containing the inner iterator's children. + */ + public function getChildren () {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/filteriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/filteriterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current element value + * @link http://www.php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/filteriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +interface Countable { + + /** + * Count elements of an object + * @link http://www.php.net/manual/en/countable.count.php + * @return int The custom count as an integer. + *

+ *

+ * The return value is cast to an integer. + */ + abstract public function count () {} + +} + +interface SeekableIterator extends Iterator, Traversable { + + /** + * Seeks to a position + * @link http://www.php.net/manual/en/seekableiterator.seek.php + * @param position int

+ * The position to seek to. + *

+ * @return void + */ + abstract public function seek ($position) {} + + abstract public function current () {} + + abstract public function next () {} + + abstract public function key () {} + + abstract public function valid () {} + + abstract public function rewind () {} + +} + +/** @jms-builtin */ +class LimitIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * Construct a LimitIterator + * @link http://www.php.net/manual/en/limititerator.construct.php + * @param iterator Iterator + * @param offset[optional] + * @param count[optional] + */ + public function __construct (Iterator $iterator, $offset, $count) {} + + /** + * Rewind the iterator to the specified starting offset + * @link http://www.php.net/manual/en/limititerator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/limititerator.valid.php + * @return bool Returns true on success or false on failure. + */ + public function valid () {} + + /** + * Get current key + * @link http://www.php.net/manual/en/limititerator.key.php + * @return mixed the key for the current item. + */ + public function key () {} + + /** + * Get current element + * @link http://www.php.net/manual/en/limititerator.current.php + * @return mixed the current element or &null; if there is none. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/limititerator.next.php + * @return void + */ + public function next () {} + + /** + * Seek to the given position + * @link http://www.php.net/manual/en/limititerator.seek.php + * @param position int

+ * The position to seek to. + *

+ * @return int the offset position after seeking. + */ + public function seek ($position) {} + + /** + * Return the current position + * @link http://www.php.net/manual/en/limititerator.getposition.php + * @return int The current position. + */ + public function getPosition () {} + + /** + * Get inner iterator + * @link http://www.php.net/manual/en/limititerator.getinneriterator.php + * @return Iterator The inner iterator passed to LimitIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class CachingIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator, ArrayAccess, Countable { + const CALL_TOSTRING = 1; + const CATCH_GET_CHILD = 16; + const TOSTRING_USE_KEY = 2; + const TOSTRING_USE_CURRENT = 4; + const TOSTRING_USE_INNER = 8; + const FULL_CACHE = 256; + + + /** + * Construct a new CachingIterator object for the iterator. + * @link http://www.php.net/manual/en/cachingiterator.construct.php + * @param iterator Iterator + * @param flags[optional] + */ + public function __construct (Iterator $iterator, $flags) {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/cachingiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/cachingiterator.valid.php + * @return void Returns true on success or false on failure. + */ + public function valid () {} + + /** + * Return the key for the current element + * @link http://www.php.net/manual/en/cachingiterator.key.php + * @return void + */ + public function key () {} + + /** + * Return the current element + * @link http://www.php.net/manual/en/cachingiterator.current.php + * @return void Mixed + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/cachingiterator.next.php + * @return void + */ + public function next () {} + + /** + * Check whether the inner iterator has a valid next element + * @link http://www.php.net/manual/en/cachingiterator.hasnext.php + * @return void Returns true on success or false on failure. + */ + public function hasNext () {} + + /** + * Return the string representation of the current element + * @link http://www.php.net/manual/en/cachingiterator.tostring.php + * @return void The string representation of the current element. + */ + public function __toString () {} + + /** + * Return the innter iterator + * @link http://www.php.net/manual/en/cachingiterator.getinneriterator.php + * @return void an object implementing the Iterator interface. + */ + public function getInnerIterator () {} + + /** + * Get flags used + * @link http://www.php.net/manual/en/cachingiterator.getflags.php + * @return void Description... + */ + public function getFlags () {} + + /** + * The setFlags purpose + * @link http://www.php.net/manual/en/cachingiterator.setflags.php + * @param flags bitmask

+ * Bitmask of the flags to set. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * The offsetGet purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetget.php + * @param index string

+ * Description... + *

+ * @return void Description... + */ + public function offsetGet ($index) {} + + /** + * The offsetSet purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetset.php + * @param index string

+ * The index of the element to be set. + *

+ * @param newval string

+ * The new value for the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * The offsetUnset purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetunset.php + * @param index string

+ * The index of the element to be unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * The offsetExists purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetexists.php + * @param index string

+ * The index being checked. + *

+ * @return void true if an entry referenced by the offset exists, false otherwise. + */ + public function offsetExists ($index) {} + + /** + * The getCache purpose + * @link http://www.php.net/manual/en/cachingiterator.getcache.php + * @return void Description... + */ + public function getCache () {} + + /** + * The number of elements in the iterator + * @link http://www.php.net/manual/en/cachingiterator.count.php + * @return void The count of the elements iterated over. + */ + public function count () {} + +} + +/** @jms-builtin */ +class RecursiveCachingIterator extends CachingIterator implements Countable, ArrayAccess, Iterator, Traversable, OuterIterator, RecursiveIterator { + const CALL_TOSTRING = 1; + const CATCH_GET_CHILD = 16; + const TOSTRING_USE_KEY = 2; + const TOSTRING_USE_CURRENT = 4; + const TOSTRING_USE_INNER = 8; + const FULL_CACHE = 256; + + + /** + * Construct + * @link http://www.php.net/manual/en/recursivecachingiterator.construct.php + * @param iterator Iterator + * @param flags[optional] + */ + public function __construct (Iterator $iterator, $flags) {} + + /** + * Check whether the current element of the inner iterator has children + * @link http://www.php.net/manual/en/recursivecachingiterator.haschildren.php + * @return bool true if the inner iterator has children, otherwise false + */ + public function hasChildren () {} + + /** + * Return the inner iterator's children as a RecursiveCachingIterator + * @link http://www.php.net/manual/en/recursivecachingiterator.getchildren.php + * @return RecursiveCachingIterator The inner iterator's children, as a RecursiveCachingIterator. + */ + public function getChildren () {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/cachingiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/cachingiterator.valid.php + * @return void Returns true on success or false on failure. + */ + public function valid () {} + + /** + * Return the key for the current element + * @link http://www.php.net/manual/en/cachingiterator.key.php + * @return void + */ + public function key () {} + + /** + * Return the current element + * @link http://www.php.net/manual/en/cachingiterator.current.php + * @return void Mixed + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/cachingiterator.next.php + * @return void + */ + public function next () {} + + /** + * Check whether the inner iterator has a valid next element + * @link http://www.php.net/manual/en/cachingiterator.hasnext.php + * @return void Returns true on success or false on failure. + */ + public function hasNext () {} + + /** + * Return the string representation of the current element + * @link http://www.php.net/manual/en/cachingiterator.tostring.php + * @return void The string representation of the current element. + */ + public function __toString () {} + + /** + * Return the innter iterator + * @link http://www.php.net/manual/en/cachingiterator.getinneriterator.php + * @return void an object implementing the Iterator interface. + */ + public function getInnerIterator () {} + + /** + * Get flags used + * @link http://www.php.net/manual/en/cachingiterator.getflags.php + * @return void Description... + */ + public function getFlags () {} + + /** + * The setFlags purpose + * @link http://www.php.net/manual/en/cachingiterator.setflags.php + * @param flags bitmask

+ * Bitmask of the flags to set. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * The offsetGet purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetget.php + * @param index string

+ * Description... + *

+ * @return void Description... + */ + public function offsetGet ($index) {} + + /** + * The offsetSet purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetset.php + * @param index string

+ * The index of the element to be set. + *

+ * @param newval string

+ * The new value for the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * The offsetUnset purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetunset.php + * @param index string

+ * The index of the element to be unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * The offsetExists purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetexists.php + * @param index string

+ * The index being checked. + *

+ * @return void true if an entry referenced by the offset exists, false otherwise. + */ + public function offsetExists ($index) {} + + /** + * The getCache purpose + * @link http://www.php.net/manual/en/cachingiterator.getcache.php + * @return void Description... + */ + public function getCache () {} + + /** + * The number of elements in the iterator + * @link http://www.php.net/manual/en/cachingiterator.count.php + * @return void The count of the elements iterated over. + */ + public function count () {} + +} + +/** @jms-builtin */ +class NoRewindIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * Construct a NoRewindIterator + * @link http://www.php.net/manual/en/norewinditerator.construct.php + * @param iterator Iterator + */ + public function __construct (Iterator $iterator) {} + + /** + * Prevents the rewind operation on the inner iterator. + * @link http://www.php.net/manual/en/norewinditerator.haschildren.php + * @return void + */ + public function rewind () {} + + /** + * Validates the iterator + * @link http://www.php.net/manual/en/norewinditerator.valid.php + * @return bool Returns true on success or false on failure. + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/norewinditerator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current value + * @link http://www.php.net/manual/en/norewinditerator.current.php + * @return mixed The current value. + */ + public function current () {} + + /** + * Forward to the next element + * @link http://www.php.net/manual/en/norewinditerator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/norewinditerator.getinneriterator.php + * @return iterator The inner iterator, as passed to NoRewindIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class AppendIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * Constructs an AppendIterator + * @link http://www.php.net/manual/en/appenditerator.construct.php + */ + public function __construct () {} + + /** + * Appends an iterator + * @link http://www.php.net/manual/en/appenditerator.append.php + * @param iterator Iterator

+ * The iterator to append. + *

+ * @return void + */ + public function append ($iterator) {} + + /** + * Rewinds the Iterator + * @link http://www.php.net/manual/en/appenditerator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Checks validity of the current element + * @link http://www.php.net/manual/en/appenditerator.valid.php + * @return void Returns true on success or false on failure. + */ + public function valid () {} + + /** + * Gets the current key + * @link http://www.php.net/manual/en/appenditerator.key.php + * @return void The current key if it is valid or &null; otherwise. + */ + public function key () {} + + /** + * Gets the current value + * @link http://www.php.net/manual/en/appenditerator.current.php + * @return void The current value if it is valid or &null; otherwise. + */ + public function current () {} + + /** + * Moves to the next element + * @link http://www.php.net/manual/en/appenditerator.next.php + * @return void + */ + public function next () {} + + /** + * Gets an inner iterator + * @link http://www.php.net/manual/en/appenditerator.getinneriterator.php + * @return void The current inner Iterator. + */ + public function getInnerIterator () {} + + /** + * Gets an index of iterators + * @link http://www.php.net/manual/en/appenditerator.getiteratorindex.php + * @return void The index of iterators. + */ + public function getIteratorIndex () {} + + /** + * The getArrayIterator method + * @link http://www.php.net/manual/en/appenditerator.getarrayiterator.php + * @return void + */ + public function getArrayIterator () {} + +} + +/** @jms-builtin */ +class InfiniteIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * Constructs an InfiniteIterator + * @link http://www.php.net/manual/en/infiniteiterator.construct.php + * @param iterator Iterator + */ + public function __construct (Iterator $iterator) {} + + /** + * Moves the inner Iterator forward or rewinds it + * @link http://www.php.net/manual/en/infiniteiterator.next.php + * @return void + */ + public function next () {} + + /** + * Rewind to the first element + * @link http://www.php.net/manual/en/iteratoriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Checks if the iterator is valid + * @link http://www.php.net/manual/en/iteratoriterator.valid.php + * @return bool true if the iterator is valid, otherwise false + */ + public function valid () {} + + /** + * Get the key of the current element + * @link http://www.php.net/manual/en/iteratoriterator.key.php + * @return void The key of the current element. + */ + public function key () {} + + /** + * Get the current value + * @link http://www.php.net/manual/en/iteratoriterator.current.php + * @return void The value of the current element. + */ + public function current () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/iteratoriterator.getinneriterator.php + * @return void The inner iterator as passed to IteratorIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class RegexIterator extends FilterIterator implements Iterator, Traversable, OuterIterator { + const USE_KEY = 1; + const MATCH = 0; + const GET_MATCH = 1; + const ALL_MATCHES = 2; + const SPLIT = 3; + const REPLACE = 4; + + public $replacement; + + + /** + * Create a new RegexIterator + * @link http://www.php.net/manual/en/regexiterator.construct.php + * @param iterator Iterator + * @param regex + * @param mode[optional] + * @param flags[optional] + * @param preg_flags[optional] + */ + public function __construct (Iterator $iterator, $regex, $mode, $flags, $preg_flags) {} + + /** + * Get accept status + * @link http://www.php.net/manual/en/regexiterator.accept.php + * @return bool true if a match, false otherwise. + */ + public function accept () {} + + /** + * Returns operation mode. + * @link http://www.php.net/manual/en/regexiterator.getmode.php + * @return int the operation mode. + */ + public function getMode () {} + + /** + * Sets the operation mode. + * @link http://www.php.net/manual/en/regexiterator.setmode.php + * @param mode int

+ * The operation mode. + *

+ *

+ * The available modes are listed below. The actual + * meanings of these modes are described in the + * predefined constants. + * + * RegexIterator modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
valueconstant
0 + * RegexIterator::MATCH + *
1 + * RegexIterator::GET_MATCH + *
2 + * RegexIterator::ALL_MATCHES + *
3 + * RegexIterator::SPLIT + *
4 + * RegexIterator::REPLACE + *
+ *

+ * @return void + */ + public function setMode ($mode) {} + + /** + * Get flags + * @link http://www.php.net/manual/en/regexiterator.getflags.php + * @return int the set flags. + */ + public function getFlags () {} + + /** + * Sets the flags. + * @link http://www.php.net/manual/en/regexiterator.setflags.php + * @param flags int

+ * The flags to set, a bitmask of class constants. + *

+ *

+ * The available flags are listed below. The actual + * meanings of these flags are described in the + * predefined constants. + * + * RegexIterator flags + * + * + * + * + * + * + * + * + *
valueconstant
1 + * RegexIterator::USE_KEY + *
+ *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Returns the regular expression flags. + * @link http://www.php.net/manual/en/regexiterator.getpregflags.php + * @return int a bitmask of the regular expression flags. + */ + public function getPregFlags () {} + + /** + * Sets the regular expression flags. + * @link http://www.php.net/manual/en/regexiterator.setpregflags.php + * @param preg_flags int

+ * The regular expression flags. See RegexIterator::__construct + * for an overview of available flags. + *

+ * @return void + */ + public function setPregFlags ($preg_flags) {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/filteriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/filteriterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current element value + * @link http://www.php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/filteriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class RecursiveRegexIterator extends RegexIterator implements OuterIterator, Traversable, Iterator, RecursiveIterator { + const USE_KEY = 1; + const MATCH = 0; + const GET_MATCH = 1; + const ALL_MATCHES = 2; + const SPLIT = 3; + const REPLACE = 4; + + public $replacement; + + + /** + * Creates a new RecursiveRegexIterator. + * @link http://www.php.net/manual/en/recursiveregexiterator.construct.php + * @param iterator RecursiveIterator + * @param regex + * @param mode[optional] + * @param flags[optional] + * @param preg_flags[optional] + */ + public function __construct (RecursiveIterator $iterator, $regex, $mode, $flags, $preg_flags) {} + + /** + * Returns whether an iterator can be obtained for the current entry. + * @link http://www.php.net/manual/en/recursiveregexiterator.haschildren.php + * @return bool true if an iterator can be obtained for the current entry, otherwise returns false. + */ + public function hasChildren () {} + + /** + * Returns an iterator for the current entry. + * @link http://www.php.net/manual/en/recursiveregexiterator.getchildren.php + * @return RecursiveRegexIterator An iterator for the current entry, if it can be iterated over by the inner iterator. + */ + public function getChildren () {} + + /** + * Get accept status + * @link http://www.php.net/manual/en/regexiterator.accept.php + * @return bool true if a match, false otherwise. + */ + public function accept () {} + + /** + * Returns operation mode. + * @link http://www.php.net/manual/en/regexiterator.getmode.php + * @return int the operation mode. + */ + public function getMode () {} + + /** + * Sets the operation mode. + * @link http://www.php.net/manual/en/regexiterator.setmode.php + * @param mode int

+ * The operation mode. + *

+ *

+ * The available modes are listed below. The actual + * meanings of these modes are described in the + * predefined constants. + * + * RegexIterator modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
valueconstant
0 + * RegexIterator::MATCH + *
1 + * RegexIterator::GET_MATCH + *
2 + * RegexIterator::ALL_MATCHES + *
3 + * RegexIterator::SPLIT + *
4 + * RegexIterator::REPLACE + *
+ *

+ * @return void + */ + public function setMode ($mode) {} + + /** + * Get flags + * @link http://www.php.net/manual/en/regexiterator.getflags.php + * @return int the set flags. + */ + public function getFlags () {} + + /** + * Sets the flags. + * @link http://www.php.net/manual/en/regexiterator.setflags.php + * @param flags int

+ * The flags to set, a bitmask of class constants. + *

+ *

+ * The available flags are listed below. The actual + * meanings of these flags are described in the + * predefined constants. + * + * RegexIterator flags + * + * + * + * + * + * + * + * + *
valueconstant
1 + * RegexIterator::USE_KEY + *
+ *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Returns the regular expression flags. + * @link http://www.php.net/manual/en/regexiterator.getpregflags.php + * @return int a bitmask of the regular expression flags. + */ + public function getPregFlags () {} + + /** + * Sets the regular expression flags. + * @link http://www.php.net/manual/en/regexiterator.setpregflags.php + * @param preg_flags int

+ * The regular expression flags. See RegexIterator::__construct + * for an overview of available flags. + *

+ * @return void + */ + public function setPregFlags ($preg_flags) {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/filteriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/filteriterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current element value + * @link http://www.php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/filteriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class EmptyIterator implements Iterator, Traversable { + + /** + * The rewind() method + * @link http://www.php.net/manual/en/emptyiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * The valid() method + * @link http://www.php.net/manual/en/emptyiterator.valid.php + * @return void false + */ + public function valid () {} + + /** + * The key() method + * @link http://www.php.net/manual/en/emptyiterator.key.php + * @return void + */ + public function key () {} + + /** + * The current() method + * @link http://www.php.net/manual/en/emptyiterator.current.php + * @return void + */ + public function current () {} + + /** + * The next() method + * @link http://www.php.net/manual/en/emptyiterator.next.php + * @return void + */ + public function next () {} + +} + +/** @jms-builtin */ +class ArrayObject implements IteratorAggregate, Traversable, ArrayAccess, Countable { + const STD_PROP_LIST = 1; + const ARRAY_AS_PROPS = 2; + + + /** + * Construct a new array object + * @link http://www.php.net/manual/en/arrayobject.construct.php + * @param array + */ + public function __construct ($array) {} + + /** + * Returns whether the requested index exists + * @link http://www.php.net/manual/en/arrayobject.offsetexists.php + * @param index mixed

+ * The index being checked. + *

+ * @return bool true if the requested index exists, otherwise false + */ + public function offsetExists ($index) {} + + /** + * Returns the value at the specified index + * @link http://www.php.net/manual/en/arrayobject.offsetget.php + * @param index mixed

+ * The index with the value. + *

+ * @return mixed The value at the specified index or false. + */ + public function offsetGet ($index) {} + + /** + * Sets the value at the specified index to newval + * @link http://www.php.net/manual/en/arrayobject.offsetset.php + * @param index mixed

+ * The index being set. + *

+ * @param newval mixed

+ * The new value for the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * Unsets the value at the specified index + * @link http://www.php.net/manual/en/arrayobject.offsetunset.php + * @param index mixed

+ * The index being unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * Appends the value + * @link http://www.php.net/manual/en/arrayobject.append.php + * @param value mixed

+ * The value being appended. + *

+ * @return void + */ + public function append ($value) {} + + /** + * Creates a copy of the ArrayObject. + * @link http://www.php.net/manual/en/arrayobject.getarraycopy.php + * @return array a copy of the array. When the ArrayObject refers to an object + * an array of the public properties of that object will be returned. + */ + public function getArrayCopy () {} + + /** + * Get the number of public properties in the ArrayObject + * @link http://www.php.net/manual/en/arrayobject.count.php + * @return int The number of public properties in the ArrayObject. + *

+ *

+ * When the ArrayObject is constructed from an array all properties are public. + */ + public function count () {} + + /** + * Gets the behavior flags. + * @link http://www.php.net/manual/en/arrayobject.getflags.php + * @return int the behavior flags of the ArrayObject. + */ + public function getFlags () {} + + /** + * Sets the behavior flags. + * @link http://www.php.net/manual/en/arrayobject.setflags.php + * @param flags int

+ * The new ArrayObject behavior. + * It takes on either a bitmask, or named constants. Using named + * constants is strongly encouraged to ensure compatibility for future + * versions. + *

+ *

+ * The available behavior flags are listed below. The actual + * meanings of these flags are described in the + * predefined constants. + * + * ArrayObject behavior flags + * + * + * + * + * + * + * + * + * + * + * + * + *
valueconstant
1 + * ArrayObject::STD_PROP_LIST + *
2 + * ArrayObject::ARRAY_AS_PROPS + *
+ *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Sort the entries by value + * @link http://www.php.net/manual/en/arrayobject.asort.php + * @return void + */ + public function asort () {} + + /** + * Sort the entries by key + * @link http://www.php.net/manual/en/arrayobject.ksort.php + * @return void + */ + public function ksort () {} + + /** + * Sort the entries with a user-defined comparison function and maintain key association + * @link http://www.php.net/manual/en/arrayobject.uasort.php + * @param cmp_function callback

+ * Function cmp_function should accept two + * parameters which will be filled by pairs of entries. + * The comparison function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @return void + */ + public function uasort ($cmp_function) {} + + /** + * Sort the entries by keys using a user-defined comparison function + * @link http://www.php.net/manual/en/arrayobject.uksort.php + * @param cmp_function callback

+ * The callback comparison function. + *

+ *

+ * Function cmp_function should accept two + * parameters which will be filled by pairs of entry keys. + * The comparison function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @return void + */ + public function uksort ($cmp_function) {} + + /** + * Sort entries using a "natural order" algorithm + * @link http://www.php.net/manual/en/arrayobject.natsort.php + * @return void + */ + public function natsort () {} + + /** + * Sort an array using a case insensitive "natural order" algorithm + * @link http://www.php.net/manual/en/arrayobject.natcasesort.php + * @return void + */ + public function natcasesort () {} + + /** + * Create a new iterator from an ArrayObject instance + * @link http://www.php.net/manual/en/arrayobject.getiterator.php + * @return ArrayIterator An iterator from an ArrayObject. + */ + public function getIterator () {} + + /** + * Exchange the array for another one. + * @link http://www.php.net/manual/en/arrayobject.exchangearray.php + * @param input mixed

+ * The new array or object to exchange with the current array. + *

+ * @return array the old array. + */ + public function exchangeArray ($input) {} + + /** + * Sets the iterator classname for the ArrayObject. + * @link http://www.php.net/manual/en/arrayobject.setiteratorclass.php + * @param iterator_class string

+ * The classname of the array iterator to use when iterating over this object. + *

+ * @return void + */ + public function setIteratorClass ($iterator_class) {} + + /** + * Gets the iterator classname for the ArrayObject. + * @link http://www.php.net/manual/en/arrayobject.getiteratorclass.php + * @return string the iterator class name that is used to iterate over this object. + */ + public function getIteratorClass () {} + +} + +/** @jms-builtin */ +class ArrayIterator implements Iterator, Traversable, ArrayAccess, SeekableIterator, Countable { + const STD_PROP_LIST = 1; + const ARRAY_AS_PROPS = 2; + + + /** + * Construct an ArrayIterator + * @link http://www.php.net/manual/en/arrayiterator.construct.php + * @param array + */ + public function __construct ($array) {} + + /** + * Check if offset exists + * @link http://www.php.net/manual/en/arrayiterator.offsetexists.php + * @param index string

+ * The offset being checked. + *

+ * @return void true if the offset exists, otherwise false + */ + public function offsetExists ($index) {} + + /** + * Get value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetget.php + * @param index string

+ * The offset to get the value from. + *

+ * @return mixed The value at offset index. + */ + public function offsetGet ($index) {} + + /** + * Set value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetset.php + * @param index string

+ * The index to set for. + *

+ * @param newval string

+ * The new value to store at the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * Unset value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetunset.php + * @param index string

+ * The offset to unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * Append an element + * @link http://www.php.net/manual/en/arrayiterator.append.php + * @param value string

+ * The value to append. + *

+ * @return void + */ + public function append ($value) {} + + /** + * Get array copy + * @link http://www.php.net/manual/en/arrayiterator.getarraycopy.php + * @return array A copy of the array, or array of public properties + * if ArrayIterator refers to an object. + */ + public function getArrayCopy () {} + + /** + * Count elements + * @link http://www.php.net/manual/en/arrayiterator.count.php + * @return void The number. + */ + public function count () {} + + /** + * Get flags + * @link http://www.php.net/manual/en/arrayiterator.getflags.php + * @return void The current flags. + */ + public function getFlags () {} + + /** + * Set behaviour flags + * @link http://www.php.net/manual/en/arrayiterator.setflags.php + * @param flags string

+ * A bitmask as follows: + * 0 = Properties of the object have their normal functionality + * when accessed as list (var_dump, foreach, etc.). + * 1 = Array indices can be accessed as properties in read/write. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Sort array by values + * @link http://www.php.net/manual/en/arrayiterator.asort.php + * @return void + */ + public function asort () {} + + /** + * Sort array by keys + * @link http://www.php.net/manual/en/arrayiterator.ksort.php + * @return void + */ + public function ksort () {} + + /** + * User defined sort + * @link http://www.php.net/manual/en/arrayiterator.uasort.php + * @param cmp_function string

+ * The compare function used for the sort. + *

+ * @return void + */ + public function uasort ($cmp_function) {} + + /** + * User defined sort + * @link http://www.php.net/manual/en/arrayiterator.uksort.php + * @param cmp_function string

+ * The compare function used for the sort. + *

+ * @return void + */ + public function uksort ($cmp_function) {} + + /** + * Sort an array naturally + * @link http://www.php.net/manual/en/arrayiterator.natsort.php + * @return void + */ + public function natsort () {} + + /** + * Sort an array naturally, case insensitive + * @link http://www.php.net/manual/en/arrayiterator.natcasesort.php + * @return void + */ + public function natcasesort () {} + + /** + * Rewind array back to the start + * @link http://www.php.net/manual/en/arrayiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current array entry + * @link http://www.php.net/manual/en/arrayiterator.current.php + * @return mixed The current array entry. + */ + public function current () {} + + /** + * Return current array key + * @link http://www.php.net/manual/en/arrayiterator.key.php + * @return mixed The current array key. + */ + public function key () {} + + /** + * Move to next entry + * @link http://www.php.net/manual/en/arrayiterator.next.php + * @return void + */ + public function next () {} + + /** + * Check whether array contains more entries + * @link http://www.php.net/manual/en/arrayiterator.valid.php + * @return bool + */ + public function valid () {} + + /** + * Seek to position + * @link http://www.php.net/manual/en/arrayiterator.seek.php + * @param position int

+ * The position to seek to. + *

+ * @return void + */ + public function seek ($position) {} + +} + +/** @jms-builtin */ +class RecursiveArrayIterator extends ArrayIterator implements SeekableIterator, ArrayAccess, Traversable, Iterator, RecursiveIterator { + + /** + * Returns whether current entry is an array or an object. + * @link http://www.php.net/manual/en/recursivearrayiterator.haschildren.php + * @return bool true if the current entry is an array or an object, + * otherwise false is returned. + */ + public function hasChildren () {} + + /** + * Returns an iterator for the current entry if it is an array or an object. + * @link http://www.php.net/manual/en/recursivearrayiterator.getchildren.php + * @return RecursiveArrayIterator An iterator for the current entry, if it is an array or object. + */ + public function getChildren () {} + + /** + * Construct an ArrayIterator + * @link http://www.php.net/manual/en/arrayiterator.construct.php + * @param array + */ + public function __construct ($array) {} + + /** + * Check if offset exists + * @link http://www.php.net/manual/en/arrayiterator.offsetexists.php + * @param index string

+ * The offset being checked. + *

+ * @return void true if the offset exists, otherwise false + */ + public function offsetExists ($index) {} + + /** + * Get value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetget.php + * @param index string

+ * The offset to get the value from. + *

+ * @return mixed The value at offset index. + */ + public function offsetGet ($index) {} + + /** + * Set value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetset.php + * @param index string

+ * The index to set for. + *

+ * @param newval string

+ * The new value to store at the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * Unset value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetunset.php + * @param index string

+ * The offset to unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * Append an element + * @link http://www.php.net/manual/en/arrayiterator.append.php + * @param value string

+ * The value to append. + *

+ * @return void + */ + public function append ($value) {} + + /** + * Get array copy + * @link http://www.php.net/manual/en/arrayiterator.getarraycopy.php + * @return array A copy of the array, or array of public properties + * if ArrayIterator refers to an object. + */ + public function getArrayCopy () {} + + /** + * Count elements + * @link http://www.php.net/manual/en/arrayiterator.count.php + * @return void The number. + */ + public function count () {} + + /** + * Get flags + * @link http://www.php.net/manual/en/arrayiterator.getflags.php + * @return void The current flags. + */ + public function getFlags () {} + + /** + * Set behaviour flags + * @link http://www.php.net/manual/en/arrayiterator.setflags.php + * @param flags string

+ * A bitmask as follows: + * 0 = Properties of the object have their normal functionality + * when accessed as list (var_dump, foreach, etc.). + * 1 = Array indices can be accessed as properties in read/write. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Sort array by values + * @link http://www.php.net/manual/en/arrayiterator.asort.php + * @return void + */ + public function asort () {} + + /** + * Sort array by keys + * @link http://www.php.net/manual/en/arrayiterator.ksort.php + * @return void + */ + public function ksort () {} + + /** + * User defined sort + * @link http://www.php.net/manual/en/arrayiterator.uasort.php + * @param cmp_function string

+ * The compare function used for the sort. + *

+ * @return void + */ + public function uasort ($cmp_function) {} + + /** + * User defined sort + * @link http://www.php.net/manual/en/arrayiterator.uksort.php + * @param cmp_function string

+ * The compare function used for the sort. + *

+ * @return void + */ + public function uksort ($cmp_function) {} + + /** + * Sort an array naturally + * @link http://www.php.net/manual/en/arrayiterator.natsort.php + * @return void + */ + public function natsort () {} + + /** + * Sort an array naturally, case insensitive + * @link http://www.php.net/manual/en/arrayiterator.natcasesort.php + * @return void + */ + public function natcasesort () {} + + /** + * Rewind array back to the start + * @link http://www.php.net/manual/en/arrayiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current array entry + * @link http://www.php.net/manual/en/arrayiterator.current.php + * @return mixed The current array entry. + */ + public function current () {} + + /** + * Return current array key + * @link http://www.php.net/manual/en/arrayiterator.key.php + * @return mixed The current array key. + */ + public function key () {} + + /** + * Move to next entry + * @link http://www.php.net/manual/en/arrayiterator.next.php + * @return void + */ + public function next () {} + + /** + * Check whether array contains more entries + * @link http://www.php.net/manual/en/arrayiterator.valid.php + * @return bool + */ + public function valid () {} + + /** + * Seek to position + * @link http://www.php.net/manual/en/arrayiterator.seek.php + * @param position int

+ * The position to seek to. + *

+ * @return void + */ + public function seek ($position) {} + +} + +/** @jms-builtin */ +class SplFileInfo { + + /** + * Construct a new SplFileInfo object + * @link http://www.php.net/manual/en/splfileinfo.construct.php + * @param file_name + */ + public function __construct ($file_name) {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the filename + * @link http://www.php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * Gets the base name of the file + * @link http://www.php.net/manual/en/splfileinfo.getbasename.php + * @param suffix string[optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + + /** + * Returns the path to the file as a string + * @link http://www.php.net/manual/en/splfileinfo.tostring.php + * @return void the path to the file. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class DirectoryIterator extends SplFileInfo implements Iterator, Traversable { + + /** + * Constructs a new directory iterator from a path + * @link http://www.php.net/manual/en/directoryiterator.construct.php + * @param path + */ + public function __construct ($path) {} + + /** + * Return file name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * Get base name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getbasename.php + * @param suffix string[optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * Determine if current DirectoryIterator item is '.' or '..' + * @link http://www.php.net/manual/en/directoryiterator.isdot.php + * @return bool true if the entry is . or .., + * otherwise false + */ + public function isDot () {} + + /** + * Rewind the DirectoryIterator back to the start + * @link http://www.php.net/manual/en/directoryiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether current DirectoryIterator position is a valid file + * @link http://www.php.net/manual/en/directoryiterator.valid.php + * @return bool true if the position is valid, otherwise false + */ + public function valid () {} + + /** + * Return the key for the current DirectoryIterator item + * @link http://www.php.net/manual/en/directoryiterator.key.php + * @return string The key for the current DirectoryIterator item. + */ + public function key () {} + + /** + * Return the current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.current.php + * @return DirectoryIterator The current DirectoryIterator item. + */ + public function current () {} + + /** + * Move forward to next DirectoryIterator item + * @link http://www.php.net/manual/en/directoryiterator.next.php + * @return void + */ + public function next () {} + + /** + * Get file name as a string + * @link http://www.php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class RecursiveDirectoryIterator extends DirectoryIterator implements Traversable, Iterator, RecursiveIterator { + const CURRENT_MODE_MASK = 240; + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const KEY_MODE_MASK = 3840; + const KEY_AS_PATHNAME = 0; + const FOLLOW_SYMLINKS = 512; + const KEY_AS_FILENAME = 256; + const NEW_CURRENT_AND_KEY = 256; + + + /** + * Constructs a RecursiveDirectoryIterator + * @link http://www.php.net/manual/en/recursivedirectoryiterator.construct.php + * @param path + * @param flags[optional] + */ + public function __construct ($path, $flags) {} + + /** + * Rewind dir back to the start + * @link http://www.php.net/manual/en/recursivedirectoryiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Move to next entry + * @link http://www.php.net/manual/en/recursivedirectoryiterator.next.php + * @return void + */ + public function next () {} + + /** + * Return path and filename of current dir entry + * @link http://www.php.net/manual/en/recursivedirectoryiterator.key.php + * @return string The path and filename of the current dir entry. + */ + public function key () {} + + public function current () {} + + /** + * Returns whether current entry is a directory and not '.' or '..' + * @link http://www.php.net/manual/en/recursivedirectoryiterator.haschildren.php + * @param allow_links bool[optional]

+ *

+ * @return bool whether the current entry is a directory, but not '.' or '..' + */ + public function hasChildren ($allow_links = null) {} + + /** + * Returns an iterator for the current entry if it is a directory + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getchildren.php + * @return object An iterator for the current entry, if it is a directory. + */ + public function getChildren () {} + + /** + * Get sub path + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getsubpath.php + * @return string The sub path (sub directory). + */ + public function getSubPath () {} + + /** + * Get sub path and name + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getsubpathname.php + * @return string The sub path (sub directory) and filename. + */ + public function getSubPathname () {} + + /** + * Return file name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * Get base name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getbasename.php + * @param suffix string[optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * Determine if current DirectoryIterator item is '.' or '..' + * @link http://www.php.net/manual/en/directoryiterator.isdot.php + * @return bool true if the entry is . or .., + * otherwise false + */ + public function isDot () {} + + /** + * Check whether current DirectoryIterator position is a valid file + * @link http://www.php.net/manual/en/directoryiterator.valid.php + * @return bool true if the position is valid, otherwise false + */ + public function valid () {} + + /** + * Get file name as a string + * @link http://www.php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class SplFileObject extends SplFileInfo implements RecursiveIterator, Traversable, Iterator, SeekableIterator { + const DROP_NEW_LINE = 1; + const READ_AHEAD = 2; + const SKIP_EMPTY = 6; + const READ_CSV = 8; + + + /** + * Construct a new file object. + * @link http://www.php.net/manual/en/splfileobject.construct.php + * @param file_name + * @param open_mode[optional] + * @param use_include_path[optional] + * @param context[optional] + */ + public function __construct ($file_name, $open_mode, $use_include_path, $context) {} + + /** + * Rewind the file to the first line + * @link http://www.php.net/manual/en/splfileobject.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Reached end of file + * @link http://www.php.net/manual/en/splfileobject.eof.php + * @return boolean true if file is at EOF, false otherwise. + */ + public function eof () {} + + /** + * Not at EOF + * @link http://www.php.net/manual/en/splfileobject.valid.php + * @return bool true if not reached EOF, false otherwise. + */ + public function valid () {} + + /** + * Gets line from file + * @link http://www.php.net/manual/en/splfileobject.fgets.php + * @return string a string containing the next line from the file, or false on error. + */ + public function fgets () {} + + /** + * Gets line from file and parse as CSV fields + * @link http://www.php.net/manual/en/splfileobject.fgetcsv.php + * @param delimiter string[optional]

+ * The field delimiter (one character only). Defaults as a comma or the value set using SplFileObject::setCsvControl. + *

+ * @param enclosure string[optional]

+ * The field enclosure character (one character only). Defaults as a double quotation mark or the value set using SplFileObject::setCsvControl. + *

+ * @param escape string[optional]

+ * The escape character (one character only). Defaults as a backslash (\) or the value set using SplFileObject::setCsvControl. + *

+ * @return array an indexed array containing the fields read, or false on error. + *

+ *

+ * A blank line in a CSV file will be returned as an array + * comprising a single &null; field unless using SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, + * in which case empty lines are skipped. + */ + public function fgetcsv ($delimiter = null, $enclosure = null, $escape = null) {} + + /** + * Set the delimiter and enclosure character for CSV + * @link http://www.php.net/manual/en/splfileobject.setcsvcontrol.php + * @param delimiter string[optional]

+ * The field delimiter (one character only). + *

+ * @param enclosure string[optional]

+ * The field enclosure character (one character only). + *

+ * @param escape string[optional]

+ * The field escape character (one character only). + *

+ * @return void + */ + public function setCsvControl ($delimiter = null, $enclosure = null, $escape = null) {} + + /** + * Get the delimiter and enclosure character for CSV + * @link http://www.php.net/manual/en/splfileobject.getcsvcontrol.php + * @return array an indexed array containing the delimiter and enclosure character. + */ + public function getCsvControl () {} + + /** + * Portable file locking + * @link http://www.php.net/manual/en/splfileobject.flock.php + * @param operation int

+ * operation is one of the following: + * LOCK_SH to acquire a shared lock (reader). + * @param wouldblock int[optional]

+ * Set to true if the lock would block (EWOULDBLOCK errno condition). + *

+ * @return bool Returns true on success or false on failure. + */ + public function flock ($operation, &$wouldblock = null) {} + + /** + * Flushes the output to the file + * @link http://www.php.net/manual/en/splfileobject.fflush.php + * @return boolean Returns true on success or false on failure. + */ + public function fflush () {} + + /** + * Return current file position + * @link http://www.php.net/manual/en/splfileobject.ftell.php + * @return int the position of the file pointer as an integer, or false on error. + */ + public function ftell () {} + + /** + * Seek to a position + * @link http://www.php.net/manual/en/splfileobject.fseek.php + * @param offset int

+ * The offset. A negative value can be used to move backwards through the file which + * is useful when SEEK_END is used as the whence value. + *

+ * @param whence int[optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + * SEEK_END - Set position to end-of-file plus offset. + *

+ *

+ * If whence is not specified, it is assumed to be SEEK_SET. + *

+ * @return int 0 if the seek was successful, -1 otherwise. Note that seeking + * past EOF is not considered an error. + */ + public function fseek ($offset, $whence = null) {} + + /** + * Gets character from file + * @link http://www.php.net/manual/en/splfileobject.fgetc.php + * @return string a string containing a single character read from the file or false on EOF. + */ + public function fgetc () {} + + /** + * Output all remaining data on a file pointer + * @link http://www.php.net/manual/en/splfileobject.fpassthru.php + * @return int the number of characters read from handle + * and passed through to the output. + */ + public function fpassthru () {} + + /** + * Gets line from file and strip HTML tags + * @link http://www.php.net/manual/en/splfileobject.fgetss.php + * @param allowable_tags string[optional]

+ * You can use the optional third parameter to specify tags which should + * not be stripped. + *

+ * @return string a string containing the next line of the file with HTML and PHP + * code stripped, or false on error. + */ + public function fgetss ($allowable_tags = null) {} + + /** + * Parses input from file according to a format + * @link http://www.php.net/manual/en/splfileobject.fscanf.php + * @param format string

+ * The specified format as described in the sprintf documentation. + *

+ * @param _ mixed[optional] + * @return mixed If only two parameters were passed to this method, the values parsed will be + * returned as an array. Otherwise, if optional parameters are passed, the + * function will return the number of assigned values. The optional + * parameters must be passed by reference. + */ + public function fscanf ($format, &$_ = null) {} + + /** + * Write to file + * @link http://www.php.net/manual/en/splfileobject.fwrite.php + * @param str string

+ * The string to be written to the file. + *

+ * @param length int[optional]

+ * If the length argument is given, writing will + * stop after length bytes have been written or + * the end of string is reached, whichever comes + * first. + *

+ * @return int the number of bytes written, or &null; on error. + */ + public function fwrite ($str, $length = null) {} + + /** + * Gets information about the file + * @link http://www.php.net/manual/en/splfileobject.fstat.php + * @return array an array with the statistics of the file; the format of the array + * is described in detail on the stat manual page. + */ + public function fstat () {} + + /** + * Truncates the file to a given length + * @link http://www.php.net/manual/en/splfileobject.ftruncate.php + * @param size int

+ * The size to truncate to. + *

+ *

+ * If size is larger than the file it is extended with null bytes. + *

+ *

+ * If size is smaller than the file, the extra data will be lost. + *

+ * @return bool Returns true on success or false on failure. + */ + public function ftruncate ($size) {} + + /** + * Retrieve current line of file + * @link http://www.php.net/manual/en/splfileobject.current.php + * @return string|array Retrieves the current line of the file. If the SplFileObject::READ_CSV flag is set, this method returns an array containing the current line parsed as CSV data. + */ + public function current () {} + + /** + * Get line number + * @link http://www.php.net/manual/en/splfileobject.key.php + * @return int the current line number. + */ + public function key () {} + + /** + * Read next line + * @link http://www.php.net/manual/en/splfileobject.next.php + * @return void + */ + public function next () {} + + /** + * Sets flags for the SplFileObject + * @link http://www.php.net/manual/en/splfileobject.setflags.php + * @param flags int

+ * Bit mask of the flags to set. See + * SplFileObject constants + * for the available flags. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Gets flags for the SplFileObject + * @link http://www.php.net/manual/en/splfileobject.getflags.php + * @return int an integer representing the flags. + */ + public function getFlags () {} + + /** + * Set maximum line length + * @link http://www.php.net/manual/en/splfileobject.setmaxlinelen.php + * @param max_len int

+ * The maximum length of a line. + *

+ * @return void + */ + public function setMaxLineLen ($max_len) {} + + /** + * Get maximum line length + * @link http://www.php.net/manual/en/splfileobject.getmaxlinelen.php + * @return int the maximum line length if one has been set with + * SplFileObject::setMaxLineLen, default is 0. + */ + public function getMaxLineLen () {} + + /** + * SplFileObject does not have children + * @link http://www.php.net/manual/en/splfileobject.haschildren.php + * @return bool false + */ + public function hasChildren () {} + + /** + * No purpose + * @link http://www.php.net/manual/en/splfileobject.getchildren.php + * @return void + */ + public function getChildren () {} + + /** + * Seek to specified line + * @link http://www.php.net/manual/en/splfileobject.seek.php + * @param line_pos int

+ * The zero-based line number to seek to. + *

+ * @return void + */ + public function seek ($line_pos) {} + + /** + * Alias of SplFileObject::fgets + * @link http://www.php.net/manual/en/splfileobject.getcurrentline.php + */ + public function getCurrentLine () {} + + /** + * Alias of SplFileObject::current + * @link http://www.php.net/manual/en/splfileobject.tostring.php + */ + public function __toString () {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the filename + * @link http://www.php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * Gets the base name of the file + * @link http://www.php.net/manual/en/splfileinfo.getbasename.php + * @param suffix string[optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class SplTempFileObject extends SplFileObject implements SeekableIterator, Iterator, Traversable, RecursiveIterator { + const DROP_NEW_LINE = 1; + const READ_AHEAD = 2; + const SKIP_EMPTY = 6; + const READ_CSV = 8; + + + /** + * Construct a new temporary file object + * @link http://www.php.net/manual/en/spltempfileobject.construct.php + * @param max_memory[optional] + */ + public function __construct ($max_memory) {} + + /** + * Rewind the file to the first line + * @link http://www.php.net/manual/en/splfileobject.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Reached end of file + * @link http://www.php.net/manual/en/splfileobject.eof.php + * @return boolean true if file is at EOF, false otherwise. + */ + public function eof () {} + + /** + * Not at EOF + * @link http://www.php.net/manual/en/splfileobject.valid.php + * @return bool true if not reached EOF, false otherwise. + */ + public function valid () {} + + /** + * Gets line from file + * @link http://www.php.net/manual/en/splfileobject.fgets.php + * @return string a string containing the next line from the file, or false on error. + */ + public function fgets () {} + + /** + * Gets line from file and parse as CSV fields + * @link http://www.php.net/manual/en/splfileobject.fgetcsv.php + * @param delimiter string[optional]

+ * The field delimiter (one character only). Defaults as a comma or the value set using SplFileObject::setCsvControl. + *

+ * @param enclosure string[optional]

+ * The field enclosure character (one character only). Defaults as a double quotation mark or the value set using SplFileObject::setCsvControl. + *

+ * @param escape string[optional]

+ * The escape character (one character only). Defaults as a backslash (\) or the value set using SplFileObject::setCsvControl. + *

+ * @return array an indexed array containing the fields read, or false on error. + *

+ *

+ * A blank line in a CSV file will be returned as an array + * comprising a single &null; field unless using SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, + * in which case empty lines are skipped. + */ + public function fgetcsv ($delimiter = null, $enclosure = null, $escape = null) {} + + /** + * Set the delimiter and enclosure character for CSV + * @link http://www.php.net/manual/en/splfileobject.setcsvcontrol.php + * @param delimiter string[optional]

+ * The field delimiter (one character only). + *

+ * @param enclosure string[optional]

+ * The field enclosure character (one character only). + *

+ * @param escape string[optional]

+ * The field escape character (one character only). + *

+ * @return void + */ + public function setCsvControl ($delimiter = null, $enclosure = null, $escape = null) {} + + /** + * Get the delimiter and enclosure character for CSV + * @link http://www.php.net/manual/en/splfileobject.getcsvcontrol.php + * @return array an indexed array containing the delimiter and enclosure character. + */ + public function getCsvControl () {} + + /** + * Portable file locking + * @link http://www.php.net/manual/en/splfileobject.flock.php + * @param operation int

+ * operation is one of the following: + * LOCK_SH to acquire a shared lock (reader). + * @param wouldblock int[optional]

+ * Set to true if the lock would block (EWOULDBLOCK errno condition). + *

+ * @return bool Returns true on success or false on failure. + */ + public function flock ($operation, &$wouldblock = null) {} + + /** + * Flushes the output to the file + * @link http://www.php.net/manual/en/splfileobject.fflush.php + * @return boolean Returns true on success or false on failure. + */ + public function fflush () {} + + /** + * Return current file position + * @link http://www.php.net/manual/en/splfileobject.ftell.php + * @return int the position of the file pointer as an integer, or false on error. + */ + public function ftell () {} + + /** + * Seek to a position + * @link http://www.php.net/manual/en/splfileobject.fseek.php + * @param offset int

+ * The offset. A negative value can be used to move backwards through the file which + * is useful when SEEK_END is used as the whence value. + *

+ * @param whence int[optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + * SEEK_END - Set position to end-of-file plus offset. + *

+ *

+ * If whence is not specified, it is assumed to be SEEK_SET. + *

+ * @return int 0 if the seek was successful, -1 otherwise. Note that seeking + * past EOF is not considered an error. + */ + public function fseek ($offset, $whence = null) {} + + /** + * Gets character from file + * @link http://www.php.net/manual/en/splfileobject.fgetc.php + * @return string a string containing a single character read from the file or false on EOF. + */ + public function fgetc () {} + + /** + * Output all remaining data on a file pointer + * @link http://www.php.net/manual/en/splfileobject.fpassthru.php + * @return int the number of characters read from handle + * and passed through to the output. + */ + public function fpassthru () {} + + /** + * Gets line from file and strip HTML tags + * @link http://www.php.net/manual/en/splfileobject.fgetss.php + * @param allowable_tags string[optional]

+ * You can use the optional third parameter to specify tags which should + * not be stripped. + *

+ * @return string a string containing the next line of the file with HTML and PHP + * code stripped, or false on error. + */ + public function fgetss ($allowable_tags = null) {} + + /** + * Parses input from file according to a format + * @link http://www.php.net/manual/en/splfileobject.fscanf.php + * @param format string

+ * The specified format as described in the sprintf documentation. + *

+ * @param _ mixed[optional] + * @return mixed If only two parameters were passed to this method, the values parsed will be + * returned as an array. Otherwise, if optional parameters are passed, the + * function will return the number of assigned values. The optional + * parameters must be passed by reference. + */ + public function fscanf ($format, &$_ = null) {} + + /** + * Write to file + * @link http://www.php.net/manual/en/splfileobject.fwrite.php + * @param str string

+ * The string to be written to the file. + *

+ * @param length int[optional]

+ * If the length argument is given, writing will + * stop after length bytes have been written or + * the end of string is reached, whichever comes + * first. + *

+ * @return int the number of bytes written, or &null; on error. + */ + public function fwrite ($str, $length = null) {} + + /** + * Gets information about the file + * @link http://www.php.net/manual/en/splfileobject.fstat.php + * @return array an array with the statistics of the file; the format of the array + * is described in detail on the stat manual page. + */ + public function fstat () {} + + /** + * Truncates the file to a given length + * @link http://www.php.net/manual/en/splfileobject.ftruncate.php + * @param size int

+ * The size to truncate to. + *

+ *

+ * If size is larger than the file it is extended with null bytes. + *

+ *

+ * If size is smaller than the file, the extra data will be lost. + *

+ * @return bool Returns true on success or false on failure. + */ + public function ftruncate ($size) {} + + /** + * Retrieve current line of file + * @link http://www.php.net/manual/en/splfileobject.current.php + * @return string|array Retrieves the current line of the file. If the SplFileObject::READ_CSV flag is set, this method returns an array containing the current line parsed as CSV data. + */ + public function current () {} + + /** + * Get line number + * @link http://www.php.net/manual/en/splfileobject.key.php + * @return int the current line number. + */ + public function key () {} + + /** + * Read next line + * @link http://www.php.net/manual/en/splfileobject.next.php + * @return void + */ + public function next () {} + + /** + * Sets flags for the SplFileObject + * @link http://www.php.net/manual/en/splfileobject.setflags.php + * @param flags int

+ * Bit mask of the flags to set. See + * SplFileObject constants + * for the available flags. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Gets flags for the SplFileObject + * @link http://www.php.net/manual/en/splfileobject.getflags.php + * @return int an integer representing the flags. + */ + public function getFlags () {} + + /** + * Set maximum line length + * @link http://www.php.net/manual/en/splfileobject.setmaxlinelen.php + * @param max_len int

+ * The maximum length of a line. + *

+ * @return void + */ + public function setMaxLineLen ($max_len) {} + + /** + * Get maximum line length + * @link http://www.php.net/manual/en/splfileobject.getmaxlinelen.php + * @return int the maximum line length if one has been set with + * SplFileObject::setMaxLineLen, default is 0. + */ + public function getMaxLineLen () {} + + /** + * SplFileObject does not have children + * @link http://www.php.net/manual/en/splfileobject.haschildren.php + * @return bool false + */ + public function hasChildren () {} + + /** + * No purpose + * @link http://www.php.net/manual/en/splfileobject.getchildren.php + * @return void + */ + public function getChildren () {} + + /** + * Seek to specified line + * @link http://www.php.net/manual/en/splfileobject.seek.php + * @param line_pos int

+ * The zero-based line number to seek to. + *

+ * @return void + */ + public function seek ($line_pos) {} + + /** + * Alias of SplFileObject::fgets + * @link http://www.php.net/manual/en/splfileobject.getcurrentline.php + */ + public function getCurrentLine () {} + + /** + * Alias of SplFileObject::current + * @link http://www.php.net/manual/en/splfileobject.tostring.php + */ + public function __toString () {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the filename + * @link http://www.php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * Gets the base name of the file + * @link http://www.php.net/manual/en/splfileinfo.getbasename.php + * @param suffix string[optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class SimpleXMLIterator extends SimpleXMLElement implements Traversable, RecursiveIterator, Iterator, Countable { + + /** + * Rewind to the first element + * @link http://www.php.net/manual/en/simplexmliterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/simplexmliterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Returns the current element + * @link http://www.php.net/manual/en/simplexmliterator.current.php + * @return mixed the current element as a SimpleXMLIterator object or &null; on failure. + */ + public function current () {} + + /** + * Return current key + * @link http://www.php.net/manual/en/simplexmliterator.key.php + * @return mixed the XML tag name of the element referenced by the current SimpleXMLIterator object or false + */ + public function key () {} + + /** + * Move to next element + * @link http://www.php.net/manual/en/simplexmliterator.next.php + * @return void + */ + public function next () {} + + /** + * Checks whether the current element has sub elements. + * @link http://www.php.net/manual/en/simplexmliterator.haschildren.php + * @return bool true if the current element has sub-elements, otherwise false + */ + public function hasChildren () {} + + /** + * Returns the sub-elements of the current element + * @link http://www.php.net/manual/en/simplexmliterator.getchildren.php + * @return object a SimpleXMLIterator object containing + * the sub-elements of the current element. + */ + public function getChildren () {} + + public function count () {} + + /** + * Creates a new SimpleXMLElement object + * @link http://www.php.net/manual/en/simplexmlelement.construct.php + * @param data string

+ * A well-formed XML string or the path or URL to an XML document if + * data_is_url is true. + *

+ * @param options int[optional]

+ * Optionally used to specify additional + * Libxml parameters. + *

+ * @param data_is_url bool[optional]

+ * By default, data_is_url is false. Use true to + * specify that data is a path or URL to an XML + * document instead of string data. + *

+ * @param ns string[optional]

+ *

+ * @param is_prefix bool[optional]

+ *

+ */ + final public function __construct ($data, $options = null, $data_is_url = null, $ns = null, $is_prefix = null) {} + + /** + * Return a well-formed XML string based on SimpleXML element + * @link http://www.php.net/manual/en/simplexmlelement.asXML.php + * @param filename string[optional]

+ * If specified, the function writes the data to the file rather than + * returning it. + *

+ * @return mixed If the filename isn't specified, this function + * returns a string on success and false on error. If the + * parameter is specified, it returns true if the file was written + * successfully and false otherwise. + */ + public function asXML ($filename = null) {} + + public function saveXML () {} + + /** + * Runs XPath query on XML data + * @link http://www.php.net/manual/en/simplexmlelement.xpath.php + * @param path string

+ * An XPath path + *

+ * @return array an array of SimpleXMLElement objects or false in + * case of an error. + */ + public function xpath ($path) {} + + /** + * Creates a prefix/ns context for the next XPath query + * @link http://www.php.net/manual/en/simplexmlelement.registerXPathNamespace.php + * @param prefix string

+ * The namespace prefix to use in the XPath query for the namespace given in + * ns. + *

+ * @param ns string

+ * The namespace to use for the XPath query. This must match a namespace in + * use by the XML document or the XPath query using + * prefix will not return any results. + *

+ * @return bool Returns true on success or false on failure. + */ + public function registerXPathNamespace ($prefix, $ns) {} + + /** + * Identifies an element's attributes + * @link http://www.php.net/manual/en/simplexmlelement.attributes.php + * @param ns string[optional]

+ * An optional namespace for the retrieved attributes + *

+ * @param is_prefix bool[optional]

+ * Default to false + *

+ * @return SimpleXMLElement + */ + public function attributes ($ns = null, $is_prefix = null) {} + + /** + * Finds children of given node + * @link http://www.php.net/manual/en/simplexmlelement.children.php + * @param ns string[optional]

+ * An XML namespace. + *

+ * @param is_prefix bool[optional]

+ * If is_prefix is true, + * ns will be regarded as a prefix. If false, + * ns will be regarded as a namespace + * URL. + *

+ * @return SimpleXMLElement a SimpleXMLElement element, whether the node + * has children or not. + */ + public function children ($ns = null, $is_prefix = null) {} + + /** + * Returns namespaces used in document + * @link http://www.php.net/manual/en/simplexmlelement.getNamespaces.php + * @param recursive bool[optional]

+ * If specified, returns all namespaces used in parent and child nodes. + * Otherwise, returns only namespaces used in root node. + *

+ * @return array The getNamespaces method returns an array of + * namespace names with their associated URIs. + */ + public function getNamespaces ($recursive = null) {} + + /** + * Returns namespaces declared in document + * @link http://www.php.net/manual/en/simplexmlelement.getDocNamespaces.php + * @param recursive bool[optional]

+ * If specified, returns all namespaces declared in parent and child nodes. + * Otherwise, returns only namespaces declared in root node. + *

+ * @return array The getDocNamespaces method returns an array + * of namespace names with their associated URIs. + */ + public function getDocNamespaces ($recursive = null) {} + + /** + * Gets the name of the XML element + * @link http://www.php.net/manual/en/simplexmlelement.getName.php + * @return string The getName method returns as a string the + * name of the XML tag referenced by the SimpleXMLElement object. + */ + public function getName () {} + + /** + * Adds a child element to the XML node + * @link http://www.php.net/manual/en/simplexmlelement.addChild.php + * @param name string

+ * The name of the child element to add. + *

+ * @param value string[optional]

+ * If specified, the value of the child element. + *

+ * @param namespace string[optional]

+ * If specified, the namespace to which the child element belongs. + *

+ * @return SimpleXMLElement The addChild method returns a SimpleXMLElement + * object representing the child added to the XML node. + */ + public function addChild ($name, $value = null, $namespace = null) {} + + /** + * Adds an attribute to the SimpleXML element + * @link http://www.php.net/manual/en/simplexmlelement.addAttribute.php + * @param name string

+ * The name of the attribute to add. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @param namespace string[optional]

+ * If specified, the namespace to which the attribute belongs. + *

+ * @return void + */ + public function addAttribute ($name, $value, $namespace = null) {} + +} + +/** @jms-builtin */ +class LogicException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class BadFunctionCallException extends LogicException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class BadMethodCallException extends BadFunctionCallException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class DomainException extends LogicException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class InvalidArgumentException extends LogicException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class LengthException extends LogicException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class OutOfRangeException extends LogicException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class RuntimeException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class OutOfBoundsException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class OverflowException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class RangeException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class UnderflowException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class UnexpectedValueException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +interface SplObserver { + + /** + * Receive update from subject + * @link http://www.php.net/manual/en/splobserver.update.php + * @param subject SplSubject

+ * The SplSubject notifying the observer of an update. + *

+ * @return void + */ + abstract public function update ($subject) {} + +} + +interface SplSubject { + + /** + * Attach an SplObserver + * @link http://www.php.net/manual/en/splsubject.attach.php + * @param observer SplObserver

+ * The SplObserver to attach. + *

+ * @return void + */ + abstract public function attach ($observer) {} + + /** + * Detach an observer + * @link http://www.php.net/manual/en/splsubject.detach.php + * @param observer SplObserver

+ * The SplObserver to detach. + *

+ * @return void + */ + abstract public function detach ($observer) {} + + /** + * Notify an observer + * @link http://www.php.net/manual/en/splsubject.notify.php + * @return void + */ + abstract public function notify () {} + +} + +/** @jms-builtin */ +class SplObjectStorage implements Countable, Iterator, Traversable, Serializable { + + /** + * Adds an object in the storage + * @link http://www.php.net/manual/en/splobjectstorage.attach.php + * @param object object

+ * The object to add. + *

+ * @param data mixed[optional]

+ * The data to associate with the object. + *

+ * @return void + */ + public function attach ($object, $data = null) {} + + /** + * Removes an object from the storage + * @link http://www.php.net/manual/en/splobjectstorage.detach.php + * @param object object

+ * The object to remove. + *

+ * @return void + */ + public function detach ($object) {} + + /** + * Checks if the storage contains a specific object + * @link http://www.php.net/manual/en/splobjectstorage.contains.php + * @param object object

+ * The object to look for. + *

+ * @return boolean true if the object is in the storage, false otherwise. + */ + public function contains ($object) {} + + /** + * Returns the number of objects in the storage + * @link http://www.php.net/manual/en/splobjectstorage.count.php + * @return int The number of objects in the storage. + */ + public function count () {} + + /** + * Rewind the iterator to the first storage element + * @link http://www.php.net/manual/en/splobjectstorage.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Returns if the current iterator entry is valid + * @link http://www.php.net/manual/en/splobjectstorage.valid.php + * @return boolean true if the iterator entry is valid, false otherwise. + */ + public function valid () {} + + /** + * Returns the index at which the iterator currently is + * @link http://www.php.net/manual/en/splobjectstorage.key.php + * @return int The index corresponding to the position of the iterator. + */ + public function key () {} + + /** + * Returns the current storage entry + * @link http://www.php.net/manual/en/splobjectstorage.current.php + * @return object The object at the current iterator position. + */ + public function current () {} + + /** + * Move to the next entry + * @link http://www.php.net/manual/en/splobjectstorage.next.php + * @return void + */ + public function next () {} + + /** + * Unserializes a storage from its string representation + * @link http://www.php.net/manual/en/splobjectstorage.unserialize.php + * @param serialized string

+ * The serialized representation of a storage. + *

+ * @return void + */ + public function unserialize ($serialized) {} + + /** + * Serializes the storage + * @link http://www.php.net/manual/en/splobjectstorage.serialize.php + * @return string A string representing the storage. + */ + public function serialize () {} + +} + +/** + * Return available SPL classes + * @link http://www.php.net/manual/en/function.spl-classes.php + * @return array + * + * @jms-builtin + */ +function spl_classes () {} + +/** + * Default implementation for __autoload() + * @link http://www.php.net/manual/en/function.spl-autoload.php + * @param class_name string

+ *

+ * @param file_extensions string[optional]

+ * By default it checks all include paths to + * contain filenames built up by the lowercase class name appended by the + * filename extensions .inc and .php. + *

+ * @return void + * + * @jms-builtin + */ +function spl_autoload ($class_name, $file_extensions = null) {} + +/** + * Register and return default file extensions for spl_autoload + * @link http://www.php.net/manual/en/function.spl-autoload-extensions.php + * @param file_extensions string[optional]

+ * When calling without an argument, it simply returns the current list + * of extensions each separated by comma. To modify the list of file + * extensions, simply invoke the functions with the new list of file + * extensions to use in a single string with each extensions separated + * by comma. + *

+ * @return string A comma delimited list of default file extensions for + * spl_autoload. + * + * @jms-builtin + */ +function spl_autoload_extensions ($file_extensions = null) {} + +/** + * Register given function as __autoload() implementation + * @link http://www.php.net/manual/en/function.spl-autoload-register.php + * @param autoload_function callback[optional]

+ * The autoload function being registered. + * If no parameter is provided, then the default implementation of + * spl_autoload will be registered. + *

+ * @param throw bool[optional]

+ * This parameter specifies whether + * spl_autoload_register should throw + * exceptions on error. + *

+ * @param prepend bool[optional]

+ * If true, spl_autoload_register will prepend + * the autoloader on the autoload stack instead of appending it. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function spl_autoload_register ($autoload_function = null, $throw = null, $prepend = null) {} + +/** + * Unregister given function as __autoload() implementation + * @link http://www.php.net/manual/en/function.spl-autoload-unregister.php + * @param autoload_function mixed

+ * The autoload function being unregistered. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function spl_autoload_unregister ($autoload_function) {} + +/** + * Return all registered __autoload() functions + * @link http://www.php.net/manual/en/function.spl-autoload-functions.php + * @return array An array of all registered __autoload functions. + * If the autoload stack is not activated then the return value is false. + * If no function is registered the return value will be an empty array. + * + * @jms-builtin + */ +function spl_autoload_functions () {} + +/** + * Try all registered __autoload() function to load the requested class + * @link http://www.php.net/manual/en/function.spl-autoload-call.php + * @param class_name string

+ * The class name being searched. + *

+ * @return void + * + * @jms-builtin + */ +function spl_autoload_call ($class_name) {} + +/** + * Return the parent classes of the given class + * @link http://www.php.net/manual/en/function.class-parents.php + * @param class mixed

+ * An object (class instance) or a string (class name). + *

+ * @param autoload bool[optional]

+ * Whether to allow this function to load the class automatically through + * the __autoload magic + * method. + *

+ * @return array An array on success, or false on error. + * + * @jms-builtin + */ +function class_parents ($class, $autoload = null) {} + +/** + * Return the interfaces which are implemented by the given class + * @link http://www.php.net/manual/en/function.class-implements.php + * @param class mixed

+ * An object (class instance) or a string (class name). + *

+ * @param autoload bool[optional]

+ * Whether to allow this function to load the class automatically through + * the __autoload magic + * method. + *

+ * @return array An array on success, or false on error. + * + * @jms-builtin + */ +function class_implements ($class, $autoload = null) {} + +/** + * Return hash id for given object + * @link http://www.php.net/manual/en/function.spl-object-hash.php + * @param obj object + * @return string A string that is unique for each currently existing object and is always + * the same for each object. + * + * @jms-builtin + */ +function spl_object_hash ($obj) {} + +/** + * Copy the iterator into an array + * @link http://www.php.net/manual/en/function.iterator-to-array.php + * @param iterator Traversable

+ * The iterator being copied. + *

+ * @param use_keys bool[optional]

+ * Whether to use the iterator element keys as index. + *

+ * @return array An array containing the elements of the iterator. + * + * @jms-builtin + */ +function iterator_to_array ($iterator, $use_keys = null) {} + +/** + * Count the elements in an iterator + * @link http://www.php.net/manual/en/function.iterator-count.php + * @param iterator Traversable

+ * The iterator being counted. + *

+ * @return int The number of elements in iterator. + * + * @jms-builtin + */ +function iterator_count ($iterator) {} + +/** + * Call a function for every element in an iterator + * @link http://www.php.net/manual/en/function.iterator-apply.php + * @param iterator Traversable

+ * The class to iterate over. + *

+ * @param function callback

+ * The callback function to call on every element. + * The function must return true in order to + * continue iterating over the iterator. + *

+ * @param args array[optional]

+ * Arguments to pass to the callback function. + *

+ * @return int the iteration count. + * + * @jms-builtin + */ +function iterator_apply ($iterator, $function, array $args = null) {} + +// End of SPL v.0.2 +?> diff --git a/res/php-5.2-core-api/SQLite.php b/res/php-5.2-core-api/SQLite.php new file mode 100644 index 0000000..63e4b89 --- /dev/null +++ b/res/php-5.2-core-api/SQLite.php @@ -0,0 +1,923 @@ + + * The filename of the SQLite database. If the file does not exist, SQLite + * will attempt to create it. PHP must have write permissions to the file + * if data is inserted, the database schema is modified or to create the + * database if it does not exist. + *

+ * @param mode int[optional]

+ * The mode of the file. Intended to be used to open the database in + * read-only mode. Presently, this parameter is ignored by the sqlite + * library. The default value for mode is the octal value + * 0666 and this is the recommended value. + *

+ * @param error_message string[optional]

+ * Passed by reference and is set to hold a descriptive error message + * explaining why the database could not be opened if there was an error. + *

+ * + * @jms-builtin + */ +function sqlite_open ($filename, $mode = null, &$error_message = null) {} + +/** + * Opens a persistent handle to an SQLite database and create the database if it does not exist + * @link http://www.php.net/manual/en/function.sqlite-popen.php + * @param filename string

+ * The filename of the SQLite database. If the file does not exist, SQLite + * will attempt to create it. PHP must have write permissions to the file + * if data is inserted, the database schema is modified or to create the + * database if it does not exist. + *

+ * @param mode int[optional]

+ * The mode of the file. Intended to be used to open the database in + * read-only mode. Presently, this parameter is ignored by the sqlite + * library. The default value for mode is the octal value + * 0666 and this is the recommended value. + *

+ * @param error_message string[optional]

+ * Passed by reference and is set to hold a descriptive error message + * explaining why the database could not be opened if there was an error. + *

+ * @return resource a resource (database handle) on success, false on error. + * + * @jms-builtin + */ +function sqlite_popen ($filename, $mode = null, &$error_message = null) {} + +/** + * Closes an open SQLite database + * @link http://www.php.net/manual/en/function.sqlite-close.php + * @param dbhandle resource

+ * The SQLite Database resource; returned from sqlite_open + * when used procedurally. + *

+ * @return void + * + * @jms-builtin + */ +function sqlite_close ($dbhandle) {} + +/** + * Executes a query against a given database and returns a result handle + * @link http://www.php.net/manual/en/function.sqlite-query.php + * @param query string

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param result_type int[optional] &sqlite.result-type; + * @param error_msg string[optional]

+ * The specified variable will be filled if an error occurs. This is + * specially important because SQL syntax errors can't be fetched using + * the sqlite_last_error function. + *

+ * @return SQLiteResult This function will return a result handle&return.falseforfailure;. + * For queries that return rows, the result handle can then be used with + * functions such as sqlite_fetch_array and + * sqlite_seek. + *

+ *

+ * Regardless of the query type, this function will return false if the + * query failed. + *

+ *

+ * sqlite_query returns a buffered, seekable result + * handle. This is useful for reasonably small queries where you need to + * be able to randomly access the rows. Buffered result handles will + * allocate memory to hold the entire result and will not return until it + * has been fetched. If you only need sequential access to the data, it is + * recommended that you use the much higher performance + * sqlite_unbuffered_query instead. + * + * @jms-builtin + */ +function sqlite_query ($query, $result_type = null, &$error_msg = null) {} + +/** + * Executes a result-less query against a given database + * @link http://www.php.net/manual/en/function.sqlite-exec.php + * @param query string

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param error_msg string[optional]

+ * The specified variable will be filled if an error occurs. This is + * specially important because SQL syntax errors can't be fetched using + * the sqlite_last_error function. + *

+ * @return bool This function will return a boolean result; true for success or false for failure. + * If you need to run a query that returns rows, see sqlite_query. + * + * @jms-builtin + */ +function sqlite_exec ($query, &$error_msg = null) {} + +/** + * Execute a query against a given database and returns an array + * @link http://www.php.net/manual/en/function.sqlite-array-query.php + * @param query string

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param result_type int[optional] &sqlite.result-type; + * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return array an array of the entire result set; false otherwise. + * + * @jms-builtin + */ +function sqlite_array_query ($query, $result_type = null, $decode_binary = null) {} + +/** + * Executes a query and returns either an array for one single column or the value of the first row + * @link http://www.php.net/manual/en/function.sqlite-single-query.php + * @param query string + * @param first_row_only bool[optional] + * @param decode_binary bool[optional] + * @return array + * + * @jms-builtin + */ +function sqlite_single_query ($query, $first_row_only = null, $decode_binary = null) {} + +/** + * Fetches the next row from a result set as an array + * @link http://www.php.net/manual/en/function.sqlite-fetch-array.php + * @param result_type int[optional] &sqlite.result-type; + * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return array an array of the next row from a result set; false if the + * next position is beyond the final row. + * + * @jms-builtin + */ +function sqlite_fetch_array ($result_type = null, $decode_binary = null) {} + +/** + * Fetches the next row from a result set as an object + * @link http://www.php.net/manual/en/function.sqlite-fetch-object.php + * @param class_name string[optional] + * @param ctor_params array[optional] + * @param decode_binary bool[optional] + * @return object + * + * @jms-builtin + */ +function sqlite_fetch_object ($class_name = null, array $ctor_params = null, $decode_binary = null) {} + +/** + * Fetches the first column of a result set as a string + * @link http://www.php.net/manual/en/function.sqlite-fetch-single.php + * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return string the first column value, as a string. + * + * @jms-builtin + */ +function sqlite_fetch_single ($decode_binary = null) {} + +/** + * &Alias; sqlite_fetch_single + * @link http://www.php.net/manual/en/function.sqlite-fetch-string.php + * + * @jms-builtin + */ +function sqlite_fetch_string () {} + +/** + * Fetches all rows from a result set as an array of arrays + * @link http://www.php.net/manual/en/function.sqlite-fetch-all.php + * @param result_type int[optional] &sqlite.result-type; + * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return array an array of the remaining rows in a result set. If called right + * after sqlite_query, it returns all rows. If called + * after sqlite_fetch_array, it returns the rest. If + * there are no rows in a result set, it returns an empty array. + * + * @jms-builtin + */ +function sqlite_fetch_all ($result_type = null, $decode_binary = null) {} + +/** + * Fetches the current row from a result set as an array + * @link http://www.php.net/manual/en/function.sqlite-current.php + * @param result_type int[optional] &sqlite.result-type; + * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return array an array of the current row from a result set; false if the + * current position is beyond the final row. + * + * @jms-builtin + */ +function sqlite_current ($result_type = null, $decode_binary = null) {} + +/** + * Fetches a column from the current row of a result set + * @link http://www.php.net/manual/en/function.sqlite-column.php + * @param index_or_name mixed

+ * The column index or name to fetch. + *

+ * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return mixed the column value. + * + * @jms-builtin + */ +function sqlite_column ($index_or_name, $decode_binary = null) {} + +/** + * Returns the version of the linked SQLite library + * @link http://www.php.net/manual/en/function.sqlite-libversion.php + * @return string the librart version, as a string. + * + * @jms-builtin + */ +function sqlite_libversion () {} + +/** + * Returns the encoding of the linked SQLite library + * @link http://www.php.net/manual/en/function.sqlite-libencoding.php + * @return string the library encoding. + * + * @jms-builtin + */ +function sqlite_libencoding () {} + +/** + * Returns the number of rows that were changed by the most + recent SQL statement + * @link http://www.php.net/manual/en/function.sqlite-changes.php + * @return int the number of changed rows. + * + * @jms-builtin + */ +function sqlite_changes () {} + +/** + * Returns the rowid of the most recently inserted row + * @link http://www.php.net/manual/en/function.sqlite-last-insert-rowid.php + * @return int the row id, as an integer. + * + * @jms-builtin + */ +function sqlite_last_insert_rowid () {} + +/** + * Returns the number of rows in a buffered result set + * @link http://www.php.net/manual/en/function.sqlite-num-rows.php + * @return int the number of rows, as an integer. + * + * @jms-builtin + */ +function sqlite_num_rows () {} + +/** + * Returns the number of fields in a result set + * @link http://www.php.net/manual/en/function.sqlite-num-fields.php + * @return int the number of fields, as an integer. + * + * @jms-builtin + */ +function sqlite_num_fields () {} + +/** + * Returns the name of a particular field + * @link http://www.php.net/manual/en/function.sqlite-field-name.php + * @param field_index int

+ * The ordinal column number in the result set. + *

+ * @return string the name of a field in an SQLite result set, given the ordinal + * column number; false on error. + * + * @jms-builtin + */ +function sqlite_field_name ($field_index) {} + +/** + * Seek to a particular row number of a buffered result set + * @link http://www.php.net/manual/en/function.sqlite-seek.php + * @param rownum int

+ * The ordinal row number to seek to. The row number is zero-based (0 is + * the first row). + *

+ * &sqlite.no-unbuffered; + * @return bool false if the row does not exist, true otherwise. + * + * @jms-builtin + */ +function sqlite_seek ($rownum) {} + +/** + * Seek to the first row number + * @link http://www.php.net/manual/en/function.sqlite-rewind.php + * @return bool false if there are no rows in the result set, true otherwise. + * + * @jms-builtin + */ +function sqlite_rewind () {} + +/** + * Seek to the next row number + * @link http://www.php.net/manual/en/function.sqlite-next.php + * @return bool true on success, or false if there are no more rows. + * + * @jms-builtin + */ +function sqlite_next () {} + +/** + * Seek to the previous row number of a result set + * @link http://www.php.net/manual/en/function.sqlite-prev.php + * @return bool true on success, or false if there are no more previous rows. + * + * @jms-builtin + */ +function sqlite_prev () {} + +/** + * Returns whether more rows are available + * @link http://www.php.net/manual/en/function.sqlite-valid.php + * @return bool true if there are more rows available from the + * result handle, or false otherwise. + * + * @jms-builtin + */ +function sqlite_valid () {} + +/** + * Finds whether or not more rows are available + * @link http://www.php.net/manual/en/function.sqlite-has-more.php + * @param result resource

+ * The SQLite result resource. + *

+ * @return bool true if there are more rows available from the + * result handle, or false otherwise. + * + * @jms-builtin + */ +function sqlite_has_more ($result) {} + +/** + * Returns whether or not a previous row is available + * @link http://www.php.net/manual/en/function.sqlite-has-prev.php + * @return bool true if there are more previous rows available from the + * result handle, or false otherwise. + * + * @jms-builtin + */ +function sqlite_has_prev () {} + +/** + * Escapes a string for use as a query parameter + * @link http://www.php.net/manual/en/function.sqlite-escape-string.php + * @param item string

+ * The string being quoted. + *

+ *

+ * If the item contains a NUL + * character, or if it begins with a character whose ordinal value is + * 0x01, PHP will apply a binary encoding scheme so that + * you can safely store and retrieve binary data. + *

+ * @return string an escaped string for use in an SQLite SQL statement. + * + * @jms-builtin + */ +function sqlite_escape_string ($item) {} + +/** + * Set busy timeout duration, or disable busy handlers + * @link http://www.php.net/manual/en/function.sqlite-busy-timeout.php + * @param milliseconds int

+ * The number of milliseconds. When set to + * 0, busy handlers will be disabled and SQLite will + * return immediately with a SQLITE_BUSY status code + * if another process/thread has the database locked for an update. + *

+ *

+ * PHP sets the default busy timeout to be 60 seconds when the database is + * opened. + *

+ *

+ * There are one thousand (1000) milliseconds in one second. + *

+ * @return void + * + * @jms-builtin + */ +function sqlite_busy_timeout ($milliseconds) {} + +/** + * Returns the error code of the last error for a database + * @link http://www.php.net/manual/en/function.sqlite-last-error.php + * @return int an error code, or 0 if no error occurred. + * + * @jms-builtin + */ +function sqlite_last_error () {} + +/** + * Returns the textual description of an error code + * @link http://www.php.net/manual/en/function.sqlite-error-string.php + * @param error_code int

+ * The error code being used, which might be passed in from + * sqlite_last_error. + *

+ * @return string a human readable description of the error_code, + * as a string. + * + * @jms-builtin + */ +function sqlite_error_string ($error_code) {} + +/** + * Execute a query that does not prefetch and buffer all data + * @link http://www.php.net/manual/en/function.sqlite-unbuffered-query.php + * @param query string

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param result_type int[optional] &sqlite.result-type; + * @param error_msg string[optional]

+ * The specified variable will be filled if an error occurs. This is + * specially important because SQL syntax errors can't be fetched using + * the sqlite_last_error function. + *

+ * @return SQLiteUnbuffered a result handle&return.falseforfailure;. + *

+ *

+ * sqlite_unbuffered_query returns a sequential + * forward-only result set that can only be used to read each row, one after + * the other. + * + * @jms-builtin + */ +function sqlite_unbuffered_query ($query, $result_type = null, &$error_msg = null) {} + +/** + * Register an aggregating UDF for use in SQL statements + * @link http://www.php.net/manual/en/function.sqlite-create-aggregate.php + * @param function_name string

+ * The name of the function used in SQL statements. + *

+ * @param step_func callback

+ * Callback function called for each row of the result set. + *

+ * @param finalize_func callback

+ * Callback function to aggregate the "stepped" data from each row. + *

+ * @param num_args int[optional]

+ * Hint to the SQLite parser if the callback function accepts a + * predetermined number of arguments. + *

+ * @return void + * + * @jms-builtin + */ +function sqlite_create_aggregate ($function_name, $step_func, $finalize_func, $num_args = null) {} + +/** + * Registers a "regular" User Defined Function for use in SQL statements + * @link http://www.php.net/manual/en/function.sqlite-create-function.php + * @param function_name string

+ * The name of the function used in SQL statements. + *

+ * @param callback callback

+ * Callback function to handle the defined SQL function. + *

+ * Callback functions should return a type understood by SQLite (i.e. + * scalar type). + * @param num_args int[optional]

+ * Hint to the SQLite parser if the callback function accepts a + * predetermined number of arguments. + *

+ * @return void + * + * @jms-builtin + */ +function sqlite_create_function ($function_name, $callback, $num_args = null) {} + +/** + * Opens a SQLite database and returns a SQLiteDatabase object + * @link http://www.php.net/manual/en/function.sqlite-factory.php + * @param filename string

+ * The filename of the SQLite database. + *

+ * @param mode int[optional]

+ * The mode of the file. Intended to be used to open the database in + * read-only mode. Presently, this parameter is ignored by the sqlite + * library. The default value for mode is the octal value + * 0666 and this is the recommended value. + *

+ * @param error_message string[optional]

+ * Passed by reference and is set to hold a descriptive error message + * explaining why the database could not be opened if there was an error. + *

+ * @return SQLiteDatabase a SQLiteDatabase object on success, &null; on error. + * + * @jms-builtin + */ +function sqlite_factory ($filename, $mode = null, &$error_message = null) {} + +/** + * Encode binary data before returning it from an UDF + * @link http://www.php.net/manual/en/function.sqlite-udf-encode-binary.php + * @param data string

+ * The string being encoded. + *

+ * @return string The encoded string. + * + * @jms-builtin + */ +function sqlite_udf_encode_binary ($data) {} + +/** + * Decode binary data passed as parameters to an UDF + * @link http://www.php.net/manual/en/function.sqlite-udf-decode-binary.php + * @param data string

+ * The encoded data that will be decoded, data that was applied by either + * sqlite_udf_encode_binary or + * sqlite_escape_string. + *

+ * @return string The decoded string. + * + * @jms-builtin + */ +function sqlite_udf_decode_binary ($data) {} + +/** + * Return an array of column types from a particular table + * @link http://www.php.net/manual/en/function.sqlite-fetch-column-types.php + * @param table_name string

+ * The table name to query. + *

+ * @param result_type int[optional]

+ * The optional result_type parameter accepts a + * constant and determines how the returned array will be indexed. Using + * SQLITE_ASSOC will return only associative indices + * (named fields) while SQLITE_NUM will return only + * numerical indices (ordinal field numbers). + * SQLITE_BOTH will return both associative and + * numerical indices. SQLITE_ASSOC is the default for + * this function. + *

+ * @return array an array of column data types; false on error. + * + * @jms-builtin + */ +function sqlite_fetch_column_types ($table_name, $result_type = null) {} + + +/** + * Columns are returned into the array having both a numerical index + * and the field name as the array index. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_BOTH', 3); + +/** + * Columns are returned into the array having a numerical index to the + * fields. This index starts with 0, the first field in the result. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NUM', 2); + +/** + * Columns are returned into the array having the field name as the array + * index. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ASSOC', 1); + +/** + * Successful result. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_OK', 0); + +/** + * SQL error or missing database. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ERROR', 1); + +/** + * An internal logic error in SQLite. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_INTERNAL', 2); + +/** + * Access permission denied. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_PERM', 3); + +/** + * Callback routine requested an abort. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ABORT', 4); + +/** + * The database file is locked. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_BUSY', 5); + +/** + * A table in the database is locked. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_LOCKED', 6); + +/** + * Memory allocation failed. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOMEM', 7); + +/** + * Attempt to write a readonly database. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_READONLY', 8); + +/** + * Operation terminated internally. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_INTERRUPT', 9); + +/** + * Disk I/O error occurred. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_IOERR', 10); + +/** + * The database disk image is malformed. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_CORRUPT', 11); + +/** + * (Internal) Table or record not found. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOTFOUND', 12); + +/** + * Insertion failed because database is full. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_FULL', 13); + +/** + * Unable to open the database file. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_CANTOPEN', 14); + +/** + * Database lock protocol error. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_PROTOCOL', 15); + +/** + * (Internal) Database table is empty. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_EMPTY', 16); + +/** + * The database schema changed. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_SCHEMA', 17); + +/** + * Too much data for one row of a table. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_TOOBIG', 18); + +/** + * Abort due to constraint violation. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_CONSTRAINT', 19); + +/** + * Data type mismatch. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_MISMATCH', 20); + +/** + * Library used incorrectly. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_MISUSE', 21); + +/** + * Uses of OS features not supported on host. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOLFS', 22); + +/** + * Authorized failed. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_AUTH', 23); + +/** + * File opened that is not a database file. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOTADB', 26); + +/** + * Auxiliary database format error. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_FORMAT', 24); + +/** + * Internal process has another row ready. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ROW', 100); + +/** + * Internal process has finished executing. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_DONE', 101); + +// End of SQLite v.2.0-dev +?> diff --git a/res/php-5.2-core-api/SimpleXML.php b/res/php-5.2-core-api/SimpleXML.php new file mode 100644 index 0000000..a0562fa --- /dev/null +++ b/res/php-5.2-core-api/SimpleXML.php @@ -0,0 +1,254 @@ + + * A well-formed XML string or the path or URL to an XML document if + * data_is_url is true. + *

+ * @param options int[optional]

+ * Optionally used to specify additional + * Libxml parameters. + *

+ * @param data_is_url bool[optional]

+ * By default, data_is_url is false. Use true to + * specify that data is a path or URL to an XML + * document instead of string data. + *

+ * @param ns string[optional]

+ *

+ * @param is_prefix bool[optional]

+ *

+ */ + final public function __construct ($data, $options = null, $data_is_url = null, $ns = null, $is_prefix = null) {} + + /** + * Return a well-formed XML string based on SimpleXML element + * @link http://www.php.net/manual/en/simplexmlelement.asXML.php + * @param filename string[optional]

+ * If specified, the function writes the data to the file rather than + * returning it. + *

+ * @return mixed If the filename isn't specified, this function + * returns a string on success and false on error. If the + * parameter is specified, it returns true if the file was written + * successfully and false otherwise. + */ + public function asXML ($filename = null) {} + + public function saveXML () {} + + /** + * Runs XPath query on XML data + * @link http://www.php.net/manual/en/simplexmlelement.xpath.php + * @param path string

+ * An XPath path + *

+ * @return array an array of SimpleXMLElement objects or false in + * case of an error. + */ + public function xpath ($path) {} + + /** + * Creates a prefix/ns context for the next XPath query + * @link http://www.php.net/manual/en/simplexmlelement.registerXPathNamespace.php + * @param prefix string

+ * The namespace prefix to use in the XPath query for the namespace given in + * ns. + *

+ * @param ns string

+ * The namespace to use for the XPath query. This must match a namespace in + * use by the XML document or the XPath query using + * prefix will not return any results. + *

+ * @return bool Returns true on success or false on failure. + */ + public function registerXPathNamespace ($prefix, $ns) {} + + /** + * Identifies an element's attributes + * @link http://www.php.net/manual/en/simplexmlelement.attributes.php + * @param ns string[optional]

+ * An optional namespace for the retrieved attributes + *

+ * @param is_prefix bool[optional]

+ * Default to false + *

+ * @return SimpleXMLElement + */ + public function attributes ($ns = null, $is_prefix = null) {} + + /** + * Finds children of given node + * @link http://www.php.net/manual/en/simplexmlelement.children.php + * @param ns string[optional]

+ * An XML namespace. + *

+ * @param is_prefix bool[optional]

+ * If is_prefix is true, + * ns will be regarded as a prefix. If false, + * ns will be regarded as a namespace + * URL. + *

+ * @return SimpleXMLElement a SimpleXMLElement element, whether the node + * has children or not. + */ + public function children ($ns = null, $is_prefix = null) {} + + /** + * Returns namespaces used in document + * @link http://www.php.net/manual/en/simplexmlelement.getNamespaces.php + * @param recursive bool[optional]

+ * If specified, returns all namespaces used in parent and child nodes. + * Otherwise, returns only namespaces used in root node. + *

+ * @return array The getNamespaces method returns an array of + * namespace names with their associated URIs. + */ + public function getNamespaces ($recursive = null) {} + + /** + * Returns namespaces declared in document + * @link http://www.php.net/manual/en/simplexmlelement.getDocNamespaces.php + * @param recursive bool[optional]

+ * If specified, returns all namespaces declared in parent and child nodes. + * Otherwise, returns only namespaces declared in root node. + *

+ * @return array The getDocNamespaces method returns an array + * of namespace names with their associated URIs. + */ + public function getDocNamespaces ($recursive = null) {} + + /** + * Gets the name of the XML element + * @link http://www.php.net/manual/en/simplexmlelement.getName.php + * @return string The getName method returns as a string the + * name of the XML tag referenced by the SimpleXMLElement object. + */ + public function getName () {} + + /** + * Adds a child element to the XML node + * @link http://www.php.net/manual/en/simplexmlelement.addChild.php + * @param name string

+ * The name of the child element to add. + *

+ * @param value string[optional]

+ * If specified, the value of the child element. + *

+ * @param namespace string[optional]

+ * If specified, the namespace to which the child element belongs. + *

+ * @return SimpleXMLElement The addChild method returns a SimpleXMLElement + * object representing the child added to the XML node. + */ + public function addChild ($name, $value = null, $namespace = null) {} + + /** + * Adds an attribute to the SimpleXML element + * @link http://www.php.net/manual/en/simplexmlelement.addAttribute.php + * @param name string

+ * The name of the attribute to add. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @param namespace string[optional]

+ * If specified, the namespace to which the attribute belongs. + *

+ * @return void + */ + public function addAttribute ($name, $value, $namespace = null) {} + +} + +/** + * Interprets an XML file into an object + * @link http://www.php.net/manual/en/function.simplexml-load-file.php + * @param filename string

+ * Path to the XML file + *

+ *

+ * Libxml 2 unescapes the URI, so if you want to pass e.g. + * b&c as the URI parameter a, + * you have to call + * simplexml_load_file(rawurlencode('http://example.com/?a=' . + * urlencode('b&c'))). Since PHP 5.1.0 you don't need to do + * this because PHP will do it for you. + *

+ * @param class_name string[optional]

+ * You may use this optional parameter so that + * simplexml_load_file will return an object of + * the specified class. That class should extend the + * SimpleXMLElement class. + *

+ * @param options int[optional]

+ * Since PHP 5.1.0 and Libxml 2.6.0, you may also use the + * options parameter to specify additional Libxml parameters. + *

+ * @param ns string[optional]

+ *

+ * @param is_prefix bool[optional]

+ *

+ * @return SimpleXMLElement an object of class SimpleXMLElement with + * properties containing the data held within the XML document. On errors, it + * will return false. + * + * @jms-builtin + */ +function simplexml_load_file ($filename, $class_name = null, $options = null, $ns = null, $is_prefix = null) {} + +/** + * Interprets a string of XML into an object + * @link http://www.php.net/manual/en/function.simplexml-load-string.php + * @param data string

+ * A well-formed XML string + *

+ * @param class_name string[optional]

+ * You may use this optional parameter so that + * simplexml_load_string will return an object of + * the specified class. That class should extend the + * SimpleXMLElement class. + *

+ * @param options int[optional]

+ * Since PHP 5.1.0 and Libxml 2.6.0, you may also use the + * options parameter to specify additional Libxml parameters. + *

+ * @param ns string[optional]

+ *

+ * @param is_prefix bool[optional]

+ *

+ * @return SimpleXMLElement an object of class SimpleXMLElement with + * properties containing the data held within the xml document. On errors, it + * will return false. + * + * @jms-builtin + */ +function simplexml_load_string ($data, $class_name = null, $options = null, $ns = null, $is_prefix = null) {} + +/** + * Get a SimpleXMLElement object from a DOM node. + * @link http://www.php.net/manual/en/function.simplexml-import-dom.php + * @param node DOMNode

+ * A DOM Element node + *

+ * @param class_name string[optional]

+ * You may use this optional parameter so that + * simplexml_import_dom will return an object of + * the specified class. That class should extend the + * SimpleXMLElement class. + *

+ * @return SimpleXMLElement a SimpleXMLElement&return.falseforfailure;. + * + * @jms-builtin + */ +function simplexml_import_dom (DOMNode $node, $class_name = null) {} + +// End of SimpleXML v.0.1 +?> diff --git a/res/php-5.2-core-api/basic.php b/res/php-5.2-core-api/basic.php new file mode 100644 index 0000000..38d6da2 --- /dev/null +++ b/res/php-5.2-core-api/basic.php @@ -0,0 +1,1133 @@ + + * The argument offset. Function arguments are counted starting from + * zero. + *

+ * @return mixed the specified argument, or false on error. + * + * @jms-builtin + */ +function func_get_arg ($arg_num) {} + +/** + * Returns an array comprising a function's argument list + * @link http://www.php.net/manual/en/function.func-get-args.php + * @return array<*> an array in which each element is a copy of the corresponding + * member of the current user-defined function's argument list. + * + * @jms-builtin + */ +function func_get_args () {} + +/** + * Get string length + * @link http://www.php.net/manual/en/function.strlen.php + * @param string string

+ * The string being measured for length. + *

+ * @return int The length of the string on success, + * and 0 if the string is empty. + * + * @jms-builtin + */ +function strlen ($string) {} + +/** + * Binary safe string comparison + * @link http://www.php.net/manual/en/function.strcmp.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 + * is greater than str2, and 0 if they are + * equal. + * + * @jms-builtin + */ +function strcmp ($str1, $str2) {} + +/** + * Binary safe string comparison of the first n characters + * @link http://www.php.net/manual/en/function.strncmp.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @param len int

+ * Number of characters to use in the comparison. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 + * is greater than str2, and 0 if they are + * equal. + * + * @jms-builtin + */ +function strncmp ($str1, $str2, $len) {} + +/** + * Binary safe case-insensitive string comparison + * @link http://www.php.net/manual/en/function.strcasecmp.php + * @param str1 string

+ * The first string + *

+ * @param str2 string

+ * The second string + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 + * is greater than str2, and 0 if they are + * equal. + * + * @jms-builtin + */ +function strcasecmp ($str1, $str2) {} + +/** + * Binary safe case-insensitive string comparison of the first n characters + * @link http://www.php.net/manual/en/function.strncasecmp.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @param len int

+ * The length of strings to be used in the comparison. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 is + * greater than str2, and 0 if they are equal. + * + * @jms-builtin + */ +function strncasecmp ($str1, $str2, $len) {} + +/** + * Return the current key and value pair from an array and advance the array cursor + * @link http://www.php.net/manual/en/function.each.php + * @param array array

+ * The input array. + *

+ * @return array the current key and value pair from the array + * array. This pair is returned in a four-element + * array, with the keys 0, 1, + * key, and value. Elements + * 0 and key contain the key name of + * the array element, and 1 and value + * contain the data. + *

+ *

+ * If the internal pointer for the array points past the end of the + * array contents, each returns + * false. + * + * @jms-builtin + */ +function each (array &$array) {} + +/** + * Sets which PHP errors are reported + * @link http://www.php.net/manual/en/function.error-reporting.php + * @param level int[optional]

+ * The new error_reporting + * level. It takes on either a bitmask, or named constants. Using named + * constants is strongly encouraged to ensure compatibility for future + * versions. As error levels are added, the range of integers increases, + * so older integer-based error levels will not always behave as expected. + *

+ *

+ * The available error level constants and the actual + * meanings of these error levels are described in the + * predefined constants. + *

+ * @return int the old error_reporting + * level or the current level if no level parameter is + * given. + * + * @jms-builtin + */ +function error_reporting ($level = null) {} + +/** + * Defines a named constant + * @link http://www.php.net/manual/en/function.define.php + * @param name string

+ * The name of the constant. + *

+ * @param value mixed

+ * The value of the constant; only scalar and null values are allowed. + * Scalar values are integer, + * float, string or boolean values. It is + * possible to define resource constants, however it is not recommended + * and may cause unpredictable behavior. + *

+ * @param case_insensitive bool[optional]

+ * If set to true, the constant will be defined case-insensitive. + * The default behavior is case-sensitive; i.e. + * CONSTANT and Constant represent + * different values. + *

+ *

+ * Case-insensitive constants are stored as lower-case. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function define ($name, $value, $case_insensitive = null) {} + +/** + * Checks whether a given named constant exists + * @link http://www.php.net/manual/en/function.defined.php + * @param name string

+ * The constant name. + *

+ * @return bool true if the named constant given by name + * has been defined, false otherwise. + * + * @jms-builtin + */ +function defined ($name) {} + +/** + * Returns the name of the class of an object + * @link http://www.php.net/manual/en/function.get-class.php + * @param object object[optional]

+ * The tested object + *

+ * @return string the name of the class of which object is an + * instance. Returns false if object is not an + * object. + * + * @jms-builtin + */ +function get_class ($object = null) {} + +/** + * Retrieves the parent class name for object or class + * @link http://www.php.net/manual/en/function.get-parent-class.php + * @param object mixed[optional]

+ * The tested object or class name + *

+ * @return string the name of the parent class of the class of which + * object is an instance or the name. + *

+ *

+ * If the object does not have a parent false will be returned. + *

+ *

+ * If called without parameter outside object, this function returns false. + * + * @jms-builtin + */ +function get_parent_class ($object = null) {} + +/** + * Checks if the class method exists + * @link http://www.php.net/manual/en/function.method-exists.php + * @param object mixed

+ * An object instance or a class name + *

+ * @param method_name string

+ * The method name + *

+ * @return bool true if the method given by method_name + * has been defined for the given object, false + * otherwise. + * + * @jms-builtin + */ +function method_exists ($object, $method_name) {} + +/** + * Checks if the object or class has a property + * @link http://www.php.net/manual/en/function.property-exists.php + * @param class mixed

+ * The class name or an object of the class to test for + *

+ * @param property string

+ * The name of the property + *

+ * @return bool true if the property exists, false if it doesn't exist or + * &null; in case of an error. + * + * @jms-builtin + */ +function property_exists ($class, $property) {} + +/** + * Checks if the class has been defined + * @link http://www.php.net/manual/en/function.class-exists.php + * @param class_name string

+ * The class name. The name is matched in a case-insensitive manner. + *

+ * @param autoload bool[optional]

+ * Whether or not to call &link.autoload; by default. + *

+ * @return bool true if class_name is a defined class, + * false otherwise. + * + * @jms-builtin + */ +function class_exists ($class_name, $autoload = null) {} + +/** + * Checks if the interface has been defined + * @link http://www.php.net/manual/en/function.interface-exists.php + * @param interface_name string

+ * The interface name + *

+ * @param autoload bool[optional]

+ * Whether to call &link.autoload; or not by default. + *

+ * @return bool true if the interface given by + * interface_name has been defined, false otherwise. + * + * @jms-builtin + */ +function interface_exists ($interface_name, $autoload = null) {} + +/** + * Return &true; if the given function has been defined + * @link http://www.php.net/manual/en/function.function-exists.php + * @param function_name string

+ * The function name, as a string. + *

+ * @return bool true if function_name exists and is a + * function, false otherwise. + *

+ *

+ * This function will return false for constructs, such as + * include_once and echo. + * + * @jms-builtin + */ +function function_exists ($function_name) {} + +/** + * Returns an array with the names of included or required files + * @link http://www.php.net/manual/en/function.get-included-files.php + * @return array an array of the names of all files. + *

+ *

+ * The script originally called is considered an "included file," so it will + * be listed together with the files referenced by + * include and family. + *

+ *

+ * Files that are included or required multiple times only show up once in + * the returned array. + * + * @jms-builtin + */ +function get_included_files () {} + +/** + * &Alias; get_included_files + * @link http://www.php.net/manual/en/function.get-required-files.php + * + * @jms-builtin + */ +function get_required_files () {} + +/** + * Checks if the object has this class as one of its parents + * @link http://www.php.net/manual/en/function.is-subclass-of.php + * @param object mixed

+ * A class name or an object instance + *

+ * @param class_name string

+ * The class name + *

+ * @return bool This function returns true if the object object, + * belongs to a class which is a subclass of + * class_name, false otherwise. + * + * @jms-builtin + */ +function is_subclass_of ($object, $class_name) {} + +/** + * Checks if the object is of this class or has this class as one of its parents + * @link http://www.php.net/manual/en/function.is-a.php + * @param object object

+ * The tested object + *

+ * @param class_name string

+ * The class name + *

+ * @return bool true if the object is of this class or has this class as one of + * its parents, false otherwise. + * + * @jms-builtin + */ +function is_a ($object, $class_name) {} + +/** + * Get the default properties of the class + * @link http://www.php.net/manual/en/function.get-class-vars.php + * @param class_name string

+ * The class name + *

+ * @return array an associative array of declared properties visible from the + * current scope, with their default value. + * The resulting array elements are in the form of + * varname => value. + * + * @jms-builtin + */ +function get_class_vars ($class_name) {} + +/** + * Gets the properties of the given object + * @link http://www.php.net/manual/en/function.get-object-vars.php + * @param object object

+ * An object instance. + *

+ * @return array an associative array of defined object accessible non-static properties + * for the specified object in scope. If a property have + * not been assigned a value, it will be returned with a &null; value. + * + * @jms-builtin + */ +function get_object_vars ($object) {} + +/** + * Gets the class methods' names + * @link http://www.php.net/manual/en/function.get-class-methods.php + * @param class_name mixed

+ * The class name or an object instance + *

+ * @return array an array of method names defined for the class specified by + * class_name. In case of an error, it returns &null;. + * + * @jms-builtin + */ +function get_class_methods ($class_name) {} + +/** + * Generates a user-level error/warning/notice message + * @link http://www.php.net/manual/en/function.trigger-error.php + * @param error_msg string

+ * The designated error message for this error. It's limited to 1024 + * characters in length. Any additional characters beyond 1024 will be + * truncated. + *

+ * @param error_type int[optional]

+ * The designated error type for this error. It only works with the E_USER + * family of constants, and will default to E_USER_NOTICE. + *

+ * @return bool This function returns false if wrong error_type is + * specified, true otherwise. + * + * @jms-builtin + */ +function trigger_error ($error_msg, $error_type = null) {} + +/** + * Alias of trigger_error + * @link http://www.php.net/manual/en/function.user-error.php + * + * @jms-builtin + */ +function user_error () {} + +/** + * Sets a user-defined error handler function + * @link http://www.php.net/manual/en/function.set-error-handler.php + * @param error_handler callback

+ * The user function needs to accept two parameters: the error code, and a + * string describing the error. Then there are three optional parameters + * that may be supplied: the filename in which the error occurred, the + * line number in which the error occurred, and the context in which the + * error occurred (an array that points to the active symbol table at the + * point the error occurred). The function can be shown as: + *

+ *

+ * handler + * interrno + * stringerrstr + * stringerrfile + * interrline + * arrayerrcontext + * errno + * The first parameter, errno, contains the + * level of the error raised, as an integer. + * @param error_types int[optional]

+ * Can be used to mask the triggering of the + * error_handler function just like the error_reporting ini setting + * controls which errors are shown. Without this mask set the + * error_handler will be called for every error + * regardless to the setting of the error_reporting setting. + *

+ * @return mixed a string containing the previously defined error handler (if any). If + * the built-in error handler is used &null; is returned. &null; is also returned + * in case of an error such as an invalid callback. If the previous error handler + * was a class method, this function will return an indexed array with the class + * and the method name. + * + * @jms-builtin + */ +function set_error_handler ($error_handler, $error_types = null) {} + +/** + * Restores the previous error handler function + * @link http://www.php.net/manual/en/function.restore-error-handler.php + * @return bool This function always returns true. + * + * @jms-builtin + */ +function restore_error_handler () {} + +/** + * Sets a user-defined exception handler function + * @link http://www.php.net/manual/en/function.set-exception-handler.php + * @param exception_handler callback

+ * Name of the function to be called when an uncaught exception occurs. + * This function must be defined before calling + * set_exception_handler. This handler function + * needs to accept one parameter, which will be the exception object that + * was thrown. + *

+ * @return callback the name of the previously defined exception handler, or &null; on error. If + * no previous handler was defined, &null; is also returned. + * + * @jms-builtin + */ +function set_exception_handler ($exception_handler) {} + +/** + * Restores the previously defined exception handler function + * @link http://www.php.net/manual/en/function.restore-exception-handler.php + * @return bool This function always returns true. + * + * @jms-builtin + */ +function restore_exception_handler () {} + +/** + * Returns an array with the name of the defined classes + * @link http://www.php.net/manual/en/function.get-declared-classes.php + * @return array an array of the names of the declared classes in the current + * script. + *

+ *

+ * Note that depending on what extensions you have compiled or + * loaded into PHP, additional classes could be present. This means that + * you will not be able to define your own classes using these + * names. There is a list of predefined classes in the Predefined Classes section of + * the appendices. + * + * @jms-builtin + */ +function get_declared_classes () {} + +/** + * Returns an array of all declared interfaces + * @link http://www.php.net/manual/en/function.get-declared-interfaces.php + * @return array an array of the names of the declared interfaces in the current + * script. + * + * @jms-builtin + */ +function get_declared_interfaces () {} + +/** + * Returns an array of all defined functions + * @link http://www.php.net/manual/en/function.get-defined-functions.php + * @return array an multidimensional array containing a list of all defined + * functions, both built-in (internal) and user-defined. The internal + * functions will be accessible via $arr["internal"], and + * the user defined ones using $arr["user"] (see example + * below). + * + * @jms-builtin + */ +function get_defined_functions () {} + +/** + * Returns an array of all defined variables + * @link http://www.php.net/manual/en/function.get-defined-vars.php + * @return array A multidimensional array with all the variables. + * + * @jms-builtin + */ +function get_defined_vars () {} + +/** + * Create an anonymous (lambda-style) function + * @link http://www.php.net/manual/en/function.create-function.php + * @param args string

+ * The function arguments. + *

+ * @param code string

+ * The function code. + *

+ * @return string a unique function name as a string, or false on error. + * + * @jms-builtin + */ +function create_function ($args, $code) {} + +/** + * Returns the resource type + * @link http://www.php.net/manual/en/function.get-resource-type.php + * @param handle resource

+ * The evaluated resource handle. + *

+ * @return string If the given handle is a resource, this function + * will return a string representing its type. If the type is not identified + * by this function, the return value will be the string + * Unknown. + *

+ *

+ * This function will return false and generate an error if + * handle is not a resource. + * + * @jms-builtin + */ +function get_resource_type ($handle) {} + +/** + * Returns an array with the names of all modules compiled and loaded + * @link http://www.php.net/manual/en/function.get-loaded-extensions.php + * @param zend_extensions bool[optional]

+ * Return zend_extensions or not, defaults to false (do not list + * zend_extensions). + *

+ * @return array an indexed array of all the modules names. + * + * @jms-builtin + */ +function get_loaded_extensions ($zend_extensions = null) {} + +/** + * Find out whether an extension is loaded + * @link http://www.php.net/manual/en/function.extension-loaded.php + * @param name string

+ * The extension name. + *

+ *

+ * You can see the names of various extensions by using + * phpinfo or if you're using the + * CGI or CLI version of + * PHP you can use the -m switch to + * list all available extensions: + *

+ * @return bool true if the extension identified by name + * is loaded, false otherwise. + * + * @jms-builtin + */ +function extension_loaded ($name) {} + +/** + * Returns an array with the names of the functions of a module + * @link http://www.php.net/manual/en/function.get-extension-funcs.php + * @param module_name string

+ * The module name. + *

+ *

+ * This parameter must be in lowercase. + *

+ * @return array|false an array with all the functions, or false if + * module_name is not a valid extension. + * + * @jms-builtin + */ +function get_extension_funcs ($module_name) {} + +/** + * Returns an associative array with the names of all the constants and their values + * @link http://www.php.net/manual/en/function.get-defined-constants.php + * @param categorize bool[optional]

+ * Causing this function to return a multi-dimensional + * array with categories in the keys of the first dimension and constants + * and their values in the second dimension. + * ]]> + * &example.outputs.similar; + * Array + * ( + * [E_ERROR] => 1 + * [E_WARNING] => 2 + * [E_PARSE] => 4 + * [E_NOTICE] => 8 + * [E_CORE_ERROR] => 16 + * [E_CORE_WARNING] => 32 + * [E_COMPILE_ERROR] => 64 + * [E_COMPILE_WARNING] => 128 + * [E_USER_ERROR] => 256 + * [E_USER_WARNING] => 512 + * [E_USER_NOTICE] => 1024 + * [E_ALL] => 2047 + * [TRUE] => 1 + * ) + * [pcre] => Array + * ( + * [PREG_PATTERN_ORDER] => 1 + * [PREG_SET_ORDER] => 2 + * [PREG_OFFSET_CAPTURE] => 256 + * [PREG_SPLIT_NO_EMPTY] => 1 + * [PREG_SPLIT_DELIM_CAPTURE] => 2 + * [PREG_SPLIT_OFFSET_CAPTURE] => 4 + * [PREG_GREP_INVERT] => 1 + * ) + * [user] => Array + * ( + * [MY_CONSTANT] => 1 + * ) + * ) + * ]]> + *

+ * @return array + * + * @jms-builtin + */ +function get_defined_constants ($categorize = null) {} + +/** + * Generates a backtrace + * @link http://www.php.net/manual/en/function.debug-backtrace.php + * @param provide_object bool[optional]

+ * Whether or not to populate the "object" index. + *

+ * @return array an associative array. The possible returned elements + * are as follows: + *

+ *

+ * + * Possible returned elements from debug_backtrace + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
&Name;&Type;&Description;
functionstring + * The current function name. See also + * __FUNCTION__. + *
lineinteger + * The current line number. See also + * __LINE__. + *
filestring + * The current file name. See also + * __FILE__. + *
classstring + * The current class name. See also + * __CLASS__ + *
objectobject + * The current object. + *
typestring + * The current call type. If a method call, "->" is returned. If a static + * method call, "::" is returned. If a function call, nothing is returned. + *
argsarray + * If inside a function, this lists the functions arguments. If + * inside an included file, this lists the included file name(s). + *
+ * + * @jms-builtin + */ +function debug_backtrace ($provide_object = null) {} + +/** + * Prints a backtrace + * @link http://www.php.net/manual/en/function.debug-print-backtrace.php + * @return void + * + * @jms-builtin + */ +function debug_print_backtrace () {} + +/** @jms-builtin */ +class stdClass { +} + +/** @jms-builtin */ +class Exception { + protected $message; + private $string; + protected $code; + protected $file; + protected $line; + private $trace; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message = null, $code = null) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class ErrorException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + protected $severity; + + + /** + * @param message[optional] + * @param code[optional] + * @param severity[optional] + * @param filename[optional] + * @param lineno[optional] + */ + public function __construct ($message = null, $code = null, $severity = null, $filename = null, $lineno = null) {} + + final public function getSeverity () {} + + final private function __clone () {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +interface Traversable { +} + +interface IteratorAggregate extends Traversable { + + abstract public function getIterator () {} + +} + +interface Iterator extends Traversable { + + abstract public function current () {} + + abstract public function next () {} + + abstract public function key () {} + + abstract public function valid () {} + + abstract public function rewind () {} + +} + +interface ArrayAccess { + + /** + * @param offset + */ + abstract public function offsetExists ($offset) {} + + /** + * @param offset + */ + abstract public function offsetGet ($offset) {} + + /** + * @param offset + * @param value + */ + abstract public function offsetSet ($offset, $value) {} + + /** + * @param offset + */ + abstract public function offsetUnset ($offset) {} + +} + +interface Serializable { + + abstract public function serialize () {} + + /** + * @param serialized + */ + abstract public function unserialize ($serialized) {} + +} + + +/** + * Fatal run-time errors. These indicate errors that can not be + * recovered from, such as a memory allocation problem. + * Execution of the script is halted. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_ERROR', 1); + +/** + * Catchable fatal error. It indicates that a probably dangerous error + * occured, but did not leave the Engine in an unstable state. If the error + * is not caught by a user defined handle (see also + * set_error_handler), the application aborts as it + * was an E_ERROR. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_RECOVERABLE_ERROR', 4096); + +/** + * Run-time warnings (non-fatal errors). Execution of the script is not + * halted. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_WARNING', 2); + +/** + * Compile-time parse errors. Parse errors should only be generated by + * the parser. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_PARSE', 4); + +/** + * Run-time notices. Indicate that the script encountered something that + * could indicate an error, but could also happen in the normal course of + * running a script. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_NOTICE', 8); + +/** + * Enable to have PHP suggest changes + * to your code which will ensure the best interoperability + * and forward compatibility of your code. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_STRICT', 2048); + +/** + * Fatal errors that occur during PHP's initial startup. This is like an + * E_ERROR, except it is generated by the core of PHP. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_CORE_ERROR', 16); + +/** + * Warnings (non-fatal errors) that occur during PHP's initial startup. + * This is like an E_WARNING, except it is generated + * by the core of PHP. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_CORE_WARNING', 32); + +/** + * Fatal compile-time errors. This is like an E_ERROR, + * except it is generated by the Zend Scripting Engine. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_COMPILE_ERROR', 64); + +/** + * Compile-time warnings (non-fatal errors). This is like an + * E_WARNING, except it is generated by the Zend + * Scripting Engine. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_COMPILE_WARNING', 128); + +/** + * User-generated error message. This is like an + * E_ERROR, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_ERROR', 256); + +/** + * User-generated warning message. This is like an + * E_WARNING, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_WARNING', 512); + +/** + * User-generated notice message. This is like an + * E_NOTICE, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_NOTICE', 1024); + +/** + * All errors and warnings, as supported, except of level + * E_STRICT. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_ALL', 6143); +define ('TRUE', true); +define ('FALSE', false); +define ('NULL', null); +define ('ZEND_THREAD_SAFE', false); +define ('PHP_VERSION', "5.2.13"); +define ('PHP_MAJOR_VERSION', 5); +define ('PHP_MINOR_VERSION', 2); +define ('PHP_RELEASE_VERSION', 13); +define ('PHP_EXTRA_VERSION', ""); +define ('PHP_VERSION_ID', 50213); +define ('PHP_ZTS', 0); +define ('PHP_DEBUG', 0); +define ('PHP_OS', "Linux"); +define ('PHP_SAPI', "cli"); +define ('DEFAULT_INCLUDE_PATH', ".:/usr/local/zend/share/pear"); +define ('PEAR_INSTALL_DIR', "/usr/local/zend/share/pear"); +define ('PEAR_EXTENSION_DIR', "/usr/local/zend/lib/php/20060613"); +define ('PHP_EXTENSION_DIR', "/usr/local/zend/lib/php/20060613"); +define ('PHP_PREFIX', "/usr/local/zend"); +define ('PHP_BINDIR', "/usr/local/zend/bin"); +define ('PHP_LIBDIR', "/usr/local/zend/lib/php"); +define ('PHP_DATADIR', "${prefix}/share"); +define ('PHP_SYSCONFDIR', "/usr/local/zend/etc"); +define ('PHP_LOCALSTATEDIR', "/usr/local/zend/var"); +define ('PHP_CONFIG_FILE_PATH', "/usr/local/zend/etc"); +define ('PHP_CONFIG_FILE_SCAN_DIR', ""); +define ('PHP_SHLIB_SUFFIX', "so"); +define ('PHP_EOL', "\n"); +define ('PHP_INT_MAX', 2147483647); +define ('PHP_INT_SIZE', 4); +define ('PHP_OUTPUT_HANDLER_START', 1); +define ('PHP_OUTPUT_HANDLER_CONT', 2); +define ('PHP_OUTPUT_HANDLER_END', 4); +define ('UPLOAD_ERR_OK', 0); +define ('UPLOAD_ERR_INI_SIZE', 1); +define ('UPLOAD_ERR_FORM_SIZE', 2); +define ('UPLOAD_ERR_PARTIAL', 3); +define ('UPLOAD_ERR_NO_FILE', 4); +define ('UPLOAD_ERR_NO_TMP_DIR', 6); +define ('UPLOAD_ERR_CANT_WRITE', 7); +define ('UPLOAD_ERR_EXTENSION', 8); +define ('DEBUGGER_VERSION', 5.3); +define ('STDIN', "Resource id #1"); +define ('STDOUT', "Resource id #2"); +define ('STDERR', "Resource id #3"); + +/** + * The full path and filename of the file. If used inside an include, + * the name of the included file is returned. + * Since PHP 4.0.2, __FILE__ always contains an + * absolute path with symlinks resolved whereas in older versions it contained relative path + * under some circumstances. + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__FILE__', null); + +/** + * The current line number of the file. + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__LINE__', null); + +/** + * The class name. (Added in PHP 4.3.0) As of PHP 5 this constant + * returns the class name as it was declared (case-sensitive). In PHP + * 4 its value is always lowercased. + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__CLASS__', null); + +/** + * The function name. (Added in PHP 4.3.0) As of PHP 5 this constant + * returns the function name as it was declared (case-sensitive). In + * PHP 4 its value is always lowercased. + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__FUNCTION__', null); + +/** + * The class method name. (Added in PHP 5.0.0) The method name is + * returned as it was declared (case-sensitive). + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__METHOD__', null); +?> diff --git a/res/php-5.2-core-api/bcmath.php b/res/php-5.2-core-api/bcmath.php new file mode 100644 index 0000000..9b5861e --- /dev/null +++ b/res/php-5.2-core-api/bcmath.php @@ -0,0 +1,171 @@ + + * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional] + * @return string The sum of the two operands, as a string. + * + * @jms-builtin + */ +function bcadd ($left_operand, $right_operand, $scale = null) {} + +/** + * Subtract one arbitrary precision number from another + * @link http://www.php.net/manual/en/function.bcsub.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional] + * @return string The result of the subtraction, as a string. + * + * @jms-builtin + */ +function bcsub ($left_operand, $right_operand, $scale = null) {} + +/** + * Multiply two arbitrary precision number + * @link http://www.php.net/manual/en/function.bcmul.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional] + * @return string the result as a string. + * + * @jms-builtin + */ +function bcmul ($left_operand, $right_operand, $scale = null) {} + +/** + * Divide two arbitrary precision numbers + * @link http://www.php.net/manual/en/function.bcdiv.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional] + * @return string the result of the division as a string, or &null; if + * right_operand is 0. + * + * @jms-builtin + */ +function bcdiv ($left_operand, $right_operand, $scale = null) {} + +/** + * Get modulus of an arbitrary precision number + * @link http://www.php.net/manual/en/function.bcmod.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param modulus string

+ * The modulus, as a string. + *

+ * @return string the modulus as a string, or &null; if + * modulus is 0. + * + * @jms-builtin + */ +function bcmod ($left_operand, $modulus) {} + +/** + * Raise an arbitrary precision number to another + * @link http://www.php.net/manual/en/function.bcpow.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional] + * @return string the result as a string. + * + * @jms-builtin + */ +function bcpow ($left_operand, $right_operand, $scale = null) {} + +/** + * Get the square root of an arbitrary precision number + * @link http://www.php.net/manual/en/function.bcsqrt.php + * @param operand string

+ * The operand, as a string. + *

+ * @param scale int[optional] + * @return string the square root as a string, or &null; if + * operand is negative. + * + * @jms-builtin + */ +function bcsqrt ($operand, $scale = null) {} + +/** + * Set default scale parameter for all bc math functions + * @link http://www.php.net/manual/en/function.bcscale.php + * @param scale int

+ * The scale factor. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function bcscale ($scale) {} + +/** + * Compare two arbitrary precision numbers + * @link http://www.php.net/manual/en/function.bccomp.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional]

+ * The optional scale parameter is used to set the + * number of digits after the decimal place which will be used in the + * comparison. + *

+ * @return int 0 if the two operands are equal, 1 if the + * left_operand is larger than the + * right_operand, -1 otherwise. + * + * @jms-builtin + */ +function bccomp ($left_operand, $right_operand, $scale = null) {} + +/** + * Raise an arbitrary precision number to another, reduced by a specified modulus + * @link http://www.php.net/manual/en/function.bcpowmod.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param modulus string

+ * The modulus, as a string. + *

+ * @param scale int[optional] + * @return string the result as a string, or &null; if modulus + * is 0. + * + * @jms-builtin + */ +function bcpowmod ($left_operand, $right_operand, $modulus, $scale = null) {} + +// End of bcmath v. +?> diff --git a/res/php-5.2-core-api/bz2.php b/res/php-5.2-core-api/bz2.php new file mode 100644 index 0000000..e1c0e44 --- /dev/null +++ b/res/php-5.2-core-api/bz2.php @@ -0,0 +1,176 @@ + + * The name of the file to open. + *

+ * @param mode string

+ * Similar to the fopen function, only 'r' (read) + * and 'w' (write) are supported. Everything else will cause bzopen + * to return false. + *

+ * @return resource If the open fails, bzopen returns false, otherwise + * it returns a pointer to the newly opened file. + * + * @jms-builtin + */ +function bzopen ($filename, $mode) {} + +/** + * Binary safe bzip2 file read + * @link http://www.php.net/manual/en/function.bzread.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @param length int[optional]

+ * If not specified, bzread will read 1024 + * (uncompressed) bytes at a time. + *

+ * @return string the uncompressed data, or false on error. + * + * @jms-builtin + */ +function bzread ($bz, $length = null) {} + +/** + * Binary safe bzip2 file write + * @link http://www.php.net/manual/en/function.bzwrite.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @param data string

+ * The written data. + *

+ * @param length int[optional]

+ * If supplied, writing will stop after length + * (uncompressed) bytes have been written or the end of + * data is reached, whichever comes first. + *

+ * @return int the number of bytes written, or false on error. + * + * @jms-builtin + */ +function bzwrite ($bz, $data, $length = null) {} + +/** + * Force a write of all buffered data + * @link http://www.php.net/manual/en/function.bzflush.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return int Returns true on success or false on failure. + * + * @jms-builtin + */ +function bzflush ($bz) {} + +/** + * Close a bzip2 file + * @link http://www.php.net/manual/en/function.bzclose.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return int Returns true on success or false on failure. + * + * @jms-builtin + */ +function bzclose ($bz) {} + +/** + * Returns a bzip2 error number + * @link http://www.php.net/manual/en/function.bzerrno.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return int the error number as an integer. + * + * @jms-builtin + */ +function bzerrno ($bz) {} + +/** + * Returns a bzip2 error string + * @link http://www.php.net/manual/en/function.bzerrstr.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return string a string containing the error message. + * + * @jms-builtin + */ +function bzerrstr ($bz) {} + +/** + * Returns the bzip2 error number and error string in an array + * @link http://www.php.net/manual/en/function.bzerror.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return array an associative array, with the error code in the + * errno entry, and the error message in the + * errstr entry. + * + * @jms-builtin + */ +function bzerror ($bz) {} + +/** + * Compress a string into bzip2 encoded data + * @link http://www.php.net/manual/en/function.bzcompress.php + * @param source string

+ * The string to compress. + *

+ * @param blocksize int[optional]

+ * Specifies the blocksize used during compression and should be a number + * from 1 to 9 with 9 giving the best compression, but using more + * resources to do so. + *

+ * @param workfactor int[optional]

+ * Controls how the compression phase behaves when presented with worst + * case, highly repetitive, input data. The value can be between 0 and + * 250 with 0 being a special case. + *

+ *

+ * Regardless of the workfactor, the generated + * output is the same. + *

+ * @return mixed The compressed string or number of error in case of error. + * + * @jms-builtin + */ +function bzcompress ($source, $blocksize = null, $workfactor = null) {} + +/** + * Decompresses bzip2 encoded data + * @link http://www.php.net/manual/en/function.bzdecompress.php + * @param source string

+ * The string to decompress. + *

+ * @param small int[optional]

+ * If true, an alternative decompression algorithm will be used which + * uses less memory (the maximum memory requirement drops to around 2300K) + * but works at roughly half the speed. + *

+ *

+ * See the bzip2 documentation for more + * information about this feature. + *

+ * @return mixed The decompressed string or number of error in case of error. + * + * @jms-builtin + */ +function bzdecompress ($source, $small = null) {} + +// End of bz2 v. +?> diff --git a/res/php-5.2-core-api/calendar.php b/res/php-5.2-core-api/calendar.php new file mode 100644 index 0000000..8950c73 --- /dev/null +++ b/res/php-5.2-core-api/calendar.php @@ -0,0 +1,336 @@ + + * A julian day number as integer + *

+ * @return string The gregorian date as a string in the form "month/day/year" + * + * @jms-builtin + */ +function jdtogregorian ($julianday) {} + +/** + * Converts a Gregorian date to Julian Day Count + * @link http://www.php.net/manual/en/function.gregoriantojd.php + * @param month int

+ * The month as a number from 1 (for January) to 12 (for December) + *

+ * @param day int

+ * The day as a number from 1 to 31 + *

+ * @param year int

+ * The year as a number between -4714 and 9999 + *

+ * @return int The julian day for the given gregorian date as an integer. + * + * @jms-builtin + */ +function gregoriantojd ($month, $day, $year) {} + +/** + * Converts a Julian Day Count to a Julian Calendar Date + * @link http://www.php.net/manual/en/function.jdtojulian.php + * @param julianday int

+ * A julian day number as integer + *

+ * @return string The julian date as a string in the form "month/day/year" + * + * @jms-builtin + */ +function jdtojulian ($julianday) {} + +/** + * Converts a Julian Calendar date to Julian Day Count + * @link http://www.php.net/manual/en/function.juliantojd.php + * @param month int

+ * The month as a number from 1 (for January) to 12 (for December) + *

+ * @param day int

+ * The day as a number from 1 to 31 + *

+ * @param year int

+ * The year as a number between -4713 and 9999 + *

+ * @return int The julian day for the given julian date as an integer. + * + * @jms-builtin + */ +function juliantojd ($month, $day, $year) {} + +/** + * Converts a Julian day count to a Jewish calendar date + * @link http://www.php.net/manual/en/function.jdtojewish.php + * @param juliandaycount int + * @param hebrew bool[optional]

+ * If the hebrew parameter is set to true, the + * fl parameter is used for Hebrew, string based, + * output format. + *

+ * @param fl int[optional]

+ * The available formats are: + * CAL_JEWISH_ADD_ALAFIM_GERESH, + * CAL_JEWISH_ADD_ALAFIM, + * CAL_JEWISH_ADD_GERESHAYIM. + *

+ * @return string The jewish date as a string in the form "month/day/year" + * + * @jms-builtin + */ +function jdtojewish ($juliandaycount, $hebrew = null, $fl = null) {} + +/** + * Converts a date in the Jewish Calendar to Julian Day Count + * @link http://www.php.net/manual/en/function.jewishtojd.php + * @param month int

+ * The month as a number from 1 to 13 + *

+ * @param day int

+ * The day as a number from 1 to 30 + *

+ * @param year int

+ * The year as a number between 1 and 9999 + *

+ * @return int The julian day for the given jewish date as an integer. + * + * @jms-builtin + */ +function jewishtojd ($month, $day, $year) {} + +/** + * Converts a Julian Day Count to the French Republican Calendar + * @link http://www.php.net/manual/en/function.jdtofrench.php + * @param juliandaycount int + * @return string The french revolution date as a string in the form "month/day/year" + * + * @jms-builtin + */ +function jdtofrench ($juliandaycount) {} + +/** + * Converts a date from the French Republican Calendar to a Julian Day Count + * @link http://www.php.net/manual/en/function.frenchtojd.php + * @param month int

+ * The month as a number from 1 (for Vendémiaire) to 13 (for the period of 5-6 days at the end of each year) + *

+ * @param day int

+ * The day as a number from 1 to 30 + *

+ * @param year int

+ * The year as a number between 1 and 14 + *

+ * @return int The julian day for the given french revolution date as an integer. + * + * @jms-builtin + */ +function frenchtojd ($month, $day, $year) {} + +/** + * Returns the day of the week + * @link http://www.php.net/manual/en/function.jddayofweek.php + * @param julianday int

+ * A julian day number as integer + *

+ * @param mode int[optional] + * Calendar week modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ModeMeaning
0 (Default) + * Return the day number as an int (0=Sunday, 1=Monday, etc) + *
1 + * Returns string containing the day of week + * (English-Gregorian) + *
2 + * Return a string containing the abbreviated day of week + * (English-Gregorian) + *
+ * @return mixed The gregorian weekday as either an integer or string. + * + * @jms-builtin + */ +function jddayofweek ($julianday, $mode = null) {} + +/** + * Returns a month name + * @link http://www.php.net/manual/en/function.jdmonthname.php + * @param julianday int + * @param mode int + * @return string The month name for the given Julian Day and calendar. + * + * @jms-builtin + */ +function jdmonthname ($julianday, $mode) {} + +/** + * Get Unix timestamp for midnight on Easter of a given year + * @link http://www.php.net/manual/en/function.easter-date.php + * @param year int[optional]

+ * The year as a number between 1970 an 2037 + *

+ * @return int The easter date as a unix timestamp. + * + * @jms-builtin + */ +function easter_date ($year = null) {} + +/** + * Get number of days after March 21 on which Easter falls for a given year + * @link http://www.php.net/manual/en/function.easter-days.php + * @param year int[optional]

+ * The year as a positive number + *

+ * @param method int[optional]

+ * Allows to calculate easter dates based + * on the Gregorian calendar during the years 1582 - 1752 when set to + * CAL_EASTER_ROMAN. See the calendar constants for more valid + * constants. + *

+ * @return int The number of days after March 21st that the Easter Sunday + * is in the given year. + * + * @jms-builtin + */ +function easter_days ($year = null, $method = null) {} + +/** + * Convert Unix timestamp to Julian Day + * @link http://www.php.net/manual/en/function.unixtojd.php + * @param timestamp int[optional]

+ * A unix timestamp to convert. + *

+ * @return int A julian day number as integer. + * + * @jms-builtin + */ +function unixtojd ($timestamp = null) {} + +/** + * Convert Julian Day to Unix timestamp + * @link http://www.php.net/manual/en/function.jdtounix.php + * @param jday int

+ * A julian day number between 2440588 and 2465342. + *

+ * @return int The unix timestamp for the start of the given julian day. + * + * @jms-builtin + */ +function jdtounix ($jday) {} + +/** + * Converts from a supported calendar to Julian Day Count + * @link http://www.php.net/manual/en/function.cal-to-jd.php + * @param calendar int

+ * Calendar to convert from, one of + * CAL_GREGORIAN, + * CAL_JULIAN, + * CAL_JEWISH or + * CAL_FRENCH. + *

+ * @param month int

+ * The month as a number, the valid range depends + * on the calendar + *

+ * @param day int

+ * The day as a number, the valid range depends + * on the calendar + *

+ * @param year int

+ * The year as a number, the valid range depends + * on the calendar + *

+ * @return int A Julian Day number. + * + * @jms-builtin + */ +function cal_to_jd ($calendar, $month, $day, $year) {} + +/** + * Converts from Julian Day Count to a supported calendar + * @link http://www.php.net/manual/en/function.cal-from-jd.php + * @param jd int

+ * Julian day as integer + *

+ * @param calendar int

+ * Calendar to convert to + *

+ * @return array an array containing calendar information like month, day, year, + * day of week, abbreviated and full names of weekday and month and the + * date in string form "month/day/year". + * + * @jms-builtin + */ +function cal_from_jd ($jd, $calendar) {} + +/** + * Return the number of days in a month for a given year and calendar + * @link http://www.php.net/manual/en/function.cal-days-in-month.php + * @param calendar int

+ * Calendar to use for calculation + *

+ * @param month int

+ * Month in the selected calendar + *

+ * @param year int

+ * Year in the selected calendar + *

+ * @return int The length in days of the selected month in the given calendar + * + * @jms-builtin + */ +function cal_days_in_month ($calendar, $month, $year) {} + +/** + * Returns information about a particular calendar + * @link http://www.php.net/manual/en/function.cal-info.php + * @param calendar int[optional]

+ * Calendar to return information for. If no calendar is specified + * information about all calendars is returned. + *

+ * @return array + * + * @jms-builtin + */ +function cal_info ($calendar = null) {} + +define ('CAL_GREGORIAN', 0); +define ('CAL_JULIAN', 1); +define ('CAL_JEWISH', 2); +define ('CAL_FRENCH', 3); +define ('CAL_NUM_CALS', 4); +define ('CAL_DOW_DAYNO', 0); +define ('CAL_DOW_SHORT', 1); +define ('CAL_DOW_LONG', 2); +define ('CAL_MONTH_GREGORIAN_SHORT', 0); +define ('CAL_MONTH_GREGORIAN_LONG', 1); +define ('CAL_MONTH_JULIAN_SHORT', 2); +define ('CAL_MONTH_JULIAN_LONG', 3); +define ('CAL_MONTH_JEWISH', 4); +define ('CAL_MONTH_FRENCH', 5); +define ('CAL_EASTER_DEFAULT', 0); +define ('CAL_EASTER_ROMAN', 1); +define ('CAL_EASTER_ALWAYS_GREGORIAN', 2); +define ('CAL_EASTER_ALWAYS_JULIAN', 3); +define ('CAL_JEWISH_ADD_ALAFIM_GERESH', 2); +define ('CAL_JEWISH_ADD_ALAFIM', 4); +define ('CAL_JEWISH_ADD_GERESHAYIM', 8); + +// End of calendar v. +?> diff --git a/res/php-5.2-core-api/com_dotnet.php b/res/php-5.2-core-api/com_dotnet.php new file mode 100644 index 0000000..b4238ff --- /dev/null +++ b/res/php-5.2-core-api/com_dotnet.php @@ -0,0 +1,895 @@ + + * The variant. + *

+ * @param value mixed

+ *

+ * @return void + * + * @jms-builtin + */ +function variant_set (variant $variant, $value) {} + +/** + * "Adds" two variant values together and returns the result + * @link http://www.php.net/manual/en/function.variant-add.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed the result. + * + * @jms-builtin + */ +function variant_add ($left, $right) {} + +/** + * concatenates two variant values together and returns the result + * @link http://www.php.net/manual/en/function.variant-cat.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed the result of the concatenation. + * + * @jms-builtin + */ +function variant_cat ($left, $right) {} + +/** + * Subtracts the value of the right variant from the left variant value + * @link http://www.php.net/manual/en/function.variant-sub.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant Subtraction Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IfThen
Both expressions are of the string typeSubtraction
One expression is a string type and the other a + * characterSubtraction
One expression is numeric and the other is a stringSubtraction.
Both expressions are numericSubtraction
Either expression is NULLNULL is returned
Both expressions are emptyEmpty string is returned
+ * + * @jms-builtin + */ +function variant_sub ($left, $right) {} + +/** + * Multiplies the values of the two variants + * @link http://www.php.net/manual/en/function.variant-mul.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant Multiplication Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IfThen
Both expressions are of the string, date, character, boolean typeMultiplication
One expression is a string type and the other a + * characterMultiplication
One expression is numeric and the other is a stringMultiplication
Both expressions are numericMultiplication
Either expression is NULLNULL is returned
Both expressions are emptyEmpty string is returned
+ * + * @jms-builtin + */ +function variant_mul ($left, $right) {} + +/** + * Performs a bitwise AND operation between two variants + * @link http://www.php.net/manual/en/function.variant-and.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant AND Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
If left isIf right isthen the result is
truetruetrue
truefalsefalse
true&null;&null;
falsetruefalse
falsefalsefalse
false&null;false
&null;true&null;
&null;falsefalse
&null;&null;&null;
+ * + * @jms-builtin + */ +function variant_and ($left, $right) {} + +/** + * Returns the result from dividing two variants + * @link http://www.php.net/manual/en/function.variant-div.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant Division Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IfThen
Both expressions are of the string, date, character, boolean typeDouble is returned
One expression is a string type and the other a + * characterDivision and a double is returned
One expression is numeric and the other is a stringDivision and a double is returned.
Both expressions are numericDivision and a double is returned
Either expression is NULLNULL is returned
right is empty and + * left is anything but emptyA com_exception with code DISP_E_DIVBYZERO + * is thrown
left is empty and + * right is anything but empty.0 as type double is returned
Both expressions are emptyA com_exception with code DISP_E_OVERFLOW + * is thrown
+ * + * @jms-builtin + */ +function variant_div ($left, $right) {} + +/** + * Performs a bitwise equivalence on two variants + * @link http://www.php.net/manual/en/function.variant-eqv.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed If each bit in left is equal to the corresponding + * bit in right then true is returned, otherwise + * false is returned. + * + * @jms-builtin + */ +function variant_eqv ($left, $right) {} + +/** + * Converts variants to integers and then returns the result from dividing them + * @link http://www.php.net/manual/en/function.variant-idiv.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant Integer Division Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IfThen
Both expressions are of the string, date, character, boolean typeDivision and integer is returned
One expression is a string type and the other a + * characterDivision
One expression is numeric and the other is a stringDivision
Both expressions are numericDivision
Either expression is NULLNULL is returned
Both expressions are emptyA com_exception with code DISP_E_DIVBYZERO + * is thrown
+ * + * @jms-builtin + */ +function variant_idiv ($left, $right) {} + +/** + * Performs a bitwise implication on two variants + * @link http://www.php.net/manual/en/function.variant-imp.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant Implication Table + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
If left isIf right isthen the result is
truetruetrue
truefalsetrue
true&null;true
falsetruetrue
falsefalsetrue
false&null;true
&null;truetrue
&null;false&null;
&null;&null;&null;
+ * + * @jms-builtin + */ +function variant_imp ($left, $right) {} + +/** + * Divides two variants and returns only the remainder + * @link http://www.php.net/manual/en/function.variant-mod.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed the remainder of the division. + * + * @jms-builtin + */ +function variant_mod ($left, $right) {} + +/** + * Performs a logical disjunction on two variants + * @link http://www.php.net/manual/en/function.variant-or.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant OR Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
If left isIf right isthen the result is
truetruetrue
truefalsetrue
true&null;true
falsetruetrue
falsefalsefalse
false&null;&null;
&null;truetrue
&null;false&null;
&null;&null;&null;
+ * + * @jms-builtin + */ +function variant_or ($left, $right) {} + +/** + * Returns the result of performing the power function with two variants + * @link http://www.php.net/manual/en/function.variant-pow.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed the result of left to the power of + * right. + * + * @jms-builtin + */ +function variant_pow ($left, $right) {} + +/** + * Performs a logical exclusion on two variants + * @link http://www.php.net/manual/en/function.variant-xor.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant XOR Rules + * + * + * + * + * + * + * + * + * + * + *
If left isIf right isthen the result is
truetruefalse
truefalsetrue
falsetruetrue
falsefalsefalse
&null;&null;&null;
+ * + * @jms-builtin + */ +function variant_xor ($left, $right) {} + +/** + * Returns the absolute value of a variant + * @link http://www.php.net/manual/en/function.variant-abs.php + * @param val mixed

+ * The variant. + *

+ * @return mixed the absolute value of val. + * + * @jms-builtin + */ +function variant_abs ($val) {} + +/** + * Returns the integer portion of a variant + * @link http://www.php.net/manual/en/function.variant-fix.php + * @param variant mixed

+ * The variant. + *

+ * @return mixed If variant is negative, then the first negative + * integer greater than or equal to the variant is returned, otherwise + * returns the integer portion of the value of + * variant. + * + * @jms-builtin + */ +function variant_fix ($variant) {} + +/** + * Returns the integer portion of a variant + * @link http://www.php.net/manual/en/function.variant-int.php + * @param variant mixed

+ * The variant. + *

+ * @return mixed If variant is negative, then the first negative + * integer greater than or equal to the variant is returned, otherwise + * returns the integer portion of the value of + * variant. + * + * @jms-builtin + */ +function variant_int ($variant) {} + +/** + * Performs logical negation on a variant + * @link http://www.php.net/manual/en/function.variant-neg.php + * @param variant mixed

+ * The variant. + *

+ * @return mixed the result of the logical negation. + * + * @jms-builtin + */ +function variant_neg ($variant) {} + +/** + * Performs bitwise not negation on a variant + * @link http://www.php.net/manual/en/function.variant-not.php + * @param variant mixed

+ * The variant. + *

+ * @return mixed the bitwise not negation. If variant is + * &null;, the result will also be &null;. + * + * @jms-builtin + */ +function variant_not ($variant) {} + +/** + * Rounds a variant to the specified number of decimal places + * @link http://www.php.net/manual/en/function.variant-round.php + * @param variant mixed

+ * The variant. + *

+ * @param decimals int

+ * Number of decimal places. + *

+ * @return mixed the rounded value. + * + * @jms-builtin + */ +function variant_round ($variant, $decimals) {} + +/** + * Compares two variants + * @link http://www.php.net/manual/en/function.variant-cmp.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @param lcid int[optional]

+ * A valid Locale Identifier to use when comparing strings (this affects + * string collation). + *

+ * @param flags int[optional]

+ * flags can be one or more of the following values + * OR'd together, and affects string comparisons: + * + * Variant Comparision Flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
valuemeaning
NORM_IGNORECASECompare case insensitively
NORM_IGNORENONSPACEIgnore nonspacing characters
NORM_IGNORESYMBOLSIgnore symbols
NORM_IGNOREWIDTHIgnore string width
NORM_IGNOREKANATYPEIgnore Kana type
NORM_IGNOREKASHIDAIgnore Arabic kashida characters
+ *

+ * @return int one of the following: + * + * Variant Comparision Results + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
valuemeaning
VARCMP_LTleft is less than + * right + *
VARCMP_EQleft is equal to + * right + *
VARCMP_GTleft is greater than + * right + *
VARCMP_NULLEither left, + * right or both are &null; + *
+ * + * @jms-builtin + */ +function variant_cmp ($left, $right, $lcid = null, $flags = null) {} + +/** + * Converts a variant date/time value to Unix timestamp + * @link http://www.php.net/manual/en/function.variant-date-to-timestamp.php + * @param variant variant

+ * The variant. + *

+ * @return int a unix timestamp. + * + * @jms-builtin + */ +function variant_date_to_timestamp (variant $variant) {} + +/** + * Returns a variant date representation of a Unix timestamp + * @link http://www.php.net/manual/en/function.variant-date-from-timestamp.php + * @param timestamp int

+ * A unix timestamp. + *

+ * @return variant a VT_DATE variant. + * + * @jms-builtin + */ +function variant_date_from_timestamp ($timestamp) {} + +/** + * Returns the type of a variant object + * @link http://www.php.net/manual/en/function.variant-get-type.php + * @param variant variant

+ * The variant object. + *

+ * @return int This function returns an integer value that indicates the type of + * variant, which can be an instance of + * , or + * classes. The return value can be compared + * to one of the VT_XXX constants. + *

+ *

+ * The return value for COM and DOTNET objects will usually be + * VT_DISPATCH; the only reason this function works for + * those classes is because COM and DOTNET are descendants of VARIANT. + *

+ *

+ * In PHP versions prior to 5, you could obtain this information from + * instances of the VARIANT class ONLY, by reading a fake + * type property. See the class for more information on + * this. + * + * @jms-builtin + */ +function variant_get_type (variant $variant) {} + +/** + * Convert a variant into another type "in-place" + * @link http://www.php.net/manual/en/function.variant-set-type.php + * @param variant variant

+ * The variant. + *

+ * @param type int

+ *

+ * @return void + * + * @jms-builtin + */ +function variant_set_type (variant $variant, $type) {} + +/** + * Convert a variant into a new variant object of another type + * @link http://www.php.net/manual/en/function.variant-cast.php + * @param variant variant

+ * The variant. + *

+ * @param type int

+ * type should be one of the + * VT_XXX constants. + *

+ * @return variant a VT_DATE variant. + * + * @jms-builtin + */ +function variant_cast (variant $variant, $type) {} + +/** + * Generate a globally unique identifier (GUID) + * @link http://www.php.net/manual/en/function.com-create-guid.php + * @return string the GUID as a string. + * + * @jms-builtin + */ +function com_create_guid () {} + +/** + * Connect events from a COM object to a PHP object + * @link http://www.php.net/manual/en/function.com-event-sink.php + * @param comobject variant

+ *

+ * @param sinkobject object

+ * sinkobject should be an instance of a class with + * methods named after those of the desired dispinterface; you may use + * com_print_typeinfo to help generate a template class + * for this purpose. + *

+ * @param sinkinterface mixed[optional]

+ * PHP will attempt to use the default dispinterface type specified by + * the typelibrary associated with comobject, but + * you may override this choice by setting + * sinkinterface to the name of the dispinterface + * that you want to use. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function com_event_sink (variant $comobject, $sinkobject, $sinkinterface = null) {} + +/** + * Print out a PHP class definition for a dispatchable interface + * @link http://www.php.net/manual/en/function.com-print-typeinfo.php + * @param comobject object

+ * comobject should be either an instance of a COM + * object, or be the name of a typelibrary (which will be resolved according + * to the rules set out in com_load_typelib). + *

+ * @param dispinterface string[optional]

+ * The name of an IDispatch descendant interface that you want to display. + *

+ * @param wantsink bool[optional]

+ * If set to true, the corresponding sink interface will be displayed + * instead. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function com_print_typeinfo ($comobject, $dispinterface = null, $wantsink = null) {} + +/** + * Process COM messages, sleeping for up to timeoutms milliseconds + * @link http://www.php.net/manual/en/function.com-message-pump.php + * @param timeoutms int[optional]

+ * The timeout, in milliseconds. + *

+ *

+ * If you do not specify a value for timeoutms, + * then 0 will be assumed. A 0 value means that no waiting will be + * performed; if there are messages pending they will be dispatched as + * before; if there are no messages pending, the function will return + * false immediately without sleeping. + *

+ * @return bool If a message or messages arrives before the timeout, they will be + * dispatched, and the function will return true. If the timeout occurs and + * no messages were processed, the return value will be false. + * + * @jms-builtin + */ +function com_message_pump ($timeoutms = null) {} + +/** + * Loads a Typelib + * @link http://www.php.net/manual/en/function.com-load-typelib.php + * @param typelib_name string

+ * typelib_name can be one of the following: + *

+ * The filename of a .tlb file or the executable module + * that contains the type library. + *

+ * @param case_insensitive bool[optional]

+ * The case_insensitive behaves in the same way as + * the parameter with the same name in the define + * function. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function com_load_typelib ($typelib_name, $case_insensitive = null) {} + +/** + * Returns a handle to an already running instance of a COM object + * @link http://www.php.net/manual/en/function.com-get-active-object.php + * @param progid string

+ * progid must be either the ProgID or CLSID for + * the object that you want to access (for example + * Word.Application). + *

+ * @param code_page int[optional]

+ * Acts in precisely the same way that it does for the class. + *

+ * @return variant If the requested object is running, it will be returned to your script + * just like any other COM object. + * + * @jms-builtin + */ +function com_get_active_object ($progid, $code_page = null) {} + +define ('CLSCTX_INPROC_SERVER', 1); +define ('CLSCTX_INPROC_HANDLER', 2); +define ('CLSCTX_LOCAL_SERVER', 4); +define ('CLSCTX_REMOTE_SERVER', 16); +define ('CLSCTX_SERVER', 21); +define ('CLSCTX_ALL', 23); +define ('VT_NULL', 1); +define ('VT_EMPTY', 0); +define ('VT_UI1', 17); +define ('VT_I1', 16); +define ('VT_UI2', 18); +define ('VT_I2', 2); +define ('VT_UI4', 19); +define ('VT_I4', 3); +define ('VT_R4', 4); +define ('VT_R8', 5); +define ('VT_BOOL', 11); +define ('VT_ERROR', 10); +define ('VT_CY', 6); +define ('VT_DATE', 7); +define ('VT_BSTR', 8); +define ('VT_DECIMAL', 14); +define ('VT_UNKNOWN', 13); +define ('VT_DISPATCH', 9); +define ('VT_VARIANT', 12); +define ('VT_INT', 22); +define ('VT_UINT', 23); +define ('VT_ARRAY', 8192); +define ('VT_BYREF', 16384); +define ('CP_ACP', 0); +define ('CP_MACCP', 2); +define ('CP_OEMCP', 1); +define ('CP_UTF7', 65000); +define ('CP_UTF8', 65001); +define ('CP_SYMBOL', 42); +define ('CP_THREAD_ACP', 3); +define ('VARCMP_LT', 0); +define ('VARCMP_EQ', 1); +define ('VARCMP_GT', 2); +define ('VARCMP_NULL', 3); +define ('NORM_IGNORECASE', 1); +define ('NORM_IGNORENONSPACE', 2); +define ('NORM_IGNORESYMBOLS', 4); +define ('NORM_IGNOREWIDTH', 131072); +define ('NORM_IGNOREKANATYPE', 65536); +define ('DISP_E_DIVBYZERO', -2147352558); +define ('DISP_E_OVERFLOW', -2147352566); +define ('DISP_E_BADINDEX', -2147352565); +define ('MK_E_UNAVAILABLE', -2147221021); + +// End of com_dotnet v.0.1 +?> diff --git a/res/php-5.2-core-api/ctype.php b/res/php-5.2-core-api/ctype.php new file mode 100644 index 0000000..0e99752 --- /dev/null +++ b/res/php-5.2-core-api/ctype.php @@ -0,0 +1,156 @@ + + * The tested string. + *

+ * @return bool true if every character in text is either + * a letter or a digit, false otherwise. + * + * @jms-builtin + */ +function ctype_alnum ($text) {} + +/** + * Check for alphabetic character(s) + * @link http://www.php.net/manual/en/function.ctype-alpha.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * a letter from the current locale, false otherwise. + * + * @jms-builtin + */ +function ctype_alpha ($text) {} + +/** + * Check for control character(s) + * @link http://www.php.net/manual/en/function.ctype-cntrl.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * a control character from the current locale, false otherwise. + * + * @jms-builtin + */ +function ctype_cntrl ($text) {} + +/** + * Check for numeric character(s) + * @link http://www.php.net/manual/en/function.ctype-digit.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in the string + * text is a decimal digit, false otherwise. + * + * @jms-builtin + */ +function ctype_digit ($text) {} + +/** + * Check for lowercase character(s) + * @link http://www.php.net/manual/en/function.ctype-lower.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * a lowercase letter in the current locale. + * + * @jms-builtin + */ +function ctype_lower ($text) {} + +/** + * Check for any printable character(s) except space + * @link http://www.php.net/manual/en/function.ctype-graph.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * printable and actually creates visible output (no white space), false + * otherwise. + * + * @jms-builtin + */ +function ctype_graph ($text) {} + +/** + * Check for printable character(s) + * @link http://www.php.net/manual/en/function.ctype-print.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text + * will actually create output (including blanks). Returns false if + * text contains control characters or characters + * that do not have any output or control function at all. + * + * @jms-builtin + */ +function ctype_print ($text) {} + +/** + * Check for any printable character which is not whitespace or an + alphanumeric character + * @link http://www.php.net/manual/en/function.ctype-punct.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text + * is printable, but neither letter, digit or blank, false otherwise. + * + * @jms-builtin + */ +function ctype_punct ($text) {} + +/** + * Check for whitespace character(s) + * @link http://www.php.net/manual/en/function.ctype-space.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text + * creates some sort of white space, false otherwise. Besides the + * blank character this also includes tab, vertical tab, line feed, + * carriage return and form feed characters. + * + * @jms-builtin + */ +function ctype_space ($text) {} + +/** + * Check for uppercase character(s) + * @link http://www.php.net/manual/en/function.ctype-upper.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * an uppercase letter in the current locale. + * + * @jms-builtin + */ +function ctype_upper ($text) {} + +/** + * Check for character(s) representing a hexadecimal digit + * @link http://www.php.net/manual/en/function.ctype-xdigit.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * a hexadecimal 'digit', that is a decimal digit or a character from + * [A-Fa-f] , false otherwise. + * + * @jms-builtin + */ +function ctype_xdigit ($text) {} + +// End of ctype v. +?> diff --git a/res/php-5.2-core-api/curl.php b/res/php-5.2-core-api/curl.php new file mode 100644 index 0000000..ab7cbfa --- /dev/null +++ b/res/php-5.2-core-api/curl.php @@ -0,0 +1,1554 @@ + + * If provided, the CURLOPT_URL option will be set + * to its value. You can manually set this using the + * curl_setopt function. + *

+ * @return resource a cURL handle on success, false on errors. + * + * @jms-builtin + */ +function curl_init ($url = null) {} + +/** + * Copy a cURL handle along with all of its preferences + * @link http://www.php.net/manual/en/function.curl-copy-handle.php + * @param ch resource + * @return resource a new cURL handle. + * + * @jms-builtin + */ +function curl_copy_handle ($ch) {} + +/** + * Gets cURL version information + * @link http://www.php.net/manual/en/function.curl-version.php + * @param age int[optional]

+ *

+ * @return array an associative array with the following elements: + * + * Indice + * Value description + * + * + * version_number + * cURL 24 bit version number + * + * + * version + * cURL version number, as a string + * + * + * ssl_version_number + * OpenSSL 24 bit version number + * + * + * ssl_version + * OpenSSL version number, as a string + * + * + * libz_version + * zlib version number, as a string + * + * + * host + * Information about the host where cURL was built + * + * + * age + * + * + * + * features + * A bitmask of the CURL_VERSION_XXX constants + * + * + * protocols + * An array of protocols names supported by cURL + * + * + * @jms-builtin + */ +function curl_version ($age = null) {} + +/** + * Set an option for a cURL transfer + * @link http://www.php.net/manual/en/function.curl-setopt.php + * @param ch resource + * @param option int

+ * The CURLOPT_XXX option to set. + *

+ * @param value mixed

+ * The value to be set on option. + *

+ *

+ * value should be a bool for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_AUTOREFERER + * true to automatically set the Referer: field in + * requests where it follows a Location: redirect. + * + * + * + * + * CURLOPT_BINARYTRANSFER + * true to return the raw output when + * CURLOPT_RETURNTRANSFER is used. + * + * + * + * + * CURLOPT_COOKIESESSION + * true to mark this as a new cookie "session". It will force libcurl + * to ignore all cookies it is about to load that are "session cookies" + * from the previous session. By default, libcurl always stores and + * loads all cookies, independent if they are session cookies or not. + * Session cookies are cookies without expiry date and they are meant + * to be alive and existing for this "session" only. + * + * + * + * + * CURLOPT_CRLF + * true to convert Unix newlines to CRLF newlines + * on transfers. + * + * + * + * + * CURLOPT_DNS_USE_GLOBAL_CACHE + * true to use a global DNS cache. This option is + * not thread-safe and is enabled by default. + * + * + * + * + * CURLOPT_FAILONERROR + * true to fail silently if the HTTP code returned + * is greater than or equal to 400. The default behavior is to return + * the page normally, ignoring the code. + * + * + * + * + * CURLOPT_FILETIME + * true to attempt to retrieve the modification + * date of the remote document. This value can be retrieved using + * the CURLINFO_FILETIME option with + * curl_getinfo. + * + * + * + * + * CURLOPT_FOLLOWLOCATION + * true to follow any + * "Location: " header that the server sends as + * part of the HTTP header (note this is recursive, PHP will follow as + * many "Location: " headers that it is sent, + * unless CURLOPT_MAXREDIRS is set). + * + * + * + * + * CURLOPT_FORBID_REUSE + * true to force the connection to explicitly + * close when it has finished processing, and not be pooled for reuse. + * + * + * + * + * CURLOPT_FRESH_CONNECT + * true to force the use of a new connection + * instead of a cached one. + * + * + * + * + * CURLOPT_FTP_USE_EPRT + * true to use EPRT (and LPRT) when doing active + * FTP downloads. Use false to disable EPRT and LPRT and use PORT + * only. + * + * + * + * + * CURLOPT_FTP_USE_EPSV + * true to first try an EPSV command for FTP + * transfers before reverting back to PASV. Set to false + * to disable EPSV. + * + * + * + * + * CURLOPT_FTPAPPEND + * true to append to the remote file instead of + * overwriting it. + * + * + * + * + * CURLOPT_FTPASCII + * An alias of + * CURLOPT_TRANSFERTEXT. Use that instead. + * + * + * + * + * CURLOPT_FTPLISTONLY + * true to only list the names of an FTP + * directory. + * + * + * + * + * CURLOPT_HEADER + * true to include the header in the output. + * + * + * + * + * CURLINFO_HEADER_OUT + * true to track the handle's request string. + * + * Available since PHP 5.1.3. The CURLINFO_ + * prefix is intentional. + * + * + * + * CURLOPT_HTTPGET + * true to reset the HTTP request method to GET. + * Since GET is the default, this is only necessary if the request + * method has been changed. + * + * + * + * + * CURLOPT_HTTPPROXYTUNNEL + * true to tunnel through a given HTTP proxy. + * + * + * + * + * CURLOPT_MUTE + * true to be completely silent with regards to + * the cURL functions. + * + * + * + * + * CURLOPT_NETRC + * true to scan the ~/.netrc + * file to find a username and password for the remote site that + * a connection is being established with. + * + * + * + * + * CURLOPT_NOBODY + * true to exclude the body from the output. + * Request method is then set to HEAD. Changing this to false does + * not change it to GET. + * + * + * + * + * CURLOPT_NOPROGRESS + *

+ * true to disable the progress meter for cURL transfers. + *

+ * PHP automatically sets this option to true, this should only be + * changed for debugging purposes. + *

+ *

+ * + * + * + * CURLOPT_NOSIGNAL + * true to ignore any cURL function that causes a + * signal to be sent to the PHP process. This is turned on by default + * in multi-threaded SAPIs so timeout options can still be used. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_POST + * true to do a regular HTTP POST. This POST is the + * normal application/x-www-form-urlencoded kind, + * most commonly used by HTML forms. + * + * + * + * + * CURLOPT_PUT + * true to HTTP PUT a file. The file to PUT must + * be set with CURLOPT_INFILE and + * CURLOPT_INFILESIZE. + * + * + * + * + * CURLOPT_RETURNTRANSFER + * true to return the transfer as a string of the + * return value of curl_exec instead of outputting + * it out directly. + * + * + * + * + * CURLOPT_SSL_VERIFYPEER + * false to stop cURL from verifying the peer's + * certificate. Alternate certificates to verify against can be + * specified with the CURLOPT_CAINFO option + * or a certificate directory can be specified with the + * CURLOPT_CAPATH option. + * CURLOPT_SSL_VERIFYHOST may also need to be + * true or false if + * CURLOPT_SSL_VERIFYPEER is disabled (it + * defaults to 2). + * + * true by default as of cURL 7.10. Default bundle installed as of + * cURL 7.10. + * + * + * + * CURLOPT_TRANSFERTEXT + * true to use ASCII mode for FTP transfers. + * For LDAP, it retrieves data in plain text instead of HTML. On + * Windows systems, it will not set STDOUT to binary + * mode. + * + * + * + * + * CURLOPT_UNRESTRICTED_AUTH + * true to keep sending the username and password + * when following locations (using + * CURLOPT_FOLLOWLOCATION), even when the + * hostname has changed. + * + * + * + * + * CURLOPT_UPLOAD + * true to prepare for an upload. + * + * + * + * + * CURLOPT_VERBOSE + * true to output verbose information. Writes + * output to STDERR, or the file specified using + * CURLOPT_STDERR. + * + * + * + *

+ *

+ * value should be an integer for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_BUFFERSIZE + * The size of the buffer to use for each read. There is no guarantee + * this request will be fulfilled, however. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_CLOSEPOLICY + * Either + * CURLCLOSEPOLICY_LEAST_RECENTLY_USED or + * CURLCLOSEPOLICY_OLDEST. + * There are three other CURLCLOSEPOLICY_ + * constants, but cURL does not support them yet. + * + * + * + * + * CURLOPT_CONNECTTIMEOUT + * The number of seconds to wait while trying to connect. Use 0 to + * wait indefinitely. + * + * + * + * + * CURLOPT_CONNECTTIMEOUT_MS + * The number of milliseconds to wait while trying to connect. Use 0 to + * wait indefinitely. + * + * Added in cURL 7.16.2. Available since PHP 5.2.3. + * + * + * + * CURLOPT_DNS_CACHE_TIMEOUT + * The number of seconds to keep DNS entries in memory. This + * option is set to 120 (2 minutes) by default. + * + * + * + * + * CURLOPT_FTPSSLAUTH + * The FTP authentication method (when is activated): + * CURLFTPAUTH_SSL (try SSL first), + * CURLFTPAUTH_TLS (try TLS first), or + * CURLFTPAUTH_DEFAULT (let cURL decide). + * + * Added in cURL 7.12.2. + * + * + * + * CURLOPT_HTTP_VERSION + * CURL_HTTP_VERSION_NONE (default, lets CURL + * decide which version to use), + * CURL_HTTP_VERSION_1_0 (forces HTTP/1.0), + * or CURL_HTTP_VERSION_1_1 (forces HTTP/1.1). + * + * + * + * + * CURLOPT_HTTPAUTH + *

+ * The HTTP authentication method(s) to use. The options are: + * CURLAUTH_BASIC, + * CURLAUTH_DIGEST, + * CURLAUTH_GSSNEGOTIATE, + * CURLAUTH_NTLM, + * CURLAUTH_ANY, and + * CURLAUTH_ANYSAFE. + *

+ *

+ * The bitwise | (or) operator can be used to combine + * more than one method. If this is done, cURL will poll the server to see + * what methods it supports and pick the best one. + *

+ *

+ * CURLAUTH_ANY is an alias for + * CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. + *

+ *

+ * CURLAUTH_ANYSAFE is an alias for + * CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. + *

+ * + * + * + * + * CURLOPT_INFILESIZE + * The expected size, in bytes, of the file when uploading a file to a + * remote site. + * + * + * + * + * CURLOPT_LOW_SPEED_LIMIT + * The transfer speed, in bytes per second, that the transfer should be + * below during the count of CURLOPT_LOW_SPEED_TIME + * seconds before PHP considers the transfer too slow and aborts. + * + * + * + * + * CURLOPT_LOW_SPEED_TIME + * The number of seconds the transfer speed should be below + * CURLOPT_LOW_SPEED_LIMIT before PHP considers + * the transfer too slow and aborts. + * + * + * + * + * CURLOPT_MAXCONNECTS + * The maximum amount of persistent connections that are allowed. + * When the limit is reached, + * CURLOPT_CLOSEPOLICY is used to determine + * which connection to close. + * + * + * + * + * CURLOPT_MAXREDIRS + * The maximum amount of HTTP redirections to follow. Use this option + * alongside CURLOPT_FOLLOWLOCATION. + * + * + * + * + * CURLOPT_PORT + * An alternative port number to connect to. + * + * + * + * + * CURLOPT_PROTOCOLS + *

+ * Bitmask of CURLPROTO_* values. If used, this bitmask + * limits what protocols libcurl may use in the transfer. This allows you to have + * a libcurl built to support a wide range of protocols but still limit specific + * transfers to only be allowed to use a subset of them. By default libcurl will + * accept all protocols it supports. + * See also CURLOPT_REDIR_PROTOCOLS. + *

+ *

+ * Valid protocol options are: + * CURLPROTO_HTTP, + * CURLPROTO_HTTPS, + * CURLPROTO_FTP, + * CURLPROTO_FTPS, + * CURLPROTO_SCP, + * CURLPROTO_SFTP, + * CURLPROTO_TELNET, + * CURLPROTO_LDAP, + * CURLPROTO_LDAPS, + * CURLPROTO_DICT, + * CURLPROTO_FILE, + * CURLPROTO_TFTP, + * CURLPROTO_ALL + *

+ * + * Added in cURL 7.19.4. + * + * + * + * CURLOPT_PROXYAUTH + * The HTTP authentication method(s) to use for the proxy connection. + * Use the same bitmasks as described in + * CURLOPT_HTTPAUTH. For proxy authentication, + * only CURLAUTH_BASIC and + * CURLAUTH_NTLM are currently supported. + * + * Added in cURL 7.10.7. + * + * + * + * CURLOPT_PROXYPORT + * The port number of the proxy to connect to. This port number can + * also be set in CURLOPT_PROXY. + * + * + * + * + * CURLOPT_PROXYTYPE + * Either CURLPROXY_HTTP (default) or + * CURLPROXY_SOCKS5. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_REDIR_PROTOCOLS + * Bitmask of CURLPROTO_* values. If used, this bitmask + * limits what protocols libcurl may use in a transfer that it follows to in + * a redirect when CURLOPT_FOLLOWLOCATION is enabled. + * This allows you to limit specific transfers to only be allowed to use a subset + * of protocols in redirections. By default libcurl will allow all protocols + * except for FILE and SCP. This is a difference compared to pre-7.19.4 versions + * which unconditionally would follow to all protocols supported. + * See also CURLOPT_PROTOCOLS for protocol constant values. + * + * Added in cURL 7.19.4. + * + * + * + * CURLOPT_RESUME_FROM + * The offset, in bytes, to resume a transfer from. + * + * + * + * + * CURLOPT_SSL_VERIFYHOST + * 1 to check the existence of a common name in the + * SSL peer certificate. 2 to check the existence of + * a common name and also verify that it matches the hostname + * provided. + * + * + * + * + * CURLOPT_SSLVERSION + * The SSL version (2 or 3) to use. By default PHP will try to determine + * this itself, although in some cases this must be set manually. + * + * + * + * + * CURLOPT_TIMECONDITION + * How CURLOPT_TIMEVALUE is treated. + * Use CURL_TIMECOND_IFMODSINCE to return the + * page only if it has been modified since the time specified in + * CURLOPT_TIMEVALUE. If it hasn't been modified, + * a "304 Not Modified" header will be returned + * assuming CURLOPT_HEADER is true. + * Use CURL_TIMECOND_IFUNMODSINCE for the reverse + * effect. CURL_TIMECOND_IFMODSINCE is the + * default. + * + * + * + * + * CURLOPT_TIMEOUT + * The maximum number of seconds to allow cURL functions to execute. + * + * + * + * + * CURLOPT_TIMEOUT_MS + * The maximum number of milliseconds to allow cURL functions to + * execute. + * + * Added in cURL 7.16.2. Available since PHP 5.2.3. + * + * + * + * CURLOPT_TIMEVALUE + * The time in seconds since January 1st, 1970. The time will be used + * by CURLOPT_TIMECONDITION. By default, + * CURL_TIMECOND_IFMODSINCE is used. + * + * + * + *

+ *

+ * value should be a string for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_CAINFO + * The name of a file holding one or more certificates to verify the + * peer with. This only makes sense when used in combination with + * CURLOPT_SSL_VERIFYPEER. + * + * + * + * + * CURLOPT_CAPATH + * A directory that holds multiple CA certificates. Use this option + * alongside CURLOPT_SSL_VERIFYPEER. + * + * + * + * + * CURLOPT_COOKIE + * The contents of the "Cookie: " header to be + * used in the HTTP request. + * Note that multiple cookies are separated with a semicolon followed + * by a space (e.g., "fruit=apple; colour=red") + * + * + * + * + * CURLOPT_COOKIEFILE + * The name of the file containing the cookie data. The cookie file can + * be in Netscape format, or just plain HTTP-style headers dumped into + * a file. + * + * + * + * + * CURLOPT_COOKIEJAR + * The name of a file to save all internal cookies to when the + * connection closes. + * + * + * + * + * CURLOPT_CUSTOMREQUEST + *

+ * A custom request method to use instead of + * "GET" or "HEAD" when doing + * a HTTP request. This is useful for doing + * "DELETE" or other, more obscure HTTP requests. + * Valid values are things like "GET", + * "POST", "CONNECT" and so on; + * i.e. Do not enter a whole HTTP request line here. For instance, + * entering "GET /index.html HTTP/1.0\r\n\r\n" + * would be incorrect. + *

+ * Don't do this without making sure the server supports the custom + * request method first. + *

+ *

+ * + * + * + * CURLOPT_EGDSOCKET + * Like CURLOPT_RANDOM_FILE, except a filename + * to an Entropy Gathering Daemon socket. + * + * + * + * + * CURLOPT_ENCODING + * The contents of the "Accept-Encoding: " header. + * This enables decoding of the response. Supported encodings are + * "identity", "deflate", and + * "gzip". If an empty string, "", + * is set, a header containing all supported encoding types is sent. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_FTPPORT + * The value which will be used to get the IP address to use + * for the FTP "POST" instruction. The "POST" instruction tells + * the remote server to connect to our specified IP address. The + * string may be a plain IP address, a hostname, a network + * interface name (under Unix), or just a plain '-' to use the + * systems default IP address. + * + * + * + * + * CURLOPT_INTERFACE + * The name of the outgoing network interface to use. This can be an + * interface name, an IP address or a host name. + * + * + * + * + * CURLOPT_KRB4LEVEL + * The KRB4 (Kerberos 4) security level. Any of the following values + * (in order from least to most powerful) are valid: + * "clear", + * "safe", + * "confidential", + * "private".. + * If the string does not match one of these, + * "private" is used. Setting this option to &null; + * will disable KRB4 security. Currently KRB4 security only works + * with FTP transactions. + * + * + * + * + * CURLOPT_POSTFIELDS + * The full data to post in a HTTP "POST" operation. + * To post a file, prepend a filename with @ and + * use the full path. This can either be passed as a urlencoded + * string like 'para1=val1&para2=val2&...' + * or as an array with the field name as key and field data as value. + * If value is an array, the + * Content-Type header will be set to + * multipart/form-data. + * + * + * + * + * CURLOPT_PROXY + * The HTTP proxy to tunnel requests through. + * + * + * + * + * CURLOPT_PROXYUSERPWD + * A username and password formatted as + * "[username]:[password]" to use for the + * connection to the proxy. + * + * + * + * + * CURLOPT_RANDOM_FILE + * A filename to be used to seed the random number generator for SSL. + * + * + * + * + * CURLOPT_RANGE + * Range(s) of data to retrieve in the format + * "X-Y" where X or Y are optional. HTTP transfers + * also support several intervals, separated with commas in the format + * "X-Y,N-M". + * + * + * + * + * CURLOPT_REFERER + * The contents of the "Referer: " header to be used + * in a HTTP request. + * + * + * + * + * CURLOPT_SSL_CIPHER_LIST + * A list of ciphers to use for SSL. For example, + * RC4-SHA and TLSv1 are valid + * cipher lists. + * + * + * + * + * CURLOPT_SSLCERT + * The name of a file containing a PEM formatted certificate. + * + * + * + * + * CURLOPT_SSLCERTPASSWD + * The password required to use the + * CURLOPT_SSLCERT certificate. + * + * + * + * + * CURLOPT_SSLCERTTYPE + * The format of the certificate. Supported formats are + * "PEM" (default), "DER", + * and "ENG". + * + * Added in cURL 7.9.3. + * + * + * + * CURLOPT_SSLENGINE + * The identifier for the crypto engine of the private SSL key + * specified in CURLOPT_SSLKEY. + * + * + * + * + * CURLOPT_SSLENGINE_DEFAULT + * The identifier for the crypto engine used for asymmetric crypto + * operations. + * + * + * + * + * CURLOPT_SSLKEY + * The name of a file containing a private SSL key. + * + * + * + * + * CURLOPT_SSLKEYPASSWD + *

+ * The secret password needed to use the private SSL key specified in + * CURLOPT_SSLKEY. + *

+ * Since this option contains a sensitive password, remember to keep + * the PHP script it is contained within safe. + *

+ *

+ * + * + * + * CURLOPT_SSLKEYTYPE + * The key type of the private SSL key specified in + * CURLOPT_SSLKEY. Supported key types are + * "PEM" (default), "DER", + * and "ENG". + * + * + * + * + * CURLOPT_URL + * The URL to fetch. This can also be set when initializing a + * session with curl_init. + * + * + * + * + * CURLOPT_USERAGENT + * The contents of the "User-Agent: " header to be + * used in a HTTP request. + * + * + * + * + * CURLOPT_USERPWD + * A username and password formatted as + * "[username]:[password]" to use for the + * connection. + * + * + * + *

+ *

+ * value should be an array for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_HTTP200ALIASES + * An array of HTTP 200 responses that will be treated as valid + * responses and not as errors. + * + * Added in cURL 7.10.3. + * + * + * + * CURLOPT_HTTPHEADER + * An array of HTTP header fields to set, in the format + * array('Content-type: text/plain', 'Content-length: 100') + * + * + * + * + * CURLOPT_POSTQUOTE + * An array of FTP commands to execute on the server after the FTP + * request has been performed. + * + * + * + * + * CURLOPT_QUOTE + * An array of FTP commands to execute on the server prior to the FTP + * request. + * + * + * + *

+ *

+ * value should be a stream resource (using + * fopen, for example) for the following values of the + * option parameter: + * + * Option + * Set value to + * + * + * CURLOPT_FILE + * The file that the transfer should be written to. The default + * is STDOUT (the browser window). + * + * + * + * CURLOPT_INFILE + * The file that the transfer should be read from when uploading. + * + * + * + * CURLOPT_STDERR + * An alternative location to output errors to instead of + * STDERR. + * + * + * + * CURLOPT_WRITEHEADER + * The file that the header part of the transfer is written to. + * + * + *

+ *

+ * value should be a string that is the name of a valid + * callback function for the following values of the + * option parameter: + * + * Option + * Set value to + * + * + * CURLOPT_HEADERFUNCTION + * The name of a callback function where the callback function takes + * two parameters. The first is the cURL resource, the second is a + * string with the header data to be written. The header data must + * be written when using this callback function. Return the number of + * bytes written. + * + * + * + * CURLOPT_PASSWDFUNCTION + * The name of a callback function where the callback function takes + * three parameters. The first is the cURL resource, the second is a + * string containing a password prompt, and the third is the maximum + * password length. Return the string containing the password. + * + * + * + * CURLOPT_PROGRESSFUNCTION + * The name of a callback function where the callback function takes + * three parameters. The first is the cURL resource, the second is a + * file-descriptor resource, and the third is length. Return the + * string containing the data. + * + * + * + * CURLOPT_READFUNCTION + * The name of a callback function where the callback function takes + * two parameters. The first is the cURL resource, and the second is a + * string with the data to be read. The data must be read by using this + * callback function. Return the number of bytes read. Return 0 to signal + * EOF. + * + * + * + * CURLOPT_WRITEFUNCTION + * The name of a callback function where the callback function takes + * two parameters. The first is the cURL resource, and the second is a + * string with the data to be written. The data must be written by using + * this callback function. Must return the exact number of bytes written + * or this will fail. + * + * + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function curl_setopt ($ch, $option, $value) {} + +/** + * Set multiple options for a cURL transfer + * @link http://www.php.net/manual/en/function.curl-setopt-array.php + * @param ch resource + * @param options array

+ * An array specifying which options to set and their values. + * The keys should be valid curl_setopt constants or + * their integer equivalents. + *

+ * @return bool true if all options were successfully set. If an option could + * not be successfully set, false is immediately returned, ignoring any + * future options in the options array. + * + * @jms-builtin + */ +function curl_setopt_array ($ch, array $options) {} + +/** + * Perform a cURL session + * @link http://www.php.net/manual/en/function.curl-exec.php + * @param ch resource + * @return mixed Returns true on success or false on failure. However, if the CURLOPT_RETURNTRANSFER + * option is set, it will return the result on success, false on failure. + * + * @jms-builtin + */ +function curl_exec ($ch) {} + +/** + * Get information regarding a specific transfer + * @link http://www.php.net/manual/en/function.curl-getinfo.php + * @param ch resource + * @param opt int[optional]

+ * This may be one of the following constants: + * CURLINFO_EFFECTIVE_URL - Last effective URL + * @return mixed If opt is given, returns its value as a string. + * Otherwise, returns an associative array with the following elements + * (which correspond to opt): + * "url" + * "content_type" + * "http_code" + * "header_size" + * "request_size" + * "filetime" + * "ssl_verify_result" + * "redirect_count" + * "total_time" + * "namelookup_time" + * "connect_time" + * "pretransfer_time" + * "size_upload" + * "size_download" + * "speed_download" + * "speed_upload" + * "download_content_length" + * "upload_content_length" + * "starttransfer_time" + * "redirect_time" + * + * @jms-builtin + */ +function curl_getinfo ($ch, $opt = null) {} + +/** + * Return a string containing the last error for the current session + * @link http://www.php.net/manual/en/function.curl-error.php + * @param ch resource + * @return string the error message or '' (the empty string) if no + * error occurred. + * + * @jms-builtin + */ +function curl_error ($ch) {} + +/** + * Return the last error number + * @link http://www.php.net/manual/en/function.curl-errno.php + * @param ch resource + * @return int the error number or 0 (zero) if no error + * occurred. + * + * @jms-builtin + */ +function curl_errno ($ch) {} + +/** + * Close a cURL session + * @link http://www.php.net/manual/en/function.curl-close.php + * @param ch resource + * @return void + * + * @jms-builtin + */ +function curl_close ($ch) {} + +/** + * Returns a new cURL multi handle + * @link http://www.php.net/manual/en/function.curl-multi-init.php + * @return resource a cURL multi handle resource on success, false on failure. + * + * @jms-builtin + */ +function curl_multi_init () {} + +/** + * Add a normal cURL handle to a cURL multi handle + * @link http://www.php.net/manual/en/function.curl-multi-add-handle.php + * @param mh resource + * @param ch resource + * @return int 0 on success, or one of the CURLM_XXX errors + * code. + * + * @jms-builtin + */ +function curl_multi_add_handle ($mh, $ch) {} + +/** + * Remove a multi handle from a set of cURL handles + * @link http://www.php.net/manual/en/function.curl-multi-remove-handle.php + * @param mh resource + * @param ch resource + * @return int On success, returns a cURL handle, false on failure. + * + * @jms-builtin + */ +function curl_multi_remove_handle ($mh, $ch) {} + +/** + * Wait for activity on any curl_multi connection + * @link http://www.php.net/manual/en/function.curl-multi-select.php + * @param mh resource + * @param timeout float[optional]

+ * Time, in seconds, to wait for a response. + *

+ * @return int On success, returns the number of descriptors contained in, + * the descriptor sets. On failure, this function will return -1 on a select failure or timeout (from the underlying select system call). + * + * @jms-builtin + */ +function curl_multi_select ($mh, $timeout = null) {} + +/** + * Run the sub-connections of the current cURL handle + * @link http://www.php.net/manual/en/function.curl-multi-exec.php + * @param mh resource + * @param still_running int

+ * A reference to a flag to tell whether the operations are still running. + *

+ * @return int A cURL code defined in the cURL Predefined Constants. + *

+ *

+ * This only returns errors regarding the whole multi stack. There might still have + * occurred problems on individual transfers even when this function returns + * CURLM_OK. + * + * @jms-builtin + */ +function curl_multi_exec ($mh, &$still_running) {} + +/** + * Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set + * @link http://www.php.net/manual/en/function.curl-multi-getcontent.php + * @param ch resource + * @return string Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set. + * + * @jms-builtin + */ +function curl_multi_getcontent ($ch) {} + +/** + * Get information about the current transfers + * @link http://www.php.net/manual/en/function.curl-multi-info-read.php + * @param mh resource + * @param msgs_in_queue int[optional]

+ * Number of messages that are still in the queue + *

+ * @return array On success, returns an associative array for the message, false on failure. + *

+ *

+ * + * Contents of the returned array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Key:Value:
msgThe CURLMSG_DONE constant. Other return values + * are currently not available.
resultOne of the CURLE_* constants. If everything is + * OK, the CURLE_OK will be the result.
handleResource of type curl indicates the handle which it concerns.
+ * + * @jms-builtin + */ +function curl_multi_info_read ($mh, &$msgs_in_queue = null) {} + +/** + * Close a set of cURL handles + * @link http://www.php.net/manual/en/function.curl-multi-close.php + * @param mh resource + * @return void + * + * @jms-builtin + */ +function curl_multi_close ($mh) {} + +define ('CURLOPT_DNS_USE_GLOBAL_CACHE', 91); +define ('CURLOPT_DNS_CACHE_TIMEOUT', 92); +define ('CURLOPT_PORT', 3); +define ('CURLOPT_FILE', 10001); +define ('CURLOPT_READDATA', 10009); +define ('CURLOPT_INFILE', 10009); +define ('CURLOPT_INFILESIZE', 14); +define ('CURLOPT_URL', 10002); +define ('CURLOPT_PROXY', 10004); +define ('CURLOPT_VERBOSE', 41); +define ('CURLOPT_HEADER', 42); +define ('CURLOPT_HTTPHEADER', 10023); +define ('CURLOPT_NOPROGRESS', 43); +define ('CURLOPT_NOBODY', 44); +define ('CURLOPT_FAILONERROR', 45); +define ('CURLOPT_UPLOAD', 46); +define ('CURLOPT_POST', 47); +define ('CURLOPT_FTPLISTONLY', 48); +define ('CURLOPT_FTPAPPEND', 50); +define ('CURLOPT_NETRC', 51); + +/** + * This constant is not available when open_basedir + * or safe_mode are enabled. + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_FOLLOWLOCATION', 52); +define ('CURLOPT_PUT', 54); +define ('CURLOPT_USERPWD', 10005); +define ('CURLOPT_PROXYUSERPWD', 10006); +define ('CURLOPT_RANGE', 10007); +define ('CURLOPT_TIMEOUT', 13); +define ('CURLOPT_TIMEOUT_MS', 155); +define ('CURLOPT_POSTFIELDS', 10015); +define ('CURLOPT_REFERER', 10016); +define ('CURLOPT_USERAGENT', 10018); +define ('CURLOPT_FTPPORT', 10017); +define ('CURLOPT_FTP_USE_EPSV', 85); +define ('CURLOPT_LOW_SPEED_LIMIT', 19); +define ('CURLOPT_LOW_SPEED_TIME', 20); +define ('CURLOPT_RESUME_FROM', 21); +define ('CURLOPT_COOKIE', 10022); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_COOKIESESSION', 96); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_AUTOREFERER', 58); +define ('CURLOPT_SSLCERT', 10025); +define ('CURLOPT_SSLCERTPASSWD', 10026); +define ('CURLOPT_WRITEHEADER', 10029); +define ('CURLOPT_SSL_VERIFYHOST', 81); +define ('CURLOPT_COOKIEFILE', 10031); +define ('CURLOPT_SSLVERSION', 32); +define ('CURLOPT_TIMECONDITION', 33); +define ('CURLOPT_TIMEVALUE', 34); +define ('CURLOPT_CUSTOMREQUEST', 10036); +define ('CURLOPT_STDERR', 10037); +define ('CURLOPT_TRANSFERTEXT', 53); +define ('CURLOPT_RETURNTRANSFER', 19913); +define ('CURLOPT_QUOTE', 10028); +define ('CURLOPT_POSTQUOTE', 10039); +define ('CURLOPT_INTERFACE', 10062); +define ('CURLOPT_KRB4LEVEL', 10063); +define ('CURLOPT_HTTPPROXYTUNNEL', 61); +define ('CURLOPT_FILETIME', 69); +define ('CURLOPT_WRITEFUNCTION', 20011); +define ('CURLOPT_READFUNCTION', 20012); +define ('CURLOPT_HEADERFUNCTION', 20079); +define ('CURLOPT_MAXREDIRS', 68); +define ('CURLOPT_MAXCONNECTS', 71); +define ('CURLOPT_CLOSEPOLICY', 72); +define ('CURLOPT_FRESH_CONNECT', 74); +define ('CURLOPT_FORBID_REUSE', 75); +define ('CURLOPT_RANDOM_FILE', 10076); +define ('CURLOPT_EGDSOCKET', 10077); +define ('CURLOPT_CONNECTTIMEOUT', 78); +define ('CURLOPT_CONNECTTIMEOUT_MS', 156); +define ('CURLOPT_SSL_VERIFYPEER', 64); +define ('CURLOPT_CAINFO', 10065); +define ('CURLOPT_CAPATH', 10097); +define ('CURLOPT_COOKIEJAR', 10082); +define ('CURLOPT_SSL_CIPHER_LIST', 10083); +define ('CURLOPT_BINARYTRANSFER', 19914); +define ('CURLOPT_NOSIGNAL', 99); +define ('CURLOPT_PROXYTYPE', 101); +define ('CURLOPT_BUFFERSIZE', 98); +define ('CURLOPT_HTTPGET', 80); +define ('CURLOPT_HTTP_VERSION', 84); +define ('CURLOPT_SSLKEY', 10087); +define ('CURLOPT_SSLKEYTYPE', 10088); +define ('CURLOPT_SSLKEYPASSWD', 10026); +define ('CURLOPT_SSLENGINE', 10089); +define ('CURLOPT_SSLENGINE_DEFAULT', 90); +define ('CURLOPT_SSLCERTTYPE', 10086); +define ('CURLOPT_CRLF', 27); +define ('CURLOPT_ENCODING', 10102); +define ('CURLOPT_PROXYPORT', 59); +define ('CURLOPT_UNRESTRICTED_AUTH', 105); +define ('CURLOPT_FTP_USE_EPRT', 106); + +/** + * Available since PHP 5.2.1 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_TCP_NODELAY', 121); +define ('CURLOPT_HTTP200ALIASES', 10104); +define ('CURL_TIMECOND_IFMODSINCE', 1); +define ('CURL_TIMECOND_IFUNMODSINCE', 2); +define ('CURL_TIMECOND_LASTMOD', 3); +define ('CURLOPT_HTTPAUTH', 107); +define ('CURLAUTH_BASIC', 1); +define ('CURLAUTH_DIGEST', 2); +define ('CURLAUTH_GSSNEGOTIATE', 4); +define ('CURLAUTH_NTLM', 8); +define ('CURLAUTH_ANY', -17); +define ('CURLAUTH_ANYSAFE', -18); +define ('CURLOPT_PROXYAUTH', 111); +define ('CURLOPT_FTP_CREATE_MISSING_DIRS', 110); + +/** + * Available since PHP 5.2.4 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_PRIVATE', 10103); +define ('CURLCLOSEPOLICY_LEAST_RECENTLY_USED', 2); +define ('CURLCLOSEPOLICY_LEAST_TRAFFIC', 3); +define ('CURLCLOSEPOLICY_SLOWEST', 4); +define ('CURLCLOSEPOLICY_CALLBACK', 5); +define ('CURLCLOSEPOLICY_OLDEST', 1); +define ('CURLINFO_EFFECTIVE_URL', 1048577); +define ('CURLINFO_HTTP_CODE', 2097154); +define ('CURLINFO_HEADER_SIZE', 2097163); +define ('CURLINFO_REQUEST_SIZE', 2097164); +define ('CURLINFO_TOTAL_TIME', 3145731); +define ('CURLINFO_NAMELOOKUP_TIME', 3145732); +define ('CURLINFO_CONNECT_TIME', 3145733); +define ('CURLINFO_PRETRANSFER_TIME', 3145734); +define ('CURLINFO_SIZE_UPLOAD', 3145735); +define ('CURLINFO_SIZE_DOWNLOAD', 3145736); +define ('CURLINFO_SPEED_DOWNLOAD', 3145737); +define ('CURLINFO_SPEED_UPLOAD', 3145738); +define ('CURLINFO_FILETIME', 2097166); +define ('CURLINFO_SSL_VERIFYRESULT', 2097165); +define ('CURLINFO_CONTENT_LENGTH_DOWNLOAD', 3145743); +define ('CURLINFO_CONTENT_LENGTH_UPLOAD', 3145744); +define ('CURLINFO_STARTTRANSFER_TIME', 3145745); +define ('CURLINFO_CONTENT_TYPE', 1048594); +define ('CURLINFO_REDIRECT_TIME', 3145747); +define ('CURLINFO_REDIRECT_COUNT', 2097172); + +/** + * Available since PHP 5.1.3 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLINFO_HEADER_OUT', 2); + +/** + * Available since PHP 5.2.4 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLINFO_PRIVATE', 1048597); +define ('CURL_VERSION_IPV6', 1); +define ('CURL_VERSION_KERBEROS4', 2); +define ('CURL_VERSION_SSL', 4); +define ('CURL_VERSION_LIBZ', 8); +define ('CURLVERSION_NOW', 3); +define ('CURLE_OK', 0); +define ('CURLE_UNSUPPORTED_PROTOCOL', 1); +define ('CURLE_FAILED_INIT', 2); +define ('CURLE_URL_MALFORMAT', 3); +define ('CURLE_URL_MALFORMAT_USER', 4); +define ('CURLE_COULDNT_RESOLVE_PROXY', 5); +define ('CURLE_COULDNT_RESOLVE_HOST', 6); +define ('CURLE_COULDNT_CONNECT', 7); +define ('CURLE_FTP_WEIRD_SERVER_REPLY', 8); +define ('CURLE_FTP_ACCESS_DENIED', 9); +define ('CURLE_FTP_USER_PASSWORD_INCORRECT', 10); +define ('CURLE_FTP_WEIRD_PASS_REPLY', 11); +define ('CURLE_FTP_WEIRD_USER_REPLY', 12); +define ('CURLE_FTP_WEIRD_PASV_REPLY', 13); +define ('CURLE_FTP_WEIRD_227_FORMAT', 14); +define ('CURLE_FTP_CANT_GET_HOST', 15); +define ('CURLE_FTP_CANT_RECONNECT', 16); +define ('CURLE_FTP_COULDNT_SET_BINARY', 17); +define ('CURLE_PARTIAL_FILE', 18); +define ('CURLE_FTP_COULDNT_RETR_FILE', 19); +define ('CURLE_FTP_WRITE_ERROR', 20); +define ('CURLE_FTP_QUOTE_ERROR', 21); +define ('CURLE_HTTP_NOT_FOUND', 22); +define ('CURLE_WRITE_ERROR', 23); +define ('CURLE_MALFORMAT_USER', 24); +define ('CURLE_FTP_COULDNT_STOR_FILE', 25); +define ('CURLE_READ_ERROR', 26); +define ('CURLE_OUT_OF_MEMORY', 27); +define ('CURLE_OPERATION_TIMEOUTED', 28); +define ('CURLE_FTP_COULDNT_SET_ASCII', 29); +define ('CURLE_FTP_PORT_FAILED', 30); +define ('CURLE_FTP_COULDNT_USE_REST', 31); +define ('CURLE_FTP_COULDNT_GET_SIZE', 32); +define ('CURLE_HTTP_RANGE_ERROR', 33); +define ('CURLE_HTTP_POST_ERROR', 34); +define ('CURLE_SSL_CONNECT_ERROR', 35); +define ('CURLE_FTP_BAD_DOWNLOAD_RESUME', 36); +define ('CURLE_FILE_COULDNT_READ_FILE', 37); +define ('CURLE_LDAP_CANNOT_BIND', 38); +define ('CURLE_LDAP_SEARCH_FAILED', 39); +define ('CURLE_LIBRARY_NOT_FOUND', 40); +define ('CURLE_FUNCTION_NOT_FOUND', 41); +define ('CURLE_ABORTED_BY_CALLBACK', 42); +define ('CURLE_BAD_FUNCTION_ARGUMENT', 43); +define ('CURLE_BAD_CALLING_ORDER', 44); +define ('CURLE_HTTP_PORT_FAILED', 45); +define ('CURLE_BAD_PASSWORD_ENTERED', 46); +define ('CURLE_TOO_MANY_REDIRECTS', 47); +define ('CURLE_UNKNOWN_TELNET_OPTION', 48); +define ('CURLE_TELNET_OPTION_SYNTAX', 49); +define ('CURLE_OBSOLETE', 50); +define ('CURLE_SSL_PEER_CERTIFICATE', 51); +define ('CURLE_GOT_NOTHING', 52); +define ('CURLE_SSL_ENGINE_NOTFOUND', 53); +define ('CURLE_SSL_ENGINE_SETFAILED', 54); +define ('CURLE_SEND_ERROR', 55); +define ('CURLE_RECV_ERROR', 56); +define ('CURLE_SHARE_IN_USE', 57); +define ('CURLE_SSL_CERTPROBLEM', 58); +define ('CURLE_SSL_CIPHER', 59); +define ('CURLE_SSL_CACERT', 60); +define ('CURLE_BAD_CONTENT_ENCODING', 61); +define ('CURLE_LDAP_INVALID_URL', 62); +define ('CURLE_FILESIZE_EXCEEDED', 63); +define ('CURLE_FTP_SSL_FAILED', 64); +define ('CURLPROXY_HTTP', 0); +define ('CURLPROXY_SOCKS4', 4); +define ('CURLPROXY_SOCKS5', 5); +define ('CURL_NETRC_OPTIONAL', 1); +define ('CURL_NETRC_IGNORED', 0); +define ('CURL_NETRC_REQUIRED', 2); +define ('CURL_HTTP_VERSION_NONE', 0); +define ('CURL_HTTP_VERSION_1_0', 1); +define ('CURL_HTTP_VERSION_1_1', 2); +define ('CURLM_CALL_MULTI_PERFORM', -1); +define ('CURLM_OK', 0); +define ('CURLM_BAD_HANDLE', 1); +define ('CURLM_BAD_EASY_HANDLE', 2); +define ('CURLM_OUT_OF_MEMORY', 3); +define ('CURLM_INTERNAL_ERROR', 4); +define ('CURLMSG_DONE', 1); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_FTPSSLAUTH', 129); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPAUTH_DEFAULT', 0); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPAUTH_SSL', 1); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPAUTH_TLS', 2); + +/** + * Available since PHP 5.2.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_FTP_SSL', 119); + +/** + * Available since PHP 5.2.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_NONE', 0); + +/** + * Available since PHP 5.2.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_TRY', 1); + +/** + * Available since PHP 5.2.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_CONTROL', 2); + +/** + * Available since PHP 5.2.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_ALL', 3); +define ('CURLOPT_REDIR_PROTOCOLS', 182); +define ('CURLOPT_PROTOCOLS', 181); +define ('CURLPROTO_HTTP', 1); +define ('CURLPROTO_HTTPS', 2); +define ('CURLPROTO_FTP', 4); +define ('CURLPROTO_FTPS', 8); +define ('CURLPROTO_SCP', 16); +define ('CURLPROTO_SFTP', 32); +define ('CURLPROTO_TELNET', 64); +define ('CURLPROTO_LDAP', 128); +define ('CURLPROTO_LDAPS', 256); +define ('CURLPROTO_DICT', 512); +define ('CURLPROTO_FILE', 1024); +define ('CURLPROTO_TFTP', 2048); +define ('CURLPROTO_ALL', -1); + +// End of curl v. +?> diff --git a/res/php-5.2-core-api/date.php b/res/php-5.2-core-api/date.php new file mode 100644 index 0000000..ad90738 --- /dev/null +++ b/res/php-5.2-core-api/date.php @@ -0,0 +1,1459 @@ + + * String in a format accepted by strtotime. + *

+ *

+ * Enter &null; here to obtain the current time when using + * the $timezone parameter. + *

+ *

+ * To use a Unix timestamp, put a @ in + * front of the timestamp string. + *

+ * @param timezone DateTimeZone[optional]

+ * A DateTimeZone object representing the + * desired time zone. + *

+ *

+ * If $timezone is omitted, + * the current timezone will be used. + *

+ *

+ * The $timezone parameter + * and the current timezone are ignored when the + * $time parameter either + * is a UNIX timestamp (e.g. @946684800) + * or specifies a timezone + * (e.g. 2010-01-28T15:00:00+02:00). + *

+ * @return string a new DateTime instance. + * &return.falseforfailure.style.procedural; + */ + public function __construct ($time = null, DateTimeZone $timezone = null) {} + + /** + * Returns date formatted according to given format + * @link http://www.php.net/manual/en/datetime.format.php + * @param format string

+ * Format accepted by date. + *

+ * @return string the formatted date string on success&return.falseforfailure;. + */ + public function format ($format) {} + + /** + * Alters the timestamp + * @link http://www.php.net/manual/en/datetime.modify.php + * @param modify string

+ * String in a relative format accepted by strtotime. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function modify ($modify) {} + + /** + * Return time zone relative to given DateTime + * @link http://www.php.net/manual/en/datetime.gettimezone.php + * @return DateTimeZone a DateTimeZone object on success + * &return.falseforfailure;. + */ + public function getTimezone () {} + + /** + * Sets the time zone for the DateTime object + * @link http://www.php.net/manual/en/datetime.settimezone.php + * @param timezone DateTimeZone

+ * A DateTimeZone object representing the + * desired time zone. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function setTimezone (DateTimeZone $timezone) {} + + /** + * Returns the timezone offset + * @link http://www.php.net/manual/en/datetime.getoffset.php + * @return int the timezone offset in seconds from UTC on success + * &return.falseforfailure;. + */ + public function getOffset () {} + + /** + * Sets the time + * @link http://www.php.net/manual/en/datetime.settime.php + * @param hour int

+ * Hour of the time. + *

+ * @param minute int

+ * Minute of the time. + *

+ * @param second int[optional]

+ * Second of the time. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function setTime ($hour, $minute, $second = null) {} + + /** + * Sets the date + * @link http://www.php.net/manual/en/datetime.setdate.php + * @param year int

+ * Year of the date. + *

+ * @param month int

+ * Month of the date. + *

+ * @param day int

+ * Day of the date. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function setDate ($year, $month, $day) {} + + /** + * Sets the ISO date + * @link http://www.php.net/manual/en/datetime.setisodate.php + * @param year int

+ * Year of the date. + *

+ * @param week int

+ * Week of the date. + *

+ * @param day int[optional]

+ * Offset from the first day of the week. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function setISODate ($year, $week, $day = null) {} + +} + +/** @jms-builtin */ +class DateTimeZone { + + /** + * Creates new DateTimeZone object + * @link http://www.php.net/manual/en/datetimezone.construct.php + * @param timezone string

+ * One of timezones. + *

+ * @return string DateTimeZone on success. + * &return.falseforfailure.style.procedural; + */ + public function __construct ($timezone) {} + + /** + * Returns the name of the timezone + * @link http://www.php.net/manual/en/datetimezone.getname.php + * @return string One of timezones. + */ + public function getName () {} + + /** + * Returns the timezone offset from GMT + * @link http://www.php.net/manual/en/datetimezone.getoffset.php + * @param datetime DateTime

+ * DateTime that contains the date/time to compute the offset from. + *

+ * @return int time zone offset in seconds on success&return.falseforfailure;. + */ + public function getOffset (DateTime $datetime) {} + + /** + * Returns all transitions for the timezone + * @link http://www.php.net/manual/en/datetimezone.gettransitions.php + * @param timestamp_begin int[optional]

+ * Begin timestamp. + *

+ * @param timestamp_end int[optional]

+ * End timestamp. + *

+ * @return array numerically indexed array containing associative array with all + * transitions on success&return.falseforfailure;. + */ + public function getTransitions ($timestamp_begin = null, $timestamp_end = null) {} + + /** + * Returns associative array containing dst, offset and the timezone name + * @link http://www.php.net/manual/en/datetimezone.listabbreviations.php + * @return array array on success&return.falseforfailure;. + */ + public static function listAbbreviations () {} + + /** + * Returns numerically index array with all timezone identifiers + * @link http://www.php.net/manual/en/datetimezone.listidentifiers.php + * @param what int[optional]

+ * One of DateTimeZone class constants. + *

+ * @param country string[optional]

+ * A two-letter ISO 3166-1 compatible country code. + *

+ * This option is only used when what is set to + * DateTimeZone::PER_COUNTRY. + * @return array array on success&return.falseforfailure;. + */ + public static function listIdentifiers ($what = null, $country = null) {} + +} + +/** + * Parse about any English textual datetime description into a Unix timestamp + * @link http://www.php.net/manual/en/function.strtotime.php + * @param time string

+ * The string to parse. Before PHP 5.0.0, microseconds weren't allowed in + * the time, since PHP 5.0.0 they are allowed but ignored. + *

+ * @param now int[optional]

+ * The timestamp which is used as a base for the calculation of relative + * dates. + *

+ * @return int a timestamp on success, false otherwise. Previous to PHP 5.1.0, + * this function would return -1 on failure. + * + * @jms-builtin + */ +function strtotime ($time, $now = null) {} + +/** + * Format a local time/date + * @link http://www.php.net/manual/en/function.date.php + * @param format string

+ * The format of the outputted date string. See the formatting + * options below. There are also several + * predefined date constants + * that may be used instead, so for example DATE_RSS + * contains the format string 'D, d M Y H:i:s'. + *

+ *

+ * + * The following characters are recognized in the + * format parameter string + * + * + * + * + * + * + * Day + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Week + * + * + * + * + * + * + * + * + * + * Month + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Year + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Time + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Timezone + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Full Date/Time + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
format characterDescriptionExample returned values
------
dDay of the month, 2 digits with leading zeros01 to 31
DA textual representation of a day, three lettersMon through Sun
jDay of the month without leading zeros1 to 31
l (lowercase 'L')A full textual representation of the day of the weekSunday through Saturday
NISO-8601 numeric representation of the day of the week (added in + * PHP 5.1.0)1 (for Monday) through 7 (for Sunday)
SEnglish ordinal suffix for the day of the month, 2 characters + * st, nd, rd or + * th. Works well with j + *
wNumeric representation of the day of the week0 (for Sunday) through 6 (for Saturday)
zThe day of the year (starting from 0)0 through 365
------
WISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0)Example: 42 (the 42nd week in the year)
------
FA full textual representation of a month, such as January or MarchJanuary through December
mNumeric representation of a month, with leading zeros01 through 12
MA short textual representation of a month, three lettersJan through Dec
nNumeric representation of a month, without leading zeros1 through 12
tNumber of days in the given month28 through 31
------
LWhether it's a leap year1 if it is a leap year, 0 otherwise.
oISO-8601 year number. This has the same value as + * Y, except that if the ISO week number + * (W) belongs to the previous or next year, that year + * is used instead. (added in PHP 5.1.0)Examples: 1999 or 2003
YA full numeric representation of a year, 4 digitsExamples: 1999 or 2003
yA two digit representation of a yearExamples: 99 or 03
------
aLowercase Ante meridiem and Post meridiemam or pm
AUppercase Ante meridiem and Post meridiemAM or PM
BSwatch Internet time000 through 999
g12-hour format of an hour without leading zeros1 through 12
G24-hour format of an hour without leading zeros0 through 23
h12-hour format of an hour with leading zeros01 through 12
H24-hour format of an hour with leading zeros00 through 23
iMinutes with leading zeros00 to 59
sSeconds, with leading zeros00 through 59
uMicroseconds (added in PHP 5.2.2)Example: 654321
------
eTimezone identifier (added in PHP 5.1.0)Examples: UTC, GMT, Atlantic/Azores
I (capital i)Whether or not the date is in daylight saving time1 if Daylight Saving Time, 0 otherwise.
ODifference to Greenwich time (GMT) in hoursExample: +0200
PDifference to Greenwich time (GMT) with colon between hours and minutes (added in PHP 5.1.3)Example: +02:00
TTimezone abbreviationExamples: EST, MDT ...
ZTimezone offset in seconds. The offset for timezones west of UTC is always + * negative, and for those east of UTC is always positive.-43200 through 50400
------
cISO 8601 date (added in PHP 5)2004-02-12T15:19:21+00:00
rRFC 2822 formatted dateExample: Thu, 21 Dec 2000 16:01:07 +0200
USeconds since the Unix Epoch (January 1 1970 00:00:00 GMT)See also time
+ *

+ *

+ * Unrecognized characters in the format string will be printed + * as-is. The Z format will always return + * 0 when using gmdate. + *

+ *

+ * Since this function only accepts integer timestamps the + * u format character is only useful when using the + * date_format function with user based timestamps + * created with date_create. + *

+ * @param timestamp int[optional] + * @return string a formatted date string. If a non-numeric value is used for + * timestamp, false is returned and an + * E_WARNING level error is emitted. + * + * @jms-builtin + */ +function date ($format, $timestamp = null) {} + +/** + * Format a local time/date as integer + * @link http://www.php.net/manual/en/function.idate.php + * @param format string

+ * + * The following characters are recognized in the + * format parameter string + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
format characterDescription
BSwatch Beat/Internet Time
dDay of the month
hHour (12 hour format)
HHour (24 hour format)
iMinutes
I (uppercase i)returns 1 if DST is activated, + * 0 otherwise
L (uppercase l)returns 1 for leap year, + * 0 otherwise
mMonth number
sSeconds
tDays in current month
USeconds since the Unix Epoch - January 1 1970 00:00:00 UTC - + * this is the same as time
wDay of the week (0 on Sunday)
WISO-8601 week number of year, weeks starting on + * Monday
yYear (1 or 2 digits - check note below)
YYear (4 digits)
zDay of the year
ZTimezone offset in seconds
+ *

+ * @param timestamp int[optional] + * @return int an integer. + *

+ *

+ * As idate always returns an integer and + * as they can't start with a "0", idate may return + * fewer digits than you would expect. See the example below. + * + * @jms-builtin + */ +function idate ($format, $timestamp = null) {} + +/** + * Format a GMT/UTC date/time + * @link http://www.php.net/manual/en/function.gmdate.php + * @param format string

+ * The format of the outputted date string. See the formatting + * options for the date function. + *

+ * @param timestamp int[optional] + * @return string a formatted date string. If a non-numeric value is used for + * timestamp, false is returned and an + * E_WARNING level error is emitted. + * + * @jms-builtin + */ +function gmdate ($format, $timestamp = null) {} + +/** + * Get Unix timestamp for a date + * @link http://www.php.net/manual/en/function.mktime.php + * @param hour int[optional]

+ * The number of the hour. + *

+ * @param minute int[optional]

+ * The number of the minute. + *

+ * @param second int[optional]

+ * The number of seconds past the minute. + *

+ * @param month int[optional]

+ * The number of the month. + *

+ * @param day int[optional]

+ * The number of the day. + *

+ * @param year int[optional]

+ * The number of the year, may be a two or four digit value, + * with values between 0-69 mapping to 2000-2069 and 70-100 to + * 1970-2000. On systems where time_t is a 32bit signed integer, as + * most common today, the valid range for year + * is somewhere between 1901 and 2038. However, before PHP 5.1.0 this + * range was limited from 1970 to 2038 on some systems (e.g. Windows). + *

+ * @param is_dst int[optional]

+ * This parameter can be set to 1 if the time is during daylight savings time (DST), + * 0 if it is not, or -1 (the default) if it is unknown whether the time is within + * daylight savings time or not. If it's unknown, PHP tries to figure it out itself. + * This can cause unexpected (but not incorrect) results. + * Some times are invalid if DST is enabled on the system PHP is running on or + * is_dst is set to 1. If DST is enabled in e.g. 2:00, all times + * between 2:00 and 3:00 are invalid and mktime returns an undefined + * (usually negative) value. + * Some systems (e.g. Solaris 8) enable DST at midnight so time 0:30 of the day when DST + * is enabled is evaluated as 23:30 of the previous day. + *

+ *

+ * As of PHP 5.1.0, this parameter became deprecated. As a result, the + * new timezone handling features should be used instead. + *

+ * @return int mktime returns the Unix timestamp of the arguments + * given. + * If the arguments are invalid, the function returns false (before PHP 5.1 + * it returned -1). + * + * @jms-builtin + */ +function mktime ($hour = null, $minute = null, $second = null, $month = null, $day = null, $year = null, $is_dst = null) {} + +/** + * Get Unix timestamp for a GMT date + * @link http://www.php.net/manual/en/function.gmmktime.php + * @param hour int[optional]

+ * The hour + *

+ * @param minute int[optional]

+ * The minute + *

+ * @param second int[optional]

+ * The second + *

+ * @param month int[optional]

+ * The month + *

+ * @param day int[optional]

+ * The day + *

+ * @param year int[optional]

+ * The year + *

+ * @param is_dst int[optional]

+ * Parameters always represent a GMT date so is_dst + * doesn't influence the result. + *

+ * @return int a integer Unix timestamp. + * + * @jms-builtin + */ +function gmmktime ($hour = null, $minute = null, $second = null, $month = null, $day = null, $year = null, $is_dst = null) {} + +/** + * Validate a Gregorian date + * @link http://www.php.net/manual/en/function.checkdate.php + * @param month int

+ * The month is between 1 and 12 inclusive. + *

+ * @param day int

+ * The day is within the allowed number of days for the given + * month. Leap years + * are taken into consideration. + *

+ * @param year int

+ * The year is between 1 and 32767 inclusive. + *

+ * @return bool true if the date given is valid; otherwise returns false. + * + * @jms-builtin + */ +function checkdate ($month, $day, $year) {} + +/** + * Format a local time/date according to locale settings + * @link http://www.php.net/manual/en/function.strftime.php + * @param format string

+ * + * The following characters are recognized in the + * format parameter string + * + * + * + * + * + * + * Day + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Week + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Month + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Year + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Time + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Time and Date Stamps + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Miscellaneous + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
formatDescriptionExample returned values
------
%aAn abbreviated textual representation of the daySun through Sat
%AA full textual representation of the daySunday through Saturday
%dTwo-digit day of the month (with leading zeros)01 to 31
%eDay of the month, with a space preceding single digits 1 to 31
%jDay of the year, 3 digits with leading zeros001 to 366
%uISO-8601 numeric representation of the day of the week1 (for Monday) though 7 (for Sunday)
%wNumeric representation of the day of the week0 (for Sunday) through 6 (for Saturday)
------
%UWeek number of the given year, starting with the first + * Sunday as the first week13 (for the 13th full week of the year)
%VISO-8601:1988 week number of the given year, starting with + * the first week of the year with at least 4 weekdays, with Monday + * being the start of the week01 through 53 (where 53 + * accounts for an overlapping week)
%WA numeric representation of the week of the year, starting + * with the first Monday as the first week46 (for the 46th week of the year beginning + * with a Monday)
------
%bAbbreviated month name, based on the localeJan through Dec
%BFull month name, based on the localeJanuary through December
%hAbbreviated month name, based on the locale (an alias of %b)Jan through Dec
%mTwo digit representation of the month01 (for January) through 12 (for December)
------
%CTwo digit representation of the century (year divided by 100, truncated to an integer)19 for the 20th Century
%gTwo digit representation of the year going by ISO-8601:1988 standards (see %V)Example: 09 for the week of January 6, 2009
%GThe full four-digit version of %gExample: 2008 for the week of January 3, 2009
%yTwo digit representation of the yearExample: 09 for 2009, 79 for 1979
%YFour digit representation for the yearExample: 2038
------
%HTwo digit representation of the hour in 24-hour format00 through 23
%ITwo digit representation of the hour in 12-hour format01 through 12
%l (lower-case 'L')Hour in 12-hour format, with a space preceeding single digits 1 through 12
%MTwo digit representation of the minute00 through 59
%pUPPER-CASE 'AM' or 'PM' based on the given timeExample: AM for 00:31, PM for 22:23
%Plower-case 'am' or 'pm' based on the given timeExample: am for 00:31, pm for 22:23
%rSame as "%I:%M:%S %p"Example: 09:34:17 PM for 21:34:17
%RSame as "%H:%M"Example: 00:35 for 12:35 AM, 16:44 for 4:44 PM
%STwo digit representation of the second00 through 59
%TSame as "%H:%M:%S"Example: 21:34:17 for 09:34:17 PM
%XPreferred time representation based on locale, without the dateExample: 03:59:16 or 15:59:16
%zEither the time zone offset from UTC or the abbreviation (depends + * on operating system)Example: -0500 or EST for Eastern Time
%ZThe time zone offset/abbreviation option NOT given by %z (depends + * on operating system)Example: -0500 or EST for Eastern Time
------
%cPreferred date and time stamp based on localExample: Tue Feb 5 00:45:10 2009 for + * February 4, 2009 at 12:45:10 AM
%DSame as "%m/%d/%y"Example: 02/05/09 for February 5, 2009
%FSame as "%Y-%m-%d" (commonly used in database datestamps)Example: 2009-02-05 for February 5, 2009
%sUnix Epoch Time timestamp (same as the time + * function)Example: 305815200 for September 10, 1979 08:40:00 AM
%xPreferred date representation based on locale, without the timeExample: 02/05/09 for February 5, 2009
------
%nA newline character ("\n")---
%tA Tab character ("\t")---
%%A literal percentage character ("%")---
+ *

+ *

+ * Maximum length of this parameter is 1023 characters. + *

+ * Contrary to ISO-9899:1999, Sun Solaris starts with Sunday as 1. + * As a result, %u may not function as described in this manual. + * @param timestamp int[optional] + * @return string a string formatted according format + * using the given timestamp or the current + * local time if no timestamp is given. Month and weekday names and + * other language-dependent strings respect the current locale set + * with setlocale. + * + * @jms-builtin + */ +function strftime ($format, $timestamp = null) {} + +/** + * Format a GMT/UTC time/date according to locale settings + * @link http://www.php.net/manual/en/function.gmstrftime.php + * @param format string

+ * See description in strftime. + *

+ * @param timestamp int[optional] + * @return string a string formatted according to the given format string + * using the given timestamp or the current + * local time if no timestamp is given. Month and weekday names and + * other language dependent strings respect the current locale set + * with setlocale. + * + * @jms-builtin + */ +function gmstrftime ($format, $timestamp = null) {} + +/** + * Return current Unix timestamp + * @link http://www.php.net/manual/en/function.time.php + * @return int + * + * @jms-builtin + */ +function time () {} + +/** + * Get the local time + * @link http://www.php.net/manual/en/function.localtime.php + * @param timestamp int[optional] + * @param is_associative bool[optional]

+ * If set to false or not supplied then the array is returned as a regular, + * numerically indexed array. If the argument is set to true then + * localtime returns an associative array containing + * all the different elements of the structure returned by the C + * function call to localtime. The names of the different keys of + * the associative array are as follows: + *

+ *

+ * "tm_sec" - seconds + * @return array + * + * @jms-builtin + */ +function localtime ($timestamp = null, $is_associative = null) {} + +/** + * Get date/time information + * @link http://www.php.net/manual/en/function.getdate.php + * @param timestamp int[optional] + * @return array an associative array of information related to + * the timestamp. Elements from the returned + * associative array are as follows: + *

+ *

+ * + * Key elements of the returned associative array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
KeyDescriptionExample returned values
"seconds"Numeric representation of seconds0 to 59
"minutes"Numeric representation of minutes0 to 59
"hours"Numeric representation of hours0 to 23
"mday"Numeric representation of the day of the month1 to 31
"wday"Numeric representation of the day of the week0 (for Sunday) through 6 (for Saturday)
"mon"Numeric representation of a month1 through 12
"year"A full numeric representation of a year, 4 digitsExamples: 1999 or 2003
"yday"Numeric representation of the day of the year0 through 365
"weekday"A full textual representation of the day of the weekSunday through Saturday
"month"A full textual representation of a month, such as January or MarchJanuary through December
0 + * Seconds since the Unix Epoch, similar to the values returned by + * time and used by date. + * + * System Dependent, typically -2147483648 through + * 2147483647. + *
+ * + * @jms-builtin + */ +function getdate ($timestamp = null) {} + +/** + * &Alias; DateTime::__construct + * @link http://www.php.net/manual/en/function.date-create.php + * + * @jms-builtin + */ +function date_create () {} + +/** + * Returns associative array with detailed info about given date + * @link http://www.php.net/manual/en/function.date-parse.php + * @param date string

+ * Date in format accepted by strtotime. + *

+ * @return array array with information about the parsed date + * on success&return.falseforfailure;. + * + * @jms-builtin + */ +function date_parse ($date) {} + +/** + * &Alias; DateTime::format + * @link http://www.php.net/manual/en/function.date-format.php + * + * @jms-builtin + */ +function date_format () {} + +/** + * &Alias; DateTime::modify + * @link http://www.php.net/manual/en/function.date-modify.php + * + * @jms-builtin + */ +function date_modify () {} + +/** + * &Alias; DateTime::getTimezone + * @link http://www.php.net/manual/en/function.date-timezone-get.php + * + * @jms-builtin + */ +function date_timezone_get () {} + +/** + * &Alias; DateTime::setTimezone + * @link http://www.php.net/manual/en/function.date-timezone-set.php + * + * @jms-builtin + */ +function date_timezone_set () {} + +/** + * &Alias; DateTime::getOffset + * @link http://www.php.net/manual/en/function.date-offset-get.php + * + * @jms-builtin + */ +function date_offset_get () {} + +/** + * &Alias; DateTime::setTime + * @link http://www.php.net/manual/en/function.date-time-set.php + * + * @jms-builtin + */ +function date_time_set () {} + +/** + * &Alias; DateTime::setDate + * @link http://www.php.net/manual/en/function.date-date-set.php + * + * @jms-builtin + */ +function date_date_set () {} + +/** + * &Alias; DateTime::setISODate + * @link http://www.php.net/manual/en/function.date-isodate-set.php + * + * @jms-builtin + */ +function date_isodate_set () {} + +/** + * &Alias; DateTimeZone::__construct + * @link http://www.php.net/manual/en/function.timezone-open.php + * + * @jms-builtin + */ +function timezone_open () {} + +/** + * &Alias; DateTimeZone::getName + * @link http://www.php.net/manual/en/function.timezone-name-get.php + * + * @jms-builtin + */ +function timezone_name_get () {} + +/** + * Returns the timezone name from abbreviation + * @link http://www.php.net/manual/en/function.timezone-name-from-abbr.php + * @param abbr string

+ * Time zone abbreviation. + *

+ * @param gmtOffset int[optional]

+ * Offset from GMT in seconds. Defaults to -1 which means that first found + * time zone corresponding to abbr is returned. + * Otherwise exact offset is searched and only if not found then the first + * time zone with any offset is returned. + *

+ * @param isdst int[optional]

+ * Daylight saving time indicator. If abbr doesn't + * exist then the time zone is searched solely by + * offset and isdst. + *

+ * @return string time zone name on success&return.falseforfailure;. + * + * @jms-builtin + */ +function timezone_name_from_abbr ($abbr, $gmtOffset = null, $isdst = null) {} + +/** + * &Alias; DateTimeZone::getOffset + * @link http://www.php.net/manual/en/function.timezone-offset-get.php + * + * @jms-builtin + */ +function timezone_offset_get () {} + +/** + * &Alias; DateTimeZone::getTransitions + * @link http://www.php.net/manual/en/function.timezone-transitions-get.php + * + * @jms-builtin + */ +function timezone_transitions_get () {} + +/** + * &Alias; DateTimeZone::listIdentifiers + * @link http://www.php.net/manual/en/function.timezone-identifiers-list.php + * + * @jms-builtin + */ +function timezone_identifiers_list () {} + +/** + * &Alias; DateTimeZone::listAbbreviations + * @link http://www.php.net/manual/en/function.timezone-abbreviations-list.php + * + * @jms-builtin + */ +function timezone_abbreviations_list () {} + +/** + * Sets the default timezone used by all date/time functions in a script + * @link http://www.php.net/manual/en/function.date-default-timezone-set.php + * @param timezone_identifier string

+ * The timezone identifier, like UTC or + * Europe/Lisbon. The list of valid identifiers is + * available in the . + *

+ * @return bool This function returns false if the + * timezone_identifier isn't valid, or true + * otherwise. + * + * @jms-builtin + */ +function date_default_timezone_set ($timezone_identifier) {} + +/** + * Gets the default timezone used by all date/time functions in a script + * @link http://www.php.net/manual/en/function.date-default-timezone-get.php + * @return string a string. + * + * @jms-builtin + */ +function date_default_timezone_get () {} + +/** + * Returns time of sunrise for a given day and location + * @link http://www.php.net/manual/en/function.date-sunrise.php + * @param timestamp int

+ * The timestamp of the day from which the sunrise + * time is taken. + *

+ * @param format int[optional]

+ * + * format constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
constantdescriptionexample
SUNFUNCS_RET_STRINGreturns the result as string16:46
SUNFUNCS_RET_DOUBLEreturns the result as float16.78243132
SUNFUNCS_RET_TIMESTAMPreturns the result as integer (timestamp)1095034606
+ *

+ * @param latitude float[optional]

+ * Defaults to North, pass in a negative value for South. + * See also: date.default_latitude + *

+ * @param longitude float[optional]

+ * Defaults to East, pass in a negative value for West. + * See also: date.default_longitude + *

+ * @param zenith float[optional]

+ * Default: date.sunrise_zenith + *

+ * @param gmt_offset float[optional] + * @return mixed the sunrise time in a specified format on + * success&return.falseforfailure;. + * + * @jms-builtin + */ +function date_sunrise ($timestamp, $format = null, $latitude = null, $longitude = null, $zenith = null, $gmt_offset = null) {} + +/** + * Returns time of sunset for a given day and location + * @link http://www.php.net/manual/en/function.date-sunset.php + * @param timestamp int

+ * The timestamp of the day from which the sunset + * time is taken. + *

+ * @param format int[optional]

+ * + * format constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
constantdescriptionexample
SUNFUNCS_RET_STRINGreturns the result as string16:46
SUNFUNCS_RET_DOUBLEreturns the result as float16.78243132
SUNFUNCS_RET_TIMESTAMPreturns the result as integer (timestamp)1095034606
+ *

+ * @param latitude float[optional]

+ * Defaults to North, pass in a negative value for South. + * See also: date.default_latitude + *

+ * @param longitude float[optional]

+ * Defaults to East, pass in a negative value for West. + * See also: date.default_longitude + *

+ * @param zenith float[optional]

+ * Default: date.sunset_zenith + *

+ * @param gmt_offset float[optional] + * @return mixed the sunset time in a specified format on + * success&return.falseforfailure;. + * + * @jms-builtin + */ +function date_sunset ($timestamp, $format = null, $latitude = null, $longitude = null, $zenith = null, $gmt_offset = null) {} + +/** + * Returns an array with information about sunset/sunrise and twilight begin/end + * @link http://www.php.net/manual/en/function.date-sun-info.php + * @param time int

+ * Timestamp. + *

+ * @param latitude float

+ * Latitude in degrees. + *

+ * @param longitude float

+ * Longitude in degrees. + *

+ * @return array array on success&return.falseforfailure;. + * + * @jms-builtin + */ +function date_sun_info ($time, $latitude, $longitude) {} + +define ('DATE_ATOM', "Y-m-d\TH:i:sP"); +define ('DATE_COOKIE', "l, d-M-y H:i:s T"); +define ('DATE_ISO8601', "Y-m-d\TH:i:sO"); +define ('DATE_RFC822', "D, d M y H:i:s O"); +define ('DATE_RFC850', "l, d-M-y H:i:s T"); +define ('DATE_RFC1036', "D, d M y H:i:s O"); +define ('DATE_RFC1123', "D, d M Y H:i:s O"); +define ('DATE_RFC2822', "D, d M Y H:i:s O"); +define ('DATE_RFC3339', "Y-m-d\TH:i:sP"); +define ('DATE_RSS', "D, d M Y H:i:s O"); +define ('DATE_W3C', "Y-m-d\TH:i:sP"); + +/** + * Timestamp + * @link http://www.php.net/manual/en/datetime.constants.php + */ +define ('SUNFUNCS_RET_TIMESTAMP', 0); + +/** + * Hours:minutes (example: 08:02) + * @link http://www.php.net/manual/en/datetime.constants.php + */ +define ('SUNFUNCS_RET_STRING', 1); + +/** + * Hours as floating point number (example 8.75) + * @link http://www.php.net/manual/en/datetime.constants.php + */ +define ('SUNFUNCS_RET_DOUBLE', 2); + +// End of date v.5.2.13 +?> diff --git a/res/php-5.2-core-api/dom.php b/res/php-5.2-core-api/dom.php new file mode 100644 index 0000000..2e748e6 --- /dev/null +++ b/res/php-5.2-core-api/dom.php @@ -0,0 +1,4624 @@ + + * The feature to test. + *

+ * @param version string

+ * The version number of the feature to test. In + * level 2, this can be either 2.0 or + * 1.0. + *

+ * @return bool Returns true on success or false on failure. + */ + public function hasFeature ($feature, $version) {} + + /** + * Creates an empty DOMDocumentType object + * @link http://www.php.net/manual/en/domimplementation.createdocumenttype.php + * @param qualifiedName string[optional]

+ * The qualified name of the document type to create. + *

+ * @param publicId string[optional]

+ * The external subset public identifier. + *

+ * @param systemId string[optional]

+ * The external subset system identifier. + *

+ * @return DOMDocumentType A new DOMDocumentType node with its + * ownerDocument set to &null;. + */ + public function createDocumentType ($qualifiedName = null, $publicId = null, $systemId = null) {} + + /** + * Creates a DOMDocument object of the specified type with its document element + * @link http://www.php.net/manual/en/domimplementation.createdocument.php + * @param namespaceURI string[optional]

+ * The namespace URI of the document element to create. + *

+ * @param qualifiedName string[optional]

+ * The qualified name of the document element to create. + *

+ * @param doctype DOMDocumentType[optional]

+ * The type of document to create or &null;. + *

+ * @return DOMDocument A new DOMDocument object. If + * namespaceURI, qualifiedName, + * and doctype are null, the returned + * DOMDocument is empty with no document element + */ + public function createDocument ($namespaceURI = null, $qualifiedName = null, DOMDocumentType $doctype = null) {} + +} + +/** + * @link http://www.php.net/manual/en/class.domnode.php + * + * @jms-builtin + */ +class DOMNode { + + /** + * Returns the most accurate name for the current node type + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.nodename + */ + public $nodeName; + + /** + * The value of this node, depending on its type + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.nodevalue + */ + public $nodeValue; + + /** + * Gets the type of the node. One of the predefined XML_xxx_NODE constants + * @var int + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.nodetype + */ + public $nodeType; + + /** + * The parent of this node + * @var DOMNode + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.parentnode + */ + public $parentNode; + + /** + * A DOMNodeList that contains all + * children of this node. If there are no children, this is an empty + * DOMNodeList. + * @var DOMNodeList + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.childnodes + */ + public $childNodes; + + /** + * The first child of this node. If there is no such node, this + * returns &null;. + * @var DOMNode + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.firstchild + */ + public $firstChild; + + /** + * The last child of this node. If there is no such node, this returns &null;. + * @var DOMNode + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.lastchild + */ + public $lastChild; + + /** + * The node immediately preceding this node. If there is no such + * node, this returns &null;. + * @var DOMNode + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.previoussibling + */ + public $previousSibling; + + /** + * The node immediately following this node. If there is no such + * node, this returns &null;. + * @var DOMNode + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.nextsibling + */ + public $nextSibling; + + /** + * A DOMNamedNodeMap containing the + * attributes of this node (if it is a DOMElement) + * or &null; otherwise. + * @var DOMNamedNodeMap + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.attributes + */ + public $attributes; + + /** + * The DOMDocument object associated with this node. + * @var DOMDocument + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.ownerdocument + */ + public $ownerDocument; + + /** + * The namespace URI of this node, or &null; if it is unspecified. + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.namespaceuri + */ + public $namespaceURI; + + /** + * The namespace prefix of this node, or &null; if it is unspecified. + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.prefix + */ + public $prefix; + + /** + * Returns the local part of the qualified name of this node. + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.localname + */ + public $localName; + + /** + * The absolute base URI of this node or &null; if the implementation + * wasn't able to obtain an absolute URI. + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.baseuri + */ + public $baseURI; + + /** + * This attribute returns the text content of this node and its descendants. + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.textcontent + */ + public $textContent; + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** @jms-builtin */ +class DOMNameSpaceNode { +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domdocumentfragment.php + * + * @jms-builtin + */ +class DOMDocumentFragment extends DOMNode { + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domdocumentfragment.php#domdocumentfragment.props.name + */ + public $name; + + public function __construct () {} + + /** + * Append raw XML data + * @link http://www.php.net/manual/en/domdocumentfragment.appendxml.php + * @param data string

+ * XML to append. + *

+ * @return bool Returns true on success or false on failure. + */ + public function appendXML ($data) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domdocument.php + * + * @jms-builtin + */ +class DOMDocument extends DOMNode { + + /** + * Deprecated. Actual encoding of the document, + * is a readonly equivalent to + * encoding. + * @var string + * @deprecated + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.actualencoding + */ + public $actualEncoding; + + /** + * Deprecated. Configuration used when + * DOMDocument::normalizeDocument is + * invoked. + * @var DOMConfiguration + * @deprecated + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.config + */ + public $config; + + /** + * The Document Type Declaration associated with this document. + * @var DOMDocumentType + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.doctype + */ + public $doctype; + + /** + * This is a convenience attribute that allows direct access to the + * child node that is the document element of the document. + * @var DOMElement + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.documentelement + */ + public $documentElement; + + /** + * The location of the document or &null; if undefined. + * @var string + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.documenturi + */ + public $documentURI; + + /** + * Encoding of the document, as specified by the XML declaration. This + * attribute is not present in the final DOM Level 3 specification, but + * is the only way of manipulating XML document encoding in this + * implementation. + * @var string + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.encoding + */ + public $encoding; + + /** + * Nicely formats output with indentation and extra space. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.formatoutput + */ + public $formatOutput; + + /** + * The DOMImplementation object that handles + * this document. + * @var DOMImplementation + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.implementation + */ + public $implementation; + + /** + * Do not remove redundant white space. Default to true. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.preservewhitespace + */ + public $preserveWhiteSpace; + + /** + * Proprietary. Enables recovery mode, i.e. trying + * to parse non-well formed documents. This attribute is not part of + * the DOM specification and is specific to libxml. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.recover + */ + public $recover; + + /** + * Set it to true to load external entities from a doctype + * declaration. This is useful for including character entities in + * your XML document. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.resolveexternals + */ + public $resolveExternals; + + /** + * Deprecated. Whether or not the document is + * standalone, as specified by the XML declaration, corresponds to + * xmlStandalone. + * @var bool + * @deprecated + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.standalone + */ + public $standalone; + + /** + * Throws DOMException on errors. Default to true. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.stricterrorchecking + */ + public $strictErrorChecking; + + /** + * Proprietary. Whether or not to substitute + * entities. This attribute is not part of + * the DOM specification and is specific to libxml. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.substituteentities + */ + public $substituteEntities; + + /** + * Loads and validates against the DTD. Default to false. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.validateonparse + */ + public $validateOnParse; + + /** + * Deprecated. Version of XML, corresponds to + * xmlVersion + * @var string + * @deprecated + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.version + */ + public $version; + + /** + * An attribute specifying, as part of the XML declaration, the + * encoding of this document. This is &null; when unspecified or when it + * is not known, such as when the Document was created in memory. + * @var string + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.xmlencoding + */ + public $xmlEncoding; + + /** + * An attribute specifying, as part of the XML declaration, whether + * this document is standalone. This is false when unspecified. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.xmlstandalone + */ + public $xmlStandalone; + + /** + * An attribute specifying, as part of the XML declaration, the + * version number of this document. If there is no declaration and if + * this document supports the "XML" feature, the value is "1.0". + * @var string + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.xmlversion + */ + public $xmlVersion; + + /** + * Create new element node + * @link http://www.php.net/manual/en/domdocument.createelement.php + * @param name string

+ * The tag name of the element. + *

+ * @param value string[optional]

+ * The value of the element. By default, an empty element will be created. + * The value can also be set later with DOMElement->nodeValue. + *

+ * @return DOMElement a new instance of class DOMElement or false + * if an error occured. + */ + public function createElement ($name, $value = null) {} + + /** + * Create new document fragment + * @link http://www.php.net/manual/en/domdocument.createdocumentfragment.php + * @return DOMDocumentFragment The new DOMDocumentFragment or false if an error occured. + */ + public function createDocumentFragment () {} + + /** + * Create new text node + * @link http://www.php.net/manual/en/domdocument.createtextnode.php + * @param content string

+ * The content of the text. + *

+ * @return DOMText The new DOMText or false if an error occured. + */ + public function createTextNode ($content) {} + + /** + * Create new comment node + * @link http://www.php.net/manual/en/domdocument.createcomment.php + * @param data string

+ * The content of the comment. + *

+ * @return DOMComment The new DOMComment or false if an error occured. + */ + public function createComment ($data) {} + + /** + * Create new cdata node + * @link http://www.php.net/manual/en/domdocument.createcdatasection.php + * @param data string

+ * The content of the cdata. + *

+ * @return DOMCDATASection The new DOMCDATASection or false if an error occured. + */ + public function createCDATASection ($data) {} + + /** + * Creates new PI node + * @link http://www.php.net/manual/en/domdocument.createprocessinginstruction.php + * @param target string

+ * The target of the processing instruction. + *

+ * @param data string[optional]

+ * The content of the processing instruction. + *

+ * @return DOMProcessingInstruction The new DOMProcessingInstruction or false if an error occured. + */ + public function createProcessingInstruction ($target, $data = null) {} + + /** + * Create new attribute + * @link http://www.php.net/manual/en/domdocument.createattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @return DOMAttr The new DOMAttr or false if an error occured. + */ + public function createAttribute ($name) {} + + /** + * Create new entity reference node + * @link http://www.php.net/manual/en/domdocument.createentityreference.php + * @param name string

+ * The content of the entity reference, e.g. the entity reference minus + * the leading & and the trailing + * ; characters. + *

+ * @return DOMEntityReference The new DOMEntityReference or false if an error + * occured. + */ + public function createEntityReference ($name) {} + + /** + * Searches for all elements with given tag name + * @link http://www.php.net/manual/en/domdocument.getelementsbytagname.php + * @param name string

+ * The name of the tag to match on. The special value * + * matches all tags. + *

+ * @return DOMNodeList A new DOMNodeList object containing all the matched + * elements. + */ + public function getElementsByTagName ($name) {} + + /** + * Import node into current document + * @link http://www.php.net/manual/en/domdocument.importnode.php + * @param importedNode DOMNode

+ * The node to import. + *

+ * @param deep bool[optional]

+ * If set to true, this method will recursively import the subtree under + * the importedNode. + *

+ *

+ * To copy the nodes attributes deep needs to be set to true + *

+ * @return DOMNode The copied node or false, if it cannot be copied. + */ + public function importNode (DOMNode $importedNode, $deep = null) {} + + /** + * Create new element node with an associated namespace + * @link http://www.php.net/manual/en/domdocument.createelementns.php + * @param namespaceURI string

+ * The URI of the namespace. + *

+ * @param qualifiedName string

+ * The qualified name of the element, as prefix:tagname. + *

+ * @param value string[optional]

+ * The value of the element. By default, an empty element will be created. + * You can also set the value later with DOMElement->nodeValue. + *

+ * @return DOMElement The new DOMElement or false if an error occured. + */ + public function createElementNS ($namespaceURI, $qualifiedName, $value = null) {} + + /** + * Create new attribute node with an associated namespace + * @link http://www.php.net/manual/en/domdocument.createattributens.php + * @param namespaceURI string

+ * The URI of the namespace. + *

+ * @param qualifiedName string

+ * The tag name and prefix of the attribute, as prefix:tagname. + *

+ * @return DOMAttr The new DOMAttr or false if an error occured. + */ + public function createAttributeNS ($namespaceURI, $qualifiedName) {} + + /** + * Searches for all elements with given tag name in specified namespace + * @link http://www.php.net/manual/en/domdocument.getelementsbytagnamens.php + * @param namespaceURI string

+ * The namespace URI of the elements to match on. + * The special value * matches all namespaces. + *

+ * @param localName string

+ * The local name of the elements to match on. + * The special value * matches all local names. + *

+ * @return DOMNodeList A new DOMNodeList object containing all the matched + * elements. + */ + public function getElementsByTagNameNS ($namespaceURI, $localName) {} + + /** + * Searches for an element with a certain id + * @link http://www.php.net/manual/en/domdocument.getelementbyid.php + * @param elementId string

+ * The unique id value for an element. + *

+ * @return DOMElement the DOMElement or &null; if the element is + * not found. + */ + public function getElementById ($elementId) {} + + /** + * @param source DOMNode + */ + public function adoptNode (DOMNode $source) {} + + /** + * Normalizes the document + * @link http://www.php.net/manual/en/domdocument.normalizedocument.php + * @return void + */ + public function normalizeDocument () {} + + /** + * @param node DOMNode + * @param namespaceURI + * @param qualifiedName + */ + public function renameNode (DOMNode $node, $namespaceURI, $qualifiedName) {} + + /** + * Load XML from a file + * @link http://www.php.net/manual/en/domdocument.load.php + * @param filename string

+ * The path to the XML document. + *

+ * @param options int[optional]

+ * Bitwise OR + * of the libxml option constants. + *

+ * @return mixed Returns true on success or false on failure. If called statically, returns a + * DOMDocument and issues E_STRICT + * warning. + */ + public function load ($filename, $options = null) {} + + /** + * Dumps the internal XML tree back into a file + * @link http://www.php.net/manual/en/domdocument.save.php + * @param filename string

+ * The path to the saved XML document. + *

+ * @param options int[optional]

+ * Additional Options. Currently only LIBXML_NOEMPTYTAG is supported. + *

+ * @return int the number of bytes written or false if an error occurred. + */ + public function save ($filename, $options = null) {} + + /** + * Load XML from a string + * @link http://www.php.net/manual/en/domdocument.loadxml.php + * @param source string

+ * The string containing the XML. + *

+ * @param options int[optional]

+ * Bitwise OR + * of the libxml option constants. + *

+ * @return mixed Returns true on success or false on failure. If called statically, returns a + * DOMDocument and issues E_STRICT + * warning. + */ + public function loadXML ($source, $options = null) {} + + /** + * Dumps the internal XML tree back into a string + * @link http://www.php.net/manual/en/domdocument.savexml.php + * @param node DOMNode[optional]

+ * Use this parameter to output only a specific node without XML declaration + * rather than the entire document. + *

+ * @param options int[optional]

+ * Additional Options. Currently only LIBXML_NOEMPTYTAG is supported. + *

+ * @return string the XML, or false if an error occurred. + */ + public function saveXML (DOMNode $node = null, $options = null) {} + + /** + * Creates a new DOMDocument object + * @link http://www.php.net/manual/en/domdocument.construct.php + * @param version[optional] + * @param encoding[optional] + */ + public function __construct ($version, $encoding) {} + + /** + * Validates the document based on its DTD + * @link http://www.php.net/manual/en/domdocument.validate.php + * @return bool Returns true on success or false on failure. + * If the document have no DTD attached, this method will return false. + */ + public function validate () {} + + /** + * Substitutes XIncludes in a DomDocument Object + * @link http://www.php.net/manual/en/function.domdocument-xinclude.php + * @param options int[optional]

+ * libxml parameters. Available + * since PHP 5.1.0 and Libxml 2.6.7. + *

+ * @return int the number of XIncludes in the document. + */ + public function xinclude ($options = null) {} + + /** + * Load HTML from a string + * @link http://www.php.net/manual/en/domdocument.loadhtml.php + * @param source string

+ * The HTML string. + *

+ * @return bool Returns true on success or false on failure. If called statically, returns a + * DOMDocument and issues E_STRICT + * warning. + */ + public function loadHTML ($source) {} + + /** + * Load HTML from a file + * @link http://www.php.net/manual/en/domdocument.loadhtmlfile.php + * @param filename string

+ * The path to the HTML file. + *

+ * @return bool Returns true on success or false on failure. If called statically, returns a + * DOMDocument and issues E_STRICT + * warning. + */ + public function loadHTMLFile ($filename) {} + + /** + * Dumps the internal document into a string using HTML formatting + * @link http://www.php.net/manual/en/domdocument.savehtml.php + * @return string the HTML, or false if an error occurred. + */ + public function saveHTML () {} + + /** + * Dumps the internal document into a file using HTML formatting + * @link http://www.php.net/manual/en/domdocument.savehtmlfile.php + * @param filename string

+ * The path to the saved HTML document. + *

+ * @return int the number of bytes written or false if an error occurred. + */ + public function saveHTMLFile ($filename) {} + + /** + * Validates a document based on a schema + * @link http://www.php.net/manual/en/domdocument.schemavalidate.php + * @param filename string

+ * The path to the schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function schemaValidate ($filename) {} + + /** + * Validates a document based on a schema + * @link http://www.php.net/manual/en/domdocument.schemavalidatesource.php + * @param source string

+ * A string containing the schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function schemaValidateSource ($source) {} + + /** + * Performs relaxNG validation on the document + * @link http://www.php.net/manual/en/domdocument.relaxngvalidate.php + * @param filename string

+ * The RNG file. + *

+ * @return bool Returns true on success or false on failure. + */ + public function relaxNGValidate ($filename) {} + + /** + * Performs relaxNG validation on the document + * @link http://www.php.net/manual/en/domdocument.relaxngvalidatesource.php + * @param source string

+ * A string containing the RNG schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function relaxNGValidateSource ($source) {} + + /** + * Register extended class used to create base node type + * @link http://www.php.net/manual/en/domdocument.registernodeclass.php + * @param baseclass string

+ * The DOM class that you want to extend. You can find a list of these + * classes in the chapter introduction. + *

+ * @param extendedclass string

+ * Your extended class name. If &null; is provided, any previously + * registered class extending baseclass will + * be removed. + *

+ * @return bool Returns true on success or false on failure. + */ + public function registerNodeClass ($baseclass, $extendedclass) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * @link http://www.php.net/manual/en/class.domnodelist.php + * + * @jms-builtin + */ +class DOMNodeList implements Traversable { + + /** + * The number of nodes in the list. The range of valid child node + * indices is 0 to length - 1 inclusive. + * @var int + * @link http://www.php.net/manual/en/class.domnodelist.php#domnodelist.props.length + */ + public $length; + + /** + * Retrieves a node specified by index + * @link http://www.php.net/manual/en/domnodelist.item.php + * @param index int

+ * Index of the node into the collection. + *

+ * @return DOMNode The node at the indexth position in the + * DOMNodeList, or &null; if that is not a valid + * index. + */ + public function item ($index) {} + +} + +/** + * @link http://www.php.net/manual/en/class.domnamednodemap.php + * + * @jms-builtin + */ +class DOMNamedNodeMap { + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domnamednodemap.php#domnamednodemap.props.name + */ + public $name; + + /** + * Retrieves a node specified by name + * @link http://www.php.net/manual/en/domnamednodemap.getnameditem.php + * @param name string

+ * The nodeName of the node to retrieve. + *

+ * @return DOMNode A node (of any type) with the specified nodeName, or + * &null; if no node is found. + */ + public function getNamedItem ($name) {} + + /** + * @param arg DOMNode + */ + public function setNamedItem (DOMNode $arg) {} + + /** + * @param name[optional] + */ + public function removeNamedItem ($name) {} + + /** + * Retrieves a node specified by index + * @link http://www.php.net/manual/en/domnamednodemap.item.php + * @param index int

+ * Index into this map. + *

+ * @return DOMNode The node at the indexth position in the map, or &null; + * if that is not a valid index (greater than or equal to the number of nodes + * in this map). + */ + public function item ($index) {} + + /** + * Retrieves a node specified by local name and namespace URI + * @link http://www.php.net/manual/en/domnamednodemap.getnameditemns.php + * @param namespaceURI string

+ * The namespace URI of the node to retrieve. + *

+ * @param localName string

+ * The local name of the node to retrieve. + *

+ * @return DOMNode A node (of any type) with the specified local name and namespace URI, or + * &null; if no node is found. + */ + public function getNamedItemNS ($namespaceURI, $localName) {} + + /** + * @param arg DOMNode[optional] + */ + public function setNamedItemNS (DOMNode $arg) {} + + /** + * @param namespaceURI[optional] + * @param localName[optional] + */ + public function removeNamedItemNS ($namespaceURI, $localName) {} + +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domcharacterdata.php + * + * @jms-builtin + */ +class DOMCharacterData extends DOMNode { + + /** + * The contents of the node. + * @var string + * @link http://www.php.net/manual/en/class.domcharacterdata.php#domcharacterdata.props.data + */ + public $data; + + /** + * The length of the contents. + * @var int + * @link http://www.php.net/manual/en/class.domcharacterdata.php#domcharacterdata.props.length + */ + public $length; + + /** + * Extracts a range of data from the node + * @link http://www.php.net/manual/en/domcharacterdata.substringdata.php + * @param offset int

+ * Start offset of substring to extract. + *

+ * @param count int

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * Append the string to the end of the character data of the node + * @link http://www.php.net/manual/en/domcharacterdata.appenddata.php + * @param data string

+ * The string to append. + *

+ * @return void + */ + public function appendData ($data) {} + + /** + * Insert a string at the specified 16-bit unit offset + * @link http://www.php.net/manual/en/domcharacterdata.insertdata.php + * @param offset int

+ * The character offset at which to insert. + *

+ * @param data string

+ * The string to insert. + *

+ * @return void + */ + public function insertData ($offset, $data) {} + + /** + * Remove a range of characters from the node + * @link http://www.php.net/manual/en/domcharacterdata.deletedata.php + * @param offset int

+ * The offset from which to start removing. + *

+ * @param count int

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void + */ + public function deleteData ($offset, $count) {} + + /** + * Replace a substring within the DOMCharacterData node + * @link http://www.php.net/manual/en/domcharacterdata.replacedata.php + * @param offset int

+ * The offset from which to start replacing. + *

+ * @param count int

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param data string

+ * The string with which the range must be replaced. + *

+ * @return void + */ + public function replaceData ($offset, $count, $data) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode. The DOMAttr + * interface represents an attribute in an DOMElement object. + * @link http://www.php.net/manual/en/class.domattr.php + * + * @jms-builtin + */ +class DOMAttr extends DOMNode { + + /** + * The name of the attribute + * @var string + * @link http://www.php.net/manual/en/class.domattr.php#domattr.props.name + */ + public $name; + + /** + * The element which contains the attribute + * @var DOMElement + * @link http://www.php.net/manual/en/class.domattr.php#domattr.props.ownerelement + */ + public $ownerElement; + + /** + * Not implemented yet, always is &null; + * @var bool + * @link http://www.php.net/manual/en/class.domattr.php#domattr.props.schematypeinfo + */ + public $schemaTypeInfo; + + /** + * Not implemented yet, always is &null; + * @var bool + * @link http://www.php.net/manual/en/class.domattr.php#domattr.props.specified + */ + public $specified; + + /** + * The value of the attribute + * @var string + * @link http://www.php.net/manual/en/class.domattr.php#domattr.props.value + */ + public $value; + + /** + * Checks if attribute is a defined ID + * @link http://www.php.net/manual/en/domattr.isid.php + * @return bool Returns true on success or false on failure. + */ + public function isId () {} + + /** + * Creates a new DOMAttr object + * @link http://www.php.net/manual/en/domattr.construct.php + * @param name + * @param value[optional] + */ + public function __construct ($name, $value) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domelement.php + * + * @jms-builtin + */ +class DOMElement extends DOMNode { + + /** + * Not implemented yet, always return &null; + * @var bool + * @link http://www.php.net/manual/en/class.domelement.php#domelement.props.schematypeinfo + */ + public $schemaTypeInfo; + + /** + * The element name + * @var string + * @link http://www.php.net/manual/en/class.domelement.php#domelement.props.tagname + */ + public $tagName; + + /** + * Returns value of attribute + * @link http://www.php.net/manual/en/domelement.getattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given name is found. + */ + public function getAttribute ($name) {} + + /** + * Adds new attribute + * @link http://www.php.net/manual/en/domelement.setattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @return DOMAttr The new DOMAttr or false if an error occured. + */ + public function setAttribute ($name, $value) {} + + /** + * Removes attribute + * @link http://www.php.net/manual/en/domelement.removeattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @return bool Returns true on success or false on failure. + */ + public function removeAttribute ($name) {} + + /** + * Returns attribute node + * @link http://www.php.net/manual/en/domelement.getattributenode.php + * @param name string

+ * The name of the attribute. + *

+ * @return DOMAttr The attribute node. + */ + public function getAttributeNode ($name) {} + + /** + * Adds new attribute node to element + * @link http://www.php.net/manual/en/domelement.setattributenode.php + * @param attr DOMAttr

+ * The attribute node. + *

+ * @return DOMAttr old node if the attribute has been replaced or &null;. + */ + public function setAttributeNode (DOMAttr $attr) {} + + /** + * Removes attribute + * @link http://www.php.net/manual/en/domelement.removeattributenode.php + * @param oldnode DOMAttr

+ * The attribute node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function removeAttributeNode (DOMAttr $oldnode) {} + + /** + * Gets elements by tagname + * @link http://www.php.net/manual/en/domelement.getelementsbytagname.php + * @param name string

+ * The tag name. Use * to return all elements within + * the element tree. + *

+ * @return DOMNodeList This function returns a new instance of the class + * DOMNodeList of all matched elements. + */ + public function getElementsByTagName ($name) {} + + /** + * Returns value of attribute + * @link http://www.php.net/manual/en/domelement.getattributens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param localName string

+ * The local name. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given localName and namespaceURI + * is found. + */ + public function getAttributeNS ($namespaceURI, $localName) {} + + /** + * Adds new attribute + * @link http://www.php.net/manual/en/domelement.setattributens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param qualifiedName string

+ * The qualified name of the attribute, as prefix:tagname. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @return void + */ + public function setAttributeNS ($namespaceURI, $qualifiedName, $value) {} + + /** + * Removes attribute + * @link http://www.php.net/manual/en/domelement.removeattributens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param localName string

+ * The local name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function removeAttributeNS ($namespaceURI, $localName) {} + + /** + * Returns attribute node + * @link http://www.php.net/manual/en/domelement.getattributenodens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param localName string

+ * The local name. + *

+ * @return DOMAttr The attribute node. + */ + public function getAttributeNodeNS ($namespaceURI, $localName) {} + + /** + * Adds new attribute node to element + * @link http://www.php.net/manual/en/domelement.setattributenodens.php + * @param attr DOMAttr

+ * The attribute node. + *

+ * @return DOMAttr the old node if the attribute has been replaced. + */ + public function setAttributeNodeNS (DOMAttr $attr) {} + + /** + * Get elements by namespaceURI and localName + * @link http://www.php.net/manual/en/domelement.getelementsbytagnamens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param localName string

+ * The local name. Use * to return all elements within + * the element tree. + *

+ * @return DOMNodeList This function returns a new instance of the class + * DOMNodeList of all matched elements in the order in + * which they are encountered in a preorder traversal of this element tree. + */ + public function getElementsByTagNameNS ($namespaceURI, $localName) {} + + /** + * Checks to see if attribute exists + * @link http://www.php.net/manual/en/domelement.hasattribute.php + * @param name string

+ * The attribute name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function hasAttribute ($name) {} + + /** + * Checks to see if attribute exists + * @link http://www.php.net/manual/en/domelement.hasattributens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param localName string

+ * The local name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function hasAttributeNS ($namespaceURI, $localName) {} + + /** + * Declares the attribute specified by name to be of type ID + * @link http://www.php.net/manual/en/domelement.setidattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @param isId bool

+ * Set it to true if you want name to be of type + * ID, false otherwise. + *

+ * @return void + */ + public function setIdAttribute ($name, $isId) {} + + /** + * Declares the attribute specified by local name and namespace URI to be of type ID + * @link http://www.php.net/manual/en/domelement.setidattributens.php + * @param namespaceURI string

+ * The namespace URI of the attribute. + *

+ * @param localName string

+ * The local name of the attribute, as prefix:tagname. + *

+ * @param isId bool

+ * Set it to true if you want name to be of type + * ID, false otherwise. + *

+ * @return void + */ + public function setIdAttributeNS ($namespaceURI, $localName, $isId) {} + + /** + * Declares the attribute specified by node to be of type ID + * @link http://www.php.net/manual/en/domelement.setidattributenode.php + * @param attr DOMAttr

+ * The attribute node. + *

+ * @param isId bool

+ * Set it to true if you want name to be of type + * ID, false otherwise. + *

+ * @return void + */ + public function setIdAttributeNode (DOMAttr $attr, $isId) {} + + /** + * Creates a new DOMElement object + * @link http://www.php.net/manual/en/domelement.construct.php + * @param name + * @param value[optional] + * @param uri[optional] + */ + public function __construct ($name, $value, $uri) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMCharacterData. + * @link http://www.php.net/manual/en/class.domtext.php + * + * @jms-builtin + */ +class DOMText extends DOMCharacterData { + + /** + * Holds all the text of logically-adjacent (not separated by Element, + * Comment or Processing Instruction) Text nodes. + * @var string + * @link http://www.php.net/manual/en/class.domtext.php#domtext.props.wholetext + */ + public $wholeText; + + /** + * Breaks this node into two nodes at the specified offset + * @link http://www.php.net/manual/en/domtext.splittext.php + * @param offset int

+ * The offset at which to split, starting from 0. + *

+ * @return DOMText The new node of the same type, which contains all the content at and after the + * offset. + */ + public function splitText ($offset) {} + + /** + * Indicates whether this text node contains whitespace + * @link http://www.php.net/manual/en/domtext.iswhitespaceinelementcontent.php + * @return bool Returns true on success or false on failure. + */ + public function isWhitespaceInElementContent () {} + + public function isElementContentWhitespace () {} + + /** + * @param content + */ + public function replaceWholeText ($content) {} + + /** + * Creates a new DOMText object + * @link http://www.php.net/manual/en/domtext.construct.php + * @param value[optional] + */ + public function __construct ($value) {} + + /** + * Extracts a range of data from the node + * @link http://www.php.net/manual/en/domcharacterdata.substringdata.php + * @param offset int

+ * Start offset of substring to extract. + *

+ * @param count int

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * Append the string to the end of the character data of the node + * @link http://www.php.net/manual/en/domcharacterdata.appenddata.php + * @param data string

+ * The string to append. + *

+ * @return void + */ + public function appendData ($data) {} + + /** + * Insert a string at the specified 16-bit unit offset + * @link http://www.php.net/manual/en/domcharacterdata.insertdata.php + * @param offset int

+ * The character offset at which to insert. + *

+ * @param data string

+ * The string to insert. + *

+ * @return void + */ + public function insertData ($offset, $data) {} + + /** + * Remove a range of characters from the node + * @link http://www.php.net/manual/en/domcharacterdata.deletedata.php + * @param offset int

+ * The offset from which to start removing. + *

+ * @param count int

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void + */ + public function deleteData ($offset, $count) {} + + /** + * Replace a substring within the DOMCharacterData node + * @link http://www.php.net/manual/en/domcharacterdata.replacedata.php + * @param offset int

+ * The offset from which to start replacing. + *

+ * @param count int

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param data string

+ * The string with which the range must be replaced. + *

+ * @return void + */ + public function replaceData ($offset, $count, $data) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMCharacterData. + * @link http://www.php.net/manual/en/class.domcomment.php + * + * @jms-builtin + */ +class DOMComment extends DOMCharacterData { + + /** + * Creates a new DOMComment object + * @link http://www.php.net/manual/en/domcomment.construct.php + * @param value[optional] + */ + public function __construct ($value) {} + + /** + * Extracts a range of data from the node + * @link http://www.php.net/manual/en/domcharacterdata.substringdata.php + * @param offset int

+ * Start offset of substring to extract. + *

+ * @param count int

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * Append the string to the end of the character data of the node + * @link http://www.php.net/manual/en/domcharacterdata.appenddata.php + * @param data string

+ * The string to append. + *

+ * @return void + */ + public function appendData ($data) {} + + /** + * Insert a string at the specified 16-bit unit offset + * @link http://www.php.net/manual/en/domcharacterdata.insertdata.php + * @param offset int

+ * The character offset at which to insert. + *

+ * @param data string

+ * The string to insert. + *

+ * @return void + */ + public function insertData ($offset, $data) {} + + /** + * Remove a range of characters from the node + * @link http://www.php.net/manual/en/domcharacterdata.deletedata.php + * @param offset int

+ * The offset from which to start removing. + *

+ * @param count int

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void + */ + public function deleteData ($offset, $count) {} + + /** + * Replace a substring within the DOMCharacterData node + * @link http://www.php.net/manual/en/domcharacterdata.replacedata.php + * @param offset int

+ * The offset from which to start replacing. + *

+ * @param count int

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param data string

+ * The string with which the range must be replaced. + *

+ * @return void + */ + public function replaceData ($offset, $count, $data) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** @jms-builtin */ +class DOMTypeinfo { +} + +/** @jms-builtin */ +class DOMUserDataHandler { + + public function handle () {} + +} + +/** @jms-builtin */ +class DOMDomError { +} + +/** @jms-builtin */ +class DOMErrorHandler { + + /** + * @param error DOMError + */ + public function handleError (DOMError $error) {} + +} + +/** @jms-builtin */ +class DOMLocator { +} + +/** @jms-builtin */ +class DOMConfiguration { + + /** + * @param name + * @param value + */ + public function setParameter ($name, $value) {} + + /** + * @param name[optional] + */ + public function getParameter ($name) {} + + /** + * @param name[optional] + * @param value[optional] + */ + public function canSetParameter ($name, $value) {} + +} + +/** @jms-builtin */ +class DOMCdataSection extends DOMText { + + /** + * @param value + */ + public function __construct ($value) {} + + /** + * Breaks this node into two nodes at the specified offset + * @link http://www.php.net/manual/en/domtext.splittext.php + * @param offset int

+ * The offset at which to split, starting from 0. + *

+ * @return DOMText The new node of the same type, which contains all the content at and after the + * offset. + */ + public function splitText ($offset) {} + + /** + * Indicates whether this text node contains whitespace + * @link http://www.php.net/manual/en/domtext.iswhitespaceinelementcontent.php + * @return bool Returns true on success or false on failure. + */ + public function isWhitespaceInElementContent () {} + + public function isElementContentWhitespace () {} + + /** + * @param content + */ + public function replaceWholeText ($content) {} + + /** + * Extracts a range of data from the node + * @link http://www.php.net/manual/en/domcharacterdata.substringdata.php + * @param offset int

+ * Start offset of substring to extract. + *

+ * @param count int

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * Append the string to the end of the character data of the node + * @link http://www.php.net/manual/en/domcharacterdata.appenddata.php + * @param data string

+ * The string to append. + *

+ * @return void + */ + public function appendData ($data) {} + + /** + * Insert a string at the specified 16-bit unit offset + * @link http://www.php.net/manual/en/domcharacterdata.insertdata.php + * @param offset int

+ * The character offset at which to insert. + *

+ * @param data string

+ * The string to insert. + *

+ * @return void + */ + public function insertData ($offset, $data) {} + + /** + * Remove a range of characters from the node + * @link http://www.php.net/manual/en/domcharacterdata.deletedata.php + * @param offset int

+ * The offset from which to start removing. + *

+ * @param count int

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void + */ + public function deleteData ($offset, $count) {} + + /** + * Replace a substring within the DOMCharacterData node + * @link http://www.php.net/manual/en/domcharacterdata.replacedata.php + * @param offset int

+ * The offset from which to start replacing. + *

+ * @param count int

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param data string

+ * The string with which the range must be replaced. + *

+ * @return void + */ + public function replaceData ($offset, $count, $data) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode + * @link http://www.php.net/manual/en/class.domdocumenttype.php + * + * @jms-builtin + */ +class DOMDocumentType extends DOMNode { + + /** + * The public identifier of the external subset. + * @var string + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.publicid + */ + public $publicId; + + /** + * The system identifier of the external subset. This may be an + * absolute URI or not. + * @var string + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.systemid + */ + public $systemId; + + /** + * The name of DTD; i.e., the name immediately following the + * DOCTYPE keyword. + * @var string + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.name + */ + public $name; + + /** + * A DOMNamedNodeMap containing the general + * entities, both external and internal, declared in the DTD. + * @var DOMNamedNodeMap + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.entities + */ + public $entities; + + /** + * A DOMNamedNodeMap containing the notations + * declared in the DTD. + * @var DOMNamedNodeMap + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.notations + */ + public $notations; + + /** + * The internal subset as a string, or null if there is none. This is + * does not contain the delimiting square brackets. + * @var string + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.internalsubset + */ + public $internalSubset; + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode + * @link http://www.php.net/manual/en/class.domnotation.php + * + * @jms-builtin + */ +class DOMNotation { + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domnotation.php#domnotation.props.publicid + */ + public $publicId; + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domnotation.php#domnotation.props.systemid + */ + public $systemId; +} + +/** + * Extends DOMNode + * @link http://www.php.net/manual/en/class.domentity.php + * + * @jms-builtin + */ +class DOMEntity extends DOMNode { + + /** + * The public identifier associated with the entity if specified, and + * &null; otherwise. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.publicid + */ + public $publicId; + + /** + * The system identifier associated with the entity if specified, and + * &null; otherwise. This may be an absolute URI or not. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.systemid + */ + public $systemId; + + /** + * For unparsed entities, the name of the notation for the entity. For + * parsed entities, this is &null;. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.notationname + */ + public $notationName; + + /** + * An attribute specifying the encoding used for this entity at the + * time of parsing, when it is an external parsed entity. This is + * &null; if it an entity from the internal subset or if it is not + * known. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.actualencoding + */ + public $actualEncoding; + + /** + * An attribute specifying, as part of the text declaration, the + * encoding of this entity, when it is an external parsed entity. This + * is &null; otherwise. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.encoding + */ + public $encoding; + + /** + * An attribute specifying, as part of the text declaration, the + * version number of this entity, when it is an external parsed + * entity. This is &null; otherwise. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.version + */ + public $version; + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domentityreference.php + * + * @jms-builtin + */ +class DOMEntityReference extends DOMNode { + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domentityreference.php#domentityreference.props.name + */ + public $name; + + /** + * Creates a new DOMEntityReference object + * @link http://www.php.net/manual/en/domentityreference.construct.php + * @param name + */ + public function __construct ($name) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domprocessinginstruction.php + * + * @jms-builtin + */ +class DOMProcessingInstruction extends DOMNode { + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domprocessinginstruction.php#domprocessinginstruction.props.target + */ + public $target; + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domprocessinginstruction.php#domprocessinginstruction.props.data + */ + public $data; + + /** + * Creates a new DOMProcessingInstruction object + * @link http://www.php.net/manual/en/domprocessinginstruction.construct.php + * @param name + * @param value[optional] + */ + public function __construct ($name, $value) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** @jms-builtin */ +class DOMStringExtend { + + /** + * @param offset32 + */ + public function findOffset16 ($offset32) {} + + /** + * @param offset16 + */ + public function findOffset32 ($offset16) {} + +} + +/** + * @link http://www.php.net/manual/en/class.domxpath.php + * + * @jms-builtin + */ +class DOMXPath { + + /** + * Prop description + * @var DOMDocument + * @link http://www.php.net/manual/en/class.domxpath.php#domxpath.props.document + */ + public $document; + + /** + * Creates a new DOMXPath object + * @link http://www.php.net/manual/en/domxpath.construct.php + * @param doc DOMDocument + */ + public function __construct (DOMDocument $doc) {} + + /** + * Registers the namespace with the DOMXPath object + * @link http://www.php.net/manual/en/domxpath.registernamespace.php + * @param prefix string

+ * The prefix. + *

+ * @param namespaceURI string

+ * The URI of the namespace. + *

+ * @return bool Returns true on success or false on failure. + */ + public function registerNamespace ($prefix, $namespaceURI) {} + + /** + * Evaluates the given XPath expression + * @link http://www.php.net/manual/en/domxpath.query.php + * @param expression string

+ * The XPath expression to execute. + *

+ * @param contextnode DOMNode[optional]

+ * The optional contextnode can be specified for + * doing relative XPath queries. By default, the queries are relative to + * the root element. + *

+ * @return DOMNodeList a DOMNodeList containing all nodes matching + * the given XPath expression. Any expression which do + * not return nodes will return an empty DOMNodeList. + */ + public function query ($expression, DOMNode $contextnode = null) {} + + /** + * Evaluates the given XPath expression and returns a typed result if possible. + * @link http://www.php.net/manual/en/domxpath.evaluate.php + * @param expression string

+ * The XPath expression to execute. + *

+ * @param contextnode DOMNode[optional]

+ * The optional contextnode can be specified for + * doing relative XPath queries. By default, the queries are relative to + * the root element. + *

+ * @return mixed a typed result if possible or a DOMNodeList + * containing all nodes matching the given XPath expression. + */ + public function evaluate ($expression, DOMNode $contextnode = null) {} + +} + +/** + * Gets a DOMElement object from a + SimpleXMLElement object + * @link http://www.php.net/manual/en/function.dom-import-simplexml.php + * @param node SimpleXMLElement

+ * The SimpleXMLElement node. + *

+ * @return DOMElement The DOMElement node added or false if any errors occur. + * + * @jms-builtin + */ +function dom_import_simplexml (SimpleXMLElement $node) {} + + +/** + * Node is an element + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_ELEMENT_NODE', 1); + +/** + * Node is an attribute + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_ATTRIBUTE_NODE', 2); + +/** + * Node is a piece of text + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_TEXT_NODE', 3); +define ('XML_CDATA_SECTION_NODE', 4); +define ('XML_ENTITY_REF_NODE', 5); + +/** + * Node is an entity like &nbsp; + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_ENTITY_NODE', 6); + +/** + * Node is a processing instruction + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_PI_NODE', 7); + +/** + * Node is a comment + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_COMMENT_NODE', 8); + +/** + * Node is a document + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_DOCUMENT_NODE', 9); +define ('XML_DOCUMENT_TYPE_NODE', 10); +define ('XML_DOCUMENT_FRAG_NODE', 11); +define ('XML_NOTATION_NODE', 12); +define ('XML_HTML_DOCUMENT_NODE', 13); +define ('XML_DTD_NODE', 14); +define ('XML_ELEMENT_DECL_NODE', 15); +define ('XML_ATTRIBUTE_DECL_NODE', 16); +define ('XML_ENTITY_DECL_NODE', 17); +define ('XML_NAMESPACE_DECL_NODE', 18); +define ('XML_LOCAL_NAMESPACE', 18); +define ('XML_ATTRIBUTE_CDATA', 1); +define ('XML_ATTRIBUTE_ID', 2); +define ('XML_ATTRIBUTE_IDREF', 3); +define ('XML_ATTRIBUTE_IDREFS', 4); +define ('XML_ATTRIBUTE_ENTITY', 6); +define ('XML_ATTRIBUTE_NMTOKEN', 7); +define ('XML_ATTRIBUTE_NMTOKENS', 8); +define ('XML_ATTRIBUTE_ENUMERATION', 9); +define ('XML_ATTRIBUTE_NOTATION', 10); + +/** + * Error code not part of the DOM specification. Meant for PHP errors. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_PHP_ERR', 0); + +/** + * If index or size is negative, or greater than the allowed value. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INDEX_SIZE_ERR', 1); + +/** + * If the specified range of text does not fit into a + * DOMString. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOMSTRING_SIZE_ERR', 2); + +/** + * If any node is inserted somewhere it doesn't belong + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_HIERARCHY_REQUEST_ERR', 3); + +/** + * If a node is used in a different document than the one that created it. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_WRONG_DOCUMENT_ERR', 4); + +/** + * If an invalid or illegal character is specified, such as in a name. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_CHARACTER_ERR', 5); + +/** + * If data is specified for a node which does not support data. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_NO_DATA_ALLOWED_ERR', 6); + +/** + * If an attempt is made to modify an object where modifications are not allowed. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_NO_MODIFICATION_ALLOWED_ERR', 7); + +/** + * If an attempt is made to reference a node in a context where it does not exist. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_NOT_FOUND_ERR', 8); + +/** + * If the implementation does not support the requested type of object or operation. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_NOT_SUPPORTED_ERR', 9); + +/** + * If an attempt is made to add an attribute that is already in use elsewhere. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INUSE_ATTRIBUTE_ERR', 10); + +/** + * If an attempt is made to use an object that is not, or is no longer, usable. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_STATE_ERR', 11); + +/** + * If an invalid or illegal string is specified. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_SYNTAX_ERR', 12); + +/** + * If an attempt is made to modify the type of the underlying object. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_MODIFICATION_ERR', 13); + +/** + * If an attempt is made to create or change an object in a way which is + * incorrect with regard to namespaces. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_NAMESPACE_ERR', 14); + +/** + * If a parameter or an operation is not supported by the underlying object. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_ACCESS_ERR', 15); + +/** + * If a call to a method such as insertBefore or removeChild would make the Node + * invalid with respect to "partial validity", this exception would be raised and + * the operation would not be done. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_VALIDATION_ERR', 16); + +// End of dom v.20031129 +?> diff --git a/res/php-5.2-core-api/exif.php b/res/php-5.2-core-api/exif.php new file mode 100644 index 0000000..ac2dcfe --- /dev/null +++ b/res/php-5.2-core-api/exif.php @@ -0,0 +1,147 @@ +EXIF headers from JPEG or TIFF + * @link http://www.php.net/manual/en/function.exif-read-data.php + * @param filename string

+ * The name of the image file being read. This cannot be an + * URL. + *

+ * @param sections string[optional]

+ * Is a comma separated list of sections that need to be present in file + * to produce a result array. If none of the requested + * sections could be found the return value is false. + * + * FILE + * FileName, FileSize, FileDateTime, SectionsFound + * + * + * COMPUTED + * + * html, Width, Height, IsColor, and more if available. Height and + * Width are computed the same way getimagesize + * does so their values must not be part of any header returned. + * Also, html is a height/width text string to be used inside normal + * HTML. + * + * + * + * ANY_TAG + * Any information that has a Tag e.g. IFD0, EXIF, ... + * + * + * IFD0 + * + * All tagged data of IFD0. In normal imagefiles this contains + * image size and so forth. + * + * + * + * THUMBNAIL + * + * A file is supposed to contain a thumbnail if it has a second IFD. + * All tagged information about the embedded thumbnail is stored in + * this section. + * + * + * + * COMMENT + * Comment headers of JPEG images. + * + * + * EXIF + * + * The EXIF section is a sub section of IFD0. It contains + * more detailed information about an image. Most of these entries + * are digital camera related. + * + * + *

+ * @param arrays bool[optional]

+ * Specifies whether or not each section becomes an array. The + * sections COMPUTED, + * THUMBNAIL, and COMMENT + * always become arrays as they may contain values whose names conflict + * with other sections. + *

+ * @param thumbnail bool[optional]

+ * When set to true the thumbnail itself is read. Otherwise, only the + * tagged data is read. + *

+ * @return array It returns an associative array where the array indexes are + * the header names and the array values are the values associated with + * those headers. If no data can be returned, + * exif_read_data will return false. + * + * @jms-builtin + */ +function exif_read_data ($filename, $sections = null, $arrays = null, $thumbnail = null) {} + +/** + * &Alias; exif_read_data + * @link http://www.php.net/manual/en/function.read-exif-data.php + * @param filename + * @param sections_needed[optional] + * @param sub_arrays[optional] + * @param read_thumbnail[optional] + * + * @jms-builtin + */ +function read_exif_data ($filename, $sections_needed, $sub_arrays, $read_thumbnail) {} + +/** + * Get the header name for an index + * @link http://www.php.net/manual/en/function.exif-tagname.php + * @param index int

+ * The image index + *

+ * @return string the header name, or false if index is + * undefined. + * + * @jms-builtin + */ +function exif_tagname ($index) {} + +/** + * Retrieve the embedded thumbnail of a TIFF or JPEG image + * @link http://www.php.net/manual/en/function.exif-thumbnail.php + * @param filename string

+ * The name of the image file being read. This image contains an + * embedded thumbnail. + *

+ * @param width int[optional]

+ * The return width of the returned thumbnail. + *

+ * @param height int[optional]

+ * The returned height of the returned thumbnail. + *

+ * @param imagetype int[optional]

+ * The returned image type of the returned thumbnail. This is either + * TIFF or JPEG. + *

+ * @return string the embedded thumbnail, or false if the image contains no + * thumbnail. + * + * @jms-builtin + */ +function exif_thumbnail ($filename, &$width = null, &$height = null, &$imagetype = null) {} + +/** + * Determine the type of an image + * @link http://www.php.net/manual/en/function.exif-imagetype.php + * @param filename string The image being checked. + * @return int When a correct signature is found, the appropriate constant value will be + * returned otherwise the return value is false. The return value is the + * same value that getimagesize returns in index 2 but + * exif_imagetype is much faster. + * + * @jms-builtin + */ +function exif_imagetype ($filename) {} + +define ('EXIF_USE_MBSTRING', 0); + +// End of exif v.1.4 $Id: exif.php,v 1.11 2010/08/10 01:43:36 qiwang Exp $ +?> diff --git a/res/php-5.2-core-api/filter.php b/res/php-5.2-core-api/filter.php new file mode 100644 index 0000000..f8a8fc3 --- /dev/null +++ b/res/php-5.2-core-api/filter.php @@ -0,0 +1,496 @@ + + * One of INPUT_GET, INPUT_POST, + * INPUT_COOKIE, INPUT_SERVER, + * INPUT_ENV, INPUT_SESSION (not + * implemented yet) or INPUT_REQUEST (not + * implemented yet). + *

+ * @param variable_name string

+ * Name of a variable to get. + *

+ * @param filter int[optional]

+ * Filter to apply. + *

+ * @param options mixed[optional]

+ * Associative array of options or bitwise disjunction of flags. If filter + * accepts options, flags can be provided in "flags" field of array. + *

+ * @return mixed Value of the requested variable on success, false if the filter fails, + * or &null; if the variable_name variable is not set. + * If the flag FILTER_NULL_ON_FAILURE is used, it + * returns false if the variable is not set and &null; if the filter fails. + * + * @jms-builtin + */ +function filter_input ($type, $variable_name, $filter = null, $options = null) {} + +/** + * Filters a variable with a specified filter + * @link http://www.php.net/manual/en/function.filter-var.php + * @param variable mixed

+ * Value to filter. + *

+ * @param filter int[optional]

+ * ID of a filter to use (see the manual page). + *

+ * @param options mixed[optional]

+ * Associative array of options or bitwise disjunction of flags. If filter + * accepts options, flags can be provided in "flags" field of array. For + * the "callback" filter, callback type should be passed. The + * callback must accept one argument, the value to be filtered, and return + * the value after filtering/sanitizing it. + *

+ *

+ * array( + * 'default' => 3, // value to return if the filter fails + * // other options here + * 'min_range' => 0 + * ), + * 'flags' => FILTER_FLAG_ALLOW_OCTAL, + * ); + * $var = filter_var('0755', FILTER_VALIDATE_INT, $options); + * // for filter that only accept flags, you can pass them directly + * $var = filter_var('oops', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + * // for filter that only accept flags, you can also pass as an array + * $var = filter_var('oops', FILTER_VALIDATE_BOOLEAN, + * array('flags' => FILTER_NULL_ON_FAILURE)); + * // callback filter + * function foo($value) + * { + * $ret = new stdClass; + * $ret->value = filter_var($value, FILTER_VALIDATE_BOOLEAN, + * array('flags' => FILTER_NULL_ON_FAILURE)); + * return $ret; + * } + * $var = filter_var('yes', FILTER_CALLBACK, array('options' => 'foo')); + * ?> + * ]]> + *

+ * @return mixed the filtered data, or false if the filter fails. + * + * @jms-builtin + */ +function filter_var ($variable, $filter = null, $options = null) {} + +/** + * Gets external variables and optionally filters them + * @link http://www.php.net/manual/en/function.filter-input-array.php + * @param type int

+ * One of INPUT_GET, INPUT_POST, + * INPUT_COOKIE, INPUT_SERVER, + * INPUT_ENV, INPUT_SESSION (not implemented yet), or + * INPUT_REQUEST (not implemented yet). + *

+ * @param definition mixed[optional]

+ * An array defining the arguments. A valid key is a string + * containing a variable name and a valid value is either a filter type, + * or an array optionally specifying the filter, flags and + * options. If the value is an array, valid keys are + * filter which specifies the filter type, + * flags which specifies any flags that apply to the + * filter, and options which specifies any options + * that apply to the filter. See the example below for a better + * understanding. + *

+ *

+ * This parameter can be also an integer holding a filter constant. Then all values in the + * input array are filtered by this filter. + *

+ * @return mixed An array containing the values of the requested variables on success, or false + * on failure. An array value will be false if the filter fails, or &null; if + * the variable is not set. Or if the flag FILTER_NULL_ON_FAILURE + * is used, it returns false if the variable is not set and &null; if the filter + * fails. + * + * @jms-builtin + */ +function filter_input_array ($type, $definition = null) {} + +/** + * Gets multiple variables and optionally filters them + * @link http://www.php.net/manual/en/function.filter-var-array.php + * @param data array

+ * An array with string keys containing the data to filter. + *

+ * @param definition mixed[optional]

+ * An array defining the arguments. A valid key is a string + * containing a variable name and a valid value is either a filter type, + * or an array optionally specifying the filter, flags and + * options. If the value is an array, valid keys are + * filter which specifies the filter type, + * flags which specifies any flags that apply to the + * filter, and options which specifies any options + * that apply to the filter. See the example below for a better + * understanding. + *

+ *

+ * This parameter can be also an integer holding a filter constant. Then all values in the + * input array are filtered by this filter. + *

+ * @return mixed An array containing the values of the requested variables on success, or false + * on failure. An array value will be false if the filter fails, or &null; if + * the variable is not set. + * + * @jms-builtin + */ +function filter_var_array (array $data, $definition = null) {} + +/** + * Returns a list of all supported filters + * @link http://www.php.net/manual/en/function.filter-list.php + * @return array an array of names of all supported filters, empty array if there + * are no such filters. Indexes of this array are not filter IDs, they can be + * obtained with filter_id from a name instead. + * + * @jms-builtin + */ +function filter_list () {} + +/** + * Checks if variable of specified type exists + * @link http://www.php.net/manual/en/function.filter-has-var.php + * @param type int

+ * One of INPUT_GET, INPUT_POST, + * INPUT_COOKIE, INPUT_SERVER, + * INPUT_ENV. + *

+ * @param variable_name string

+ * Name of a variable to check. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function filter_has_var ($type, $variable_name) {} + +/** + * Returns the filter ID belonging to a named filter + * @link http://www.php.net/manual/en/function.filter-id.php + * @param filtername string

+ * Name of a filter to get. + *

+ * @return int ID of a filter on success or &null; if filter doesn't exist. + * + * @jms-builtin + */ +function filter_id ($filtername) {} + + +/** + * POST variables. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_POST', 0); + +/** + * GET variables. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_GET', 1); + +/** + * COOKIE variables. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_COOKIE', 2); + +/** + * ENV variables. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_ENV', 4); + +/** + * SERVER variables. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_SERVER', 5); + +/** + * SESSION variables. + * (not implemented yet) + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_SESSION', 6); + +/** + * REQUEST variables. + * (not implemented yet) + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_REQUEST', 99); + +/** + * No flags. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NONE', 0); + +/** + * Flag used to require scalar as input + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_REQUIRE_SCALAR', 33554432); + +/** + * Require an array as input. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_REQUIRE_ARRAY', 16777216); + +/** + * Always returns an array. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FORCE_ARRAY', 67108864); + +/** + * Use NULL instead of FALSE on failure. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_NULL_ON_FAILURE', 134217728); + +/** + * ID of "int" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_INT', 257); + +/** + * ID of "boolean" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_BOOLEAN', 258); + +/** + * ID of "float" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_FLOAT', 259); + +/** + * ID of "validate_regexp" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_REGEXP', 272); + +/** + * ID of "validate_url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_URL', 273); + +/** + * ID of "validate_email" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_EMAIL', 274); + +/** + * ID of "validate_ip" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_IP', 275); + +/** + * ID of default ("string") filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_DEFAULT', 516); + +/** + * ID of "unsafe_raw" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_UNSAFE_RAW', 516); + +/** + * ID of "string" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_STRING', 513); + +/** + * ID of "stripped" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_STRIPPED', 513); + +/** + * ID of "encoded" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_ENCODED', 514); + +/** + * ID of "special_chars" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_SPECIAL_CHARS', 515); + +/** + * ID of "email" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_EMAIL', 517); + +/** + * ID of "url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_URL', 518); + +/** + * ID of "number_int" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_NUMBER_INT', 519); + +/** + * ID of "number_float" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_NUMBER_FLOAT', 520); + +/** + * ID of "magic_quotes" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_MAGIC_QUOTES', 521); + +/** + * ID of "callback" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_CALLBACK', 1024); + +/** + * Allow octal notation (0[0-7]+) in "int" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_OCTAL', 1); + +/** + * Allow hex notation (0x[0-9a-fA-F]+) in "int" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_HEX', 2); + +/** + * Strip characters with ASCII value less than 32. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_STRIP_LOW', 4); + +/** + * Strip characters with ASCII value greater than 127. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_STRIP_HIGH', 8); + +/** + * Encode characters with ASCII value less than 32. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ENCODE_LOW', 16); + +/** + * Encode characters with ASCII value greater than 127. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ENCODE_HIGH', 32); + +/** + * Encode &. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ENCODE_AMP', 64); + +/** + * Don't encode ' and ". + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NO_ENCODE_QUOTES', 128); + +/** + * (No use for now.) + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_EMPTY_STRING_NULL', 256); + +/** + * Allow fractional part in "number_float" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_FRACTION', 4096); + +/** + * Allow thousand separator (,) in "number_float" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_THOUSAND', 8192); + +/** + * Allow scientific notation (e, E) in + * "number_float" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_SCIENTIFIC', 16384); + +/** + * Require scheme in "validate_url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_SCHEME_REQUIRED', 65536); + +/** + * Require host in "validate_url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_HOST_REQUIRED', 131072); + +/** + * Require path in "validate_url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_PATH_REQUIRED', 262144); + +/** + * Require query in "validate_url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_QUERY_REQUIRED', 524288); + +/** + * Allow only IPv4 address in "validate_ip" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_IPV4', 1048576); + +/** + * Allow only IPv6 address in "validate_ip" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_IPV6', 2097152); + +/** + * Deny reserved addresses in "validate_ip" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NO_RES_RANGE', 4194304); + +/** + * Deny private addresses in "validate_ip" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NO_PRIV_RANGE', 8388608); + +// End of filter v.0.11.0 +?> diff --git a/res/php-5.2-core-api/ftp.php b/res/php-5.2-core-api/ftp.php new file mode 100644 index 0000000..91edef9 --- /dev/null +++ b/res/php-5.2-core-api/ftp.php @@ -0,0 +1,732 @@ + + * The FTP server address. This parameter shouldn't have any trailing + * slashes and shouldn't be prefixed with ftp://. + *

+ * @param port int[optional]

+ * This parameter specifies an alternate port to connect to. If it is + * omitted or set to zero, then the default FTP port, 21, will be used. + *

+ * @param timeout int[optional]

+ * This parameter specifies the timeout for all subsequent network operations. + * If omitted, the default value is 90 seconds. The timeout can be changed and + * queried at any time with ftp_set_option and + * ftp_get_option. + *

+ * @return resource a FTP stream on success or false on error. + * + * @jms-builtin + */ +function ftp_connect ($host, $port = null, $timeout = null) {} + +/** + * Opens an Secure SSL-FTP connection + * @link http://www.php.net/manual/en/function.ftp-ssl-connect.php + * @param host string

+ * The FTP server address. This parameter shouldn't have any trailing + * slashes and shouldn't be prefixed with ftp://. + *

+ * @param port int[optional]

+ * This parameter specifies an alternate port to connect to. If it is + * omitted or set to zero, then the default FTP port, 21, will be used. + *

+ * @param timeout int[optional]

+ * This parameter specifies the timeout for all subsequent network operations. + * If omitted, the default value is 90 seconds. The timeout can be changed and + * queried at any time with ftp_set_option and + * ftp_get_option. + *

+ * @return resource a SSL-FTP stream on success or false on error. + * + * @jms-builtin + */ +function ftp_ssl_connect ($host, $port = null, $timeout = null) {} + +/** + * Logs in to an FTP connection + * @link http://www.php.net/manual/en/function.ftp-login.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param username string

+ * The username (USER). + *

+ * @param password string

+ * The password (PASS). + *

+ * @return bool Returns true on success or false on failure. + * If login fails, PHP will also throw a warning. + * + * @jms-builtin + */ +function ftp_login ($ftp_stream, $username, $password) {} + +/** + * Returns the current directory name + * @link http://www.php.net/manual/en/function.ftp-pwd.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @return string the current directory name or false on error. + * + * @jms-builtin + */ +function ftp_pwd ($ftp_stream) {} + +/** + * Changes to the parent directory + * @link http://www.php.net/manual/en/function.ftp-cdup.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_cdup ($ftp_stream) {} + +/** + * Changes the current directory on a FTP server + * @link http://www.php.net/manual/en/function.ftp-chdir.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param directory string

+ * The target directory. + *

+ * @return bool Returns true on success or false on failure. + * If changing directory fails, PHP will also throw a warning. + * + * @jms-builtin + */ +function ftp_chdir ($ftp_stream, $directory) {} + +/** + * Requests execution of a command on the FTP server + * @link http://www.php.net/manual/en/function.ftp-exec.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param command string

+ * The command to execute. + *

+ * @return bool true if the command was successful (server sent response code: + * 200); otherwise returns false. + * + * @jms-builtin + */ +function ftp_exec ($ftp_stream, $command) {} + +/** + * Sends an arbitrary command to an FTP server + * @link http://www.php.net/manual/en/function.ftp-raw.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param command string

+ * The command to execute. + *

+ * @return array the server's response as an array of strings. + * No parsing is performed on the response string, nor does + * ftp_raw determine if the command succeeded. + * + * @jms-builtin + */ +function ftp_raw ($ftp_stream, $command) {} + +/** + * Creates a directory + * @link http://www.php.net/manual/en/function.ftp-mkdir.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param directory string

+ * The name of the directory that will be created. + *

+ * @return string the newly created directory name on success or false on error. + * + * @jms-builtin + */ +function ftp_mkdir ($ftp_stream, $directory) {} + +/** + * Removes a directory + * @link http://www.php.net/manual/en/function.ftp-rmdir.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param directory string

+ * The directory to delete. This must be either an absolute or relative + * path to an empty directory. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_rmdir ($ftp_stream, $directory) {} + +/** + * Set permissions on a file via FTP + * @link http://www.php.net/manual/en/function.ftp-chmod.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param mode int

+ * The new permissions, given as an octal value. + *

+ * @param filename string

+ * The remote file. + *

+ * @return int the new file permissions on success or false on error. + * + * @jms-builtin + */ +function ftp_chmod ($ftp_stream, $mode, $filename) {} + +/** + * Allocates space for a file to be uploaded + * @link http://www.php.net/manual/en/function.ftp-alloc.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param filesize int

+ * The number of bytes to allocate. + *

+ * @param result string[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_alloc ($ftp_stream, $filesize, &$result = null) {} + +/** + * Returns a list of files in the given directory + * @link http://www.php.net/manual/en/function.ftp-nlist.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param directory string

+ * The directory to be listed. This parameter can also include arguments, eg. + * ftp_nlist($conn_id, "-la /your/dir"); + * Note that this parameter isn't escaped so there may be some issues with + * filenames containing spaces and other characters. + *

+ * @return array an array of filenames from the specified directory on success or + * false on error. + * + * @jms-builtin + */ +function ftp_nlist ($ftp_stream, $directory) {} + +/** + * Returns a detailed list of files in the given directory + * @link http://www.php.net/manual/en/function.ftp-rawlist.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param directory string

+ * The directory path. + *

+ * @param recursive bool[optional]

+ * If set to true, the issued command will be LIST -R. + *

+ * @return array an array where each element corresponds to one line of text. + *

+ *

+ * The output is not parsed in any way. The system type identifier returned by + * ftp_systype can be used to determine how the results + * should be interpreted. + * + * @jms-builtin + */ +function ftp_rawlist ($ftp_stream, $directory, $recursive = null) {} + +/** + * Returns the system type identifier of the remote FTP server + * @link http://www.php.net/manual/en/function.ftp-systype.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @return string the remote system type, or false on error. + * + * @jms-builtin + */ +function ftp_systype ($ftp_stream) {} + +/** + * Turns passive mode on or off + * @link http://www.php.net/manual/en/function.ftp-pasv.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param pasv bool

+ * If true, the passive mode is turned on, else it's turned off. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_pasv ($ftp_stream, $pasv) {} + +/** + * Downloads a file from the FTP server + * @link http://www.php.net/manual/en/function.ftp-get.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param local_file string

+ * The local file path (will be overwritten if the file already exists). + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param resumepos int[optional]

+ * The position in the remote file to start downloading from. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_get ($ftp_stream, $local_file, $remote_file, $mode, $resumepos = null) {} + +/** + * Downloads a file from the FTP server and saves to an open file + * @link http://www.php.net/manual/en/function.ftp-fget.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param handle resource

+ * An open file pointer in which we store the data. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param resumepos int[optional]

+ * The position in the remote file to start downloading from. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_fget ($ftp_stream, $handle, $remote_file, $mode, $resumepos = null) {} + +/** + * Uploads a file to the FTP server + * @link http://www.php.net/manual/en/function.ftp-put.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param local_file string

+ * The local file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param startpos int[optional]

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_put ($ftp_stream, $remote_file, $local_file, $mode, $startpos = null) {} + +/** + * Uploads from an open file to the FTP server + * @link http://www.php.net/manual/en/function.ftp-fput.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param handle resource

+ * An open file pointer on the local file. Reading stops at end of file. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param startpos int[optional]

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_fput ($ftp_stream, $remote_file, $handle, $mode, $startpos = null) {} + +/** + * Returns the size of the given file + * @link http://www.php.net/manual/en/function.ftp-size.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The remote file. + *

+ * @return int the file size on success, or -1 on error. + * + * @jms-builtin + */ +function ftp_size ($ftp_stream, $remote_file) {} + +/** + * Returns the last modified time of the given file + * @link http://www.php.net/manual/en/function.ftp-mdtm.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The file from which to extract the last modification time. + *

+ * @return int the last modified time as a Unix timestamp on success, or -1 on + * error. + * + * @jms-builtin + */ +function ftp_mdtm ($ftp_stream, $remote_file) {} + +/** + * Renames a file or a directory on the FTP server + * @link http://www.php.net/manual/en/function.ftp-rename.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param oldname string

+ * The old file/directory name. + *

+ * @param newname string

+ * The new name. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_rename ($ftp_stream, $oldname, $newname) {} + +/** + * Deletes a file on the FTP server + * @link http://www.php.net/manual/en/function.ftp-delete.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param path string

+ * The file to delete. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_delete ($ftp_stream, $path) {} + +/** + * Sends a SITE command to the server + * @link http://www.php.net/manual/en/function.ftp-site.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param command string

+ * The SITE command. Note that this parameter isn't escaped so there may + * be some issues with filenames containing spaces and other characters. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_site ($ftp_stream, $command) {} + +/** + * Closes an FTP connection + * @link http://www.php.net/manual/en/function.ftp-close.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_close ($ftp_stream) {} + +/** + * Set miscellaneous runtime FTP options + * @link http://www.php.net/manual/en/function.ftp-set-option.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param option int

+ * Currently, the following options are supported: + * + * Supported runtime FTP options + * + * + * + * + * + * + * + * + *
FTP_TIMEOUT_SEC + * Changes the timeout in seconds used for all network related + * functions. value must be an integer that + * is greater than 0. The default timeout is 90 seconds. + *
FTP_AUTOSEEK + * When enabled, GET or PUT requests with a + * resumepos or startpos + * parameter will first seek to the requested position within the file. + * This is enabled by default. + *
+ *

+ * @param value mixed

+ * This parameter depends on which option is chosen + * to be altered. + *

+ * @return bool true if the option could be set; false if not. A warning + * message will be thrown if the option is not + * supported or the passed value doesn't match the + * expected value for the given option. + * + * @jms-builtin + */ +function ftp_set_option ($ftp_stream, $option, $value) {} + +/** + * Retrieves various runtime behaviours of the current FTP stream + * @link http://www.php.net/manual/en/function.ftp-get-option.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param option int

+ * Currently, the following options are supported: + * + * Supported runtime FTP options + * + * + * + * + * + * + * + * + *
FTP_TIMEOUT_SEC + * Returns the current timeout used for network related operations. + *
FTP_AUTOSEEK + * Returns true if this option is on, false otherwise. + *
+ *

+ * @return mixed the value on success or false if the given + * option is not supported. In the latter case, a + * warning message is also thrown. + * + * @jms-builtin + */ +function ftp_get_option ($ftp_stream, $option) {} + +/** + * Retrieves a file from the FTP server and writes it to an open file (non-blocking) + * @link http://www.php.net/manual/en/function.ftp-nb-fget.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param handle resource

+ * An open file pointer in which we store the data. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param resumepos int[optional]

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * + * @jms-builtin + */ +function ftp_nb_fget ($ftp_stream, $handle, $remote_file, $mode, $resumepos = null) {} + +/** + * Retrieves a file from the FTP server and writes it to a local file (non-blocking) + * @link http://www.php.net/manual/en/function.ftp-nb-get.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param local_file string

+ * The local file path (will be overwritten if the file already exists). + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param resumepos int[optional]

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * + * @jms-builtin + */ +function ftp_nb_get ($ftp_stream, $local_file, $remote_file, $mode, $resumepos = null) {} + +/** + * Continues retrieving/sending a file (non-blocking) + * @link http://www.php.net/manual/en/function.ftp-nb-continue.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * + * @jms-builtin + */ +function ftp_nb_continue ($ftp_stream) {} + +/** + * Stores a file on the FTP server (non-blocking) + * @link http://www.php.net/manual/en/function.ftp-nb-put.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param local_file string

+ * The local file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param startpos int[optional]

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * + * @jms-builtin + */ +function ftp_nb_put ($ftp_stream, $remote_file, $local_file, $mode, $startpos = null) {} + +/** + * Stores a file from an open file to the FTP server (non-blocking) + * @link http://www.php.net/manual/en/function.ftp-nb-fput.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param handle resource

+ * An open file pointer on the local file. Reading stops at end of file. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param startpos int[optional]

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * + * @jms-builtin + */ +function ftp_nb_fput ($ftp_stream, $remote_file, $handle, $mode, $startpos = null) {} + +/** + * &Alias; ftp_close + * @link http://www.php.net/manual/en/function.ftp-quit.php + * @param ftp + * + * @jms-builtin + */ +function ftp_quit ($ftp) {} + + +/** + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_ASCII', 1); + +/** + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_TEXT', 1); + +/** + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_BINARY', 2); + +/** + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_IMAGE', 2); + +/** + *

+ * Automatically determine resume position and start position for GET and PUT requests + * (only works if FTP_AUTOSEEK is enabled) + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_AUTORESUME', -1); + +/** + *

+ * See ftp_set_option for information. + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_TIMEOUT_SEC', 0); + +/** + *

+ * See ftp_set_option for information. + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_AUTOSEEK', 1); + +/** + *

+ * Asynchronous transfer has failed + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_FAILED', 0); + +/** + *

+ * Asynchronous transfer has finished + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_FINISHED', 1); + +/** + *

+ * Asynchronous transfer is still active + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_MOREDATA', 2); + +// End of ftp v. +?> diff --git a/res/php-5.2-core-api/gd.php b/res/php-5.2-core-api/gd.php new file mode 100644 index 0000000..e4cfba9 --- /dev/null +++ b/res/php-5.2-core-api/gd.php @@ -0,0 +1,2371 @@ + + *

+ * + * Elements of array returned by gd_info + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
AttributeMeaning
GD Versionstring value describing the installed + * libgd version.
Freetype Supportboolean value. true + * if Freetype Support is installed.
Freetype Linkagestring value describing the way in which + * Freetype was linked. Expected values are: 'with freetype', + * 'with TTF library', and 'with unknown library'. This element will + * only be defined if Freetype Support evaluated to + * true.
T1Lib Supportboolean value. true + * if T1Lib support is included.
GIF Read Supportboolean value. true + * if support for reading GIF + * images is included.
GIF Create Supportboolean value. true + * if support for creating GIF + * images is included.
JPEG Supportboolean value. true + * if JPEG support is included.
PNG Supportboolean value. true + * if PNG support is included.
WBMP Supportboolean value. true + * if WBMP support is included.
XBM Supportboolean value. true + * if XBM support is included.
+ *

+ *

+ * Previous to PHP 5.3.0, the JPEG Support attribute was named + * JPG Support. + * + * @jms-builtin + */ +function gd_info () {} + +/** + * Draws an arc + * @link http://www.php.net/manual/en/function.imagearc.php + * @param image resource + * @param cx int

+ * x-coordinate of the center. + *

+ * @param cy int

+ * y-coordinate of the center. + *

+ * @param width int

+ * The arc width. + *

+ * @param height int

+ * The arc height. + *

+ * @param start int

+ * The arc start angle, in degrees. + *

+ * @param end int

+ * The arc end angle, in degrees. + * 0° is located at the three-o'clock position, and the arc is drawn + * clockwise. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagearc ($image, $cx, $cy, $width, $height, $start, $end, $color) {} + +/** + * Draw an ellipse + * @link http://www.php.net/manual/en/function.imageellipse.php + * @param image resource + * @param cx int

+ * x-coordinate of the center. + *

+ * @param cy int

+ * y-coordinate of the center. + *

+ * @param width int

+ * The ellipse width. + *

+ * @param height int

+ * The ellipse height. + *

+ * @param color int

+ * The color of the ellipse. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imageellipse ($image, $cx, $cy, $width, $height, $color) {} + +/** + * Draw a character horizontally + * @link http://www.php.net/manual/en/function.imagechar.php + * @param image resource + * @param font int + * @param x int

+ * x-coordinate of the start. + *

+ * @param y int

+ * y-coordinate of the start. + *

+ * @param c string

+ * The character to draw. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagechar ($image, $font, $x, $y, $c, $color) {} + +/** + * Draw a character vertically + * @link http://www.php.net/manual/en/function.imagecharup.php + * @param image resource + * @param font int + * @param x int

+ * x-coordinate of the start. + *

+ * @param y int

+ * y-coordinate of the start. + *

+ * @param c string

+ * The character to draw. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecharup ($image, $font, $x, $y, $c, $color) {} + +/** + * Get the index of the color of a pixel + * @link http://www.php.net/manual/en/function.imagecolorat.php + * @param image resource + * @param x int

+ * x-coordinate of the point. + *

+ * @param y int

+ * y-coordinate of the point. + *

+ * @return int the index of the color. + * + * @jms-builtin + */ +function imagecolorat ($image, $x, $y) {} + +/** + * Allocate a color for an image + * @link http://www.php.net/manual/en/function.imagecolorallocate.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return int A color identifier or false if the allocation failed. + * + * @jms-builtin + */ +function imagecolorallocate ($image, $red, $green, $blue) {} + +/** + * Copy the palette from one image to another + * @link http://www.php.net/manual/en/function.imagepalettecopy.php + * @param destination resource

+ * The destination image resource. + *

+ * @param source resource

+ * The source image resource. + *

+ * @return void + * + * @jms-builtin + */ +function imagepalettecopy ($destination, $source) {} + +/** + * Create a new image from the image stream in the string + * @link http://www.php.net/manual/en/function.imagecreatefromstring.php + * @param data string + * @return resource An image resource will be returned on success. false is returned if + * the image type is unsupported, the data is not in a recognised format, + * or the image is corrupt and cannot be loaded. + * + * @jms-builtin + */ +function imagecreatefromstring ($data) {} + +/** + * Get the index of the closest color to the specified color + * @link http://www.php.net/manual/en/function.imagecolorclosest.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return int the index of the closest color, in the palette of the image, to + * the specified one + * + * @jms-builtin + */ +function imagecolorclosest ($image, $red, $green, $blue) {} + +/** + * Get the index of the color which has the hue, white and blackness + * @link http://www.php.net/manual/en/function.imagecolorclosesthwb.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return int an integer with the index of the color which has + * the hue, white and blackness nearest the given color. + * + * @jms-builtin + */ +function imagecolorclosesthwb ($image, $red, $green, $blue) {} + +/** + * De-allocate a color for an image + * @link http://www.php.net/manual/en/function.imagecolordeallocate.php + * @param image resource + * @param color int

+ * The color identifier. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecolordeallocate ($image, $color) {} + +/** + * Get the index of the specified color or its closest possible alternative + * @link http://www.php.net/manual/en/function.imagecolorresolve.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return int a color index. + * + * @jms-builtin + */ +function imagecolorresolve ($image, $red, $green, $blue) {} + +/** + * Get the index of the specified color + * @link http://www.php.net/manual/en/function.imagecolorexact.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return int the index of the specified color in the palette, or -1 if the + * color does not exist. + * + * @jms-builtin + */ +function imagecolorexact ($image, $red, $green, $blue) {} + +/** + * Set the color for the specified palette index + * @link http://www.php.net/manual/en/function.imagecolorset.php + * @param image resource + * @param index int

+ * An index in the palette. + *

+ * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return void + * + * @jms-builtin + */ +function imagecolorset ($image, $index, $red, $green, $blue) {} + +/** + * Define a color as transparent + * @link http://www.php.net/manual/en/function.imagecolortransparent.php + * @param image resource + * @param color int[optional]

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return int The identifier of the new (or current, if none is specified) + * transparent color is returned. + * + * @jms-builtin + */ +function imagecolortransparent ($image, $color = null) {} + +/** + * Find out the number of colors in an image's palette + * @link http://www.php.net/manual/en/function.imagecolorstotal.php + * @param image resource

+ * An image resource, returned by one of the image creation functions, such + * as imagecreatefromgif. + *

+ * @return int the number of colors in the specified image's palette or 0 for + * truecolor images. + * + * @jms-builtin + */ +function imagecolorstotal ($image) {} + +/** + * Get the colors for an index + * @link http://www.php.net/manual/en/function.imagecolorsforindex.php + * @param image resource + * @param index int

+ * The color index. + *

+ * @return array an associative array with red, green, blue and alpha keys that + * contain the appropriate values for the specified color index. + * + * @jms-builtin + */ +function imagecolorsforindex ($image, $index) {} + +/** + * Copy part of an image + * @link http://www.php.net/manual/en/function.imagecopy.php + * @param dst_im resource

+ * Destination image link resource. + *

+ * @param src_im resource

+ * Source image link resource. + *

+ * @param dst_x int

+ * x-coordinate of destination point. + *

+ * @param dst_y int

+ * y-coordinate of destination point. + *

+ * @param src_x int

+ * x-coordinate of source point. + *

+ * @param src_y int

+ * y-coordinate of source point. + *

+ * @param src_w int

+ * Source width. + *

+ * @param src_h int

+ * Source height. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecopy ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h) {} + +/** + * Copy and merge part of an image + * @link http://www.php.net/manual/en/function.imagecopymerge.php + * @param dst_im resource

+ * Destination image link resource. + *

+ * @param src_im resource

+ * Source image link resource. + *

+ * @param dst_x int

+ * x-coordinate of destination point. + *

+ * @param dst_y int

+ * y-coordinate of destination point. + *

+ * @param src_x int

+ * x-coordinate of source point. + *

+ * @param src_y int

+ * y-coordinate of source point. + *

+ * @param src_w int

+ * Source width. + *

+ * @param src_h int

+ * Source height. + *

+ * @param pct int

+ * The two images will be merged according to pct + * which can range from 0 to 100. When pct = 0, + * no action is taken, when 100 this function behaves identically + * to imagecopy for pallete images, while it + * implements alpha transparency for true colour images. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecopymerge ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) {} + +/** + * Copy and merge part of an image with gray scale + * @link http://www.php.net/manual/en/function.imagecopymergegray.php + * @param dst_im resource

+ * Destination image link resource. + *

+ * @param src_im resource

+ * Source image link resource. + *

+ * @param dst_x int

+ * x-coordinate of destination point. + *

+ * @param dst_y int

+ * y-coordinate of destination point. + *

+ * @param src_x int

+ * x-coordinate of source point. + *

+ * @param src_y int

+ * y-coordinate of source point. + *

+ * @param src_w int

+ * Source width. + *

+ * @param src_h int

+ * Source height. + *

+ * @param pct int

+ * The src_im will be changed to grayscale according + * to pct where 0 is fully grayscale and 100 is + * unchanged. When pct = 100 this function behaves + * identically to imagecopy for pallete images, while + * it implements alpha transparency for true colour images. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecopymergegray ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) {} + +/** + * Copy and resize part of an image + * @link http://www.php.net/manual/en/function.imagecopyresized.php + * @param dst_image resource + * @param src_image resource + * @param dst_x int

+ * x-coordinate of destination point. + *

+ * @param dst_y int

+ * y-coordinate of destination point. + *

+ * @param src_x int

+ * x-coordinate of source point. + *

+ * @param src_y int

+ * y-coordinate of source point. + *

+ * @param dst_w int

+ * Destination width. + *

+ * @param dst_h int

+ * Destination height. + *

+ * @param src_w int

+ * Source width. + *

+ * @param src_h int

+ * Source height. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecopyresized ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) {} + +/** + * Create a new palette based image + * @link http://www.php.net/manual/en/function.imagecreate.php + * @param width int

+ * The image width. + *

+ * @param height int

+ * The image height. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreate ($width, $height) {} + +/** + * Create a new true color image + * @link http://www.php.net/manual/en/function.imagecreatetruecolor.php + * @param width int

+ * Image width. + *

+ * @param height int

+ * Image height. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatetruecolor ($width, $height) {} + +/** + * Finds whether an image is a truecolor image + * @link http://www.php.net/manual/en/function.imageistruecolor.php + * @param image resource + * @return bool true if the image is truecolor, false + * otherwise. + * + * @jms-builtin + */ +function imageistruecolor ($image) {} + +/** + * Convert a true color image to a palette image + * @link http://www.php.net/manual/en/function.imagetruecolortopalette.php + * @param image resource + * @param dither bool

+ * Indicates if the image should be dithered - if it is true then + * dithering will be used which will result in a more speckled image but + * with better color approximation. + *

+ * @param ncolors int

+ * Sets the maximum number of colors that should be retained in the palette. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagetruecolortopalette ($image, $dither, $ncolors) {} + +/** + * Set the thickness for line drawing + * @link http://www.php.net/manual/en/function.imagesetthickness.php + * @param image resource + * @param thickness int

+ * Thickness, in pixels. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesetthickness ($image, $thickness) {} + +/** + * Draw a partial arc and fill it + * @link http://www.php.net/manual/en/function.imagefilledarc.php + * @param image resource + * @param cx int

+ * x-coordinate of the center. + *

+ * @param cy int

+ * y-coordinate of the center. + *

+ * @param width int

+ * The arc width. + *

+ * @param height int

+ * The arc height. + *

+ * @param start int

+ * The arc start angle, in degrees. + *

+ * @param end int

+ * The arc end angle, in degrees. + * 0° is located at the three-o'clock position, and the arc is drawn + * clockwise. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @param style int

+ * A bitwise OR of the following possibilities: + * IMG_ARC_PIE + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilledarc ($image, $cx, $cy, $width, $height, $start, $end, $color, $style) {} + +/** + * Draw a filled ellipse + * @link http://www.php.net/manual/en/function.imagefilledellipse.php + * @param image resource + * @param cx int

+ * x-coordinate of the center. + *

+ * @param cy int

+ * y-coordinate of the center. + *

+ * @param width int

+ * The ellipse width. + *

+ * @param height int

+ * The ellipse height. + *

+ * @param color int

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilledellipse ($image, $cx, $cy, $width, $height, $color) {} + +/** + * Set the blending mode for an image + * @link http://www.php.net/manual/en/function.imagealphablending.php + * @param image resource + * @param blendmode bool

+ * Whether to enable the blending mode or not. On true color images + * the default value is true otherwise the default value is false + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagealphablending ($image, $blendmode) {} + +/** + * Set the flag to save full alpha channel information (as opposed to single-color transparency) when saving PNG images + * @link http://www.php.net/manual/en/function.imagesavealpha.php + * @param image resource + * @param saveflag bool

+ * Whether to save the alpha channel or not. Default to false. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesavealpha ($image, $saveflag) {} + +/** + * Allocate a color for an image + * @link http://www.php.net/manual/en/function.imagecolorallocatealpha.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @param alpha int

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int A color identifier or false if the allocation failed. + * + * @jms-builtin + */ +function imagecolorallocatealpha ($image, $red, $green, $blue, $alpha) {} + +/** + * Get the index of the specified color + alpha or its closest possible alternative + * @link http://www.php.net/manual/en/function.imagecolorresolvealpha.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @param alpha int

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int a color index. + * + * @jms-builtin + */ +function imagecolorresolvealpha ($image, $red, $green, $blue, $alpha) {} + +/** + * Get the index of the closest color to the specified color + alpha + * @link http://www.php.net/manual/en/function.imagecolorclosestalpha.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @param alpha int

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int the index of the closest color in the palette. + * + * @jms-builtin + */ +function imagecolorclosestalpha ($image, $red, $green, $blue, $alpha) {} + +/** + * Get the index of the specified color + alpha + * @link http://www.php.net/manual/en/function.imagecolorexactalpha.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @param alpha int

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int the index of the specified color+alpha in the palette of the + * image, or -1 if the color does not exist in the image's palette. + * + * @jms-builtin + */ +function imagecolorexactalpha ($image, $red, $green, $blue, $alpha) {} + +/** + * Copy and resize part of an image with resampling + * @link http://www.php.net/manual/en/function.imagecopyresampled.php + * @param dst_image resource + * @param src_image resource + * @param dst_x int

+ * x-coordinate of destination point. + *

+ * @param dst_y int

+ * y-coordinate of destination point. + *

+ * @param src_x int

+ * x-coordinate of source point. + *

+ * @param src_y int

+ * y-coordinate of source point. + *

+ * @param dst_w int

+ * Destination width. + *

+ * @param dst_h int

+ * Destination height. + *

+ * @param src_w int

+ * Source width. + *

+ * @param src_h int

+ * Source height. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecopyresampled ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) {} + +/** + * Rotate an image with a given angle + * @link http://www.php.net/manual/en/function.imagerotate.php + * @param image resource + * @param angle float

+ * Rotation angle, in degrees. + *

+ * @param bgd_color int

+ * Specifies the color of the uncovered zone after the rotation + *

+ * @param ignore_transparent int[optional]

+ * If set and non-zero, transparent colors are ignored (otherwise kept). + *

+ * @return resource an image resource for the rotated image, &return.falseforfailure;. + * + * @jms-builtin + */ +function imagerotate ($image, $angle, $bgd_color, $ignore_transparent = null) {} + +/** + * Should antialias functions be used or not + * @link http://www.php.net/manual/en/function.imageantialias.php + * @param image resource + * @param enabled bool

+ * Whether to enable antialiasing or not. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imageantialias ($image, $enabled) {} + +/** + * Set the tile image for filling + * @link http://www.php.net/manual/en/function.imagesettile.php + * @param image resource + * @param tile resource

+ * The image resource to be used as a tile. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesettile ($image, $tile) {} + +/** + * Set the brush image for line drawing + * @link http://www.php.net/manual/en/function.imagesetbrush.php + * @param image resource + * @param brush resource

+ * An image resource. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesetbrush ($image, $brush) {} + +/** + * Set the style for line drawing + * @link http://www.php.net/manual/en/function.imagesetstyle.php + * @param image resource + * @param style array

+ * An array of pixel colors. You can use the + * IMG_COLOR_TRANSPARENT constant to add a + * transparent pixel. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesetstyle ($image, array $style) {} + +/** + * Create a new image from file or URL + * @link http://www.php.net/manual/en/function.imagecreatefrompng.php + * @param filename string

+ * Path to the PNG image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefrompng ($filename) {} + +/** + * Create a new image from file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromgif.php + * @param filename string

+ * Path to the GIF image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromgif ($filename) {} + +/** + * Create a new image from file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromjpeg.php + * @param filename string

+ * Path to the JPEG image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromjpeg ($filename) {} + +/** + * Create a new image from file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromwbmp.php + * @param filename string

+ * Path to the WBMP image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromwbmp ($filename) {} + +/** + * Create a new image from file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromxbm.php + * @param filename string

+ * Path to the XBM image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromxbm ($filename) {} + +/** + * Create a new image from GD file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromgd.php + * @param filename string

+ * Path to the GD file. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromgd ($filename) {} + +/** + * Create a new image from GD2 file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromgd2.php + * @param filename string

+ * Path to the GD2 image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromgd2 ($filename) {} + +/** + * Create a new image from a given part of GD2 file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromgd2part.php + * @param filename string

+ * Path to the GD2 image. + *

+ * @param srcX int

+ * x-coordinate of source point. + *

+ * @param srcY int

+ * y-coordinate of source point. + *

+ * @param width int

+ * Source width. + *

+ * @param height int

+ * Source height. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromgd2part ($filename, $srcX, $srcY, $width, $height) {} + +/** + * Output a PNG image to either the browser or a file + * @link http://www.php.net/manual/en/function.imagepng.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ *

+ * &null; is invalid if the quality and + * filters arguments are not used. + *

+ * @param quality int[optional]

+ * Compression level: from 0 (no compression) to 9. + *

+ * @param filters int[optional]

+ * Allows reducing the PNG file size. It is a bitmask field which may be + * set to any combination of the PNG_FILTER_XXX + * constants. PNG_NO_FILTER or + * PNG_ALL_FILTERS may also be used to respectively + * disable or activate all filters. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagepng ($image, $filename = null, $quality = null, $filters = null) {} + +/** + * Output image to browser or file + * @link http://www.php.net/manual/en/function.imagegif.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagegif ($image, $filename = null) {} + +/** + * Output image to browser or file + * @link http://www.php.net/manual/en/function.imagejpeg.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ *

+ * To skip this argument in order to provide the + * quality parameter, use &null;. + *

+ * @param quality int[optional]

+ * quality is optional, and ranges from 0 (worst + * quality, smaller file) to 100 (best quality, biggest file). The + * default is the default IJG quality value (about 75). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagejpeg ($image, $filename = null, $quality = null) {} + +/** + * Output image to browser or file + * @link http://www.php.net/manual/en/function.imagewbmp.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ * @param foreground int[optional]

+ * You can set the foreground color with this parameter by setting an + * identifier obtained from imagecolorallocate. + * The default foreground color is black. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagewbmp ($image, $filename = null, $foreground = null) {} + +/** + * Output GD image to browser or file + * @link http://www.php.net/manual/en/function.imagegd.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagegd ($image, $filename = null) {} + +/** + * Output GD2 image to browser or file + * @link http://www.php.net/manual/en/function.imagegd2.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ * @param chunk_size int[optional]

+ * Chunk size. + *

+ * @param type int[optional]

+ * Either IMG_GD2_RAW or + * IMG_GD2_COMPRESSED. Default is + * IMG_GD2_RAW. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagegd2 ($image, $filename = null, $chunk_size = null, $type = null) {} + +/** + * Destroy an image + * @link http://www.php.net/manual/en/function.imagedestroy.php + * @param image resource + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagedestroy ($image) {} + +/** + * Apply a gamma correction to a GD image + * @link http://www.php.net/manual/en/function.imagegammacorrect.php + * @param image resource + * @param inputgamma float

+ * The input gamma. + *

+ * @param outputgamma float

+ * The output gamma. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagegammacorrect ($image, $inputgamma, $outputgamma) {} + +/** + * Flood fill + * @link http://www.php.net/manual/en/function.imagefill.php + * @param image resource + * @param x int

+ * x-coordinate of start point. + *

+ * @param y int

+ * y-coordinate of start point. + *

+ * @param color int

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefill ($image, $x, $y, $color) {} + +/** + * Draw a filled polygon + * @link http://www.php.net/manual/en/function.imagefilledpolygon.php + * @param image resource + * @param points array

+ * An array containing the x and y + * coordinates of the polygons vertices consecutively. + *

+ * @param num_points int

+ * Total number of vertices, which must be at least 3. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilledpolygon ($image, array $points, $num_points, $color) {} + +/** + * Draw a filled rectangle + * @link http://www.php.net/manual/en/function.imagefilledrectangle.php + * @param image resource + * @param x1 int

+ * x-coordinate for point 1. + *

+ * @param y1 int

+ * y-coordinate for point 1. + *

+ * @param x2 int

+ * x-coordinate for point 2. + *

+ * @param y2 int

+ * y-coordinate for point 2. + *

+ * @param color int

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilledrectangle ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * Flood fill to specific color + * @link http://www.php.net/manual/en/function.imagefilltoborder.php + * @param image resource + * @param x int

+ * x-coordinate of start. + *

+ * @param y int

+ * y-coordinate of start. + *

+ * @param border int

+ * The border color. A color identifier created with + * imagecolorallocate. + *

+ * @param color int

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilltoborder ($image, $x, $y, $border, $color) {} + +/** + * Get font width + * @link http://www.php.net/manual/en/function.imagefontwidth.php + * @param font int + * @return int the width of the pixel + * + * @jms-builtin + */ +function imagefontwidth ($font) {} + +/** + * Get font height + * @link http://www.php.net/manual/en/function.imagefontheight.php + * @param font int + * @return int the height of the pixel. + * + * @jms-builtin + */ +function imagefontheight ($font) {} + +/** + * Enable or disable interlace + * @link http://www.php.net/manual/en/function.imageinterlace.php + * @param image resource + * @param interlace int[optional]

+ * If non-zero, the image will be interlaced, else the interlace bit is + * turned off. + *

+ * @return int 1 if the interlace bit is set for the image, 0 otherwise. + * + * @jms-builtin + */ +function imageinterlace ($image, $interlace = null) {} + +/** + * Draw a line + * @link http://www.php.net/manual/en/function.imageline.php + * @param image resource + * @param x1 int

+ * x-coordinate for first point. + *

+ * @param y1 int

+ * y-coordinate for first point. + *

+ * @param x2 int

+ * x-coordinate for second point. + *

+ * @param y2 int

+ * y-coordinate for second point. + *

+ * @param color int

+ * The line color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imageline ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * Load a new font + * @link http://www.php.net/manual/en/function.imageloadfont.php + * @param file string

+ * The font file format is currently binary and architecture + * dependent. This means you should generate the font files on the + * same type of CPU as the machine you are running PHP on. + *

+ *

+ * + * Font file format + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
byte positionC data typedescription
byte 0-3intnumber of characters in the font
byte 4-7int + * value of first character in the font (often 32 for space) + *
byte 8-11intpixel width of each character
byte 12-15intpixel height of each character
byte 16-char + * array with character data, one byte per pixel in each + * character, for a total of (nchars*width*height) bytes. + *
+ *

+ * @return int The font identifier which is always bigger than 5 to avoid conflicts with + * built-in fonts or false on errors. + * + * @jms-builtin + */ +function imageloadfont ($file) {} + +/** + * Draws a polygon + * @link http://www.php.net/manual/en/function.imagepolygon.php + * @param image resource + * @param points array

+ * An array containing the polygon's vertices, e.g.: + * + * points[0] + * = x0 + * + * + * points[1] + * = y0 + * + * + * points[2] + * = x1 + * + * + * points[3] + * = y1 + * + *

+ * @param num_points int

+ * Total number of points (vertices). + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagepolygon ($image, array $points, $num_points, $color) {} + +/** + * Draw a rectangle + * @link http://www.php.net/manual/en/function.imagerectangle.php + * @param image resource + * @param x1 int

+ * Upper left x coordinate. + *

+ * @param y1 int

+ * Upper left y coordinate + * 0, 0 is the top left corner of the image. + *

+ * @param x2 int

+ * Bottom right x coordinate. + *

+ * @param y2 int

+ * Bottom right y coordinate. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagerectangle ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * Set a single pixel + * @link http://www.php.net/manual/en/function.imagesetpixel.php + * @param image resource + * @param x int

+ * x-coordinate. + *

+ * @param y int

+ * y-coordinate. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesetpixel ($image, $x, $y, $color) {} + +/** + * Draw a string horizontally + * @link http://www.php.net/manual/en/function.imagestring.php + * @param image resource + * @param font int + * @param x int

+ * x-coordinate of the upper left corner. + *

+ * @param y int

+ * y-coordinate of the upper left corner. + *

+ * @param string string

+ * The string to be written. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagestring ($image, $font, $x, $y, $string, $color) {} + +/** + * Draw a string vertically + * @link http://www.php.net/manual/en/function.imagestringup.php + * @param image resource + * @param font int + * @param x int

+ * x-coordinate of the upper left corner. + *

+ * @param y int

+ * y-coordinate of the upper left corner. + *

+ * @param string string

+ * The string to be written. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagestringup ($image, $font, $x, $y, $string, $color) {} + +/** + * Get image width + * @link http://www.php.net/manual/en/function.imagesx.php + * @param image resource + * @return int Return the width of the image or false on + * errors. + * + * @jms-builtin + */ +function imagesx ($image) {} + +/** + * Get image height + * @link http://www.php.net/manual/en/function.imagesy.php + * @param image resource + * @return int Return the height of the image or false on + * errors. + * + * @jms-builtin + */ +function imagesy ($image) {} + +/** + * Draw a dashed line + * @link http://www.php.net/manual/en/function.imagedashedline.php + * @param image resource + * @param x1 int

+ * Upper left x coordinate. + *

+ * @param y1 int

+ * Upper left y coordinate 0, 0 is the top left corner of the image. + *

+ * @param x2 int

+ * Bottom right x coordinate. + *

+ * @param y2 int

+ * Bottom right y coordinate. + *

+ * @param color int

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Always returns true + * + * @jms-builtin + */ +function imagedashedline ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * Give the bounding box of a text using TrueType fonts + * @link http://www.php.net/manual/en/function.imagettfbbox.php + * @param size float

+ * The font size. Depending on your version of GD, this should be + * specified as the pixel size (GD1) or point size (GD2). + *

+ * @param angle float

+ * Angle in degrees in which text will be measured. + *

+ * @param fontfile string

+ * The name of the TrueType font file (can be a URL). Depending on + * which version of the GD library that PHP is using, it may attempt to + * search for files that do not begin with a leading '/' by appending + * '.ttf' to the filename and searching along a library-defined font path. + *

+ * @param text string

+ * The string to be measured. + *

+ * @return array imagettfbbox returns an array with 8 + * elements representing four points making the bounding box of the + * text on success and false on error. + * + * key + * contents + * + * + * 0 + * lower left corner, X position + * + * + * 1 + * lower left corner, Y position + * + * + * 2 + * lower right corner, X position + * + * + * 3 + * lower right corner, Y position + * + * + * 4 + * upper right corner, X position + * + * + * 5 + * upper right corner, Y position + * + * + * 6 + * upper left corner, X position + * + * + * 7 + * upper left corner, Y position + * + *

+ *

+ * The points are relative to the text regardless of the + * angle, so "upper left" means in the top left-hand + * corner seeing the text horizontally. + * + * @jms-builtin + */ +function imagettfbbox ($size, $angle, $fontfile, $text) {} + +/** + * Write text to the image using TrueType fonts + * @link http://www.php.net/manual/en/function.imagettftext.php + * @param image resource + * @param size float

+ * The font size. Depending on your version of GD, this should be + * specified as the pixel size (GD1) or point size (GD2). + *

+ * @param angle float

+ * The angle in degrees, with 0 degrees being left-to-right reading text. + * Higher values represent a counter-clockwise rotation. For example, a + * value of 90 would result in bottom-to-top reading text. + *

+ * @param x int

+ * The coordinates given by x and + * y will define the basepoint of the first + * character (roughly the lower-left corner of the character). This + * is different from the imagestring, where + * x and y define the + * upper-left corner of the first character. For example, "top left" + * is 0, 0. + *

+ * @param y int

+ * The y-ordinate. This sets the position of the fonts baseline, not the + * very bottom of the character. + *

+ * @param color int

+ * The color index. Using the negative of a color index has the effect of + * turning off antialiasing. See imagecolorallocate. + *

+ * @param fontfile string

+ * The path to the TrueType font you wish to use. + *

+ *

+ * Depending on which version of the GD library PHP is using, when + * fontfile does not begin with a leading + * / then .ttf will be appended + * to the filename and the library will attempt to search for that + * filename along a library-defined font path. + *

+ *

+ * When using versions of the GD library lower than 2.0.18, a space character, + * rather than a semicolon, was used as the 'path separator' for different font files. + * Unintentional use of this feature will result in the warning message: + * Warning: Could not find/open font. For these affected versions, the + * only solution is moving the font to a path which does not contain spaces. + *

+ *

+ * In many cases where a font resides in the same directory as the script using it + * the following trick will alleviate any include problems. + * ]]> + *

+ * @param text string

+ * The text string in UTF-8 encoding. + *

+ *

+ * May include decimal numeric character references (of the form: + * &#8364;) to access characters in a font beyond position 127. + * The hexadecimal format (like &#xA9;) is supported. + * Strings in UTF-8 encoding can be passed directly. + *

+ *

+ * Named entities, such as &copy;, are not supported. Consider using + * html_entity_decode + * to decode these named entities into UTF-8 strings (html_entity_decode() + * supports this as of PHP 5.0.0). + *

+ *

+ * If a character is used in the string which is not supported by the + * font, a hollow rectangle will replace the character. + *

+ * @return array an array with 8 elements representing four points making the + * bounding box of the text. The order of the points is lower left, lower + * right, upper right, upper left. The points are relative to the text + * regardless of the angle, so "upper left" means in the top left-hand + * corner when you see the text horizontally. + * Returns false on error. + * + * @jms-builtin + */ +function imagettftext ($image, $size, $angle, $x, $y, $color, $fontfile, $text) {} + +/** + * Give the bounding box of a text using fonts via freetype2 + * @link http://www.php.net/manual/en/function.imageftbbox.php + * @param size float

+ * The font size. Depending on your version of GD, this should be + * specified as the pixel size (GD1) or point size (GD2). + *

+ * @param angle float

+ * Angle in degrees in which text will be + * measured. + *

+ * @param fontfile string

+ * The name of the TrueType font file (can be a URL). Depending on + * which version of the GD library that PHP is using, it may attempt to + * search for files that do not begin with a leading '/' by appending + * '.ttf' to the filename and searching along a library-defined font path. + *

+ * @param text string

+ * The string to be measured. + *

+ * @param extrainfo array[optional]

+ * + * Possible array indexes for extrainfo + * + * + * + * + * + * + * + * + * + * + *
KeyTypeMeaning
linespacingfloatDefines drawing linespacing
+ *

+ * @return array imageftbbox returns an array with 8 + * elements representing four points making the bounding box of the + * text: + * + * 0 + * lower left corner, X position + * + * + * 1 + * lower left corner, Y position + * + * + * 2 + * lower right corner, X position + * + * + * 3 + * lower right corner, Y position + * + * + * 4 + * upper right corner, X position + * + * + * 5 + * upper right corner, Y position + * + * + * 6 + * upper left corner, X position + * + * + * 7 + * upper left corner, Y position + * + *

+ *

+ * The points are relative to the text regardless of the + * angle, so "upper left" means in the top left-hand + * corner seeing the text horizontally. + * + * @jms-builtin + */ +function imageftbbox ($size, $angle, $fontfile, $text, array $extrainfo = null) {} + +/** + * Write text to the image using fonts using FreeType 2 + * @link http://www.php.net/manual/en/function.imagefttext.php + * @param image resource + * @param size float

+ * The font size to use in points. + *

+ * @param angle float

+ * The angle in degrees, with 0 degrees being left-to-right reading text. + * Higher values represent a counter-clockwise rotation. For example, a + * value of 90 would result in bottom-to-top reading text. + *

+ * @param x int

+ * The coordinates given by x and + * y will define the basepoint of the first + * character (roughly the lower-left corner of the character). This + * is different from the imagestring, where + * x and y define the + * upper-left corner of the first character. For example, "top left" + * is 0, 0. + *

+ * @param y int

+ * The y-ordinate. This sets the position of the fonts baseline, not the + * very bottom of the character. + *

+ * @param color int

+ * The index of the desired color for the text, see + * imagecolorexact. + *

+ * @param fontfile string

+ * The path to the TrueType font you wish to use. + *

+ *

+ * Depending on which version of the GD library PHP is using, when + * fontfile does not begin with a leading + * / then .ttf will be appended + * to the filename and the library will attempt to search for that + * filename along a library-defined font path. + *

+ *

+ * When using versions of the GD library lower than 2.0.18, a space character, + * rather than a semicolon, was used as the 'path separator' for different font files. + * Unintentional use of this feature will result in the warning message: + * Warning: Could not find/open font. For these affected versions, the + * only solution is moving the font to a path which does not contain spaces. + *

+ *

+ * In many cases where a font resides in the same directory as the script using it + * the following trick will alleviate any include problems. + * ]]> + *

+ * @param text string

+ * Text to be inserted into image. + *

+ * @param extrainfo array[optional]

+ * + * Possible array indexes for extrainfo + * + * + * + * + * + * + * + * + * + * + *
KeyTypeMeaning
linespacingfloatDefines drawing linespacing
+ *

+ * @return array This function returns an array defining the four points of the box, starting in the lower left and moving counter-clockwise: + * + * 0 + * lower left x-coordinate + * + * + * 1 + * lower left y-coordinate + * + * + * 2 + * lower right x-coordinate + * + * + * 3 + * lower right y-coordinate + * + * + * 4 + * upper right x-coordinate + * + * + * 5 + * upper right y-coordinate + * + * + * 6 + * upper left x-coordinate + * + * + * 7 + * upper left y-coordinate + * + * + * @jms-builtin + */ +function imagefttext ($image, $size, $angle, $x, $y, $color, $fontfile, $text, array $extrainfo = null) {} + +/** + * Return the image types supported by this PHP build + * @link http://www.php.net/manual/en/function.imagetypes.php + * @return int a bit-field corresponding to the image formats supported by the + * version of GD linked into PHP. The following bits are returned, + * IMG_GIF | IMG_JPG | + * IMG_PNG | IMG_WBMP | + * IMG_XPM. + * + * @jms-builtin + */ +function imagetypes () {} + +/** + * Convert JPEG image file to WBMP image file + * @link http://www.php.net/manual/en/function.jpeg2wbmp.php + * @param jpegname string

+ * Path to JPEG file. + *

+ * @param wbmpname string

+ * Path to destination WBMP file. + *

+ * @param dest_height int

+ * Destination image height. + *

+ * @param dest_width int

+ * Destination image width. + *

+ * @param threshold int

+ * Threshold value, between 0 and 8 (inclusive). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function jpeg2wbmp ($jpegname, $wbmpname, $dest_height, $dest_width, $threshold) {} + +/** + * Convert PNG image file to WBMP image file + * @link http://www.php.net/manual/en/function.png2wbmp.php + * @param pngname string

+ * Path to PNG file. + *

+ * @param wbmpname string

+ * Path to destination WBMP file. + *

+ * @param dest_height int

+ * Destination image height. + *

+ * @param dest_width int

+ * Destination image width. + *

+ * @param threshold int

+ * Threshold value, between 0 and 8 (inclusive). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function png2wbmp ($pngname, $wbmpname, $dest_height, $dest_width, $threshold) {} + +/** + * Output image to browser or file + * @link http://www.php.net/manual/en/function.image2wbmp.php + * @param image resource + * @param filename string[optional]

+ * Path to the saved file. If not given, the raw image stream will be + * outputted directly. + *

+ * @param threshold int[optional]

+ * Threshold value, between 0 and 255 (inclusive). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function image2wbmp ($image, $filename = null, $threshold = null) {} + +/** + * Set the alpha blending flag to use the bundled libgd layering effects + * @link http://www.php.net/manual/en/function.imagelayereffect.php + * @param image resource + * @param effect int

+ * One of the following constants: + * IMG_EFFECT_REPLACE + * Use pixel replacement (equivalent of passing true to + * imagealphablending) + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagelayereffect ($image, $effect) {} + +/** + * Makes the colors of the palette version of an image more closely match the true color version + * @link http://www.php.net/manual/en/function.imagecolormatch.php + * @param image1 resource

+ * A truecolor image link resource. + *

+ * @param image2 resource

+ * A palette image link resource pointing to an image that has the same + * size as image1. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecolormatch ($image1, $image2) {} + +/** + * Output XBM image to browser or file + * @link http://www.php.net/manual/en/function.imagexbm.php + * @param image resource + * @param filename string

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ * @param foreground int[optional]

+ * You can set the foreground color with this parameter by setting an + * identifier obtained from imagecolorallocate. + * The default foreground color is black. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagexbm ($image, $filename, $foreground = null) {} + +/** + * Applies a filter to an image + * @link http://www.php.net/manual/en/function.imagefilter.php + * @param image resource + * @param filtertype int

+ * filtertype can be one of the following: + * IMG_FILTER_NEGATE: Reverses all colors of + * the image. + * @param arg1 int[optional]

+ * IMG_FILTER_BRIGHTNESS: Brightness level. + * @param arg2 int[optional]

+ * IMG_FILTER_COLORIZE: Value of green component. + * @param arg3 int[optional]

+ * IMG_FILTER_COLORIZE: Value of blue component. + * @param arg4 int[optional]

+ * IMG_FILTER_COLORIZE: Alpha channel, A value + * between 0 and 127. 0 indicates completely opaque while 127 indicates + * completely transparent. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilter ($image, $filtertype, $arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null) {} + +/** + * Apply a 3x3 convolution matrix, using coefficient and offset + * @link http://www.php.net/manual/en/function.imageconvolution.php + * @param image resource + * @param matrix array

+ * A 3x3 matrix: an array of three arrays of three floats. + *

+ * @param div float

+ * The divisor of the result of the convolution, used for normalization. + *

+ * @param offset float

+ * Color offset. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imageconvolution ($image, array $matrix, $div, $offset) {} + + +/** + * Used as a return value by imagetypes + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_GIF', 1); + +/** + * Used as a return value by imagetypes + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_JPG', 2); + +/** + * Used as a return value by imagetypes + *

+ * This constant has the same value as IMG_JPG + *

+ * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_JPEG', 2); + +/** + * Used as a return value by imagetypes + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_PNG', 4); + +/** + * Used as a return value by imagetypes + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_WBMP', 8); + +/** + * Used as a return value by imagetypes + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_XPM', 16); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_TILED', -5); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_STYLED', -2); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_BRUSHED', -3); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_STYLEDBRUSHED', -4); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_TRANSPARENT', -6); + +/** + * A style constant used by the imagefilledarc function. + *

+ * This constant has the same value as IMG_ARC_PIE + *

+ * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_ROUNDED', 0); + +/** + * A style constant used by the imagefilledarc function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_PIE', 0); + +/** + * A style constant used by the imagefilledarc function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_CHORD', 1); + +/** + * A style constant used by the imagefilledarc function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_NOFILL', 2); + +/** + * A style constant used by the imagefilledarc function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_EDGED', 4); + +/** + * A type constant used by the imagegd2 function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_GD2_RAW', 1); + +/** + * A type constant used by the imagegd2 function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_GD2_COMPRESSED', 2); + +/** + * Alpha blending effect used by the imagelayereffect function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_EFFECT_REPLACE', 0); + +/** + * Alpha blending effect used by the imagelayereffect function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_EFFECT_ALPHABLEND', 1); + +/** + * Alpha blending effect used by the imagelayereffect function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_EFFECT_NORMAL', 2); + +/** + * Alpha blending effect used by the imagelayereffect function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_EFFECT_OVERLAY', 3); + +/** + * When the bundled version of GD is used this is 1 otherwise + * its set to 0. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_BUNDLED', 1); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_NEGATE', 0); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_GRAYSCALE', 1); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_BRIGHTNESS', 2); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_CONTRAST', 3); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_COLORIZE', 4); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_EDGEDETECT', 5); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_GAUSSIAN_BLUR', 7); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_SELECTIVE_BLUR', 8); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_EMBOSS', 6); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_MEAN_REMOVAL', 9); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_SMOOTH', 10); + +/** + * The GD version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_VERSION', "2.0.35"); + +/** + * The GD major version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_MAJOR_VERSION', 2); + +/** + * The GD minor version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_MINOR_VERSION', 0); + +/** + * The GD release version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_RELEASE_VERSION', 35); + +/** + * The GD "extra" version (beta/rc..) PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_EXTRA_VERSION', ""); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_NO_FILTER', 0); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_NONE', 8); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_SUB', 16); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_UP', 32); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_AVG', 64); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_PAETH', 128); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_ALL_FILTERS', 248); + +// End of gd v. +?> diff --git a/res/php-5.2-core-api/gettext.php b/res/php-5.2-core-api/gettext.php new file mode 100644 index 0000000..ee6db94 --- /dev/null +++ b/res/php-5.2-core-api/gettext.php @@ -0,0 +1,158 @@ + + * The new message domain, or &null; to get the current setting without + * changing it + *

+ * @return string If successful, this function returns the current message + * domain, after possibly changing it. + * + * @jms-builtin + */ +function textdomain ($text_domain) {} + +/** + * Lookup a message in the current domain + * @link http://www.php.net/manual/en/function.gettext.php + * @param message string

+ * The message being translated. + *

+ * @return string a translated string if one is found in the + * translation table, or the submitted message if not found. + * + * @jms-builtin + */ +function gettext ($message) {} + +/** + * @param msgid + * + * @jms-builtin + */ +function _ ($msgid) {} + +/** + * Override the current domain + * @link http://www.php.net/manual/en/function.dgettext.php + * @param domain string

+ * The domain + *

+ * @param message string

+ * The message + *

+ * @return string A string on success. + * + * @jms-builtin + */ +function dgettext ($domain, $message) {} + +/** + * Overrides the domain for a single lookup + * @link http://www.php.net/manual/en/function.dcgettext.php + * @param domain string

+ * The domain + *

+ * @param message string

+ * The message + *

+ * @param category int

+ * The category + *

+ * @return string A string on success. + * + * @jms-builtin + */ +function dcgettext ($domain, $message, $category) {} + +/** + * Sets the path for a domain + * @link http://www.php.net/manual/en/function.bindtextdomain.php + * @param domain string

+ * The domain + *

+ * @param directory string

+ * The directory path + *

+ * @return string The full pathname for the domain currently being set. + * + * @jms-builtin + */ +function bindtextdomain ($domain, $directory) {} + +/** + * Plural version of gettext + * @link http://www.php.net/manual/en/function.ngettext.php + * @param msgid1 string

+ *

+ * @param msgid2 string

+ *

+ * @param n int

+ *

+ * @return string correct plural form of message identified by + * msgid1 and msgid2 + * for count n. + * + * @jms-builtin + */ +function ngettext ($msgid1, $msgid2, $n) {} + +/** + * Plural version of dgettext + * @link http://www.php.net/manual/en/function.dngettext.php + * @param domain string

+ * The domain + *

+ * @param msgid1 string

+ *

+ * @param msgid2 string

+ *

+ * @param n int

+ *

+ * @return string A string on success. + * + * @jms-builtin + */ +function dngettext ($domain, $msgid1, $msgid2, $n) {} + +/** + * Plural version of dcgettext + * @link http://www.php.net/manual/en/function.dcngettext.php + * @param domain string

+ * The domain + *

+ * @param msgid1 string

+ *

+ * @param msgid2 string

+ *

+ * @param n int

+ *

+ * @param category int

+ *

+ * @return string A string on success. + * + * @jms-builtin + */ +function dcngettext ($domain, $msgid1, $msgid2, $n, $category) {} + +/** + * Specify the character encoding in which the messages from the DOMAIN message catalog will be returned + * @link http://www.php.net/manual/en/function.bind-textdomain-codeset.php + * @param domain string

+ * The domain + *

+ * @param codeset string

+ * The code set + *

+ * @return string A string on success. + * + * @jms-builtin + */ +function bind_textdomain_codeset ($domain, $codeset) {} + +// End of gettext v. +?> diff --git a/res/php-5.2-core-api/hash.php b/res/php-5.2-core-api/hash.php new file mode 100644 index 0000000..6a56900 --- /dev/null +++ b/res/php-5.2-core-api/hash.php @@ -0,0 +1,207 @@ + + * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) + *

+ * @param data string

+ * Message to be hashed. + *

+ * @param raw_output bool[optional]

+ * When set to true, outputs raw binary data. + * false outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * + * @jms-builtin + */ +function hash ($algo, $data, $raw_output = null) {} + +/** + * Generate a hash value using the contents of a given file + * @link http://www.php.net/manual/en/function.hash-file.php + * @param algo string

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) + *

+ * @param filename string

+ * URL describing location of file to be hashed; Supports fopen wrappers. + *

+ * @param raw_output bool[optional]

+ * When set to true, outputs raw binary data. + * false outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * + * @jms-builtin + */ +function hash_file ($algo, $filename, $raw_output = null) {} + +/** + * Generate a keyed hash value using the HMAC method + * @link http://www.php.net/manual/en/function.hash-hmac.php + * @param algo string

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) See hash_algos for a list of supported algorithms. + *

+ * @param data string

+ * Message to be hashed. + *

+ * @param key string

+ * Shared secret key used for generating the HMAC variant of the message digest. + *

+ * @param raw_output bool[optional]

+ * When set to true, outputs raw binary data. + * false outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * + * @jms-builtin + */ +function hash_hmac ($algo, $data, $key, $raw_output = null) {} + +/** + * Generate a keyed hash value using the HMAC method and the contents of a given file + * @link http://www.php.net/manual/en/function.hash-hmac-file.php + * @param algo string

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) See hash_algos for a list of supported algorithms. + *

+ * @param filename string

+ * URL describing location of file to be hashed; Supports fopen wrappers. + *

+ * @param key string

+ * Shared secret key used for generating the HMAC variant of the message digest. + *

+ * @param raw_output bool[optional]

+ * When set to true, outputs raw binary data. + * false outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * + * @jms-builtin + */ +function hash_hmac_file ($algo, $filename, $key, $raw_output = null) {} + +/** + * Initialize an incremental hashing context + * @link http://www.php.net/manual/en/function.hash-init.php + * @param algo string

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) + *

+ * @param options int[optional]

+ * Optional settings for hash generation, currently supports only one option: + * HASH_HMAC. When specified, the key + * must be specified. + *

+ * @param key string[optional]

+ * When HASH_HMAC is specified for options, + * a shared secret key to be used with the HMAC hashing method must be supplied in this + * parameter. + *

+ * @return resource a Hashing Context resource for use with hash_update, + * hash_update_stream, hash_update_file, + * and hash_final. + * + * @jms-builtin + */ +function hash_init ($algo, $options = null, $key = null) {} + +/** + * Pump data into an active hashing context + * @link http://www.php.net/manual/en/function.hash-update.php + * @param context resource

+ * Hashing context returned by hash_init. + *

+ * @param data string

+ * Message to be included in the hash digest. + *

+ * @return bool true. + * + * @jms-builtin + */ +function hash_update ($context, $data) {} + +/** + * Pump data into an active hashing context from an open stream + * @link http://www.php.net/manual/en/function.hash-update-stream.php + * @param context resource

+ * Hashing context returned by hash_init. + *

+ * @param handle resource

+ * Open file handle as returned by any stream creation function. + *

+ * @param length int[optional]

+ * Maximum number of characters to copy from handle + * into the hashing context. + *

+ * @return int Actual number of bytes added to the hashing context from handle. + * + * @jms-builtin + */ +function hash_update_stream ($context, $handle, $length = null) {} + +/** + * Pump data into an active hashing context from a file + * @link http://www.php.net/manual/en/function.hash-update-file.php + * @param context resource

+ * Stream context as returned by stream_context_create. + *

+ * @param filename string

+ * URL describing location of file to be hashed; Supports fopen wrappers. + *

+ * @param context resource[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function hash_update_file ($context, $filename, $context = null) {} + +/** + * Finalize an incremental hash and return resulting digest + * @link http://www.php.net/manual/en/function.hash-final.php + * @param context resource

+ * Hashing context returned by hash_init. + *

+ * @param raw_output bool[optional]

+ * When set to true, outputs raw binary data. + * false outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * + * @jms-builtin + */ +function hash_final ($context, $raw_output = null) {} + +/** + * Return a list of registered hashing algorithms + * @link http://www.php.net/manual/en/function.hash-algos.php + * @return array a numerically indexed array containing the list of supported + * hashing algorithms. + * + * @jms-builtin + */ +function hash_algos () {} + + +/** + * Optional flag for hash_init. + * Indicates that the HMAC digest-keying algorithm should be + * applied to the current hashing context. + * @link http://www.php.net/manual/en/hash.constants.php + */ +define ('HASH_HMAC', 1); + +// End of hash v.1.0 +?> diff --git a/res/php-5.2-core-api/ibm_db2.php b/res/php-5.2-core-api/ibm_db2.php new file mode 100644 index 0000000..c634581 --- /dev/null +++ b/res/php-5.2-core-api/ibm_db2.php @@ -0,0 +1,1844 @@ + + * For a cataloged connection to a database, database + * represents the database alias in the DB2 client catalog. + *

+ *

+ * For an uncataloged connection to a database, + * database represents a complete connection + * string in the following format: + * DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password; + * where the parameters represent the following values: + * database + *

+ * The name of the database. + *

+ * @param username string

+ * The username with which you are connecting to the database. + *

+ *

+ * For uncataloged connections, you must pass a &null; value or empty + * string. + *

+ * @param password string

+ * The password with which you are connecting to the database. + *

+ *

+ * For uncataloged connections, you must pass a &null; value or empty + * string. + *

+ * @param options array[optional]

+ * An associative array of connection options that affect the behavior + * of the connection, where valid array keys include: + * autocommit + *

+ * Passing the DB2_AUTOCOMMIT_ON value turns + * autocommit on for this connection handle. + *

+ *

+ * Passing the DB2_AUTOCOMMIT_OFF value turns + * autocommit off for this connection handle. + *

+ * @return resource a connection handle resource if the connection attempt is + * successful. If the connection attempt fails, db2_connect + * returns false. + */ +function db2_connect ($database, $username, $password, array $options = null) {} + +/** + * Commits a transaction + * @link http://php.net/manual/en/function.db2-commit.php + * @param connection resource

+ * A valid database connection resource variable as returned from + * db2_connect or db2_pconnect. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_commit ($connection) {} + +/** + * Returns a persistent connection to a database + * @link http://php.net/manual/en/function.db2-pconnect.php + * @param database string

+ * The database alias in the DB2 client catalog. + *

+ * @param username string

+ * The username with which you are connecting to the database. + *

+ * @param password string

+ * The password with which you are connecting to the database. + *

+ * @param options array[optional]

+ * An associative array of connection options that affect the behavior + * of the connection, where valid array keys include: + * autocommit + *

+ * Passing the DB2_AUTOCOMMIT_ON value turns + * autocommit on for this connection handle. + *

+ *

+ * Passing the DB2_AUTOCOMMIT_OFF value turns + * autocommit off for this connection handle. + *

+ * @return resource a connection handle resource if the connection attempt is + * successful. db2_pconnect tries to reuse an existing + * connection resource that exactly matches the + * database, username, and + * password parameters. If the connection attempt fails, + * db2_pconnect returns false. + */ +function db2_pconnect ($database, $username, $password, array $options = null) {} + +/** + * Returns or sets the AUTOCOMMIT state for a database connection + * @link http://php.net/manual/en/function.db2-autocommit.php + * @param connection resource

+ * A valid database connection resource variable as returned from + * db2_connect or db2_pconnect. + *

+ * @param value bool[optional]

+ * One of the following constants: + * DB2_AUTOCOMMIT_OFF + *

+ * Turns AUTOCOMMIT off. + *

+ * @return mixed When db2_autocommit receives only the + * connection parameter, it returns the current state + * of AUTOCOMMIT for the requested connection as an integer value. A value of + * 0 indicates that AUTOCOMMIT is off, while a value of 1 indicates that + * AUTOCOMMIT is on. + *

+ *

+ * When db2_autocommit receives both the + * connection parameter and + * autocommit parameter, it attempts to set the + * AUTOCOMMIT state of the requested connection to the corresponding state. + * Returns true on success or false on failure. + */ +function db2_autocommit ($connection, $value = null) {} + +/** + * Binds a PHP variable to an SQL statement parameter + * @link http://php.net/manual/en/function.db2-bind-param.php + * @param stmt resource

+ * A prepared statement returned from db2_prepare. + *

+ * @param parameter_number int + * @param variable_name string + * @param parameter_type int[optional] + * @param data_type int[optional] + * @param precision int[optional]

+ * Specifies the precision with which the variable should be bound to the + * database. This parameter can also be used for retrieving XML output values + * from stored procedures. A non-negative value specifies the maximum size of + * the XML data that will be retrieved from the database. If this parameter + * is not used, a default of 1MB will be assumed for retrieving the XML + * output value from the stored procedure.� + *

+ * @param scale int[optional]

+ * Specifies the scale with which the variable should be bound to the + * database. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_bind_param ($stmt, $parameter_number, $variable_name, $parameter_type = null, $data_type = null, $precision = null, $scale = null) {} + +/** + * Closes a database connection + * @link http://php.net/manual/en/function.db2-close.php + * @param connection resource

+ * Specifies an active DB2 client connection. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_close ($connection) {} + +/** + * Returns a result set listing the columns and associated privileges for a table + * @link http://php.net/manual/en/function.db2-column-privileges.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string[optional]

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string[optional]

+ * The schema which contains the tables. To match all schemas, pass &null; + * or an empty string. + *

+ * @param table_name string[optional] + * @param column_name string[optional] + * @return resource a statement resource with a result set containing rows describing + * the column privileges for columns matching the specified parameters. The + * rows are composed of the following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * Name of the catalog. The value is NULL if this table does not + * have catalogs. + * + * + * TABLE_SCHEM + * Name of the schema. + * + * + * TABLE_NAME + * Name of the table or view. + * + * + * COLUMN_NAME + * Name of the column. + * + * + * GRANTOR + * Authorization ID of the user who granted the privilege. + * + * + * GRANTEE + * Authorization ID of the user to whom the privilege was + * granted. + * + * + * PRIVILEGE + * The privilege for the column. + * + * + * IS_GRANTABLE + * Whether the GRANTEE is permitted to grant this privilege to + * other users. + * + */ +function db2_column_privileges ($connection, $qualifier = null, $schema = null, $table_name = null, $column_name = null) {} + +function db2_columnprivileges () {} + +/** + * Returns a result set listing the columns and associated metadata for a table + * @link http://php.net/manual/en/function.db2-columns.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string[optional]

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string[optional]

+ * The schema which contains the tables. To match all schemas, pass + * '%'. + *

+ * @param table_name string[optional] + * @param column_name string[optional] + * @return resource a statement resource with a result set containing rows describing + * the columns matching the specified parameters. The rows are composed of + * the following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * Name of the catalog. The value is NULL if this table does not + * have catalogs. + * + * + * TABLE_SCHEM + * Name of the schema. + * + * + * TABLE_NAME + * Name of the table or view. + * + * + * COLUMN_NAME + * Name of the column. + * + * + * DATA_TYPE + * The SQL data type for the column represented as an integer value. + * + * + * TYPE_NAME + * A string representing the data type for the column. + * + * + * COLUMN_SIZE + * An integer value representing the size of the column. + * + * + * BUFFER_LENGTH + * + * Maximum number of bytes necessary to store data from this column. + * + * + * + * DECIMAL_DIGITS + * + * The scale of the column, or &null; where scale is not applicable. + * + * + * + * NUM_PREC_RADIX + * + * An integer value of either 10 (representing + * an exact numeric data type), 2 (representing an + * approximate numeric data type), or &null; (representing a data type for + * which radix is not applicable). + * + * + * + * NULLABLE + * An integer value representing whether the column is nullable or + * not. + * + * + * REMARKS + * Description of the column. + * + * + * COLUMN_DEF + * Default value for the column. + * + * + * SQL_DATA_TYPE + * An integer value representing the size of the column. + * + * + * SQL_DATETIME_SUB + * + * Returns an integer value representing a datetime subtype code, + * or &null; for SQL data types to which this does not apply. + * + * + * + * CHAR_OCTET_LENGTH + * + * Maximum length in octets for a character data type column, which + * matches COLUMN_SIZE for single-byte character set data, or &null; for + * non-character data types. + * + * + * + * ORDINAL_POSITION + * The 1-indexed position of the column in the table. + * + * + * IS_NULLABLE + * + * A string value where 'YES' means that the column is nullable and + * 'NO' means that the column is not nullable. + * + * + */ +function db2_columns ($connection, $qualifier = null, $schema = null, $table_name = null, $column_name = null) {} + +/** + * Returns a result set listing the foreign keys for a table + * @link http://php.net/manual/en/function.db2-foreign-keys.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema which contains the tables. If schema + * is &null;, db2_foreign_keys matches the schema for + * the current connection. + *

+ * @param table_name string + * @return resource a statement resource with a result set containing rows describing + * the foreign keys for the specified table. The result set is composed of the + * following columns: + * + * Column name + * Description + * + * + * PKTABLE_CAT + * + * Name of the catalog for the table containing the primary key. The + * value is NULL if this table does not have catalogs. + * + * + * + * PKTABLE_SCHEM + * + * Name of the schema for the table containing the primary key. + * + * + * + * PKTABLE_NAME + * Name of the table containing the primary key. + * + * + * PKCOLUMN_NAME + * Name of the column containing the primary key. + * + * + * FKTABLE_CAT + * + * Name of the catalog for the table containing the foreign key. The + * value is NULL if this table does not have catalogs. + * + * + * + * FKTABLE_SCHEM + * + * Name of the schema for the table containing the foreign key. + * + * + * + * FKTABLE_NAME + * Name of the table containing the foreign key. + * + * + * FKCOLUMN_NAME + * Name of the column containing the foreign key. + * + * + * KEY_SEQ + * 1-indexed position of the column in the key. + * + * + * UPDATE_RULE + * + * Integer value representing the action applied to the foreign key + * when the SQL operation is UPDATE. + * + * + * + * DELETE_RULE + * + * Integer value representing the action applied to the foreign key + * when the SQL operation is DELETE. + * + * + * + * FK_NAME + * The name of the foreign key. + * + * + * PK_NAME + * The name of the primary key. + * + * + * DEFERRABILITY + * + * An integer value representing whether the foreign key deferrability is + * SQL_INITIALLY_DEFERRED, SQL_INITIALLY_IMMEDIATE, or + * SQL_NOT_DEFERRABLE. + * + * + */ +function db2_foreign_keys ($connection, $qualifier, $schema, $table_name) {} + +function db2_foreignkeys () {} + +/** + * Returns a result set listing primary keys for a table + * @link http://php.net/manual/en/function.db2-primary-keys.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema which contains the tables. If schema + * is &null;, db2_primary_keys matches the schema for + * the current connection. + *

+ * @param table_name string + * @return resource a statement resource with a result set containing rows describing + * the primary keys for the specified table. The result set is composed of the + * following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * + * Name of the catalog for the table containing the primary key. The + * value is NULL if this table does not have catalogs. + * + * + * + * TABLE_SCHEM + * + * Name of the schema for the table containing the primary key. + * + * + * + * TABLE_NAME + * Name of the table containing the primary key. + * + * + * COLUMN_NAME + * Name of the column containing the primary key. + * + * + * KEY_SEQ + * 1-indexed position of the column in the key. + * + * + * PK_NAME + * The name of the primary key. + * + */ +function db2_primary_keys ($connection, $qualifier, $schema, $table_name) {} + +function db2_primarykeys () {} + +/** + * Returns a result set listing stored procedure parameters + * @link http://php.net/manual/en/function.db2-procedure-columns.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema which contains the procedures. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @param procedure string

+ * The name of the procedure. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @param parameter string

+ * The name of the parameter. This parameter accepts a search pattern + * containing _ and % as wildcards. + * If this parameter is &null;, all parameters for the specified stored + * procedures are returned. + *

+ * @return resource a statement resource with a result set containing rows describing + * the parameters for the stored procedures matching the specified parameters. + * The rows are composed of the following columns: + * + * Column name + * Description + * + * + * PROCEDURE_CAT + * The catalog that contains the procedure. The value is &null; if + * this table does not have catalogs. + * + * + * PROCEDURE_SCHEM + * Name of the schema that contains the stored procedure. + * + * + * PROCEDURE_NAME + * Name of the procedure. + * + * + * COLUMN_NAME + * Name of the parameter. + * + * + * COLUMN_TYPE + * + *

+ * An integer value representing the type of the parameter: + * + * Return value + * Parameter type + * + * + * 1 (SQL_PARAM_INPUT) + * Input (IN) parameter. + * + * + * 2 (SQL_PARAM_INPUT_OUTPUT) + * Input/output (INOUT) parameter. + * + * + * 3 (SQL_PARAM_OUTPUT) + * Output (OUT) parameter. + * + *

+ * + * + * + * DATA_TYPE + * The SQL data type for the parameter represented as an integer + * value. + * + * + * TYPE_NAME + * A string representing the data type for the parameter. + * + * + * COLUMN_SIZE + * An integer value representing the size of the parameter. + * + * + * BUFFER_LENGTH + * + * Maximum number of bytes necessary to store data for this parameter. + * + * + * + * DECIMAL_DIGITS + * + * The scale of the parameter, or &null; where scale is not applicable. + * + * + * + * NUM_PREC_RADIX + * + * An integer value of either 10 (representing + * an exact numeric data type), 2 (representing an + * approximate numeric data type), or &null; (representing a data type for + * which radix is not applicable). + * + * + * + * NULLABLE + * An integer value representing whether the parameter is nullable + * or not. + * + * + * REMARKS + * Description of the parameter. + * + * + * COLUMN_DEF + * Default value for the parameter. + * + * + * SQL_DATA_TYPE + * An integer value representing the size of the parameter. + * + * + * SQL_DATETIME_SUB + * + * Returns an integer value representing a datetime subtype code, + * or &null; for SQL data types to which this does not apply. + * + * + * + * CHAR_OCTET_LENGTH + * + * Maximum length in octets for a character data type parameter, which + * matches COLUMN_SIZE for single-byte character set data, or &null; for + * non-character data types. + * + * + * + * ORDINAL_POSITION + * The 1-indexed position of the parameter in the CALL + * statement. + * + * + * IS_NULLABLE + * + * A string value where 'YES' means that the parameter accepts or + * returns &null; values and 'NO' means that the parameter does not + * accept or return &null; values. + * + * + */ +function db2_procedure_columns ($connection, $qualifier, $schema, $procedure, $parameter) {} + +function db2_procedurecolumns () {} + +/** + * Returns a result set listing the stored procedures registered in a database + * @link http://php.net/manual/en/function.db2-procedures.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema which contains the procedures. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @param procedure string

+ * The name of the procedure. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @return resource a statement resource with a result set containing rows describing + * the stored procedures matching the specified parameters. The rows are + * composed of the following columns: + * + * Column name + * Description + * + * + * PROCEDURE_CAT + * The catalog that contains the procedure. The value is &null; if + * this table does not have catalogs. + * + * + * PROCEDURE_SCHEM + * Name of the schema that contains the stored procedure. + * + * + * PROCEDURE_NAME + * Name of the procedure. + * + * + * NUM_INPUT_PARAMS + * Number of input (IN) parameters for the stored procedure. + * + * + * NUM_OUTPUT_PARAMS + * Number of output (OUT) parameters for the stored procedure. + * + * + * NUM_RESULT_SETS + * Number of result sets returned by the stored procedure. + * + * + * REMARKS + * Any comments about the stored procedure. + * + * + * PROCEDURE_TYPE + * Always returns 1, indicating that the stored + * procedure does not return a return value. + * + */ +function db2_procedures ($connection, $qualifier, $schema, $procedure) {} + +/** + * Returns a result set listing the unique row identifier columns for a table + * @link http://php.net/manual/en/function.db2-special-columns.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema which contains the tables. + *

+ * @param table_name string

+ * The name of the table. + *

+ * @param scope int

+ * Integer value representing the minimum duration for which the + * unique row identifier is valid. This can be one of the following + * values: + * + * Integer value + * SQL constant + * Description + * + * + * 0 + * SQL_SCOPE_CURROW + * Row identifier is valid only while the cursor is positioned + * on the row. + * + * + * 1 + * SQL_SCOPE_TRANSACTION + * Row identifier is valid for the duration of the + * transaction. + * + * + * 2 + * SQL_SCOPE_SESSION + * Row identifier is valid for the duration of the + * connection. + * + *

+ * @return resource a statement resource with a result set containing rows with unique + * row identifier information for a table. The rows are composed of the + * following columns: + * + * Column name + * Description + * + * + * SCOPE + * + *

+ * + * Integer value + * SQL constant + * Description + * + * + * 0 + * SQL_SCOPE_CURROW + * Row identifier is valid only while the cursor is positioned + * on the row. + * + * + * 1 + * SQL_SCOPE_TRANSACTION + * Row identifier is valid for the duration of the + * transaction. + * + * + * 2 + * SQL_SCOPE_SESSION + * Row identifier is valid for the duration of the + * connection. + * + *

+ * + * + * + * COLUMN_NAME + * Name of the unique column. + * + * + * DATA_TYPE + * SQL data type for the column. + * + * + * TYPE_NAME + * Character string representation of the SQL data type for the + * column. + * + * + * COLUMN_SIZE + * An integer value representing the size of the column. + * + * + * BUFFER_LENGTH + * + * Maximum number of bytes necessary to store data from this column. + * + * + * + * DECIMAL_DIGITS + * + * The scale of the column, or &null; where scale is not applicable. + * + * + * + * NUM_PREC_RADIX + * + * An integer value of either 10 (representing + * an exact numeric data type), 2 (representing an + * approximate numeric data type), or &null; (representing a data type for + * which radix is not applicable). + * + * + * + * PSEUDO_COLUMN + * Always returns 1. + * + */ +function db2_special_columns ($connection, $qualifier, $schema, $table_name, $scope) {} + +function db2_specialcolumns () {} + +/** + * Returns a result set listing the index and statistics for a table + * @link http://php.net/manual/en/function.db2-statistics.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema that contains the targeted table. If this parameter is + * &null;, the statistics and indexes are returned for the schema of the + * current user. + *

+ * @param table_name string

+ * The name of the table. + *

+ * @param unique bool

+ * An integer value representing the type of index information to return. + * 0 + *

+ * Return only the information for unique indexes on the table. + *

+ * @return resource a statement resource with a result set containing rows describing + * the statistics and indexes for the base tables matching the specified + * parameters. The rows are composed of the following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * The catalog that contains the table. The value is &null; if + * this table does not have catalogs. + * + * + * TABLE_SCHEM + * Name of the schema that contains the table. + * + * + * TABLE_NAME + * Name of the table. + * + * + * NON_UNIQUE + * + *

+ * An integer value representing whether the index prohibits unique + * values, or whether the row represents statistics on the table itself: + * + * Return value + * Parameter type + * + * + * 0 (SQL_FALSE) + * The index allows duplicate values. + * + * + * 1 (SQL_TRUE) + * The index values must be unique. + * + * + * &null; + * This row is statistics information for the table itself. + * + *

+ * + * + * + * INDEX_QUALIFIER + * A string value representing the qualifier that would have to be + * prepended to INDEX_NAME to fully qualify the index. + * + * + * INDEX_NAME + * A string representing the name of the index. + * + * + * TYPE + * + *

+ * An integer value representing the type of information contained in + * this row of the result set: + * + * Return value + * Parameter type + * + * + * 0 (SQL_TABLE_STAT) + * The row contains statistics about the table itself. + * + * + * 1 (SQL_INDEX_CLUSTERED) + * The row contains information about a clustered index. + * + * + * 2 (SQL_INDEX_HASH) + * The row contains information about a hashed index. + * + * + * 3 (SQL_INDEX_OTHER) + * The row contains information about a type of index that + * is neither clustered nor hashed. + * + *

+ * + * + * + * ORDINAL_POSITION + * The 1-indexed position of the column in the index. &null; if + * the row contains statistics information about the table itself. + * + * + * COLUMN_NAME + * The name of the column in the index. &null; if the row + * contains statistics information about the table itself. + * + * + * ASC_OR_DESC + * + * A if the column is sorted in ascending order, + * D if the column is sorted in descending order, + * &null; if the row contains statistics information about the table + * itself. + * + * + * + * CARDINALITY + * + *

+ * If the row contains information about an index, this column contains + * an integer value representing the number of unique values in the + * index. + *

+ *

+ * If the row contains information about the table itself, this column + * contains an integer value representing the number of rows in the + * table. + *

+ * + * + * + * PAGES + * + *

+ * If the row contains information about an index, this column contains + * an integer value representing the number of pages used to store the + * index. + *

+ *

+ * If the row contains information about the table itself, this column + * contains an integer value representing the number of pages used to + * store the table. + *

+ * + * + * + * FILTER_CONDITION + * Always returns &null;. + * + */ +function db2_statistics ($connection, $qualifier, $schema, $table_name, $unique) {} + +/** + * Returns a result set listing the tables and associated privileges in a database + * @link http://php.net/manual/en/function.db2-table-privileges.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string[optional]

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string[optional]

+ * The schema which contains the tables. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @param table_name string[optional]

+ * The name of the table. This parameter accepts a search pattern + * containing _ and % as wildcards. + *

+ * @return resource a statement resource with a result set containing rows describing + * the privileges for the tables that match the specified parameters. The rows + * are composed of the following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * The catalog that contains the table. The value is &null; if + * this table does not have catalogs. + * + * + * TABLE_SCHEM + * Name of the schema that contains the table. + * + * + * TABLE_NAME + * Name of the table. + * + * + * GRANTOR + * Authorization ID of the user who granted the privilege. + * + * + * GRANTEE + * Authorization ID of the user to whom the privilege was + * granted. + * + * + * PRIVILEGE + * + * The privilege that has been granted. This can be one of ALTER, + * CONTROL, DELETE, INDEX, INSERT, REFERENCES, SELECT, or UPDATE. + * + * + * + * IS_GRANTABLE + * + * A string value of "YES" or "NO" indicating whether the grantee + * can grant the privilege to other users. + * + * + */ +function db2_table_privileges ($connection, $qualifier = null, $schema = null, $table_name = null) {} + +function db2_tableprivileges () {} + +/** + * Returns a result set listing the tables and associated metadata in a database + * @link http://php.net/manual/en/function.db2-tables.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string[optional]

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string[optional]

+ * The schema which contains the tables. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @param table_name string[optional] + * @param table_type string[optional] + * @return resource a statement resource with a result set containing rows describing + * the tables that match the specified parameters. The rows are composed of + * the following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * The catalog that contains the table. The value is &null; if + * this table does not have catalogs. + * + * + * TABLE_SCHEM + * Name of the schema that contains the table. + * + * + * TABLE_NAME + * Name of the table. + * + * + * TABLE_TYPE + * Table type identifier for the table. + * + * + * REMARKS + * Description of the table. + * + */ +function db2_tables ($connection, $qualifier = null, $schema = null, $table_name = null, $table_type = null) {} + +/** + * Executes an SQL statement directly + * @link http://php.net/manual/en/function.db2-exec.php + * @param connection resource

+ * A valid database connection resource variable as returned from + * db2_connect or db2_pconnect. + *

+ * @param statement string

+ * An SQL statement. The statement cannot contain any parameter markers. + *

+ * @param options array[optional]

+ * An associative array containing statement options. You can use this + * parameter to request a scrollable cursor on database servers that + * support this functionality. + * cursor + *

+ * Passing the DB2_FORWARD_ONLY value requests a + * forward-only cursor for this SQL statement. This is the default + * type of cursor, and it is supported by all database servers. It is + * also much faster than a scrollable cursor. + *

+ *

+ * Passing the DB2_SCROLLABLE value requests a + * scrollable cursor for this SQL statement. This type of cursor + * enables you to fetch rows non-sequentially from the database + * server. However, it is only supported by DB2 servers, and is much + * slower than forward-only cursors. + *

+ * @return resource a statement resource if the SQL statement was issued successfully, + * or false if the database failed to execute the SQL statement. + */ +function db2_exec ($connection, $statement, array $options = null) {} + +/** + * Prepares an SQL statement to be executed + * @link http://php.net/manual/en/function.db2-prepare.php + * @param connection resource

+ * A valid database connection resource variable as returned from + * db2_connect or db2_pconnect. + *

+ * @param statement string

+ * An SQL statement, optionally containing one or more parameter markers.. + *

+ * @param options array[optional]

+ * An associative array containing statement options. You can use this + * parameter to request a scrollable cursor on database servers that + * support this functionality. + * cursor + *

+ * Passing the DB2_FORWARD_ONLY value requests a + * forward-only cursor for this SQL statement. This is the default + * type of cursor, and it is supported by all database servers. It is + * also much faster than a scrollable cursor. + *

+ *

+ * Passing the DB2_SCROLLABLE value requests a + * scrollable cursor for this SQL statement. This type of cursor + * enables you to fetch rows non-sequentially from the database + * server. However, it is only supported by DB2 servers, and is much + * slower than forward-only cursors. + *

+ * @return resource a statement resource if the SQL statement was successfully parsed and + * prepared by the database server. Returns false if the database server + * returned an error. You can determine which error was returned by calling + * db2_stmt_error or db2_stmt_errormsg. + */ +function db2_prepare ($connection, $statement, array $options = null) {} + +/** + * Executes a prepared SQL statement + * @link http://php.net/manual/en/function.db2-execute.php + * @param stmt resource

+ * A prepared statement returned from db2_prepare. + *

+ * @param parameters array[optional]

+ * An array of input parameters matching any parameter markers contained + * in the prepared statement. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_execute ($stmt, array $parameters = null) {} + +/** + * Returns a string containing the last SQL statement error message + * @link http://php.net/manual/en/function.db2-stmt-errormsg.php + * @param stmt resource[optional]

+ * A valid statement resource. + *

+ * @return string a string containing the error message and SQLCODE value for the + * last error that occurred issuing an SQL statement. + */ +function db2_stmt_errormsg ($stmt = null) {} + +/** + * Returns the last connection error message and SQLCODE value + * @link http://php.net/manual/en/function.db2-conn-errormsg.php + * @param connection resource[optional]

+ * A connection resource associated with a connection that initially + * succeeded, but which over time became invalid. + *

+ * @return string a string containing the error message and SQLCODE value resulting + * from a failed connection attempt. If there is no error associated with the last + * connection attempt, db2_conn_errormsg returns an empty + * string. + */ +function db2_conn_errormsg ($connection = null) {} + +/** + * Returns a string containing the SQLSTATE returned by the last connection attempt + * @link http://php.net/manual/en/function.db2-conn-error.php + * @param connection resource[optional]

+ * A connection resource associated with a connection that initially + * succeeded, but which over time became invalid. + *

+ * @return string the SQLSTATE value resulting from a failed connection attempt. + * Returns an empty string if there is no error associated with the last + * connection attempt. + */ +function db2_conn_error ($connection = null) {} + +/** + * Returns a string containing the SQLSTATE returned by an SQL statement + * @link http://php.net/manual/en/function.db2-stmt-error.php + * @param stmt resource[optional]

+ * A valid statement resource. + *

+ * @return string a string containing an SQLSTATE value. + */ +function db2_stmt_error ($stmt = null) {} + +/** + * Requests the next result set from a stored procedure + * @link http://php.net/manual/en/function.db2-next-result.php + * @param stmt resource

+ * A prepared statement returned from db2_exec or + * db2_execute. + *

+ * @return resource a new statement resource containing the next result set if the + * stored procedure returned another result set. Returns false if the stored + * procedure did not return another result set. + */ +function db2_next_result ($stmt) {} + +/** + * Returns the number of fields contained in a result set + * @link http://php.net/manual/en/function.db2-num-fields.php + * @param stmt resource

+ * A valid statement resource containing a result set. + *

+ * @return int an integer value representing the number of fields in the result + * set associated with the specified statement resource. Returns false if + * the statement resource is not a valid input value. + */ +function db2_num_fields ($stmt) {} + +/** + * Returns the number of rows affected by an SQL statement + * @link http://php.net/manual/en/function.db2-num-rows.php + * @param stmt resource

+ * A valid stmt resource containing a result set. + *

+ * @return int the number of rows affected by the last SQL statement issued by + * the specified statement handle. + */ +function db2_num_rows ($stmt) {} + +/** + * Returns the name of the column in the result set + * @link http://php.net/manual/en/function.db2-field-name.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return string a string containing the name of the specified column. If the + * specified column does not exist in the result + * set, db2_field_name returns false. + */ +function db2_field_name ($stmt, $column) {} + +/** + * Returns the maximum number of bytes required to display a column + * @link http://php.net/manual/en/function.db2-field-display-size.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return int an integer value with the maximum number of bytes required to + * display the specified column. If the column does not exist in the result + * set, db2_field_display_size returns false. + */ +function db2_field_display_size ($stmt, $column) {} + +/** + * Returns the position of the named column in a result set + * @link http://php.net/manual/en/function.db2-field-num.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return int an integer containing the 0-indexed position of the named column in + * the result set. If the specified column does not exist in the result set, + * db2_field_num returns false. + */ +function db2_field_num ($stmt, $column) {} + +/** + * Returns the precision of the indicated column in a result set + * @link http://php.net/manual/en/function.db2-field-precision.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return int an integer containing the precision of the specified column. If the + * specified column does not exist in the result set, + * db2_field_precision returns false. + */ +function db2_field_precision ($stmt, $column) {} + +/** + * Returns the scale of the indicated column in a result set + * @link http://php.net/manual/en/function.db2-field-scale.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return int an integer containing the scale of the specified column. If the + * specified column does not exist in the result set, + * db2_field_scale returns false. + */ +function db2_field_scale ($stmt, $column) {} + +/** + * Returns the data type of the indicated column in a result set + * @link http://php.net/manual/en/function.db2-field-type.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return string a string containing the defined data type of the specified column. + * If the specified column does not exist in the result set, + * db2_field_type returns false. + */ +function db2_field_type ($stmt, $column) {} + +/** + * Returns the width of the current value of the indicated column in a result set + * @link http://php.net/manual/en/function.db2-field-width.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return int an integer containing the width of the specified character or + * binary data type column in a result set. If the specified column does not + * exist in the result set, db2_field_width returns + * false. + */ +function db2_field_width ($stmt, $column) {} + +/** + * Returns the cursor type used by a statement resource + * @link http://php.net/manual/en/function.db2-cursor-type.php + * @param stmt resource

+ * A valid statement resource. + *

+ * @return int either DB2_FORWARD_ONLY if the statement + * resource uses a forward-only cursor or DB2_SCROLLABLE if + * the statement resource uses a scrollable cursor. + */ +function db2_cursor_type ($stmt) {} + +/** + * Rolls back a transaction + * @link http://php.net/manual/en/function.db2-rollback.php + * @param connection resource

+ * A valid database connection resource variable as returned from + * db2_connect or db2_pconnect. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_rollback ($connection) {} + +/** + * Frees resources associated with the indicated statement resource + * @link http://php.net/manual/en/function.db2-free-stmt.php + * @param stmt resource

+ * A valid statement resource. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_free_stmt ($stmt) {} + +/** + * Returns a single column from a row in the result set + * @link http://php.net/manual/en/function.db2-result.php + * @param stmt resource

+ * A valid stmt resource. + *

+ * @param column mixed

+ * Either an integer mapping to the 0-indexed field in the result set, or + * a string matching the name of the column. + *

+ * @return mixed the value of the requested field if the field exists in the result + * set. Returns NULL if the field does not exist, and issues a warning. + */ +function db2_result ($stmt, $column) {} + +/** + * Sets the result set pointer to the next row or requested row + * @link http://php.net/manual/en/function.db2-fetch-row.php + * @param stmt resource

+ * A valid stmt resource. + *

+ * @param row_number int[optional]

+ * With scrollable cursors, you can request a specific row number in the + * result set. Row numbering is 1-indexed. + *

+ * @return bool true if the requested row exists in the result set. Returns + * false if the requested row does not exist in the result set. + */ +function db2_fetch_row ($stmt, $row_number = null) {} + +/** + * Returns an array, indexed by column name, representing a row in a result set + * @link http://php.net/manual/en/function.db2-fetch-assoc.php + * @param stmt resource

+ * A valid stmt resource containing a result set. + *

+ * @param row_number int[optional]

+ * Requests a specific 1-indexed row from the result set. Passing this + * parameter results in a PHP warning if the result set uses a + * forward-only cursor. + *

+ * @return array an associative array with column values indexed by the column name + * representing the next or requested row in the result set. Returns false if + * there are no rows left in the result set, or if the row requested by + * row_number does not exist in the result set. + */ +function db2_fetch_assoc ($stmt, $row_number = null) {} + +/** + * Returns an array, indexed by column position, representing a row in a result set + * @link http://php.net/manual/en/function.db2-fetch-array.php + * @param stmt resource

+ * A valid stmt resource containing a result set. + *

+ * @param row_number int[optional]

+ * Requests a specific 1-indexed row from the result set. Passing this + * parameter results in a PHP warning if the result set uses a + * forward-only cursor. + *

+ * @return array a 0-indexed array with column values indexed by the column position + * representing the next or requested row in the result set. Returns false if + * there are no rows left in the result set, or if the row requested by + * row_number does not exist in the result set. + */ +function db2_fetch_array ($stmt, $row_number = null) {} + +/** + * Returns an array, indexed by both column name and position, representing a row in a result set + * @link http://php.net/manual/en/function.db2-fetch-both.php + * @param stmt resource

+ * A valid stmt resource containing a result set. + *

+ * @param row_number int[optional]

+ * Requests a specific 1-indexed row from the result set. Passing this + * parameter results in a PHP warning if the result set uses a + * forward-only cursor. + *

+ * @return array an associative array with column values indexed by both the column + * name and 0-indexed column number. The array represents the next or + * requested row in the result set. Returns false if there are no rows left + * in the result set, or if the row requested by + * row_number does not exist in the result set. + */ +function db2_fetch_both ($stmt, $row_number = null) {} + +/** + * Frees resources associated with a result set + * @link http://php.net/manual/en/function.db2-free-result.php + * @param stmt resource

+ * A valid statement resource. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_free_result ($stmt) {} + +/** + * Set options for connection or statement resources + * @link http://php.net/manual/en/function.db2-set-option.php + * @param resource resource

+ * A valid statement resource as returned from + * db2_prepare or a valid connection resource as + * returned from db2_connect or + * db2_pconnect. + *

+ * @param options array

+ * An associative array containing valid statement or connection + * options. This parameter can be used to change autocommit values, + * cursor types (scrollable or forward), and to specify the case of + * the column names (lower, upper, or natural) that will appear in a + * result set. + * autocommit + *

+ * Passing DB2_AUTOCOMMIT_ON turns + * autocommit on for the specified connection resource. + *

+ *

+ * Passing DB2_AUTOCOMMIT_OFF turns + * autocommit off for the specified connection resource. + *

+ * @param type int

+ * An integer value that specifies the type of resource that was + * passed into the function. The type of resource and this value + * must correspond. + *

+ * Passing 1 as the value specifies that + * a connection resource has been passed into the function. + *

+ *

+ * Passing any integer not equal to 1 as + * the value specifies that a statement resource has been + * passed into the function. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_set_option ($resource, array $options, $type) {} + +function db2_setoption () {} + +/** + * Returns an object with properties representing columns in the fetched row + * @link http://php.net/manual/en/function.db2-fetch-object.php + * @param stmt resource

+ * A valid stmt resource containing a result set. + *

+ * @param row_number int[optional]

+ * Requests a specific 1-indexed row from the result set. Passing this + * parameter results in a PHP warning if the result set uses a + * forward-only cursor. + *

+ * @return object an object representing a single row in the result set. The + * properties of the object map to the names of the columns in the result set. + *

+ *

+ * The IBM DB2, Cloudscape, and Apache Derby database servers typically fold + * column names to upper-case, so the object properties will reflect that case. + *

+ *

+ * If your SELECT statement calls a scalar function to modify the value + * of a column, the database servers return the column number as the name of + * the column in the result set. If you prefer a more descriptive column name + * and object property, you can use the AS clause to assign a name to the + * column in the result set. + *

+ *

+ * Returns false if no row was retrieved. + */ +function db2_fetch_object ($stmt, $row_number = null) {} + +/** + * Returns an object with properties that describe the DB2 database server + * @link http://php.net/manual/en/function.db2-server-info.php + * @param connection resource

+ * Specifies an active DB2 client connection. + *

+ * @return object an object on a successful call. Returns false on failure. + */ +function db2_server_info ($connection) {} + +/** + * Returns an object with properties that describe the DB2 database client + * @link http://php.net/manual/en/function.db2-client-info.php + * @param connection resource

+ * Specifies an active DB2 client connection. + *

+ * @return object an object on a successful call. Returns false on failure. + */ +function db2_client_info ($connection) {} + +/** + * Used to escape certain characters + * @link http://php.net/manual/en/function.db2-escape-string.php + * @param string_literal string

+ * The string that contains special characters that need to be modified. + * Characters that are prepended with a backslash are \x00, + * \n, \r, \, + * ', " and \x1a. + *

+ * @return string string_literal with the special characters + * noted above prepended with backslashes. + */ +function db2_escape_string ($string_literal) {} + +/** + * Gets a user defined size of LOB files with each invocation + * @link http://php.net/manual/en/function.db2-lob-read.php + * @param stmt resource

+ * A valid stmt resource containing LOB data. + *

+ * @param colnum int

+ * A valid column number in the result set of the stmt resource. + *

+ * @param length int

+ * The size of the LOB data to be retrieved from the stmt resource. + *

+ * @return string the amount of data the user specifies. Returns + * false if the data cannot be retrieved. + */ +function db2_lob_read ($stmt, $colnum, $length) {} + +/** + * Retrieves an option value for a statement resource or a connection resource + * @link http://php.net/manual/en/function.db2-get-option.php + * @param resource resource

+ * A valid statement resource as returned from + * db2_prepare or a valid connection resource as + * returned from db2_connect or + * db2_pconnect. + *

+ * @param option string

+ * A valid statement or connection options. The following new options are available + * as of ibm_db2 version 1.6.0. They provide useful tracking information + * that can be set during execution with db2_get_option. + * Note + *

+ * Prior versions of ibm_db2 do not support these new options. + *

+ *

+ * When the value in each option is being set, some servers might not handle + * the entire length provided and might truncate the value. + *

+ *

+ * To ensure that the data specified in each option is converted correctly + * when transmitted to a host system, use only the characters A through Z, + * 0 through 9, and the underscore (_) or period (.). + *

+ * userid + *

+ * SQL_ATTR_INFO_USERID - A pointer to a null-terminated + * character string used to identify the client user ID sent to the host + * database server when using DB2 Connect. + * Note + *

+ * DB2 for z/OS and OS/390 servers support up to a length of 16 characters. + * This user-id is not to be confused with the authentication user-id, it is for + * identification purposes only and is not used for any authorization. + *

+ *

+ * @return string the current setting of the connection attribute provided on success + * or false on failure. + */ +function db2_get_option ($resource, $option) {} + +function db2_getoption () {} + + +/** + * Specifies that binary data shall be returned as is. This is the default + * mode. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_BINARY', 1); + +/** + * Specifies that binary data shall be converted to a hexadecimal encoding + * and returned as an ASCII string. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_CONVERT', 2); + +/** + * Specifies that binary data shall be converted to a &null; value. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_PASSTHRU', 3); + +/** + * Specifies a scrollable cursor for a statement resource. This mode enables + * random access to rows in a result set, but currently is supported only by + * IBM DB2 Universal Database. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_SCROLLABLE', 1); + +/** + * Specifies a forward-only cursor for a statement resource. This is the + * default cursor type and is supported on all database servers. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_FORWARD_ONLY', 0); + +/** + * Specifies the PHP variable should be bound as an IN parameter for a + * stored procedure. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_PARAM_IN', 1); + +/** + * Specifies the PHP variable should be bound as an OUT parameter for a + * stored procedure. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_PARAM_OUT', 4); + +/** + * Specifies the PHP variable should be bound as an INOUT parameter for a + * stored procedure. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_PARAM_INOUT', 2); + +/** + * Specifies that the column should be bound directly to a file for input. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_PARAM_FILE', 11); + +/** + * Specifies that autocommit should be turned on. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_AUTOCOMMIT_ON', 1); + +/** + * Specifies that autocommit should be turned off. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_AUTOCOMMIT_OFF', 0); + +/** + * Specifies that deferred prepare should be turned on for the specified statement resource. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_DEFERRED_PREPARE_ON', 1); + +/** + * Specifies that deferred prepare should be turned off for the specified statement resource. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_DEFERRED_PREPARE_OFF', 0); + +/** + * Specifies that the variable should be bound as a DOUBLE, FLOAT, or REAL + * data type. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_DOUBLE', 8); + +/** + * Specifies that the variable should be bound as a SMALLINT, INTEGER, or + * BIGINT data type. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_LONG', 4); + +/** + * Specifies that the variable should be bound as a CHAR or VARCHAR data type. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_CHAR', 1); +define ('DB2_XML', -370); + +/** + * Specifies that column names will be returned in their natural case. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_CASE_NATURAL', 0); + +/** + * Specifies that column names will be returned in lower case. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_CASE_LOWER', 1); + +/** + * Specifies that column names will be returned in upper case. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_CASE_UPPER', 2); + +// End of ibm_db2 v.1.6.0 +?> diff --git a/res/php-5.2-core-api/iconv.php b/res/php-5.2-core-api/iconv.php new file mode 100644 index 0000000..53722ab --- /dev/null +++ b/res/php-5.2-core-api/iconv.php @@ -0,0 +1,458 @@ + + * The input charset. + *

+ * @param out_charset string

+ * The output charset. + *

+ *

+ * If you append the string //TRANSLIT to + * out_charset transliteration is activated. This + * means that when a character can't be represented in the target charset, + * it can be approximated through one or several similarly looking + * characters. If you append the string //IGNORE, + * characters that cannot be represented in the target charset are silently + * discarded. Otherwise, str is cut from the first + * illegal character and an E_NOTICE is generated. + *

+ * @param str string

+ * The string to be converted. + *

+ * @return string the converted string&return.falseforfailure;. + * + * @jms-builtin + */ +function iconv ($in_charset, $out_charset, $str) {} + +/** + * Convert character encoding as output buffer handler + * @link http://www.php.net/manual/en/function.ob-iconv-handler.php + * @param contents string + * @param status int + * @return string See ob_start for information about this handler + * return values. + * + * @jms-builtin + */ +function ob_iconv_handler ($contents, $status) {} + +/** + * Retrieve internal configuration variables of iconv extension + * @link http://www.php.net/manual/en/function.iconv-get-encoding.php + * @param type string[optional]

+ * The value of the optional type can be: + * all + * input_encoding + * output_encoding + * internal_encoding + *

+ * @return mixed the current value of the internal configuration variable if + * successful&return.falseforfailure;. + *

+ *

+ * If type is omitted or set to "all", + * iconv_get_encoding returns an array that + * stores all these variables. + * + * @jms-builtin + */ +function iconv_get_encoding ($type = null) {} + +/** + * Set current setting for character encoding conversion + * @link http://www.php.net/manual/en/function.iconv-set-encoding.php + * @param type string

+ * The value of type can be any one of those: + * input_encoding + * output_encoding + * internal_encoding + *

+ * @param charset string

+ * The character set. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function iconv_set_encoding ($type, $charset) {} + +/** + * Returns the character count of string + * @link http://www.php.net/manual/en/function.iconv-strlen.php + * @param str string

+ * The string. + *

+ * @param charset string[optional]

+ * If charset parameter is omitted, + * str is assumed to be encoded in + * iconv.internal_encoding. + *

+ * @return int the character count of str, as an integer. + * + * @jms-builtin + */ +function iconv_strlen ($str, $charset = null) {} + +/** + * Cut out part of a string + * @link http://www.php.net/manual/en/function.iconv-substr.php + * @param str string

+ * The original string. + *

+ * @param offset int

+ * If offset is non-negative, + * iconv_substr cuts the portion out of + * str beginning at offset'th + * character, counting from zero. + *

+ *

+ * If offset is negative, + * iconv_substr cuts out the portion beginning + * at the position, offset characters + * away from the end of str. + *

+ * @param length int[optional]

+ * If length is given and is positive, the return + * value will contain at most length characters + * of the portion that begins at offset + * (depending on the length of string). + *

+ *

+ * If negative length is passed, + * iconv_substr cuts the portion out of + * str from the offset'th + * character up to the character that is + * length characters away from the end of the string. + * In case offset is also negative, the start position + * is calculated beforehand according to the rule explained above. + *

+ * @param charset string[optional]

+ * If charset parameter is omitted, + * string are assumed to be encoded in + * iconv.internal_encoding. + *

+ *

+ * Note that offset and length + * parameters are always deemed to represent offsets that are + * calculated on the basis of the character set determined by + * charset, whilst the counterpart + * substr always takes these for byte offsets. + *

+ * @return string the portion of str specified by the + * offset and length parameters. + *

+ *

+ * If str is shorter than offset + * characters long, false will be returned. + * + * @jms-builtin + */ +function iconv_substr ($str, $offset, $length = null, $charset = null) {} + +/** + * Finds position of first occurrence of a needle within a haystack + * @link http://www.php.net/manual/en/function.iconv-strpos.php + * @param haystack string

+ * The entire string. + *

+ * @param needle string

+ * The searched substring. + *

+ * @param offset int[optional]

+ * The optional offset parameter specifies + * the position from which the search should be performed. + *

+ * @param charset string[optional]

+ * If charset parameter is omitted, + * string are assumed to be encoded in + * iconv.internal_encoding. + *

+ * @return int the numeric position of the first occurrence of + * needle in haystack. + *

+ *

+ * If needle is not found, + * iconv_strpos will return false. + * + * @jms-builtin + */ +function iconv_strpos ($haystack, $needle, $offset = null, $charset = null) {} + +/** + * Finds the last occurrence of a needle within a haystack + * @link http://www.php.net/manual/en/function.iconv-strrpos.php + * @param haystack string

+ * The entire string. + *

+ * @param needle string

+ * The searched substring. + *

+ * @param charset string[optional]

+ * If charset parameter is omitted, + * string are assumed to be encoded in + * iconv.internal_encoding. + *

+ * @return int the numeric position of the last occurrence of + * needle in haystack. + * The characters are counted + * on the basis of the specified character set charset. + *

+ *

+ * If needle is not found, + * iconv_strrpos will return false. + * + * @jms-builtin + */ +function iconv_strrpos ($haystack, $needle, $charset = null) {} + +/** + * Composes a MIME header field + * @link http://www.php.net/manual/en/function.iconv-mime-encode.php + * @param field_name string

+ * The field name. + *

+ * @param field_value string

+ * The field value. + *

+ * @param preferences array[optional]

+ * You can control the behaviour of iconv_mime_encode + * by specifying an associative array that contains configuration items + * to the optional third parameter preferences. + * The items supported by iconv_mime_encode are + * listed below. Note that item names are treated case-sensitive. + * + * Configuration items supported by iconv_mime_encode + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ItemTypeDescriptionDefault valueExample
schemestring + * Specifies the method to encode a field value by. The value of + * this item may be either "B" or "Q", where "B" stands for + * base64 encoding scheme and "Q" stands for + * quoted-printable encoding scheme. + * BB
input-charsetstring + * Specifies the character set in which the first parameter + * field_name and the second parameter + * field_value are presented. If not given, + * iconv_mime_encode assumes those parameters + * are presented to it in the + * iconv.internal_encoding + * ini setting. + * + * iconv.internal_encoding + * ISO-8859-1
output-charsetstring + * Specifies the character set to use to compose the + * MIME header. If not given, the same value as + * input-charset will be used. + * + * iconv.internal_encoding + * UTF-8
line-lengthinteger + * Specifies the maximum length of the header lines. The resulting + * header is "folded" to a set of multiple lines in case + * the resulting header field would be longer than the value of this + * parameter, according to + * RFC2822 - Internet Message Format. + * If not given, the length will be limited to 76 characters. + * 76996
line-break-charsstring + * Specifies the sequence of characters to append to each line + * as an end-of-line sign when "folding" is performed on a long header + * field. If not given, this defaults to "\r\n" + * (CR LF). Note that + * this parameter is always treated as an ASCII string regardless + * of the value of input-charset. + * \r\n\n
+ *

+ * @return string an encoded MIME field on success, + * or false if an error occurs during the encoding. + * + * @jms-builtin + */ +function iconv_mime_encode ($field_name, $field_value, array $preferences = null) {} + +/** + * Decodes a MIME header field + * @link http://www.php.net/manual/en/function.iconv-mime-decode.php + * @param encoded_header string

+ * The encoded header, as a string. + *

+ * @param mode int[optional]

+ * mode determines the behaviour in the event + * iconv_mime_decode encounters a malformed + * MIME header field. You can specify any combination + * of the following bitmasks. + * + * Bitmasks acceptable to iconv_mime_decode + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueConstantDescription
1ICONV_MIME_DECODE_STRICT + * If set, the given header is decoded in full conformance with the + * standards defined in RFC2047. + * This option is disabled by default because there are a lot of + * broken mail user agents that don't follow the specification and don't + * produce correct MIME headers. + *
2ICONV_MIME_DECODE_CONTINUE_ON_ERROR + * If set, iconv_mime_decode_headers + * attempts to ignore any grammatical errors and continue to process + * a given header. + *
+ *

+ * @param charset string[optional]

+ * The optional charset parameter specifies the + * character set to represent the result by. If omitted, + * iconv.internal_encoding + * will be used. + *

+ * @return string a decoded MIME field on success, + * or false if an error occurs during the decoding. + * + * @jms-builtin + */ +function iconv_mime_decode ($encoded_header, $mode = null, $charset = null) {} + +/** + * Decodes multiple MIME header fields at once + * @link http://www.php.net/manual/en/function.iconv-mime-decode-headers.php + * @param encoded_headers string

+ * The encoded headers, as a string. + *

+ * @param mode int[optional]

+ * mode determines the behaviour in the event + * iconv_mime_decode_headers encounters a malformed + * MIME header field. You can specify any combination + * of the following bitmasks. + * + * Bitmasks acceptable to iconv_mime_decode_headers + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueConstantDescription
1ICONV_MIME_DECODE_STRICT + * If set, the given header is decoded in full conformance with the + * standards defined in RFC2047. + * This option is disabled by default because there are a lot of + * broken mail user agents that don't follow the specification and don't + * produce correct MIME headers. + *
2ICONV_MIME_DECODE_CONTINUE_ON_ERROR + * If set, iconv_mime_decode_headers + * attempts to ignore any grammatical errors and continue to process + * a given header. + *
+ *

+ * @param charset string[optional]

+ * The optional charset parameter specifies the + * character set to represent the result by. If omitted, + * iconv.internal_encoding + * will be used. + *

+ * @return array an associative array that holds a whole set of + * MIME header fields specified by + * encoded_headers on success, or false + * if an error occurs during the decoding. + *

+ *

+ * Each key of the return value represents an individual + * field name and the corresponding element represents a field value. + * If more than one field of the same name are present, + * iconv_mime_decode_headers automatically incorporates + * them into a numerically indexed array in the order of occurrence. + * + * @jms-builtin + */ +function iconv_mime_decode_headers ($encoded_headers, $mode = null, $charset = null) {} + + +/** + * string + * @link http://www.php.net/manual/en/iconv.constants.php + */ +define ('ICONV_IMPL', "glibc"); + +/** + * string + * @link http://www.php.net/manual/en/iconv.constants.php + */ +define ('ICONV_VERSION', "2.11.1"); + +/** + * integer + * @link http://www.php.net/manual/en/iconv.constants.php + */ +define ('ICONV_MIME_DECODE_STRICT', 1); + +/** + * integer + * @link http://www.php.net/manual/en/iconv.constants.php + */ +define ('ICONV_MIME_DECODE_CONTINUE_ON_ERROR', 2); + +// End of iconv v. +?> diff --git a/res/php-5.2-core-api/imagick.php b/res/php-5.2-core-api/imagick.php new file mode 100644 index 0000000..f2a22d4 --- /dev/null +++ b/res/php-5.2-core-api/imagick.php @@ -0,0 +1,5344 @@ + + * One of the layer method constants. + *

+ * @return Imagick &imagick.return.success; + */ + public function compareimagelayers ($method) {} + + /** + * Quickly fetch attributes + * @link http://www.php.net/manual/en/function.imagick-pingimageblob.php + * @param image string

+ * A string containing the image. + *

+ * @return bool &imagick.return.success; + */ + public function pingimageblob ($image) {} + + /** + * Get basic image attributes in a lightweight manner + * @link http://www.php.net/manual/en/function.imagick-pingimagefile.php + * @param filehandle resource

+ * An open filehandle to the image. + *

+ * @param fileName string[optional]

+ * Optional filename for this image. + *

+ * @return bool &imagick.return.success; + */ + public function pingimagefile ($filehandle, $fileName = null) {} + + /** + * Creates a vertical mirror image + * @link http://www.php.net/manual/en/function.imagick-transposeimage.php + * @return bool &imagick.return.success; + */ + public function transposeimage () {} + + /** + * Creates a horizontal mirror image + * @link http://www.php.net/manual/en/function.imagick-transverseimage.php + * @return bool &imagick.return.success; + */ + public function transverseimage () {} + + /** + * Remove edges from the image + * @link http://www.php.net/manual/en/function.imagick-trimimage.php + * @param fuzz float

+ * By default target must match a particular pixel color exactly. + * However, in many cases two colors may differ by a small amount. + * The fuzz member of image defines how much tolerance is acceptable + * to consider two colors as the same. This parameter represents the variation + * on the quantum range. + *

+ * @return bool &imagick.return.success; + */ + public function trimimage ($fuzz) {} + + /** + * Applies wave filter to the image + * @link http://www.php.net/manual/en/function.imagick-waveimage.php + * @param amplitude float

+ * The amplitude of the wave. + *

+ * @param length float

+ * The length of the wave. + *

+ * @return bool &imagick.return.success; + */ + public function waveimage ($amplitude, $length) {} + + /** + * Adds vignette filter to the image + * @link http://www.php.net/manual/en/function.imagick-vignetteimage.php + * @param blackPoint float

+ * The black point. + *

+ * @param whitePoint float

+ * The white point + *

+ * @param x int

+ * X offset of the ellipse + *

+ * @param y int

+ * Y offset of the ellipse + *

+ * @return bool &imagick.return.success; + */ + public function vignetteimage ($blackPoint, $whitePoint, $x, $y) {} + + /** + * Discards all but one of any pixel color + * @link http://www.php.net/manual/en/function.imagick-uniqueimagecolors.php + * @return bool &imagick.return.success; + */ + public function uniqueimagecolors () {} + + /** + * Return if the image has a matte channel + * @link http://www.php.net/manual/en/function.imagick-getimagematte.php + * @return int Returns true on success or false on failure. + */ + public function getimagematte () {} + + /** + * Sets the image matte channel + * @link http://www.php.net/manual/en/function.imagick-setimagematte.php + * @param matte bool

+ * True activates the matte channel and false disables it. + *

+ * @return bool &imagick.return.success; + */ + public function setimagematte ($matte) {} + + /** + * Adaptively resize image with data dependent triangulation + * @link http://www.php.net/manual/en/function.imagick-adaptiveresizeimage.php + * @param columns int

+ * The number of columns in the scaled image. + *

+ * @param rows int

+ * The number of rows in the scaled image. + *

+ * @param bestfit bool[optional]

+ * Whether to fit the image inside a bounding box. + *

+ * @return bool &imagick.return.success; + */ + public function adaptiveresizeimage ($columns, $rows, $bestfit = null) {} + + /** + * Simulates a pencil sketch + * @link http://www.php.net/manual/en/function.imagick-sketchimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param angle float

+ * Apply the effect along this angle. + *

+ * @return bool &imagick.return.success; + */ + public function sketchimage ($radius, $sigma, $angle) {} + + /** + * Creates a 3D effect + * @link http://www.php.net/manual/en/function.imagick-shadeimage.php + * @param gray bool

+ * A value other than zero shades the intensity of each pixel. + *

+ * @param azimuth float

+ * Defines the light source direction. + *

+ * @param elevation float

+ * Defines the light source direction. + *

+ * @return bool &imagick.return.success; + */ + public function shadeimage ($gray, $azimuth, $elevation) {} + + /** + * Returns the size offset + * @link http://www.php.net/manual/en/function.imagick-getsizeoffset.php + * @return int the size offset associated with the Imagick object. + * &imagick.imagickexception.throw; + */ + public function getsizeoffset () {} + + /** + * Sets the size and offset of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-setsizeoffset.php + * @param columns int

+ * The width in pixels. + *

+ * @param rows int

+ * The height in pixels. + *

+ * @param offset int

+ * The image offset. + *

+ * @return bool &imagick.return.success; + */ + public function setsizeoffset ($columns, $rows, $offset) {} + + /** + * Adds adaptive blur filter to image + * @link http://www.php.net/manual/en/function.imagick-adaptiveblurimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel. + * Provide a value of 0 and the radius will be chosen automagically. + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param channel int[optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function adaptiveblurimage ($radius, $sigma, $channel = null) {} + + /** + * Enhances the contrast of a color image + * @link http://www.php.net/manual/en/function.imagick-contraststretchimage.php + * @param black_point float

+ * The black point. + *

+ * @param white_point float

+ * The white point. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Imagick::CHANNEL_ALL. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function contraststretchimage ($black_point, $white_point, $channel = null) {} + + /** + * Adaptively sharpen the image + * @link http://www.php.net/manual/en/function.imagick-adaptivesharpenimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel. Use 0 for auto-select. + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param channel int[optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function adaptivesharpenimage ($radius, $sigma, $channel = null) {} + + /** + * Creates a high-contrast, two-color image + * @link http://www.php.net/manual/en/function.imagick-randomthresholdimage.php + * @param low float

+ * The low point + *

+ * @param high float

+ * The high point + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function randomthresholdimage ($low, $high, $channel = null) {} + + /** + * Rounds image corners + * @link http://www.php.net/manual/en/function.imagick-roundcorners.php + * @param x_rounding float

+ * x rounding + *

+ * @param y_rounding float

+ * y rounding + *

+ * @param stroke_width float[optional]

+ * stroke width + *

+ * @param displace float[optional]

+ * image displace + *

+ * @param size_correction float[optional]

+ * size correction + *

+ * @return bool &imagick.return.success; + */ + public function roundcorners ($x_rounding, $y_rounding, $stroke_width = null, $displace = null, $size_correction = null) {} + + /** + * Set the iterator position + * @link http://www.php.net/manual/en/function.imagick-setiteratorindex.php + * @param index int

+ * The position to set the iterator to + *

+ * @return bool &imagick.return.success; + */ + public function setiteratorindex ($index) {} + + /** + * Gets the index of the current active image + * @link http://www.php.net/manual/en/function.imagick-getiteratorindex.php + * @return int an integer containing the index of the image in the stack. + * &imagick.imagickexception.throw; + */ + public function getiteratorindex () {} + + /** + * Convenience method for setting crop size and the image geometry + * @link http://www.php.net/manual/en/function.imagick-transformimage.php + * @param crop string

+ * A crop geometry string. This geometry defines a subregion of the image to crop. + *

+ * @param geometry string

+ * An image geometry string. This geometry defines the final size of the image. + *

+ * @return Imagick &imagick.return.success; + */ + public function transformimage ($crop, $geometry) {} + + /** + * Sets the image opacity level + * @link http://www.php.net/manual/en/function.imagick-setimageopacity.php + * @param opacity float

+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully + * transparent. + *

+ * @return bool &imagick.return.success; + */ + public function setimageopacity ($opacity) {} + + /** + * Performs an ordered dither + * @link http://www.php.net/manual/en/function.imagick-orderedposterizeimage.php + * @param threshold_map string

+ * A string containing the name of the threshold dither map to use + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function orderedposterizeimage ($threshold_map, $channel = null) {} + + /** + * Simulates a Polaroid picture + * @link http://www.php.net/manual/en/function.imagick-polaroidimage.php + * @param properties ImagickDraw

+ * The polaroid properties + *

+ * @param angle float

+ * The polaroid angle + *

+ * @return bool &imagick.return.success; + */ + public function polaroidimage (ImagickDraw $properties, $angle) {} + + /** + * Returns the named image property + * @link http://www.php.net/manual/en/function.imagick-getimageproperty.php + * @param name string

+ * name of the property (for example Exif:DateTime) + *

+ * @return string a string containing the image property, false if a + * property with the given name does not exist. + */ + public function getimageproperty ($name) {} + + /** + * Sets an image property + * @link http://www.php.net/manual/en/function.imagick-setimageproperty.php + * @param name string

+ *

+ * @param value string

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageproperty ($name, $value) {} + + /** + * Sets the image interpolate pixel method + * @link http://www.php.net/manual/en/function.imagick-setimageinterpolatemethod.php + * @param method int

+ * The method is one of the Imagick::INTERPOLATE_* constants + *

+ * @return bool &imagick.return.success; + */ + public function setimageinterpolatemethod ($method) {} + + /** + * Returns the interpolation method + * @link http://www.php.net/manual/en/function.imagick-getimageinterpolatemethod.php + * @return int the interpolate method on success. + * &imagick.imagickexception.throw; + */ + public function getimageinterpolatemethod () {} + + /** + * Stretches with saturation the image intensity + * @link http://www.php.net/manual/en/function.imagick-linearstretchimage.php + * @param blackPoint float

+ * The image black point + *

+ * @param whitePoint float

+ * The image white point + *

+ * @return bool &imagick.return.success; + */ + public function linearstretchimage ($blackPoint, $whitePoint) {} + + /** + * Returns the image length in bytes + * @link http://www.php.net/manual/en/function.imagick-getimagelength.php + * @return int an int containing the current image size. + */ + public function getimagelength () {} + + /** + * Set image size + * @link http://www.php.net/manual/en/function.imagick-extentimage.php + * @param width int

+ * The new width + *

+ * @param height int

+ * The new height + *

+ * @param x int

+ * X position for the new size + *

+ * @param y int

+ * Y position for the new size + *

+ * @return bool &imagick.return.success; + */ + public function extentimage ($width, $height, $x, $y) {} + + /** + * Gets the image orientation + * @link http://www.php.net/manual/en/function.imagick-getimageorientation.php + * @return int an int on success. + * &imagick.imagickexception.throw; + */ + public function getimageorientation () {} + + /** + * Sets the image orientation + * @link http://www.php.net/manual/en/function.imagick-setimageorientation.php + * @param orientation int

+ * One of the orientation constants + *

+ * @return bool &imagick.return.success; + */ + public function setimageorientation ($orientation) {} + + /** + * Changes the color value of any pixel that matches target + * @link http://www.php.net/manual/en/function.imagick-paintfloodfillimage.php + * @param fill mixed

+ * ImagickPixel object or a string containing the fill color + *

+ * @param fuzz float

+ * The amount of fuzz. For example, set fuzz to 10 and the color red at + * intensities of 100 and 102 respectively are now interpreted as the + * same color for the purposes of the floodfill. + *

+ * @param bordercolor mixed

+ * ImagickPixel object or a string containing the border color + *

+ * @param x int

+ * X start position of the floodfill + *

+ * @param y int

+ * Y start position of the floodfill + *

+ * @param channel int[optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function paintfloodfillimage ($fill, $fuzz, $bordercolor, $x, $y, $channel = null) {} + + /** + * Replaces colors in the image + * @link http://www.php.net/manual/en/function.imagick-clutimage.php + * @param lookup_table Imagick

+ * Imagick object containing the color lookup table + *

+ * @param channel float[optional]

+ * The Channeltype + * constant. When not supplied, default channels are replaced. + *

+ * @return bool &imagick.return.success; + */ + public function clutimage (Imagick $lookup_table, $channel = null) {} + + /** + * Returns the image properties + * @link http://www.php.net/manual/en/function.imagick-getimageproperties.php + * @param pattern string[optional]

+ * The pattern for property names. + *

+ * @param only_names bool[optional]

+ * Whether to return only property names. If false then also the values are returned + *

+ * @return array an array containing the image properties or property names. + */ + public function getimageproperties ($pattern = null, $only_names = null) {} + + /** + * Returns the image profiles + * @link http://www.php.net/manual/en/function.imagick-getimageprofiles.php + * @param pattern string[optional]

+ * The pattern for profile names. + *

+ * @param only_names bool[optional]

+ * Whether to return only profile names. If false then values are returned as well + *

+ * @return array an array containing the image profiles or profile names. + */ + public function getimageprofiles ($pattern = null, $only_names = null) {} + + /** + * Distorts an image using various distortion methods + * @link http://www.php.net/manual/en/function.imagick-distortimage.php + * @param method int

+ * The method of image distortion. See distortion constants + *

+ * @param arguments array

+ * The arguments for this distortion method + *

+ * @param bestfit bool

+ * Attempt to resize destination to fit distorted source + *

+ * @return bool &imagick.return.success; + */ + public function distortimage ($method, array $arguments, $bestfit) {} + + /** + * Writes an image to a filehandle + * @link http://www.php.net/manual/en/function.imagick-writeimagefile.php + * @param filehandle resource

+ * Filehandle where to write the image + *

+ * @return bool &imagick.return.success; + */ + public function writeimagefile ($filehandle) {} + + /** + * Writes frames to a filehandle + * @link http://www.php.net/manual/en/function.imagick-writeimagesfile.php + * @param filehandle resource

+ * Filehandle where to write the images + *

+ * @return bool &imagick.return.success; + */ + public function writeimagesfile ($filehandle) {} + + /** + * Reset image page + * @link http://www.php.net/manual/en/function.imagick-resetimagepage.php + * @param page string

+ * The page definition. For example 7168x5147+0+0 + *

+ * @return bool &imagick.return.success; + */ + public function resetimagepage ($page) {} + + /** + * Sets image clip mask + * @link http://www.php.net/manual/en/function.imagick-setimageclipmask.php + * @param clip_mask Imagick

+ * The Imagick object containing the clip mask + *

+ * @return bool &imagick.return.success; + */ + public function setimageclipmask (Imagick $clip_mask) {} + + /** + * Gets image clip mask + * @link http://www.php.net/manual/en/function.imagick-getimageclipmask.php + * @return Imagick an Imagick object containing the clip mask. + * &imagick.imagickexception.throw; + */ + public function getimageclipmask () {} + + /** + * Animates an image or images + * @link http://www.php.net/manual/en/function.imagick-animateimages.php + * @param x_server string

+ * X server address + *

+ * @return bool &imagick.return.success; + */ + public function animateimages ($x_server) {} + + /** + * Recolors image + * @link http://www.php.net/manual/en/function.imagick-recolorimage.php + * @param matrix array

+ * The matrix containing the color values + *

+ * @return bool &imagick.return.success; + */ + public function recolorimage (array $matrix) {} + + /** + * Sets font + * @link http://www.php.net/manual/en/function.imagick-setfont.php + * @param font string

+ * Font name or a filename + *

+ * @return bool &imagick.return.success; + */ + public function setfont ($font) {} + + /** + * Gets font + * @link http://www.php.net/manual/en/function.imagick-getfont.php + * @return string the string containing the font name or false if not font is set. + */ + public function getfont () {} + + /** + * Sets point size + * @link http://www.php.net/manual/en/function.imagick-setpointsize.php + * @param point_size float

+ * Point size + *

+ * @return bool &imagick.return.success; + */ + public function setpointsize ($point_size) {} + + /** + * Gets point size + * @link http://www.php.net/manual/en/function.imagick-getpointsize.php + * @return string a &float; containing the point size. + */ + public function getpointsize () {} + + /** + * Merges image layers + * @link http://www.php.net/manual/en/function.imagick-mergeimagelayers.php + * @param layer_method int

+ * One of the Imagick::LAYERMETHOD_* constants + *

+ * @return bool &imagick.return.success; + */ + public function mergeimagelayers ($layer_method) {} + + /** + * The Imagick constructor + * @link http://www.php.net/manual/en/function.imagick-construct.php + * @param files mixed[optional]

+ * The path to an image to load or array of paths + *

+ * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function __construct ($files = null) {} + + public function __tostring () {} + + /** + * Returns a MagickPixelIterator + * @link http://www.php.net/manual/en/function.imagick-getpixeliterator.php + * @return ImagickPixelIterator an ImagickPixelIterator on success. + * &imagick.imagickexception.throw; + */ + public function getpixeliterator () {} + + /** + * Get an ImagickPixelIterator for an image section + * @link http://www.php.net/manual/en/function.imagick-getpixelregioniterator.php + * @param x int

+ * The x-coordinate of the region. + *

+ * @param y int

+ * The y-coordinate of the region. + *

+ * @param columns int

+ * The width of the region. + *

+ * @param rows int

+ * The height of the region. + *

+ * @return ImagickPixelIterator an ImagickPixelIterator for an image section. + * &imagick.imagickexception.throw; + */ + public function getpixelregioniterator ($x, $y, $columns, $rows) {} + + /** + * Reads image from filename + * @link http://www.php.net/manual/en/function.imagick-readimage.php + * @param filename string

+ *

+ * @return bool &imagick.return.success; + */ + public function readimage ($filename) {} + + /** + * @param filenames + */ + public function readimages ($filenames) {} + + /** + * Reads image from a binary string + * @link http://www.php.net/manual/en/function.imagick-readimageblob.php + * @param image string

+ *

+ * @param filename string[optional] + * @return bool &imagick.return.success; + */ + public function readimageblob ($image, $filename = null) {} + + /** + * Sets the format of a particular image + * @link http://www.php.net/manual/en/function.imagick-setimageformat.php + * @param format string

+ * String presentation of the image format. Format support + * depends on the ImageMagick installation. + *

+ * @return bool &imagick.return.success; + */ + public function setimageformat ($format) {} + + /** + * Scales the size of an image + * @link http://www.php.net/manual/en/function.imagick-scaleimage.php + * @param cols int

+ *

+ * @param rows int

+ *

+ * @param bestfit bool[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function scaleimage ($cols, $rows, $bestfit = null) {} + + /** + * Writes an image to the specified filename + * @link http://www.php.net/manual/en/function.imagick-writeimage.php + * @param filename string[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function writeimage ($filename = null) {} + + /** + * Writes an image or image sequence + * @link http://www.php.net/manual/en/function.imagick-writeimages.php + * @param filename string

+ *

+ * @param adjoin bool

+ *

+ * @return bool &imagick.return.success; + */ + public function writeimages ($filename, $adjoin) {} + + /** + * Adds blur filter to image + * @link http://www.php.net/manual/en/function.imagick-blurimage.php + * @param radius float

+ * Blur radius + *

+ * @param sigma float

+ * Standard deviation + *

+ * @param channel int[optional]

+ * The Channeltype + * constant. When not supplied, all channels are blurred. + *

+ * @return bool &imagick.return.success; + */ + public function blurimage ($radius, $sigma, $channel = null) {} + + /** + * Changes the size of an image + * @link http://www.php.net/manual/en/function.imagick-thumbnailimage.php + * @param columns int

+ * Image width + *

+ * @param rows int

+ * Image height + *

+ * @param bestfit bool[optional]

+ * Whether to force maximum values + *

+ * @return bool &imagick.return.success; + */ + public function thumbnailimage ($columns, $rows, $bestfit = null) {} + + /** + * Creates a crop thumbnail + * @link http://www.php.net/manual/en/function.imagick-cropthumbnailimage.php + * @param width int

+ * The width of the thumbnail + *

+ * @param height int

+ * The Height of the thumbnail + *

+ * @return bool &imagick.return.success; + */ + public function cropthumbnailimage ($width, $height) {} + + /** + * Returns the filename of a particular image in a sequence + * @link http://www.php.net/manual/en/function.imagick-getimagefilename.php + * @return string a string with the filename of the image. + * &imagick.imagickexception.throw; + */ + public function getimagefilename () {} + + /** + * Sets the filename of a particular image + * @link http://www.php.net/manual/en/function.imagick-setimagefilename.php + * @param filename string

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagefilename ($filename) {} + + /** + * Returns the format of a particular image in a sequence + * @link http://www.php.net/manual/en/function.imagick-getimageformat.php + * @return string a string containing the image format on success. + * &imagick.imagickexception.throw; + */ + public function getimageformat () {} + + public function getimagemimetype () {} + + /** + * Removes an image from the image list + * @link http://www.php.net/manual/en/function.imagick-removeimage.php + * @return bool &imagick.return.success; + */ + public function removeimage () {} + + /** + * Destroys the Imagick object + * @link http://www.php.net/manual/en/function.imagick-destroy.php + * @return bool &imagick.return.success; + */ + public function destroy () {} + + /** + * Clears all resources associated to Imagick object + * @link http://www.php.net/manual/en/function.imagick-clear.php + * @return bool &imagick.return.success; + */ + public function clear () {} + + /** + * Makes an exact copy of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-clone.php + * @return Imagick + */ + public function clone () {} + + /** + * Returns the image length in bytes + * @link http://www.php.net/manual/en/function.imagick-getimagesize.php + * @return int an int containing the current image size. + */ + public function getimagesize () {} + + /** + * Returns the image sequence as a blob + * @link http://www.php.net/manual/en/function.imagick-getimageblob.php + * @return string a string containing the image. + * &imagick.imagickexception.throw; + */ + public function getimageblob () {} + + /** + * Returns all image sequences as a blob + * @link http://www.php.net/manual/en/function.imagick-getimagesblob.php + * @return string a string containing the images. On failure, throws + * ImagickException. + */ + public function getimagesblob () {} + + /** + * Sets the Imagick iterator to the first image + * @link http://www.php.net/manual/en/function.imagick-setfirstiterator.php + * @return bool &imagick.return.success; + */ + public function setfirstiterator () {} + + /** + * Sets the Imagick iterator to the last image + * @link http://www.php.net/manual/en/function.imagick-setlastiterator.php + * @return bool &imagick.return.success; + */ + public function setlastiterator () {} + + public function resetiterator () {} + + /** + * Move to the previous image in the object + * @link http://www.php.net/manual/en/function.imagick-previousimage.php + * @return bool &imagick.return.success; + */ + public function previousimage () {} + + /** + * Moves to the next image + * @link http://www.php.net/manual/en/function.imagick-nextimage.php + * @return bool &imagick.return.success; + */ + public function nextimage () {} + + /** + * Checks if the object has a previous image + * @link http://www.php.net/manual/en/function.imagick-haspreviousimage.php + * @return bool true if the object has more images when traversing the list in the + * reverse direction, returns false if there are none. + */ + public function haspreviousimage () {} + + /** + * Checks if the object has more images + * @link http://www.php.net/manual/en/function.imagick-hasnextimage.php + * @return bool true if the object has more images when traversing the list in the + * forward direction, returns false if there are none. + */ + public function hasnextimage () {} + + /** + * Set the iterator position + * @link http://www.php.net/manual/en/function.imagick-setimageindex.php + * @param index int

+ * The position to set the iterator to + *

+ * @return bool &imagick.return.success; + */ + public function setimageindex ($index) {} + + /** + * Gets the index of the current active image + * @link http://www.php.net/manual/en/function.imagick-getimageindex.php + * @return int an integer containing the index of the image in the stack. + * &imagick.imagickexception.throw; + */ + public function getimageindex () {} + + /** + * Adds a comment to your image + * @link http://www.php.net/manual/en/function.imagick-commentimage.php + * @param comment string

+ * The comment to add + *

+ * @return bool &imagick.return.success; + */ + public function commentimage ($comment) {} + + /** + * Extracts a region of the image + * @link http://www.php.net/manual/en/function.imagick-cropimage.php + * @param width int

+ * The width of the crop + *

+ * @param height int

+ * The height of the crop + *

+ * @param x int

+ * The X coordinate of the cropped region's top left corner + *

+ * @param y int

+ * The Y coordinate of the cropped region's top left corner + *

+ * @return bool &imagick.return.success; + */ + public function cropimage ($width, $height, $x, $y) {} + + /** + * Adds a label to an image + * @link http://www.php.net/manual/en/function.imagick-labelimage.php + * @param label string

+ * The label to add + *

+ * @return bool &imagick.return.success; + */ + public function labelimage ($label) {} + + /** + * Gets the width and height as an associative array + * @link http://www.php.net/manual/en/function.imagick-getimagegeometry.php + * @return array an array with the width/height of the image. + * &imagick.imagickexception.throw; + */ + public function getimagegeometry () {} + + /** + * Renders the ImagickDraw object on the current image + * @link http://www.php.net/manual/en/function.imagick-drawimage.php + * @param draw ImagickDraw

+ * The drawing operations to render on the image. + *

+ * @return bool &imagick.return.success; + */ + public function drawimage (ImagickDraw $draw) {} + + /** + * Sets the image compression quality + * @link http://www.php.net/manual/en/function.imagick-setimagecompressionquality.php + * @param quality int

+ * The image compression quality as an integer + *

+ * @return bool &imagick.return.success; + */ + public function setimagecompressionquality ($quality) {} + + /** + * Gets the current image's compression quality + * @link http://www.php.net/manual/en/function.imagick-getimagecompressionquality.php + * @return int integer describing the images compression quality + */ + public function getimagecompressionquality () {} + + /** + * Annotates an image with text + * @link http://www.php.net/manual/en/function.imagick-annotateimage.php + * @param draw_settings ImagickDraw

+ * The ImagickDraw object that contains settings for drawing the text + *

+ * @param x float

+ * Horizontal offset in pixels to the left of text + *

+ * @param y float

+ * Vertical offset in pixels to the baseline of text + *

+ * @param angle float

+ * The angle at which to write the text + *

+ * @param text string

+ * The string to draw + *

+ * @return bool &imagick.return.success; + */ + public function annotateimage (ImagickDraw $draw_settings, $x, $y, $angle, $text) {} + + /** + * Composite one image onto another + * @link http://www.php.net/manual/en/function.imagick-compositeimage.php + * @param composite_object Imagick

+ * Imagick object which holds the composite image + *

+ * @param composite int + * @param x int

+ * The column offset of the composited image + *

+ * @param y int

+ * The row offset of the composited image + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function compositeimage (Imagick $composite_object, $composite, $x, $y, $channel = null) {} + + /** + * Control the brightness, saturation, and hue + * @link http://www.php.net/manual/en/function.imagick-modulateimage.php + * @param brightness float

+ *

+ * @param saturation float

+ *

+ * @param hue float

+ *

+ * @return bool &imagick.return.success; + */ + public function modulateimage ($brightness, $saturation, $hue) {} + + /** + * Gets the number of unique colors in the image + * @link http://www.php.net/manual/en/function.imagick-getimagecolors.php + * @return int &imagick.return.success; + */ + public function getimagecolors () {} + + /** + * Creates a composite image + * @link http://www.php.net/manual/en/function.imagick-montageimage.php + * @param draw ImagickDraw

+ * The font name, size, and color are obtained from this object. + *

+ * @param tile_geometry string

+ * The number of tiles per row and page (e.g. 6x4+0+0). + *

+ * @param thumbnail_geometry string

+ * Preferred image size and border size of each thumbnail + * (e.g. 120x120+4+3>). + *

+ * @param mode int

+ * Thumbnail framing mode, see Montage Mode constants. + *

+ * @param frame string

+ * Surround the image with an ornamental border (e.g. 15x15+3+3). The + * frame color is that of the thumbnail's matte color. + *

+ * @return Imagick &imagick.return.success; + */ + public function montageimage (ImagickDraw $draw, $tile_geometry, $thumbnail_geometry, $mode, $frame) {} + + /** + * Identifies an image and fetches attributes + * @link http://www.php.net/manual/en/function.imagick-identifyimage.php + * @param appendRawOutput bool[optional]

+ *

+ * @return array Identifies an image and returns the attributes. Attributes include + * the image width, height, size, and others. + * &imagick.imagickexception.throw; + */ + public function identifyimage ($appendRawOutput = null) {} + + /** + * Changes the value of individual pixels based on a threshold + * @link http://www.php.net/manual/en/function.imagick-thresholdimage.php + * @param threshold float

+ *

+ * @param channel int[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function thresholdimage ($threshold, $channel = null) {} + + /** + * Selects a threshold for each pixel based on a range of intensity + * @link http://www.php.net/manual/en/function.imagick-adaptivethresholdimage.php + * @param width int

+ * Width of the local neighborhood. + *

+ * @param height int

+ * Height of the local neighborhood. + *

+ * @param offset int

+ * The mean offset + *

+ * @return bool &imagick.return.success; + */ + public function adaptivethresholdimage ($width, $height, $offset) {} + + /** + * Forces all pixels below the threshold into black + * @link http://www.php.net/manual/en/function.imagick-blackthresholdimage.php + * @param threshold mixed

+ * The threshold below which everything turns black + *

+ * @return bool &imagick.return.success; + */ + public function blackthresholdimage ($threshold) {} + + /** + * Force all pixels above the threshold into white + * @link http://www.php.net/manual/en/function.imagick-whitethresholdimage.php + * @param threshold mixed

+ *

+ * @return bool &imagick.return.success; + */ + public function whitethresholdimage ($threshold) {} + + /** + * Append a set of images + * @link http://www.php.net/manual/en/function.imagick-appendimages.php + * @param stack bool

+ * The direction of the stack (top to bottom or bottom to top) + *

+ * @return Imagick Imagick instance on success. + * &imagick.imagickexception.throw; + */ + public function appendimages ($stack) {} + + /** + * Simulates a charcoal drawing + * @link http://www.php.net/manual/en/function.imagick-charcoalimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels + *

+ * @return bool &imagick.return.success; + */ + public function charcoalimage ($radius, $sigma) {} + + /** + * Enhances the contrast of a color image + * @link http://www.php.net/manual/en/function.imagick-normalizeimage.php + * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function normalizeimage ($channel = null) {} + + /** + * Simulates an oil painting + * @link http://www.php.net/manual/en/function.imagick-oilpaintimage.php + * @param radius float

+ * The radius of the circular neighborhood. + *

+ * @return bool &imagick.return.success; + */ + public function oilpaintimage ($radius) {} + + /** + * Reduces the image to a limited number of color level + * @link http://www.php.net/manual/en/function.imagick-posterizeimage.php + * @param levels int

+ *

+ * @param dither bool

+ *

+ * @return bool &imagick.return.success; + */ + public function posterizeimage ($levels, $dither) {} + + /** + * Radial blurs an image + * @link http://www.php.net/manual/en/function.imagick-radialblurimage.php + * @param angle float

+ *

+ * @param channel int[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function radialblurimage ($angle, $channel = null) {} + + /** + * Creates a simulated 3d button-like effect + * @link http://www.php.net/manual/en/function.imagick-raiseimage.php + * @param width int

+ *

+ * @param height int

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @param raise bool

+ *

+ * @return bool &imagick.return.success; + */ + public function raiseimage ($width, $height, $x, $y, $raise) {} + + /** + * Resample image to desired resolution + * @link http://www.php.net/manual/en/function.imagick-resampleimage.php + * @param x_resolution float

+ *

+ * @param y_resolution float

+ *

+ * @param filter int

+ *

+ * @param blur float

+ *

+ * @return bool &imagick.return.success; + */ + public function resampleimage ($x_resolution, $y_resolution, $filter, $blur) {} + + /** + * Scales an image + * @link http://www.php.net/manual/en/function.imagick-resizeimage.php + * @param columns int

+ * Width of the image + *

+ * @param rows int

+ * Height of the image + *

+ * @param filter int

+ * Refer to the list of filter constants. + *

+ * @param blur float

+ * The blur factor where > 1 is blurry, < 1 is sharp. + *

+ * @param bestfit bool[optional]

+ * Optional fit parameter. + *

+ * @return bool &imagick.return.success; + */ + public function resizeimage ($columns, $rows, $filter, $blur, $bestfit = null) {} + + /** + * Offsets an image + * @link http://www.php.net/manual/en/function.imagick-rollimage.php + * @param x int

+ * The X offset. + *

+ * @param y int

+ * The Y offset. + *

+ * @return bool &imagick.return.success; + */ + public function rollimage ($x, $y) {} + + /** + * Rotates an image + * @link http://www.php.net/manual/en/function.imagick-rotateimage.php + * @param background mixed

+ * The background color + *

+ * @param degrees float

+ * The number of degrees to rotate the image + *

+ * @return bool &imagick.return.success; + */ + public function rotateimage ($background, $degrees) {} + + /** + * Scales an image with pixel sampling + * @link http://www.php.net/manual/en/function.imagick-sampleimage.php + * @param columns int

+ *

+ * @param rows int

+ *

+ * @return bool &imagick.return.success; + */ + public function sampleimage ($columns, $rows) {} + + /** + * Applies a solarizing effect to the image + * @link http://www.php.net/manual/en/function.imagick-solarizeimage.php + * @param threshold int

+ *

+ * @return bool &imagick.return.success; + */ + public function solarizeimage ($threshold) {} + + /** + * Simulates an image shadow + * @link http://www.php.net/manual/en/function.imagick-shadowimage.php + * @param opacity float

+ *

+ * @param sigma float

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @return bool &imagick.return.success; + */ + public function shadowimage ($opacity, $sigma, $x, $y) {} + + /** + * @param key + * @param value + */ + public function setimageattribute ($key, $value) {} + + /** + * Sets the image background color + * @link http://www.php.net/manual/en/function.imagick-setimagebackgroundcolor.php + * @param background mixed

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagebackgroundcolor ($background) {} + + /** + * Sets the image composite operator + * @link http://www.php.net/manual/en/function.imagick-setimagecompose.php + * @param compose int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagecompose ($compose) {} + + /** + * Sets the image compression + * @link http://www.php.net/manual/en/function.imagick-setimagecompression.php + * @param compression int

+ * One of the COMPRESSION constants + *

+ * @return bool &imagick.return.success; + */ + public function setimagecompression ($compression) {} + + /** + * Sets the image delay + * @link http://www.php.net/manual/en/function.imagick-setimagedelay.php + * @param delay int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagedelay ($delay) {} + + /** + * Sets the image depth + * @link http://www.php.net/manual/en/function.imagick-setimagedepth.php + * @param depth int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagedepth ($depth) {} + + /** + * Sets the image gamma + * @link http://www.php.net/manual/en/function.imagick-setimagegamma.php + * @param gamma float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagegamma ($gamma) {} + + /** + * Sets the image iterations + * @link http://www.php.net/manual/en/function.imagick-setimageiterations.php + * @param iterations int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageiterations ($iterations) {} + + /** + * Sets the image matte color + * @link http://www.php.net/manual/en/function.imagick-setimagemattecolor.php + * @param matte mixed

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagemattecolor ($matte) {} + + /** + * Sets the page geometry of the image + * @link http://www.php.net/manual/en/function.imagick-setimagepage.php + * @param width int

+ *

+ * @param height int

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagepage ($width, $height, $x, $y) {} + + /** + * @param filename + */ + public function setimageprogressmonitor ($filename) {} + + /** + * Sets the image resolution + * @link http://www.php.net/manual/en/function.imagick-setimageresolution.php + * @param x_resolution float

+ *

+ * @param y_resolution float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageresolution ($x_resolution, $y_resolution) {} + + /** + * Sets the image scene + * @link http://www.php.net/manual/en/function.imagick-setimagescene.php + * @param scene int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagescene ($scene) {} + + /** + * Sets the image ticks-per-second + * @link http://www.php.net/manual/en/function.imagick-setimagetickspersecond.php + * @param ticks_per_second int + * @return bool &imagick.return.success; + */ + public function setimagetickspersecond ($ticks_per_second) {} + + /** + * Sets the image type + * @link http://www.php.net/manual/en/function.imagick-setimagetype.php + * @param image_type int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagetype ($image_type) {} + + /** + * Sets the image units of resolution + * @link http://www.php.net/manual/en/function.imagick-setimageunits.php + * @param units int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageunits ($units) {} + + /** + * Sharpens an image + * @link http://www.php.net/manual/en/function.imagick-sharpenimage.php + * @param radius float

+ *

+ * @param sigma float

+ *

+ * @param channel int[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function sharpenimage ($radius, $sigma, $channel = null) {} + + /** + * Shaves pixels from the image edges + * @link http://www.php.net/manual/en/function.imagick-shaveimage.php + * @param columns int

+ *

+ * @param rows int

+ *

+ * @return bool &imagick.return.success; + */ + public function shaveimage ($columns, $rows) {} + + /** + * Creating a parallelogram + * @link http://www.php.net/manual/en/function.imagick-shearimage.php + * @param background mixed

+ * The background color + *

+ * @param x_shear float

+ * The number of degrees to shear on the x axis + *

+ * @param y_shear float

+ * The number of degrees to shear on the y axis + *

+ * @return bool &imagick.return.success; + */ + public function shearimage ($background, $x_shear, $y_shear) {} + + /** + * Splices a solid color into the image + * @link http://www.php.net/manual/en/function.imagick-spliceimage.php + * @param width int

+ *

+ * @param height int

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @return bool &imagick.return.success; + */ + public function spliceimage ($width, $height, $x, $y) {} + + /** + * Fetch basic attributes about the image + * @link http://www.php.net/manual/en/function.imagick-pingimage.php + * @param filename string

+ * The filename to read the information from. + *

+ * @return bool &imagick.return.success; + */ + public function pingimage ($filename) {} + + /** + * Reads image from open filehandle + * @link http://www.php.net/manual/en/function.imagick-readimagefile.php + * @param filehandle resource

+ *

+ * @param fileName string[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function readimagefile ($filehandle, $fileName = null) {} + + /** + * Displays an image + * @link http://www.php.net/manual/en/function.imagick-displayimage.php + * @param servername string

+ * The X server name + *

+ * @return bool &imagick.return.success; + */ + public function displayimage ($servername) {} + + /** + * Displays an image or image sequence + * @link http://www.php.net/manual/en/function.imagick-displayimages.php + * @param servername string

+ * The X server name + *

+ * @return bool &imagick.return.success; + */ + public function displayimages ($servername) {} + + /** + * Randomly displaces each pixel in a block + * @link http://www.php.net/manual/en/function.imagick-spreadimage.php + * @param radius float

+ *

+ * @return bool &imagick.return.success; + */ + public function spreadimage ($radius) {} + + /** + * Swirls the pixels about the center of the image + * @link http://www.php.net/manual/en/function.imagick-swirlimage.php + * @param degrees float

+ *

+ * @return bool &imagick.return.success; + */ + public function swirlimage ($degrees) {} + + /** + * Strips an image of all profiles and comments + * @link http://www.php.net/manual/en/function.imagick-stripimage.php + * @return bool &imagick.return.success; + */ + public function stripimage () {} + + /** + * Returns formats supported by Imagick + * @link http://www.php.net/manual/en/function.imagick-queryformats.php + * @param pattern string[optional]

+ *

+ * @return array an array containing the formats supported by Imagick. + * &imagick.imagickexception.throw; + */ + public function queryformats ($pattern = null) {} + + /** + * Returns the configured fonts + * @link http://www.php.net/manual/en/function.imagick-queryfonts.php + * @param pattern string[optional]

+ * The query pattern + *

+ * @return array an array containing the configured fonts. + * &imagick.imagickexception.throw; + */ + public function queryfonts ($pattern = null) {} + + /** + * Returns an array representing the font metrics + * @link http://www.php.net/manual/en/function.imagick-queryfontmetrics.php + * @param properties ImagickDraw

+ * ImagickDraw object containing font properties + *

+ * @param text string

+ * The text + *

+ * @param multiline bool[optional]

+ * Multiline parameter. If left empty it is autodetected + *

+ * @return array a multi-dimensional array representing the font metrics. + * &imagick.imagickexception.throw; + */ + public function queryfontmetrics (ImagickDraw $properties, $text, $multiline = null) {} + + /** + * Hides a digital watermark within the image + * @link http://www.php.net/manual/en/function.imagick-steganoimage.php + * @param watermark_wand Imagick

+ *

+ * @param offset int

+ *

+ * @return Imagick &imagick.return.success; + */ + public function steganoimage (Imagick $watermark_wand, $offset) {} + + /** + * Adds random noise to the image + * @link http://www.php.net/manual/en/function.imagick-addnoiseimage.php + * @param noise_type int

+ * The type of the noise. Refer to this list of + * noise constants. + *

+ * @param channel int[optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function addnoiseimage ($noise_type, $channel = null) {} + + /** + * Simulates motion blur + * @link http://www.php.net/manual/en/function.imagick-motionblurimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel. + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param angle float

+ * Apply the effect along this angle. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + * The channel argument affects only if Imagick is compiled against ImageMagick version + * 6.4.4 or greater. + *

+ * @return bool &imagick.return.success; + */ + public function motionblurimage ($radius, $sigma, $angle, $channel = null) {} + + /** + * Forms a mosaic from images + * @link http://www.php.net/manual/en/function.imagick-mosaicimages.php + * @return Imagick &imagick.return.success; + */ + public function mosaicimages () {} + + /** + * Method morphs a set of images + * @link http://www.php.net/manual/en/function.imagick-morphimages.php + * @param number_frames int

+ * The number of in-between images to generate. + *

+ * @return Imagick This method returns a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function morphimages ($number_frames) {} + + /** + * Scales an image proportionally to half its size + * @link http://www.php.net/manual/en/function.imagick-minifyimage.php + * @return bool &imagick.return.success; + */ + public function minifyimage () {} + + /** + * Transforms an image + * @link http://www.php.net/manual/en/function.imagick-affinetransformimage.php + * @param matrix ImagickDraw

+ * The affine matrix + *

+ * @return bool &imagick.return.success; + */ + public function affinetransformimage (ImagickDraw $matrix) {} + + /** + * Average a set of images + * @link http://www.php.net/manual/en/function.imagick-averageimages.php + * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function averageimages () {} + + /** + * Surrounds the image with a border + * @link http://www.php.net/manual/en/function.imagick-borderimage.php + * @param bordercolor mixed

+ * ImagickPixel object or a string containing the border color + *

+ * @param width int

+ * Border width + *

+ * @param height int

+ * Border height + *

+ * @return bool &imagick.return.success; + */ + public function borderimage ($bordercolor, $width, $height) {} + + /** + * Removes a region of an image and trims + * @link http://www.php.net/manual/en/function.imagick-chopimage.php + * @param width int

+ * Width of the chopped area + *

+ * @param height int

+ * Height of the chopped area + *

+ * @param x int

+ * X origo of the chopped area + *

+ * @param y int

+ * Y origo of the chopped area + *

+ * @return bool &imagick.return.success; + */ + public function chopimage ($width, $height, $x, $y) {} + + /** + * Clips along the first path from the 8BIM profile + * @link http://www.php.net/manual/en/function.imagick-clipimage.php + * @return bool &imagick.return.success; + */ + public function clipimage () {} + + /** + * Clips along the named paths from the 8BIM profile + * @link http://www.php.net/manual/en/function.imagick-clippathimage.php + * @param pathname string

+ * The name of the path + *

+ * @param inside bool

+ * If true later operations take effect inside clipping path. + * Otherwise later operations take effect outside clipping path. + *

+ * @return bool &imagick.return.success; + */ + public function clippathimage ($pathname, $inside) {} + + /** + * @param pathname + * @param inside + */ + public function clipimagepath ($pathname, $inside) {} + + /** + * Composites a set of images + * @link http://www.php.net/manual/en/function.imagick-coalesceimages.php + * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function coalesceimages () {} + + /** + * Changes the color value of any pixel that matches target + * @link http://www.php.net/manual/en/function.imagick-colorfloodfillimage.php + * @param fill mixed

+ * ImagickPixel object containing the fill color + *

+ * @param fuzz float

+ * The amount of fuzz. For example, set fuzz to 10 and the color red at + * intensities of 100 and 102 respectively are now interpreted as the + * same color for the purposes of the floodfill. + *

+ * @param bordercolor mixed

+ * ImagickPixel object containing the border color + *

+ * @param x int

+ * X start position of the floodfill + *

+ * @param y int

+ * Y start position of the floodfill + *

+ * @return bool &imagick.return.success; + */ + public function colorfloodfillimage ($fill, $fuzz, $bordercolor, $x, $y) {} + + /** + * Blends the fill color with the image + * @link http://www.php.net/manual/en/function.imagick-colorizeimage.php + * @param colorize mixed

+ * ImagickPixel object or a string containing the colorize color + *

+ * @param opacity mixed

+ * ImagickPixel object or an float containing the opacity value. + * 1.0 is fully opaque and 0.0 is fully transparent. + *

+ * @return bool &imagick.return.success; + */ + public function colorizeimage ($colorize, $opacity) {} + + /** + * Returns the difference in one or more images + * @link http://www.php.net/manual/en/function.imagick-compareimagechannels.php + * @param image Imagick

+ * Imagick object containing the image to compare. + *

+ * @param channelType int

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @param metricType int

+ * One of the metric type constants. + *

+ * @return array Array consisting of new_wand and + * distortion. + */ + public function compareimagechannels (Imagick $image, $channelType, $metricType) {} + + /** + * Compares an image to a reconstructed image + * @link http://www.php.net/manual/en/function.imagick-compareimages.php + * @param compare Imagick

+ * An image to compare to. + *

+ * @param metric int

+ * Provide a valid metric type constant. Refer to this + * list of metric constants. + *

+ * @return array &imagick.return.success; + */ + public function compareimages (Imagick $compare, $metric) {} + + /** + * Change the contrast of the image + * @link http://www.php.net/manual/en/function.imagick-contrastimage.php + * @param sharpen bool

+ * The sharpen value + *

+ * @return bool &imagick.return.success; + */ + public function contrastimage ($sharpen) {} + + /** + * Combines one or more images into a single image + * @link http://www.php.net/manual/en/function.imagick-combineimages.php + * @param channelType int

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return Imagick &imagick.return.success; + */ + public function combineimages ($channelType) {} + + /** + * Applies a custom convolution kernel to the image + * @link http://www.php.net/manual/en/function.imagick-convolveimage.php + * @param kernel array

+ * The convolution kernel + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function convolveimage (array $kernel, $channel = null) {} + + /** + * Displaces an image's colormap + * @link http://www.php.net/manual/en/function.imagick-cyclecolormapimage.php + * @param displace int

+ * The amount to displace the colormap. + *

+ * @return bool &imagick.return.success; + */ + public function cyclecolormapimage ($displace) {} + + /** + * Returns certain pixel differences between images + * @link http://www.php.net/manual/en/function.imagick-deconstructimages.php + * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function deconstructimages () {} + + /** + * Reduces the speckle noise in an image + * @link http://www.php.net/manual/en/function.imagick-despeckleimage.php + * @return bool &imagick.return.success; + */ + public function despeckleimage () {} + + /** + * Enhance edges within the image + * @link http://www.php.net/manual/en/function.imagick-edgeimage.php + * @param radius float

+ * The radius of the operation. + *

+ * @return bool &imagick.return.success; + */ + public function edgeimage ($radius) {} + + /** + * Returns a grayscale image with a three-dimensional effect + * @link http://www.php.net/manual/en/function.imagick-embossimage.php + * @param radius float

+ * The radius of the effect + *

+ * @param sigma float

+ * The sigma of the effect + *

+ * @return bool &imagick.return.success; + */ + public function embossimage ($radius, $sigma) {} + + /** + * Improves the quality of a noisy image + * @link http://www.php.net/manual/en/function.imagick-enhanceimage.php + * @return bool &imagick.return.success; + */ + public function enhanceimage () {} + + /** + * Equalizes the image histogram + * @link http://www.php.net/manual/en/function.imagick-equalizeimage.php + * @return bool &imagick.return.success; + */ + public function equalizeimage () {} + + /** + * Applies an expression to an image + * @link http://www.php.net/manual/en/function.imagick-evaluateimage.php + * @param op int

+ * The operator + *

+ * @param constant float

+ * The value of the operator + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function evaluateimage ($op, $constant, $channel = null) {} + + /** + * Merges a sequence of images + * @link http://www.php.net/manual/en/function.imagick-flattenimages.php + * @return Imagick &imagick.return.success; + */ + public function flattenimages () {} + + /** + * Creates a vertical mirror image + * @link http://www.php.net/manual/en/function.imagick-flipimage.php + * @return bool &imagick.return.success; + */ + public function flipimage () {} + + /** + * Creates a horizontal mirror image + * @link http://www.php.net/manual/en/function.imagick-flopimage.php + * @return bool &imagick.return.success; + */ + public function flopimage () {} + + /** + * Adds a simulated three-dimensional border + * @link http://www.php.net/manual/en/function.imagick-frameimage.php + * @param matte_color mixed

+ * ImagickPixel object or a string representing the matte color + *

+ * @param width int

+ * The width of the border + *

+ * @param height int

+ * The height of the border + *

+ * @param inner_bevel int

+ * The inner bevel width + *

+ * @param outer_bevel int

+ * The outer bevel width + *

+ * @return bool &imagick.return.success; + */ + public function frameimage ($matte_color, $width, $height, $inner_bevel, $outer_bevel) {} + + /** + * Evaluate expression for each pixel in the image + * @link http://www.php.net/manual/en/function.imagick-fximage.php + * @param expression string

+ * The expression. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return Imagick &imagick.return.success; + */ + public function fximage ($expression, $channel = null) {} + + /** + * Gamma-corrects an image + * @link http://www.php.net/manual/en/function.imagick-gammaimage.php + * @param gamma float

+ * The amount of gamma-correction. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function gammaimage ($gamma, $channel = null) {} + + /** + * Blurs an image + * @link http://www.php.net/manual/en/function.imagick-gaussianblurimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel. + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function gaussianblurimage ($radius, $sigma, $channel = null) {} + + /** + * @param key + */ + public function getimageattribute ($key) {} + + /** + * Returns the image background color + * @link http://www.php.net/manual/en/function.imagick-getimagebackgroundcolor.php + * @return ImagickPixel an ImagickPixel set to the background color of the image. + * &imagick.imagickexception.throw; + */ + public function getimagebackgroundcolor () {} + + /** + * Returns the chromaticy blue primary point + * @link http://www.php.net/manual/en/function.imagick-getimageblueprimary.php + * @param x float

+ * The chromaticity blue primary x-point. + *

+ * @param y float

+ * The chromaticity blue primary y-point. + *

+ * @return array Array consisting of "x" and "y" coordinates of point. + */ + public function getimageblueprimary ($x, $y) {} + + /** + * Returns the image border color + * @link http://www.php.net/manual/en/function.imagick-getimagebordercolor.php + * @return ImagickPixel &imagick.return.success; + */ + public function getimagebordercolor () {} + + /** + * Gets the depth for a particular image channel + * @link http://www.php.net/manual/en/function.imagick-getimagechanneldepth.php + * @param channel int

+ * &imagick.parameter.channel; + *

+ * @return int &imagick.return.success; + */ + public function getimagechanneldepth ($channel) {} + + /** + * Compares image channels of an image to a reconstructed image + * @link http://www.php.net/manual/en/function.imagick-getimagechanneldistortion.php + * @param reference Imagick

+ * Imagick object to compare to. + *

+ * @param channel int

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @param metric int

+ * One of the metric type constants. + *

+ * @return float &imagick.return.success; + */ + public function getimagechanneldistortion (Imagick $reference, $channel, $metric) {} + + /** + * Gets the extrema for one or more image channels + * @link http://www.php.net/manual/en/function.imagick-getimagechannelextrema.php + * @param channel int

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return array &imagick.return.success; + */ + public function getimagechannelextrema ($channel) {} + + /** + * Gets the mean and standard deviation + * @link http://www.php.net/manual/en/function.imagick-getimagechannelmean.php + * @param channel int

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return array &imagick.return.success; + */ + public function getimagechannelmean ($channel) {} + + /** + * Returns statistics for each channel in the image + * @link http://www.php.net/manual/en/function.imagick-getimagechannelstatistics.php + * @return array &imagick.return.success; + */ + public function getimagechannelstatistics () {} + + /** + * Returns the color of the specified colormap index + * @link http://www.php.net/manual/en/function.imagick-getimagecolormapcolor.php + * @param index int

+ * The offset into the image colormap. + *

+ * @return ImagickPixel &imagick.return.success; + */ + public function getimagecolormapcolor ($index) {} + + /** + * Gets the image colorspace + * @link http://www.php.net/manual/en/function.imagick-getimagecolorspace.php + * @return int &imagick.return.success; + */ + public function getimagecolorspace () {} + + /** + * Returns the composite operator associated with the image + * @link http://www.php.net/manual/en/function.imagick-getimagecompose.php + * @return int &imagick.return.success; + */ + public function getimagecompose () {} + + /** + * Gets the image delay + * @link http://www.php.net/manual/en/function.imagick-getimagedelay.php + * @return int the image delay. + * &imagick.imagickexception.throw; + */ + public function getimagedelay () {} + + /** + * Gets the image depth + * @link http://www.php.net/manual/en/function.imagick-getimagedepth.php + * @return int The image depth. + */ + public function getimagedepth () {} + + /** + * Compares an image to a reconstructed image + * @link http://www.php.net/manual/en/function.imagick-getimagedistortion.php + * @param reference MagickWand

+ * Imagick object to compare to. + *

+ * @param metric int

+ * One of the metric type constants. + *

+ * @return float the distortion metric used on the image (or the best guess + * thereof). + * &imagick.imagickexception.throw; + */ + public function getimagedistortion ($reference, $metric) {} + + /** + * Gets the extrema for the image + * @link http://www.php.net/manual/en/function.imagick-getimageextrema.php + * @return array an associative array with the keys "min" and "max". + * &imagick.imagickexception.throw; + */ + public function getimageextrema () {} + + /** + * Gets the image disposal method + * @link http://www.php.net/manual/en/function.imagick-getimagedispose.php + * @return int the dispose method on success. + * &imagick.imagickexception.throw; + */ + public function getimagedispose () {} + + /** + * Gets the image gamma + * @link http://www.php.net/manual/en/function.imagick-getimagegamma.php + * @return float the image gamma on success. + * &imagick.imagickexception.throw; + */ + public function getimagegamma () {} + + /** + * Returns the chromaticy green primary point + * @link http://www.php.net/manual/en/function.imagick-getimagegreenprimary.php + * @return array an array with the keys "x" and "y" on success, throws an + * ImagickException on failure. + */ + public function getimagegreenprimary () {} + + /** + * Returns the image height + * @link http://www.php.net/manual/en/function.imagick-getimageheight.php + * @return int the image height in pixels. + * &imagick.imagickexception.throw; + */ + public function getimageheight () {} + + /** + * Gets the image histogram + * @link http://www.php.net/manual/en/function.imagick-getimagehistogram.php + * @return array the image histogram as an array of ImagickPixel objects. + * &imagick.imagickexception.throw; + */ + public function getimagehistogram () {} + + /** + * Gets the image interlace scheme + * @link http://www.php.net/manual/en/function.imagick-getimageinterlacescheme.php + * @return int the interlace scheme as an integer on success. + * &imagick.imagickexception.throw; + */ + public function getimageinterlacescheme () {} + + /** + * Gets the image iterations + * @link http://www.php.net/manual/en/function.imagick-getimageiterations.php + * @return int the image iterations as an integer. + * &imagick.imagickexception.throw; + */ + public function getimageiterations () {} + + /** + * Returns the image matte color + * @link http://www.php.net/manual/en/function.imagick-getimagemattecolor.php + * @return ImagickPixel ImagickPixel object on success. + * &imagick.imagickexception.throw; + */ + public function getimagemattecolor () {} + + /** + * Returns the page geometry + * @link http://www.php.net/manual/en/function.imagick-getimagepage.php + * @return array the page geometry associated with the image in an array with the + * keys "width", "height", "x", and "y". + */ + public function getimagepage () {} + + /** + * Returns the color of the specified pixel + * @link http://www.php.net/manual/en/function.imagick-getimagepixelcolor.php + * @param x int

+ * The x-coordinate of the pixel + *

+ * @param y int

+ * The y-coordinate of the pixel + *

+ * @return ImagickPixel an ImagickPixel instance for the color at the coordinates given. + * &imagick.imagickexception.throw; + */ + public function getimagepixelcolor ($x, $y) {} + + /** + * Returns the named image profile + * @link http://www.php.net/manual/en/function.imagick-getimageprofile.php + * @param name string

+ * The name of the profile to return. + *

+ * @return string a string containing the image profile. + * &imagick.imagickexception.throw; + */ + public function getimageprofile ($name) {} + + /** + * Returns the chromaticity red primary point + * @link http://www.php.net/manual/en/function.imagick-getimageredprimary.php + * @return array the chromaticity red primary point as an array with the keys "x" + * and "y". + * &imagick.imagickexception.throw; + */ + public function getimageredprimary () {} + + /** + * Gets the image rendering intent + * @link http://www.php.net/manual/en/function.imagick-getimagerenderingintent.php + * @return int the image rendering intent. + * &imagick.imagickexception.throw; + */ + public function getimagerenderingintent () {} + + /** + * Gets the image X and Y resolution + * @link http://www.php.net/manual/en/function.imagick-getimageresolution.php + * @return array the resolution as an array. + * &imagick.imagickexception.throw; + */ + public function getimageresolution () {} + + /** + * Gets the image scene + * @link http://www.php.net/manual/en/function.imagick-getimagescene.php + * @return int the image scene. + * &imagick.imagickexception.throw; + */ + public function getimagescene () {} + + /** + * Generates an SHA-256 message digest + * @link http://www.php.net/manual/en/function.imagick-getimagesignature.php + * @return string a string containing the SHA-256 hash of the file. + * &imagick.imagickexception.throw; + */ + public function getimagesignature () {} + + /** + * Gets the image ticks-per-second + * @link http://www.php.net/manual/en/function.imagick-getimagetickspersecond.php + * @return int the image ticks-per-second. + * &imagick.imagickexception.throw; + */ + public function getimagetickspersecond () {} + + /** + * Gets the potential image type + * @link http://www.php.net/manual/en/function.imagick-getimagetype.php + * @return int the potential image type. + * &imagick.imagickexception.throw; + */ + public function getimagetype () {} + + /** + * Gets the image units of resolution + * @link http://www.php.net/manual/en/function.imagick-getimageunits.php + * @return int the image units of resolution. + * &imagick.imagickexception.throw; + */ + public function getimageunits () {} + + /** + * Returns the virtual pixel method + * @link http://www.php.net/manual/en/function.imagick-getimagevirtualpixelmethod.php + * @return int the virtual pixel method on success. + * &imagick.imagickexception.throw; + */ + public function getimagevirtualpixelmethod () {} + + /** + * Returns the chromaticity white point + * @link http://www.php.net/manual/en/function.imagick-getimagewhitepoint.php + * @return array the chromaticity white point as an associative array with the keys + * "x" and "y". + * &imagick.imagickexception.throw; + */ + public function getimagewhitepoint () {} + + /** + * Returns the image width + * @link http://www.php.net/manual/en/function.imagick-getimagewidth.php + * @return int the image width. + * &imagick.imagickexception.throw; + */ + public function getimagewidth () {} + + /** + * Returns the number of images in the object + * @link http://www.php.net/manual/en/function.imagick-getnumberimages.php + * @return int the number of images associated with Imagick object. + * &imagick.imagickexception.throw; + */ + public function getnumberimages () {} + + /** + * Gets the image total ink density + * @link http://www.php.net/manual/en/function.imagick-getimagetotalinkdensity.php + * @return float the image total ink density of the image. + * &imagick.imagickexception.throw; + */ + public function getimagetotalinkdensity () {} + + /** + * Extracts a region of the image + * @link http://www.php.net/manual/en/function.imagick-getimageregion.php + * @param width int

+ * The width of the extracted region. + *

+ * @param height int

+ * The height of the extracted region. + *

+ * @param x int

+ * X-coordinate of the top-left corner of the extracted region. + *

+ * @param y int

+ * Y-coordinate of the top-left corner of the extracted region. + *

+ * @return Imagick Extracts a region of the image and returns it as a new wand. + * &imagick.imagickexception.throw; + */ + public function getimageregion ($width, $height, $x, $y) {} + + /** + * Creates a new image as a copy + * @link http://www.php.net/manual/en/function.imagick-implodeimage.php + * @param radius float

+ * The radius of the implode + *

+ * @return bool &imagick.return.success; + */ + public function implodeimage ($radius) {} + + /** + * Adjusts the levels of an image + * @link http://www.php.net/manual/en/function.imagick-levelimage.php + * @param blackPoint float

+ * The image black point + *

+ * @param gamma float

+ * The gamma value + *

+ * @param whitePoint float

+ * The image white point + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function levelimage ($blackPoint, $gamma, $whitePoint, $channel = null) {} + + /** + * Scales an image proportionally 2x + * @link http://www.php.net/manual/en/function.imagick-magnifyimage.php + * @return bool &imagick.return.success; + */ + public function magnifyimage () {} + + /** + * Replaces the colors of an image with the closest color from a reference image. + * @link http://www.php.net/manual/en/function.imagick-mapimage.php + * @param map Imagick

+ *

+ * @param dither bool

+ *

+ * @return bool &imagick.return.success; + */ + public function mapimage (Imagick $map, $dither) {} + + /** + * Changes the transparency value of a color + * @link http://www.php.net/manual/en/function.imagick-mattefloodfillimage.php + * @param alpha float

+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully + * transparent. + *

+ * @param fuzz float

+ * The fuzz member of image defines how much tolerance is acceptable to + * consider two colors as the same. + *

+ * @param bordercolor mixed

+ * An ImagickPixel object or string representing the border color. + *

+ * @param x int

+ * The starting x coordinate of the operation. + *

+ * @param y int

+ * The starting y coordinate of the operation. + *

+ * @return bool &imagick.return.success; + */ + public function mattefloodfillimage ($alpha, $fuzz, $bordercolor, $x, $y) {} + + /** + * Applies a digital filter + * @link http://www.php.net/manual/en/function.imagick-medianfilterimage.php + * @param radius float

+ * The radius of the pixel neighborhood. + *

+ * @return bool &imagick.return.success; + */ + public function medianfilterimage ($radius) {} + + /** + * Negates the colors in the reference image + * @link http://www.php.net/manual/en/function.imagick-negateimage.php + * @param gray bool

+ * Whether to only negate grayscale pixels within the image. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function negateimage ($gray, $channel = null) {} + + /** + * Change any pixel that matches color + * @link http://www.php.net/manual/en/function.imagick-paintopaqueimage.php + * @param target mixed

+ * Change this target color to the fill color within the image. An + * ImagickPixel object or a string representing the target color. + *

+ * @param fill mixed

+ * An ImagickPixel object or a string representing the fill color. + *

+ * @param fuzz float

+ * The fuzz member of image defines how much tolerance is acceptable to + * consider two colors as the same. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function paintopaqueimage ($target, $fill, $fuzz, $channel = null) {} + + /** + * Changes any pixel that matches color with the color defined by fill + * @link http://www.php.net/manual/en/function.imagick-painttransparentimage.php + * @param target mixed

+ * Change this target color to specified opacity value within the image. + *

+ * @param alpha float

+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully + * transparent. + *

+ * @param fuzz float

+ * The fuzz member of image defines how much tolerance is acceptable to + * consider two colors as the same. + *

+ * @return bool &imagick.return.success; + */ + public function painttransparentimage ($target, $alpha, $fuzz) {} + + /** + * Quickly pin-point appropriate parameters for image processing + * @link http://www.php.net/manual/en/function.imagick-previewimages.php + * @param preview int

+ * Preview type. See Preview type constants + *

+ * @return bool &imagick.return.success; + */ + public function previewimages ($preview) {} + + /** + * Adds or removes a profile from an image + * @link http://www.php.net/manual/en/function.imagick-profileimage.php + * @param name string

+ *

+ * @param profile string

+ *

+ * @return bool &imagick.return.success; + */ + public function profileimage ($name, $profile) {} + + /** + * Analyzes the colors within a reference image + * @link http://www.php.net/manual/en/function.imagick-quantizeimage.php + * @param numberColors int

+ *

+ * @param colorspace int

+ *

+ * @param treedepth int

+ *

+ * @param dither bool

+ *

+ * @param measureError bool

+ *

+ * @return bool &imagick.return.success; + */ + public function quantizeimage ($numberColors, $colorspace, $treedepth, $dither, $measureError) {} + + /** + * Analyzes the colors within a sequence of images + * @link http://www.php.net/manual/en/function.imagick-quantizeimages.php + * @param numberColors int

+ *

+ * @param colorspace int

+ *

+ * @param treedepth int

+ *

+ * @param dither bool

+ *

+ * @param measureError bool

+ *

+ * @return bool &imagick.return.success; + */ + public function quantizeimages ($numberColors, $colorspace, $treedepth, $dither, $measureError) {} + + /** + * Smooths the contours of an image + * @link http://www.php.net/manual/en/function.imagick-reducenoiseimage.php + * @param radius float

+ *

+ * @return bool &imagick.return.success; + */ + public function reducenoiseimage ($radius) {} + + /** + * Removes the named image profile and returns it + * @link http://www.php.net/manual/en/function.imagick-removeimageprofile.php + * @param name string

+ *

+ * @return string a string containing the profile of the image. + * &imagick.imagickexception.throw; + */ + public function removeimageprofile ($name) {} + + /** + * Separates a channel from the image + * @link http://www.php.net/manual/en/function.imagick-separateimagechannel.php + * @param channel int

+ *

+ * @return bool &imagick.return.success; + */ + public function separateimagechannel ($channel) {} + + /** + * Sepia tones an image + * @link http://www.php.net/manual/en/function.imagick-sepiatoneimage.php + * @param threshold float

+ *

+ * @return bool &imagick.return.success; + */ + public function sepiatoneimage ($threshold) {} + + /** + * Sets the image bias for any method that convolves an image + * @link http://www.php.net/manual/en/function.imagick-setimagebias.php + * @param bias float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagebias ($bias) {} + + /** + * Sets the image chromaticity blue primary point + * @link http://www.php.net/manual/en/function.imagick-setimageblueprimary.php + * @param x float

+ *

+ * @param y float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageblueprimary ($x, $y) {} + + /** + * Sets the image border color + * @link http://www.php.net/manual/en/function.imagick-setimagebordercolor.php + * @param border mixed

+ * The border color + *

+ * @return bool &imagick.return.success; + */ + public function setimagebordercolor ($border) {} + + /** + * Sets the depth of a particular image channel + * @link http://www.php.net/manual/en/function.imagick-setimagechanneldepth.php + * @param channel int

+ *

+ * @param depth int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagechanneldepth ($channel, $depth) {} + + /** + * Sets the color of the specified colormap index + * @link http://www.php.net/manual/en/function.imagick-setimagecolormapcolor.php + * @param index int

+ *

+ * @param color ImagickPixel

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagecolormapcolor ($index, ImagickPixel $color) {} + + /** + * Sets the image colorspace + * @link http://www.php.net/manual/en/function.imagick-setimagecolorspace.php + * @param colorspace int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagecolorspace ($colorspace) {} + + /** + * Sets the image disposal method + * @link http://www.php.net/manual/en/function.imagick-setimagedispose.php + * @param dispose int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagedispose ($dispose) {} + + /** + * Sets the image size + * @link http://www.php.net/manual/en/function.imagick-setimageextent.php + * @param columns int

+ *

+ * @param rows int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageextent ($columns, $rows) {} + + /** + * Sets the image chromaticity green primary point + * @link http://www.php.net/manual/en/function.imagick-setimagegreenprimary.php + * @param x float

+ *

+ * @param y float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagegreenprimary ($x, $y) {} + + /** + * Sets the image compression + * @link http://www.php.net/manual/en/function.imagick-setimageinterlacescheme.php + * @param interlace_scheme int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageinterlacescheme ($interlace_scheme) {} + + /** + * Adds a named profile to the Imagick object + * @link http://www.php.net/manual/en/function.imagick-setimageprofile.php + * @param name string

+ *

+ * @param profile string

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageprofile ($name, $profile) {} + + /** + * Sets the image chromaticity red primary point + * @link http://www.php.net/manual/en/function.imagick-setimageredprimary.php + * @param x float

+ *

+ * @param y float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageredprimary ($x, $y) {} + + /** + * Sets the image rendering intent + * @link http://www.php.net/manual/en/function.imagick-setimagerenderingintent.php + * @param rendering_intent int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagerenderingintent ($rendering_intent) {} + + /** + * Sets the image virtual pixel method + * @link http://www.php.net/manual/en/function.imagick-setimagevirtualpixelmethod.php + * @param method int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagevirtualpixelmethod ($method) {} + + /** + * Sets the image chromaticity white point + * @link http://www.php.net/manual/en/function.imagick-setimagewhitepoint.php + * @param x float

+ *

+ * @param y float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagewhitepoint ($x, $y) {} + + /** + * Adjusts the contrast of an image + * @link http://www.php.net/manual/en/function.imagick-sigmoidalcontrastimage.php + * @param sharpen bool

+ *

+ * @param alpha float

+ *

+ * @param beta float

+ *

+ * @param channel int[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function sigmoidalcontrastimage ($sharpen, $alpha, $beta, $channel = null) {} + + /** + * Composites two images + * @link http://www.php.net/manual/en/function.imagick-stereoimage.php + * @param offset_wand Imagick

+ *

+ * @return bool &imagick.return.success; + */ + public function stereoimage (Imagick $offset_wand) {} + + /** + * Repeatedly tiles the texture image + * @link http://www.php.net/manual/en/function.imagick-textureimage.php + * @param texture_wand Imagick

+ *

+ * @return bool &imagick.return.success; + */ + public function textureimage (Imagick $texture_wand) {} + + /** + * Applies a color vector to each pixel in the image + * @link http://www.php.net/manual/en/function.imagick-tintimage.php + * @param tint mixed

+ *

+ * @param opacity mixed

+ *

+ * @return bool &imagick.return.success; + */ + public function tintimage ($tint, $opacity) {} + + /** + * Sharpens an image + * @link http://www.php.net/manual/en/function.imagick-unsharpmaskimage.php + * @param radius float

+ *

+ * @param sigma float

+ *

+ * @param amount float

+ *

+ * @param threshold float

+ *

+ * @param channel int[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function unsharpmaskimage ($radius, $sigma, $amount, $threshold, $channel = null) {} + + /** + * Returns a new Imagick object + * @link http://www.php.net/manual/en/function.imagick-getimage.php + * @return Imagick a new Imagick object with the current image sequence. + * &imagick.imagickexception.throw; + */ + public function getimage () {} + + /** + * Adds new image to Imagick object image list + * @link http://www.php.net/manual/en/function.imagick-addimage.php + * @param source Imagick

+ * The source Imagick object + *

+ * @return bool &imagick.return.success; + */ + public function addimage (Imagick $source) {} + + /** + * Replaces image in the object + * @link http://www.php.net/manual/en/function.imagick-setimage.php + * @param replace Imagick

+ * The replace Imagick object + *

+ * @return bool &imagick.return.success; + */ + public function setimage (Imagick $replace) {} + + /** + * Creates a new image + * @link http://www.php.net/manual/en/function.imagick-newimage.php + * @param cols int

+ * Columns in the new image + *

+ * @param rows int

+ * Rows in the new image + *

+ * @param background mixed

+ * The background color used for this image + *

+ * @param format string[optional]

+ * Image format. This parameter was added in Imagick version 2.0.1. + *

+ * @return bool &imagick.return.success; + */ + public function newimage ($cols, $rows, $background, $format = null) {} + + /** + * Creates a new image + * @link http://www.php.net/manual/en/function.imagick-newpseudoimage.php + * @param columns int

+ * columns in the new image + *

+ * @param rows int

+ * rows in the new image + *

+ * @param pseudoString string

+ * string containing pseudo image definition. + *

+ * @return bool &imagick.return.success; + */ + public function newpseudoimage ($columns, $rows, $pseudoString) {} + + /** + * Gets the object compression type + * @link http://www.php.net/manual/en/function.imagick-getcompression.php + * @return int the compression constant + */ + public function getcompression () {} + + /** + * Gets the object compression quality + * @link http://www.php.net/manual/en/function.imagick-getcompressionquality.php + * @return int integer describing the compression quality + */ + public function getcompressionquality () {} + + /** + * Returns the ImageMagick API copyright as a string + * @link http://www.php.net/manual/en/function.imagick-getcopyright.php + * @return string a string containing the copyright notice of Imagemagick and + * Magickwand C API. + */ + public function getcopyright () {} + + /** + * The filename associated with an image sequence + * @link http://www.php.net/manual/en/function.imagick-getfilename.php + * @return string a string on success. + * &imagick.imagickexception.throw; + */ + public function getfilename () {} + + /** + * Returns the format of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-getformat.php + * @return string the format of the image. + * &imagick.imagickexception.throw; + */ + public function getformat () {} + + /** + * Returns the ImageMagick home URL + * @link http://www.php.net/manual/en/function.imagick-gethomeurl.php + * @return string a link to the imagemagick homepage. + */ + public function gethomeurl () {} + + /** + * Gets the object interlace scheme + * @link http://www.php.net/manual/en/function.imagick-getinterlacescheme.php + * @return int Gets the wand interlace + * scheme. + * &imagick.imagickexception.throw; + */ + public function getinterlacescheme () {} + + /** + * Returns a value associated with the specified key + * @link http://www.php.net/manual/en/function.imagick-getoption.php + * @param key string

+ * The name of the option + *

+ * @return string a value associated with a wand and the specified key. + * &imagick.imagickexception.throw; + */ + public function getoption ($key) {} + + /** + * Returns the ImageMagick package name + * @link http://www.php.net/manual/en/function.imagick-getpackagename.php + * @return string the ImageMagick package name as a string. + * &imagick.imagickexception.throw; + */ + public function getpackagename () {} + + /** + * Returns the page geometry + * @link http://www.php.net/manual/en/function.imagick-getpage.php + * @return array the page geometry associated with the Imagick object in + * an associative array with the keys "width", "height", "x", and "y", + * throwing ImagickException on error. + */ + public function getpage () {} + + /** + * Gets the quantum depth + * @link http://www.php.net/manual/en/function.imagick-getquantumdepth.php + * @return array the Imagick quantum depth as a string. + * &imagick.imagickexception.throw; + */ + public function getquantumdepth () {} + + /** + * Returns the Imagick quantum range + * @link http://www.php.net/manual/en/function.imagick-getquantumrange.php + * @return array the Imagick quantum range as a string. + * &imagick.imagickexception.throw; + */ + public function getquantumrange () {} + + /** + * Returns the ImageMagick release date + * @link http://www.php.net/manual/en/function.imagick-getreleasedate.php + * @return string the ImageMagick release date as a string. + * &imagick.imagickexception.throw; + */ + public function getreleasedate () {} + + /** + * Returns the specified resource's memory usage + * @link http://www.php.net/manual/en/function.imagick-getresource.php + * @param type int

+ * Refer to the list of resourcetype constants. + *

+ * @return int the specified resource's memory usage in megabytes. + * &imagick.imagickexception.throw; + */ + public function getresource ($type) {} + + /** + * Returns the specified resource limit + * @link http://www.php.net/manual/en/function.imagick-getresourcelimit.php + * @param type int

+ * Refer to the list of resourcetype constants. + *

+ * @return int the specified resource limit in megabytes. + * &imagick.imagickexception.throw; + */ + public function getresourcelimit ($type) {} + + /** + * Gets the horizontal and vertical sampling factor + * @link http://www.php.net/manual/en/function.imagick-getsamplingfactors.php + * @return array an associative array with the horizontal and vertical sampling + * factors of the image. + * &imagick.imagickexception.throw; + */ + public function getsamplingfactors () {} + + /** + * Returns the size associated with the Imagick object + * @link http://www.php.net/manual/en/function.imagick-getsize.php + * @return array the size associated with the Imagick object as an array with the + * keys "columns" and "rows". + */ + public function getsize () {} + + /** + * Returns the ImageMagick API version + * @link http://www.php.net/manual/en/function.imagick-getversion.php + * @return array the ImageMagick API version as a string and as a number. + * &imagick.imagickexception.throw; + */ + public function getversion () {} + + /** + * Sets the object's default background color + * @link http://www.php.net/manual/en/function.imagick-setbackgroundcolor.php + * @param background mixed

+ *

+ * @return bool &imagick.return.success; + */ + public function setbackgroundcolor ($background) {} + + /** + * Sets the object's default compression type + * @link http://www.php.net/manual/en/function.imagick-setcompression.php + * @param compression int

+ *

+ * @return bool &imagick.return.success; + */ + public function setcompression ($compression) {} + + /** + * Sets the object's default compression quality + * @link http://www.php.net/manual/en/function.imagick-setcompressionquality.php + * @param quality int

+ *

+ * @return bool &imagick.return.success; + */ + public function setcompressionquality ($quality) {} + + /** + * Sets the filename before you read or write the image + * @link http://www.php.net/manual/en/function.imagick-setfilename.php + * @param filename string

+ *

+ * @return bool &imagick.return.success; + */ + public function setfilename ($filename) {} + + /** + * Sets the format of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-setformat.php + * @param format string

+ *

+ * @return bool &imagick.return.success; + */ + public function setformat ($format) {} + + /** + * Sets the image compression + * @link http://www.php.net/manual/en/function.imagick-setinterlacescheme.php + * @param interlace_scheme int

+ *

+ * @return bool &imagick.return.success; + */ + public function setinterlacescheme ($interlace_scheme) {} + + /** + * Set an option + * @link http://www.php.net/manual/en/function.imagick-setoption.php + * @param key string

+ *

+ * @param value string

+ *

+ * @return bool &imagick.return.success; + */ + public function setoption ($key, $value) {} + + /** + * Sets the page geometry of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-setpage.php + * @param width int

+ *

+ * @param height int

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @return bool &imagick.return.success; + */ + public function setpage ($width, $height, $x, $y) {} + + /** + * Sets the limit for a particular resource in megabytes + * @link http://www.php.net/manual/en/function.imagick-setresourcelimit.php + * @param type int

+ *

+ * @param limit int

+ *

+ * @return bool &imagick.return.success; + */ + public function setresourcelimit ($type, $limit) {} + + /** + * Sets the image resolution + * @link http://www.php.net/manual/en/function.imagick-setresolution.php + * @param x_resolution float

+ *

+ * @param y_resolution float

+ *

+ * @return bool &imagick.return.success; + */ + public function setresolution ($x_resolution, $y_resolution) {} + + /** + * Sets the image sampling factors + * @link http://www.php.net/manual/en/function.imagick-setsamplingfactors.php + * @param factors array

+ *

+ * @return bool &imagick.return.success; + */ + public function setsamplingfactors (array $factors) {} + + /** + * Sets the size of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-setsize.php + * @param columns int

+ *

+ * @param rows int

+ *

+ * @return bool &imagick.return.success; + */ + public function setsize ($columns, $rows) {} + + /** + * Sets the image type attribute + * @link http://www.php.net/manual/en/function.imagick-settype.php + * @param image_type int

+ *

+ * @return bool &imagick.return.success; + */ + public function settype ($image_type) {} + + public function key () {} + + public function next () {} + + public function rewind () {} + + /** + * Checks if the current item is valid + * @link http://www.php.net/manual/en/function.imagick-valid.php + * @return bool &imagick.return.success; + */ + public function valid () {} + + /** + * Returns a reference to the current Imagick object + * @link http://www.php.net/manual/en/function.imagick-current.php + * @return Imagick self on success. + * &imagick.imagickexception.throw; + */ + public function current () {} + +} + +/** @jms-builtin */ +class ImagickDraw { + + public function resetvectorgraphics () {} + + /** + * The ImagickDraw constructor + * @link http://www.php.net/manual/en/function.imagickdraw-construct.php + * @return ImagickDraw + */ + public function __construct () {} + + /** + * Sets the fill color to be used for drawing filled objects + * @link http://www.php.net/manual/en/function.imagickdraw-setfillcolor.php + * @param fill_pixel ImagickPixel

+ * ImagickPixel to use to set the color + *

+ * @return bool + */ + public function setfillcolor (ImagickPixel $fill_pixel) {} + + /** + * Sets the opacity to use when drawing using the fill color or fill texture + * @link http://www.php.net/manual/en/function.imagickdraw-setfillalpha.php + * @param opacity float

+ * fill alpha + *

+ * @return bool + */ + public function setfillalpha ($opacity) {} + + /** + * Sets the color used for stroking object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokecolor.php + * @param stroke_pixel ImagickPixel

+ * the stroke color + *

+ * @return bool + */ + public function setstrokecolor (ImagickPixel $stroke_pixel) {} + + /** + * Specifies the opacity of stroked object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokealpha.php + * @param opacity float

+ * opacity + *

+ * @return bool + */ + public function setstrokealpha ($opacity) {} + + /** + * Sets the width of the stroke used to draw object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokewidth.php + * @param stroke_width float

+ * stroke width + *

+ * @return bool + */ + public function setstrokewidth ($stroke_width) {} + + /** + * Clears the ImagickDraw + * @link http://www.php.net/manual/en/function.imagickdraw-clear.php + * @return bool an ImagickDraw object. + */ + public function clear () {} + + /** + * Draws a circle + * @link http://www.php.net/manual/en/function.imagickdraw-circle.php + * @param ox float

+ * origin x coordinate + *

+ * @param oy float

+ * origin y coordinate + *

+ * @param px float

+ * perimeter x coordinate + *

+ * @param py float

+ * perimeter y coordinate + *

+ * @return bool + */ + public function circle ($ox, $oy, $px, $py) {} + + /** + * Draws text on the image + * @link http://www.php.net/manual/en/function.imagickdraw-annotation.php + * @param x float

+ * The x coordinate where text is drawn + *

+ * @param y float

+ * The y coordinate where text is drawn + *

+ * @param text string

+ * The text to draw on the image + *

+ * @return bool + */ + public function annotation ($x, $y, $text) {} + + /** + * Controls whether text is antialiased + * @link http://www.php.net/manual/en/function.imagickdraw-settextantialias.php + * @param antiAlias bool

+ *

+ * @return bool + */ + public function settextantialias ($antiAlias) {} + + /** + * Specifies specifies the text code set + * @link http://www.php.net/manual/en/function.imagickdraw-settextencoding.php + * @param encoding string

+ * the encoding name + *

+ * @return bool + */ + public function settextencoding ($encoding) {} + + /** + * Sets the fully-specified font to use when annotating with text + * @link http://www.php.net/manual/en/function.imagickdraw-setfont.php + * @param font_name string

+ *

+ * @return bool &imagick.return.success; + */ + public function setfont ($font_name) {} + + /** + * Sets the font family to use when annotating with text + * @link http://www.php.net/manual/en/function.imagickdraw-setfontfamily.php + * @param font_family string

+ * the font family + *

+ * @return bool &imagick.return.success; + */ + public function setfontfamily ($font_family) {} + + /** + * Sets the font pointsize to use when annotating with text + * @link http://www.php.net/manual/en/function.imagickdraw-setfontsize.php + * @param pointsize float

+ * the point size + *

+ * @return bool + */ + public function setfontsize ($pointsize) {} + + /** + * Sets the font style to use when annotating with text + * @link http://www.php.net/manual/en/function.imagickdraw-setfontstyle.php + * @param style int

+ * STYLETYPE_ constant + *

+ * @return bool + */ + public function setfontstyle ($style) {} + + /** + * Sets the font weight + * @link http://www.php.net/manual/en/function.imagickdraw-setfontweight.php + * @param font_weight int

+ *

+ * @return bool + */ + public function setfontweight ($font_weight) {} + + /** + * Returns the font + * @link http://www.php.net/manual/en/function.imagickdraw-getfont.php + * @return string a string on success and false if no font is set. + */ + public function getfont () {} + + /** + * Returns the font family + * @link http://www.php.net/manual/en/function.imagickdraw-getfontfamily.php + * @return string the font family currently selected or false if font family is not set. + */ + public function getfontfamily () {} + + /** + * Returns the font pointsize + * @link http://www.php.net/manual/en/function.imagickdraw-getfontsize.php + * @return float the font size associated with the current ImagickDraw object. + */ + public function getfontsize () {} + + /** + * Returns the font style + * @link http://www.php.net/manual/en/function.imagickdraw-getfontstyle.php + * @return int the font style constant (STYLE_) associated with the ImagickDraw object + * or 0 if no style is set. + */ + public function getfontstyle () {} + + /** + * Returns the font weight + * @link http://www.php.net/manual/en/function.imagickdraw-getfontweight.php + * @return int an int on success and 0 if no weight is set. + */ + public function getfontweight () {} + + /** + * Frees all associated resources + * @link http://www.php.net/manual/en/function.imagickdraw-destroy.php + * @return bool + */ + public function destroy () {} + + /** + * Draws a rectangle + * @link http://www.php.net/manual/en/function.imagickdraw-rectangle.php + * @param x1 float

+ * x coordinate of the top left corner + *

+ * @param y1 float

+ * y coordinate of the top left corner + *

+ * @param x2 float

+ * x coordinate of the bottom right corner + *

+ * @param y2 float

+ * y coordinate of the bottom right corner + *

+ * @return bool + */ + public function rectangle ($x1, $y1, $x2, $y2) {} + + /** + * Draws a rounded rectangle + * @link http://www.php.net/manual/en/function.imagickdraw-roundrectangle.php + * @param x1 float

+ * x coordinate of the top left corner + *

+ * @param y1 float

+ * y coordinate of the top left corner + *

+ * @param x2 float

+ * x coordinate of the bottom right + *

+ * @param y2 float

+ * y coordinate of the bottom right + *

+ * @param rx float

+ * x rounding + *

+ * @param ry float

+ * y rounding + *

+ * @return bool + */ + public function roundrectangle ($x1, $y1, $x2, $y2, $rx, $ry) {} + + /** + * Draws an ellipse on the image + * @link http://www.php.net/manual/en/function.imagickdraw-ellipse.php + * @param ox float

+ *

+ * @param oy float

+ *

+ * @param rx float

+ *

+ * @param ry float

+ *

+ * @param start float

+ *

+ * @param end float

+ *

+ * @return bool + */ + public function ellipse ($ox, $oy, $rx, $ry, $start, $end) {} + + /** + * Skews the current coordinate system in the horizontal direction + * @link http://www.php.net/manual/en/function.imagickdraw-skewx.php + * @param degrees float

+ * degrees to skew + *

+ * @return bool + */ + public function skewx ($degrees) {} + + /** + * Skews the current coordinate system in the vertical direction + * @link http://www.php.net/manual/en/function.imagickdraw-skewy.php + * @param degrees float

+ * degrees to skew + *

+ * @return bool + */ + public function skewy ($degrees) {} + + /** + * Applies a translation to the current coordinate system + * @link http://www.php.net/manual/en/function.imagickdraw-translate.php + * @param x float

+ * horizontal translation + *

+ * @param y float

+ * vertical translation + *

+ * @return bool + */ + public function translate ($x, $y) {} + + /** + * Draws a line + * @link http://www.php.net/manual/en/function.imagickdraw-line.php + * @param sx float

+ * starting x coordinate + *

+ * @param sy float

+ * starting y coordinate + *

+ * @param ex float

+ * ending x coordinate + *

+ * @param ey float

+ * ending y coordinate + *

+ * @return bool + */ + public function line ($sx, $sy, $ex, $ey) {} + + /** + * Draws an arc + * @link http://www.php.net/manual/en/function.imagickdraw-arc.php + * @param sx float

+ * Starting x ordinate of bounding rectangle + *

+ * @param sy float

+ * starting y ordinate of bounding rectangle + *

+ * @param ex float

+ * ending x ordinate of bounding rectangle + *

+ * @param ey float

+ * ending y ordinate of bounding rectangle + *

+ * @param sd float

+ * starting degrees of rotation + *

+ * @param ed float

+ * ending degrees of rotation + *

+ * @return bool + */ + public function arc ($sx, $sy, $ex, $ey, $sd, $ed) {} + + /** + * Paints on the image's opacity channel + * @link http://www.php.net/manual/en/function.imagickdraw-matte.php + * @param x float

+ * x coordinate of the matte + *

+ * @param y float

+ * y coordinate of the matte + *

+ * @param paintMethod int

+ * PAINT_ constant + *

+ * @return bool Returns true on success or false on failure. + */ + public function matte ($x, $y, $paintMethod) {} + + /** + * Draws a polygon + * @link http://www.php.net/manual/en/function.imagickdraw-polygon.php + * @param coordinates array

+ * multidimensional array like array( array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 ) ); + *

+ * @return bool &imagick.return.success; + */ + public function polygon (array $coordinates) {} + + /** + * Draws a point + * @link http://www.php.net/manual/en/function.imagickdraw-point.php + * @param x float

+ * point's x coordinate + *

+ * @param y float

+ * point's y coordinate + *

+ * @return bool + */ + public function point ($x, $y) {} + + /** + * Returns the text decoration + * @link http://www.php.net/manual/en/function.imagickdraw-gettextdecoration.php + * @return int one of the DECORATION_ constants + * and 0 if no decoration is set. + */ + public function gettextdecoration () {} + + /** + * Returns the code set used for text annotations + * @link http://www.php.net/manual/en/function.imagickdraw-gettextencoding.php + * @return string a string specifying the code set + * or false if text encoding is not set. + */ + public function gettextencoding () {} + + public function getfontstretch () {} + + /** + * Sets the font stretch to use when annotating with text + * @link http://www.php.net/manual/en/function.imagickdraw-setfontstretch.php + * @param fontStretch int

+ * STRETCH_ constant + *

+ * @return bool + */ + public function setfontstretch ($fontStretch) {} + + /** + * Controls whether stroked outlines are antialiased + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokeantialias.php + * @param stroke_antialias bool

+ * the antialias setting + *

+ * @return bool + */ + public function setstrokeantialias ($stroke_antialias) {} + + /** + * Specifies a text alignment + * @link http://www.php.net/manual/en/function.imagickdraw-settextalignment.php + * @param alignment int

+ * ALIGN_ constant + *

+ * @return bool + */ + public function settextalignment ($alignment) {} + + /** + * Specifies a decoration + * @link http://www.php.net/manual/en/function.imagickdraw-settextdecoration.php + * @param decoration int

+ * DECORATION_ constant + *

+ * @return bool + */ + public function settextdecoration ($decoration) {} + + /** + * Specifies the color of a background rectangle + * @link http://www.php.net/manual/en/function.imagickdraw-settextundercolor.php + * @param under_color ImagickPixel

+ * the under color + *

+ * @return bool + */ + public function settextundercolor (ImagickPixel $under_color) {} + + /** + * Sets the overall canvas size + * @link http://www.php.net/manual/en/function.imagickdraw-setviewbox.php + * @param x1 int

+ * left x coordinate + *

+ * @param y1 int

+ * left y coordinate + *

+ * @param x2 int

+ * right x coordinate + *

+ * @param y2 int

+ * right y coordinate + *

+ * @return bool + */ + public function setviewbox ($x1, $y1, $x2, $y2) {} + + /** + * Makes an exact copy of the specified ImagickDraw object + * @link http://www.php.net/manual/en/function.imagickdraw-clone.php + * @return ImagickDraw What the function returns, first on success, then on failure. See + * also the &return.success; entity + */ + public function clone () {} + + /** + * Adjusts the current affine transformation matrix + * @link http://www.php.net/manual/en/function.imagickdraw-affine.php + * @param affine array

+ * Affine matrix parameters + *

+ * @return bool + */ + public function affine (array $affine) {} + + /** + * Draws a bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-bezier.php + * @param coordinates array

+ * Multidimensional array like array( array( 'x' => 1, 'y' => 2 ), + * array( 'x' => 3, 'y' => 4 ) ) + *

+ * @return bool + */ + public function bezier (array $coordinates) {} + + /** + * Composites an image onto the current image + * @link http://www.php.net/manual/en/function.imagickdraw-composite.php + * @param compose int

+ * composition operator. One of COMPOSITE_ constants + *

+ * @param x float

+ * x coordinate of the top left corner + *

+ * @param y float

+ * y coordinate of the top left corner + *

+ * @param width float

+ * width of the composition image + *

+ * @param height float

+ * height of the composition image + *

+ * @param compositeWand Imagick

+ * the Imagick object where composition image is taken from + *

+ * @return bool &imagick.return.success; + */ + public function composite ($compose, $x, $y, $width, $height, Imagick $compositeWand) {} + + /** + * Draws color on image + * @link http://www.php.net/manual/en/function.imagickdraw-color.php + * @param x float

+ * x coordinate of the paint + *

+ * @param y float

+ * y coordinate of the paint + *

+ * @param paintMethod int

+ * one of the PAINT_ constants + *

+ * @return bool + */ + public function color ($x, $y, $paintMethod) {} + + /** + * Adds a comment + * @link http://www.php.net/manual/en/function.imagickdraw-comment.php + * @param comment string

+ * The comment string to add to vector output stream + *

+ * @return bool + */ + public function comment ($comment) {} + + /** + * Obtains the current clipping path ID + * @link http://www.php.net/manual/en/function.imagickdraw-getclippath.php + * @return string a string containing the clip path ID or false if no clip path exists. + */ + public function getclippath () {} + + /** + * Returns the current polygon fill rule + * @link http://www.php.net/manual/en/function.imagickdraw-getcliprule.php + * @return int one of the FILLRULE_ constants. + */ + public function getcliprule () {} + + /** + * Returns the interpretation of clip path units + * @link http://www.php.net/manual/en/function.imagickdraw-getclipunits.php + * @return int an int on success. + */ + public function getclipunits () {} + + /** + * Returns the fill color + * @link http://www.php.net/manual/en/function.imagickdraw-getfillcolor.php + * @return ImagickPixel an ImagickPixel object. + */ + public function getfillcolor () {} + + /** + * Returns the opacity used when drawing + * @link http://www.php.net/manual/en/function.imagickdraw-getfillopacity.php + * @return float The opacity. + */ + public function getfillopacity () {} + + /** + * Returns the fill rule + * @link http://www.php.net/manual/en/function.imagickdraw-getfillrule.php + * @return int a FILLRULE_ constant + */ + public function getfillrule () {} + + /** + * Returns the text placement gravity + * @link http://www.php.net/manual/en/function.imagickdraw-getgravity.php + * @return int a GRAVITY_ constant on success and 0 if no gravity is set. + */ + public function getgravity () {} + + /** + * Returns the current stroke antialias setting + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokeantialias.php + * @return bool true if antialiasing is on and false if it is off. + */ + public function getstrokeantialias () {} + + /** + * Returns the color used for stroking object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokecolor.php + * @param stroke_color ImagickPixel

+ *

+ * @return ImagickPixel an ImagickPixel object which describes the color. + */ + public function getstrokecolor (ImagickPixel $stroke_color) {} + + /** + * Returns an array representing the pattern of dashes and gaps used to stroke paths + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokedasharray.php + * @return array an array on success and empty array if not set. + */ + public function getstrokedasharray () {} + + /** + * Returns the offset into the dash pattern to start the dash + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokedashoffset.php + * @return float a float representing the offset and 0 if it's not set. + */ + public function getstrokedashoffset () {} + + /** + * Returns the shape to be used at the end of open subpaths when they are stroked + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokelinecap.php + * @return int one of the LINECAP_ constants or 0 if stroke linecap is not set. + */ + public function getstrokelinecap () {} + + /** + * Returns the shape to be used at the corners of paths when they are stroked + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokelinejoin.php + * @return int one of the LINEJOIN_ constants or 0 if stroke line join is not set. + */ + public function getstrokelinejoin () {} + + /** + * Returns the stroke miter limit + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokemiterlimit.php + * @return int an int describing the miter limit + * and 0 if no miter limit is set. + */ + public function getstrokemiterlimit () {} + + /** + * Returns the opacity of stroked object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokeopacity.php + * @return float a double describing the opacity. + */ + public function getstrokeopacity () {} + + /** + * Returns the width of the stroke used to draw object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokewidth.php + * @return float a double describing the stroke width. + */ + public function getstrokewidth () {} + + /** + * Returns the text alignment + * @link http://www.php.net/manual/en/function.imagickdraw-gettextalignment.php + * @return int one of the ALIGN_ constants and 0 if no align is set. + */ + public function gettextalignment () {} + + /** + * Returns the current text antialias setting + * @link http://www.php.net/manual/en/function.imagickdraw-gettextantialias.php + * @return bool true if text is antialiased and false if not. + */ + public function gettextantialias () {} + + /** + * Returns a string containing vector graphics + * @link http://www.php.net/manual/en/function.imagickdraw-getvectorgraphics.php + * @return string a string containing the vector graphics. + */ + public function getvectorgraphics () {} + + /** + * Returns the text under color + * @link http://www.php.net/manual/en/function.imagickdraw-gettextundercolor.php + * @return ImagickPixel an ImagickPixel object describing the color. + */ + public function gettextundercolor () {} + + /** + * Adds a path element to the current path + * @link http://www.php.net/manual/en/function.imagickdraw-pathclose.php + * @return bool + */ + public function pathclose () {} + + /** + * Draws a cubic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetoabsolute.php + * @param x1 float

+ * x coordinate of the first control point + *

+ * @param y1 float

+ * y coordinate of the first control point + *

+ * @param x2 float

+ * x coordinate of the second control point + *

+ * @param y2 float

+ * y coordinate of the first control point + *

+ * @param x float

+ * x coordinate of the curve end + *

+ * @param y float

+ * y coordinate of the curve end + *

+ * @return bool + */ + public function pathcurvetoabsolute ($x1, $y1, $x2, $y2, $x, $y) {} + + /** + * Draws a cubic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetorelative.php + * @param x1 float

+ * x coordinate of starting control point + *

+ * @param y1 float

+ * y coordinate of starting control point + *

+ * @param x2 float

+ * x coordinate of ending control point + *

+ * @param y2 float

+ * y coordinate of ending control point + *

+ * @param x float

+ * ending x coordinate + *

+ * @param y float

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetorelative ($x1, $y1, $x2, $y2, $x, $y) {} + + /** + * Draws a quadratic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbezierabsolute.php + * @param x1 float

+ * x coordinate of the control point + *

+ * @param y1 float

+ * y coordinate of the control point + *

+ * @param x float

+ * x coordinate of the end point + *

+ * @param y float

+ * y coordinate of the end point + *

+ * @return bool + */ + public function pathcurvetoquadraticbezierabsolute ($x1, $y1, $x, $y) {} + + /** + * Draws a quadratic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbezierrelative.php + * @param x1 float

+ * starting x coordinate + *

+ * @param y1 float

+ * starting y coordinate + *

+ * @param x float

+ * ending x coordinate + *

+ * @param y float

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetoquadraticbezierrelative ($x1, $y1, $x, $y) {} + + /** + * Draws a quadratic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbeziersmoothabsolute.php + * @param x float

+ * ending x coordinate + *

+ * @param y float

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetoquadraticbeziersmoothabsolute ($x, $y) {} + + /** + * Draws a quadratic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbeziersmoothrelative.php + * @param x float

+ * ending x coordinate + *

+ * @param y float

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetoquadraticbeziersmoothrelative ($x, $y) {} + + /** + * Draws a cubic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetosmoothabsolute.php + * @param x2 float

+ * x coordinate of the second control point + *

+ * @param y2 float

+ * y coordinate of the second control point + *

+ * @param x float

+ * x coordinate of the ending point + *

+ * @param y float

+ * y coordinate of the ending point + *

+ * @return bool + */ + public function pathcurvetosmoothabsolute ($x2, $y2, $x, $y) {} + + /** + * Draws a cubic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetosmoothrelative.php + * @param x2 float

+ * x coordinate of the second control point + *

+ * @param y2 float

+ * y coordinate of the second control point + *

+ * @param x float

+ * x coordinate of the ending point + *

+ * @param y float

+ * y coordinate of the ending point + *

+ * @return bool + */ + public function pathcurvetosmoothrelative ($x2, $y2, $x, $y) {} + + /** + * Draws an elliptical arc + * @link http://www.php.net/manual/en/function.imagickdraw-pathellipticarcabsolute.php + * @param rx float

+ * x radius + *

+ * @param ry float

+ * y radius + *

+ * @param x_axis_rotation float

+ * x axis rotation + *

+ * @param large_arc_flag bool

+ * large arc flag + *

+ * @param sweep_flag bool

+ * sweep flag + *

+ * @param x float

+ * x coordinate + *

+ * @param y float

+ * y coordinate + *

+ * @return bool + */ + public function pathellipticarcabsolute ($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {} + + /** + * Draws an elliptical arc + * @link http://www.php.net/manual/en/function.imagickdraw-pathellipticarcrelative.php + * @param rx float

+ * x radius + *

+ * @param ry float

+ * y radius + *

+ * @param x_axis_rotation float

+ * x axis rotation + *

+ * @param large_arc_flag bool

+ * large arc flag + *

+ * @param sweep_flag bool

+ * sweep flag + *

+ * @param x float

+ * x coordinate + *

+ * @param y float

+ * y coordinate + *

+ * @return bool + */ + public function pathellipticarcrelative ($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {} + + /** + * Terminates the current path + * @link http://www.php.net/manual/en/function.imagickdraw-pathfinish.php + * @return bool + */ + public function pathfinish () {} + + /** + * Draws a line path + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetoabsolute.php + * @param x float

+ * starting x coordinate + *

+ * @param y float

+ * ending x coordinate + *

+ * @return bool + */ + public function pathlinetoabsolute ($x, $y) {} + + /** + * Draws a line path + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetorelative.php + * @param x float

+ * starting x coordinate + *

+ * @param y float

+ * starting y coordinate + *

+ * @return bool + */ + public function pathlinetorelative ($x, $y) {} + + /** + * Draws a horizontal line path + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetohorizontalabsolute.php + * @param x float

+ * x coordinate + *

+ * @return bool + */ + public function pathlinetohorizontalabsolute ($x) {} + + /** + * Draws a horizontal line + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetohorizontalrelative.php + * @param x float

+ * x coordinate + *

+ * @return bool + */ + public function pathlinetohorizontalrelative ($x) {} + + /** + * Draws a vertical line + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetoverticalabsolute.php + * @param y float

+ * y coordinate + *

+ * @return bool + */ + public function pathlinetoverticalabsolute ($y) {} + + /** + * Draws a vertical line path + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetoverticalrelative.php + * @param y float

+ * y coordinate + *

+ * @return bool + */ + public function pathlinetoverticalrelative ($y) {} + + /** + * Starts a new sub-path + * @link http://www.php.net/manual/en/function.imagickdraw-pathmovetoabsolute.php + * @param x float

+ * x coordinate of the starting point + *

+ * @param y float

+ * y coordinate of the starting point + *

+ * @return bool + */ + public function pathmovetoabsolute ($x, $y) {} + + /** + * Starts a new sub-path + * @link http://www.php.net/manual/en/function.imagickdraw-pathmovetorelative.php + * @param x float

+ * target x coordinate + *

+ * @param y float

+ * target y coordinate + *

+ * @return bool + */ + public function pathmovetorelative ($x, $y) {} + + /** + * Declares the start of a path drawing list + * @link http://www.php.net/manual/en/function.imagickdraw-pathstart.php + * @return bool + */ + public function pathstart () {} + + /** + * Draws a polyline + * @link http://www.php.net/manual/en/function.imagickdraw-polyline.php + * @param coordinates array

+ * array of x and y coordinates: array( array( 'x' => 4, 'y' => 6 ), array( 'x' => 8, 'y' => 10 ) ) + *

+ * @return bool &imagick.return.success; + */ + public function polyline (array $coordinates) {} + + /** + * Terminates a clip path definition + * @link http://www.php.net/manual/en/function.imagickdraw-popclippath.php + * @return bool + */ + public function popclippath () {} + + /** + * Terminates a definition list + * @link http://www.php.net/manual/en/function.imagickdraw-popdefs.php + * @return bool + */ + public function popdefs () {} + + /** + * Terminates a pattern definition + * @link http://www.php.net/manual/en/function.imagickdraw-poppattern.php + * @return bool Returns true on success or false on failure. + */ + public function poppattern () {} + + /** + * Starts a clip path definition + * @link http://www.php.net/manual/en/function.imagickdraw-pushclippath.php + * @param clip_mask_id string

+ * Clip mask Id + *

+ * @return bool + */ + public function pushclippath ($clip_mask_id) {} + + /** + * Indicates that following commands create named elements for early processing + * @link http://www.php.net/manual/en/function.imagickdraw-pushdefs.php + * @return bool + */ + public function pushdefs () {} + + /** + * Indicates that subsequent commands up to a ImagickDraw::opPattern() command comprise the definition of a named pattern + * @link http://www.php.net/manual/en/function.imagickdraw-pushpattern.php + * @param pattern_id string

+ * the pattern Id + *

+ * @param x float

+ * x coordinate of the top-left corner + *

+ * @param y float

+ * y coordinate of the top-left corner + *

+ * @param width float

+ * width of the pattern + *

+ * @param height float

+ * height of the pattern + *

+ * @return bool Returns true on success or false on failure. + */ + public function pushpattern ($pattern_id, $x, $y, $width, $height) {} + + /** + * Renders all preceding drawing commands onto the image + * @link http://www.php.net/manual/en/function.imagickdraw-render.php + * @return bool Returns true on success or false on failure. + */ + public function render () {} + + /** + * Applies the specified rotation to the current coordinate space + * @link http://www.php.net/manual/en/function.imagickdraw-rotate.php + * @param degrees float

+ * degrees to rotate + *

+ * @return bool + */ + public function rotate ($degrees) {} + + /** + * Adjusts the scaling factor + * @link http://www.php.net/manual/en/function.imagickdraw-scale.php + * @param x float

+ * horizontal factor + *

+ * @param y float

+ * vertical factor + *

+ * @return bool + */ + public function scale ($x, $y) {} + + /** + * Associates a named clipping path with the image + * @link http://www.php.net/manual/en/function.imagickdraw-setclippath.php + * @param clip_mask string

+ * the clipping path name + *

+ * @return bool + */ + public function setclippath ($clip_mask) {} + + /** + * Set the polygon fill rule to be used by the clipping path + * @link http://www.php.net/manual/en/function.imagickdraw-setcliprule.php + * @param fill_rule int

+ * FILLRULE_ constant + *

+ * @return bool + */ + public function setcliprule ($fill_rule) {} + + /** + * Sets the interpretation of clip path units + * @link http://www.php.net/manual/en/function.imagickdraw-setclipunits.php + * @param clip_units int

+ * the number of clip units + *

+ * @return bool + */ + public function setclipunits ($clip_units) {} + + /** + * Sets the opacity to use when drawing using the fill color or fill texture + * @link http://www.php.net/manual/en/function.imagickdraw-setfillopacity.php + * @param fillOpacity float

+ * the fill opacity + *

+ * @return bool + */ + public function setfillopacity ($fillOpacity) {} + + /** + * Sets the URL to use as a fill pattern for filling objects + * @link http://www.php.net/manual/en/function.imagickdraw-setfillpatternurl.php + * @param fill_url string

+ * URL to use to obtain fill pattern. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setfillpatternurl ($fill_url) {} + + /** + * Sets the fill rule to use while drawing polygons + * @link http://www.php.net/manual/en/function.imagickdraw-setfillrule.php + * @param fill_rule int

+ * FILLRULE_ constant + *

+ * @return bool + */ + public function setfillrule ($fill_rule) {} + + /** + * Sets the text placement gravity + * @link http://www.php.net/manual/en/function.imagickdraw-setgravity.php + * @param gravity int

+ * GRAVITY_ constant + *

+ * @return bool + */ + public function setgravity ($gravity) {} + + /** + * Sets the pattern used for stroking object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokepatternurl.php + * @param stroke_url string

+ * stroke URL + *

+ * @return bool imagick.imagickdraw.return.success; + */ + public function setstrokepatternurl ($stroke_url) {} + + /** + * Specifies the offset into the dash pattern to start the dash + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokedashoffset.php + * @param dash_offset float

+ * dash offset + *

+ * @return bool + */ + public function setstrokedashoffset ($dash_offset) {} + + /** + * Specifies the shape to be used at the end of open subpaths when they are stroked + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokelinecap.php + * @param linecap int

+ * LINECAP_ constant + *

+ * @return bool + */ + public function setstrokelinecap ($linecap) {} + + /** + * Specifies the shape to be used at the corners of paths when they are stroked + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokelinejoin.php + * @param linejoin int

+ * LINEJOIN_ constant + *

+ * @return bool + */ + public function setstrokelinejoin ($linejoin) {} + + /** + * Specifies the miter limit + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokemiterlimit.php + * @param miterlimit int

+ * the miter limit + *

+ * @return bool + */ + public function setstrokemiterlimit ($miterlimit) {} + + /** + * Specifies the opacity of stroked object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokeopacity.php + * @param stroke_opacity float

+ * stroke opacity. 1.0 is fully opaque + *

+ * @return bool + */ + public function setstrokeopacity ($stroke_opacity) {} + + /** + * Sets the vector graphics + * @link http://www.php.net/manual/en/function.imagickdraw-setvectorgraphics.php + * @param xml string

+ * xml containing the vector graphics + *

+ * @return bool Returns true on success or false on failure. + */ + public function setvectorgraphics ($xml) {} + + /** + * Destroys the current ImagickDraw in the stack, and returns to the previously pushed ImagickDraw + * @link http://www.php.net/manual/en/function.imagickdraw-pop.php + * @return bool true on success and false on failure. + */ + public function pop () {} + + /** + * Clones the current ImagickDraw and pushes it to the stack + * @link http://www.php.net/manual/en/function.imagickdraw-push.php + * @return bool Returns true on success or false on failure. + */ + public function push () {} + + /** + * Specifies the pattern of dashes and gaps used to stroke paths + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokedasharray.php + * @param dashArray array

+ * array of floats + *

+ * @return bool &imagick.return.success; + */ + public function setstrokedasharray (array $dashArray) {} + +} + +/** @jms-builtin */ +class ImagickPixelIterator implements Iterator, Traversable { + + /** + * The ImagickPixelIterator constructor + * @link http://www.php.net/manual/en/function.imagickpixeliterator-construct.php + * @param wand Imagick + * @return ImagickPixelIterator &imagick.return.success; + */ + public function __construct (Imagick $wand) {} + + /** + * Returns a new pixel iterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-newpixeliterator.php + * @param wand Imagick + * @return bool &imagick.return.success; Throwing ImagickPixelIteratorException. + */ + public function newpixeliterator (Imagick $wand) {} + + /** + * Returns a new pixel iterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-newpixelregioniterator.php + * @param wand Imagick

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @param columns int

+ *

+ * @param rows int

+ *

+ * @return bool a new ImagickPixelIterator on success; on failure, throws + * ImagickPixelIteratorException. + */ + public function newpixelregioniterator (Imagick $wand, $x, $y, $columns, $rows) {} + + /** + * Returns the current pixel iterator row + * @link http://www.php.net/manual/en/function.imagickpixeliterator-getiteratorrow.php + * @return int the integer offset of the row, throwing + * ImagickPixelIteratorException on error. + */ + public function getiteratorrow () {} + + /** + * Set the pixel iterator row + * @link http://www.php.net/manual/en/function.imagickpixeliterator-setiteratorrow.php + * @param row int

+ *

+ * @return bool &imagick.return.success; + */ + public function setiteratorrow ($row) {} + + /** + * Sets the pixel iterator to the first pixel row + * @link http://www.php.net/manual/en/function.imagickpixeliterator-setiteratorfirstrow.php + * @return bool &imagick.return.success; + */ + public function setiteratorfirstrow () {} + + /** + * Sets the pixel iterator to the last pixel row + * @link http://www.php.net/manual/en/function.imagickpixeliterator-setiteratorlastrow.php + * @return bool &imagick.return.success; + */ + public function setiteratorlastrow () {} + + /** + * Returns the previous row + * @link http://www.php.net/manual/en/function.imagickpixeliterator-getpreviousiteratorrow.php + * @return array the previous row as an array of ImagickPixelWand objects from the + * ImagickPixelIterator, throwing ImagickPixelIteratorException on error. + */ + public function getpreviousiteratorrow () {} + + /** + * Returns the current row of ImagickPixel objects + * @link http://www.php.net/manual/en/function.imagickpixeliterator-getcurrentiteratorrow.php + * @return array a row as an array of ImagickPixel objects that can themselves be iterated. + */ + public function getcurrentiteratorrow () {} + + /** + * Returns the next row of the pixel iterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-getnextiteratorrow.php + * @return array the next row as an array of ImagickPixel objects, throwing + * ImagickPixelIteratorException on error. + */ + public function getnextiteratorrow () {} + + /** + * Resets the pixel iterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-resetiterator.php + * @return bool &imagick.return.success; + */ + public function resetiterator () {} + + /** + * Syncs the pixel iterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-synciterator.php + * @return bool &imagick.return.success; + */ + public function synciterator () {} + + /** + * Deallocates resources associated with a PixelIterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-destroy.php + * @return bool &imagick.return.success; + */ + public function destroy () {} + + /** + * Clear resources associated with a PixelIterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-clear.php + * @return bool &imagick.return.success; + */ + public function clear () {} + + public function key () {} + + public function next () {} + + public function rewind () {} + + public function current () {} + + public function valid () {} + +} + +/** @jms-builtin */ +class ImagickPixel { + + /** + * Returns the normalized HSL color of the ImagickPixel object + * @link http://www.php.net/manual/en/function.imagickpixel-gethsl.php + * @return array the HSL value in an array with the keys "hue", + * "saturation", and "luminosity". Throws ImagickPixelException on failure. + */ + public function gethsl () {} + + /** + * Sets the normalized HSL color + * @link http://www.php.net/manual/en/function.imagickpixel-sethsl.php + * @param hue float

+ * The normalized value for hue, described as a fractional arc + * (between 0 and 1) of the hue circle, where the zero value is + * red. + *

+ * @param saturation float

+ * The normalized value for saturation, with 1 as full saturation. + *

+ * @param luminosity float

+ * The normalized value for luminosity, on a scale from black at + * 0 to white at 1, with the full HS value at 0.5 luminosity. + *

+ * @return bool &imagick.return.success; + */ + public function sethsl ($hue, $saturation, $luminosity) {} + + public function getcolorvaluequantum () {} + + /** + * @param color_value + */ + public function setcolorvaluequantum ($color_value) {} + + public function getindex () {} + + /** + * @param index + */ + public function setindex ($index) {} + + /** + * The ImagickPixel constructor + * @link http://www.php.net/manual/en/function.imagickpixel-construct.php + * @param color string[optional]

+ * The optional color string to use as the initial value of this object. + *

+ * @return ImagickPixel an ImagickPixel object on success, throwing ImagickPixelException on + * failure. + */ + public function __construct ($color = null) {} + + /** + * Sets the color + * @link http://www.php.net/manual/en/function.imagickpixel-setcolor.php + * @param color string

+ * The color definition to use in order to initialise the + * ImagickPixel object. + *

+ * @return bool true if the specified color was set, false otherwise. + */ + public function setcolor ($color) {} + + /** + * Sets the normalized value of one of the channels + * @link http://www.php.net/manual/en/function.imagickpixel-setcolorvalue.php + * @param color int

+ * One of the Imagick channel color constants. + *

+ * @param value float

+ * The value to set this channel to, ranging from 0 to 1. + *

+ * @return bool &imagick.return.success; + */ + public function setcolorvalue ($color, $value) {} + + /** + * Gets the normalized value of the provided color channel + * @link http://www.php.net/manual/en/function.imagickpixel-getcolorvalue.php + * @param color int

+ * The channel to check, specified as one of the Imagick channel constants. + *

+ * @return float The value of the channel, as a normalized floating-point number, throwing + * ImagickPixelException on error. + */ + public function getcolorvalue ($color) {} + + /** + * Clears resources associated with this object + * @link http://www.php.net/manual/en/function.imagickpixel-clear.php + * @return bool &imagick.return.success; + */ + public function clear () {} + + /** + * Deallocates resources associated with this object + * @link http://www.php.net/manual/en/function.imagickpixel-destroy.php + * @return bool &imagick.return.success; + */ + public function destroy () {} + + /** + * Check the distance between this color and another + * @link http://www.php.net/manual/en/function.imagickpixel-issimilar.php + * @param color ImagickPixel

+ * The ImagickPixel object to compare this object against. + *

+ * @param fuzz float

+ * The maximum distance within which to consider these colors as similar. + * The theoretical maximum for this value is the square root of three + * (1.732). + *

+ * @return bool &imagick.return.success; + */ + public function issimilar (ImagickPixel $color, $fuzz) {} + + /** + * Returns the color + * @link http://www.php.net/manual/en/function.imagickpixel-getcolor.php + * @param normalized bool[optional]

+ * Normalize the color values + *

+ * @return array An array of channel values, each normalized if true is given as param. Throws + * ImagickPixelException on error. + */ + public function getcolor ($normalized = null) {} + + /** + * Returns the color as a string + * @link http://www.php.net/manual/en/function.imagickpixel-getcolorasstring.php + * @return string the color of the ImagickPixel object as a string. + */ + public function getcolorasstring () {} + + /** + * Returns the color count associated with this color + * @link http://www.php.net/manual/en/function.imagickpixel-getcolorcount.php + * @return int the color count as an integer on success, throws + * ImagickPixelException on failure. + */ + public function getcolorcount () {} + + /** + * @param colorCount + */ + public function setcolorcount ($colorCount) {} + + public function clone () {} + +} +// End of imagick v.2.3.0 +?> diff --git a/res/php-5.2-core-api/imap.php b/res/php-5.2-core-api/imap.php new file mode 100644 index 0000000..ed18602 --- /dev/null +++ b/res/php-5.2-core-api/imap.php @@ -0,0 +1,1483 @@ +IMAP stream to a mailbox + * @link http://www.php.net/manual/en/function.imap-open.php + * @param mailbox string

+ * A mailbox name consists of a server and a mailbox path on this server. + * The special name INBOX stands for the current users + * personal mailbox. Mailbox names that contain international characters + * besides those in the printable ASCII space have to be encoded width + * imap_utf7_encode. + *

+ *

+ * The server part, which is enclosed in '{' and '}', consists of the servers + * name or ip address, an optional port (prefixed by ':'), and an optional + * protocol specification (prefixed by '/'). + *

+ *

+ * The server part is mandatory in all mailbox + * parameters. + *

+ *

+ * All names which start with { are remote names, and are + * in the form "{" remote_system_name [":" port] [flags] "}" + * [mailbox_name] where: + * remote_system_name - Internet domain name or + * bracketed IP address of server. + * @param username string

+ * The user name + *

+ * @param password string

+ * The password associated with the username + *

+ * @param options int[optional]

+ * The options are a bit mask with one or more of + * the following: + * OP_READONLY - Open mailbox read-only + * @param n_retries int[optional]

+ * Number of maximum connect attempts + *

+ * @return resource an IMAP stream on success or false on error. + * + * @jms-builtin + */ +function imap_open ($mailbox, $username, $password, $options = null, $n_retries = null) {} + +/** + * Reopen IMAP stream to new mailbox + * @link http://www.php.net/manual/en/function.imap-reopen.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param options int[optional]

+ * The options are a bit mask with one or more of + * the following: + * OP_READONLY - Open mailbox read-only + * @param n_retries int[optional]

+ * Number of maximum connect attempts + *

+ * @return bool true if the stream is reopened, false otherwise. + * + * @jms-builtin + */ +function imap_reopen ($imap_stream, $mailbox, $options = null, $n_retries = null) {} + +/** + * Close an IMAP stream + * @link http://www.php.net/manual/en/function.imap-close.php + * @param imap_stream resource + * @param flag int[optional]

+ * If set to CL_EXPUNGE, the function will silently + * expunge the mailbox before closing, removing all messages marked for + * deletion. You can achieve the same thing by using + * imap_expunge + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_close ($imap_stream, $flag = null) {} + +/** + * Gets the number of messages in the current mailbox + * @link http://www.php.net/manual/en/function.imap-num-msg.php + * @param imap_stream resource + * @return int Return the number of messages in the current mailbox, as an integer. + * + * @jms-builtin + */ +function imap_num_msg ($imap_stream) {} + +/** + * Gets the number of recent messages in current mailbox + * @link http://www.php.net/manual/en/function.imap-num-recent.php + * @param imap_stream resource + * @return int the number of recent messages in the current mailbox, as an + * integer. + * + * @jms-builtin + */ +function imap_num_recent ($imap_stream) {} + +/** + * Returns headers for all messages in a mailbox + * @link http://www.php.net/manual/en/function.imap-headers.php + * @param imap_stream resource + * @return array an array of string formatted with header info. One + * element per mail message. + * + * @jms-builtin + */ +function imap_headers ($imap_stream) {} + +/** + * Read the header of the message + * @link http://www.php.net/manual/en/function.imap-headerinfo.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param fromlength int[optional]

+ * Number of characters for the fetchfrom property. + * Must be greater than or equal to zero. + *

+ * @param subjectlength int[optional]

+ * Number of characters for the fetchsubject property + * Must be greater than or equal to zero. + *

+ * @param defaulthost string[optional]

+ *

+ * @return object the information in an object with following properties: + * toaddress - full to: line, up to 1024 characters + * to - an array of objects from the To: line, with the following + * properties: personal, adl, + * mailbox, and host + * fromaddress - full from: line, up to 1024 characters + * from - an array of objects from the From: line, with the following + * properties: personal, adl, + * mailbox, and host + * ccaddress - full cc: line, up to 1024 characters + * cc - an array of objects from the Cc: line, with the following + * properties: personal, adl, + * mailbox, and host + * bccaddress - full bcc: line, up to 1024 characters + * bcc - an array of objects from the Bcc: line, with the following + * properties: personal, adl, + * mailbox, and host + * reply_toaddress - full Reply-To: line, up to 1024 characters + * reply_to - an array of objects from the Reply-To: line, with the following + * properties: personal, adl, + * mailbox, and host + * senderaddress - full sender: line, up to 1024 characters + * sender - an array of objects from the Sender: line, with the following + * properties: personal, adl, + * mailbox, and host + * return_pathaddress - full Return-Path: line, up to 1024 characters + * return_path - an array of objects from the Return-Path: line, with the + * following properties: personal, + * adl, mailbox, and + * host + * remail - + * date - The message date as found in its headers + * Date - Same as date + * subject - The message subject + * Subject - Same a subject + * in_reply_to - + * message_id - + * newsgroups - + * followup_to - + * references - + * Recent - R if recent and seen, N + * if recent and not seen, ' ' if not recent. + * Unseen - U if not seen AND not recent, ' ' if seen + * OR not seen and recent + * Flagged - F if flagged, ' ' if not flagged + * Answered - A if answered, ' ' if unanswered + * Deleted - D if deleted, ' ' if not deleted + * Draft - X if draft, ' ' if not draft + * Msgno - The message number + * MailDate - + * Size - The message size + * udate - mail message date in Unix time + * fetchfrom - from line formatted to fit fromlength + * characters + * fetchsubject - subject line formatted to fit + * subjectlength characters + * + * @jms-builtin + */ +function imap_headerinfo ($imap_stream, $msg_number, $fromlength = null, $subjectlength = null, $defaulthost = null) {} + +/** + * Parse mail headers from a string + * @link http://www.php.net/manual/en/function.imap-rfc822-parse-headers.php + * @param headers string

+ * The parsed headers data + *

+ * @param defaulthost string[optional]

+ * The default host name + *

+ * @return object an object similar to the one returned by + * imap_header, except for the flags and other + * properties that come from the IMAP server. + * + * @jms-builtin + */ +function imap_rfc822_parse_headers ($headers, $defaulthost = null) {} + +/** + * Returns a properly formatted email address given the mailbox, host, and personal info + * @link http://www.php.net/manual/en/function.imap-rfc822-write-address.php + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param host string

+ * The email host part + *

+ * @param personal string

+ * The name of the account owner + *

+ * @return string a string properly formatted email address as defined in RFC2822. + * + * @jms-builtin + */ +function imap_rfc822_write_address ($mailbox, $host, $personal) {} + +/** + * Parses an address string + * @link http://www.php.net/manual/en/function.imap-rfc822-parse-adrlist.php + * @param address string

+ * A string containing addresses + *

+ * @param default_host string

+ * The default host name + *

+ * @return array an array of objects. The objects properties are: + *

+ *

+ * mailbox - the mailbox name (username) + * host - the host name + * personal - the personal name + * adl - at domain source route + * + * @jms-builtin + */ +function imap_rfc822_parse_adrlist ($address, $default_host) {} + +/** + * Read the message body + * @link http://www.php.net/manual/en/function.imap-body.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param options int[optional]

+ * The optional options are a bit mask + * with one or more of the following: + * FT_UID - The msg_number is a UID + * @return string the body of the specified message, as a string. + * + * @jms-builtin + */ +function imap_body ($imap_stream, $msg_number, $options = null) {} + +/** + * Read the structure of a specified body section of a specific message + * @link http://www.php.net/manual/en/function.imap-bodystruct.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param section string

+ * The body section to read + *

+ * @return object the information in an object, for a detailed description + * of the object structure and properties see + * imap_fetchstructure. + * + * @jms-builtin + */ +function imap_bodystruct ($imap_stream, $msg_number, $section) {} + +/** + * Fetch a particular section of the body of the message + * @link http://www.php.net/manual/en/function.imap-fetchbody.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param section string

+ * The part number. It is a string of integers delimited by period which + * index into a body part list as per the IMAP4 specification + *

+ * @param options int[optional]

+ * A bitmask with one or more of the following: + * FT_UID - The msg_number is a UID + * @return string a particular section of the body of the specified messages as a + * text string. + * + * @jms-builtin + */ +function imap_fetchbody ($imap_stream, $msg_number, $section, $options = null) {} + +/** + * Save a specific body section to a file + * @link http://www.php.net/manual/en/function.imap-savebody.php + * @param imap_stream resource + * @param file mixed

+ * The path to the saved file as a string, or a valid file descriptor + * returned by fopen. + *

+ * @param msg_number int

+ * The message number + *

+ * @param part_number string[optional]

+ * The part number. It is a string of integers delimited by period which + * index into a body part list as per the IMAP4 specification + *

+ * @param options int[optional]

+ * A bitmask with one or more of the following: + * FT_UID - The msg_number is a UID + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_savebody ($imap_stream, $file, $msg_number, $part_number = null, $options = null) {} + +/** + * Returns header for a message + * @link http://www.php.net/manual/en/function.imap-fetchheader.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param options int[optional]

+ * The possible options are: + * FT_UID - The msgno + * argument is a UID + * @return string the header of the specified message as a text string. + * + * @jms-builtin + */ +function imap_fetchheader ($imap_stream, $msg_number, $options = null) {} + +/** + * Read the structure of a particular message + * @link http://www.php.net/manual/en/function.imap-fetchstructure.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param options int[optional]

+ * This optional parameter only has a single option, + * FT_UID, which tells the function to treat the + * msg_number argument as a + * UID. + *

+ * @return object an object includes the envelope, internal date, size, flags and + * body structure along with a similar object for each mime attachment. The + * structure of the returned objects is as follows: + *

+ *

+ * + * Returned Objects for imap_fetchstructure + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
typePrimary body type
encodingBody transfer encoding
ifsubtypetrue if there is a subtype string
subtypeMIME subtype
ifdescriptiontrue if there is a description string
descriptionContent description string
ifidtrue if there is an identification string
idIdentification string
linesNumber of lines
bytesNumber of bytes
ifdispositiontrue if there is a disposition string
dispositionDisposition string
ifdparameterstrue if the dparameters array exists
dparametersAn array of objects where each object has an + * "attribute" and a "value" + * property corresponding to the parameters on the + * Content-disposition MIME + * header.
ifparameterstrue if the parameters array exists
parametersAn array of objects where each object has an + * "attribute" and a "value" + * property.
partsAn array of objects identical in structure to the top-level + * object, each of which corresponds to a MIME body + * part.
+ *

+ *

+ * + * Primary body type (may vary with used library) + * + * + * + * + * + * + * + * + *
0text
1multipart
2message
3application
4audio
5image
6video
7other
+ *

+ *

+ * + * Transfer encodings (may vary with used library) + * + * + * + * + * + * + *
07BIT
18BIT
2BINARY
3BASE64
4QUOTED-PRINTABLE
5OTHER
+ * + * @jms-builtin + */ +function imap_fetchstructure ($imap_stream, $msg_number, $options = null) {} + +/** + * Delete all messages marked for deletion + * @link http://www.php.net/manual/en/function.imap-expunge.php + * @param imap_stream resource + * @return bool true. + * + * @jms-builtin + */ +function imap_expunge ($imap_stream) {} + +/** + * Mark a message for deletion from current mailbox + * @link http://www.php.net/manual/en/function.imap-delete.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param options int[optional]

+ * You can set the FT_UID which tells the function + * to treat the msg_number argument as an + * UID. + *

+ * @return bool true. + * + * @jms-builtin + */ +function imap_delete ($imap_stream, $msg_number, $options = null) {} + +/** + * Unmark the message which is marked deleted + * @link http://www.php.net/manual/en/function.imap-undelete.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param flags int[optional]

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_undelete ($imap_stream, $msg_number, $flags = null) {} + +/** + * Check current mailbox + * @link http://www.php.net/manual/en/function.imap-check.php + * @param imap_stream resource + * @return object the information in an object with following properties: + * Date - current system time formatted according to RFC2822 + * Driver - protocol used to access this mailbox: + * POP3, IMAP, NNTP + * Mailbox - the mailbox name + * Nmsgs - number of messages in the mailbox + * Recent - number of recent messages in the mailbox + *

+ *

+ * Returns false on failure. + * + * @jms-builtin + */ +function imap_check ($imap_stream) {} + +/** + * Copy specified messages to a mailbox + * @link http://www.php.net/manual/en/function.imap-mail-copy.php + * @param imap_stream resource + * @param msglist string

+ * msglist is a range not just message + * numbers (as described in RFC2060). + *

+ * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param options int[optional]

+ * options is a bitmask of one or more of + * CP_UID - the sequence numbers contain UIDS + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_mail_copy ($imap_stream, $msglist, $mailbox, $options = null) {} + +/** + * Move specified messages to a mailbox + * @link http://www.php.net/manual/en/function.imap-mail-move.php + * @param imap_stream resource + * @param msglist string

+ * msglist is a range not just message numbers + * (as described in RFC2060). + *

+ * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param options int[optional]

+ * options is a bitmask and may contain the single option: + * CP_UID - the sequence numbers contain UIDS + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_mail_move ($imap_stream, $msglist, $mailbox, $options = null) {} + +/** + * Create a MIME message based on given envelope and body sections + * @link http://www.php.net/manual/en/function.imap-mail-compose.php + * @param envelope array

+ * An associative array of headers fields + *

+ * @param body array

+ * An indexed array of bodies + *

+ *

+ * A body is an associative array which can consist of the following + * keys: "type", "encoding", "subtype", "description" and "contents.data" + *

+ * @return string the MIME message. + * + * @jms-builtin + */ +function imap_mail_compose (array $envelope, array $body) {} + +/** + * Create a new mailbox + * @link http://www.php.net/manual/en/function.imap-createmailbox.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information. Names containing international characters should be + * encoded by imap_utf7_encode + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_createmailbox ($imap_stream, $mailbox) {} + +/** + * Rename an old mailbox to new mailbox + * @link http://www.php.net/manual/en/function.imap-renamemailbox.php + * @param imap_stream resource + * @param old_mbox string

+ * The old mailbox name, see imap_open for more + * information + *

+ * @param new_mbox string

+ * The new mailbox name, see imap_open for more + * information + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_renamemailbox ($imap_stream, $old_mbox, $new_mbox) {} + +/** + * Delete a mailbox + * @link http://www.php.net/manual/en/function.imap-deletemailbox.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_deletemailbox ($imap_stream, $mailbox) {} + +/** + * Subscribe to a mailbox + * @link http://www.php.net/manual/en/function.imap-subscribe.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_subscribe ($imap_stream, $mailbox) {} + +/** + * Unsubscribe from a mailbox + * @link http://www.php.net/manual/en/function.imap-unsubscribe.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_unsubscribe ($imap_stream, $mailbox) {} + +/** + * Append a string message to a specified mailbox + * @link http://www.php.net/manual/en/function.imap-append.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param message string

+ * The message to be append, as a string + *

+ *

+ * When talking to the Cyrus IMAP server, you must use "\r\n" as + * your end-of-line terminator instead of "\n" or the operation will + * fail + *

+ * @param options string[optional]

+ * If provided, the options will also be written + * to the mailbox + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_append ($imap_stream, $mailbox, $message, $options = null) {} + +/** + * Check if the IMAP stream is still active + * @link http://www.php.net/manual/en/function.imap-ping.php + * @param imap_stream resource + * @return bool true if the stream is still alive, false otherwise. + * + * @jms-builtin + */ +function imap_ping ($imap_stream) {} + +/** + * Decode BASE64 encoded text + * @link http://www.php.net/manual/en/function.imap-base64.php + * @param text string

+ * The encoded text + *

+ * @return string the decoded message as a string. + * + * @jms-builtin + */ +function imap_base64 ($text) {} + +/** + * Convert a quoted-printable string to an 8 bit string + * @link http://www.php.net/manual/en/function.imap-qprint.php + * @param string string

+ * A quoted-printable string + *

+ * @return string an 8 bits string. + * + * @jms-builtin + */ +function imap_qprint ($string) {} + +/** + * Convert an 8bit string to a quoted-printable string + * @link http://www.php.net/manual/en/function.imap-8bit.php + * @param string string

+ * The 8bit string to convert + *

+ * @return string a quoted-printable string. + * + * @jms-builtin + */ +function imap_8bit ($string) {} + +/** + * Convert an 8bit string to a base64 string + * @link http://www.php.net/manual/en/function.imap-binary.php + * @param string string

+ * The 8bit string + *

+ * @return string a base64 encoded string. + * + * @jms-builtin + */ +function imap_binary ($string) {} + +/** + * Converts MIME-encoded text to UTF-8 + * @link http://www.php.net/manual/en/function.imap-utf8.php + * @param mime_encoded_text string

+ * A MIME encoded string. MIME encoding method and the UTF-8 + * specification are described in RFC2047 and RFC2044 respectively. + *

+ * @return string an UTF-8 encoded string. + * + * @jms-builtin + */ +function imap_utf8 ($mime_encoded_text) {} + +/** + * Returns status information on a mailbox + * @link http://www.php.net/manual/en/function.imap-status.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param options int

+ * Valid flags are: + * SA_MESSAGES - set $status->messages to the + * number of messages in the mailbox + * @return object This function returns an object containing status information. + * The object has the following properties: messages, + * recent, unseen, + * uidnext, and uidvalidity. + *

+ *

+ * flags is also set, which contains a bitmask which can + * be checked against any of the above constants. + * + * @jms-builtin + */ +function imap_status ($imap_stream, $mailbox, $options) {} + +/** + * Get information about the current mailbox + * @link http://www.php.net/manual/en/function.imap-mailboxmsginfo.php + * @param imap_stream resource + * @return object the information in an object with following properties: + * + * Mailbox properties + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Datedate of last change (current datetime)
Driverdriver
Mailboxname of the mailbox
Nmsgsnumber of messages
Recentnumber of recent messages
Unreadnumber of unread messages
Deletednumber of deleted messages
Sizemailbox size
+ *

+ *

+ * Returns false on failure. + * + * @jms-builtin + */ +function imap_mailboxmsginfo ($imap_stream) {} + +/** + * Sets flags on messages + * @link http://www.php.net/manual/en/function.imap-setflag-full.php + * @param imap_stream resource + * @param sequence string

+ * A sequence of message numbers. You can enumerate desired messages + * with the X,Y syntax, or retrieve all messages + * within an interval with the X:Y syntax + *

+ * @param flag string

+ * The flags which you can set are \Seen, + * \Answered, \Flagged, + * \Deleted, and \Draft as + * defined by RFC2060. + *

+ * @param options int[optional]

+ * A bit mask that may contain the single option: + * ST_UID - The sequence argument contains UIDs + * instead of sequence numbers + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_setflag_full ($imap_stream, $sequence, $flag, $options = null) {} + +/** + * Clears flags on messages + * @link http://www.php.net/manual/en/function.imap-clearflag-full.php + * @param imap_stream resource + * @param sequence string

+ * A sequence of message numbers. You can enumerate desired messages + * with the X,Y syntax, or retrieve all messages + * within an interval with the X:Y syntax + *

+ * @param flag string

+ * The flags which you can unset are "\\Seen", "\\Answered", "\\Flagged", + * "\\Deleted", and "\\Draft" (as defined by RFC2060) + *

+ * @param options int[optional]

+ * options are a bit mask and may contain + * the single option: + * ST_UID - The sequence argument contains UIDs + * instead of sequence numbers + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_clearflag_full ($imap_stream, $sequence, $flag, $options = null) {} + +/** + * Gets and sort messages + * @link http://www.php.net/manual/en/function.imap-sort.php + * @param imap_stream resource + * @param criteria int

+ * Criteria can be one (and only one) of the following: + * SORTDATE - message Date + * @param reverse int

+ * Set this to 1 for reverse sorting + *

+ * @param options int[optional]

+ * The options are a bitmask of one or more of the + * following: + * SE_UID - Return UIDs instead of sequence numbers + * @param search_criteria string[optional]

+ *

+ * @param charset string[optional]

+ *

+ * @return array an array of message numbers sorted by the given + * parameters. + * + * @jms-builtin + */ +function imap_sort ($imap_stream, $criteria, $reverse, $options = null, $search_criteria = null, $charset = null) {} + +/** + * This function returns the UID for the given message sequence number + * @link http://www.php.net/manual/en/function.imap-uid.php + * @param imap_stream resource + * @param msg_number int

+ * The message number. + *

+ * @return int The UID of the given message. + * + * @jms-builtin + */ +function imap_uid ($imap_stream, $msg_number) {} + +/** + * Gets the message sequence number for the given UID + * @link http://www.php.net/manual/en/function.imap-msgno.php + * @param imap_stream resource + * @param uid int

+ * The message UID + *

+ * @return int the message sequence number for the given + * uid. + * + * @jms-builtin + */ +function imap_msgno ($imap_stream, $uid) {} + +/** + * Read the list of mailboxes + * @link http://www.php.net/manual/en/function.imap-list.php + * @param imap_stream resource + * @param ref string

+ * ref should normally be just the server + * specification as described in imap_open. + *

+ * @param pattern string &imap.pattern; + * @return array an array containing the names of the mailboxes. + * + * @jms-builtin + */ +function imap_list ($imap_stream, $ref, $pattern) {} + +/** + * List all the subscribed mailboxes + * @link http://www.php.net/manual/en/function.imap-lsub.php + * @param imap_stream resource + * @param ref string

+ * ref should normally be just the server + * specification as described in imap_open + *

+ * @param pattern string &imap.pattern; + * @return array an array of all the subscribed mailboxes. + * + * @jms-builtin + */ +function imap_lsub ($imap_stream, $ref, $pattern) {} + +/** + * Read an overview of the information in the headers of the given message + * @link http://www.php.net/manual/en/function.imap-fetch-overview.php + * @param imap_stream resource + * @param sequence string

+ * A message sequence description. You can enumerate desired messages + * with the X,Y syntax, or retrieve all messages + * within an interval with the X:Y syntax + *

+ * @param options int[optional]

+ * sequence will contain a sequence of message + * indices or UIDs, if this parameter is set to + * FT_UID. + *

+ * @return array an array of objects describing one message header each. + * The object will only define a property if it exists. The possible + * properties are: + * subject - the messages subject + * from - who sent it + * to - recipient + * date - when was it sent + * message_id - Message-ID + * references - is a reference to this message id + * in_reply_to - is a reply to this message id + * size - size in bytes + * uid - UID the message has in the mailbox + * msgno - message sequence number in the mailbox + * recent - this message is flagged as recent + * flagged - this message is flagged + * answered - this message is flagged as answered + * deleted - this message is flagged for deletion + * seen - this message is flagged as already read + * draft - this message is flagged as being a draft + * + * @jms-builtin + */ +function imap_fetch_overview ($imap_stream, $sequence, $options = null) {} + +/** + * Returns all IMAP alert messages that have occurred + * @link http://www.php.net/manual/en/function.imap-alerts.php + * @return array an array of all of the IMAP alert messages generated or false if + * no alert messages are available. + * + * @jms-builtin + */ +function imap_alerts () {} + +/** + * Returns all of the IMAP errors that have occured + * @link http://www.php.net/manual/en/function.imap-errors.php + * @return array This function returns an array of all of the IMAP error messages + * generated since the last imap_errors call, + * or the beginning of the page. Returns false if no error messages are + * available. + * + * @jms-builtin + */ +function imap_errors () {} + +/** + * Gets the last IMAP error that occurred during this page request + * @link http://www.php.net/manual/en/function.imap-last-error.php + * @return string the full text of the last IMAP error message that occurred on the + * current page. Returns false if no error messages are available. + * + * @jms-builtin + */ +function imap_last_error () {} + +/** + * This function returns an array of messages matching the given search criteria + * @link http://www.php.net/manual/en/function.imap-search.php + * @param imap_stream resource + * @param criteria string

+ * A string, delimited by spaces, in which the following keywords are + * allowed. Any multi-word arguments (e.g. + * FROM "joey smith") must be quoted. + * ALL - return all messages matching the rest of the criteria + * @param options int[optional]

+ * Valid values for options are + * SE_UID, which causes the returned array to + * contain UIDs instead of messages sequence numbers. + *

+ * @param charset string[optional]

+ *

+ * @return array an array of message numbers or UIDs. + *

+ *

+ * Return false if it does not understand the search + * criteria or no messages have been found. + * + * @jms-builtin + */ +function imap_search ($imap_stream, $criteria, $options = null, $charset = null) {} + +/** + * Decodes a modified UTF-7 encoded string + * @link http://www.php.net/manual/en/function.imap-utf7-decode.php + * @param text string

+ * A modified UTF-7 encoding string, as defined in RFC 2060, section 5.1.3 (original UTF-7 + * was defined in RFC1642). + *

+ * @return string a string that is encoded in ISO-8859-1 and consists of the same + * sequence of characters in text, or false + * if text contains invalid modified UTF-7 sequence + * or text contains a character that is not part of + * ISO-8859-1 character set. + * + * @jms-builtin + */ +function imap_utf7_decode ($text) {} + +/** + * Converts ISO-8859-1 string to modified UTF-7 text + * @link http://www.php.net/manual/en/function.imap-utf7-encode.php + * @param data string

+ * An ISO-8859-1 string. + *

+ * @return string data encoded with the modified UTF-7 + * encoding as defined in RFC 2060, + * section 5.1.3 (original UTF-7 was defined in RFC1642). + * + * @jms-builtin + */ +function imap_utf7_encode ($data) {} + +/** + * Decode MIME header elements + * @link http://www.php.net/manual/en/function.imap-mime-header-decode.php + * @param text string

+ * The MIME text + *

+ * @return array The decoded elements are returned in an array of objects, where each + * object has two properties, charset and + * text. + *

+ *

+ * If the element hasn't been encoded, and in other words is in + * plain US-ASCII, the charset property of that element is + * set to default. + * + * @jms-builtin + */ +function imap_mime_header_decode ($text) {} + +/** + * Returns a tree of threaded message + * @link http://www.php.net/manual/en/function.imap-thread.php + * @param imap_stream resource + * @param options int[optional]

+ *

+ * @return array imap_thread returns an associative array containing + * a tree of messages threaded by REFERENCES, or false + * on error. + *

+ *

+ * Every message in the current mailbox will be represented by three entries + * in the resulting array: + *

+ * $thread["XX.num"] - current message number + *

+ *

+ * $thread["XX.next"] + *

+ *

+ * $thread["XX.branch"] + *

+ * + * @jms-builtin + */ +function imap_thread ($imap_stream, $options = null) {} + +/** + * Set or fetch imap timeout + * @link http://www.php.net/manual/en/function.imap-timeout.php + * @param timeout_type int

+ * One of the following: + * IMAP_OPENTIMEOUT, + * IMAP_READTIMEOUT, + * IMAP_WRITETIMEOUT, or + * IMAP_CLOSETIMEOUT. + *

+ * @param timeout int[optional]

+ * The timeout, in seconds. + *

+ * @return mixed If the timeout parameter is set, this function + * returns true on success and false on failure. + *

+ *

+ * If timeout is not provided or evaluates to -1, + * the current timeout value of timeout_type is + * returned as an integer. + * + * @jms-builtin + */ +function imap_timeout ($timeout_type, $timeout = null) {} + +/** + * Retrieve the quota level settings, and usage statics per mailbox + * @link http://www.php.net/manual/en/function.imap-get-quota.php + * @param imap_stream resource + * @param quota_root string

+ * quota_root should normally be in the form of + * user.name where name is the mailbox you wish to + * retrieve information about. + *

+ * @return array an array with integer values limit and usage for the given + * mailbox. The value of limit represents the total amount of space + * allowed for this mailbox. The usage value represents the mailboxes + * current level of capacity. Will return false in the case of failure. + *

+ *

+ * As of PHP 4.3, the function more properly reflects the + * functionality as dictated by the RFC2087. + * The array return value has changed to support an unlimited number of returned + * resources (i.e. messages, or sub-folders) with each named resource receiving + * an individual array key. Each key value then contains an another array with + * the usage and limit values within it. + *

+ *

+ * For backwards compatibility reasons, the original access methods are + * still available for use, although it is suggested to update. + * + * @jms-builtin + */ +function imap_get_quota ($imap_stream, $quota_root) {} + +/** + * Retrieve the quota settings per user + * @link http://www.php.net/manual/en/function.imap-get-quotaroot.php + * @param imap_stream resource + * @param quota_root string

+ * quota_root should normally be in the form of + * which mailbox (i.e. INBOX). + *

+ * @return array an array of integer values pertaining to the specified user + * mailbox. All values contain a key based upon the resource name, and a + * corresponding array with the usage and limit values within. + *

+ *

+ * This function will return false in the case of call failure, and an + * array of information about the connection upon an un-parsable response + * from the server. + * + * @jms-builtin + */ +function imap_get_quotaroot ($imap_stream, $quota_root) {} + +/** + * Sets a quota for a given mailbox + * @link http://www.php.net/manual/en/function.imap-set-quota.php + * @param imap_stream resource + * @param quota_root string

+ * The mailbox to have a quota set. This should follow the IMAP standard + * format for a mailbox: user.name. + *

+ * @param quota_limit int

+ * The maximum size (in KB) for the quota_root + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_set_quota ($imap_stream, $quota_root, $quota_limit) {} + +/** + * Sets the ACL for a giving mailbox + * @link http://www.php.net/manual/en/function.imap-setacl.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param id string

+ * The user to give the rights to. + *

+ * @param rights string

+ * The rights to give to the user. Passing an empty string will delete + * acl. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_setacl ($imap_stream, $mailbox, $id, $rights) {} + +/** + * Gets the ACL for a given mailbox + * @link http://www.php.net/manual/en/function.imap-getacl.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @return array an associative array of "folder" => "acl" pairs. + * + * @jms-builtin + */ +function imap_getacl ($imap_stream, $mailbox) {} + +/** + * Send an email message + * @link http://www.php.net/manual/en/function.imap-mail.php + * @param to string

+ * The receiver + *

+ * @param subject string

+ * The mail subject + *

+ * @param message string

+ * The mail body + *

+ * @param additional_headers string[optional]

+ * As string with additional headers to be set on the mail + *

+ * @param cc string[optional]

+ *

+ * @param bcc string[optional]

+ * The receivers specified in bcc will get the + * mail, but are excluded from the headers. + *

+ * @param rpath string[optional]

+ * Use this parameter to specify return path upon mail delivery failure. + * This is useful when using PHP as a mail client for multiple users. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_mail ($to, $subject, $message, $additional_headers = null, $cc = null, $bcc = null, $rpath = null) {} + +/** + * &Alias; imap_headerinfo + * @link http://www.php.net/manual/en/function.imap-header.php + * + * @jms-builtin + */ +function imap_header () {} + +/** + * &Alias; imap_list + * @link http://www.php.net/manual/en/function.imap-listmailbox.php + * + * @jms-builtin + */ +function imap_listmailbox () {} + +/** + * Read the list of mailboxes, returning detailed information on each one + * @link http://www.php.net/manual/en/function.imap-getmailboxes.php + * @param imap_stream resource + * @param ref string

+ * ref should normally be just the server + * specification as described in imap_open + *

+ * @param pattern string &imap.pattern; + * @return array an array of objects containing mailbox information. Each + * object has the attributes name, specifying + * the full name of the mailbox; delimiter, + * which is the hierarchy delimiter for the part of the hierarchy + * this mailbox is in; and + * attributes. Attributes + * is a bitmask that can be tested against: + *

+ * LATT_NOINFERIORS - This mailbox contains, and may not contain any + * "children" (there are no mailboxes below this one). Calling + * imap_createmailbox will not work on this mailbox. + *

+ *

+ * LATT_NOSELECT - This is only a container, + * not a mailbox - you cannot open it. + *

+ *

+ * LATT_MARKED - This mailbox is marked. This means that it may + * contain new messages since the last time it was checked. Not provided by all IMAP + * servers. + *

+ *

+ * LATT_UNMARKED - This mailbox is not marked, does not contain new + * messages. If either MARKED or UNMARKED is + * provided, you can assume the IMAP server supports this feature for this mailbox. + *

+ * + * @jms-builtin + */ +function imap_getmailboxes ($imap_stream, $ref, $pattern) {} + +/** + * &Alias; imap_listscan + * @link http://www.php.net/manual/en/function.imap-scanmailbox.php + * + * @jms-builtin + */ +function imap_scanmailbox () {} + +/** + * &Alias; imap_lsub + * @link http://www.php.net/manual/en/function.imap-listsubscribed.php + * + * @jms-builtin + */ +function imap_listsubscribed () {} + +/** + * List all the subscribed mailboxes + * @link http://www.php.net/manual/en/function.imap-getsubscribed.php + * @param imap_stream resource + * @param ref string

+ * ref should normally be just the server + * specification as described in imap_open + *

+ * @param pattern string &imap.pattern; + * @return array an array of objects containing mailbox information. Each + * object has the attributes name, specifying + * the full name of the mailbox; delimiter, + * which is the hierarchy delimiter for the part of the hierarchy + * this mailbox is in; and + * attributes. Attributes + * is a bitmask that can be tested against: + * LATT_NOINFERIORS - This mailbox has no + * "children" (there are no mailboxes below this one). + * LATT_NOSELECT - This is only a container, + * not a mailbox - you cannot open it. + * LATT_MARKED - This mailbox is marked. + * Only used by UW-IMAPD. + * LATT_UNMARKED - This mailbox is not marked. + * Only used by UW-IMAPD. + * + * @jms-builtin + */ +function imap_getsubscribed ($imap_stream, $ref, $pattern) {} + +function imap_fetchtext () {} + +function imap_scan () {} + +function imap_create () {} + +function imap_rename () {} + +define ('NIL', 0); +define ('IMAP_OPENTIMEOUT', 1); +define ('IMAP_READTIMEOUT', 2); +define ('IMAP_WRITETIMEOUT', 3); +define ('IMAP_CLOSETIMEOUT', 4); +define ('OP_DEBUG', 1); +define ('OP_READONLY', 2); +define ('OP_ANONYMOUS', 4); +define ('OP_SHORTCACHE', 8); +define ('OP_SILENT', 16); +define ('OP_PROTOTYPE', 32); +define ('OP_HALFOPEN', 64); +define ('OP_EXPUNGE', 128); +define ('OP_SECURE', 256); +define ('CL_EXPUNGE', 32768); +define ('FT_UID', 1); +define ('FT_PEEK', 2); +define ('FT_NOT', 4); +define ('FT_INTERNAL', 8); +define ('FT_PREFETCHTEXT', 32); +define ('ST_UID', 1); +define ('ST_SILENT', 2); +define ('ST_SET', 4); +define ('CP_UID', 1); +define ('CP_MOVE', 2); +define ('SE_UID', 1); +define ('SE_FREE', 2); +define ('SE_NOPREFETCH', 4); +define ('SO_FREE', 8); +define ('SO_NOSERVER', 16); +define ('SA_MESSAGES', 1); +define ('SA_RECENT', 2); +define ('SA_UNSEEN', 4); +define ('SA_UIDNEXT', 8); +define ('SA_UIDVALIDITY', 16); +define ('SA_ALL', 31); +define ('LATT_NOINFERIORS', 1); +define ('LATT_NOSELECT', 2); +define ('LATT_MARKED', 4); +define ('LATT_UNMARKED', 8); +define ('LATT_REFERRAL', 16); +define ('LATT_HASCHILDREN', 32); +define ('LATT_HASNOCHILDREN', 64); +define ('SORTDATE', 0); +define ('SORTARRIVAL', 1); +define ('SORTFROM', 2); +define ('SORTSUBJECT', 3); +define ('SORTTO', 4); +define ('SORTCC', 5); +define ('SORTSIZE', 6); +define ('TYPETEXT', 0); +define ('TYPEMULTIPART', 1); +define ('TYPEMESSAGE', 2); +define ('TYPEAPPLICATION', 3); +define ('TYPEAUDIO', 4); +define ('TYPEIMAGE', 5); +define ('TYPEVIDEO', 6); +define ('TYPEMODEL', 7); +define ('TYPEOTHER', 8); +define ('ENC7BIT', 0); +define ('ENC8BIT', 1); +define ('ENCBINARY', 2); +define ('ENCBASE64', 3); +define ('ENCQUOTEDPRINTABLE', 4); +define ('ENCOTHER', 5); + +// End of imap v. +?> diff --git a/res/php-5.2-core-api/intl.php b/res/php-5.2-core-api/intl.php new file mode 100644 index 0000000..b989ec4 --- /dev/null +++ b/res/php-5.2-core-api/intl.php @@ -0,0 +1,2088 @@ + + * The locale containing the required collation rules. Special values for + * locales can be passed in - if null is passed for the locale, the + * default locale collation rules will be used. If empty string ("") or + * "root" are passed, UCA rules will be used. + *

+ * @return Collator Return new instance of Collator object, or &null; + * on error. + */ + public static function create ($locale) {} + + /** + * Compare two Unicode strings + * @link http://www.php.net/manual/en/collator.compare.php + * @param str1 string

+ * The first string to compare. + *

+ * @param str2 string

+ * The second string to compare. + *

+ * @return int Return comparison result:

+ *

+ *

+ * 1 if str1 is greater than + * str2 ; + *

+ *

+ * 0 if str1 is equal to + * str2; + *

+ *

+ * -1 if str1 is less than + * str2 . + *

+ * On error + * boolean + * false + * is returned. + */ + public function compare ($str1, $str2) {} + + /** + * Sort array using specified collator + * @link http://www.php.net/manual/en/collator.sort.php + * @param arr array

+ * Array of strings to sort. + *

+ * @param sort_flag int[optional]

+ * Optional sorting type, one of the following: + *

+ *

+ *

+ * Collator::SORT_REGULAR + * - compare items normally (don't change types) + *

+ * @return bool Returns true on success or false on failure. + */ + public function sort (array &$arr, $sort_flag = null) {} + + /** + * Sort array using specified collator and sort keys + * @link http://www.php.net/manual/en/collator.sortwithsortkeys.php + * @param arr array

Array of strings to sort

+ * @return bool Returns true on success or false on failure. + */ + public function sortWithSortKeys (array &$arr) {} + + /** + * Sort array maintaining index association + * @link http://www.php.net/manual/en/collator.asort.php + * @param arr array

Array of strings to sort.

+ * @param sort_flag int[optional]

+ * Optional sorting type, one of the following: + *

+ * Collator::SORT_REGULAR + * - compare items normally (don't change types) + *

+ * @return bool Returns true on success or false on failure. + */ + public function asort (array &$arr, $sort_flag = null) {} + + /** + * Get collation attribute value + * @link http://www.php.net/manual/en/collator.getattribute.php + * @param attr int

+ * Attribute to get value for. + *

+ * @return int Attribute value, or boolean false on error. + */ + public function getAttribute ($attr) {} + + /** + * Set collation attribute + * @link http://www.php.net/manual/en/collator.setattribute.php + * @param attr int

Attribute.

+ * @param val int

+ * Attribute value. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setAttribute ($attr, $val) {} + + /** + * Get current collation strength + * @link http://www.php.net/manual/en/collator.getstrength.php + * @return int current collation strength, or boolean false on error. + */ + public function getStrength () {} + + /** + * Set collation strength + * @link http://www.php.net/manual/en/collator.setstrength.php + * @param strength int

Strength to set.

+ *

+ * Possible values are: + *

+ * Collator::PRIMARY + *

+ * @return bool Returns true on success or false on failure. + */ + public function setStrength ($strength) {} + + /** + * Get the locale name of the collator + * @link http://www.php.net/manual/en/collator.getlocale.php + * @param type int[optional]

+ * You can choose between valid and actual locale ( + * Locale::VALID_LOCALE and + * Locale::ACTUAL_LOCALE, + * respectively). The default is the actual locale. + *

+ * @return string Real locale name from which the collation data comes. If the collator was + * instantiated from rules or an error occurred, returns + * boolean false. + */ + public function getLocale ($type = null) {} + + /** + * Get collator's last error code + * @link http://www.php.net/manual/en/collator.geterrorcode.php + * @return int Error code returned by the last Collator API function call. + */ + public function getErrorCode () {} + + /** + * Get text for collator's last error code + * @link http://www.php.net/manual/en/collator.geterrormessage.php + * @return string Description of an error occurred in the last Collator API function call. + */ + public function getErrorMessage () {} + +} + +/** @jms-builtin */ +class NumberFormatter { + const PATTERN_DECIMAL = 0; + const DECIMAL = 1; + const CURRENCY = 2; + const PERCENT = 3; + const SCIENTIFIC = 4; + const SPELLOUT = 5; + const ORDINAL = 6; + const DURATION = 7; + const PATTERN_RULEBASED = 8; + const IGNORE = 0; + const DEFAULT_STYLE = 1; + const ROUND_CEILING = 0; + const ROUND_FLOOR = 1; + const ROUND_DOWN = 2; + const ROUND_UP = 3; + const ROUND_HALFEVEN = 4; + const ROUND_HALFDOWN = 5; + const ROUND_HALFUP = 6; + const PAD_BEFORE_PREFIX = 0; + const PAD_AFTER_PREFIX = 1; + const PAD_BEFORE_SUFFIX = 2; + const PAD_AFTER_SUFFIX = 3; + const PARSE_INT_ONLY = 0; + const GROUPING_USED = 1; + const DECIMAL_ALWAYS_SHOWN = 2; + const MAX_INTEGER_DIGITS = 3; + const MIN_INTEGER_DIGITS = 4; + const INTEGER_DIGITS = 5; + const MAX_FRACTION_DIGITS = 6; + const MIN_FRACTION_DIGITS = 7; + const FRACTION_DIGITS = 8; + const MULTIPLIER = 9; + const GROUPING_SIZE = 10; + const ROUNDING_MODE = 11; + const ROUNDING_INCREMENT = 12; + const FORMAT_WIDTH = 13; + const PADDING_POSITION = 14; + const SECONDARY_GROUPING_SIZE = 15; + const SIGNIFICANT_DIGITS_USED = 16; + const MIN_SIGNIFICANT_DIGITS = 17; + const MAX_SIGNIFICANT_DIGITS = 18; + const LENIENT_PARSE = 19; + const POSITIVE_PREFIX = 0; + const POSITIVE_SUFFIX = 1; + const NEGATIVE_PREFIX = 2; + const NEGATIVE_SUFFIX = 3; + const PADDING_CHARACTER = 4; + const CURRENCY_CODE = 5; + const DEFAULT_RULESET = 6; + const PUBLIC_RULESETS = 7; + const DECIMAL_SEPARATOR_SYMBOL = 0; + const GROUPING_SEPARATOR_SYMBOL = 1; + const PATTERN_SEPARATOR_SYMBOL = 2; + const PERCENT_SYMBOL = 3; + const ZERO_DIGIT_SYMBOL = 4; + const DIGIT_SYMBOL = 5; + const MINUS_SIGN_SYMBOL = 6; + const PLUS_SIGN_SYMBOL = 7; + const CURRENCY_SYMBOL = 8; + const INTL_CURRENCY_SYMBOL = 9; + const MONETARY_SEPARATOR_SYMBOL = 10; + const EXPONENTIAL_SYMBOL = 11; + const PERMILL_SYMBOL = 12; + const PAD_ESCAPE_SYMBOL = 13; + const INFINITY_SYMBOL = 14; + const NAN_SYMBOL = 15; + const SIGNIFICANT_DIGIT_SYMBOL = 16; + const MONETARY_GROUPING_SEPARATOR_SYMBOL = 17; + const TYPE_DEFAULT = 0; + const TYPE_INT32 = 1; + const TYPE_INT64 = 2; + const TYPE_DOUBLE = 3; + const TYPE_CURRENCY = 4; + + + /** + * @param locale + * @param style + * @param pattern[optional] + */ + public function __construct ($locale, $style, $pattern) {} + + /** + * Create a number formatter + * @link http://www.php.net/manual/en/numberformatter.create.php + * @param locale string

+ * Locale in which the number would be formatted (locale name, e.g. en_CA). + *

+ * @param style int

+ * Style of the formatting, one of the + * format style constants. If + * NumberFormatter::PATTERN_DECIMAL + * or NumberFormatter::PATTERN_RULEBASED + * is passed then the number format is opened using the given pattern, + * which must conform to the syntax described in + * ICU DecimalFormat + * documentation or + * ICU RuleBasedNumberFormat + * documentation, respectively. + *

+ * @param pattern string[optional]

+ * Pattern string in case chosen style requires pattern. + *

+ * @return NumberFormatter NumberFormatter object or false on error. + */ + public static function create ($locale, $style, $pattern = null) {} + + /** + * Format a number + * @link http://www.php.net/manual/en/numberformatter.format.php + * @param value number

+ * The value to format. Can be integer or double, + * other values will be converted to a numeric value. + *

+ * @param type int[optional]

+ * The + * formatting type to use. + *

+ * @return string the string containing formatted value, or false on error. + */ + public function format ($value, $type = null) {} + + /** + * Parse a number + * @link http://www.php.net/manual/en/numberformatter.parse.php + * @param value string + * @param type int[optional]

+ * The + * formatting type to use. By default, + * NumberFormatter::TYPE_DOUBLE is used. + *

+ * @param position int[optional]

+ * Offset in the string at which to begin parsing. On return, this value + * will hold the offset at which parsing ended. + *

+ * @return mixed The value of the parsed number or false on error. + */ + public function parse ($value, $type = null, &$position = null) {} + + /** + * Format a currency value + * @link http://www.php.net/manual/en/numberformatter.formatcurrency.php + * @param value float

+ * The numeric currency value. + *

+ * @param currency string

+ * The 3-letter ISO 4217 currency code indicating the currency to use. + *

+ * @return string String representing the formatted currency value. + */ + public function formatCurrency ($value, $currency) {} + + /** + * Parse a currency number + * @link http://www.php.net/manual/en/numberformatter.parsecurrency.php + * @param value string + * @param currency string

+ * Parameter to receive the currency name (3-letter ISO 4217 currency + * code). + *

+ * @param position int[optional]

+ * Offset in the string at which to begin parsing. On return, this value + * will hold the offset at which parsing ended. + *

+ * @return float The parsed numeric value or false on error. + */ + public function parseCurrency ($value, &$currency, &$position = null) {} + + /** + * Set an attribute + * @link http://www.php.net/manual/en/numberformatter.setattribute.php + * @param attr int

+ * Attribute specifier - one of the + * numeric attribute constants. + *

+ * @param value int

+ * The attribute value. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setAttribute ($attr, $value) {} + + /** + * Get an attribute + * @link http://www.php.net/manual/en/numberformatter.getattribute.php + * @param attr int

+ * Attribute specifier - one of the + * numeric attribute constants. + *

+ * @return int Return attribute value on success, or false on error. + */ + public function getAttribute ($attr) {} + + /** + * Set a text attribute + * @link http://www.php.net/manual/en/numberformatter.settextattribute.php + * @param attr int

+ * Attribute specifier - one of the + * text attribute + * constants. + *

+ * @param value string

+ * Text for the attribute value. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setTextAttribute ($attr, $value) {} + + /** + * Get a text attribute + * @link http://www.php.net/manual/en/numberformatter.gettextattribute.php + * @param attr int

+ * Attribute specifier - one of the + * text attribute constants. + *

+ * @return string Return attribute value on success, or false on error. + */ + public function getTextAttribute ($attr) {} + + /** + * Set a symbol value + * @link http://www.php.net/manual/en/numberformatter.setsymbol.php + * @param attr int

+ * Symbol specifier, one of the + * format symbol constants. + *

+ * @param value string

+ * Text for the symbol. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setSymbol ($attr, $value) {} + + /** + * Get a symbol value + * @link http://www.php.net/manual/en/numberformatter.getsymbol.php + * @param attr int

+ * Symbol specifier, one of the + * format symbol constants. + *

+ * @return string The symbol string or false on error. + */ + public function getSymbol ($attr) {} + + /** + * Set formatter pattern + * @link http://www.php.net/manual/en/numberformatter.setpattern.php + * @param pattern string

+ * Pattern in syntax described in + * ICU DecimalFormat + * documentation. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setPattern ($pattern) {} + + /** + * Get formatter pattern + * @link http://www.php.net/manual/en/numberformatter.getpattern.php + * @return string Pattern string that is used by the formatter, or false if an error happens. + */ + public function getPattern () {} + + /** + * Get formatter locale + * @link http://www.php.net/manual/en/numberformatter.getlocale.php + * @param type int[optional]

+ * You can choose between valid and actual locale ( + * Locale::VALID_LOCALE, + * Locale::ACTUAL_LOCALE, + * respectively). The default is the actual locale. + *

+ * @return string The locale name used to create the formatter. + */ + public function getLocale ($type = null) {} + + /** + * Get formatter's last error code. + * @link http://www.php.net/manual/en/numberformatter.geterrorcode.php + * @return int error code from last formatter call. + */ + public function getErrorCode () {} + + /** + * Get formatter's last error message. + * @link http://www.php.net/manual/en/numberformatter.geterrormessage.php + * @return string error message from last formatter call. + */ + public function getErrorMessage () {} + +} + +/** @jms-builtin */ +class Normalizer { + const NONE = 1; + const FORM_D = 2; + const NFD = 2; + const FORM_KD = 3; + const NFKD = 3; + const FORM_C = 4; + const NFC = 4; + const FORM_KC = 5; + const NFKC = 5; + + + /** + * Normalizes the input provided and returns the normalized string + * @link http://www.php.net/manual/en/normalizer.normalize.php + * @param input string

The input string to normalize

+ * @param form string[optional]

One of the normalization forms.

+ * @return string The normalized string or &null; if an error occurred. + */ + public static function normalize ($input, $form = null) {} + + /** + * Checks if the provided string is already in the specified normalization + form. + * @link http://www.php.net/manual/en/normalizer.isnormalized.php + * @param input string

The input string to normalize

+ * @param form string[optional]

+ * One of the normalization forms. + *

+ * @return bool true if normalized, false otherwise or if there an error + */ + public static function isNormalized ($input, $form = null) {} + +} + +/** @jms-builtin */ +class Locale { + const ACTUAL_LOCALE = 0; + const VALID_LOCALE = 1; + const DEFAULT_LOCALE = null; + const LANG_TAG = "language"; + const EXTLANG_TAG = "extlang"; + const SCRIPT_TAG = "script"; + const REGION_TAG = "region"; + const VARIANT_TAG = "variant"; + const GRANDFATHERED_LANG_TAG = "grandfathered"; + const PRIVATE_TAG = "private"; + + + /** + * Gets the default locale value from the INTL global 'default_locale' + * @link http://www.php.net/manual/en/locale.getdefault.php + * @return string The current runtime locale + */ + public static function getDefault () {} + + /** + * sets the default runtime locale + * @link http://www.php.net/manual/en/locale.setdefault.php + * @param locale string

+ * Is a BCP 47 compliant language tag containing the + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setDefault ($locale) {} + + /** + * Gets the primary language for the input locale + * @link http://www.php.net/manual/en/locale.getprimarylanguage.php + * @param locale string

+ * The locale to extract the primary language code from + *

+ * @return string The language code associated with the language or &null; in case of error. + */ + public static function getPrimaryLanguage ($locale) {} + + /** + * Gets the script for the input locale + * @link http://www.php.net/manual/en/locale.getscript.php + * @param locale string

+ * The locale to extract the script code from + *

+ * @return string The script subtag for the locale or &null; if not present + */ + public static function getScript ($locale) {} + + /** + * Gets the region for the input locale + * @link http://www.php.net/manual/en/locale.getregion.php + * @param locale string

+ * The locale to extract the region code from + *

+ * @return string The region subtag for the locale or &null; if not present + */ + public static function getRegion ($locale) {} + + /** + * Gets the keywords for the input locale + * @link http://www.php.net/manual/en/locale.getkeywords.php + * @param locale string

+ * The locale to extract the keywords from + *

+ * @return array Associative array containing the keyword-value pairs for this locale + */ + public static function getKeywords ($locale) {} + + /** + * Returns an appropriately localized display name for script of the input locale + * @link http://www.php.net/manual/en/locale.getdisplayscript.php + * @param locale string

+ * The locale to return a display script for + *

+ * @param in_locale string[optional]

+ * Optional format locale to use to display the script name + *

+ * @return string Display name of the script for the $locale in the format appropriate for + * $in_locale. + */ + public static function getDisplayScript ($locale, $in_locale = null) {} + + /** + * Returns an appropriately localized display name for region of the input locale + * @link http://www.php.net/manual/en/locale.getdisplayregion.php + * @param locale string

+ * The locale to return a display region for. + *

+ * @param in_locale string[optional]

+ * Optional format locale to use to display the region name + *

+ * @return string display name of the region for the $locale in the format appropriate for + * $in_locale. + */ + public static function getDisplayRegion ($locale, $in_locale = null) {} + + /** + * Returns an appropriately localized display name for the input locale + * @link http://www.php.net/manual/en/locale.getdisplayname.php + * @param locale string

+ * The locale to return a display name for. + *

+ * @param in_locale string[optional]

optional format locale

+ * @return string Display name of the locale in the format appropriate for $in_locale. + */ + public static function getDisplayName ($locale, $in_locale = null) {} + + /** + * Returns an appropriately localized display name for language of the inputlocale + * @link http://www.php.net/manual/en/locale.getdisplaylanguage.php + * @param locale string

+ * The locale to return a display language for + *

+ * @param in_locale string[optional]

+ * Optional format locale to use to display the language name + *

+ * @return string display name of the language for the $locale in the format appropriate for + * $in_locale. + */ + public static function getDisplayLanguage ($locale, $in_locale = null) {} + + /** + * Returns an appropriately localized display name for variants of the input locale + * @link http://www.php.net/manual/en/locale.getdisplayvariant.php + * @param locale string

+ * The locale to return a display variant for + *

+ * @param in_locale string[optional]

+ * Optional format locale to use to display the variant name + *

+ * @return string Display name of the variant for the $locale in the format appropriate for + * $in_locale. + */ + public static function getDisplayVariant ($locale, $in_locale = null) {} + + /** + * Returns a correctly ordered and delimited locale ID + * @link http://www.php.net/manual/en/locale.composelocale.php + * @param subtags array

+ * an array containing a list of key-value pairs, where the keys identify + * the particular locale ID subtags, and the values are the associated + * subtag values. + *

+ * The 'variant' and 'private' subtags can take maximum 15 values + * whereas 'extlang' can take maximum 3 values.e.g. Variants are allowed + * with the suffix ranging from 0-14. Hence the keys for the input array + * can be variant0, variant1, ...,variant14. In the returned locale id, + * the subtag is ordered by suffix resulting in variant0 followed by + * variant1 followed by variant2 and so on. + *

+ *

+ * The 'variant', 'private' and 'extlang' multiple values can be specified both + * as array under specific key (e.g. 'variant') and as multiple numbered keys + * (e.g. 'variant0', 'variant1', etc.). + *

+ *

+ * @return string The corresponding locale identifier. + */ + public static function composeLocale (array $subtags) {} + + /** + * Returns a key-value array of locale ID subtag elements. + * @link http://www.php.net/manual/en/locale.parselocale.php + * @param locale string

+ * The locale to extract the subtag array from. Note: The 'variant' and + * 'private' subtags can take maximum 15 values whereas 'extlang' can take + * maximum 3 values. + *

+ * @return array an array containing a list of key-value pairs, where the keys + * identify the particular locale ID subtags, and the values are the + * associated subtag values. The array will be ordered as the locale id + * subtags e.g. in the locale id if variants are '-varX-varY-varZ' then the + * returned array will have variant0=>varX , variant1=>varY , + * variant2=>varZ + */ + public static function parseLocale ($locale) {} + + /** + * Gets the variants for the input locale + * @link http://www.php.net/manual/en/locale.getallvariants.php + * @param locale string

+ * The locale to extract the variants from + *

+ * @return array The array containing the list of all variants subtag for the locale + * or &null; if not present + */ + public static function getAllVariants ($locale) {} + + /** + * Checks if a language tag filter matches with locale + * @link http://www.php.net/manual/en/locale.filtermatches.php + * @param langtag string

+ * The language tag to check + *

+ * @param locale string

+ * The language range to check against + *

+ * @param canonicalize bool[optional]

+ * If true, the arguments will be converted to canonical form before + * matching. + *

+ * @return bool true if $locale matches $langtag false otherwise. + */ + public static function filterMatches ($langtag, $locale, $canonicalize = null) {} + + /** + * Searches the language tag list for the best match to the language + * @link http://www.php.net/manual/en/locale.lookup.php + * @param langtag array

+ * An array containing a list of language tags to compare to + * locale. Maximum 100 items allowed. + *

+ * @param locale string

+ * The locale to use as the language range when matching. + *

+ * @param canonicalize bool[optional]

+ * If true, the arguments will be converted to canonical form before + * matching. + *

+ * @param default string[optional]

+ * The locale to use if no match is found. + *

+ * @return string The closest matching language tag or default value. + */ + public static function lookup (array $langtag, $locale, $canonicalize = null, $default = null) {} + + /** + * @param arg1 + */ + public static function canonicalize ($arg1) {} + + /** + * Tries to find out best available locale based on HTTP "Accept-Language" header + * @link http://www.php.net/manual/en/locale.acceptfromhttp.php + * @param header string

+ * The string containing the "Accept-Language" header according to format in RFC 2616. + *

+ * @return string The corresponding locale identifier. + */ + public static function acceptFromHttp ($header) {} + +} + +/** @jms-builtin */ +class MessageFormatter { + + /** + * @param locale + * @param pattern + */ + public function __construct ($locale, $pattern) {} + + /** + * Constructs a new Message Formatter + * @link http://www.php.net/manual/en/messageformatter.create.php + * @param locale string

+ * The locale to use when formatting arguments + *

+ * @param pattern string

+ * The pattern string to stick arguments into. + * The pattern uses an 'apostrophe-friendly' syntax; it is run through + * umsg_autoQuoteApostrophe + * before being interpreted. + *

+ * @return MessageFormatter The formatter object + */ + public static function create ($locale, $pattern) {} + + /** + * Format the message + * @link http://www.php.net/manual/en/messageformatter.format.php + * @param args array

+ * Arguments to insert into the format string + *

+ * @return string The formatted string, or false if an error occurred + */ + public function format (array $args) {} + + /** + * Quick format message + * @link http://www.php.net/manual/en/messageformatter.formatmessage.php + * @param locale string

+ * The locale to use for formatting locale-dependent parts + *

+ * @param pattern string

+ * The pattern string to insert things into. + * The pattern uses an 'apostrophe-friendly' syntax; it is run through + * umsg_autoQuoteApostrophe + * before being interpreted. + *

+ * @param args array

+ * The array of values to insert into the format string + *

+ * @return string The formatted pattern string or false if an error occurred + */ + public static function formatMessage ($locale, $pattern, array $args) {} + + /** + * Parse input string according to pattern + * @link http://www.php.net/manual/en/messageformatter.parse.php + * @param value string

+ * The string to parse + *

+ * @return array An array containing the items extracted, or false on error + */ + public function parse ($value) {} + + /** + * Quick parse input string + * @link http://www.php.net/manual/en/messageformatter.parsemessage.php + * @param locale string

+ * The locale to use for parsing locale-dependent parts + *

+ * @param value string

+ * The string to parse for items + *

+ * @return array An array containing items extracted, or false on error + */ + public static function parseMessage ($locale, $value) {} + + /** + * Set the pattern used by the formatter + * @link http://www.php.net/manual/en/messageformatter.setpattern.php + * @param pattern string

+ * The pattern string to use in this message formatter. + * The pattern uses an 'apostrophe-friendly' syntax; it is run through + * umsg_autoQuoteApostrophe + * before being interpreted. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setPattern ($pattern) {} + + /** + * Get the pattern used by the formatter + * @link http://www.php.net/manual/en/messageformatter.getpattern.php + * @return string The pattern string for this message formatter + */ + public function getPattern () {} + + /** + * Get the locale for which the formatter was created. + * @link http://www.php.net/manual/en/messageformatter.getlocale.php + * @return string The locale name + */ + public function getLocale () {} + + /** + * Get the error code from last operation + * @link http://www.php.net/manual/en/messageformatter.geterrorcode.php + * @return int The error code, one of UErrorCode values. Initial value is U_ZERO_ERROR. + */ + public function getErrorCode () {} + + /** + * Get the error text from the last operation + * @link http://www.php.net/manual/en/messageformatter.geterrormessage.php + * @return string Description of the last error. + */ + public function getErrorMessage () {} + +} + +/** @jms-builtin */ +class IntlDateFormatter { + const FULL = 0; + const LONG = 1; + const MEDIUM = 2; + const SHORT = 3; + const NONE = -1; + const GREGORIAN = 1; + const TRADITIONAL = 0; + + + /** + * @param locale + * @param datetype + * @param timetype + * @param timezone[optional] + * @param calendar[optional] + * @param pattern[optional] + */ + public function __construct ($locale, $datetype, $timetype, $timezone, $calendar, $pattern) {} + + /** + * Create a date formatter + * @link http://www.php.net/manual/en/intldateformatter.create.php + * @param locale string

+ * Locale to use when formatting or parsing. + *

+ * @param datetype int

+ * Date type to use (none, + * short, medium, + * long, full). + * This is one of the + * IntlDateFormatter constants. + *

+ * @param timetype int

+ * Time type to use (none, + * short, medium, + * long, full). + * This is one of the + * IntlDateFormatter constants. + *

+ * @param timezone string[optional]

+ * Time zone ID, default is system default. + *

+ * @param calendar int[optional]

+ * Calendar to use for formatting or parsing; default is Gregorian. + * This is one of the + * IntlDateFormatter calendar constants. + *

+ * @param pattern string[optional]

+ * Optional pattern to use when formatting or parsing. + * Possible patterns are documented at &url.icu.datepattern;. + *

+ * @return IntlDateFormatter + */ + public static function create ($locale, $datetype, $timetype, $timezone = null, $calendar = null, $pattern = null) {} + + /** + * Get the datetype used for the IntlDateFormatter + * @link http://www.php.net/manual/en/intldateformatter.getdatetype.php + * @return int The current date type value of the formatter. + */ + public function getDateType () {} + + /** + * Get the timetype used for the IntlDateFormatter + * @link http://www.php.net/manual/en/intldateformatter.gettimetype.php + * @return int The current date type value of the formatter. + */ + public function getTimeType () {} + + /** + * Get the calendar used for the IntlDateFormatter + * @link http://www.php.net/manual/en/intldateformatter.getcalendar.php + * @return int The calendar being used by the formatter. + */ + public function getCalendar () {} + + /** + * sets the calendar used to the appropriate calendar, which must be + * @link http://www.php.net/manual/en/intldateformatter.setcalendar.php + * @param which int

+ * The calendar to use. + * Default is IntlDateFormatter::GREGORIAN. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setCalendar ($which) {} + + /** + * Get the timezone-id used for the IntlDateFormatter + * @link http://www.php.net/manual/en/intldateformatter.gettimezoneid.php + * @return string ID string for the time zone used by this formatter. + */ + public function getTimeZoneId () {} + + /** + * Sets the time zone to use + * @link http://www.php.net/manual/en/intldateformatter.settimezoneid.php + * @param zone string

+ * The time zone ID string of the time zone to use. + * If &null; or the empty string, the default time zone for the runtime is used. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setTimeZoneId ($zone) {} + + /** + * Set the pattern used for the IntlDateFormatter + * @link http://www.php.net/manual/en/intldateformatter.setpattern.php + * @param pattern string

+ * New pattern string to use. + * Possible patterns are documented at &url.icu.datepattern;. + *

+ * @return bool Returns true on success or false on failure. + * Bad formatstrings are usually the cause of the failure. + */ + public function setPattern ($pattern) {} + + /** + * Get the pattern used for the IntlDateFormatter + * @link http://www.php.net/manual/en/intldateformatter.getpattern.php + * @return string The pattern string being used to format/parse. + */ + public function getPattern () {} + + /** + * Get the locale used by formatter + * @link http://www.php.net/manual/en/intldateformatter.getlocale.php + * @param which int[optional] + * @return string the locale of this formatter or 'false' if error + */ + public function getLocale ($which = null) {} + + /** + * Set the leniency of the parser + * @link http://www.php.net/manual/en/intldateformatter.setlenient.php + * @param lenient bool

+ * Sets whether the parser is lenient or not, default is false (strict). + *

+ * @return bool Returns true on success or false on failure. + */ + public function setLenient ($lenient) {} + + /** + * Get the lenient used for the IntlDateFormatter + * @link http://www.php.net/manual/en/intldateformatter.islenient.php + * @return bool true if parser is lenient, false if parser is strict. By default the parser is strict. + */ + public function isLenient () {} + + /** + * Format the date/time value as a string + * @link http://www.php.net/manual/en/intldateformatter.format.php + * @param value mixed

+ * Value to format. Can be integer for an Unix timestamp value (seconds since epoch, UTC) or + * array for a localtime array. + *

+ * @return string The formatted string or, if an error occurred, false. + */ + public function format ($value) {} + + /** + * Parse string to a timestamp value + * @link http://www.php.net/manual/en/intldateformatter.parse.php + * @param value string

+ * string to convert to a time + *

+ * @param position int[optional]

+ * Position at which to start the parsing in $value (zero-based). + * If no error occurs before $value is consumed, $parse_pos will contain -1 + * otherwise it will contain the position at which parsing ended (and the error occurred). + * This variable will contain the end position if the parse fails. + * If $parse_pos > strlen($value), the parse fails immediately. + *

+ * @return int timestamp parsed value + */ + public function parse ($value, &$position = null) {} + + /** + * Parse string to a field-based time value + * @link http://www.php.net/manual/en/intldateformatter.localtime.php + * @param value string

+ * string to convert to a time + *

+ * @param position int[optional]

+ * Position at which to start the parsing in $value (zero-based). + * If no error occurs before $value is consumed, $parse_pos will contain -1 + * otherwise it will contain the position at which parsing ended . + * If $parse_pos > strlen($value), the parse fails immediately. + *

+ * @return array Localtime compatible array of integers : contains 24 hour clock value in tm_hour field + */ + public function localtime ($value, &$position = null) {} + + /** + * Get the error code from last operation + * @link http://www.php.net/manual/en/intldateformatter.geterrorcode.php + * @return int The error code, one of UErrorCode values. Initial value is U_ZERO_ERROR. + */ + public function getErrorCode () {} + + /** + * Get the error text from the last operation. + * @link http://www.php.net/manual/en/intldateformatter.geterrormessage.php + * @return string Description of the last error. + */ + public function getErrorMessage () {} + +} + +/** + * @param arg1 + * + * @jms-builtin + */ +function collator_create ($arg1) {} + +/** + * @param object Collator + * @param arg1 + * @param arg2 + * + * @jms-builtin + */ +function collator_compare (Collator $object, $arg1, $arg2) {} + +/** + * @param object Collator + * @param arg1 + * + * @jms-builtin + */ +function collator_get_attribute (Collator $object, $arg1) {} + +/** + * @param object Collator + * @param arg1 + * @param arg2 + * + * @jms-builtin + */ +function collator_set_attribute (Collator $object, $arg1, $arg2) {} + +/** + * @param object Collator + * + * @jms-builtin + */ +function collator_get_strength (Collator $object) {} + +/** + * @param object Collator + * @param arg1 + * + * @jms-builtin + */ +function collator_set_strength (Collator $object, $arg1) {} + +/** + * @param object Collator + * @param arr + * @param sort_flags[optional] + * + * @jms-builtin + */ +function collator_sort (Collator $objectarray , &$arr, $sort_flags) {} + +/** + * @param object Collator + * @param arr + * @param sort_flags[optional] + * + * @jms-builtin + */ +function collator_sort_with_sort_keys (Collator $objectarray , &$arr, $sort_flags) {} + +/** + * @param object Collator + * @param arr + * @param sort_flags[optional] + * + * @jms-builtin + */ +function collator_asort (Collator $objectarray , &$arr, $sort_flags) {} + +/** + * @param object Collator + * @param arg1 + * + * @jms-builtin + */ +function collator_get_locale (Collator $object, $arg1) {} + +/** + * @param object Collator + * + * @jms-builtin + */ +function collator_get_error_code (Collator $object) {} + +/** + * @param object Collator + * + * @jms-builtin + */ +function collator_get_error_message (Collator $object) {} + +/** + * @param locale + * @param style + * @param pattern[optional] + * + * @jms-builtin + */ +function numfmt_create ($locale, $style, $pattern) {} + +/** + * @param nf + * @param num + * @param type[optional] + * + * @jms-builtin + */ +function numfmt_format ($nf, $num, $type) {} + +/** + * @param formatter + * @param string + * @param type[optional] + * @param position[optional] + * + * @jms-builtin + */ +function numfmt_parse ($formatter, $string, $type, &$position) {} + +/** + * @param nf + * @param num + * @param currency + * + * @jms-builtin + */ +function numfmt_format_currency ($nf, $num, $currency) {} + +/** + * @param formatter + * @param string + * @param currency + * @param position[optional] + * + * @jms-builtin + */ +function numfmt_parse_currency ($formatter, $string, &$currency, &$position) {} + +/** + * @param nf + * @param attr + * @param value + * + * @jms-builtin + */ +function numfmt_set_attribute ($nf, $attr, $value) {} + +/** + * @param nf + * @param attr + * + * @jms-builtin + */ +function numfmt_get_attribute ($nf, $attr) {} + +/** + * @param nf + * @param attr + * @param value + * + * @jms-builtin + */ +function numfmt_set_text_attribute ($nf, $attr, $value) {} + +/** + * @param nf + * @param attr + * + * @jms-builtin + */ +function numfmt_get_text_attribute ($nf, $attr) {} + +/** + * @param nf + * @param attr + * @param symbol + * + * @jms-builtin + */ +function numfmt_set_symbol ($nf, $attr, $symbol) {} + +/** + * @param nf + * @param attr + * + * @jms-builtin + */ +function numfmt_get_symbol ($nf, $attr) {} + +/** + * @param nf + * @param pattern + * + * @jms-builtin + */ +function numfmt_set_pattern ($nf, $pattern) {} + +/** + * @param nf + * + * @jms-builtin + */ +function numfmt_get_pattern ($nf) {} + +/** + * @param nf + * @param type[optional] + * + * @jms-builtin + */ +function numfmt_get_locale ($nf, $type) {} + +/** + * @param nf + * + * @jms-builtin + */ +function numfmt_get_error_code ($nf) {} + +/** + * @param nf + * + * @jms-builtin + */ +function numfmt_get_error_message ($nf) {} + +/** + * @param input + * @param form[optional] + * + * @jms-builtin + */ +function normalizer_normalize ($input, $form) {} + +/** + * @param input + * @param form[optional] + * + * @jms-builtin + */ +function normalizer_is_normalized ($input, $form) {} + +/** + * Get the default Locale + * @link http://www.php.net/manual/en/function.locale-get-default.php + * @return string a string with the current Locale. + * + * @jms-builtin + */ +function locale_get_default () {} + +/** + * Set the default Locale + * @link http://www.php.net/manual/en/function.locale-set-default.php + * @param name string

+ * The new Locale name. A comprehensive list of the supported locales is + * available at . + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function locale_set_default ($name) {} + +/** + * @param arg1 + * + * @jms-builtin + */ +function locale_get_primary_language ($arg1) {} + +/** + * @param arg1 + * + * @jms-builtin + */ +function locale_get_script ($arg1) {} + +/** + * @param arg1 + * + * @jms-builtin + */ +function locale_get_region ($arg1) {} + +/** + * @param arg1 + * + * @jms-builtin + */ +function locale_get_keywords ($arg1) {} + +/** + * @param arg1 + * @param arg2 + * + * @jms-builtin + */ +function locale_get_display_script ($arg1, $arg2) {} + +/** + * @param arg1 + * @param arg2 + * + * @jms-builtin + */ +function locale_get_display_region ($arg1, $arg2) {} + +/** + * @param arg1 + * @param arg2 + * + * @jms-builtin + */ +function locale_get_display_name ($arg1, $arg2) {} + +/** + * @param arg1 + * @param arg2 + * + * @jms-builtin + */ +function locale_get_display_language ($arg1, $arg2) {} + +/** + * @param arg1 + * @param arg2 + * + * @jms-builtin + */ +function locale_get_display_variant ($arg1, $arg2) {} + +/** + * @param arg1 + * + * @jms-builtin + */ +function locale_compose ($arg1) {} + +/** + * @param arg1 + * + * @jms-builtin + */ +function locale_parse ($arg1) {} + +/** + * @param arg1 + * + * @jms-builtin + */ +function locale_get_all_variants ($arg1) {} + +/** + * @param arg1 + * @param arg2 + * @param arg3 + * + * @jms-builtin + */ +function locale_filter_matches ($arg1, $arg2, $arg3) {} + +/** + * @param arg1 + * + * @jms-builtin + */ +function locale_canonicalize ($arg1) {} + +/** + * @param arg1 + * @param arg2 + * @param arg3 + * @param arg4 + * + * @jms-builtin + */ +function locale_lookup ($arg1, $arg2, $arg3, $arg4) {} + +/** + * @param arg1 + * + * @jms-builtin + */ +function locale_accept_from_http ($arg1) {} + +/** + * @param locale + * @param pattern + * + * @jms-builtin + */ +function msgfmt_create ($locale, $pattern) {} + +/** + * @param nf + * @param args + * + * @jms-builtin + */ +function msgfmt_format ($nf, $args) {} + +/** + * @param locale + * @param pattern + * @param args + * + * @jms-builtin + */ +function msgfmt_format_message ($locale, $pattern, $args) {} + +/** + * @param nf + * @param source + * + * @jms-builtin + */ +function msgfmt_parse ($nf, $source) {} + +/** + * @param locale + * @param pattern + * @param source + * + * @jms-builtin + */ +function msgfmt_parse_message ($locale, $pattern, $source) {} + +/** + * @param mf + * @param pattern + * + * @jms-builtin + */ +function msgfmt_set_pattern ($mf, $pattern) {} + +/** + * @param mf + * + * @jms-builtin + */ +function msgfmt_get_pattern ($mf) {} + +/** + * @param mf + * + * @jms-builtin + */ +function msgfmt_get_locale ($mf) {} + +/** + * @param nf + * + * @jms-builtin + */ +function msgfmt_get_error_code ($nf) {} + +/** + * @param coll + * + * @jms-builtin + */ +function msgfmt_get_error_message ($coll) {} + +/** + * @param locale + * @param date_type + * @param time_type + * @param timezone_str[optional] + * @param calendar[optional] + * @param pattern[optional] + * + * @jms-builtin + */ +function datefmt_create ($locale, $date_type, $time_type, $timezone_str, $calendar, $pattern) {} + +/** + * @param mf + * + * @jms-builtin + */ +function datefmt_get_datetype ($mf) {} + +/** + * @param mf + * + * @jms-builtin + */ +function datefmt_get_timetype ($mf) {} + +/** + * @param mf + * + * @jms-builtin + */ +function datefmt_get_calendar ($mf) {} + +/** + * @param mf + * @param calendar + * + * @jms-builtin + */ +function datefmt_set_calendar ($mf, $calendar) {} + +/** + * @param mf + * + * @jms-builtin + */ +function datefmt_get_locale ($mf) {} + +/** + * @param mf + * + * @jms-builtin + */ +function datefmt_get_timezone_id ($mf) {} + +/** + * @param mf + * + * @jms-builtin + */ +function datefmt_set_timezone_id ($mf) {} + +/** + * @param mf + * + * @jms-builtin + */ +function datefmt_get_pattern ($mf) {} + +/** + * @param mf + * @param pattern + * + * @jms-builtin + */ +function datefmt_set_pattern ($mf, $pattern) {} + +/** + * @param mf + * + * @jms-builtin + */ +function datefmt_is_lenient ($mf) {} + +/** + * @param mf + * + * @jms-builtin + */ +function datefmt_set_lenient ($mf) {} + +/** + * @param args[optional] + * @param array[optional] + * + * @jms-builtin + */ +function datefmt_format ($args, $array) {} + +/** + * @param formatter + * @param string + * @param position[optional] + * + * @jms-builtin + */ +function datefmt_parse ($formatter, $string, &$position) {} + +/** + * @param formatter + * @param string + * @param position[optional] + * + * @jms-builtin + */ +function datefmt_localtime ($formatter, $string, &$position) {} + +/** + * @param nf + * + * @jms-builtin + */ +function datefmt_get_error_code ($nf) {} + +/** + * @param coll + * + * @jms-builtin + */ +function datefmt_get_error_message ($coll) {} + +/** + * Get string length in grapheme units + * @link http://www.php.net/manual/en/function.grapheme-strlen.php + * @param input string

+ * The string being measured for length. It must be a valid UTF-8 string. + *

+ * @return int The length of the string on success, and 0 if the string is empty. + * + * @jms-builtin + */ +function grapheme_strlen ($input) {} + +/** + * Find position (in grapheme units) of first occurrence of a string + * @link http://www.php.net/manual/en/function.grapheme-strpos.php + * @param haystack string

+ * The string to look in. Must be valid UTF-8. + *

+ * @param needle string

+ * The string to look for. Must be valid UTF-8. + *

+ * @param offset int[optional]

+ * The optional $offset parameter allows you to specify where in $haystack to + * start searching as an offset in grapheme units (not bytes or characters). + * The position returned is still relative to the beginning of haystack + * regardless of the value of $offset. + *

+ * @return int the position as an integer. If needle is not found, strpos() will return boolean FALSE. + * + * @jms-builtin + */ +function grapheme_strpos ($haystack, $needle, $offset = null) {} + +/** + * Find position (in grapheme units) of first occurrence of a case-insensitive string + * @link http://www.php.net/manual/en/function.grapheme-stripos.php + * @param haystack string

+ * The string to look in. Must be valid UTF-8. + *

+ * @param needle string

+ * The string to look for. Must be valid UTF-8. + *

+ * @param offset int[optional]

+ * The optional $offset parameter allows you to specify where in haystack to + * start searching as an offset in grapheme units (not bytes or characters). + * The position returned is still relative to the beginning of haystack + * regardless of the value of $offset. + *

+ * @return int the position as an integer. If needle is not found, grapheme_stripos() will return boolean FALSE. + * + * @jms-builtin + */ +function grapheme_stripos ($haystack, $needle, $offset = null) {} + +/** + * Find position (in grapheme units) of last occurrence of a string + * @link http://www.php.net/manual/en/function.grapheme-strrpos.php + * @param haystack string

+ * The string to look in. Must be valid UTF-8. + *

+ * @param needle string

+ * The string to look for. Must be valid UTF-8. + *

+ * @param offset int[optional]

+ * The optional $offset parameter allows you to specify where in $haystack to + * start searching as an offset in grapheme units (not bytes or characters). + * The position returned is still relative to the beginning of haystack + * regardless of the value of $offset. + *

+ * @return int the position as an integer. If needle is not found, grapheme_strrpos() will return boolean FALSE. + * + * @jms-builtin + */ +function grapheme_strrpos ($haystack, $needle, $offset = null) {} + +/** + * Find position (in grapheme units) of last occurrence of a case-insensitive string + * @link http://www.php.net/manual/en/function.grapheme-strripos.php + * @param haystack string

+ * The string to look in. Must be valid UTF-8. + *

+ * @param needle string

+ * The string to look for. Must be valid UTF-8. + *

+ * @param offset int[optional]

+ * The optional $offset parameter allows you to specify where in $haystack to + * start searching as an offset in grapheme units (not bytes or characters). + * The position returned is still relative to the beginning of haystack + * regardless of the value of $offset. + *

+ * @return int the position as an integer. If needle is not found, grapheme_strripos() will return boolean FALSE. + * + * @jms-builtin + */ +function grapheme_strripos ($haystack, $needle, $offset = null) {} + +/** + * Return part of a string + * @link http://www.php.net/manual/en/function.grapheme-substr.php + * @param string string

+ * The input string. Must be valid UTF-8. + *

+ * @param start int

+ * Start position in default grapheme units. + * If $start is non-negative, the returned string will start at the + * $start'th position in $string, counting from zero. If $start is negative, + * the returned string will start at the $start'th grapheme unit from the + * end of string. + *

+ * @param length int[optional]

+ * Length in grapheme units. + * If $length is given and is positive, the string returned will contain + * at most $length grapheme units beginning from $start (depending on the + * length of string). If $string is less than or equal to $start grapheme + * units long, FALSE will be returned. If $length is given and is negative, then + * that many grapheme units will be omitted from the end of string (after the + * start position has been calculated when a start is negative). If $start + * denotes a position beyond this truncation, an empty string will be returned. + *

+ * @return int the extracted part of $string. + * + * @jms-builtin + */ +function grapheme_substr ($string, $start, $length = null) {} + +/** + * Returns part of haystack string from the first occurrence of needle to the end of haystack. + * @link http://www.php.net/manual/en/function.grapheme-strstr.php + * @param haystack string

+ * The input string. Must be valid UTF-8. + *

+ * @param needle string

+ * The string to look for. Must be valid UTF-8. + *

+ * @param before_needle bool[optional]

+ * If true, grapheme_strstr() returns the part of the + * haystack before the first occurrence of the needle. + *

+ * @return string the portion of string, or FALSE if needle is not found. + * + * @jms-builtin + */ +function grapheme_strstr ($haystack, $needle, $before_needle = null) {} + +/** + * Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack. + * @link http://www.php.net/manual/en/function.grapheme-stristr.php + * @param haystack string

+ * The input string. Must be valid UTF-8. + *

+ * @param needle string

+ * The string to look for. Must be valid UTF-8. + *

+ * @param before_needle bool[optional]

+ * If true, grapheme_strstr() returns the part of the + * haystack before the first occurrence of the needle. + *

+ * @return string the portion of $haystack, or FALSE if $needle is not found. + * + * @jms-builtin + */ +function grapheme_stristr ($haystack, $needle, $before_needle = null) {} + +/** + * Function to extract a sequence of default grapheme clusters from a text buffer, which must be encoded in UTF-8. + * @link http://www.php.net/manual/en/function.grapheme-extract.php + * @param haystack string

+ * String to search. + *

+ * @param size int

+ * Maximum number items - based on the $extract_type - to return. + *

+ * @param extract_type int[optional]

+ * Defines the type of units referred to by the $size parameter: + *

+ *

+ * GRAPHEME_EXTR_COUNT (default) - $size is the number of default + * grapheme clusters to extract. + * GRAPHEME_EXTR_MAXBYTES - $size is the maximum number of bytes + * returned. + * GRAPHEME_EXTR_MAXCHARS - $size is the maximum number of UTF-8 + * characters returned. + *

+ * @param start int[optional]

+ * Starting position in $haystack in bytes - if given, it must be zero or a + * positive value that is less than or equal to the length of $haystack in + * bytes. If $start does not point to the first byte of a UTF-8 + * character, the start position is moved to the next character boundary. + *

+ * @param next int[optional]

+ * Reference to a value that will be set to the next starting position. + * When the call returns, this may point to the first byte position past the end of the string. + *

+ * @return string A string starting at offset $start and ending on a default grapheme cluster + * boundary that conforms to the $size and $extract_type specified. + * + * @jms-builtin + */ +function grapheme_extract ($haystack, $size, $extract_type = null, $start = null, &$next = null) {} + +/** + * Get the last error code + * @link http://www.php.net/manual/en/function.intl-get-error-code.php + * @return int Error code returned by the last API function call. + * + * @jms-builtin + */ +function intl_get_error_code () {} + +/** + * Get description of the last error + * @link http://www.php.net/manual/en/function.intl-get-error-message.php + * @return string Description of an error occurred in the last API function call. + * + * @jms-builtin + */ +function intl_get_error_message () {} + +/** + * Check whether the given error code indicates failure + * @link http://www.php.net/manual/en/function.intl-is-failure.php + * @param error_code int

+ * is a value that returned by functions: + * intl_get_error_code, + * collator_get_error_code . + *

+ * @return bool true if it the code indicates some failure, and false + * in case of success or a warning. + * + * @jms-builtin + */ +function intl_is_failure ($error_code) {} + +/** + * Get symbolic name for a given error code + * @link http://www.php.net/manual/en/function.intl-error-name.php + * @param error_code int

+ * ICU error code. + *

+ * @return string The returned string will be the same as the name of the error code + * constant. + * + * @jms-builtin + */ +function intl_error_name ($error_code) {} + +define ('INTL_MAX_LOCALE_LEN', 80); +define ('ULOC_ACTUAL_LOCALE', 0); +define ('ULOC_VALID_LOCALE', 1); +define ('GRAPHEME_EXTR_COUNT', 0); +define ('GRAPHEME_EXTR_MAXBYTES', 1); +define ('GRAPHEME_EXTR_MAXCHARS', 2); +define ('U_USING_FALLBACK_WARNING', -128); +define ('U_ERROR_WARNING_START', -128); +define ('U_USING_DEFAULT_WARNING', -127); +define ('U_SAFECLONE_ALLOCATED_WARNING', -126); +define ('U_STATE_OLD_WARNING', -125); +define ('U_STRING_NOT_TERMINATED_WARNING', -124); +define ('U_SORT_KEY_TOO_SHORT_WARNING', -123); +define ('U_AMBIGUOUS_ALIAS_WARNING', -122); +define ('U_DIFFERENT_UCA_VERSION', -121); +define ('U_ERROR_WARNING_LIMIT', -120); +define ('U_ZERO_ERROR', 0); +define ('U_ILLEGAL_ARGUMENT_ERROR', 1); +define ('U_MISSING_RESOURCE_ERROR', 2); +define ('U_INVALID_FORMAT_ERROR', 3); +define ('U_FILE_ACCESS_ERROR', 4); +define ('U_INTERNAL_PROGRAM_ERROR', 5); +define ('U_MESSAGE_PARSE_ERROR', 6); +define ('U_MEMORY_ALLOCATION_ERROR', 7); +define ('U_INDEX_OUTOFBOUNDS_ERROR', 8); +define ('U_PARSE_ERROR', 9); +define ('U_INVALID_CHAR_FOUND', 10); +define ('U_TRUNCATED_CHAR_FOUND', 11); +define ('U_ILLEGAL_CHAR_FOUND', 12); +define ('U_INVALID_TABLE_FORMAT', 13); +define ('U_INVALID_TABLE_FILE', 14); +define ('U_BUFFER_OVERFLOW_ERROR', 15); +define ('U_UNSUPPORTED_ERROR', 16); +define ('U_RESOURCE_TYPE_MISMATCH', 17); +define ('U_ILLEGAL_ESCAPE_SEQUENCE', 18); +define ('U_UNSUPPORTED_ESCAPE_SEQUENCE', 19); +define ('U_NO_SPACE_AVAILABLE', 20); +define ('U_CE_NOT_FOUND_ERROR', 21); +define ('U_PRIMARY_TOO_LONG_ERROR', 22); +define ('U_STATE_TOO_OLD_ERROR', 23); +define ('U_TOO_MANY_ALIASES_ERROR', 24); +define ('U_ENUM_OUT_OF_SYNC_ERROR', 25); +define ('U_INVARIANT_CONVERSION_ERROR', 26); +define ('U_INVALID_STATE_ERROR', 27); +define ('U_COLLATOR_VERSION_MISMATCH', 28); +define ('U_USELESS_COLLATOR_ERROR', 29); +define ('U_NO_WRITE_PERMISSION', 30); +define ('U_STANDARD_ERROR_LIMIT', 31); +define ('U_BAD_VARIABLE_DEFINITION', 65536); +define ('U_PARSE_ERROR_START', 65536); +define ('U_MALFORMED_RULE', 65537); +define ('U_MALFORMED_SET', 65538); +define ('U_MALFORMED_SYMBOL_REFERENCE', 65539); +define ('U_MALFORMED_UNICODE_ESCAPE', 65540); +define ('U_MALFORMED_VARIABLE_DEFINITION', 65541); +define ('U_MALFORMED_VARIABLE_REFERENCE', 65542); +define ('U_MISMATCHED_SEGMENT_DELIMITERS', 65543); +define ('U_MISPLACED_ANCHOR_START', 65544); +define ('U_MISPLACED_CURSOR_OFFSET', 65545); +define ('U_MISPLACED_QUANTIFIER', 65546); +define ('U_MISSING_OPERATOR', 65547); +define ('U_MISSING_SEGMENT_CLOSE', 65548); +define ('U_MULTIPLE_ANTE_CONTEXTS', 65549); +define ('U_MULTIPLE_CURSORS', 65550); +define ('U_MULTIPLE_POST_CONTEXTS', 65551); +define ('U_TRAILING_BACKSLASH', 65552); +define ('U_UNDEFINED_SEGMENT_REFERENCE', 65553); +define ('U_UNDEFINED_VARIABLE', 65554); +define ('U_UNQUOTED_SPECIAL', 65555); +define ('U_UNTERMINATED_QUOTE', 65556); +define ('U_RULE_MASK_ERROR', 65557); +define ('U_MISPLACED_COMPOUND_FILTER', 65558); +define ('U_MULTIPLE_COMPOUND_FILTERS', 65559); +define ('U_INVALID_RBT_SYNTAX', 65560); +define ('U_INVALID_PROPERTY_PATTERN', 65561); +define ('U_MALFORMED_PRAGMA', 65562); +define ('U_UNCLOSED_SEGMENT', 65563); +define ('U_ILLEGAL_CHAR_IN_SEGMENT', 65564); +define ('U_VARIABLE_RANGE_EXHAUSTED', 65565); +define ('U_VARIABLE_RANGE_OVERLAP', 65566); +define ('U_ILLEGAL_CHARACTER', 65567); +define ('U_INTERNAL_TRANSLITERATOR_ERROR', 65568); +define ('U_INVALID_ID', 65569); +define ('U_INVALID_FUNCTION', 65570); +define ('U_PARSE_ERROR_LIMIT', 65571); +define ('U_UNEXPECTED_TOKEN', 65792); +define ('U_FMT_PARSE_ERROR_START', 65792); +define ('U_MULTIPLE_DECIMAL_SEPARATORS', 65793); +define ('U_MULTIPLE_DECIMAL_SEPERATORS', 65793); +define ('U_MULTIPLE_EXPONENTIAL_SYMBOLS', 65794); +define ('U_MALFORMED_EXPONENTIAL_PATTERN', 65795); +define ('U_MULTIPLE_PERCENT_SYMBOLS', 65796); +define ('U_MULTIPLE_PERMILL_SYMBOLS', 65797); +define ('U_MULTIPLE_PAD_SPECIFIERS', 65798); +define ('U_PATTERN_SYNTAX_ERROR', 65799); +define ('U_ILLEGAL_PAD_POSITION', 65800); +define ('U_UNMATCHED_BRACES', 65801); +define ('U_UNSUPPORTED_PROPERTY', 65802); +define ('U_UNSUPPORTED_ATTRIBUTE', 65803); +define ('U_FMT_PARSE_ERROR_LIMIT', 65804); +define ('U_BRK_INTERNAL_ERROR', 66048); +define ('U_BRK_ERROR_START', 66048); +define ('U_BRK_HEX_DIGITS_EXPECTED', 66049); +define ('U_BRK_SEMICOLON_EXPECTED', 66050); +define ('U_BRK_RULE_SYNTAX', 66051); +define ('U_BRK_UNCLOSED_SET', 66052); +define ('U_BRK_ASSIGN_ERROR', 66053); +define ('U_BRK_VARIABLE_REDFINITION', 66054); +define ('U_BRK_MISMATCHED_PAREN', 66055); +define ('U_BRK_NEW_LINE_IN_QUOTED_STRING', 66056); +define ('U_BRK_UNDEFINED_VARIABLE', 66057); +define ('U_BRK_INIT_ERROR', 66058); +define ('U_BRK_RULE_EMPTY_SET', 66059); +define ('U_BRK_UNRECOGNIZED_OPTION', 66060); +define ('U_BRK_MALFORMED_RULE_TAG', 66061); +define ('U_BRK_ERROR_LIMIT', 66062); +define ('U_REGEX_INTERNAL_ERROR', 66304); +define ('U_REGEX_ERROR_START', 66304); +define ('U_REGEX_RULE_SYNTAX', 66305); +define ('U_REGEX_INVALID_STATE', 66306); +define ('U_REGEX_BAD_ESCAPE_SEQUENCE', 66307); +define ('U_REGEX_PROPERTY_SYNTAX', 66308); +define ('U_REGEX_UNIMPLEMENTED', 66309); +define ('U_REGEX_MISMATCHED_PAREN', 66310); +define ('U_REGEX_NUMBER_TOO_BIG', 66311); +define ('U_REGEX_BAD_INTERVAL', 66312); +define ('U_REGEX_MAX_LT_MIN', 66313); +define ('U_REGEX_INVALID_BACK_REF', 66314); +define ('U_REGEX_INVALID_FLAG', 66315); +define ('U_REGEX_LOOK_BEHIND_LIMIT', 66316); +define ('U_REGEX_SET_CONTAINS_STRING', 66317); +define ('U_REGEX_ERROR_LIMIT', 66318); +define ('U_STRINGPREP_PROHIBITED_ERROR', 66560); +define ('U_STRINGPREP_UNASSIGNED_ERROR', 66561); +define ('U_STRINGPREP_CHECK_BIDI_ERROR', 66562); +define ('U_ERROR_LIMIT', 66569); + +// End of intl v.1.0.0 +?> diff --git a/res/php-5.2-core-api/json.php b/res/php-5.2-core-api/json.php new file mode 100644 index 0000000..cc95651 --- /dev/null +++ b/res/php-5.2-core-api/json.php @@ -0,0 +1,53 @@ + + * The value being encoded. Can be any type except + * a resource. + *

+ *

+ * This function only works with UTF-8 encoded data. + *

+ * @param options int[optional]

+ * Bitmask consisting of JSON_HEX_QUOT, + * JSON_HEX_TAG, + * JSON_HEX_AMP, + * JSON_HEX_APOS, + * JSON_FORCE_OBJECT. + *

+ * @return string a JSON encoded string on success. + * + * @jms-builtin + */ +function json_encode ($value, $options = null) {} + +/** + * Decodes a JSON string + * @link http://www.php.net/manual/en/function.json-decode.php + * @param json string

+ * The json string being decoded. + *

+ * @param assoc bool[optional]

+ * When true, returned objects will be converted into + * associative arrays. + *

+ * @param depth int[optional]

+ * User specified recursion depth. + *

+ * @return mixed the value encoded in json in appropriate + * PHP type. Values true, false and + * null (case-insensitive) are returned as true, false + * and &null; respectively. &null; is returned if the + * json cannot be decoded or if the encoded + * data is deeper than the recursion limit. + * + * @jms-builtin + */ +function json_decode ($json, $assoc = null, $depth = null) {} + +// End of json v.1.2.1 +?> diff --git a/res/php-5.2-core-api/ldap.php b/res/php-5.2-core-api/ldap.php new file mode 100644 index 0000000..0c43b80 --- /dev/null +++ b/res/php-5.2-core-api/ldap.php @@ -0,0 +1,939 @@ + + * If you are using OpenLDAP 2.x.x you can specify a URL instead of the + * hostname. To use LDAP with SSL, compile OpenLDAP 2.x.x with SSL + * support, configure PHP with SSL, and set this parameter as + * ldaps://hostname/. + *

+ * @param port int[optional]

+ * The port to connect to. Not used when using URLs. + *

+ * @return resource a positive LDAP link identifier on success, or false on error. + * When OpenLDAP 2.x.x is used, ldap_connect will always + * return a resource as it does not actually connect but just + * initializes the connecting parameters. The actual connect happens with + * the next calls to ldap_* funcs, usually with + * ldap_bind. + *

+ *

+ * If no arguments are specified then the link identifier of the already + * opened link will be returned. + * + * @jms-builtin + */ +function ldap_connect ($hostname = null, $port = null) {} + +/** + * &Alias; ldap_unbind + * @link http://www.php.net/manual/en/function.ldap-close.php + * + * @jms-builtin + */ +function ldap_close () {} + +/** + * Bind to LDAP directory + * @link http://www.php.net/manual/en/function.ldap-bind.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param bind_rdn string[optional]

+ *

+ * @param bind_password string[optional]

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_bind ($link_identifier, $bind_rdn = null, $bind_password = null) {} + +/** + * Unbind from LDAP directory + * @link http://www.php.net/manual/en/function.ldap-unbind.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_unbind ($link_identifier) {} + +/** + * Read an entry + * @link http://www.php.net/manual/en/function.ldap-read.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param base_dn string

+ * The base DN for the directory. + *

+ * @param filter string

+ * An empty filter is not allowed. If you want to retrieve absolutely all + * information for this entry, use a filter of + * objectClass=*. If you know which entry types are + * used on the directory server, you might use an appropriate filter such + * as objectClass=inetOrgPerson. + *

+ * @param attributes array[optional]

+ * An array of the required attributes, e.g. array("mail", "sn", "cn"). + * Note that the "dn" is always returned irrespective of which attributes + * types are requested. + *

+ *

+ * Using this parameter is much more efficient than the default action + * (which is to return all attributes and their associated values). + * The use of this parameter should therefore be considered good + * practice. + *

+ * @param attrsonly int[optional]

+ * Should be set to 1 if only attribute types are wanted. If set to 0 + * both attributes types and attribute values are fetched which is the + * default behaviour. + *

+ * @param sizelimit int[optional]

+ * Enables you to limit the count of entries fetched. Setting this to 0 + * means no limit. + *

+ *

+ * This parameter can NOT override server-side preset sizelimit. You can + * set it lower though. + *

+ *

+ * Some directory server hosts will be configured to return no more than + * a preset number of entries. If this occurs, the server will indicate + * that it has only returned a partial results set. This also occurs if + * you use this parameter to limit the count of fetched entries. + *

+ * @param timelimit int[optional]

+ * Sets the number of seconds how long is spend on the search. Setting + * this to 0 means no limit. + *

+ *

+ * This parameter can NOT override server-side preset timelimit. You can + * set it lower though. + *

+ * @param deref int[optional]

+ * Specifies how aliases should be handled during the search. It can be + * one of the following: + * LDAP_DEREF_NEVER - (default) aliases are never + * dereferenced. + * @return resource a search result identifier or false on error. + * + * @jms-builtin + */ +function ldap_read ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) {} + +/** + * Single-level search + * @link http://www.php.net/manual/en/function.ldap-list.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param base_dn string

+ * The base DN for the directory. + *

+ * @param filter string

+ *

+ * @param attributes array[optional]

+ * An array of the required attributes, e.g. array("mail", "sn", "cn"). + * Note that the "dn" is always returned irrespective of which attributes + * types are requested. + *

+ *

+ * Using this parameter is much more efficient than the default action + * (which is to return all attributes and their associated values). + * The use of this parameter should therefore be considered good + * practice. + *

+ * @param attrsonly int[optional]

+ * Should be set to 1 if only attribute types are wanted. If set to 0 + * both attributes types and attribute values are fetched which is the + * default behaviour. + *

+ * @param sizelimit int[optional]

+ * Enables you to limit the count of entries fetched. Setting this to 0 + * means no limit. + *

+ *

+ * This parameter can NOT override server-side preset sizelimit. You can + * set it lower though. + *

+ *

+ * Some directory server hosts will be configured to return no more than + * a preset number of entries. If this occurs, the server will indicate + * that it has only returned a partial results set. This also occurs if + * you use this parameter to limit the count of fetched entries. + *

+ * @param timelimit int[optional]

+ * Sets the number of seconds how long is spend on the search. Setting + * this to 0 means no limit. + *

+ *

+ * This parameter can NOT override server-side preset timelimit. You can + * set it lower though. + *

+ * @param deref int[optional]

+ * Specifies how aliases should be handled during the search. It can be + * one of the following: + * LDAP_DEREF_NEVER - (default) aliases are never + * dereferenced. + * @return resource a search result identifier or false on error. + * + * @jms-builtin + */ +function ldap_list ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) {} + +/** + * Search LDAP tree + * @link http://www.php.net/manual/en/function.ldap-search.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param base_dn string

+ * The base DN for the directory. + *

+ * @param filter string

+ * The search filter can be simple or advanced, using boolean operators in + * the format described in the LDAP documentation (see the Netscape Directory SDK for full + * information on filters). + *

+ * @param attributes array[optional]

+ * An array of the required attributes, e.g. array("mail", "sn", "cn"). + * Note that the "dn" is always returned irrespective of which attributes + * types are requested. + *

+ *

+ * Using this parameter is much more efficient than the default action + * (which is to return all attributes and their associated values). + * The use of this parameter should therefore be considered good + * practice. + *

+ * @param attrsonly int[optional]

+ * Should be set to 1 if only attribute types are wanted. If set to 0 + * both attributes types and attribute values are fetched which is the + * default behaviour. + *

+ * @param sizelimit int[optional]

+ * Enables you to limit the count of entries fetched. Setting this to 0 + * means no limit. + *

+ *

+ * This parameter can NOT override server-side preset sizelimit. You can + * set it lower though. + *

+ *

+ * Some directory server hosts will be configured to return no more than + * a preset number of entries. If this occurs, the server will indicate + * that it has only returned a partial results set. This also occurs if + * you use this parameter to limit the count of fetched entries. + *

+ * @param timelimit int[optional]

+ * Sets the number of seconds how long is spend on the search. Setting + * this to 0 means no limit. + *

+ *

+ * This parameter can NOT override server-side preset timelimit. You can + * set it lower though. + *

+ * @param deref int[optional]

+ * Specifies how aliases should be handled during the search. It can be + * one of the following: + * LDAP_DEREF_NEVER - (default) aliases are never + * dereferenced. + * @return resource a search result identifier or false on error. + * + * @jms-builtin + */ +function ldap_search ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) {} + +/** + * Free result memory + * @link http://www.php.net/manual/en/function.ldap-free-result.php + * @param result_identifier resource

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_free_result ($result_identifier) {} + +/** + * Count the number of entries in a search + * @link http://www.php.net/manual/en/function.ldap-count-entries.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_identifier resource

+ * The internal LDAP result. + *

+ * @return int number of entries in the result or false on error. + * + * @jms-builtin + */ +function ldap_count_entries ($link_identifier, $result_identifier) {} + +/** + * Return first result id + * @link http://www.php.net/manual/en/function.ldap-first-entry.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_identifier resource

+ *

+ * @return resource the result entry identifier for the first entry on success and + * false on error. + * + * @jms-builtin + */ +function ldap_first_entry ($link_identifier, $result_identifier) {} + +/** + * Get next result entry + * @link http://www.php.net/manual/en/function.ldap-next-entry.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @return resource entry identifier for the next entry in the result whose entries + * are being read starting with ldap_first_entry. If + * there are no more entries in the result then it returns false. + * + * @jms-builtin + */ +function ldap_next_entry ($link_identifier, $result_entry_identifier) {} + +/** + * Get all result entries + * @link http://www.php.net/manual/en/function.ldap-get-entries.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_identifier resource

+ *

+ * @return array a complete result information in a multi-dimensional array on + * success and false on error. + *

+ *

+ * The structure of the array is as follows. + * The attribute index is converted to lowercase. (Attributes are + * case-insensitive for directory servers, but not when used as + * array indices.) + * + * @jms-builtin + */ +function ldap_get_entries ($link_identifier, $result_identifier) {} + +/** + * Return first attribute + * @link http://www.php.net/manual/en/function.ldap-first-attribute.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @return string the first attribute in the entry on success and false on + * error. + * + * @jms-builtin + */ +function ldap_first_attribute ($link_identifier, $result_entry_identifier) {} + +/** + * Get the next attribute in result + * @link http://www.php.net/manual/en/function.ldap-next-attribute.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @return string the next attribute in an entry on success and false on + * error. + * + * @jms-builtin + */ +function ldap_next_attribute ($link_identifier, $result_entry_identifier) {} + +/** + * Get attributes from a search result entry + * @link http://www.php.net/manual/en/function.ldap-get-attributes.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @return array a complete entry information in a multi-dimensional array + * on success and false on error. + * + * @jms-builtin + */ +function ldap_get_attributes ($link_identifier, $result_entry_identifier) {} + +/** + * Get all values from a result entry + * @link http://www.php.net/manual/en/function.ldap-get-values.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @param attribute string

+ *

+ * @return array an array of values for the attribute on success and false on + * error. The number of values can be found by indexing "count" in the + * resultant array. Individual values are accessed by integer index in the + * array. The first index is 0. + *

+ *

+ * LDAP allows more than one entry for an attribute, so it can, for example, + * store a number of email addresses for one person's directory entry all + * labeled with the attribute "mail" + * return_value["count"] = number of values for attribute + * return_value[0] = first value of attribute + * return_value[i] = ith value of attribute + * + * @jms-builtin + */ +function ldap_get_values ($link_identifier, $result_entry_identifier, $attribute) {} + +/** + * Get all binary values from a result entry + * @link http://www.php.net/manual/en/function.ldap-get-values-len.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @param attribute string

+ *

+ * @return array an array of values for the attribute on success and false on + * error. Individual values are accessed by integer index in the array. The + * first index is 0. The number of values can be found by indexing "count" + * in the resultant array. + * + * @jms-builtin + */ +function ldap_get_values_len ($link_identifier, $result_entry_identifier, $attribute) {} + +/** + * Get the DN of a result entry + * @link http://www.php.net/manual/en/function.ldap-get-dn.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @return string the DN of the result entry and false on error. + * + * @jms-builtin + */ +function ldap_get_dn ($link_identifier, $result_entry_identifier) {} + +/** + * Splits DN into its component parts + * @link http://www.php.net/manual/en/function.ldap-explode-dn.php + * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param with_attrib int

+ * Used to request if the RDNs are returned with only values or their + * attributes as well. To get RDNs with the attributes (i.e. in + * attribute=value format) set with_attrib to 0 + * and to get only values set it to 1. + *

+ * @return array an array of all DN components. + * The first element in this array has count key and + * represents the number of returned values, next elements are numerically + * indexed DN components. + * + * @jms-builtin + */ +function ldap_explode_dn ($dn, $with_attrib) {} + +/** + * Convert DN to User Friendly Naming format + * @link http://www.php.net/manual/en/function.ldap-dn2ufn.php + * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @return string the user friendly name. + * + * @jms-builtin + */ +function ldap_dn2ufn ($dn) {} + +/** + * Add entries to LDAP directory + * @link http://www.php.net/manual/en/function.ldap-add.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param entry array

+ * An array that specifies the information about the entry. The values in + * the entries are indexed by individual attributes. + * In case of multiple values for an attribute, they are indexed using + * integers starting with 0. + * ]]> + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_add ($link_identifier, $dn, array $entry) {} + +/** + * Delete an entry from a directory + * @link http://www.php.net/manual/en/function.ldap-delete.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_delete ($link_identifier, $dn) {} + +/** + * Modify an LDAP entry + * @link http://www.php.net/manual/en/function.ldap-modify.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param entry array

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_modify ($link_identifier, $dn, array $entry) {} + +/** + * Add attribute values to current attributes + * @link http://www.php.net/manual/en/function.ldap-mod-add.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param entry array

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_mod_add ($link_identifier, $dn, array $entry) {} + +/** + * Replace attribute values with new ones + * @link http://www.php.net/manual/en/function.ldap-mod-replace.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param entry array

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_mod_replace ($link_identifier, $dn, array $entry) {} + +/** + * Delete attribute values from current attributes + * @link http://www.php.net/manual/en/function.ldap-mod-del.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param entry array

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_mod_del ($link_identifier, $dn, array $entry) {} + +/** + * Return the LDAP error number of the last LDAP command + * @link http://www.php.net/manual/en/function.ldap-errno.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @return int Return the LDAP error number of the last LDAP command for this + * link. + * + * @jms-builtin + */ +function ldap_errno ($link_identifier) {} + +/** + * Convert LDAP error number into string error message + * @link http://www.php.net/manual/en/function.ldap-err2str.php + * @param errno int

+ * The error number. + *

+ * @return string the error message, as a string. + * + * @jms-builtin + */ +function ldap_err2str ($errno) {} + +/** + * Return the LDAP error message of the last LDAP command + * @link http://www.php.net/manual/en/function.ldap-error.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @return string string error message. + * + * @jms-builtin + */ +function ldap_error ($link_identifier) {} + +/** + * Compare value of attribute found in entry specified with DN + * @link http://www.php.net/manual/en/function.ldap-compare.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param attribute string

+ * The attribute name. + *

+ * @param value string

+ * The compared value. + *

+ * @return mixed true if value matches otherwise returns + * false. Returns -1 on error. + * + * @jms-builtin + */ +function ldap_compare ($link_identifier, $dn, $attribute, $value) {} + +/** + * Sort LDAP result entries + * @link http://www.php.net/manual/en/function.ldap-sort.php + * @param link resource + * @param result resource + * @param sortfilter string + * @return bool + * + * @jms-builtin + */ +function ldap_sort ($link, $result, $sortfilter) {} + +/** + * Modify the name of an entry + * @link http://www.php.net/manual/en/function.ldap-rename.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param newrdn string

+ * The new RDN. + *

+ * @param newparent string

+ * The new parent/superior entry. + *

+ * @param deleteoldrdn bool

+ * If true the old RDN value(s) is removed, else the old RDN value(s) + * is retained as non-distinguished values of the entry. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_rename ($link_identifier, $dn, $newrdn, $newparent, $deleteoldrdn) {} + +/** + * Get the current value for given option + * @link http://www.php.net/manual/en/function.ldap-get-option.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param option int

+ * The parameter option can be one of: + * + * Option + * Type + * + * + * LDAP_OPT_DEREF + * integer + * + * + * LDAP_OPT_SIZELIMIT + * integer + * + * + * LDAP_OPT_TIMELIMIT + * integer + * + * + * LDAP_OPT_NETWORK_TIMEOUT + * integer + * + * + * LDAP_OPT_PROTOCOL_VERSION + * integer + * + * + * LDAP_OPT_ERROR_NUMBER + * integer + * + * + * LDAP_OPT_REFERRALS + * bool + * + * + * LDAP_OPT_RESTART + * bool + * + * + * LDAP_OPT_HOST_NAME + * string + * + * + * LDAP_OPT_ERROR_STRING + * string + * + * + * LDAP_OPT_MATCHED_DN + * string + * + * + * LDAP_OPT_SERVER_CONTROLS + * array + * + * + * LDAP_OPT_CLIENT_CONTROLS + * array + * + *

+ * @param retval mixed

+ * This will be set to the option value. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_get_option ($link_identifier, $option, &$retval) {} + +/** + * Set the value of the given option + * @link http://www.php.net/manual/en/function.ldap-set-option.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param option int

+ * The parameter option can be one of: + * + * Option + * Type + * Available since + * + * + * LDAP_OPT_DEREF + * integer + * + * + * + * LDAP_OPT_SIZELIMIT + * integer + * + * + * + * LDAP_OPT_TIMELIMIT + * integer + * + * + * + * LDAP_OPT_NETWORK_TIMEOUT + * integer + * PHP 5.3.0 + * + * + * LDAP_OPT_PROTOCOL_VERSION + * integer + * + * + * + * LDAP_OPT_ERROR_NUMBER + * integer + * + * + * + * LDAP_OPT_REFERRALS + * bool + * + * + * + * LDAP_OPT_RESTART + * bool + * + * + * + * LDAP_OPT_HOST_NAME + * string + * + * + * + * LDAP_OPT_ERROR_STRING + * string + * + * + * + * LDAP_OPT_MATCHED_DN + * string + * + * + * + * LDAP_OPT_SERVER_CONTROLS + * array + * + * + * + * LDAP_OPT_CLIENT_CONTROLS + * array + * + * + *

+ *

+ * LDAP_OPT_SERVER_CONTROLS and + * LDAP_OPT_CLIENT_CONTROLS require a list of + * controls, this means that the value must be an array of controls. A + * control consists of an oid identifying the control, + * an optional value, and an optional flag for + * criticality. In PHP a control is given by an + * array containing an element with the key oid + * and string value, and two optional elements. The optional + * elements are key value with string value + * and key iscritical with boolean value. + * iscritical defaults to false + * if not supplied. See draft-ietf-ldapext-ldap-c-api-xx.txt + * for details. See also the second example below. + *

+ * @param newval mixed

+ * The new value for the specified option. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_set_option ($link_identifier, $option, $newval) {} + +/** + * Return first reference + * @link http://www.php.net/manual/en/function.ldap-first-reference.php + * @param link resource + * @param result resource + * @return resource + * + * @jms-builtin + */ +function ldap_first_reference ($link, $result) {} + +/** + * Get next reference + * @link http://www.php.net/manual/en/function.ldap-next-reference.php + * @param link resource + * @param entry resource + * @return resource + * + * @jms-builtin + */ +function ldap_next_reference ($link, $entry) {} + +/** + * Extract information from reference entry + * @link http://www.php.net/manual/en/function.ldap-parse-reference.php + * @param link resource + * @param entry resource + * @param referrals array + * @return bool + * + * @jms-builtin + */ +function ldap_parse_reference ($link, $entry, array &$referrals) {} + +/** + * Extract information from result + * @link http://www.php.net/manual/en/function.ldap-parse-result.php + * @param link resource + * @param result resource + * @param errcode int + * @param matcheddn string[optional] + * @param errmsg string[optional] + * @param referrals array[optional] + * @return bool + * + * @jms-builtin + */ +function ldap_parse_result ($link, $result, &$errcode, &$matcheddn = null, &$errmsg = null, array &$referrals = null) {} + +/** + * Start TLS + * @link http://www.php.net/manual/en/function.ldap-start-tls.php + * @param link resource + * @return bool + * + * @jms-builtin + */ +function ldap_start_tls ($link) {} + +/** + * Set a callback function to do re-binds on referral chasing + * @link http://www.php.net/manual/en/function.ldap-set-rebind-proc.php + * @param link resource + * @param callback callback + * @return bool + * + * @jms-builtin + */ +function ldap_set_rebind_proc ($link, $callback) {} + +define ('LDAP_DEREF_NEVER', 0); +define ('LDAP_DEREF_SEARCHING', 1); +define ('LDAP_DEREF_FINDING', 2); +define ('LDAP_DEREF_ALWAYS', 3); +define ('LDAP_OPT_DEREF', 2); +define ('LDAP_OPT_SIZELIMIT', 3); +define ('LDAP_OPT_TIMELIMIT', 4); +define ('LDAP_OPT_PROTOCOL_VERSION', 17); +define ('LDAP_OPT_ERROR_NUMBER', 49); +define ('LDAP_OPT_REFERRALS', 8); +define ('LDAP_OPT_RESTART', 9); +define ('LDAP_OPT_HOST_NAME', 48); +define ('LDAP_OPT_ERROR_STRING', 50); +define ('LDAP_OPT_MATCHED_DN', 51); +define ('LDAP_OPT_SERVER_CONTROLS', 18); +define ('LDAP_OPT_CLIENT_CONTROLS', 19); +define ('LDAP_OPT_DEBUG_LEVEL', 20481); + +// End of ldap v. +?> diff --git a/res/php-5.2-core-api/libxml.php b/res/php-5.2-core-api/libxml.php new file mode 100644 index 0000000..ca7d026 --- /dev/null +++ b/res/php-5.2-core-api/libxml.php @@ -0,0 +1,230 @@ + + * The stream context resource (created with + * stream_context_create) + *

+ * @return void + * + * @jms-builtin + */ +function libxml_set_streams_context ($streams_context) {} + +/** + * Disable libxml errors and allow user to fetch error information as needed + * @link http://www.php.net/manual/en/function.libxml-use-internal-errors.php + * @param use_errors bool[optional]

+ * Whether to enable user error handling. + *

+ * @return bool This function returns the previous value of + * use_errors. + * + * @jms-builtin + */ +function libxml_use_internal_errors ($use_errors = null) {} + +/** + * Retrieve last error from libxml + * @link http://www.php.net/manual/en/function.libxml-get-last-error.php + * @return LibXMLError a LibXMLError object if there is any error in the + * buffer, false otherwise. + * + * @jms-builtin + */ +function libxml_get_last_error () {} + +/** + * Clear libxml error buffer + * @link http://www.php.net/manual/en/function.libxml-clear-errors.php + * @return void + * + * @jms-builtin + */ +function libxml_clear_errors () {} + +/** + * Retrieve array of errors + * @link http://www.php.net/manual/en/function.libxml-get-errors.php + * @return array an array with LibXMLError objects if there are any + * errors in the buffer, or an empty array otherwise. + * + * @jms-builtin + */ +function libxml_get_errors () {} + +/** + * Disable the ability to load external entities + * @link http://www.php.net/manual/en/function.libxml-disable-entity-loader.php + * @param disable bool[optional]

+ * Disable (true) or enable (false) libxml extensions (such as + * , + * and ) to load external entities. + *

+ * @return ReturnType the previous value. + * + * @jms-builtin + */ +function libxml_disable_entity_loader ($disable = null) {} + + +/** + * libxml version like 20605 or 20617 + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_VERSION', 20632); + +/** + * libxml version like 2.6.5 or 2.6.17 + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DOTTED_VERSION', "2.6.32"); + +/** + * Substitute entities + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOENT', 2); + +/** + * Load the external subset + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DTDLOAD', 4); + +/** + * Default DTD attributes + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DTDATTR', 8); + +/** + * Validate with the DTD + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DTDVALID', 16); + +/** + * Suppress error reports + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOERROR', 32); + +/** + * Suppress warning reports + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOWARNING', 64); + +/** + * Remove blank nodes + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOBLANKS', 256); + +/** + * Implement XInclude substitution + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_XINCLUDE', 1024); + +/** + * Remove redundant namespaces declarations + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NSCLEAN', 8192); + +/** + * Merge CDATA as text nodes + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOCDATA', 16384); + +/** + * Disable network access when loading documents + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NONET', 2048); + +/** + * Activate small nodes allocation optimization. This may speed up your + * application without needing to change the code. + *

+ * Only available in Libxml >= 2.6.21 + *

+ * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_COMPACT', 65536); + +/** + * Drop the XML declaration when saving a document + *

+ * Only available in Libxml >= 2.6.21 + *

+ * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOXMLDECL', 2); + +/** + * Expand empty tags (e.g. <br/> to + * <br></br>) + *

+ * This option is currently just available in the + * and + * functions. + *

+ * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOEMPTYTAG', 4); + +/** + * No errors + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_NONE', 0); + +/** + * A simple warning + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_WARNING', 1); + +/** + * A recoverable error + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_ERROR', 2); + +/** + * A fatal error + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_FATAL', 3); + +// End of libxml v. +?> diff --git a/res/php-5.2-core-api/mbstring.php b/res/php-5.2-core-api/mbstring.php new file mode 100644 index 0000000..1854c5d --- /dev/null +++ b/res/php-5.2-core-api/mbstring.php @@ -0,0 +1,1278 @@ + + * The string being converted. + *

+ * @param mode int

+ * The mode of the conversion. It can be one of + * MB_CASE_UPPER, + * MB_CASE_LOWER, or + * MB_CASE_TITLE. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string A case folded version of string converted in the + * way specified by mode. + * + * @jms-builtin + */ +function mb_convert_case ($str, $mode, $encoding = null) {} + +/** + * Make a string uppercase + * @link http://www.php.net/manual/en/function.mb-strtoupper.php + * @param str string

+ * The string being uppercased. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string str with all alphabetic characters converted to uppercase. + * + * @jms-builtin + */ +function mb_strtoupper ($str, $encoding = null) {} + +/** + * Make a string lowercase + * @link http://www.php.net/manual/en/function.mb-strtolower.php + * @param str string

+ * The string being lowercased. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string str with all alphabetic characters converted to lowercase. + * + * @jms-builtin + */ +function mb_strtolower ($str, $encoding = null) {} + +/** + * Set/Get current language + * @link http://www.php.net/manual/en/function.mb-language.php + * @param language string[optional]

+ * Used for encoding + * e-mail messages. Valid languages are "Japanese", + * "ja","English","en" and "uni" + * (UTF-8). mb_send_mail uses this setting to + * encode e-mail. + *

+ *

+ * Language and its setting is ISO-2022-JP/Base64 for + * Japanese, UTF-8/Base64 for uni, ISO-8859-1/quoted printable for + * English. + *

+ * @return mixed If language is set and + * language is valid, it returns + * true. Otherwise, it returns false. + * When language is omitted, it returns the language + * name as a string. If no language is set previously, it then returns + * false. + * + * @jms-builtin + */ +function mb_language ($language = null) {} + +/** + * Set/Get internal character encoding + * @link http://www.php.net/manual/en/function.mb-internal-encoding.php + * @param encoding string[optional]

+ * encoding is the character encoding name + * used for the HTTP input character encoding conversion, HTTP output + * character encoding conversion, and the default character encoding + * for string functions defined by the mbstring module. + *

+ * @return mixed If encoding is set, then + * Returns true on success or false on failure. + * If encoding is omitted, then + * the current character encoding name is returned. + * + * @jms-builtin + */ +function mb_internal_encoding ($encoding = null) {} + +/** + * Detect HTTP input character encoding + * @link http://www.php.net/manual/en/function.mb-http-input.php + * @param type string[optional]

+ * Input string specifies the input type. + * "G" for GET, "P" for POST, "C" for COOKIE, "S" for string, "L" for list, and + * "I" for the whole list (will return array). + * If type is omitted, it returns the last input type processed. + *

+ * @return mixed The character encoding name, as per the type. + * If mb_http_input does not process specified + * HTTP input, it returns false. + * + * @jms-builtin + */ +function mb_http_input ($type = null) {} + +/** + * Set/Get HTTP output character encoding + * @link http://www.php.net/manual/en/function.mb-http-output.php + * @param encoding string[optional]

+ * If encoding is set, + * mb_http_output sets the HTTP output character + * encoding to encoding. + *

+ *

+ * If encoding is omitted, + * mb_http_output returns the current HTTP output + * character encoding. + *

+ * @return mixed If encoding is omitted, + * mb_http_output returns the current HTTP output + * character encoding. Otherwise, + * Returns true on success or false on failure. + * + * @jms-builtin + */ +function mb_http_output ($encoding = null) {} + +/** + * Set/Get character encoding detection order + * @link http://www.php.net/manual/en/function.mb-detect-order.php + * @param encoding_list mixed[optional]

+ * encoding_list is an array or + * comma separated list of character encoding. ("auto" is expanded to + * "ASCII, JIS, UTF-8, EUC-JP, SJIS") + *

+ *

+ * If encoding_list is omitted, it returns + * the current character encoding detection order as array. + *

+ *

+ * This setting affects mb_detect_encoding and + * mb_send_mail. + *

+ *

+ * mbstring currently implements the following + * encoding detection filters. If there is an invalid byte sequence + * for the following encodings, encoding detection will fail. + *

+ * UTF-8, UTF-7, + * ASCII, + * EUC-JP,SJIS, + * eucJP-win, SJIS-win, + * JIS, ISO-2022-JP + *

+ * For ISO-8859-*, mbstring + * always detects as ISO-8859-*. + *

+ *

+ * For UTF-16, UTF-32, + * UCS2 and UCS4, encoding + * detection will fail always. + *

+ *

+ * Useless detect order example + *

+ * @return mixed Returns true on success or false on failure. + * + * @jms-builtin + */ +function mb_detect_order ($encoding_list = null) {} + +/** + * Set/Get substitution character + * @link http://www.php.net/manual/en/function.mb-substitute-character.php + * @param substrchar mixed[optional]

+ * Specify the Unicode value as an integer, + * or as one of the following strings: + * "none" : no output + * @return mixed If substchar is set, it returns true for success, + * otherwise returns false. + * If substchar is not set, it returns the Unicode value, + * or "none" or "long". + * + * @jms-builtin + */ +function mb_substitute_character ($substrchar = null) {} + +/** + * Parse GET/POST/COOKIE data and set global variable + * @link http://www.php.net/manual/en/function.mb-parse-str.php + * @param encoded_string string

+ * The URL encoded data. + *

+ * @param result array[optional]

+ * An array containing decoded and character encoded converted values. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mb_parse_str ($encoded_string, array &$result = null) {} + +/** + * Callback function converts character encoding in output buffer + * @link http://www.php.net/manual/en/function.mb-output-handler.php + * @param contents string

+ * The contents of the output buffer. + *

+ * @param status int

+ * The status of the output buffer. + *

+ * @return string The converted string. + * + * @jms-builtin + */ +function mb_output_handler ($contents, $status) {} + +/** + * Get MIME charset string + * @link http://www.php.net/manual/en/function.mb-preferred-mime-name.php + * @param encoding string

+ * The encoding being checked. + *

+ * @return string The MIME charset string for character encoding + * encoding. + * + * @jms-builtin + */ +function mb_preferred_mime_name ($encoding) {} + +/** + * Get string length + * @link http://www.php.net/manual/en/function.mb-strlen.php + * @param str string

+ * The string being checked for length. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return int the number of characters in + * string str having character encoding + * encoding. A multi-byte character is + * counted as 1. + * + * @jms-builtin + */ +function mb_strlen ($str, $encoding = null) {} + +/** + * Find position of first occurrence of string in a string + * @link http://www.php.net/manual/en/function.mb-strpos.php + * @param haystack string

+ * The string being checked. + *

+ * @param needle string

+ * The position counted from the beginning of haystack. + *

+ * @param offset int[optional]

+ * The search offset. If it is not specified, 0 is used. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return int the numeric position of + * the first occurrence of needle in the + * haystack string. If + * needle is not found, it returns false. + * + * @jms-builtin + */ +function mb_strpos ($haystack, $needle, $offset = null, $encoding = null) {} + +/** + * Find position of last occurrence of a string in a string + * @link http://www.php.net/manual/en/function.mb-strrpos.php + * @param haystack string

+ * The string being checked, for the last occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack. + *

+ * @param offset int[optional] May be specified to begin searching an arbitrary number of characters into + * the string. Negative values will stop searching at an arbitrary point + * prior to the end of the string. + * @param encoding string[optional] &mbstring.encoding.parameter; + * @return int the numeric position of + * the last occurrence of needle in the + * haystack string. If + * needle is not found, it returns false. + * + * @jms-builtin + */ +function mb_strrpos ($haystack, $needle, $offset = null, $encoding = null) {} + +/** + * Finds position of first occurrence of a string within another, case insensitive + * @link http://www.php.net/manual/en/function.mb-stripos.php + * @param haystack string

+ * The string from which to get the position of the first occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param offset int[optional]

+ * The position in haystack + * to start searching + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return int Return the numeric position of the first occurrence of + * needle in the haystack + * string, or false if needle is not found. + * + * @jms-builtin + */ +function mb_stripos ($haystack, $needle, $offset = null, $encoding = null) {} + +/** + * Finds position of last occurrence of a string within another, case insensitive + * @link http://www.php.net/manual/en/function.mb-strripos.php + * @param haystack string

+ * The string from which to get the position of the last occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param offset int[optional]

+ * The position in haystack + * to start searching + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return int Return the numeric position of + * the last occurrence of needle in the + * haystack string, or false + * if needle is not found. + * + * @jms-builtin + */ +function mb_strripos ($haystack, $needle, $offset = null, $encoding = null) {} + +/** + * Finds first occurrence of a string within another + * @link http://www.php.net/manual/en/function.mb-strstr.php + * @param haystack string

+ * The string from which to get the first occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param part bool[optional]

+ * Determines which portion of haystack + * this function returns. + * If set to true, it returns all of haystack + * from the beginning to the first occurrence of needle. + * If set to false, it returns all of haystack + * from the first occurrence of needle to the end, + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack, + * or false if needle is not found. + * + * @jms-builtin + */ +function mb_strstr ($haystack, $needle, $part = null, $encoding = null) {} + +/** + * Finds the last occurrence of a character in a string within another + * @link http://www.php.net/manual/en/function.mb-strrchr.php + * @param haystack string

+ * The string from which to get the last occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param part bool[optional]

+ * Determines which portion of haystack + * this function returns. + * If set to true, it returns all of haystack + * from the beginning to the last occurrence of needle. + * If set to false, it returns all of haystack + * from the last occurrence of needle to the end, + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack. + * or false if needle is not found. + * + * @jms-builtin + */ +function mb_strrchr ($haystack, $needle, $part = null, $encoding = null) {} + +/** + * Finds first occurrence of a string within another, case insensitive + * @link http://www.php.net/manual/en/function.mb-stristr.php + * @param haystack string

+ * The string from which to get the first occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param part bool[optional]

+ * Determines which portion of haystack + * this function returns. + * If set to true, it returns all of haystack + * from the beginning to the first occurrence of needle. + * If set to false, it returns all of haystack + * from the first occurrence of needle to the end, + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack, + * or false if needle is not found. + * + * @jms-builtin + */ +function mb_stristr ($haystack, $needle, $part = null, $encoding = null) {} + +/** + * Finds the last occurrence of a character in a string within another, case insensitive + * @link http://www.php.net/manual/en/function.mb-strrichr.php + * @param haystack string

+ * The string from which to get the last occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param part bool[optional]

+ * Determines which portion of haystack + * this function returns. + * If set to true, it returns all of haystack + * from the beginning to the last occurrence of needle. + * If set to false, it returns all of haystack + * from the last occurrence of needle to the end, + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack. + * or false if needle is not found. + * + * @jms-builtin + */ +function mb_strrichr ($haystack, $needle, $part = null, $encoding = null) {} + +/** + * Count the number of substring occurrences + * @link http://www.php.net/manual/en/function.mb-substr-count.php + * @param haystack string

+ * The string being checked. + *

+ * @param needle string

+ * The string being found. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return int The number of times the + * needle substring occurs in the + * haystack string. + * + * @jms-builtin + */ +function mb_substr_count ($haystack, $needle, $encoding = null) {} + +/** + * Get part of string + * @link http://www.php.net/manual/en/function.mb-substr.php + * @param str string

+ * The string being checked. + *

+ * @param start int

+ * The first position used in str. + *

+ * @param length int[optional]

+ * The maximum length of the returned string. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string mb_substr returns the portion of + * str specified by the + * start and + * length parameters. + * + * @jms-builtin + */ +function mb_substr ($str, $start, $length = null, $encoding = null) {} + +/** + * Get part of string + * @link http://www.php.net/manual/en/function.mb-strcut.php + * @param str string

+ * The string being cut. + *

+ * @param start int

+ * The position that begins the cut. + *

+ * @param length int[optional]

+ * The string being decoded. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string mb_strcut returns the portion of + * str specified by the + * start and + * length parameters. + * + * @jms-builtin + */ +function mb_strcut ($str, $start, $length = null, $encoding = null) {} + +/** + * Return width of string + * @link http://www.php.net/manual/en/function.mb-strwidth.php + * @param str string

+ * The string being decoded. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return int The width of string str. + * + * @jms-builtin + */ +function mb_strwidth ($str, $encoding = null) {} + +/** + * Get truncated string with specified width + * @link http://www.php.net/manual/en/function.mb-strimwidth.php + * @param str string

+ * The string being decoded. + *

+ * @param start int

+ * The start position offset. Number of + * characters from the beginning of string. (First character is 0) + *

+ * @param width int

+ * The width of the desired trim. + *

+ * @param trimmarker string[optional]

+ * A string that is added to the end of string + * when string is truncated. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string The truncated string. If trimmarker is set, + * trimmarker is appended to the return value. + * + * @jms-builtin + */ +function mb_strimwidth ($str, $start, $width, $trimmarker = null, $encoding = null) {} + +/** + * Convert character encoding + * @link http://www.php.net/manual/en/function.mb-convert-encoding.php + * @param str string

+ * The string being encoded. + *

+ * @param to_encoding string

+ * The type of encoding that str is being converted to. + *

+ * @param from_encoding mixed[optional]

+ * Is specified by character code names before conversion. It is either + * an array, or a comma separated enumerated list. + * If from_encoding is not specified, the internal + * encoding will be used. + *

+ *

+ * "auto" may be used, which expands to + * "ASCII,JIS,UTF-8,EUC-JP,SJIS". + *

+ * @return string The encoded string. + * + * @jms-builtin + */ +function mb_convert_encoding ($str, $to_encoding, $from_encoding = null) {} + +/** + * Detect character encoding + * @link http://www.php.net/manual/en/function.mb-detect-encoding.php + * @param str string

+ * The string being detected. + *

+ * @param encoding_list mixed[optional]

+ * encoding_list is list of character + * encoding. Encoding order may be specified by array or comma + * separated list string. + *

+ *

+ * If encoding_list is omitted, + * detect_order is used. + *

+ * @param strict bool[optional]

+ * strict specifies whether to use + * the strict encoding detection or not. + * Default is false. + *

+ * @return string The detected character encoding or false if the encoding cannot be + * detected from the given string. + * + * @jms-builtin + */ +function mb_detect_encoding ($str, $encoding_list = null, $strict = null) {} + +/** + * Returns an array of all supported encodings + * @link http://www.php.net/manual/en/function.mb-list-encodings.php + * @return array a numerically indexed array. + * + * @jms-builtin + */ +function mb_list_encodings () {} + +/** + * Convert "kana" one from another ("zen-kaku", "han-kaku" and more) + * @link http://www.php.net/manual/en/function.mb-convert-kana.php + * @param str string

+ * The string being converted. + *

+ * @param option string[optional]

+ * The conversion option. + *

+ *

+ * Specify with a combination of following options. + * + * Applicable Conversion Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionMeaning
r + * Convert "zen-kaku" alphabets to "han-kaku" + *
R + * Convert "han-kaku" alphabets to "zen-kaku" + *
n + * Convert "zen-kaku" numbers to "han-kaku" + *
N + * Convert "han-kaku" numbers to "zen-kaku" + *
a + * Convert "zen-kaku" alphabets and numbers to "han-kaku" + *
A + * Convert "han-kaku" alphabets and numbers to "zen-kaku" + * (Characters included in "a", "A" options are + * U+0021 - U+007E excluding U+0022, U+0027, U+005C, U+007E) + *
s + * Convert "zen-kaku" space to "han-kaku" (U+3000 -> U+0020) + *
S + * Convert "han-kaku" space to "zen-kaku" (U+0020 -> U+3000) + *
k + * Convert "zen-kaku kata-kana" to "han-kaku kata-kana" + *
K + * Convert "han-kaku kata-kana" to "zen-kaku kata-kana" + *
h + * Convert "zen-kaku hira-gana" to "han-kaku kata-kana" + *
H + * Convert "han-kaku kata-kana" to "zen-kaku hira-gana" + *
c + * Convert "zen-kaku kata-kana" to "zen-kaku hira-gana" + *
C + * Convert "zen-kaku hira-gana" to "zen-kaku kata-kana" + *
V + * Collapse voiced sound notation and convert them into a character. Use with "K","H" + *
+ *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string The converted string. + * + * @jms-builtin + */ +function mb_convert_kana ($str, $option = null, $encoding = null) {} + +/** + * Encode string for MIME header + * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php + * @param str string

+ * The string being encoded. + *

+ * @param charset string[optional]

+ * charset specifies the name of the character set + * in which str is represented in. The default value + * is determined by the current NLS setting (mbstring.language). + * mb_internal_encoding should be set to same encoding. + *

+ * @param transfer_encoding string[optional]

+ * transfer_encoding specifies the scheme of MIME + * encoding. It should be either "B" (Base64) or + * "Q" (Quoted-Printable). Falls back to + * "B" if not given. + *

+ * @param linefeed string[optional]

+ * linefeed specifies the EOL (end-of-line) marker + * with which mb_encode_mimeheader performs + * line-folding (a RFC term, + * the act of breaking a line longer than a certain length into multiple + * lines. The length is currently hard-coded to 74 characters). + * Falls back to "\r\n" (CRLF) if not given. + *

+ * @param indent int[optional]

+ * Indentation of the first line (number of characters in the header + * before str). + *

+ * @return string A converted version of the string represented in ASCII. + * + * @jms-builtin + */ +function mb_encode_mimeheader ($str, $charset = null, $transfer_encoding = null, $linefeed = null, $indent = null) {} + +/** + * Decode string in MIME header field + * @link http://www.php.net/manual/en/function.mb-decode-mimeheader.php + * @param str string

+ * The string being decoded. + *

+ * @return string The decoded string in internal character encoding. + * + * @jms-builtin + */ +function mb_decode_mimeheader ($str) {} + +/** + * Convert character code in variable(s) + * @link http://www.php.net/manual/en/function.mb-convert-variables.php + * @param to_encoding string

+ * The encoding that the string is being converted to. + *

+ * @param from_encoding mixed

+ * from_encoding is specified as an array + * or comma separated string, it tries to detect encoding from + * from-coding. When from_encoding + * is omitted, detect_order is used. + *

+ * @param vars mixed

+ * vars is the reference to the + * variable being converted. String, Array and Object are accepted. + * mb_convert_variables assumes all parameters + * have the same encoding. + *

+ * @param _ mixed[optional] + * @return string The character encoding before conversion for success, + * or false for failure. + * + * @jms-builtin + */ +function mb_convert_variables ($to_encoding, $from_encoding, &$vars, &$_ = null) {} + +/** + * Encode character to HTML numeric string reference + * @link http://www.php.net/manual/en/function.mb-encode-numericentity.php + * @param str string

+ * The string being encoded. + *

+ * @param convmap array

+ * convmap is array specifies code area to + * convert. + *

+ * @param encoding string &mbstring.encoding.parameter; + * @return string The converted string. + * + * @jms-builtin + */ +function mb_encode_numericentity ($str, array $convmap, $encoding) {} + +/** + * Decode HTML numeric string reference to character + * @link http://www.php.net/manual/en/function.mb-decode-numericentity.php + * @param str string

+ * The string being decoded. + *

+ * @param convmap array

+ * convmap is an array that specifies + * the code area to convert. + *

+ * @param encoding string &mbstring.encoding.parameter; + * @return string The converted string. + * + * @jms-builtin + */ +function mb_decode_numericentity ($str, array $convmap, $encoding) {} + +/** + * Send encoded mail + * @link http://www.php.net/manual/en/function.mb-send-mail.php + * @param to string

+ * The mail addresses being sent to. Multiple + * recipients may be specified by putting a comma between each + * address in to. + * This parameter is not automatically encoded. + *

+ * @param subject string

+ * The subject of the mail. + *

+ * @param message string

+ * The message of the mail. + *

+ * @param additional_headers string[optional]

+ * additional_headers is inserted at + * the end of the header. This is typically used to add extra + * headers. Multiple extra headers are separated with a + * newline ("\n"). + *

+ * @param additional_parameter string[optional]

+ * additional_parameter is a MTA command line + * parameter. It is useful when setting the correct Return-Path + * header when using sendmail. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mb_send_mail ($to, $subject, $message, $additional_headers = null, $additional_parameter = null) {} + +/** + * Get internal settings of mbstring + * @link http://www.php.net/manual/en/function.mb-get-info.php + * @param type string[optional]

+ * If type isn't specified or is specified to + * "all", an array having the elements "internal_encoding", + * "http_output", "http_input", "func_overload", "mail_charset", + * "mail_header_encoding", "mail_body_encoding" will be returned. + *

+ *

+ * If type is specified as "http_output", + * "http_input", "internal_encoding", "func_overload", + * the specified setting parameter will be returned. + *

+ * @return mixed An array of type information if type + * is not specified, otherwise a specific type. + * + * @jms-builtin + */ +function mb_get_info ($type = null) {} + +/** + * Check if the string is valid for the specified encoding + * @link http://www.php.net/manual/en/function.mb-check-encoding.php + * @param var string[optional]

+ * The byte stream to check. If it is omitted, this function checks + * all the input from the beginning of the request. + *

+ * @param encoding string[optional]

+ * The expected encoding. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mb_check_encoding ($var = null, $encoding = null) {} + +/** + * Returns current encoding for multibyte regex as string + * @link http://www.php.net/manual/en/function.mb-regex-encoding.php + * @param encoding string[optional] &mbstring.encoding.parameter; + * @return mixed + * + * @jms-builtin + */ +function mb_regex_encoding ($encoding = null) {} + +/** + * Set/Get the default options for mbregex functions + * @link http://www.php.net/manual/en/function.mb-regex-set-options.php + * @param options string[optional]

+ * The options to set. This is a a string where each + * character is an option. To set a mode, the mode + * character must be the last one set, however there + * can only be set one mode but multiple options. + *

+ * + * Regex options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionMeaning
iAmbiguity match on
xEnables extended pattern form
m'.' matches with newlines
s'^' -> '\A', '$' -> '\Z'
pSame as both the m and s options
lFinds longest matches
nIgnores empty matches
eeval resulting code
+ * + * Regex syntax modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ModeMeaning
jJava (Sun java.util.regex)
uGNU regex
ggrep
cEmacs
rRuby
zPerl
bPOSIX Basic regex
dPOSIX Extended regex
+ * @return string The previous options. If options is omitted, + * it returns the string that describes the current options. + * + * @jms-builtin + */ +function mb_regex_set_options ($options = null) {} + +/** + * Regular expression match with multibyte support + * @link http://www.php.net/manual/en/function.mb-ereg.php + * @param pattern string

+ * The search pattern. + *

+ * @param string string

+ * The search string. + *

+ * @param regs array[optional]

+ * Contains a substring of the matched string. + *

+ * @return int + * + * @jms-builtin + */ +function mb_ereg ($pattern, $string, array $regs = null) {} + +/** + * Regular expression match ignoring case with multibyte support + * @link http://www.php.net/manual/en/function.mb-eregi.php + * @param pattern string

+ * The regular expression pattern. + *

+ * @param string string

+ * The string being searched. + *

+ * @param regs array[optional]

+ * Contains a substring of the matched string. + *

+ * @return int + * + * @jms-builtin + */ +function mb_eregi ($pattern, $string, array $regs = null) {} + +/** + * Replace regular expression with multibyte support + * @link http://www.php.net/manual/en/function.mb-ereg-replace.php + * @param pattern string

+ * The regular expression pattern. + *

+ *

+ * Multibyte characters may be used in pattern. + *

+ * @param replacement string

+ * The replacement text. + *

+ * @param string string

+ * The string being checked. + *

+ * @param option string[optional] Matching condition can be set by option + * parameter. If i is specified for this + * parameter, the case will be ignored. If x is + * specified, white space will be ignored. If m + * is specified, match will be executed in multiline mode and line + * break will be included in '.'. If p is + * specified, match will be executed in POSIX mode, line break + * will be considered as normal character. If e + * is specified, replacement string will be + * evaluated as PHP expression. + * @return string The resultant string on success, or false on error. + * + * @jms-builtin + */ +function mb_ereg_replace ($pattern, $replacement, $string, $option = null) {} + +/** + * Replace regular expression with multibyte support ignoring case + * @link http://www.php.net/manual/en/function.mb-eregi-replace.php + * @param pattern string

+ * The regular expression pattern. Multibyte characters may be used. The case will be ignored. + *

+ * @param replace string

+ * The replacement text. + *

+ * @param string string

+ * The searched string. + *

+ * @param option string[optional] option has the same meaning as in + * mb_ereg_replace. + * @return string The resultant string or false on error. + * + * @jms-builtin + */ +function mb_eregi_replace ($pattern, $replace, $string, $option = null) {} + +/** + * Split multibyte string using regular expression + * @link http://www.php.net/manual/en/function.mb-split.php + * @param pattern string

+ * The regular expression pattern. + *

+ * @param string string

+ * The string being split. + *

+ * @param limit int[optional] If optional parameter limit is specified, + * it will be split in limit elements as + * maximum. + * @return array The result as an array. + * + * @jms-builtin + */ +function mb_split ($pattern, $string, $limit = null) {} + +/** + * Regular expression match for multibyte string + * @link http://www.php.net/manual/en/function.mb-ereg-match.php + * @param pattern string

+ * The regular expression pattern. + *

+ * @param string string

+ * The string being evaluated. + *

+ * @param option string[optional]

+ *

+ * @return bool + * + * @jms-builtin + */ +function mb_ereg_match ($pattern, $string, $option = null) {} + +/** + * Multibyte regular expression match for predefined multibyte string + * @link http://www.php.net/manual/en/function.mb-ereg-search.php + * @param pattern string[optional]

+ * The search pattern. + *

+ * @param option string[optional]

+ * The search option. + *

+ * @return bool + * + * @jms-builtin + */ +function mb_ereg_search ($pattern = null, $option = null) {} + +/** + * Returns position and length of a matched part of the multibyte regular expression for a predefined multibyte string + * @link http://www.php.net/manual/en/function.mb-ereg-search-pos.php + * @param pattern string[optional]

+ * The search pattern. + *

+ * @param option string[optional]

+ * The search option. + *

+ * @return array + * + * @jms-builtin + */ +function mb_ereg_search_pos ($pattern = null, $option = null) {} + +/** + * Returns the matched part of a multibyte regular expression + * @link http://www.php.net/manual/en/function.mb-ereg-search-regs.php + * @param pattern string[optional]

+ * The search pattern. + *

+ * @param option string[optional]

+ * The search option. + *

+ * @return array + * + * @jms-builtin + */ +function mb_ereg_search_regs ($pattern = null, $option = null) {} + +/** + * Setup string and regular expression for a multibyte regular expression match + * @link http://www.php.net/manual/en/function.mb-ereg-search-init.php + * @param string string

+ * The search string. + *

+ * @param pattern string[optional]

+ * The search pattern. + *

+ * @param option string[optional]

+ * The search option. + *

+ * @return bool + * + * @jms-builtin + */ +function mb_ereg_search_init ($string, $pattern = null, $option = null) {} + +/** + * Retrieve the result from the last multibyte regular expression match + * @link http://www.php.net/manual/en/function.mb-ereg-search-getregs.php + * @return array + * + * @jms-builtin + */ +function mb_ereg_search_getregs () {} + +/** + * Returns start point for next regular expression match + * @link http://www.php.net/manual/en/function.mb-ereg-search-getpos.php + * @return int + * + * @jms-builtin + */ +function mb_ereg_search_getpos () {} + +/** + * Set start point of next regular expression match + * @link http://www.php.net/manual/en/function.mb-ereg-search-setpos.php + * @param position int

+ * The position to set. + *

+ * @return bool + * + * @jms-builtin + */ +function mb_ereg_search_setpos ($position) {} + +function mbregex_encoding () {} + +function mbereg () {} + +function mberegi () {} + +function mbereg_replace () {} + +function mberegi_replace () {} + +function mbsplit () {} + +function mbereg_match () {} + +function mbereg_search () {} + +function mbereg_search_pos () {} + +function mbereg_search_regs () {} + +function mbereg_search_init () {} + +function mbereg_search_getregs () {} + +function mbereg_search_getpos () {} + +function mbereg_search_setpos () {} + +define ('MB_OVERLOAD_MAIL', 1); +define ('MB_OVERLOAD_STRING', 2); +define ('MB_OVERLOAD_REGEX', 4); +define ('MB_CASE_UPPER', 0); +define ('MB_CASE_LOWER', 1); +define ('MB_CASE_TITLE', 2); + +// End of mbstring v. +?> diff --git a/res/php-5.2-core-api/mcrypt.php b/res/php-5.2-core-api/mcrypt.php new file mode 100644 index 0000000..d0d8cdf --- /dev/null +++ b/res/php-5.2-core-api/mcrypt.php @@ -0,0 +1,666 @@ + + * One of the MCRYPT_ciphername constants or the name + * of the algorithm as string. + *

+ * @return int Gets the block size, as an integer. + * + * @jms-builtin + */ +function mcrypt_get_block_size ($cipher) {} + +/** + * Get the name of the specified cipher + * @link http://www.php.net/manual/en/function.mcrypt-get-cipher-name.php + * @param cipher int

+ * One of the MCRYPT_ciphername constants or the name + * of the algorithm as string. + *

+ * @return string This function returns the name of the cipher or false, if the cipher does + * not exist. + * + * @jms-builtin + */ +function mcrypt_get_cipher_name ($cipher) {} + +/** + * Create an initialization vector (IV) from a random source + * @link http://www.php.net/manual/en/function.mcrypt-create-iv.php + * @param size int

+ * Determines the size of the IV, parameter source + * (defaults to random value) specifies the source of the IV. + *

+ * @param source int[optional]

+ * The source can be MCRYPT_RAND (system random + * number generator), MCRYPT_DEV_RANDOM (read + * data from /dev/random) and + * MCRYPT_DEV_URANDOM (read data from + * /dev/urandom). Prior to 5.3.0, + * MCRYPT_RAND was the only one supported on Windows. + *

+ * @return string the initialization vector, or false on error. + * + * @jms-builtin + */ +function mcrypt_create_iv ($size, $source = null) {} + +/** + * Get an array of all supported ciphers + * @link http://www.php.net/manual/en/function.mcrypt-list-algorithms.php + * @param lib_dir string[optional]

+ * Specifies the directory where all algorithms are located. If not + * specifies, the value of the mcrypt.algorithms_dir &php.ini; directive + * is used. + *

+ * @return array an array with all the supported algorithms. + * + * @jms-builtin + */ +function mcrypt_list_algorithms ($lib_dir = null) {} + +/** + * Get an array of all supported modes + * @link http://www.php.net/manual/en/function.mcrypt-list-modes.php + * @param lib_dir string[optional]

+ * Specifies the directory where all modes are located. If not + * specifies, the value of the mcrypt.modes_dir + * &php.ini; directive is used. + *

+ * @return array an array with all the supported modes. + * + * @jms-builtin + */ +function mcrypt_list_modes ($lib_dir = null) {} + +/** + * Returns the size of the IV belonging to a specific cipher/mode combination + * @link http://www.php.net/manual/en/function.mcrypt-get-iv-size.php + * @param cipher string

+ * One of the MCRYPT_ciphername constants of the name + * of the algorithm as string. + *

+ * @param mode string

+ * mode is one of the MCRYPT_MODE_modename constants + * or one of "ecb", "cbc", "cfb", "ofb", "nofb" or "stream". The IV is + * ignored in ECB mode as this mode does not require it. You will need to + * have the same IV (think: starting point) both at encryption and + * decryption stages, otherwise your encryption will fail. + *

+ * @return int the size of the Initialisation Vector (IV) in bytes. On error the + * function returns false. If the IV is ignored in the specified cipher/mode + * combination zero is returned. + * + * @jms-builtin + */ +function mcrypt_get_iv_size ($cipher, $mode) {} + +/** + * Encrypts plaintext with given parameters + * @link http://www.php.net/manual/en/function.mcrypt-encrypt.php + * @param cipher string

+ * One of the MCRYPT_ciphername + * constants of the name of the algorithm as string. + *

+ * @param key string

+ * The key with which the data will be encrypted. If it's smaller that + * the required keysize, it is padded with '\0'. It is + * better not to use ASCII strings for keys. + *

+ *

+ * It is recommended to use the mhash functions to create a key from a + * string. + *

+ * @param data string

+ * The data that will be encrypted with the given cipher and mode. If the + * size of the data is not n * blocksize, the data will be padded with + * '\0'. + *

+ *

+ * The returned crypttext can be larger that the size of the data that is + * given by data. + *

+ * @param mode string

+ * One of the MCRYPT_MODE_modename + * constants of one of "ecb", "cbc", "cfb", "ofb", "nofb" or + * "stream". + *

+ * @param iv string[optional]

+ * Used for the initialisation in CBC, CFB, OFB modes, and in some + * algorithms in STREAM mode. If you do not supply an IV, while it is + * needed for an algorithm, the function issues a warning and uses an + * IV with all bytes set to '\0'. + *

+ * @return string the encrypted data, as a string. + * + * @jms-builtin + */ +function mcrypt_encrypt ($cipher, $key, $data, $mode, $iv = null) {} + +/** + * Decrypts crypttext with given parameters + * @link http://www.php.net/manual/en/function.mcrypt-decrypt.php + * @param cipher string

+ * cipher is one of the MCRYPT_ciphername constants + * of the name of the algorithm as string. + *

+ * @param key string

+ * key is the key with which the data is encrypted. + * If it's smaller that the required keysize, it is padded with + * '\0'. + *

+ * @param data string

+ * data is the data that will be decrypted with + * the given cipher and mode. If the size of the data is not n * blocksize, + * the data will be padded with '\0'. + *

+ * @param mode string

+ * mode is one of the MCRYPT_MODE_modename + * constants of one of "ecb", "cbc", "cfb", "ofb", "nofb" or "stream". + *

+ * @param iv string[optional]

+ * The iv parameter is used for the initialisation + * in CBC, CFB, OFB modes, and in some algorithms in STREAM mode. If you + * do not supply an IV, while it is needed for an algorithm, the function + * issues a warning and uses an IV with all bytes set to + * '\0'. + *

+ * @return string the decrypted data as a string. + * + * @jms-builtin + */ +function mcrypt_decrypt ($cipher, $key, $data, $mode, $iv = null) {} + +/** + * Opens the module of the algorithm and the mode to be used + * @link http://www.php.net/manual/en/function.mcrypt-module-open.php + * @param algorithm string

+ * The algorithm to be used. + *

+ * @param algorithm_directory string

+ * The algorithm_directory and + * mode_directory are used to locate the encryption + * modules. When you supply a directory name, it is used. When you set one + * of these to the empty string (""), the value set by + * the mcrypt.algorithms_dir or + * mcrypt.modes_dir ini-directive is used. When + * these are not set, the default directories that are used are the ones + * that were compiled in into libmcrypt (usually + * /usr/local/lib/libmcrypt). + *

+ * @param mode string

+ * The mode to be used. + *

+ * @param mode_directory string

+ *

+ * @return resource Normally it returns an encryption descriptor, or false on error. + * + * @jms-builtin + */ +function mcrypt_module_open ($algorithm, $algorithm_directory, $mode, $mode_directory) {} + +/** + * This function initializes all buffers needed for encryption + * @link http://www.php.net/manual/en/function.mcrypt-generic-init.php + * @param td resource

+ * The encryption descriptor. + *

+ * @param key string

+ * The maximum length of the key should be the one obtained by calling + * mcrypt_enc_get_key_size and every value smaller + * than this is legal. + *

+ * @param iv string

+ * The IV should normally have the size of the algorithms block size, but + * you must obtain the size by calling + * mcrypt_enc_get_iv_size. IV is ignored in ECB. IV + * MUST exist in CFB, CBC, STREAM, nOFB and OFB modes. It needs to be + * random and unique (but not secret). The same IV must be used for + * encryption/decryption. If you do not want to use it you should set it + * to zeros, but this is not recommended. + *

+ * @return int The function returns a negative value on error, -3 when the key length + * was incorrect, -4 when there was a memory allocation problem and any + * other return value is an unknown error. If an error occurs a warning will + * be displayed accordingly. false is returned if incorrect parameters + * were passed. + * + * @jms-builtin + */ +function mcrypt_generic_init ($td, $key, $iv) {} + +/** + * This function encrypts data + * @link http://www.php.net/manual/en/function.mcrypt-generic.php + * @param td resource

+ * The encryption descriptor. + *

+ *

+ * The encryption handle should always be initialized with + * mcrypt_generic_init with a key and an IV before + * calling this function. Where the encryption is done, you should free the + * encryption buffers by calling mcrypt_generic_deinit. + * See mcrypt_module_open for an example. + *

+ * @param data string

+ * The data to encrypt. + *

+ * @return string the encrypted data. + * + * @jms-builtin + */ +function mcrypt_generic ($td, $data) {} + +/** + * Decrypt data + * @link http://www.php.net/manual/en/function.mdecrypt-generic.php + * @param td resource

+ * An encryption descriptor returned by + * mcrypt_module_open + *

+ * @param data string

+ * Encrypted data. + *

+ * @return string + * + * @jms-builtin + */ +function mdecrypt_generic ($td, $data) {} + +/** + * This function terminates encryption + * @link http://www.php.net/manual/en/function.mcrypt-generic-end.php + * @param td resource + * @return bool + * + * @jms-builtin + */ +function mcrypt_generic_end ($td) {} + +/** + * This function deinitializes an encryption module + * @link http://www.php.net/manual/en/function.mcrypt-generic-deinit.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mcrypt_generic_deinit ($td) {} + +/** + * Runs a self test on the opened module + * @link http://www.php.net/manual/en/function.mcrypt-enc-self-test.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return int If the self test succeeds it returns false. In case of an error, it + * returns true. + * + * @jms-builtin + */ +function mcrypt_enc_self_test ($td) {} + +/** + * Checks whether the encryption of the opened mode works on blocks + * @link http://www.php.net/manual/en/function.mcrypt-enc-is-block-algorithm-mode.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return bool true if the mode is for use with block algorithms, otherwise it + * returns false. + * + * @jms-builtin + */ +function mcrypt_enc_is_block_algorithm_mode ($td) {} + +/** + * Checks whether the algorithm of the opened mode is a block algorithm + * @link http://www.php.net/manual/en/function.mcrypt-enc-is-block-algorithm.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return bool true if the algorithm is a block algorithm or false if it is + * a stream one. + * + * @jms-builtin + */ +function mcrypt_enc_is_block_algorithm ($td) {} + +/** + * Checks whether the opened mode outputs blocks + * @link http://www.php.net/manual/en/function.mcrypt-enc-is-block-mode.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return bool true if the mode outputs blocks of bytes or false if it outputs bytes. + * + * @jms-builtin + */ +function mcrypt_enc_is_block_mode ($td) {} + +/** + * Returns the blocksize of the opened algorithm + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-block-size.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return int the block size of the specified algorithm in bytes. + * + * @jms-builtin + */ +function mcrypt_enc_get_block_size ($td) {} + +/** + * Returns the maximum supported keysize of the opened mode + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-key-size.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return int the maximum supported key size of the algorithm in bytes. + * + * @jms-builtin + */ +function mcrypt_enc_get_key_size ($td) {} + +/** + * Returns an array with the supported keysizes of the opened algorithm + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-supported-key-sizes.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return array an array with the key sizes supported by the algorithm + * specified by the encryption descriptor. If it returns an empty + * array then all key sizes between 1 and + * mcrypt_enc_get_key_size are supported by the + * algorithm. + * + * @jms-builtin + */ +function mcrypt_enc_get_supported_key_sizes ($td) {} + +/** + * Returns the size of the IV of the opened algorithm + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-iv-size.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return int the size of the IV, or 0 if the IV is ignored in the algorithm. + * + * @jms-builtin + */ +function mcrypt_enc_get_iv_size ($td) {} + +/** + * Returns the name of the opened algorithm + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-algorithms-name.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return string the name of the opened algorithm as a string. + * + * @jms-builtin + */ +function mcrypt_enc_get_algorithms_name ($td) {} + +/** + * Returns the name of the opened mode + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-modes-name.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return string the name as a string. + * + * @jms-builtin + */ +function mcrypt_enc_get_modes_name ($td) {} + +/** + * This function runs a self test on the specified module + * @link http://www.php.net/manual/en/function.mcrypt-module-self-test.php + * @param algorithm string

+ * The algorithm to test. + *

+ * @param lib_dir string[optional]

+ * The optional lib_dir parameter can contain the + * location of where the algorithm module is on the system. + *

+ * @return bool The function returns true if the self test succeeds, or false when if + * fails. + * + * @jms-builtin + */ +function mcrypt_module_self_test ($algorithm, $lib_dir = null) {} + +/** + * Returns if the specified module is a block algorithm or not + * @link http://www.php.net/manual/en/function.mcrypt-module-is-block-algorithm-mode.php + * @param mode string

+ * The mode to check. + *

+ * @param lib_dir string[optional]

+ * The optional lib_dir parameter can contain the + * location of where the algorithm module is on the system. + *

+ * @return bool This function returns true if the mode is for use with block + * algorithms, otherwise it returns false. (e.g. false for stream, and + * true for cbc, cfb, ofb). + * + * @jms-builtin + */ +function mcrypt_module_is_block_algorithm_mode ($mode, $lib_dir = null) {} + +/** + * This function checks whether the specified algorithm is a block algorithm + * @link http://www.php.net/manual/en/function.mcrypt-module-is-block-algorithm.php + * @param algorithm string

+ * The algorithm to check. + *

+ * @param lib_dir string[optional]

+ * The optional lib_dir parameter can contain the + * location of where the algorithm module is on the system. + *

+ * @return bool This function returns true if the specified algorithm is a block + * algorithm, or false is it is a stream algorithm. + * + * @jms-builtin + */ +function mcrypt_module_is_block_algorithm ($algorithm, $lib_dir = null) {} + +/** + * Returns if the specified mode outputs blocks or not + * @link http://www.php.net/manual/en/function.mcrypt-module-is-block-mode.php + * @param mode string

+ * The mode to check. + *

+ * @param lib_dir string[optional]

+ * The optional lib_dir parameter can contain the + * location of where the algorithm module is on the system. + *

+ * @return bool This function returns true if the mode outputs blocks of bytes or + * false if it outputs just bytes. (e.g. true for cbc and ecb, and + * false for cfb and stream). + * + * @jms-builtin + */ +function mcrypt_module_is_block_mode ($mode, $lib_dir = null) {} + +/** + * Returns the blocksize of the specified algorithm + * @link http://www.php.net/manual/en/function.mcrypt-module-get-algo-block-size.php + * @param algorithm string

+ * The algorithm name. + *

+ * @param lib_dir string[optional]

+ * This optional parameter can contain the location where the mode module + * is on the system. + *

+ * @return int the block size of the algorithm specified in bytes. + * + * @jms-builtin + */ +function mcrypt_module_get_algo_block_size ($algorithm, $lib_dir = null) {} + +/** + * Returns the maximum supported keysize of the opened mode + * @link http://www.php.net/manual/en/function.mcrypt-module-get-algo-key-size.php + * @param algorithm string

+ * The algorithm name. + *

+ * @param lib_dir string[optional]

+ * This optional parameter can contain the location where the mode module + * is on the system. + *

+ * @return int This function returns the maximum supported key size of the + * algorithm specified in bytes. + * + * @jms-builtin + */ +function mcrypt_module_get_algo_key_size ($algorithm, $lib_dir = null) {} + +/** + * Returns an array with the supported keysizes of the opened algorithm + * @link http://www.php.net/manual/en/function.mcrypt-module-get-supported-key-sizes.php + * @param algorithm string

+ * The algorithm to used. + *

+ * @param lib_dir string[optional]

+ * The optional lib_dir parameter can contain the + * location of where the algorithm module is on the system. + *

+ * @return array an array with the key sizes supported by the specified algorithm. + * If it returns an empty array then all key sizes between 1 and + * mcrypt_module_get_algo_key_size are supported by the + * algorithm. + * + * @jms-builtin + */ +function mcrypt_module_get_supported_key_sizes ($algorithm, $lib_dir = null) {} + +/** + * Close the mcrypt module + * @link http://www.php.net/manual/en/function.mcrypt-module-close.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mcrypt_module_close ($td) {} + +define ('MCRYPT_ENCRYPT', 0); +define ('MCRYPT_DECRYPT', 1); +define ('MCRYPT_DEV_RANDOM', 0); +define ('MCRYPT_DEV_URANDOM', 1); +define ('MCRYPT_RAND', 2); +define ('MCRYPT_3DES', "tripledes"); +define ('MCRYPT_ARCFOUR_IV', "arcfour-iv"); +define ('MCRYPT_ARCFOUR', "arcfour"); +define ('MCRYPT_BLOWFISH', "blowfish"); +define ('MCRYPT_BLOWFISH_COMPAT', "blowfish-compat"); +define ('MCRYPT_CAST_128', "cast-128"); +define ('MCRYPT_CAST_256', "cast-256"); +define ('MCRYPT_CRYPT', "crypt"); +define ('MCRYPT_DES', "des"); +define ('MCRYPT_ENIGNA', "crypt"); +define ('MCRYPT_GOST', "gost"); +define ('MCRYPT_LOKI97', "loki97"); +define ('MCRYPT_PANAMA', "panama"); +define ('MCRYPT_RC2', "rc2"); +define ('MCRYPT_RIJNDAEL_128', "rijndael-128"); +define ('MCRYPT_RIJNDAEL_192', "rijndael-192"); +define ('MCRYPT_RIJNDAEL_256', "rijndael-256"); +define ('MCRYPT_SAFER64', "safer-sk64"); +define ('MCRYPT_SAFER128', "safer-sk128"); +define ('MCRYPT_SAFERPLUS', "saferplus"); +define ('MCRYPT_SERPENT', "serpent"); +define ('MCRYPT_THREEWAY', "threeway"); +define ('MCRYPT_TRIPLEDES', "tripledes"); +define ('MCRYPT_TWOFISH', "twofish"); +define ('MCRYPT_WAKE', "wake"); +define ('MCRYPT_XTEA', "xtea"); +define ('MCRYPT_IDEA', "idea"); +define ('MCRYPT_MARS', "mars"); +define ('MCRYPT_RC6', "rc6"); +define ('MCRYPT_SKIPJACK', "skipjack"); +define ('MCRYPT_MODE_CBC', "cbc"); +define ('MCRYPT_MODE_CFB', "cfb"); +define ('MCRYPT_MODE_ECB', "ecb"); +define ('MCRYPT_MODE_NOFB', "nofb"); +define ('MCRYPT_MODE_OFB', "ofb"); +define ('MCRYPT_MODE_STREAM', "stream"); + +// End of mcrypt v. +?> diff --git a/res/php-5.2-core-api/mhash.php b/res/php-5.2-core-api/mhash.php new file mode 100644 index 0000000..5626a15 --- /dev/null +++ b/res/php-5.2-core-api/mhash.php @@ -0,0 +1,109 @@ + + * The hash id. One of the MHASH_XXX constants. + *

+ * @return int the size in bytes or false, if the hash + * does not exist. + * + * @jms-builtin + */ +function mhash_get_block_size ($hash) {} + +/** + * Get the name of the specified hash + * @link http://www.php.net/manual/en/function.mhash-get-hash-name.php + * @param hash int

+ * The hash id. One of the MHASH_XXX constants. + *

+ * @return string the name of the hash or false, if the hash does not exist. + * + * @jms-builtin + */ +function mhash_get_hash_name ($hash) {} + +/** + * Generates a key + * @link http://www.php.net/manual/en/function.mhash-keygen-s2k.php + * @param hash int

+ * The hash id used to create the key. + * One of the MHASH_XXX constants. + *

+ * @param password string

+ * User supplied password. + *

+ * @param salt string

+ * Must be different and random enough for every key you generate in + * order to create different keys. That salt must be known when you check + * the keys, thus it is a good idea to append the key to it. Salt has a + * fixed length of 8 bytes and will be padded with zeros if you supply + * less bytes. + *

+ * @param bytes int

+ * The key length, in bytes. + *

+ * @return string the generated key as a string, or false on error. + * + * @jms-builtin + */ +function mhash_keygen_s2k ($hash, $password, $salt, $bytes) {} + +/** + * Get the highest available hash id + * @link http://www.php.net/manual/en/function.mhash-count.php + * @return int the highest available hash id. Hashes are numbered from 0 to this + * hash id. + * + * @jms-builtin + */ +function mhash_count () {} + +/** + * Compute hash + * @link http://www.php.net/manual/en/function.mhash.php + * @param hash int

+ * The hash id. One of the MHASH_XXX constants. + *

+ * @param data string

+ * The user input, as a string. + *

+ * @param key string[optional]

+ * If specified, the function will return the resulting HMAC instead. + * HMAC is keyed hashing for message authentication, or simply a message + * digest that depends on the specified key. Not all algorithms + * supported in mhash can be used in HMAC mode. + *

+ * @return string the resulting hash (also called digest) or HMAC as a string, or + * false on errors. + * + * @jms-builtin + */ +function mhash ($hash, $data, $key = null) {} + +define ('MHASH_CRC32', 0); +define ('MHASH_MD5', 1); +define ('MHASH_SHA1', 2); +define ('MHASH_HAVAL256', 3); +define ('MHASH_RIPEMD160', 5); +define ('MHASH_TIGER', 7); +define ('MHASH_GOST', 8); +define ('MHASH_CRC32B', 9); +define ('MHASH_HAVAL224', 10); +define ('MHASH_HAVAL192', 11); +define ('MHASH_HAVAL160', 12); +define ('MHASH_HAVAL128', 13); +define ('MHASH_TIGER128', 14); +define ('MHASH_TIGER160', 15); +define ('MHASH_MD4', 16); +define ('MHASH_ADLER32', 18); +define ('MHASH_RIPEMD128', 23); +define ('MHASH_RIPEMD256', 24); +define ('MHASH_RIPEMD320', 25); + +// End of mhash v. +?> diff --git a/res/php-5.2-core-api/mime_magic.php b/res/php-5.2-core-api/mime_magic.php new file mode 100644 index 0000000..9006c2b --- /dev/null +++ b/res/php-5.2-core-api/mime_magic.php @@ -0,0 +1,19 @@ + + * Path to the tested file. + *

+ * @return string the content type in MIME format, like + * text/plain or application/octet-stream. + * + * @jms-builtin + */ +function mime_content_type ($filename) {} + +// End of mime_magic v.0.1 +?> diff --git a/res/php-5.2-core-api/mssql.php b/res/php-5.2-core-api/mssql.php new file mode 100644 index 0000000..1ca5e1a --- /dev/null +++ b/res/php-5.2-core-api/mssql.php @@ -0,0 +1,637 @@ + + * The MS SQL server. It can also include a port number. e.g. + * hostname,port. + *

+ * @param username string[optional]

+ * The username. + *

+ * @param password string[optional]

+ * The password. + *

+ * @param new_link bool[optional]

+ * If a second call is made to mssql_connect with the + * same arguments, no new link will be established, but instead, the link + * identifier of the already opened link will be returned. This parameter + * modifies this behavior and makes mssql_connect + * always open a new link, even if mssql_connect was + * called before with the same parameters. + *

+ * @return resource a MS SQL link identifier on success, or false on error. + * + * @jms-builtin + */ +function mssql_connect ($servername = null, $username = null, $password = null, $new_link = null) {} + +/** + * Open persistent MS SQL connection + * @link http://www.php.net/manual/en/function.mssql-pconnect.php + * @param servername string[optional]

+ * The MS SQL server. It can also include a port number. e.g. + * hostname:port. + *

+ * @param username string[optional]

+ * The username. + *

+ * @param password string[optional]

+ * The password. + *

+ * @param new_link bool[optional]

+ * If a second call is made to mssql_pconnect with + * the same arguments, no new link will be established, but instead, the + * link identifier of the already opened link will be returned. This + * parameter modifies this behavior and makes + * mssql_pconnect always open a new link, even if + * mssql_pconnect was called before with the same + * parameters. + *

+ * @return resource a positive MS SQL persistent link identifier on success, or + * false on error. + * + * @jms-builtin + */ +function mssql_pconnect ($servername = null, $username = null, $password = null, $new_link = null) {} + +/** + * Close MS SQL Server connection + * @link http://www.php.net/manual/en/function.mssql-close.php + * @param link_identifier resource[optional]

+ * A MS SQL link identifier, returned by + * mssql_connect. + *

+ *

+ * This function will not close persistent links generated by + * mssql_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_close ($link_identifier = null) {} + +/** + * Select MS SQL database + * @link http://www.php.net/manual/en/function.mssql-select-db.php + * @param database_name string

+ * The database name. + *

+ *

+ * To escape the name of a database that contains spaces, hyphens ("-"), + * or any other exceptional characters, the database name must be + * enclosed in brackets, as is shown in the example, below. This + * technique must also be applied when selecting a database name that is + * also a reserved word (such as primary). + *

+ * @param link_identifier resource[optional]

+ * A MS SQL link identifier, returned by + * mssql_connect or + * mssql_pconnect. + *

+ *

+ * If no link identifier is specified, the last opened link is assumed. + * If no link is open, the function will try to establish a link as if + * mssql_connect was called, and use it. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_select_db ($database_name, $link_identifier = null) {} + +/** + * Send MS SQL query + * @link http://www.php.net/manual/en/function.mssql-query.php + * @param query string

+ * A SQL query. + *

+ * @param link_identifier resource[optional]

+ * A MS SQL link identifier, returned by + * mssql_connect or + * mssql_pconnect. + *

+ *

+ * If the link identifier isn't specified, the last opened link is + * assumed. If no link is open, the function tries to establish a link + * as if mssql_connect was called, and use it. + *

+ * @param batch_size int[optional]

+ * The number of records to batch in the buffer. + *

+ * @return mixed a MS SQL result resource on success, true if no rows were + * returned, or false on error. + * + * @jms-builtin + */ +function mssql_query ($query, $link_identifier = null, $batch_size = null) {} + +/** + * Returns the next batch of records + * @link http://www.php.net/manual/en/function.mssql-fetch-batch.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return int the batch number as an integer. + * + * @jms-builtin + */ +function mssql_fetch_batch ($result) {} + +/** + * Returns the number of records affected by the query + * @link http://www.php.net/manual/en/function.mssql-rows-affected.php + * @param link_identifier resource

+ * A MS SQL link identifier, returned by + * mssql_connect or + * mssql_pconnect. + *

+ * @return int the number of records affected by last operation. + * + * @jms-builtin + */ +function mssql_rows_affected ($link_identifier) {} + +/** + * Free result memory + * @link http://www.php.net/manual/en/function.mssql-free-result.php + * @param result resource

+ * The result resource that is being freed. This result comes from a + * call to mssql_query. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_free_result ($result) {} + +/** + * Returns the last message from the server + * @link http://www.php.net/manual/en/function.mssql-get-last-message.php + * @return string last error message from server, or an empty string if + * no error messages are returned from MSSQL. + * + * @jms-builtin + */ +function mssql_get_last_message () {} + +/** + * Gets the number of rows in result + * @link http://www.php.net/manual/en/function.mssql-num-rows.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return int the number of rows, as an integer. + * + * @jms-builtin + */ +function mssql_num_rows ($result) {} + +/** + * Gets the number of fields in result + * @link http://www.php.net/manual/en/function.mssql-num-fields.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return int the number of fields, as an integer. + * + * @jms-builtin + */ +function mssql_num_fields ($result) {} + +/** + * Get field information + * @link http://www.php.net/manual/en/function.mssql-fetch-field.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param field_offset int[optional]

+ * The numerical field offset. If the field offset is not specified, the + * next field that was not yet retrieved by this function is retrieved. The + * field_offset starts at 0. + *

+ * @return object an object containing field information. + *

+ *

+ * The properties of the object are: + * + * @jms-builtin + */ +function mssql_fetch_field ($result, $field_offset = null) {} + +/** + * Get row as enumerated array + * @link http://www.php.net/manual/en/function.mssql-fetch-row.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. + * + * @jms-builtin + */ +function mssql_fetch_row ($result) {} + +/** + * Fetch a result row as an associative array, a numeric array, or both + * @link http://www.php.net/manual/en/function.mssql-fetch-array.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param result_type int[optional]

+ * The type of array that is to be fetched. It's a constant and can take + * the following values: MSSQL_ASSOC, + * MSSQL_NUM, and + * MSSQL_BOTH. + *

+ * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. + * + * @jms-builtin + */ +function mssql_fetch_array ($result, $result_type = null) {} + +/** + * Returns an associative array of the current row in the result + * @link http://www.php.net/manual/en/function.mssql-fetch-assoc.php + * @param result_id resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return array an associative array that corresponds to the fetched row, or + * false if there are no more rows. + * + * @jms-builtin + */ +function mssql_fetch_assoc ($result_id) {} + +/** + * Fetch row as object + * @link http://www.php.net/manual/en/function.mssql-fetch-object.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return object an object with properties that correspond to the fetched row, or + * false if there are no more rows. + * + * @jms-builtin + */ +function mssql_fetch_object ($result) {} + +/** + * Get the length of a field + * @link http://www.php.net/manual/en/function.mssql-field-length.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param offset int[optional]

+ * The field offset, starts at 0. If omitted, the current field is used. + *

+ * @return int The length of the specified field index on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mssql_field_length ($result, $offset = null) {} + +/** + * Get the name of a field + * @link http://www.php.net/manual/en/function.mssql-field-name.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param offset int[optional]

+ * The field offset, starts at 0. If omitted, the current field is used. + *

+ * @return string The name of the specified field index on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mssql_field_name ($result, $offset = null) {} + +/** + * Gets the type of a field + * @link http://www.php.net/manual/en/function.mssql-field-type.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param offset int[optional]

+ * The field offset, starts at 0. If omitted, the current field is used. + *

+ * @return string The type of the specified field index on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mssql_field_type ($result, $offset = null) {} + +/** + * Moves internal row pointer + * @link http://www.php.net/manual/en/function.mssql-data-seek.php + * @param result_identifier resource

+ * The result resource that is being evaluated. + *

+ * @param row_number int

+ * The desired row number of the new result pointer. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_data_seek ($result_identifier, $row_number) {} + +/** + * Seeks to the specified field offset + * @link http://www.php.net/manual/en/function.mssql-field-seek.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param field_offset int

+ * The field offset, starts at 0. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_field_seek ($result, $field_offset) {} + +/** + * Get result data + * @link http://www.php.net/manual/en/function.mssql-result.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param row int

+ * The row number. + *

+ * @param field mixed

+ * Can be the field's offset, the field's name or the field's table dot + * field's name (tablename.fieldname). If the column name has been + * aliased ('select foo as bar from...'), it uses the alias instead of + * the column name. + *

+ *

+ * Specifying a numeric offset for the field + * argument is much quicker than specifying a + * fieldname or + * tablename.fieldname argument. + *

+ * @return string the contents of the specified cell. + * + * @jms-builtin + */ +function mssql_result ($result, $row, $field) {} + +/** + * Move the internal result pointer to the next result + * @link http://www.php.net/manual/en/function.mssql-next-result.php + * @param result_id resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return bool true if an additional result set was available or false + * otherwise. + * + * @jms-builtin + */ +function mssql_next_result ($result_id) {} + +/** + * Sets the minimum error severity + * @link http://www.php.net/manual/en/function.mssql-min-error-severity.php + * @param severity int

+ * The new error severity. + *

+ * @return void + * + * @jms-builtin + */ +function mssql_min_error_severity ($severity) {} + +/** + * Sets the minimum message severity + * @link http://www.php.net/manual/en/function.mssql-min-message-severity.php + * @param severity int

+ * The new message severity. + *

+ * @return void + * + * @jms-builtin + */ +function mssql_min_message_severity ($severity) {} + +/** + * Initializes a stored procedure or a remote stored procedure + * @link http://www.php.net/manual/en/function.mssql-init.php + * @param sp_name string

+ * Stored procedure name, like ownew.sp_name or + * otherdb.owner.sp_name. + *

+ * @param link_identifier resource[optional]

+ * A MS SQL link identifier, returned by + * mssql_connect. + *

+ * @return resource a resource identifier "statement", used in subsequent calls to + * mssql_bind and mssql_execute, + * or false on errors. + * + * @jms-builtin + */ +function mssql_init ($sp_name, $link_identifier = null) {} + +/** + * Adds a parameter to a stored procedure or a remote stored procedure + * @link http://www.php.net/manual/en/function.mssql-bind.php + * @param stmt resource

+ * Statement resource, obtained with mssql_init. + *

+ * @param param_name string

+ * The parameter name, as a string. + *

+ *

+ * You have to include the @ character, like in the + * T-SQL syntax. See the explanation included in + * mssql_execute. + *

+ * @param var mixed

+ * The PHP variable you'll bind the MSSQL parameter to. It is passed by + * reference, to retrieve OUTPUT and RETVAL values after + * the procedure execution. + *

+ * @param type int

+ * One of: SQLTEXT, + * SQLVARCHAR, SQLCHAR, + * SQLINT1, SQLINT2, + * SQLINT4, SQLBIT, + * SQLFLT4, SQLFLT8, + * SQLFLTN. + *

+ * @param is_output bool[optional]

+ * Whether the value is an OUTPUT parameter or not. If it's an OUTPUT + * parameter and you don't mention it, it will be treated as a normal + * input parameter and no error will be thrown. + *

+ * @param is_null bool[optional]

+ * Whether the parameter is &null; or not. Passing the &null; value as + * var will not do the job. + *

+ * @param maxlen int[optional]

+ * Used with char/varchar values. You have to indicate the length of the + * data so if the parameter is a varchar(50), the type must be + * SQLVARCHAR and this value 50. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_bind ($stmt, $param_name, &$var, $type, $is_output = null, $is_null = null, $maxlen = null) {} + +/** + * Executes a stored procedure on a MS SQL server database + * @link http://www.php.net/manual/en/function.mssql-execute.php + * @param stmt resource

+ * Statement handle obtained with mssql_init. + *

+ * @param skip_results bool[optional]

+ * Whenever to skip the results or not. + *

+ * @return mixed + * + * @jms-builtin + */ +function mssql_execute ($stmt, $skip_results = null) {} + +/** + * Free statement memory + * @link http://www.php.net/manual/en/function.mssql-free-statement.php + * @param stmt resource

+ * Statement resource, obtained with mssql_init. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_free_statement ($stmt) {} + +/** + * Converts a 16 byte binary GUID to a string + * @link http://www.php.net/manual/en/function.mssql-guid-string.php + * @param binary string

+ * A 16 byte binary GUID. + *

+ * @param short_format bool[optional]

+ * Whenever to use short format. + *

+ * @return string the converted string on success. + * + * @jms-builtin + */ +function mssql_guid_string ($binary, $short_format = null) {} + + +/** + * Return an associative array. Used on + * mssql_fetch_array's + * result_type parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('MSSQL_ASSOC', 1); + +/** + * Return an array with numeric keys. Used on + * mssql_fetch_array's + * result_type parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('MSSQL_NUM', 2); + +/** + * Return an array with both numeric keys and + * keys with their field name. This is the + * default value for mssql_fetch_array's + * result_type parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('MSSQL_BOTH', 3); + +/** + * Indicates the 'TEXT' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLTEXT', 35); + +/** + * Indicates the 'VARCHAR' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLVARCHAR', 39); + +/** + * Indicates the 'CHAR' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLCHAR', 47); + +/** + * Represents one byte, with a range of -128 to 127. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLINT1', 48); + +/** + * Represents two bytes, with a range of -32768 + * to 32767. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLINT2', 52); + +/** + * Represents four bytes, with a range of -2147483648 + * to 2147483647. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLINT4', 56); + +/** + * Indicates the 'BIT' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLBIT', 50); + +/** + * Represents an four byte float. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLFLT4', 59); + +/** + * Represents an eight byte float. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLFLT8', 62); +define ('SQLFLTN', 109); + +// End of mssql v. +?> diff --git a/res/php-5.2-core-api/mysql.php b/res/php-5.2-core-api/mysql.php new file mode 100644 index 0000000..218e2c5 --- /dev/null +++ b/res/php-5.2-core-api/mysql.php @@ -0,0 +1,865 @@ + + * The MySQL server. It can also include a port number. e.g. + * "hostname:port" or a path to a local socket e.g. ":/path/to/socket" for + * the localhost. + *

+ *

+ * If the PHP directive + * mysql.default_host is undefined (default), then the default + * value is 'localhost:3306'. In &sqlsafemode;, this parameter is ignored + * and value 'localhost:3306' is always used. + *

+ * @param username string[optional]

+ * The username. Default value is defined by mysql.default_user. In + * &sqlsafemode;, this parameter is ignored and the name of the user that + * owns the server process is used. + *

+ * @param password string[optional]

+ * The password. Default value is defined by mysql.default_password. In + * &sqlsafemode;, this parameter is ignored and empty password is used. + *

+ * @param new_link bool[optional]

+ * If a second call is made to mysql_connect + * with the same arguments, no new link will be established, but + * instead, the link identifier of the already opened link will be + * returned. The new_link parameter modifies this + * behavior and makes mysql_connect always open + * a new link, even if mysql_connect was called + * before with the same parameters. + * In &sqlsafemode;, this parameter is ignored. + *

+ * @param client_flags int[optional]

+ * The client_flags parameter can be a combination + * of the following constants: + * 128 (enable LOAD DATA LOCAL handling), + * MYSQL_CLIENT_SSL, + * MYSQL_CLIENT_COMPRESS, + * MYSQL_CLIENT_IGNORE_SPACE or + * MYSQL_CLIENT_INTERACTIVE. + * Read the section about for further information. + * In &sqlsafemode;, this parameter is ignored. + *

+ * @return resource a MySQL link identifier on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_connect ($server = null, $username = null, $password = null, $new_link = null, $client_flags = null) {} + +/** + * Open a persistent connection to a MySQL server + * @link http://www.php.net/manual/en/function.mysql-pconnect.php + * @param server string[optional]

+ * The MySQL server. It can also include a port number. e.g. + * "hostname:port" or a path to a local socket e.g. ":/path/to/socket" for + * the localhost. + *

+ *

+ * If the PHP directive + * mysql.default_host is undefined (default), then the default + * value is 'localhost:3306' + *

+ * @param username string[optional]

+ * The username. Default value is the name of the user that owns the + * server process. + *

+ * @param password string[optional]

+ * The password. Default value is an empty password. + *

+ * @param client_flags int[optional]

+ * The client_flags parameter can be a combination + * of the following constants: + * 128 (enable LOAD DATA LOCAL handling), + * MYSQL_CLIENT_SSL, + * MYSQL_CLIENT_COMPRESS, + * MYSQL_CLIENT_IGNORE_SPACE or + * MYSQL_CLIENT_INTERACTIVE. + *

+ * @return resource a MySQL persistent link identifier on success, or false on + * failure. + * + * @jms-builtin + */ +function mysql_pconnect ($server = null, $username = null, $password = null, $client_flags = null) {} + +/** + * Close MySQL connection + * @link http://www.php.net/manual/en/function.mysql-close.php + * @param link_identifier resource[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysql_close ($link_identifier = null) {} + +/** + * Select a MySQL database + * @link http://www.php.net/manual/en/function.mysql-select-db.php + * @param database_name string

+ * The name of the database that is to be selected. + *

+ * @param link_identifier resource[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysql_select_db ($database_name, $link_identifier = null) {} + +/** + * Send a MySQL query + * @link http://www.php.net/manual/en/function.mysql-query.php + * @param query string

+ * A SQL query + *

+ *

+ * The query string should not end with a semicolon. + * Data inside the query should be properly escaped. + *

+ * @param link_identifier resource[optional] + * @return resource For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, + * mysql_query + * returns a resource on success, or false on + * error. + *

+ *

+ * For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, + * mysql_query returns true on success + * or false on error. + *

+ *

+ * The returned result resource should be passed to + * mysql_fetch_array, and other + * functions for dealing with result tables, to access the returned data. + *

+ *

+ * Use mysql_num_rows to find out how many rows + * were returned for a SELECT statement or + * mysql_affected_rows to find out how many + * rows were affected by a DELETE, INSERT, REPLACE, or UPDATE + * statement. + *

+ *

+ * mysql_query will also fail and return false + * if the user does not have permission to access the table(s) referenced by + * the query. + * + * @jms-builtin + */ +function mysql_query ($query, $link_identifier = null) {} + +/** + * Send an SQL query to MySQL without fetching and buffering the result rows. + * @link http://www.php.net/manual/en/function.mysql-unbuffered-query.php + * @param query string

+ * The SQL query to execute. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param link_identifier resource[optional] + * @return resource For SELECT, SHOW, DESCRIBE or EXPLAIN statements, + * mysql_unbuffered_query + * returns a resource on success, or false on + * error. + *

+ *

+ * For other type of SQL statements, UPDATE, DELETE, DROP, etc, + * mysql_unbuffered_query returns true on success + * or false on error. + * + * @jms-builtin + */ +function mysql_unbuffered_query ($query, $link_identifier = null) {} + +/** + * Send a MySQL query + * @link http://www.php.net/manual/en/function.mysql-db-query.php + * @param database string

+ * The name of the database that will be selected. + *

+ * @param query string

+ * The MySQL query. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param link_identifier resource[optional] + * @return resource a positive MySQL result resource to the query result, + * or false on error. The function also returns true/false for + * INSERT/UPDATE/DELETE + * queries to indicate success/failure. + * + * @jms-builtin + */ +function mysql_db_query ($database, $query, $link_identifier = null) {} + +/** + * List databases available on a MySQL server + * @link http://www.php.net/manual/en/function.mysql-list-dbs.php + * @param link_identifier resource[optional] + * @return resource a result pointer resource on success, or false on + * failure. Use the mysql_tablename function to traverse + * this result pointer, or any function for result tables, such as + * mysql_fetch_array. + * + * @jms-builtin + */ +function mysql_list_dbs ($link_identifier = null) {} + +/** + * List tables in a MySQL database + * @link http://www.php.net/manual/en/function.mysql-list-tables.php + * @param database string

+ * The name of the database + *

+ * @param link_identifier resource[optional] + * @return resource A result pointer resource on success&return.falseforfailure;. + *

+ *

+ * Use the mysql_tablename function to + * traverse this result pointer, or any function for result tables, + * such as mysql_fetch_array. + * + * @jms-builtin + */ +function mysql_list_tables ($database, $link_identifier = null) {} + +/** + * List MySQL table fields + * @link http://www.php.net/manual/en/function.mysql-list-fields.php + * @param database_name string

+ * The name of the database that's being queried. + *

+ * @param table_name string

+ * The name of the table that's being queried. + *

+ * @param link_identifier resource[optional] + * @return resource A result pointer resource on success, or false on + * failure. + *

+ *

+ * The returned result can be used with mysql_field_flags, + * mysql_field_len, + * mysql_field_name&listendand; + * mysql_field_type. + * + * @jms-builtin + */ +function mysql_list_fields ($database_name, $table_name, $link_identifier = null) {} + +/** + * List MySQL processes + * @link http://www.php.net/manual/en/function.mysql-list-processes.php + * @param link_identifier resource[optional] + * @return resource A result pointer resource on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_list_processes ($link_identifier = null) {} + +/** + * Returns the text of the error message from previous MySQL operation + * @link http://www.php.net/manual/en/function.mysql-error.php + * @param link_identifier resource[optional] + * @return string the error text from the last MySQL function, or + * '' (empty string) if no error occurred. + * + * @jms-builtin + */ +function mysql_error ($link_identifier = null) {} + +/** + * Returns the numerical value of the error message from previous MySQL operation + * @link http://www.php.net/manual/en/function.mysql-errno.php + * @param link_identifier resource[optional] + * @return int the error number from the last MySQL function, or + * 0 (zero) if no error occurred. + * + * @jms-builtin + */ +function mysql_errno ($link_identifier = null) {} + +/** + * Get number of affected rows in previous MySQL operation + * @link http://www.php.net/manual/en/function.mysql-affected-rows.php + * @param link_identifier resource[optional] + * @return int the number of affected rows on success, and -1 if the last query + * failed. + *

+ *

+ * If the last query was a DELETE query with no WHERE clause, all + * of the records will have been deleted from the table but this + * function will return zero with MySQL versions prior to 4.1.2. + *

+ *

+ * When using UPDATE, MySQL will not update columns where the new value is the + * same as the old value. This creates the possibility that + * mysql_affected_rows may not actually equal the number + * of rows matched, only the number of rows that were literally affected by + * the query. + *

+ *

+ * The REPLACE statement first deletes the record with the same primary key + * and then inserts the new record. This function returns the number of + * deleted records plus the number of inserted records. + * + * @jms-builtin + */ +function mysql_affected_rows ($link_identifier = null) {} + +/** + * Get the ID generated in the last query + * @link http://www.php.net/manual/en/function.mysql-insert-id.php + * @param link_identifier resource[optional] + * @return int The ID generated for an AUTO_INCREMENT column by the previous + * query on success, 0 if the previous + * query does not generate an AUTO_INCREMENT value, or false if + * no MySQL connection was established. + * + * @jms-builtin + */ +function mysql_insert_id ($link_identifier = null) {} + +/** + * Get result data + * @link http://www.php.net/manual/en/function.mysql-result.php + * @param result resource + * @param row int

+ * The row number from the result that's being retrieved. Row numbers + * start at 0. + *

+ * @param field mixed[optional]

+ * The name or offset of the field being retrieved. + *

+ *

+ * It can be the field's offset, the field's name, or the field's table + * dot field name (tablename.fieldname). If the column name has been + * aliased ('select foo as bar from...'), use the alias instead of the + * column name. If undefined, the first field is retrieved. + *

+ * @return string The contents of one cell from a MySQL result set on success, or + * false on failure. + * + * @jms-builtin + */ +function mysql_result ($result, $row, $field = null) {} + +/** + * Get number of rows in result + * @link http://www.php.net/manual/en/function.mysql-num-rows.php + * @param result resource + * @return int The number of rows in a result set on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_num_rows ($result) {} + +/** + * Get number of fields in result + * @link http://www.php.net/manual/en/function.mysql-num-fields.php + * @param result resource + * @return int the number of fields in the result set resource on + * success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_num_fields ($result) {} + +/** + * Get a result row as an enumerated array + * @link http://www.php.net/manual/en/function.mysql-fetch-row.php + * @param result resource + * @return array an numerical array of strings that corresponds to the fetched row, or + * false if there are no more rows. + *

+ *

+ * mysql_fetch_row fetches one row of data from + * the result associated with the specified result identifier. The + * row is returned as an array. Each result column is stored in an + * array offset, starting at offset 0. + * + * @jms-builtin + */ +function mysql_fetch_row ($result) {} + +/** + * Fetch a result row as an associative array, a numeric array, or both + * @link http://www.php.net/manual/en/function.mysql-fetch-array.php + * @param result resource + * @param result_type int[optional]

+ * The type of array that is to be fetched. It's a constant and can + * take the following values: MYSQL_ASSOC, + * MYSQL_NUM, and + * MYSQL_BOTH. + *

+ * @return array an array of strings that corresponds to the fetched row, or false + * if there are no more rows. The type of returned array depends on + * how result_type is defined. By using + * MYSQL_BOTH (default), you'll get an array with both + * associative and number indices. Using MYSQL_ASSOC, you + * only get associative indices (as mysql_fetch_assoc + * works), using MYSQL_NUM, you only get number indices + * (as mysql_fetch_row works). + *

+ *

+ * If two or more columns of the result have the same field names, + * the last column will take precedence. To access the other column(s) + * of the same name, you must use the numeric index of the column or + * make an alias for the column. For aliased columns, you cannot + * access the contents with the original column name. + * + * @jms-builtin + */ +function mysql_fetch_array ($result, $result_type = null) {} + +/** + * Fetch a result row as an associative array + * @link http://www.php.net/manual/en/function.mysql-fetch-assoc.php + * @param result resource + * @return array an associative array of strings that corresponds to the fetched row, or + * false if there are no more rows. + *

+ *

+ * If two or more columns of the result have the same field names, + * the last column will take precedence. To access the other + * column(s) of the same name, you either need to access the + * result with numeric indices by using + * mysql_fetch_row or add alias names. + * See the example at the mysql_fetch_array + * description about aliases. + * + * @jms-builtin + */ +function mysql_fetch_assoc ($result) {} + +/** + * Fetch a result row as an object + * @link http://www.php.net/manual/en/function.mysql-fetch-object.php + * @param result resource + * @param class_name string[optional]

+ * The name of the class to instantiate, set the properties of and return. + * If not specified, a stdClass object is returned. + *

+ * @param params array[optional]

+ * An optional array of parameters to pass to the constructor + * for class_name objects. + *

+ * @return object an object with string properties that correspond to the + * fetched row, or false if there are no more rows. + * + * @jms-builtin + */ +function mysql_fetch_object ($result, $class_name = null, array $params = null) {} + +/** + * Move internal result pointer + * @link http://www.php.net/manual/en/function.mysql-data-seek.php + * @param result resource + * @param row_number int

+ * The desired row number of the new result pointer. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysql_data_seek ($result, $row_number) {} + +/** + * Get the length of each output in a result + * @link http://www.php.net/manual/en/function.mysql-fetch-lengths.php + * @param result resource + * @return array An array of lengths on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_fetch_lengths ($result) {} + +/** + * Get column information from a result and return as an object + * @link http://www.php.net/manual/en/function.mysql-fetch-field.php + * @param result resource + * @param field_offset int[optional]

+ * The numerical field offset. If the field offset is not specified, the + * next field that was not yet retrieved by this function is retrieved. + * The field_offset starts at 0. + *

+ * @return object an object containing field information. The properties + * of the object are: + *

+ *

+ * name - column name + * table - name of the table the column belongs to + * def - default value of the column + * max_length - maximum length of the column + * not_null - 1 if the column cannot be &null; + * primary_key - 1 if the column is a primary key + * unique_key - 1 if the column is a unique key + * multiple_key - 1 if the column is a non-unique key + * numeric - 1 if the column is numeric + * blob - 1 if the column is a BLOB + * type - the type of the column + * unsigned - 1 if the column is unsigned + * zerofill - 1 if the column is zero-filled + * + * @jms-builtin + */ +function mysql_fetch_field ($result, $field_offset = null) {} + +/** + * Set result pointer to a specified field offset + * @link http://www.php.net/manual/en/function.mysql-field-seek.php + * @param result resource + * @param field_offset int + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysql_field_seek ($result, $field_offset) {} + +/** + * Free result memory + * @link http://www.php.net/manual/en/function.mysql-free-result.php + * @param result resource + * @return bool Returns true on success or false on failure. + *

+ *

+ * If a non-resource is used for the result, an + * error of level E_WARNING will be emitted. It's worth noting that + * mysql_query only returns a resource + * for SELECT, SHOW, EXPLAIN, and DESCRIBE queries. + * + * @jms-builtin + */ +function mysql_free_result ($result) {} + +/** + * Get the name of the specified field in a result + * @link http://www.php.net/manual/en/function.mysql-field-name.php + * @param result resource + * @param field_offset int + * @return string The name of the specified field index on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_field_name ($result, $field_offset) {} + +/** + * Get name of the table the specified field is in + * @link http://www.php.net/manual/en/function.mysql-field-table.php + * @param result resource + * @param field_offset int + * @return string The name of the table on success. + * + * @jms-builtin + */ +function mysql_field_table ($result, $field_offset) {} + +/** + * Returns the length of the specified field + * @link http://www.php.net/manual/en/function.mysql-field-len.php + * @param result resource + * @param field_offset int + * @return int The length of the specified field index on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_field_len ($result, $field_offset) {} + +/** + * Get the type of the specified field in a result + * @link http://www.php.net/manual/en/function.mysql-field-type.php + * @param result resource + * @param field_offset int + * @return string The returned field type + * will be one of "int", "real", + * "string", "blob", and others as + * detailed in the MySQL + * documentation. + * + * @jms-builtin + */ +function mysql_field_type ($result, $field_offset) {} + +/** + * Get the flags associated with the specified field in a result + * @link http://www.php.net/manual/en/function.mysql-field-flags.php + * @param result resource + * @param field_offset int + * @return string a string of flags associated with the result&return.falseforfailure;. + *

+ *

+ * The following flags are reported, if your version of MySQL + * is current enough to support them: "not_null", + * "primary_key", "unique_key", + * "multiple_key", "blob", + * "unsigned", "zerofill", + * "binary", "enum", + * "auto_increment" and "timestamp". + * + * @jms-builtin + */ +function mysql_field_flags ($result, $field_offset) {} + +/** + * Escapes a string for use in a mysql_query + * @link http://www.php.net/manual/en/function.mysql-escape-string.php + * @param unescaped_string string

+ * The string that is to be escaped. + *

+ * @return string the escaped string. + * + * @jms-builtin + */ +function mysql_escape_string ($unescaped_string) {} + +/** + * Escapes special characters in a string for use in a SQL statement + * @link http://www.php.net/manual/en/function.mysql-real-escape-string.php + * @param unescaped_string string

+ * The string that is to be escaped. + *

+ * @param link_identifier resource[optional] + * @return string the escaped string, or false on error. + * + * @jms-builtin + */ +function mysql_real_escape_string ($unescaped_string, $link_identifier = null) {} + +/** + * Get current system status + * @link http://www.php.net/manual/en/function.mysql-stat.php + * @param link_identifier resource[optional] + * @return string a string with the status for uptime, threads, queries, open tables, + * flush tables and queries per second. For a complete list of other status + * variables, you have to use the SHOW STATUS SQL command. + * If link_identifier is invalid, &null; is returned. + * + * @jms-builtin + */ +function mysql_stat ($link_identifier = null) {} + +/** + * Return the current thread ID + * @link http://www.php.net/manual/en/function.mysql-thread-id.php + * @param link_identifier resource[optional] + * @return int The thread ID on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_thread_id ($link_identifier = null) {} + +/** + * Returns the name of the character set + * @link http://www.php.net/manual/en/function.mysql-client-encoding.php + * @param link_identifier resource[optional] + * @return string the default character set name for the current connection. + * + * @jms-builtin + */ +function mysql_client_encoding ($link_identifier = null) {} + +/** + * Ping a server connection or reconnect if there is no connection + * @link http://www.php.net/manual/en/function.mysql-ping.php + * @param link_identifier resource[optional] + * @return bool true if the connection to the server MySQL server is working, + * otherwise false. + * + * @jms-builtin + */ +function mysql_ping ($link_identifier = null) {} + +/** + * Get MySQL client info + * @link http://www.php.net/manual/en/function.mysql-get-client-info.php + * @return string The MySQL client version. + * + * @jms-builtin + */ +function mysql_get_client_info () {} + +/** + * Get MySQL host info + * @link http://www.php.net/manual/en/function.mysql-get-host-info.php + * @param link_identifier resource[optional] + * @return string a string describing the type of MySQL connection in use for the + * connection&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_get_host_info ($link_identifier = null) {} + +/** + * Get MySQL protocol info + * @link http://www.php.net/manual/en/function.mysql-get-proto-info.php + * @param link_identifier resource[optional] + * @return int the MySQL protocol on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_get_proto_info ($link_identifier = null) {} + +/** + * Get MySQL server info + * @link http://www.php.net/manual/en/function.mysql-get-server-info.php + * @param link_identifier resource[optional] + * @return string the MySQL server version on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_get_server_info ($link_identifier = null) {} + +/** + * Get information about the most recent query + * @link http://www.php.net/manual/en/function.mysql-info.php + * @param link_identifier resource[optional] + * @return string information about the statement on success, or false on + * failure. See the example below for which statements provide information, + * and what the returned value may look like. Statements that are not listed + * will return false. + * + * @jms-builtin + */ +function mysql_info ($link_identifier = null) {} + +/** + * Sets the client character set + * @link http://www.php.net/manual/en/function.mysql-set-charset.php + * @param charset string

+ * A valid character set name. + *

+ * @param link_identifier resource[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysql_set_charset ($charset, $link_identifier = null) {} + +function mysql () {} + +function mysql_fieldname () {} + +function mysql_fieldtable () {} + +function mysql_fieldlen () {} + +function mysql_fieldtype () {} + +function mysql_fieldflags () {} + +function mysql_selectdb () {} + +function mysql_freeresult () {} + +function mysql_numfields () {} + +function mysql_numrows () {} + +function mysql_listdbs () {} + +function mysql_listtables () {} + +function mysql_listfields () {} + +/** + * Get result data + * @link http://www.php.net/manual/en/function.mysql-db-name.php + * @param result resource

+ * The result pointer from a call to mysql_list_dbs. + *

+ * @param row int

+ * The index into the result set. + *

+ * @param field mixed[optional]

+ * The field name. + *

+ * @return string the database name on success, and false on failure. If false + * is returned, use mysql_error to determine the nature + * of the error. + * + * @jms-builtin + */ +function mysql_db_name ($result, $row, $field = null) {} + +function mysql_dbname () {} + +/** + * Get table name of field + * @link http://www.php.net/manual/en/function.mysql-tablename.php + * @param result resource

+ * A result pointer resource that's returned from + * mysql_list_tables. + *

+ * @param i int

+ * The integer index (row/table number) + *

+ * @return string The name of the table on success&return.falseforfailure;. + *

+ *

+ * Use the mysql_tablename function to + * traverse this result pointer, or any function for result tables, + * such as mysql_fetch_array. + * + * @jms-builtin + */ +function mysql_tablename ($result, $i) {} + +function mysql_table_name () {} + + +/** + * Columns are returned into the array having the fieldname as the array + * index. + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_ASSOC', 1); + +/** + * Columns are returned into the array having a numerical index to the + * fields. This index starts with 0, the first field in the result. + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_NUM', 2); + +/** + * Columns are returned into the array having both a numerical index + * and the fieldname as the array index. + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_BOTH', 3); + +/** + * Use compression protocol + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_COMPRESS', 32); + +/** + * Use SSL encryption. This flag is only available with version 4.x + * of the MySQL client library or newer. Version 3.23.x is bundled both + * with PHP 4 and Windows binaries of PHP 5. + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_SSL', 2048); + +/** + * Allow interactive_timeout seconds (instead of wait_timeout) of + * inactivity before closing the connection. + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_INTERACTIVE', 1024); + +/** + * Allow space after function names + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_IGNORE_SPACE', 256); + +// End of mysql v.1.0 +?> diff --git a/res/php-5.2-core-api/mysqli.php b/res/php-5.2-core-api/mysqli.php new file mode 100644 index 0000000..7d34128 --- /dev/null +++ b/res/php-5.2-core-api/mysqli.php @@ -0,0 +1,2108 @@ + + * Whether to turn on auto-commit or not. + *

+ * @return bool Returns true on success or false on failure. + */ + public function autocommit ($mode) {} + + /** + * Changes the user of the specified database connection + * @link http://www.php.net/manual/en/mysqli.change-user.php + * @param user string

+ * The MySQL user name. + *

+ * @param password string

+ * The MySQL password. + *

+ * @param database string

+ * The database to change to. + *

+ *

+ * If desired, the &null; value may be passed resulting in only changing + * the user and not selecting a database. To select a database in this + * case use the mysqli_select_db function. + *

+ * @return bool Returns true on success or false on failure. + */ + public function change_user ($user, $password, $database) {} + + /** + * Returns the default character set for the database connection + * @link http://www.php.net/manual/en/mysqli.character-set-name.php + * @return string The default character set for the current connection + */ + public function character_set_name () {} + + public function client_encoding () {} + + /** + * Closes a previously opened database connection + * @link http://www.php.net/manual/en/mysqli.close.php + * @return bool Returns true on success or false on failure. + */ + public function close () {} + + /** + * Commits the current transaction + * @link http://www.php.net/manual/en/mysqli.commit.php + * @return bool Returns true on success or false on failure. + */ + public function commit () {} + + public function connect () {} + + /** + * Performs debugging operations + * @link http://www.php.net/manual/en/mysqli.debug.php + * @param message string

+ * A string representing the debugging operation to perform + *

+ * @return bool true. + */ + public function debug ($message) {} + + public function disable_reads_from_master () {} + + public function disable_rpl_parse () {} + + /** + * Dump debugging information into the log + * @link http://www.php.net/manual/en/mysqli.dump-debug-info.php + * @return bool Returns true on success or false on failure. + */ + public function dump_debug_info () {} + + public function enable_reads_from_master () {} + + public function enable_rpl_parse () {} + + /** + * Returns a character set object + * @link http://www.php.net/manual/en/mysqli.get-charset.php + * @return object The function returns a character set object with the following properties: + * charset + *

Character set name

+ * collation + *

Collation name

+ * dir + *

Directory the charset description was fetched from (?) or "" for built-in character sets

+ * min_length + *

Minimum character length in bytes

+ * max_length + *

Maximum character length in bytes

+ * number + *

Internal character set number

+ * state + *

Character set status (?)

+ */ + public function get_charset () {} + + /** + * Returns the MySQL client version as a string + * @link http://www.php.net/manual/en/mysqli.get-client-info.php + * @return string A string that represents the MySQL client library version + */ + public function get_client_info () {} + + public function get_server_info () {} + + /** + * Get result of SHOW WARNINGS + * @link http://www.php.net/manual/en/mysqli.get-warnings.php + * @return mysqli_warnings + */ + public function get_warnings () {} + + /** + * Initializes MySQLi and returns a resource for use with mysqli_real_connect() + * @link http://www.php.net/manual/en/mysqli.init.php + * @return mysqli an object. + */ + public function init () {} + + /** + * Asks the server to kill a MySQL thread + * @link http://www.php.net/manual/en/mysqli.kill.php + * @param processid int + * @return bool Returns true on success or false on failure. + */ + public function kill ($processid) {} + + /** + * Unsets user defined handler for load local infile command + * @link http://www.php.net/manual/en/mysqli.set-local-infile-default.php + * @param link mysqli + * @return void + */ + public function set_local_infile_default (mysqli $link) {} + + /** + * Set callback function for LOAD DATA LOCAL INFILE command + * @link http://www.php.net/manual/en/mysqli.set-local-infile-handler.php + * @param link mysqli + * @param read_func callback

+ * A callback function or object method taking the following parameters: + *

+ * stream + *

A PHP stream associated with the SQL commands INFILE

+ * @return bool Returns true on success or false on failure. + */ + public function set_local_infile_handler (mysqli $link, $read_func) {} + + public function master_query () {} + + /** + * Performs a query on the database + * @link http://www.php.net/manual/en/mysqli.multi-query.php + * @param query string

+ * The query, as a string. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return bool false if the first statement failed. + * To retrieve subsequent errors from other statements you have to call + * mysqli_next_result first. + */ + public function multi_query ($query) {} + + public function mysqli () {} + + /** + * Check if there are any more query results from a multi query + * @link http://www.php.net/manual/en/mysqli.more-results.php + * @return bool Returns true on success or false on failure. + */ + public function more_results () {} + + /** + * Prepare next result from multi_query + * @link http://www.php.net/manual/en/mysqli.next-result.php + * @return bool Returns true on success or false on failure. + */ + public function next_result () {} + + /** + * Set options + * @link http://www.php.net/manual/en/mysqli.options.php + * @param option int

+ * The option that you want to set. It can be one of the following values: + * + * Valid options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
MYSQLI_OPT_CONNECT_TIMEOUTconnection timeout in seconds (supported on Windows with TCP/IP since PHP 5.3.1)
MYSQLI_OPT_LOCAL_INFILEenable/disable use of LOAD LOCAL INFILE
MYSQLI_INIT_COMMANDcommand to execute after when connecting to MySQL server
MYSQLI_READ_DEFAULT_FILE + * Read options from named option file instead of my.cnf + *
MYSQLI_READ_DEFAULT_GROUP + * Read options from the named group from my.cnf + * or the file specified with MYSQL_READ_DEFAULT_FILE. + *
+ *

+ * @param value mixed

+ * The value for the option. + *

+ * @return bool Returns true on success or false on failure. + */ + public function options ($option, $value) {} + + /** + * Pings a server connection, or tries to reconnect if the connection has gone down + * @link http://www.php.net/manual/en/mysqli.ping.php + * @return bool Returns true on success or false on failure. + */ + public function ping () {} + + /** + * Prepare a SQL statement for execution + * @link http://www.php.net/manual/en/mysqli.prepare.php + * @param query string

+ * The query, as a string. + *

+ *

+ * You should not add a terminating semicolon or \g + * to the statement. + *

+ *

+ * This parameter can include one or more parameter markers in the SQL + * statement by embedding question mark (?) characters + * at the appropriate positions. + *

+ *

+ * The markers are legal only in certain places in SQL statements. + * For example, they are allowed in the VALUES() + * list of an INSERT statement (to specify column + * values for a row), or in a comparison with a column in a + * WHERE clause to specify a comparison value. + *

+ *

+ * However, they are not allowed for identifiers (such as table or + * column names), in the select list that names the columns to be + * returned by a SELECT statement, or to specify both + * operands of a binary operator such as the = equal + * sign. The latter restriction is necessary because it would be + * impossible to determine the parameter type. It's not allowed to + * compare marker with NULL by + * ? IS NULL too. In general, parameters are legal + * only in Data Manipulation Language (DML) statements, and not in Data + * Definition Language (DDL) statements. + *

+ * @return mysqli_stmt mysqli_prepare returns a statement object or false if an error occurred. + */ + public function prepare ($query) {} + + /** + * Performs a query on the database + * @link http://www.php.net/manual/en/mysqli.query.php + * @param query string

+ * The query string. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param resultmode int[optional]

+ * Either the constant MYSQLI_USE_RESULT or + * MYSQLI_STORE_RESULT depending on the desired + * behavior. By default, MYSQLI_STORE_RESULT is used. + *

+ *

+ * If you use MYSQLI_USE_RESULT all subsequent calls + * will return error Commands out of sync unless you + * call mysqli_free_result + *

+ *

+ * With MYSQLI_ASYNC (available with mysqlnd), it is + * possible to perform query asynchronously. + * mysqli_poll is then used to get results from such + * queries. + *

+ * @return mixed false on failure. For successful SELECT, SHOW, DESCRIBE or + * EXPLAIN queries mysqli_query will return + * a result object. For other successful queries mysqli_query will + * return true. + */ + public function query ($query, $resultmode = null) {} + + /** + * Opens a connection to a mysql server + * @link http://www.php.net/manual/en/mysqli.real-connect.php + * @param host string[optional]

+ * Can be either a host name or an IP address. Passing the &null; value + * or the string "localhost" to this parameter, the local host is + * assumed. When possible, pipes will be used instead of the TCP/IP + * protocol. + *

+ * @param username string[optional]

+ * The MySQL user name. + *

+ * @param passwd string[optional]

+ * If provided or &null;, the MySQL server will attempt to authenticate + * the user against those user records which have no password only. This + * allows one username to be used with different permissions (depending + * on if a password as provided or not). + *

+ * @param dbname string[optional]

+ * If provided will specify the default database to be used when + * performing queries. + *

+ * @param port int[optional]

+ * Specifies the port number to attempt to connect to the MySQL server. + *

+ * @param socket string[optional]

+ * Specifies the socket or named pipe that should be used. + *

+ *

+ * Specifying the socket parameter will not + * explicitly determine the type of connection to be used when + * connecting to the MySQL server. How the connection is made to the + * MySQL database is determined by the host + * parameter. + *

+ * @param flags int[optional]

+ * With the parameter flags you can set different + * connection options: + *

+ * + * Supported flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
MYSQLI_CLIENT_COMPRESSUse compression protocol
MYSQLI_CLIENT_FOUND_ROWSreturn number of matched rows, not the number of affected rows
MYSQLI_CLIENT_IGNORE_SPACEAllow spaces after function names. Makes all function names reserved words.
MYSQLI_CLIENT_INTERACTIVE + * Allow interactive_timeout seconds (instead of + * wait_timeout seconds) of inactivity before closing the connection + *
MYSQLI_CLIENT_SSLUse SSL (encryption)
+ *

+ * For security reasons the MULTI_STATEMENT flag is + * not supported in PHP. If you want to execute multiple queries use the + * mysqli_multi_query function. + *

+ * @return bool Returns true on success or false on failure. + */ + public function real_connect ($host = null, $username = null, $passwd = null, $dbname = null, $port = null, $socket = null, $flags = null) {} + + /** + * Escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection + * @link http://www.php.net/manual/en/mysqli.real-escape-string.php + * @param escapestr string

+ * The string to be escaped. + *

+ *

+ * Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and + * Control-Z. + *

+ * @return string an escaped string. + */ + public function real_escape_string ($escapestr) {} + + public function escape_string () {} + + /** + * Execute an SQL query + * @link http://www.php.net/manual/en/mysqli.real-query.php + * @param query string

+ * The query, as a string. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return bool Returns true on success or false on failure. + */ + public function real_query ($query) {} + + /** + * Rolls back current transaction + * @link http://www.php.net/manual/en/mysqli.rollback.php + * @return bool Returns true on success or false on failure. + */ + public function rollback () {} + + public function rpl_parse_enabled () {} + + public function rpl_probe () {} + + public function rpl_query_type () {} + + /** + * Selects the default database for database queries + * @link http://www.php.net/manual/en/mysqli.select-db.php + * @param dbname string

+ * The database name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function select_db ($dbname) {} + + /** + * Sets the default client character set + * @link http://www.php.net/manual/en/mysqli.set-charset.php + * @param charset string

+ * The charset to be set as default. + *

+ * @return bool Returns true on success or false on failure. + */ + public function set_charset ($charset) {} + + public function set_opt () {} + + public function send_query () {} + + public function slave_query () {} + + /** + * Used for establishing secure connections using SSL + * @link http://www.php.net/manual/en/mysqli.ssl-set.php + * @param key string

+ * The path name to the key file. + *

+ * @param cert string

+ * The path name to the certificate file. + *

+ * @param ca string

+ * The path name to the certificate authority file. + *

+ * @param capath string

+ * The pathname to a directory that contains trusted SSL CA certificates + * in PEM format. + *

+ * @param cipher string

+ * A list of allowable ciphers to use for SSL encryption. + *

+ * @return bool This function always returns true value. If SSL setup is + * incorrect mysqli_real_connect will return an error + * when you attempt to connect. + */ + public function ssl_set ($key, $cert, $ca, $capath, $cipher) {} + + /** + * Gets the current system status + * @link http://www.php.net/manual/en/mysqli.stat.php + * @return string A string describing the server status. false if an error occurred. + */ + public function stat () {} + + /** + * Initializes a statement and returns an object for use with mysqli_stmt_prepare + * @link http://www.php.net/manual/en/mysqli.stmt-init.php + * @return mysqli_stmt an object. + */ + public function stmt_init () {} + + /** + * Transfers a result set from the last query + * @link http://www.php.net/manual/en/mysqli.store-result.php + * @return mysqli_result a buffered result object or false if an error occurred. + *

+ *

+ * mysqli_store_result returns false in case the query + * didn't return a result set (if the query was, for example an INSERT + * statement). This function also returns false if the reading of the + * result set failed. You can check if you have got an error by checking + * if mysqli_error doesn't return an empty string, if + * mysqli_errno returns a non zero value, or if + * mysqli_field_count returns a non zero value. + * Also possible reason for this function returning false after + * successful call to mysqli_query can be too large + * result set (memory for it cannot be allocated). If + * mysqli_field_count returns a non-zero value, the + * statement should have produced a non-empty result set. + */ + public function store_result () {} + + /** + * Returns whether thread safety is given or not + * @link http://www.php.net/manual/en/mysqli.thread-safe.php + * @return bool true if the client library is thread-safe, otherwise false. + */ + public function thread_safe () {} + + /** + * Initiate a result set retrieval + * @link http://www.php.net/manual/en/mysqli.use-result.php + * @return mysqli_result an unbuffered result object or false if an error occurred. + */ + public function use_result () {} + +} + +final class mysqli_warning { + + /** + * The __construct purpose + * @link http://www.php.net/manual/en/mysqli-warning.construct.php + */ + protected function __construct () {} + + /** + * The next purpose + * @link http://www.php.net/manual/en/mysqli-warning.next.php + * @return void + */ + public function next () {} + +} + +/** @jms-builtin */ +class mysqli_result { + + public function mysqli_result () {} + + public function close () {} + + /** + * Frees the memory associated with a result + * @link http://www.php.net/manual/en/mysqli-result.free.php + * @return void + */ + public function free () {} + + /** + * Adjusts the result pointer to an arbitary row in the result + * @link http://www.php.net/manual/en/mysqli-result.data-seek.php + * @param offset int

+ * The field offset. Must be between zero and the total number of rows + * minus one (0..mysqli_num_rows - 1). + *

+ * @return bool Returns true on success or false on failure. + */ + public function data_seek ($offset) {} + + /** + * Returns the next field in the result set + * @link http://www.php.net/manual/en/mysqli-result.fetch-field.php + * @return object an object which contains field definition information or false + * if no field information is available. + *

+ *

+ * + * Object properties + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
PropertyDescription
nameThe name of the column
orgnameOriginal column name if an alias was specified
tableThe name of the table this field belongs to (if not calculated)
orgtableOriginal table name if an alias was specified
defThe default value for this field, represented as a string
max_lengthThe maximum width of the field for the result set.
lengthThe width of the field, as specified in the table definition.
charsetnrThe character set number for the field.
flagsAn integer representing the bit-flags for the field.
typeThe data type used for this field
decimalsThe number of decimals used (for integer fields)
+ */ + public function fetch_field () {} + + /** + * Returns an array of objects representing the fields in a result set + * @link http://www.php.net/manual/en/mysqli-result.fetch-fields.php + * @return array an array of objects which contains field definition information or + * false if no field information is available. + *

+ *

+ * + * Object properties + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
PropertyDescription
nameThe name of the column
orgnameOriginal column name if an alias was specified
tableThe name of the table this field belongs to (if not calculated)
orgtableOriginal table name if an alias was specified
defThe default value for this field, represented as a string
max_lengthThe maximum width of the field for the result set.
lengthThe width of the field, as specified in the table definition.
charsetnrThe character set number for the field.
flagsAn integer representing the bit-flags for the field.
typeThe data type used for this field
decimalsThe number of decimals used (for integer fields)
+ */ + public function fetch_fields () {} + + /** + * Fetch meta-data for a single field + * @link http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php + * @param fieldnr int

+ * The field number. This value must be in the range from + * 0 to number of fields - 1. + *

+ * @return object an object which contains field definition information or false + * if no field information for specified fieldnr is + * available. + *

+ *

+ * + * Object attributes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
AttributeDescription
nameThe name of the column
orgnameOriginal column name if an alias was specified
tableThe name of the table this field belongs to (if not calculated)
orgtableOriginal table name if an alias was specified
defThe default value for this field, represented as a string
max_lengthThe maximum width of the field for the result set.
lengthThe width of the field, as specified in the table definition.
charsetnrThe character set number for the field.
flagsAn integer representing the bit-flags for the field.
typeThe data type used for this field
decimalsThe number of decimals used (for integer fields)
+ */ + public function fetch_field_direct ($fieldnr) {} + + /** + * Fetch a result row as an associative, a numeric array, or both + * @link http://www.php.net/manual/en/mysqli-result.fetch-array.php + * @param resulttype int[optional]

+ * This optional parameter is a constant indicating what type of array + * should be produced from the current row data. The possible values for + * this parameter are the constants MYSQLI_ASSOC, + * MYSQLI_NUM, or MYSQLI_BOTH. + *

+ *

+ * By using the MYSQLI_ASSOC constant this function + * will behave identically to the mysqli_fetch_assoc, + * while MYSQLI_NUM will behave identically to the + * mysqli_fetch_row function. The final option + * MYSQLI_BOTH will create a single array with the + * attributes of both. + *

+ * @return mixed an array of strings that corresponds to the fetched row or &null; if there + * are no more rows in resultset. + */ + public function fetch_array ($resulttype = null) {} + + /** + * Fetch a result row as an associative array + * @link http://www.php.net/manual/en/mysqli-result.fetch-assoc.php + * @return array an associative array of strings representing the fetched row in the result + * set, where each key in the array represents the name of one of the result + * set's columns or &null; if there are no more rows in resultset. + *

+ *

+ * If two or more columns of the result have the same field names, the last + * column will take precedence. To access the other column(s) of the same + * name, you either need to access the result with numeric indices by using + * mysqli_fetch_row or add alias names. + */ + public function fetch_assoc () {} + + /** + * Returns the current row of a result set as an object + * @link http://www.php.net/manual/en/mysqli-result.fetch-object.php + * @param class_name string[optional]

+ * The name of the class to instantiate, set the properties of and return. + * If not specified, a stdClass object is returned. + *

+ * @param params array[optional]

+ * An optional array of parameters to pass to the constructor + * for class_name objects. + *

+ * @return object an object with string properties that corresponds to the fetched + * row or &null; if there are no more rows in resultset. + */ + public function fetch_object ($class_name = null, array $params = null) {} + + /** + * Get a result row as an enumerated array + * @link http://www.php.net/manual/en/mysqli-result.fetch-row.php + * @return mixed mysqli_fetch_row returns an array of strings that corresponds to the fetched row + * or &null; if there are no more rows in result set. + */ + public function fetch_row () {} + + /** + * Get the number of fields in a result + * @link http://www.php.net/manual/en/mysqli-result.field-count.php + * @param result mysqli_result + * @return int The number of fields from a result set. + */ + public function field_count (mysqli_result $result) {} + + /** + * Set result pointer to a specified field offset + * @link http://www.php.net/manual/en/mysqli-result.field-seek.php + * @param fieldnr int

+ * The field number. This value must be in the range from + * 0 to number of fields - 1. + *

+ * @return bool Returns true on success or false on failure. + */ + public function field_seek ($fieldnr) {} + + public function free_result () {} + +} + +/** @jms-builtin */ +class mysqli_stmt { + + public function mysqli_stmt () {} + + /** + * Used to get the current value of a statement attribute + * @link http://www.php.net/manual/en/mysqli-stmt.attr-get.php + * @param attr int

+ * The attribute that you want to get. + *

+ * @return int false if the attribute is not found, otherwise returns the value of the attribute. + */ + public function attr_get ($attr) {} + + /** + * Used to modify the behavior of a prepared statement + * @link http://www.php.net/manual/en/mysqli-stmt.attr-set.php + * @param attr int

+ * The attribute that you want to set. It can have one of the following values: + * + * Attribute values + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CharacterDescription
MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH + * If set to 1, causes mysqli_stmt_store_result to + * update the metadata MYSQL_FIELD->max_length value. + *
MYSQLI_STMT_ATTR_CURSOR_TYPE + * Type of cursor to open for statement when mysqli_stmt_execute + * is invoked. mode can be MYSQLI_CURSOR_TYPE_NO_CURSOR + * (the default) or MYSQLI_CURSOR_TYPE_READ_ONLY. + *
MYSQLI_STMT_ATTR_PREFETCH_ROWS + * Number of rows to fetch from server at a time when using a cursor. + * mode can be in the range from 1 to the maximum + * value of unsigned long. The default is 1. + *
+ *

+ *

+ * If you use the MYSQLI_STMT_ATTR_CURSOR_TYPE option with + * MYSQLI_CURSOR_TYPE_READ_ONLY, a cursor is opened for the + * statement when you invoke mysqli_stmt_execute. If there + * is already an open cursor from a previous mysqli_stmt_execute call, + * it closes the cursor before opening a new one. mysqli_stmt_reset + * also closes any open cursor before preparing the statement for re-execution. + * mysqli_stmt_free_result closes any open cursor. + *

+ *

+ * If you open a cursor for a prepared statement, mysqli_stmt_store_result + * is unnecessary. + *

+ * @param mode int

The value to assign to the attribute.

+ * @return bool + */ + public function attr_set ($attr, $mode) {} + + /** + * Binds variables to a prepared statement as parameters + * @link http://www.php.net/manual/en/mysqli-stmt.bind-param.php + * @param types string

+ * A string that contains one or more characters which specify the types + * for the corresponding bind variables: + * + * Type specification chars + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CharacterDescription
icorresponding variable has type integer
dcorresponding variable has type double
scorresponding variable has type string
bcorresponding variable is a blob and will be sent in packets
+ *

+ * @param var1 mixed

+ * The number of variables and length of string + * types must match the parameters in the statement. + *

+ * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + */ + public function bind_param ($types, &$var1, &$_ = null) {} + + /** + * Binds variables to a prepared statement for result storage + * @link http://www.php.net/manual/en/mysqli-stmt.bind-result.php + * @param var1 mixed

+ * The variable to be bound. + *

+ * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + */ + public function bind_result (&$var1, &$_ = null) {} + + /** + * Closes a prepared statement + * @link http://www.php.net/manual/en/mysqli-stmt.close.php + * @return bool Returns true on success or false on failure. + */ + public function close () {} + + /** + * Seeks to an arbitrary row in statement result set + * @link http://www.php.net/manual/en/mysqli-stmt.data-seek.php + * @param offset int

+ * Must be between zero and the total number of rows minus one (0.. + * mysqli_stmt_num_rows - 1). + *

+ * @return void + */ + public function data_seek ($offset) {} + + /** + * Executes a prepared Query + * @link http://www.php.net/manual/en/mysqli-stmt.execute.php + * @return bool Returns true on success or false on failure. + */ + public function execute () {} + + /** + * Fetch results from a prepared statement into the bound variables + * @link http://www.php.net/manual/en/mysqli-stmt.fetch.php + * @return bool + */ + public function fetch () {} + + /** + * Get result of SHOW WARNINGS + * @link http://www.php.net/manual/en/mysqli-stmt.get-warnings.php + * @param stmt mysqli_stmt + * @return object + */ + public function get_warnings (mysqli_stmt $stmt) {} + + /** + * Returns result set metadata from a prepared statement + * @link http://www.php.net/manual/en/mysqli-stmt.result-metadata.php + * @return mysqli_result a result object or false if an error occurred. + */ + public function result_metadata () {} + + /** + * Return the number of rows in statements result set + * @link http://www.php.net/manual/en/mysqli-stmt.num-rows.php + * @param stmt mysqli_stmt + * @return int An integer representing the number of rows in result set. + */ + public function num_rows (mysqli_stmt $stmt) {} + + /** + * Send data in blocks + * @link http://www.php.net/manual/en/mysqli-stmt.send-long-data.php + * @param param_nr int

+ * Indicates which parameter to associate the data with. Parameters are + * numbered beginning with 0. + *

+ * @param data string

+ * A string containing data to be sent. + *

+ * @return bool Returns true on success or false on failure. + */ + public function send_long_data ($param_nr, $data) {} + + public function stmt () {} + + /** + * Frees stored result memory for the given statement handle + * @link http://www.php.net/manual/en/mysqli-stmt.free-result.php + * @return void + */ + public function free_result () {} + + /** + * Resets a prepared statement + * @link http://www.php.net/manual/en/mysqli-stmt.reset.php + * @return bool Returns true on success or false on failure. + */ + public function reset () {} + + /** + * Prepare a SQL statement for execution + * @link http://www.php.net/manual/en/mysqli-stmt.prepare.php + * @param query string

+ * The query, as a string. It must consist of a single SQL statement. + *

+ *

+ * You can include one or more parameter markers in the SQL statement by + * embedding question mark (?) characters at the + * appropriate positions. + *

+ *

+ * You should not add a terminating semicolon or \g + * to the statement. + *

+ *

+ * The markers are legal only in certain places in SQL statements. + * For example, they are allowed in the VALUES() list of an INSERT statement + * (to specify column values for a row), or in a comparison with a column in + * a WHERE clause to specify a comparison value. + *

+ *

+ * However, they are not allowed for identifiers (such as table or column names), + * in the select list that names the columns to be returned by a SELECT statement), + * or to specify both operands of a binary operator such as the = + * equal sign. The latter restriction is necessary because it would be impossible + * to determine the parameter type. In general, parameters are legal only in Data + * Manipulation Language (DML) statements, and not in Data Definition Language + * (DDL) statements. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function prepare ($query) {} + + /** + * Transfers a result set from a prepared statement + * @link http://www.php.net/manual/en/mysqli-stmt.store-result.php + * @return bool Returns true on success or false on failure. + */ + public function store_result () {} + +} + +function mysqli_affected_rows () {} + +function mysqli_autocommit () {} + +function mysqli_change_user () {} + +function mysqli_character_set_name () {} + +function mysqli_close () {} + +function mysqli_commit () {} + +/** + * &Alias; mysqli::__construct + * @link http://www.php.net/manual/en/function.mysqli-connect.php + * + * @jms-builtin + */ +function mysqli_connect () {} + +function mysqli_connect_errno () {} + +function mysqli_connect_error () {} + +function mysqli_data_seek () {} + +function mysqli_debug () {} + +/** + * Disable reads from master + * @link http://www.php.net/manual/en/function.mysqli-disable-reads-from-master.php + * @return void + * + * @jms-builtin + */ +function mysqli_disable_reads_from_master () {} + +/** + * Disable RPL parse + * @link http://www.php.net/manual/en/function.mysqli-disable-rpl-parse.php + * @param link mysqli + * @return bool + * + * @jms-builtin + */ +function mysqli_disable_rpl_parse (mysqli $link) {} + +function mysqli_dump_debug_info () {} + +/** + * Enable reads from master + * @link http://www.php.net/manual/en/function.mysqli-enable-reads-from-master.php + * @param link mysqli + * @return bool + * + * @jms-builtin + */ +function mysqli_enable_reads_from_master (mysqli $link) {} + +/** + * Enable RPL parse + * @link http://www.php.net/manual/en/function.mysqli-enable-rpl-parse.php + * @param link mysqli + * @return bool + * + * @jms-builtin + */ +function mysqli_enable_rpl_parse (mysqli $link) {} + +function mysqli_embedded_server_end () {} + +function mysqli_embedded_server_start () {} + +function mysqli_errno () {} + +function mysqli_error () {} + +function mysqli_stmt_execute () {} + +/** + * Alias for mysqli_stmt_execute + * @link http://www.php.net/manual/en/function.mysqli-execute.php + * + * @jms-builtin + */ +function mysqli_execute () {} + +function mysqli_fetch_field () {} + +function mysqli_fetch_fields () {} + +function mysqli_fetch_field_direct () {} + +function mysqli_fetch_lengths () {} + +function mysqli_fetch_array () {} + +function mysqli_fetch_assoc () {} + +function mysqli_fetch_object () {} + +function mysqli_fetch_row () {} + +function mysqli_field_count () {} + +function mysqli_field_seek () {} + +function mysqli_field_tell () {} + +function mysqli_free_result () {} + +function mysqli_get_charset () {} + +function mysqli_get_client_info () {} + +function mysqli_get_client_version () {} + +function mysqli_get_host_info () {} + +function mysqli_get_proto_info () {} + +function mysqli_get_server_info () {} + +function mysqli_get_server_version () {} + +function mysqli_get_warnings () {} + +function mysqli_init () {} + +function mysqli_info () {} + +function mysqli_insert_id () {} + +function mysqli_kill () {} + +function mysqli_set_local_infile_default () {} + +function mysqli_set_local_infile_handler () {} + +/** + * Enforce execution of a query on the master in a master/slave setup + * @link http://www.php.net/manual/en/function.mysqli-master-query.php + * @param link mysqli + * @param query string + * @return bool + * + * @jms-builtin + */ +function mysqli_master_query (mysqli $link, $query) {} + +function mysqli_more_results () {} + +function mysqli_multi_query () {} + +function mysqli_next_result () {} + +function mysqli_num_fields () {} + +function mysqli_num_rows () {} + +function mysqli_options () {} + +function mysqli_ping () {} + +function mysqli_prepare () {} + +/** + * Enables or disables internal report functions + * @link http://www.php.net/manual/en/function.mysqli-report.php + * @param flags int

+ * + * Supported flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
MYSQLI_REPORT_OFFTurns reporting off
MYSQLI_REPORT_ERRORReport errors from mysqli function calls
MYSQLI_REPORT_STRICTReport warnings from mysqli function calls
MYSQLI_REPORT_INDEXReport if no index or bad index was used in a query
MYSQLI_REPORT_ALLSet all options (report all)
+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysqli_report ($flags) {} + +function mysqli_query () {} + +function mysqli_real_connect () {} + +function mysqli_real_escape_string () {} + +function mysqli_real_query () {} + +function mysqli_rollback () {} + +/** + * Check if RPL parse is enabled + * @link http://www.php.net/manual/en/function.mysqli-rpl-parse-enabled.php + * @param link mysqli + * @return int + * + * @jms-builtin + */ +function mysqli_rpl_parse_enabled (mysqli $link) {} + +/** + * RPL probe + * @link http://www.php.net/manual/en/function.mysqli-rpl-probe.php + * @param link mysqli + * @return bool + * + * @jms-builtin + */ +function mysqli_rpl_probe (mysqli $link) {} + +/** + * Returns RPL query type + * @link http://www.php.net/manual/en/function.mysqli-rpl-query-type.php + * @param query string + * @return int + * + * @jms-builtin + */ +function mysqli_rpl_query_type ($query) {} + +function mysqli_select_db () {} + +function mysqli_set_charset () {} + +function mysqli_stmt_attr_get () {} + +function mysqli_stmt_attr_set () {} + +function mysqli_stmt_field_count () {} + +function mysqli_stmt_init () {} + +function mysqli_stmt_prepare () {} + +function mysqli_stmt_result_metadata () {} + +function mysqli_stmt_send_long_data () {} + +/** + * @param var1 + * @param var2 + * + * @jms-builtin + */ +function mysqli_stmt_bind_param ($var1, $var2) {} + +/** + * @param var1 + * + * @jms-builtin + */ +function mysqli_stmt_bind_result ($var1) {} + +function mysqli_stmt_fetch () {} + +function mysqli_stmt_free_result () {} + +function mysqli_stmt_get_warnings () {} + +function mysqli_stmt_insert_id () {} + +function mysqli_stmt_reset () {} + +function mysqli_stmt_param_count () {} + +/** + * Send the query and return + * @link http://www.php.net/manual/en/function.mysqli-send-query.php + * @param query string + * @return bool + * + * @jms-builtin + */ +function mysqli_send_query ($query) {} + +/** + * Force execution of a query on a slave in a master/slave setup + * @link http://www.php.net/manual/en/function.mysqli-slave-query.php + * @param link mysqli + * @param query string + * @return bool + * + * @jms-builtin + */ +function mysqli_slave_query (mysqli $link, $query) {} + +function mysqli_sqlstate () {} + +function mysqli_ssl_set () {} + +function mysqli_stat () {} + +function mysqli_stmt_affected_rows () {} + +function mysqli_stmt_close () {} + +function mysqli_stmt_data_seek () {} + +function mysqli_stmt_errno () {} + +function mysqli_stmt_error () {} + +function mysqli_stmt_num_rows () {} + +function mysqli_stmt_sqlstate () {} + +function mysqli_store_result () {} + +function mysqli_stmt_store_result () {} + +function mysqli_thread_id () {} + +function mysqli_thread_safe () {} + +function mysqli_use_result () {} + +function mysqli_warning_count () {} + +/** + * Alias for mysqli_stmt_bind_param + * @link http://www.php.net/manual/en/function.mysqli-bind-param.php + * @param var1 + * @param var2 + * + * @jms-builtin + */ +function mysqli_bind_param ($var1, $var2) {} + +/** + * Alias for mysqli_stmt_bind_result + * @link http://www.php.net/manual/en/function.mysqli-bind-result.php + * @param var1 + * + * @jms-builtin + */ +function mysqli_bind_result ($var1) {} + +/** + * Alias of mysqli_character_set_name + * @link http://www.php.net/manual/en/function.mysqli-client-encoding.php + * + * @jms-builtin + */ +function mysqli_client_encoding () {} + +/** + * Alias of mysqli_real_escape_string + * @link http://www.php.net/manual/en/function.mysqli-escape-string.php + * + * @jms-builtin + */ +function mysqli_escape_string () {} + +/** + * Alias for mysqli_stmt_fetch + * @link http://www.php.net/manual/en/function.mysqli-fetch.php + * + * @jms-builtin + */ +function mysqli_fetch () {} + +/** + * Alias for mysqli_stmt_param_count + * @link http://www.php.net/manual/en/function.mysqli-param-count.php + * + * @jms-builtin + */ +function mysqli_param_count () {} + +/** + * Alias for mysqli_stmt_result_metadata + * @link http://www.php.net/manual/en/function.mysqli-get-metadata.php + * + * @jms-builtin + */ +function mysqli_get_metadata () {} + +/** + * Alias for mysqli_stmt_send_long_data + * @link http://www.php.net/manual/en/function.mysqli-send-long-data.php + * + * @jms-builtin + */ +function mysqli_send_long_data () {} + +/** + * Alias of mysqli_options + * @link http://www.php.net/manual/en/function.mysqli-set-opt.php + * + * @jms-builtin + */ +function mysqli_set_opt () {} + + +/** + *

+ * Read options from the named group from my.cnf + * or the file specified with MYSQLI_READ_DEFAULT_FILE + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_READ_DEFAULT_GROUP', 5); + +/** + *

+ * Read options from the named option file instead of from my.cnf + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_READ_DEFAULT_FILE', 4); + +/** + *

+ * Connect timeout in seconds + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_OPT_CONNECT_TIMEOUT', 0); + +/** + *

+ * Enables command LOAD LOCAL INFILE + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_OPT_LOCAL_INFILE', 8); + +/** + *

+ * Command to execute when connecting to MySQL server. Will automatically be re-executed when reconnecting. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_INIT_COMMAND', 3); + +/** + *

+ * Use SSL (encrypted protocol). This option should not be set by application programs; + * it is set internally in the MySQL client library + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_SSL', 2048); + +/** + *

+ * Use compression protocol + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_COMPRESS', 32); + +/** + *

+ * Allow interactive_timeout seconds + * (instead of wait_timeout seconds) of inactivity before + * closing the connection. The client's session + * wait_timeout variable will be set to + * the value of the session interactive_timeout variable. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_INTERACTIVE', 1024); + +/** + *

+ * Allow spaces after function names. Makes all functions names reserved words. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_IGNORE_SPACE', 256); + +/** + *

+ * Don't allow the db_name.tbl_name.col_name syntax. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_NO_SCHEMA', 16); +define ('MYSQLI_CLIENT_FOUND_ROWS', 2); + +/** + *

+ * For using buffered resultsets + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STORE_RESULT', 0); + +/** + *

+ * For using unbuffered resultsets + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_USE_RESULT', 1); + +/** + *

+ * Columns are returned into the array having the fieldname as the array index. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_ASSOC', 1); + +/** + *

+ * Columns are returned into the array having an enumerated index. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NUM', 2); + +/** + *

+ * Columns are returned into the array having both a numerical index and the fieldname as the associative index. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_BOTH', 3); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH', 0); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STMT_ATTR_CURSOR_TYPE', 1); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_NO_CURSOR', 0); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_READ_ONLY', 1); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_FOR_UPDATE', 2); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_SCROLLABLE', 4); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STMT_ATTR_PREFETCH_ROWS', 2); + +/** + *

+ * Indicates that a field is defined as NOT NULL + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NOT_NULL_FLAG', 1); + +/** + *

+ * Field is part of a primary index + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_PRI_KEY_FLAG', 2); + +/** + *

+ * Field is part of a unique index. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_UNIQUE_KEY_FLAG', 4); + +/** + *

+ * Field is part of an index. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_MULTIPLE_KEY_FLAG', 8); + +/** + *

+ * Field is defined as BLOB + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_BLOB_FLAG', 16); + +/** + *

+ * Field is defined as UNSIGNED + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_UNSIGNED_FLAG', 32); + +/** + *

+ * Field is defined as ZEROFILL + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_ZEROFILL_FLAG', 64); + +/** + *

+ * Field is defined as AUTO_INCREMENT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_AUTO_INCREMENT_FLAG', 512); + +/** + *

+ * Field is defined as TIMESTAMP + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TIMESTAMP_FLAG', 1024); + +/** + *

+ * Field is defined as SET + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_SET_FLAG', 2048); + +/** + *

+ * Field is defined as NUMERIC + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NUM_FLAG', 32768); + +/** + *

+ * Field is part of an multi-index + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_PART_KEY_FLAG', 16384); + +/** + *

+ * Field is part of GROUP BY + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_GROUP_FLAG', 32768); + +/** + *

+ * Field is defined as DECIMAL + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DECIMAL', 0); + +/** + *

+ * Field is defined as TINYINT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TINY', 1); + +/** + *

+ * Field is defined as SMALLINT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_SHORT', 2); + +/** + *

+ * Field is defined as INT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_LONG', 3); + +/** + *

+ * Field is defined as FLOAT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_FLOAT', 4); + +/** + *

+ * Field is defined as DOUBLE + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DOUBLE', 5); + +/** + *

+ * Field is defined as DEFAULT NULL + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_NULL', 6); + +/** + *

+ * Field is defined as TIMESTAMP + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TIMESTAMP', 7); + +/** + *

+ * Field is defined as BIGINT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_LONGLONG', 8); + +/** + *

+ * Field is defined as MEDIUMINT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_INT24', 9); + +/** + *

+ * Field is defined as DATE + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DATE', 10); + +/** + *

+ * Field is defined as TIME + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TIME', 11); + +/** + *

+ * Field is defined as DATETIME + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DATETIME', 12); + +/** + *

+ * Field is defined as YEAR + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_YEAR', 13); + +/** + *

+ * Field is defined as DATE + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_NEWDATE', 14); + +/** + *

+ * Field is defined as ENUM + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_ENUM', 247); + +/** + *

+ * Field is defined as SET + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_SET', 248); + +/** + *

+ * Field is defined as TINYBLOB + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TINY_BLOB', 249); + +/** + *

+ * Field is defined as MEDIUMBLOB + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_MEDIUM_BLOB', 250); + +/** + *

+ * Field is defined as LONGBLOB + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_LONG_BLOB', 251); + +/** + *

+ * Field is defined as BLOB + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_BLOB', 252); + +/** + *

+ * Field is defined as VARCHAR + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_VAR_STRING', 253); + +/** + *

+ * Field is defined as STRING + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_STRING', 254); + +/** + *

+ * Field is defined as CHAR + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_CHAR', 1); + +/** + *

+ * Field is defined as INTERVAL + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_INTERVAL', 247); + +/** + *

+ * Field is defined as GEOMETRY + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_GEOMETRY', 255); + +/** + *

+ * Precision math DECIMAL or NUMERIC field (MySQL 5.0.3 and up) + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_NEWDECIMAL', 246); + +/** + *

+ * Field is defined as BIT (MySQL 5.0.3 and up) + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_BIT', 16); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_SET_CHARSET_NAME', 7); +define ('MYSQLI_RPL_MASTER', 0); +define ('MYSQLI_RPL_SLAVE', 1); +define ('MYSQLI_RPL_ADMIN', 2); + +/** + *

+ * No more data available for bind variable + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NO_DATA', 100); + +/** + *

+ * Data truncation occurred. Available since PHP 5.1.0 and MySQL 5.0.5. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_DATA_TRUNCATED', 101); +define ('MYSQLI_REPORT_INDEX', 4); +define ('MYSQLI_REPORT_ERROR', 1); +define ('MYSQLI_REPORT_STRICT', 2); +define ('MYSQLI_REPORT_ALL', 255); +define ('MYSQLI_REPORT_OFF', 0); + +// End of mysqli v.0.1 +?> diff --git a/res/php-5.2-core-api/oci8.php b/res/php-5.2-core-api/oci8.php new file mode 100644 index 0000000..a54a6b0 --- /dev/null +++ b/res/php-5.2-core-api/oci8.php @@ -0,0 +1,1904 @@ + + * If provided, this method will truncate the LOB to + * length bytes. Otherwise, it will completrely + * purge the LOB. + *

+ * @return bool Returns true on success or false on failure. + */ + public function truncate ($length = null) {} + + /** + * Erases a specified portion of the internal LOB data + * @link http://php.net/manual/en/function.oci-lob-erase.php + * @param offset int[optional]

+ *

+ * @param length int[optional]

+ *

+ * @return int the actual number of characters/bytes erased or false in case of + * error. + */ + public function erase ($offset = null, $length = null) {} + + /** + * Flushes/writes buffer of the LOB to the server + * @link http://php.net/manual/en/function.oci-lob-flush.php + * @param flag int[optional]

+ * By default, resources are not freed, but using flag + * OCI_LOB_BUFFER_FREE you can do it explicitly. + * Be sure you know what you're doing - next read/write operation to the + * same part of LOB will involve a round-trip to the server and initialize + * new buffer resources. It is recommended to use + * OCI_LOB_BUFFER_FREE flag only when you are not + * going to work with the LOB anymore. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * Returns false if buffering was not enabled or an error occurred. + */ + public function flush ($flag = null) {} + + /** + * Changes current state of buffering for the large object + * @link http://php.net/manual/en/function.oci-lob-setbuffering.php + * @param on_off bool

+ * true for on and false for off. + *

+ * @return bool Returns true on success or false on failure. Repeated calls to this method with the same flag will + * return true. + */ + public function setbuffering ($on_off) {} + + /** + * Returns current state of buffering for the large object + * @link http://php.net/manual/en/function.oci-lob-getbuffering.php + * @return bool false if buffering for the large object is off and true if + * buffering is used. + */ + public function getbuffering () {} + + /** + * Moves the internal pointer to the beginning of the large object + * @link http://php.net/manual/en/function.oci-lob-rewind.php + * @return bool Returns true on success or false on failure. + */ + public function rewind () {} + + /** + * Reads part of the large object + * @link http://php.net/manual/en/function.oci-lob-read.php + * @param length int

+ * The length of data to read, in bytes. + *

+ * @return string the contents as a string, or false in case of error. + */ + public function read ($length) {} + + /** + * Tests for end-of-file on a large object's descriptor + * @link http://php.net/manual/en/function.oci-lob-eof.php + * @return bool true if internal pointer of large object is at the end of LOB. + * Otherwise returns false. + */ + public function eof () {} + + /** + * Sets the internal pointer of the large object + * @link http://php.net/manual/en/function.oci-lob-seek.php + * @param offset int

+ * Indicates the amount of bytes, on which internal pointer should be + * moved from the position, pointed by whence. + *

+ * @param whence int[optional]

+ * May be one of: + * OCI_SEEK_SET - sets the position equal to + * offset + * OCI_SEEK_CUR - adds offset + * bytes to the current position + * OCI_SEEK_END - adds offset + * bytes to the end of large object (use negative value to move to a position + * before the end of large object) + *

+ * @return bool Returns true on success or false on failure. + */ + public function seek ($offset, $whence = null) {} + + /** + * Writes data to the large object + * @link http://php.net/manual/en/function.oci-lob-write.php + * @param data string

+ * The data to write in the LOB. + *

+ * @param length int[optional]

+ * If this parameter is given, writing will stop after + * length bytes have been written or the end of + * data is reached, whichever comes first. + *

+ * @return int the number of bytes written or false in case of error. + */ + public function write ($data, $length = null) {} + + /** + * Appends data from the large object to another large object + * @link http://php.net/manual/en/function.oci-lob-append.php + * @param lob_from OCI-Lob

+ * The copied LOB. + *

+ * @return bool Returns true on success or false on failure. + */ + public function append (OCI-Lob $lob_from) {} + + /** + * Returns size of large object + * @link http://php.net/manual/en/function.oci-lob-size.php + * @return int length of large object value or false in case of error. + * Empty objects have zero length. + */ + public function size () {} + + /** + * &Alias; oci_lob_export + * @link http://php.net/manual/en/function.oci-lob-writetofile.php + * @param filename + * @param start[optional] + * @param length[optional] + */ + public function writetofile ($filename, $start, $length) {} + + /** + * Exports LOB's contents to a file + * @link http://php.net/manual/en/function.oci-lob-export.php + * @param filename string

+ * Path to the file. + *

+ * @param start int[optional]

+ * Indicates from where to start exporting. + *

+ * @param length int[optional]

+ * Indicates the length of data to be exported. + *

+ * @return bool Returns true on success or false on failure. + */ + public function export ($filename, $start = null, $length = null) {} + + /** + * Imports file data to the LOB + * @link http://php.net/manual/en/function.oci-lob-import.php + * @param filename string

+ * Path to the file. + *

+ * @return bool Returns true on success or false on failure. + */ + public function import ($filename) {} + + /** + * Writes temporary large object + * @link http://php.net/manual/en/function.oci-lob-writetemporary.php + * @param data string

+ * The data to write. + *

+ * @param lob_type int[optional]

+ * Can be one of the following: + * OCI_TEMP_BLOB is used to create temporary BLOBs + * OCI_TEMP_CLOB (default value) is used to create + * temporary CLOBs + *

+ * @return bool Returns true on success or false on failure. + */ + public function writetemporary ($data, $lob_type = null) {} + + /** + * Closes LOB descriptor + * @link http://php.net/manual/en/function.oci-lob-close.php + * @return bool Returns true on success or false on failure. + */ + public function close () {} + + /** + * Saves data to the large object + * @link http://php.net/manual/en/function.oci-lob-save.php + * @param data string

+ * The data to be saved. + *

+ * @param offset int[optional]

+ * Can be used to indicate offset from the beginning of the large object. + *

+ * @return bool Returns true on success or false on failure. + */ + public function save ($data, $offset = null) {} + + /** + * &Alias; oci_lob_import + * @link http://php.net/manual/en/function.oci-lob-savefile.php + * @param filename + */ + public function savefile ($filename) {} + + /** + * Frees resources associated with the LOB descriptor + * @link http://php.net/manual/en/function.oci-lob-free.php + * @return bool Returns true on success or false on failure. + */ + public function free () {} + +} + +class OCI_Collection { + + /** + * Appends element to the collection + * @link http://php.net/manual/en/function.oci-collection-append.php + * @param value mixed

+ * The value to be added to the collection. Can be a string or a number. + *

+ * @return bool Returns true on success or false on failure. + */ + public function append ($value) {} + + /** + * Returns value of the element + * @link http://php.net/manual/en/function.oci-collection-element-get.php + * @param index int

+ * The element index. First index is 1. + *

+ * @return mixed false if such element doesn't exist; &null; if element is &null;; + * string if element is column of a string datatype or number if element is + * numeric field. + */ + public function getelem ($index) {} + + /** + * Assigns a value to the element of the collection + * @link http://php.net/manual/en/function.oci-collection-element-assign.php + * @param index int

+ * The element index. First index is 1. + *

+ * @param value mixed

+ * Can be a string or a number. + *

+ * @return bool Returns true on success or false on failure. + */ + public function assignelem ($index, $value) {} + + /** + * Assigns a value to the collection from another existing collection + * @link http://php.net/manual/en/function.oci-collection-assign.php + * @param from OCI-Collection

+ * An instance of OCI-Collection. + *

+ * @return bool Returns true on success or false on failure. + */ + public function assign (OCI-Collection $from) {} + + /** + * Returns size of the collection + * @link http://php.net/manual/en/function.oci-collection-size.php + * @return int the number of elements in the collection or false on error. + */ + public function size () {} + + /** + * Returns the maximum number of elements in the collection + * @link http://php.net/manual/en/function.oci-collection-max.php + * @return int the maximum number as an integer, or false on errors. + *

+ *

+ * If the returned value is 0, then the number of elements is not limited. + */ + public function max () {} + + /** + * Trims elements from the end of the collection + * @link http://php.net/manual/en/function.oci-collection-trim.php + * @param num int

+ * The number of elements to be trimmed. + *

+ * @return bool Returns true on success or false on failure. + */ + public function trim ($num) {} + + /** + * Frees the resources associated with the collection object + * @link http://php.net/manual/en/function.oci-collection-free.php + * @return bool Returns true on success or false on failure. + */ + public function free () {} + +} + +/** + * Uses a PHP variable for the define-step during a SELECT + * @link http://php.net/manual/en/function.oci-define-by-name.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param column_name string

+ * The column name. Must be uppercased. + *

+ *

+ * Take into consideration that Oracle uses ALL-UPPERCASE column names, + * whereby in your select you can also use lowercase. + * If you define a variable that doesn't exists in your select statement, + * no error will be issued. + *

+ * @param variable mixed

+ * The PHP variable. + *

+ * @param type int[optional]

+ *

+ *

+ * If you need to define an abstract datatype (LOB/ROWID/BFILE) you must + * allocate it first using oci_new_descriptor. See + * also the oci_bind_by_name function. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_define_by_name ($statement, $column_name, &$variable, $type = null) {} + +/** + * Binds the PHP variable to the Oracle placeholder + * @link http://php.net/manual/en/function.oci-bind-by-name.php + * @param statement resource

+ * An OCI statement. + *

+ * @param ph_name string

+ * The placeholder. + *

+ * @param variable mixed

+ * The PHP variable. + *

+ * @param maxlength int[optional]

+ * Sets the maximum length for the bind. If you set it to -1, this + * function will use the current length of variable + * to set the maximum length. + *

+ * @param type int[optional]

+ * If you need to bind an abstract datatype (LOB/ROWID/BFILE) you + * need to allocate it first using the + * oci_new_descriptor function. The + * length is not used for abstract datatypes + * and should be set to -1. The type parameter + * tells Oracle which descriptor is used. Default to SQLT_CHR. + * Possible values are: + *

+ * SQLT_FILE - for BFILEs; + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_bind_by_name ($statement, $ph_name, &$variable, $maxlength = null, $type = null) {} + +/** + * Binds PHP array to Oracle PL/SQL array by name + * @link http://php.net/manual/en/function.oci-bind-array-by-name.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param name string

+ * The Oracle placeholder. + *

+ * @param var_array array

+ * An array. + *

+ * @param max_table_length int

+ * Sets the maximum length both for incoming and result arrays. + *

+ * @param max_item_length int[optional]

+ * Sets maximum length for array items. If not specified or equals to -1, + * oci_bind_array_by_name will use find the longest + * element in the incoming array and will use it as maximum length for + * array items. + *

+ * @param type int[optional]

+ * Should be used to set the type of PL/SQL array items. See list of + * available types below: + *

+ *

+ *

+ * SQLT_NUM - for arrays of NUMBER. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_bind_array_by_name ($statement, $name, array &$var_array, $max_table_length, $max_item_length = null, $type = null) {} + +/** + * Checks if the field is &null; + * @link http://php.net/manual/en/function.oci-field-is-null.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field mixed

+ * Can be a field's index or a field's name (uppercased). + *

+ * @return bool true if field is &null;, false otherwise. + */ +function oci_field_is_null ($statement, $field) {} + +/** + * Returns the name of a field from the statement + * @link http://php.net/manual/en/function.oci-field-name.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field int

+ * Can be the field's index (1-based) or name. + *

+ * @return string the name as a string, or false on errors. + */ +function oci_field_name ($statement, $field) {} + +/** + * Returns field's size + * @link http://php.net/manual/en/function.oci-field-size.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field mixed

+ * Can be the field's index (1-based) or name. + *

+ * @return int the size of a field in bytes, or false on + * errors. + */ +function oci_field_size ($statement, $field) {} + +/** + * Tell the scale of the field + * @link http://php.net/manual/en/function.oci-field-scale.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field int

+ * Can be the field's index (1-based) or name. + *

+ * @return int the scale as an integer, or false on errors. + */ +function oci_field_scale ($statement, $field) {} + +/** + * Tell the precision of a field + * @link http://php.net/manual/en/function.oci-field-precision.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field int

+ * Can be the field's index (1-based) or name. + *

+ * @return int the precision as an integer, or false on errors. + */ +function oci_field_precision ($statement, $field) {} + +/** + * Returns field's data type + * @link http://php.net/manual/en/function.oci-field-type.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field int

+ * Can be the field's index (1-based) or name. + *

+ * @return mixed the field data type as a string, or false on errors. + */ +function oci_field_type ($statement, $field) {} + +/** + * Tell the raw Oracle data type of the field + * @link http://php.net/manual/en/function.oci-field-type-raw.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field int

+ * Can be the field's index (1-based) or name. + *

+ * @return int Oracle's raw data type as a string, or false on errors. + */ +function oci_field_type_raw ($statement, $field) {} + +/** + * Executes a statement + * @link http://php.net/manual/en/function.oci-execute.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param mode int[optional]

+ * Allows you to specify the execution mode (default is + * OCI_COMMIT_ON_SUCCESS). + *

+ *

+ * If you don't want statements to be committed automatically, you should + * specify OCI_DEFAULT as your + * mode. + *

+ *

+ * When using OCI_DEFAULT mode, you're creating a + * transaction. Transactions are automatically rolled back when you close + * the connection, or when the script ends, whichever is soonest. You + * need to explicitly call oci_commit to commit + * the transaction, or oci_rollback to abort it. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_execute ($statement, $mode = null) {} + +/** + * Cancels reading from cursor + * @link http://php.net/manual/en/function.oci-cancel.php + * @param statement resource

+ * An OCI statement. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_cancel ($statement) {} + +/** + * Fetches the next row into result-buffer + * @link http://php.net/manual/en/function.oci-fetch.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return bool true on success or false if there are no more rows in the + * statement. + */ +function oci_fetch ($statement) {} + +/** + * Returns the next row from the result data as an object + * @link http://php.net/manual/en/function.oci-fetch-object.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return object an object, which attributes correspond to fields in statement, or + * false if there are no more rows in the statement. + */ +function oci_fetch_object ($statement) {} + +/** + * Returns the next row from the result data as a numeric array + * @link http://php.net/manual/en/function.oci-fetch-row.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return array an indexed array with the field information, or false if there + * are no more rows in the statement. + */ +function oci_fetch_row ($statement) {} + +/** + * Returns the next row from the result data as an associative array + * @link http://php.net/manual/en/function.oci-fetch-assoc.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return array an associative array, or false if there are no more rows in the + * statement. + */ +function oci_fetch_assoc ($statement) {} + +/** + * Returns the next row from the result data as an associative or + numeric array, or both + * @link http://php.net/manual/en/function.oci-fetch-array.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param mode int[optional]

+ * An optional second parameter can be any combination of the following + * constants: + * OCI_BOTH - return an array with both associative + * and numeric indices (the same as OCI_ASSOC + * + OCI_NUM). This is the default behavior. + * OCI_ASSOC - return an associative array + * (as oci_fetch_assoc works). + * OCI_NUM - return a numeric array, + * (as oci_fetch_row works). + * OCI_RETURN_NULLS - create empty elements + * for the &null; fields. + * OCI_RETURN_LOBS - return the value of a LOB + * of the descriptor. + * Default mode is OCI_BOTH. + *

+ * @return array an array with both associative and numeric indices, or false if + * there are no more rows in the statement. + */ +function oci_fetch_array ($statement, $mode = null) {} + +/** + * Fetches the next row into an array (deprecated) + * @link http://php.net/manual/en/function.ocifetchinto.php + * @param statement resource + * @param result array + * @param mode int[optional] + * @return int + */ +function ocifetchinto ($statement, array &$result, $mode = null) {} + +/** + * Fetches all rows of result data into an array + * @link http://php.net/manual/en/function.oci-fetch-all.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param output array &database.fetch-null; + * @param skip int[optional]

+ * The number of initial rows to ignore when fetching the result (default + * value of 0, to start at the first line). + *

+ * @param maxrows int[optional]

+ * The number of rows to read, starting at the skipth + * row (default to -1, meaning all the rows). + *

+ * @param flags int[optional]

+ * Parameter flags can be any combination of + * the following: + * OCI_FETCHSTATEMENT_BY_ROW + * OCI_FETCHSTATEMENT_BY_COLUMN (default value) + * OCI_NUM + * OCI_ASSOC + *

+ * @return int the number of rows fetched or false in case of an error. + */ +function oci_fetch_all ($statement, array &$output, $skip = null, $maxrows = null, $flags = null) {} + +/** + * Frees all resources associated with statement or cursor + * @link http://php.net/manual/en/function.oci-free-statement.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_free_statement ($statement) {} + +/** + * Enables or disables internal debug output + * @link http://php.net/manual/en/function.oci-internal-debug.php + * @param onoff bool

+ * Set this to false to turn debug output off or true to turn it on. + *

+ * @return void + */ +function oci_internal_debug ($onoff) {} + +/** + * Returns the number of result columns in a statement + * @link http://php.net/manual/en/function.oci-num-fields.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return int the number of columns as an integer, or false on errors. + */ +function oci_num_fields ($statement) {} + +/** + * Prepares Oracle statement for execution + * @link http://php.net/manual/en/function.oci-parse.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param query string

+ * The SQL query. + *

+ * @return resource a statement handler on success, or false on error. + */ +function oci_parse ($connection, $query) {} + +/** + * Allocates and returns a new cursor (statement handle) + * @link http://php.net/manual/en/function.oci-new-cursor.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @return resource a new statement handle, or false on error. + */ +function oci_new_cursor ($connection) {} + +/** + * Returns field's value from the fetched row + * @link http://php.net/manual/en/function.oci-result.php + * @param statement resource

+ *

+ * @param field mixed

+ * Can be either use the column number (1-based) or the column name (in + * uppercase). + *

+ * @return mixed everything as strings except for abstract types (ROWIDs, LOBs and + * FILEs). Returns false on error. + */ +function oci_result ($statement, $field) {} + +/** + * Returns server version + * @link http://php.net/manual/en/function.oci-server-version.php + * @param connection resource

+ *

+ * @return string the version information as a string or false on error. + */ +function oci_server_version ($connection) {} + +/** + * Returns the type of an OCI statement + * @link http://php.net/manual/en/function.oci-statement-type.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return string the query type ofstatement as one of the + * following values: + * SELECT + * UPDATE + * DELETE + * INSERT + * CREATE + * DROP + * ALTER + * BEGIN + * DECLARE + * CALL (since PHP 5.2.1 and OCI8 + * 1.2.3) + * UNKNOWN + * Returns false on error. + */ +function oci_statement_type ($statement) {} + +/** + * Returns number of rows affected during statement execution + * @link http://php.net/manual/en/function.oci-num-rows.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return int the number of rows affected as an integer, or false on errors. + */ +function oci_num_rows ($statement) {} + +/** + * Closes Oracle connection + * @link http://php.net/manual/en/function.oci-close.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_close ($connection) {} + +/** + * Establishes a connection to the Oracle server + * @link http://php.net/manual/en/function.oci-connect.php + * @param username string

+ * The Oracle user name. + *

+ * @param password string

+ * The password for username. + *

+ * @param db string[optional]

+ * This optional parameter can either contain the name of the local + * Oracle instance or the name of the entry in + * tnsnames.ora. + *

+ *

+ * If the not specified, PHP uses environment variables + * ORACLE_SID and TWO_TASK to + * determine the name of local Oracle instance and + * location of tnsnames.ora accordingly. + *

+ * @param charset string[optional] &oci.charset; + * @param session_mode int[optional]

+ * This parameter is available since version 1.1 and accepts the + * following values: OCI_DEFAULT, + * OCI_SYSOPER and OCI_SYSDBA. + * If either OCI_SYSOPER or + * OCI_SYSDBA were specified, this function will try + * to establish privileged connection using external credentials. + * Privileged connections are disabled by default. To enable them you + * need to set oci8.privileged_connect + * to On. + *

+ * @return resource a connection identifier or false on error. + */ +function oci_connect ($username, $password, $db = null, $charset = null, $session_mode = null) {} + +/** + * Establishes a new connection to the Oracle server + * @link http://php.net/manual/en/function.oci-new-connect.php + * @param username string

+ * The Oracle user name. + *

+ * @param password string

+ * The password for username. + *

+ * @param db string[optional]

+ * This optional parameter can either contain the name of the local + * Oracle instance or the name of the entry in + * tnsnames.ora. + *

+ *

+ * If the not specified, PHP uses environment variables + * ORACLE_SID and TWO_TASK to + * determine the name of local Oracle instance and location of + * tnsnames.ora accordingly. + *

+ * @param charset string[optional] &oci.charset; + * @param session_mode int[optional]

+ * This parameter is available since version 1.1 and accepts the + * following values: OCI_DEFAULT, + * OCI_SYSOPER and OCI_SYSDBA. + * If either OCI_SYSOPER or + * OCI_SYSDBA were specified, this function will try + * to establish privileged connection using external credentials. + * Privileged connections are disabled by default. To enable them you + * need to set oci8.privileged_connect + * to On. + *

+ * @return resource a connection identifier or false on error. + */ +function oci_new_connect ($username, $password, $db = null, $charset = null, $session_mode = null) {} + +/** + * Connect to an Oracle database using a persistent connection + * @link http://php.net/manual/en/function.oci-pconnect.php + * @param username string

+ * The Oracle user name. + *

+ * @param password string

+ * The password for username. + *

+ * @param db string[optional]

+ * This optional parameter can either contain the name of the local + * Oracle instance or the name of the entry in + * tnsnames.ora. + *

+ *

+ * If the not specified, PHP uses environment variables + * ORACLE_SID and TWO_TASK to + * determine the name of local Oracle instance and location of + * tnsnames.ora accordingly. + *

+ * @param charset string[optional] &oci.charset; + * @param session_mode int[optional]

+ * This parameter is available since version 1.1 and accepts the + * following values: OCI_DEFAULT, + * OCI_SYSOPER and OCI_SYSDBA. + * If either OCI_SYSOPER or + * OCI_SYSDBA were specified, this function will try + * to establish privileged connection using external credentials. + * Privileged connections are disabled by default. To enable them you + * need to set oci8.privileged_connect + * to On. + *

+ * @return resource a connection identifier or false on error. + */ +function oci_pconnect ($username, $password, $db = null, $charset = null, $session_mode = null) {} + +/** + * Returns the last error found + * @link http://php.net/manual/en/function.oci-error.php + * @param source resource[optional]

+ * For most errors, the parameter is the most appropriate resource + * handle. For connection errors with oci_connect, + * oci_new_connect or + * oci_pconnect do not pass a parameter. + *

+ * @return array If no error is found, oci_error + * returns false. oci_error returns the error as an + * associative array. In this array, code + * consists the oracle error code and message + * the oracle error string. + */ +function oci_error ($source = null) {} + +/** + * @param lob_descriptor + */ +function oci_free_descriptor ($lob_descriptor) {} + +/** + * @param lob_descriptor + * @param data + * @param offset[optional] + */ +function oci_lob_save ($lob_descriptor, $data, $offset) {} + +/** + * @param lob_descriptor + * @param filename + */ +function oci_lob_import ($lob_descriptor, $filename) {} + +/** + * @param lob_descriptor + */ +function oci_lob_size ($lob_descriptor) {} + +/** + * @param lob_descriptor + */ +function oci_lob_load ($lob_descriptor) {} + +/** + * @param lob_descriptor + * @param length + */ +function oci_lob_read ($lob_descriptor, $length) {} + +/** + * @param lob_descriptor + */ +function oci_lob_eof ($lob_descriptor) {} + +/** + * @param lob_descriptor + */ +function oci_lob_tell ($lob_descriptor) {} + +/** + * @param lob_descriptor + * @param length[optional] + */ +function oci_lob_truncate ($lob_descriptor, $length) {} + +/** + * @param lob_descriptor + * @param offset[optional] + * @param length[optional] + */ +function oci_lob_erase ($lob_descriptor, $offset, $length) {} + +/** + * @param lob_descriptor + * @param flag[optional] + */ +function oci_lob_flush ($lob_descriptor, $flag) {} + +/** + * @param lob_descriptor + * @param mode + */ +function ocisetbufferinglob ($lob_descriptor, $mode) {} + +/** + * @param lob_descriptor + */ +function ocigetbufferinglob ($lob_descriptor) {} + +/** + * Compares two LOB/FILE locators for equality + * @link http://php.net/manual/en/function.oci-lob-is-equal.php + * @param lob1 OCI-Lob

+ * A LOB identifier. + *

+ * @param lob2 OCI-Lob

+ * A LOB identifier. + *

+ * @return bool true if these objects are equal, false otherwise. + */ +function oci_lob_is_equal (OCI-Lob $lob1, OCI-Lob $lob2) {} + +/** + * @param lob_descriptor + */ +function oci_lob_rewind ($lob_descriptor) {} + +/** + * @param lob_descriptor + * @param string + * @param length[optional] + */ +function oci_lob_write ($lob_descriptor, $string, $length) {} + +/** + * @param lob_descriptor_to + * @param lob_descriptor_from + */ +function oci_lob_append ($lob_descriptor_to, $lob_descriptor_from) {} + +/** + * Copies large object + * @link http://php.net/manual/en/function.oci-lob-copy.php + * @param lob_to OCI-Lob

+ * The destination LOB. + *

+ * @param lob_from OCI-Lob

+ * The copied LOB. + *

+ * @param length int[optional]

+ * Indicates the length of data to be copied. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_lob_copy (OCI-Lob $lob_to, OCI-Lob $lob_from, $length = null) {} + +/** + * @param lob_descriptor + * @param filename + * @param start[optional] + * @param length[optional] + */ +function oci_lob_export ($lob_descriptor, $filename, $start, $length) {} + +/** + * @param lob_descriptor + * @param offset + * @param whence[optional] + */ +function oci_lob_seek ($lob_descriptor, $offset, $whence) {} + +/** + * Commits outstanding statements + * @link http://php.net/manual/en/function.oci-commit.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_commit ($connection) {} + +/** + * Rolls back outstanding transaction + * @link http://php.net/manual/en/function.oci-rollback.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_rollback ($connection) {} + +/** + * Initializes a new empty LOB or FILE descriptor + * @link http://php.net/manual/en/function.oci-new-descriptor.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param type int[optional]

+ * Valid values for type are: + * OCI_DTYPE_FILE, OCI_DTYPE_LOB and + * OCI_DTYPE_ROWID. + *

+ * @return OCI-Lob a new LOB or FILE descriptor on success, false on error. + */ +function oci_new_descriptor ($connection, $type = null) {} + +/** + * Sets number of rows to be prefetched + * @link http://php.net/manual/en/function.oci-set-prefetch.php + * @param statement resource

+ *

+ * @param rows int

+ *

+ * @return bool Returns true on success or false on failure. + */ +function oci_set_prefetch ($statement, $rows) {} + +/** + * Changes password of Oracle's user + * @link http://php.net/manual/en/function.oci-password-change.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param username string

+ * The Oracle user name. + *

+ * @param old_password string

+ * The old password. + *

+ * @param new_password string

+ * The new password to be set. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_password_change ($connection, $username, $old_password, $new_password) {} + +/** + * @param collection + */ +function oci_free_collection ($collection) {} + +/** + * @param collection + * @param value + */ +function oci_collection_append ($collection, $value) {} + +/** + * @param collection + * @param index + */ +function oci_collection_element_get ($collection, $index) {} + +/** + * @param collection + * @param index + * @param value + */ +function oci_collection_element_assign ($collection, $index, $value) {} + +/** + * @param collection_to + * @param collection_from + */ +function oci_collection_assign ($collection_to, $collection_from) {} + +/** + * @param collection + */ +function oci_collection_size ($collection) {} + +/** + * @param collection + */ +function oci_collection_max ($collection) {} + +/** + * @param collection + * @param number + */ +function oci_collection_trim ($collection, $number) {} + +/** + * Allocates new collection object + * @link http://php.net/manual/en/function.oci-new-collection.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param tdo string

+ * Should be a valid named type (uppercase). + *

+ * @param schema string[optional]

+ * Should point to the scheme, where the named type was created. The name + * of the current user is the default value. + *

+ * @return OCI-Collection a new OCICollection object or false on + * error. + */ +function oci_new_collection ($connection, $tdo, $schema = null) {} + +/** + * @param statement_resource + */ +function oci_free_cursor ($statement_resource) {} + +/** + * &Alias; oci_free_statement + * @link http://php.net/manual/en/function.ocifreecursor.php + * @param statement_resource + */ +function ocifreecursor ($statement_resource) {} + +/** + * &Alias; oci_bind_by_name + * @link http://php.net/manual/en/function.ocibindbyname.php + * @param statement_resource + * @param column_name + * @param variable + * @param maximum_length[optional] + * @param type[optional] + */ +function ocibindbyname ($statement_resource, $column_name, &$variable, $maximum_length, $type) {} + +/** + * &Alias; oci_define_by_name + * @link http://php.net/manual/en/function.ocidefinebyname.php + * @param statement_resource + * @param column_name + * @param variable + * @param type[optional] + */ +function ocidefinebyname ($statement_resource, $column_name, &$variable, $type) {} + +/** + * &Alias; oci_field_is_null + * @link http://php.net/manual/en/function.ocicolumnisnull.php + * @param statement_resource + * @param column_number_or_name + */ +function ocicolumnisnull ($statement_resource, $column_number_or_name) {} + +/** + * &Alias; oci_field_name + * @link http://php.net/manual/en/function.ocicolumnname.php + * @param statement_resource + * @param column_number + */ +function ocicolumnname ($statement_resource, $column_number) {} + +/** + * &Alias; oci_field_size + * @link http://php.net/manual/en/function.ocicolumnsize.php + * @param statement_resource + * @param column_number_or_name + */ +function ocicolumnsize ($statement_resource, $column_number_or_name) {} + +/** + * &Alias; oci_field_scale + * @link http://php.net/manual/en/function.ocicolumnscale.php + * @param statement_resource + * @param column_number + */ +function ocicolumnscale ($statement_resource, $column_number) {} + +/** + * &Alias; oci_field_precision + * @link http://php.net/manual/en/function.ocicolumnprecision.php + * @param statement_resource + * @param column_number + */ +function ocicolumnprecision ($statement_resource, $column_number) {} + +/** + * &Alias; oci_field_type + * @link http://php.net/manual/en/function.ocicolumntype.php + * @param statement_resource + * @param column_number + */ +function ocicolumntype ($statement_resource, $column_number) {} + +/** + * &Alias; oci_field_type_raw + * @link http://php.net/manual/en/function.ocicolumntyperaw.php + * @param statement_resource + * @param column_number + */ +function ocicolumntyperaw ($statement_resource, $column_number) {} + +/** + * &Alias; oci_execute + * @link http://php.net/manual/en/function.ociexecute.php + * @param statement_resource + * @param mode[optional] + */ +function ociexecute ($statement_resource, $mode) {} + +/** + * &Alias; oci_cancel + * @link http://php.net/manual/en/function.ocicancel.php + * @param statement_resource + */ +function ocicancel ($statement_resource) {} + +/** + * &Alias; oci_fetch + * @link http://php.net/manual/en/function.ocifetch.php + * @param statement_resource + */ +function ocifetch ($statement_resource) {} + +/** + * &Alias; oci_fetch_all + * @link http://php.net/manual/en/function.ocifetchstatement.php + * @param statement_resource + * @param output + * @param skip[optional] + * @param maximum_rows[optional] + * @param flags[optional] + */ +function ocifetchstatement ($statement_resource, &$output, $skip, $maximum_rows, $flags) {} + +/** + * &Alias; oci_free_statement + * @link http://php.net/manual/en/function.ocifreestatement.php + * @param statement_resource + */ +function ocifreestatement ($statement_resource) {} + +/** + * &Alias; oci_internal_debug + * @link http://php.net/manual/en/function.ociinternaldebug.php + * @param mode + */ +function ociinternaldebug ($mode) {} + +/** + * &Alias; oci_num_fields + * @link http://php.net/manual/en/function.ocinumcols.php + * @param statement_resource + */ +function ocinumcols ($statement_resource) {} + +/** + * &Alias; oci_parse + * @link http://php.net/manual/en/function.ociparse.php + * @param connection_resource + * @param sql_text + */ +function ociparse ($connection_resource, $sql_text) {} + +/** + * &Alias; oci_new_cursor + * @link http://php.net/manual/en/function.ocinewcursor.php + * @param connection_resource + */ +function ocinewcursor ($connection_resource) {} + +/** + * &Alias; oci_result + * @link http://php.net/manual/en/function.ociresult.php + * @param statement_resource + * @param column_number_or_name + */ +function ociresult ($statement_resource, $column_number_or_name) {} + +/** + * &Alias; oci_server_version + * @link http://php.net/manual/en/function.ociserverversion.php + * @param connection_resource + */ +function ociserverversion ($connection_resource) {} + +/** + * &Alias; oci_statement_type + * @link http://php.net/manual/en/function.ocistatementtype.php + * @param statement_resource + */ +function ocistatementtype ($statement_resource) {} + +/** + * &Alias; oci_num_rows + * @link http://php.net/manual/en/function.ocirowcount.php + * @param statement_resource + */ +function ocirowcount ($statement_resource) {} + +/** + * &Alias; oci_close + * @link http://php.net/manual/en/function.ocilogoff.php + * @param connection_resource + */ +function ocilogoff ($connection_resource) {} + +/** + * &Alias; oci_connect + * @link http://php.net/manual/en/function.ocilogon.php + * @param username + * @param password + * @param connection_string[optional] + * @param character_set[optional] + * @param session_mode[optional] + */ +function ocilogon ($username, $password, $connection_string, $character_set, $session_mode) {} + +/** + * &Alias; oci_new_connect + * @link http://php.net/manual/en/function.ocinlogon.php + * @param username + * @param password + * @param connection_string[optional] + * @param character_set[optional] + * @param session_mode[optional] + */ +function ocinlogon ($username, $password, $connection_string, $character_set, $session_mode) {} + +/** + * &Alias; oci_pconnect + * @link http://php.net/manual/en/function.ociplogon.php + * @param username + * @param password + * @param connection_string[optional] + * @param character_set[optional] + * @param session_mode[optional] + */ +function ociplogon ($username, $password, $connection_string, $character_set, $session_mode) {} + +/** + * &Alias; oci_error + * @link http://php.net/manual/en/function.ocierror.php + * @param connection_or_statement_resource[optional] + */ +function ocierror ($connection_or_statement_resource) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocifreedesc.php + * @param lob_descriptor + */ +function ocifreedesc ($lob_descriptor) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocisavelob.php + * @param lob_descriptor + * @param data + * @param offset[optional] + */ +function ocisavelob ($lob_descriptor, $data, $offset) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocisavelobfile.php + * @param lob_descriptor + * @param filename + */ +function ocisavelobfile ($lob_descriptor, $filename) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ociwritelobtofile.php + * @param lob_descriptor + * @param filename + * @param start[optional] + * @param length[optional] + */ +function ociwritelobtofile ($lob_descriptor, $filename, $start, $length) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ociloadlob.php + * @param lob_descriptor + */ +function ociloadlob ($lob_descriptor) {} + +/** + * &Alias; oci_commit + * @link http://php.net/manual/en/function.ocicommit.php + * @param connection_resource + */ +function ocicommit ($connection_resource) {} + +/** + * &Alias; oci_rollback + * @link http://php.net/manual/en/function.ocirollback.php + * @param connection_resource + */ +function ocirollback ($connection_resource) {} + +/** + * &Alias; oci_new_descriptor + * @link http://php.net/manual/en/function.ocinewdescriptor.php + * @param connection_resource + * @param type[optional] + */ +function ocinewdescriptor ($connection_resource, $type) {} + +/** + * &Alias; oci_set_prefetch + * @link http://php.net/manual/en/function.ocisetprefetch.php + * @param statement_resource + * @param number_of_rows + */ +function ocisetprefetch ($statement_resource, $number_of_rows) {} + +/** + * @param connection_resource_or_connection_string + * @param username + * @param old_password + * @param new_password + */ +function ocipasswordchange ($connection_resource_or_connection_string, $username, $old_password, $new_password) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocifreecollection.php + * @param collection + */ +function ocifreecollection ($collection) {} + +/** + * &Alias; oci_new_collection + * @link http://php.net/manual/en/function.ocinewcollection.php + * @param connection_resource + * @param type_name + * @param schema_name[optional] + */ +function ocinewcollection ($connection_resource, $type_name, $schema_name) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicollappend.php + * @param collection + * @param value + */ +function ocicollappend ($collection, $value) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicollgetelem.php + * @param collection + * @param index + */ +function ocicollgetelem ($collection, $index) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicollassignelem.php + * @param collection + * @param index + * @param value + */ +function ocicollassignelem ($collection, $index, $value) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicollsize.php + * @param collection + */ +function ocicollsize ($collection) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicollmax.php + * @param collection + */ +function ocicollmax ($collection) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicolltrim.php + * @param collection + * @param number + */ +function ocicolltrim ($collection, $number) {} + + +/** + * Statement execution mode. Statement is not committed + * automatically when using this mode. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DEFAULT', 0); + +/** + * Used with oci_connect to connect as SYSOPER + * using external credentials (oci8.privileged_connect + * should be enabled for this). + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_SYSOPER', 4); + +/** + * Used with oci_connect to connect as SYSDBA + * using external credentials (oci8.privileged_connect + * should be enabled for this). + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_SYSDBA', 2); +define ('OCI_CRED_EXT', -2147483648); + +/** + * Statement execution mode. Use this mode if you don't want + * to execute the query, but get the select-list's description. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DESCRIBE_ONLY', 16); + +/** + * Statement execution mode. Statement is automatically committed after + * oci_execute call. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_COMMIT_ON_SUCCESS', 32); + +/** + * Statement fetch mode. Used when the application knows + * in advance exactly how many rows it will be fetching. + * This mode turns prefetching off for Oracle release 8 + * or later mode. Cursor is cancelled after the desired + * rows are fetched and may result in reduced server-side + * resource usage. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_EXACT_FETCH', 2); +define ('OCI_SEEK_SET', 0); +define ('OCI_SEEK_CUR', 1); +define ('OCI_SEEK_END', 2); + +/** + * Used with to free buffers used. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_LOB_BUFFER_FREE', 1); + +/** + * The same as OCI_B_BFILE. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BFILEE', 114); + +/** + * The same as OCI_B_CFILEE. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_CFILEE', 115); + +/** + * The same as OCI_B_CLOB. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_CLOB', 112); + +/** + * The same as OCI_B_BLOB. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BLOB', 113); + +/** + * The same as OCI_B_ROWID. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_RDD', 104); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * INTEGER. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_INT', 3); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * NUMBER. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_NUM', 2); +define ('SQLT_RSET', 116); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * CHAR. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_AFC', 96); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * VARCHAR2. + * Also used with oci_bind_by_name. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_CHR', 1); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * VARCHAR. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_VCS', 9); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * CHARZ. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_AVC', 97); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * STRING. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_STR', 5); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * LONG VARCHAR. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_LVC', 94); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * FLOAT. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_FLT', 4); +define ('SQLT_UIN', 68); + +/** + * Used with oci_bind_by_name to bind LONG values. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_LNG', 8); + +/** + * Used with oci_bind_by_name to bind LONG RAW values. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_LBI', 24); + +/** + * Used with oci_bind_by_name to bind RAW values. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BIN', 23); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * LONG. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_ODT', 156); +define ('SQLT_BDOUBLE', 22); +define ('SQLT_BFLOAT', 21); + +/** + * Used with oci_bind_by_name when + * binding named data types. Note: in PHP < 5.0 it was called + * OCI_B_SQLT_NTY. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_NTY', 108); + +/** + * The same as OCI_B_NTY. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_NTY', 108); +define ('OCI_SYSDATE', "SYSDATE"); + +/** + * Used with oci_bind_by_name when + * binding BFILEs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_BFILE', 114); + +/** + * Used with oci_bind_by_name when + * binding CFILEs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_CFILEE', 115); + +/** + * Used with oci_bind_by_name when + * binding CLOBs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_CLOB', 112); + +/** + * Used with oci_bind_by_name when + * binding BLOBs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_BLOB', 113); + +/** + * Used with oci_bind_by_name when + * binding ROWIDs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_ROWID', 104); + +/** + * Used with oci_bind_by_name when + * binding cursors, previously allocated with oci_new_descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_CURSOR', 116); +define ('OCI_B_BIN', 23); +define ('OCI_B_INT', 3); +define ('OCI_B_NUM', 2); + +/** + * Default mode of oci_fetch_all. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_FETCHSTATEMENT_BY_COLUMN', 16); + +/** + * Alternative mode of oci_fetch_all. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_FETCHSTATEMENT_BY_ROW', 32); + +/** + * Used with oci_fetch_all and + * oci_fetch_array to get an associative + * array as a result. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_ASSOC', 1); + +/** + * Used with oci_fetch_all and + * oci_fetch_array to get an enumerated + * array as a result. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_NUM', 2); + +/** + * Used with oci_fetch_all and + * oci_fetch_array to get an array with + * both associative and number indices. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_BOTH', 3); + +/** + * Used with oci_fetch_array to get + * empty array elements if field's value is &null;. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_RETURN_NULLS', 4); + +/** + * Used with oci_fetch_array to get + * value of LOB instead of the descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_RETURN_LOBS', 8); + +/** + * This flag tells oci_new_descriptor to + * initialize new FILE descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DTYPE_FILE', 56); + +/** + * This flag tells oci_new_descriptor to + * initialize new LOB descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DTYPE_LOB', 50); + +/** + * This flag tells oci_new_descriptor to + * initialize new ROWID descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DTYPE_ROWID', 54); + +/** + * The same as OCI_DTYPE_FILE. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_D_FILE', 56); + +/** + * The same as OCI_DTYPE_LOB. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_D_LOB', 50); + +/** + * The same as OCI_DTYPE_ROWID. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_D_ROWID', 54); + +/** + * Used with to indicate + * explicilty that temporary CLOB should be created. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_TEMP_CLOB', 2); + +/** + * Used with to indicate + * explicilty that temporary BLOB should be created. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_TEMP_BLOB', 1); + +// End of oci8 v.1.3.5 +?> diff --git a/res/php-5.2-core-api/odbc.php b/res/php-5.2-core-api/odbc.php new file mode 100644 index 0000000..cf0a64f --- /dev/null +++ b/res/php-5.2-core-api/odbc.php @@ -0,0 +1,996 @@ + + * If OnOff is true, auto-commit is enabled, if + * it is false auto-commit is disabled. + *

+ * @return mixed Without the OnOff parameter, this function returns + * auto-commit status for connection_id. Non-zero is + * returned if auto-commit is on, 0 if it is off, or false if an error + * occurs. + *

+ *

+ * If OnOff is set, this function returns true on + * success and false on failure. + * + * @jms-builtin + */ +function odbc_autocommit ($connection_id, $OnOff = null) {} + +/** + * Handling of binary column data + * @link http://www.php.net/manual/en/function.odbc-binmode.php + * @param result_id resource

+ * The result identifier. + *

+ *

+ * If result_id is 0, the + * settings apply as default for new results. + * Default for longreadlen is 4096 and + * mode defaults to + * ODBC_BINMODE_RETURN. Handling of binary long + * columns is also affected by odbc_longreadlen. + *

+ * @param mode int

+ * Possible values for mode are: + * ODBC_BINMODE_PASSTHRU: Passthru BINARY data + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_binmode ($result_id, $mode) {} + +/** + * Close an ODBC connection + * @link http://www.php.net/manual/en/function.odbc-close.php + * @param connection_id resource &odbc.connection.id; + * @return void + * + * @jms-builtin + */ +function odbc_close ($connection_id) {} + +/** + * Close all ODBC connections + * @link http://www.php.net/manual/en/function.odbc-close-all.php + * @return void + * + * @jms-builtin + */ +function odbc_close_all () {} + +/** + * Lists the column names in specified tables + * @link http://www.php.net/manual/en/function.odbc-columns.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string[optional]

+ * The qualifier. + *

+ * @param schema string[optional]

+ * The owner. + *

+ * @param table_name string[optional]

+ * The table name. + *

+ * @param column_name string[optional]

+ * The column name. + *

+ * @return resource an ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_SCHEM + * TABLE_NAME + * COLUMN_NAME + * DATA_TYPE + * TYPE_NAME + * PRECISION + * LENGTH + * SCALE + * RADIX + * NULLABLE + * REMARKS + *

+ *

+ * The result set is ordered by TABLE_QUALIFIER, TABLE_SCHEM and + * TABLE_NAME. + * + * @jms-builtin + */ +function odbc_columns ($connection_id, $qualifier = null, $schema = null, $table_name = null, $column_name = null) {} + +/** + * Commit an ODBC transaction + * @link http://www.php.net/manual/en/function.odbc-commit.php + * @param connection_id resource &odbc.connection.id; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_commit ($connection_id) {} + +/** + * Connect to a datasource + * @link http://www.php.net/manual/en/function.odbc-connect.php + * @param dsn string

+ * The database source name for the connection. Alternatively, a + * DNS-less connection string can be used. + *

+ * @param user string

+ * The username. + *

+ * @param password string

+ * The password. + *

+ * @param cursor_type int[optional]

+ * This sets the type of cursor to be used + * for this connection. This parameter is not normally needed, but + * can be useful for working around problems with some ODBC drivers. + *

+ * The following constants are defined for cursortype: + *

+ * SQL_CUR_USE_IF_NEEDED + * @return resource an ODBC connection id or 0 (false) on + * error. + * + * @jms-builtin + */ +function odbc_connect ($dsn, $user, $password, $cursor_type = null) {} + +/** + * Get cursorname + * @link http://www.php.net/manual/en/function.odbc-cursor.php + * @param result_id resource

+ * The result identifier. + *

+ * @return string the cursor name, as a string. + * + * @jms-builtin + */ +function odbc_cursor ($result_id) {} + +/** + * Returns information about a current connection + * @link http://www.php.net/manual/en/function.odbc-data-source.php + * @param connection_id resource &odbc.connection.id; + * @param fetch_type int

+ * The fetch_type can be one of two constant types: + * SQL_FETCH_FIRST, SQL_FETCH_NEXT. + * Use SQL_FETCH_FIRST the first time this function is + * called, thereafter use the SQL_FETCH_NEXT. + *

+ * @return array false on error, and an array upon success. + * + * @jms-builtin + */ +function odbc_data_source ($connection_id, $fetch_type) {} + +/** + * Execute a prepared statement + * @link http://www.php.net/manual/en/function.odbc-execute.php + * @param result_id resource

+ * The result id resource, from odbc_prepare. + *

+ * @param parameters_array array[optional]

+ * Parameters in parameter_array will be + * substituted for placeholders in the prepared statement in order. + * Elements of this array will be converted to strings by calling this + * function. + *

+ *

+ * Any parameters in parameter_array which + * start and end with single quotes will be taken as the name of a + * file to read and send to the database server as the data for the + * appropriate placeholder. + *

+ * If you wish to store a string which actually begins and ends with + * single quotes, you must add a space or other non-single-quote character + * to the beginning or end of the parameter, which will prevent the + * parameter from being taken as a file name. If this is not an option, + * then you must use another mechanism to store the string, such as + * executing the query directly with odbc_exec). + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_execute ($result_id, array $parameters_array = null) {} + +/** + * Get the last error code + * @link http://www.php.net/manual/en/function.odbc-error.php + * @param connection_id resource[optional] &odbc.connection.id; + * @return string If connection_id is specified, the last state + * of that connection is returned, else the last state of any connection + * is returned. + *

+ *

+ * This function returns meaningful value only if last odbc query failed + * (i.e. odbc_exec returned false). + * + * @jms-builtin + */ +function odbc_error ($connection_id = null) {} + +/** + * Get the last error message + * @link http://www.php.net/manual/en/function.odbc-errormsg.php + * @param connection_id resource[optional] &odbc.connection.id; + * @return string If connection_id is specified, the last state + * of that connection is returned, else the last state of any connection + * is returned. + *

+ *

+ * This function returns meaningful value only if last odbc query failed + * (i.e. odbc_exec returned false). + * + * @jms-builtin + */ +function odbc_errormsg ($connection_id = null) {} + +/** + * Prepare and execute a SQL statement + * @link http://www.php.net/manual/en/function.odbc-exec.php + * @param connection_id resource &odbc.connection.id; + * @param query_string string

+ * The SQL statement. + *

+ * @param flags int[optional]

+ * This parameter is currently not used. + *

+ * @return resource an ODBC result identifier if the SQL command was executed + * successfully, or false on error. + * + * @jms-builtin + */ +function odbc_exec ($connection_id, $query_string, $flags = null) {} + +/** + * Fetch a result row as an associative array + * @link http://www.php.net/manual/en/function.odbc-fetch-array.php + * @param result resource

+ * The result resource from odbc_exec. + *

+ * @param rownumber int[optional]

+ * Optionally choose which row number to retrieve. + *

+ * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. + * + * @jms-builtin + */ +function odbc_fetch_array ($result, $rownumber = null) {} + +/** + * Fetch a result row as an object + * @link http://www.php.net/manual/en/function.odbc-fetch-object.php + * @param result resource

+ * The result resource from odbc_exec. + *

+ * @param rownumber int[optional]

+ * Optionally choose which row number to retrieve. + *

+ * @return object an object that corresponds to the fetched row, or false if there + * are no more rows. + * + * @jms-builtin + */ +function odbc_fetch_object ($result, $rownumber = null) {} + +/** + * Fetch a row + * @link http://www.php.net/manual/en/function.odbc-fetch-row.php + * @param result_id resource

+ * The result identifier. + *

+ * @param row_number int[optional]

+ * If row_number is not specified, + * odbc_fetch_row will try to fetch the next row in + * the result set. Calls to odbc_fetch_row with and + * without row_number can be mixed. + *

+ *

+ * To step through the result more than once, you can call + * odbc_fetch_row with + * row_number 1, and then continue doing + * odbc_fetch_row without + * row_number to review the result. If a driver + * doesn't support fetching rows by number, the + * row_number parameter is ignored. + *

+ * @return bool true if there was a row, false otherwise. + * + * @jms-builtin + */ +function odbc_fetch_row ($result_id, $row_number = null) {} + +/** + * Fetch one result row into array + * @link http://www.php.net/manual/en/function.odbc-fetch-into.php + * @param result_id resource

+ * The result resource. + *

+ * @param result_array array

+ * The result array + * that can be of any type since it will be converted to type + * array. The array will contain the column values starting at array + * index 0. + *

+ * @param rownumber int[optional]

+ * The row number. + *

+ * @return int the number of columns in the result; + * false on error. + * + * @jms-builtin + */ +function odbc_fetch_into ($result_id, array &$result_array, $rownumber = null) {} + +/** + * Get the length (precision) of a field + * @link http://www.php.net/manual/en/function.odbc-field-len.php + * @param result_id resource

+ * The result identifier. + *

+ * @param field_number int

+ * The field number. Field numbering starts at 1. + *

+ * @return int the field name as a string, or false on error. + * + * @jms-builtin + */ +function odbc_field_len ($result_id, $field_number) {} + +/** + * Get the scale of a field + * @link http://www.php.net/manual/en/function.odbc-field-scale.php + * @param result_id resource

+ * The result identifier. + *

+ * @param field_number int

+ * The field number. Field numbering starts at 1. + *

+ * @return int the field scale as a integer, or false on error. + * + * @jms-builtin + */ +function odbc_field_scale ($result_id, $field_number) {} + +/** + * Get the columnname + * @link http://www.php.net/manual/en/function.odbc-field-name.php + * @param result_id resource

+ * The result identifier. + *

+ * @param field_number int

+ * The field number. Field numbering starts at 1. + *

+ * @return string the field name as a string, or false on error. + * + * @jms-builtin + */ +function odbc_field_name ($result_id, $field_number) {} + +/** + * Datatype of a field + * @link http://www.php.net/manual/en/function.odbc-field-type.php + * @param result_id resource

+ * The result identifier. + *

+ * @param field_number int

+ * The field number. Field numbering starts at 1. + *

+ * @return string the field type as a string, or false on error. + * + * @jms-builtin + */ +function odbc_field_type ($result_id, $field_number) {} + +/** + * Return column number + * @link http://www.php.net/manual/en/function.odbc-field-num.php + * @param result_id resource

+ * The result identifier. + *

+ * @param field_name string

+ * The field name. + *

+ * @return int the field number as a integer, or false on error. + * Field numbering starts at 1. + * + * @jms-builtin + */ +function odbc_field_num ($result_id, $field_name) {} + +/** + * Free resources associated with a result + * @link http://www.php.net/manual/en/function.odbc-free-result.php + * @param result_id resource

+ * The result identifier. + *

+ * @return bool Always returns true. + * + * @jms-builtin + */ +function odbc_free_result ($result_id) {} + +/** + * Retrieves information about data types supported by the data source + * @link http://www.php.net/manual/en/function.odbc-gettypeinfo.php + * @param connection_id resource &odbc.connection.id; + * @param data_type int[optional]

+ * The data type, which can be used to restrict the information to a + * single data type. + *

+ * @return resource an ODBC result identifier or + * false on failure. + *

+ *

+ * The result set has the following columns: + * TYPE_NAME + * DATA_TYPE + * PRECISION + * LITERAL_PREFIX + * LITERAL_SUFFIX + * CREATE_PARAMS + * NULLABLE + * CASE_SENSITIVE + * SEARCHABLE + * UNSIGNED_ATTRIBUTE + * MONEY + * AUTO_INCREMENT + * LOCAL_TYPE_NAME + * MINIMUM_SCALE + * MAXIMUM_SCALE + *

+ *

+ * The result set is ordered by DATA_TYPE and TYPE_NAME. + * + * @jms-builtin + */ +function odbc_gettypeinfo ($connection_id, $data_type = null) {} + +/** + * Handling of LONG columns + * @link http://www.php.net/manual/en/function.odbc-longreadlen.php + * @param result_id resource

+ * The result identifier. + *

+ * @param length int

+ * The number of bytes returned to PHP is controlled by the parameter + * length. If it is set to 0, Long column data is passed through to the + * client. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_longreadlen ($result_id, $length) {} + +/** + * Checks if multiple results are available + * @link http://www.php.net/manual/en/function.odbc-next-result.php + * @param result_id resource

+ * The result identifier. + *

+ * @return bool true if there are more result sets, false otherwise. + * + * @jms-builtin + */ +function odbc_next_result ($result_id) {} + +/** + * Number of columns in a result + * @link http://www.php.net/manual/en/function.odbc-num-fields.php + * @param result_id resource

+ * The result identifier returned by odbc_exec. + *

+ * @return int the number of fields, or -1 on error. + * + * @jms-builtin + */ +function odbc_num_fields ($result_id) {} + +/** + * Number of rows in a result + * @link http://www.php.net/manual/en/function.odbc-num-rows.php + * @param result_id resource

+ * The result identifier returned by odbc_exec. + *

+ * @return int the number of rows in an ODBC result. + * This function will return -1 on error. + * + * @jms-builtin + */ +function odbc_num_rows ($result_id) {} + +/** + * Open a persistent database connection + * @link http://www.php.net/manual/en/function.odbc-pconnect.php + * @param dsn string + * @param user string + * @param password string + * @param cursor_type int[optional] + * @return resource an ODBC connection id or 0 (false) on + * error. + * + * @jms-builtin + */ +function odbc_pconnect ($dsn, $user, $password, $cursor_type = null) {} + +/** + * Prepares a statement for execution + * @link http://www.php.net/manual/en/function.odbc-prepare.php + * @param connection_id resource &odbc.connection.id; + * @param query_string string

+ * The query string statement being prepared. + *

+ * @return resource an ODBC result identifier if the SQL command was prepared + * successfully. Returns false on error. + * + * @jms-builtin + */ +function odbc_prepare ($connection_id, $query_string) {} + +/** + * Get result data + * @link http://www.php.net/manual/en/function.odbc-result.php + * @param result_id resource

+ * The ODBC resource. + *

+ * @param field mixed

+ * The field name being retrieved. It can either be an integer containing + * the column number of the field you want; or it can be a string + * containing the name of the field. + *

+ * @return mixed the string contents of the field, false on error, &null; for + * NULL data, or true for binary data. + * + * @jms-builtin + */ +function odbc_result ($result_id, $field) {} + +/** + * Print result as HTML table + * @link http://www.php.net/manual/en/function.odbc-result-all.php + * @param result_id resource

+ * The result identifier. + *

+ * @param format string[optional]

+ * Additional overall table formatting. + *

+ * @return int the number of rows in the result or false on error. + * + * @jms-builtin + */ +function odbc_result_all ($result_id, $format = null) {} + +/** + * Rollback a transaction + * @link http://www.php.net/manual/en/function.odbc-rollback.php + * @param connection_id resource &odbc.connection.id; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_rollback ($connection_id) {} + +/** + * Adjust ODBC settings + * @link http://www.php.net/manual/en/function.odbc-setoption.php + * @param id resource

+ * Is a connection id or result id on which to change the settings. + * For SQLSetConnectOption(), this is a connection id. + * For SQLSetStmtOption(), this is a result id. + *

+ * @param function int

+ * Is the ODBC function to use. The value should be + * 1 for SQLSetConnectOption() and + * 2 for SQLSetStmtOption(). + *

+ * @param option int

+ * The option to set. + *

+ * @param param int

+ * The value for the given option. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_setoption ($id, $function, $option, $param) {} + +/** + * Retrieves special columns + * @link http://www.php.net/manual/en/function.odbc-specialcolumns.php + * @param connection_id resource &odbc.connection.id; + * @param type int When the type argument is SQL_BEST_ROWID, + * odbc_specialcolumns returns the + * column or columns that uniquely identify each row in the table. + * When the type argument is SQL_ROWVER, + * odbc_specialcolumns returns the column or columns in the + * specified table, if any, that are automatically updated by the data source + * when any value in the row is updated by any transaction. + * @param qualifier string

+ * The qualifier. + *

+ * @param owner string

+ * The owner. + *

+ * @param table string

+ * The table. + *

+ * @param scope int

+ * The scope, which orders the result set. + *

+ * @param nullable int

+ * The nullable option. + *

+ * @return resource an ODBC result identifier or false on + * failure. + *

+ *

+ * The result set has the following columns: + * SCOPE + * COLUMN_NAME + * DATA_TYPE + * TYPE_NAME + * PRECISION + * LENGTH + * SCALE + * PSEUDO_COLUMN + * + * @jms-builtin + */ +function odbc_specialcolumns ($connection_id, $type, $qualifier, $owner, $table, $scope, $nullable) {} + +/** + * Retrieve statistics about a table + * @link http://www.php.net/manual/en/function.odbc-statistics.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string

+ * The qualifier. + *

+ * @param owner string

+ * The owner. + *

+ * @param table_name string

+ * The table name. + *

+ * @param unique int

+ * The unique attribute. + *

+ * @param accuracy int

+ * The accuracy. + *

+ * @return resource an ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * NON_UNIQUE + * INDEX_QUALIFIER + * INDEX_NAME + * TYPE + * SEQ_IN_INDEX + * COLUMN_NAME + * COLLATION + * CARDINALITY + * PAGES + * FILTER_CONDITION + * + * @jms-builtin + */ +function odbc_statistics ($connection_id, $qualifier, $owner, $table_name, $unique, $accuracy) {} + +/** + * Get the list of table names stored in a specific data source + * @link http://www.php.net/manual/en/function.odbc-tables.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string[optional]

+ * The qualifier. + *

+ * @param owner string[optional]

+ * The owner. Accepts search patterns ('%' to match zero or more + * characters and '_' to match a single character). + *

+ * @param name string[optional]

+ * The name. Accepts search patterns ('%' to match zero or more + * characters and '_' to match a single character). + *

+ * @param types string[optional]

+ * If table_type is not an empty string, it + * must contain a list of comma-separated values for the types of + * interest; each value may be enclosed in single quotes (') or + * unquoted. For example, "'TABLE','VIEW'" or "TABLE, VIEW". If the + * data source does not support a specified table type, + * odbc_tables does not return any results for + * that type. + *

+ * @return resource an ODBC result identifier containing the information + * &return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * TABLE_TYPE + * REMARKS + * + * @jms-builtin + */ +function odbc_tables ($connection_id, $qualifier = null, $owner = null, $name = null, $types = null) {} + +/** + * Gets the primary keys for a table + * @link http://www.php.net/manual/en/function.odbc-primarykeys.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string

+ *

+ * @param owner string

+ *

+ * @param table string

+ *

+ * @return resource an ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * COLUMN_NAME + * KEY_SEQ + * PK_NAME + * + * @jms-builtin + */ +function odbc_primarykeys ($connection_id, $qualifier, $owner, $table) {} + +/** + * Lists columns and associated privileges for the given table + * @link http://www.php.net/manual/en/function.odbc-columnprivileges.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string

+ * The qualifier. + *

+ * @param owner string

+ * The owner. + *

+ * @param table_name string

+ * The table name. + *

+ * @param column_name string

+ * The column_name argument accepts search + * patterns ('%' to match zero or more characters and '_' to match a + * single character). + *

+ * @return resource an ODBC result identifier&return.falseforfailure;. + * This result identifier can be used to fetch a list of columns and + * associated privileges. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * GRANTOR + * GRANTEE + * PRIVILEGE + * IS_GRANTABLE + *

+ *

+ * The result set is ordered by TABLE_QUALIFIER, TABLE_OWNER and + * TABLE_NAME. + * + * @jms-builtin + */ +function odbc_columnprivileges ($connection_id, $qualifier, $owner, $table_name, $column_name) {} + +/** + * Lists tables and the privileges associated with each table + * @link http://www.php.net/manual/en/function.odbc-tableprivileges.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string

+ * The qualifier. + *

+ * @param owner string

+ * The owner. Accepts the following search patterns: + * ('%' to match zero or more characters and '_' to match a single character) + *

+ * @param name string

+ * The name. Accepts the following search patterns: + * ('%' to match zero or more characters and '_' to match a single character) + *

+ * @return resource An ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * GRANTOR + * GRANTEE + * PRIVILEGE + * IS_GRANTABLE + * + * @jms-builtin + */ +function odbc_tableprivileges ($connection_id, $qualifier, $owner, $name) {} + +/** + * Retrieves a list of foreign keys + * @link http://www.php.net/manual/en/function.odbc-foreignkeys.php + * @param connection_id resource &odbc.connection.id; + * @param pk_qualifier string

+ * The primary key qualifier. + *

+ * @param pk_owner string

+ * The primary key owner. + *

+ * @param pk_table string

+ * The primary key table. + *

+ * @param fk_qualifier string

+ * The foreign key qualifier. + *

+ * @param fk_owner string

+ * The foreign key owner. + *

+ * @param fk_table string

+ * The foreign key table. + *

+ * @return resource an ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * PKTABLE_QUALIFIER + * PKTABLE_OWNER + * PKTABLE_NAME + * PKCOLUMN_NAME + * FKTABLE_QUALIFIER + * FKTABLE_OWNER + * FKTABLE_NAME + * FKCOLUMN_NAME + * KEY_SEQ + * UPDATE_RULE + * DELETE_RULE + * FK_NAME + * PK_NAME + *

+ * If pk_table contains a table name, + * odbc_foreignkeys returns a result set + * containing the primary key of the specified table and all of the + * foreign keys that refer to it. + * If fk_table contains a table name, + * odbc_foreignkeys returns a result set + * containing all of the foreign keys in the specified table and the + * primary keys (in other tables) to which they refer. + * If both pk_table and + * fk_table contain table names, + * odbc_foreignkeys returns the foreign keys in + * the table specified in fk_table that refer + * to the primary key of the table specified in + * pk_table + * + * @jms-builtin + */ +function odbc_foreignkeys ($connection_id, $pk_qualifier, $pk_owner, $pk_table, $fk_qualifier, $fk_owner, $fk_table) {} + +/** + * Get the list of procedures stored in a specific data source + * @link http://www.php.net/manual/en/function.odbc-procedures.php + * @param connection_id resource &odbc.connection.id; + * @return resource an ODBC + * result identifier containing the information&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * PROCEDURE_QUALIFIER + * PROCEDURE_OWNER + * PROCEDURE_NAME + * NUM_INPUT_PARAMS + * NUM_OUTPUT_PARAMS + * NUM_RESULT_SETS + * REMARKS + * PROCEDURE_TYPE + * + * @jms-builtin + */ +function odbc_procedures ($connection_id) {} + +/** + * Retrieve information about parameters to procedures + * @link http://www.php.net/manual/en/function.odbc-procedurecolumns.php + * @param connection_id resource &odbc.connection.id; + * @return resource the list of input and output parameters, as well as the + * columns that make up the result set for the specified procedures. + * Returns an ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * PROCEDURE_QUALIFIER + * PROCEDURE_OWNER + * PROCEDURE_NAME + * COLUMN_NAME + * COLUMN_TYPE + * DATA_TYPE + * TYPE_NAME + * PRECISION + * LENGTH + * SCALE + * RADIX + * NULLABLE + * REMARKS + * + * @jms-builtin + */ +function odbc_procedurecolumns ($connection_id) {} + +/** + * &Alias; odbc_exec + * @link http://www.php.net/manual/en/function.odbc-do.php + * + * @jms-builtin + */ +function odbc_do () {} + +/** + * &Alias; odbc_field_len + * @link http://www.php.net/manual/en/function.odbc-field-precision.php + * + * @jms-builtin + */ +function odbc_field_precision () {} + +define ('ODBC_TYPE', "Win32"); +define ('ODBC_BINMODE_PASSTHRU', 0); +define ('ODBC_BINMODE_RETURN', 1); +define ('ODBC_BINMODE_CONVERT', 2); +define ('SQL_ODBC_CURSORS', 110); +define ('SQL_CUR_USE_DRIVER', 2); +define ('SQL_CUR_USE_IF_NEEDED', 0); +define ('SQL_CUR_USE_ODBC', 1); +define ('SQL_CONCURRENCY', 7); +define ('SQL_CONCUR_READ_ONLY', 1); +define ('SQL_CONCUR_LOCK', 2); +define ('SQL_CONCUR_ROWVER', 3); +define ('SQL_CONCUR_VALUES', 4); +define ('SQL_CURSOR_TYPE', 6); +define ('SQL_CURSOR_FORWARD_ONLY', 0); +define ('SQL_CURSOR_KEYSET_DRIVEN', 1); +define ('SQL_CURSOR_DYNAMIC', 2); +define ('SQL_CURSOR_STATIC', 3); +define ('SQL_KEYSET_SIZE', 8); +define ('SQL_FETCH_FIRST', 2); +define ('SQL_FETCH_NEXT', 1); +define ('SQL_CHAR', 1); +define ('SQL_VARCHAR', 12); +define ('SQL_LONGVARCHAR', -1); +define ('SQL_DECIMAL', 3); +define ('SQL_NUMERIC', 2); +define ('SQL_BIT', -7); +define ('SQL_TINYINT', -6); +define ('SQL_SMALLINT', 5); +define ('SQL_INTEGER', 4); +define ('SQL_BIGINT', -5); +define ('SQL_REAL', 7); +define ('SQL_FLOAT', 6); +define ('SQL_DOUBLE', 8); +define ('SQL_BINARY', -2); +define ('SQL_VARBINARY', -3); +define ('SQL_LONGVARBINARY', -4); +define ('SQL_DATE', 9); +define ('SQL_TIME', 10); +define ('SQL_TIMESTAMP', 11); + +// End of odbc v.1.0 +?> diff --git a/res/php-5.2-core-api/openssl.php b/res/php-5.2-core-api/openssl.php new file mode 100644 index 0000000..4e169da --- /dev/null +++ b/res/php-5.2-core-api/openssl.php @@ -0,0 +1,956 @@ + + * Resource holding the key. + *

+ * @return void + * + * @jms-builtin + */ +function openssl_pkey_free ($key) {} + +/** + * Generates a new private key + * @link http://www.php.net/manual/en/function.openssl-pkey-new.php + * @param configargs array[optional]

+ * You can finetune the key generation (such as specifying the number of + * bits) using configargs. See + * openssl_csr_new for more information about + * configargs. + *

+ * @return resource a resource identifier for the pkey on success, or false on + * error. + * + * @jms-builtin + */ +function openssl_pkey_new (array $configargs = null) {} + +/** + * Gets an exportable representation of a key into a string + * @link http://www.php.net/manual/en/function.openssl-pkey-export.php + * @param key mixed

+ *

+ * @param out string

+ *

+ * @param passphrase string[optional]

+ * The key is optionally protected by passphrase. + *

+ * @param configargs array[optional]

+ * configargs can be used to fine-tune the export + * process by specifying and/or overriding options for the openssl + * configuration file. See openssl_csr_new for more + * information about configargs. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkey_export ($key, &$out, $passphrase = null, array $configargs = null) {} + +/** + * Gets an exportable representation of a key into a file + * @link http://www.php.net/manual/en/function.openssl-pkey-export-to-file.php + * @param key mixed

+ *

+ * @param outfilename string

+ * Path to the output file. + *

+ * @param passphrase string[optional]

+ * The key can be optionally protected by a + * passphrase. + *

+ * @param configargs array[optional]

+ * configargs can be used to fine-tune the export + * process by specifying and/or overriding options for the openssl + * configuration file. See openssl_csr_new for more + * information about configargs. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkey_export_to_file ($key, $outfilename, $passphrase = null, array $configargs = null) {} + +/** + * Get a private key + * @link http://www.php.net/manual/en/function.openssl-pkey-get-private.php + * @param key mixed

+ * key can be one of the following: + * a string having the format + * file://path/to/file.pem. The named file must + * contain a PEM encoded certificate/private key (it may contain both). + * @param passphrase string[optional]

+ * The optional parameter passphrase must be used + * if the specified key is encrypted (protected by a passphrase). + *

+ * @return resource a positive key resource identifier on success, or false on error. + * + * @jms-builtin + */ +function openssl_pkey_get_private ($key, $passphrase = null) {} + +/** + * Extract public key from certificate and prepare it for use + * @link http://www.php.net/manual/en/function.openssl-pkey-get-public.php + * @param certificate mixed

+ * certificate can be one of the following: + * an X.509 certificate resource + * @return resource a positive key resource identifier on success, or false on error. + * + * @jms-builtin + */ +function openssl_pkey_get_public ($certificate) {} + +/** + * Returns an array with the key details + * @link http://www.php.net/manual/en/function.openssl-pkey-get-details.php + * @param key resource

+ * Resource holding the key. + *

+ * @return array an array with the key details in success or false in failure. + * Returned array has indexes bits (number of bits), + * key (string representation of the public key) and + * type (type of the key which is one of + * OPENSSL_KEYTYPE_RSA, + * OPENSSL_KEYTYPE_DSA, + * OPENSSL_KEYTYPE_DH, + * OPENSSL_KEYTYPE_EC or -1 meaning unknown). + * + * @jms-builtin + */ +function openssl_pkey_get_details ($key) {} + +/** + * Free key resource + * @link http://www.php.net/manual/en/function.openssl-free-key.php + * @param key_identifier resource

+ *

+ * @return void + * + * @jms-builtin + */ +function openssl_free_key ($key_identifier) {} + +/** + * &Alias; openssl_pkey_get_private + * @link http://www.php.net/manual/en/function.openssl-get-privatekey.php + * + * @jms-builtin + */ +function openssl_get_privatekey () {} + +/** + * &Alias; openssl_pkey_get_public + * @link http://www.php.net/manual/en/function.openssl-get-publickey.php + * + * @jms-builtin + */ +function openssl_get_publickey () {} + +/** + * Parse an X.509 certificate and return a resource identifier for + it + * @link http://www.php.net/manual/en/function.openssl-x509-read.php + * @param x509certdata mixed

+ *

+ * @return resource a resource identifier on success&return.falseforfailure;. + * + * @jms-builtin + */ +function openssl_x509_read ($x509certdata) {} + +/** + * Free certificate resource + * @link http://www.php.net/manual/en/function.openssl-x509-free.php + * @param x509cert resource

+ *

+ * @return void + * + * @jms-builtin + */ +function openssl_x509_free ($x509cert) {} + +/** + * Parse an X509 certificate and return the information as an array + * @link http://www.php.net/manual/en/function.openssl-x509-parse.php + * @param x509cert mixed

+ *

+ * @param shortnames bool[optional]

+ * shortnames controls how the data is indexed in the + * array - if shortnames is true (the default) then + * fields will be indexed with the short name form, otherwise, the long name + * form will be used - e.g.: CN is the shortname form of commonName. + *

+ * @return array The structure of the returned data is (deliberately) not + * yet documented, as it is still subject to change. + * + * @jms-builtin + */ +function openssl_x509_parse ($x509cert, $shortnames = null) {} + +/** + * Verifies if a certificate can be used for a particular purpose + * @link http://www.php.net/manual/en/function.openssl-x509-checkpurpose.php + * @param x509cert mixed

+ * The examined certificate. + *

+ * @param purpose int

+ * + * openssl_x509_checkpurpose purposes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
X509_PURPOSE_SSL_CLIENTCan the certificate be used for the client side of an SSL + * connection?
X509_PURPOSE_SSL_SERVERCan the certificate be used for the server side of an SSL + * connection?
X509_PURPOSE_NS_SSL_SERVERCan the cert be used for Netscape SSL server?
X509_PURPOSE_SMIME_SIGNCan the cert be used to sign S/MIME email?
X509_PURPOSE_SMIME_ENCRYPTCan the cert be used to encrypt S/MIME email?
X509_PURPOSE_CRL_SIGNCan the cert be used to sign a certificate revocation list + * (CRL)?
X509_PURPOSE_ANYCan the cert be used for Any/All purposes?
+ * These options are not bitfields - you may specify one only! + *

+ * @param cainfo array[optional]

+ * cainfo should be an array of trusted CA files/dirs + * as described in Certificate + * Verification. + *

+ * @param untrustedfile string[optional]

+ * If specified, this should be the name of a PEM encoded file holding + * certificates that can be used to help verify the certificate, although + * no trust is placed in the certificates that come from that file. + *

+ * @return int true if the certificate can be used for the intended purpose, + * false if it cannot, or -1 on error. + * + * @jms-builtin + */ +function openssl_x509_checkpurpose ($x509cert, $purpose, array $cainfo = null, $untrustedfile = null) {} + +/** + * Checks if a private key corresponds to a certificate + * @link http://www.php.net/manual/en/function.openssl-x509-check-private-key.php + * @param cert mixed

+ * The certificate. + *

+ * @param key mixed

+ * The private key. + *

+ * @return bool true if key is the private key that + * corresponds to cert, or false otherwise. + * + * @jms-builtin + */ +function openssl_x509_check_private_key ($cert, $key) {} + +/** + * Exports a certificate as a string + * @link http://www.php.net/manual/en/function.openssl-x509-export.php + * @param x509 mixed + * @param output string

+ * On success, this will hold the PEM. + *

+ * @param notext bool[optional] ¬e.openssl.param-notext; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_x509_export ($x509, &$output, $notext = null) {} + +/** + * Exports a certificate to file + * @link http://www.php.net/manual/en/function.openssl-x509-export-to-file.php + * @param x509 mixed + * @param outfilename string

+ * Path to the output file. + *

+ * @param notext bool[optional] ¬e.openssl.param-notext; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_x509_export_to_file ($x509, $outfilename, $notext = null) {} + +/** + * Exports a PKCS#12 Compatible Certificate Store File to variable. + * @link http://www.php.net/manual/en/function.openssl-pkcs12-export.php + * @param x509 mixed + * @param out string

+ * On success, this will hold the PKCS#12. + *

+ * @param priv_key mixed

+ * Private key component of PKCS#12 file. + *

+ * @param pass string

+ * Encryption password for unlocking the PKCS#12 file. + *

+ * @param args array[optional]

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs12_export ($x509, &$out, $priv_key, $pass, array $args = null) {} + +/** + * Exports a PKCS#12 Compatible Certificate Store File + * @link http://www.php.net/manual/en/function.openssl-pkcs12-export-to-file.php + * @param x509 mixed + * @param filename string

+ * Path to the output file. + *

+ * @param priv_key mixed

+ * Private key component of PKCS#12 file. + *

+ * @param pass string

+ * Encryption password for unlocking the PKCS#12 file. + *

+ * @param args array[optional]

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs12_export_to_file ($x509, $filename, $priv_key, $pass, array $args = null) {} + +/** + * Parse a PKCS#12 Certificate Store into an array + * @link http://www.php.net/manual/en/function.openssl-pkcs12-read.php + * @param pkcs12 string

+ *

+ * @param certs array

+ * On success, this will hold the Certificate Store Data. + *

+ * @param pass string

+ * Encryption password for unlocking the PKCS#12 file. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs12_read ($pkcs12, array &$certs, $pass) {} + +/** + * Generates a CSR + * @link http://www.php.net/manual/en/function.openssl-csr-new.php + * @param dn array

+ * The Distinguished Name to be used in the certificate. + *

+ * @param privkey resource

+ * privkey should be set to a private key that was + * previously generated by openssl_pkey_new (or + * otherwise obtained from the other openssl_pkey family of functions). + * The corresponding public portion of the key will be used to sign the + * CSR. + *

+ * @param configargs array[optional]

+ * By default, the information in your system openssl.conf + * is used to initialize the request; you can specify a configuration file + * section by setting the config_section_section key of + * configargs. You can also specify an alternative + * openssl configuration file by setting the value of the + * config key to the path of the file you want to use. + * The following keys, if present in configargs + * behave as their equivalents in the openssl.conf, as + * listed in the table below. + * + * Configuration overrides + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
configargs keytypeopenssl.conf equivalentdescription
digest_algstringdefault_mdSelects which digest method to use
x509_extensionsstringx509_extensionsSelects which extensions should be used when creating an x509 + * certificate
req_extensionsstringreq_extensionsSelects which extensions should be used when creating a CSR
private_key_bitsintegerdefault_bitsSpecifies how many bits should be used to generate a private + * key
private_key_typeintegernoneSpecifies the type of private key to create. This can be one + * of OPENSSL_KEYTYPE_DSA, + * OPENSSL_KEYTYPE_DH or + * OPENSSL_KEYTYPE_RSA. + * The default value is OPENSSL_KEYTYPE_RSA which + * is currently the only supported key type. + *
encrypt_keybooleanencrypt_keyShould an exported key (with passphrase) be encrypted?
+ *

+ * @param extraattribs array[optional]

+ * extraattribs is used to specify additional + * configuration options for the CSR. Both dn and + * extraattribs are associative arrays whose keys are + * converted to OIDs and applied to the relevant part of the request. + *

+ * @return mixed the CSR. + * + * @jms-builtin + */ +function openssl_csr_new (array $dn, &$privkey, array $configargs = null, array $extraattribs = null) {} + +/** + * Exports a CSR as a string + * @link http://www.php.net/manual/en/function.openssl-csr-export.php + * @param csr resource

+ *

+ * @param out string

+ *

+ * @param notext bool[optional] ¬e.openssl.param-notext; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_csr_export ($csr, &$out, $notext = null) {} + +/** + * Exports a CSR to a file + * @link http://www.php.net/manual/en/function.openssl-csr-export-to-file.php + * @param csr resource

+ *

+ * @param outfilename string

+ * Path to the output file. + *

+ * @param notext bool[optional] ¬e.openssl.param-notext; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_csr_export_to_file ($csr, $outfilename, $notext = null) {} + +/** + * Sign a CSR with another certificate (or itself) and generate a certificate + * @link http://www.php.net/manual/en/function.openssl-csr-sign.php + * @param csr mixed

+ * A CSR previously generated by openssl_csr_new. + * It can also be the path to a PEM encoded CSR when specified as + * file://path/to/csr or an exported string generated + * by openssl_csr_export. + *

+ * @param cacert mixed

+ * The generated certificate will be signed by cacert. + * If cacert is &null;, the generated certificate + * will be a self-signed certificate. + *

+ * @param priv_key mixed

+ * priv_key is the private key that corresponds to + * cacert. + *

+ * @param days int

+ * days specifies the length of time for which the + * generated certificate will be valid, in days. + *

+ * @param configargs array[optional]

+ * You can finetune the CSR signing by configargs. + * See openssl_csr_new for more information about + * configargs. + *

+ * @param serial int[optional]

+ * An optional the serial number of issued certificate. If not specified + * it will default to 0. + *

+ * @return resource an x509 certificate resource on success, false on failure. + * + * @jms-builtin + */ +function openssl_csr_sign ($csr, $cacert, $priv_key, $days, array $configargs = null, $serial = null) {} + +/** + * Returns the subject of a CERT + * @link http://www.php.net/manual/en/function.openssl-csr-get-subject.php + * @param csr mixed + * @param use_shortnames bool[optional] + * @return array + * + * @jms-builtin + */ +function openssl_csr_get_subject ($csr, $use_shortnames = null) {} + +/** + * Returns the public key of a CERT + * @link http://www.php.net/manual/en/function.openssl-csr-get-public-key.php + * @param csr mixed + * @param use_shortnames bool[optional] + * @return resource + * + * @jms-builtin + */ +function openssl_csr_get_public_key ($csr, $use_shortnames = null) {} + +/** + * Generate signature + * @link http://www.php.net/manual/en/function.openssl-sign.php + * @param data string

+ *

+ * @param signature string

+ * If the call was successful the signature is returned in + * signature. + *

+ * @param priv_key_id mixed

+ *

+ * @param signature_alg int[optional]

+ * For more information see the list of Signature Algorithms. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_sign ($data, &$signature, $priv_key_id, $signature_alg = null) {} + +/** + * Verify signature + * @link http://www.php.net/manual/en/function.openssl-verify.php + * @param data string

+ *

+ * @param signature string

+ *

+ * @param pub_key_id mixed

+ *

+ * @param signature_alg int[optional]

+ * For more information see the list of Signature Algorithms. + *

+ * @return int 1 if the signature is correct, 0 if it is incorrect, and + * -1 on error. + * + * @jms-builtin + */ +function openssl_verify ($data, $signature, $pub_key_id, $signature_alg = null) {} + +/** + * Seal (encrypt) data + * @link http://www.php.net/manual/en/function.openssl-seal.php + * @param data string

+ *

+ * @param sealed_data string

+ *

+ * @param env_keys array

+ *

+ * @param pub_key_ids array

+ *

+ * @return int the length of the sealed data on success, or false on error. + * If successful the sealed data is returned in + * sealed_data, and the envelope keys in + * env_keys. + * + * @jms-builtin + */ +function openssl_seal ($data, &$sealed_data, array &$env_keys, array $pub_key_ids) {} + +/** + * Open sealed data + * @link http://www.php.net/manual/en/function.openssl-open.php + * @param sealed_data string

+ *

+ * @param open_data string

+ * If the call is successful the opened data is returned in this + * parameter. + *

+ * @param env_key string

+ *

+ * @param priv_key_id mixed

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_open ($sealed_data, &$open_data, $env_key, $priv_key_id) {} + +/** + * Verifies the signature of an S/MIME signed message + * @link http://www.php.net/manual/en/function.openssl-pkcs7-verify.php + * @param filename string

+ * Path to the message. + *

+ * @param flags int

+ * flags can be used to affect how the signature is + * verified - see PKCS7 constants + * for more information. + *

+ * @param outfilename string[optional]

+ * If the outfilename is specified, it should be a + * string holding the name of a file into which the certificates of the + * persons that signed the messages will be stored in PEM format. + *

+ * @param cainfo array[optional]

+ * If the cainfo is specified, it should hold + * information about the trusted CA certificates to use in the verification + * process - see certificate + * verification for more information about this parameter. + *

+ * @param extracerts string[optional]

+ * If the extracerts is specified, it is the filename + * of a file containing a bunch of certificates to use as untrusted CAs. + *

+ * @param content string[optional]

+ * You can specify a filename with content that will + * be filled with the verified data, but with the signature information + * stripped. + *

+ * @return mixed true if the signature is verified, false if it is not correct + * (the message has been tampered with, or the signing certificate is invalid), + * or -1 on error. + * + * @jms-builtin + */ +function openssl_pkcs7_verify ($filename, $flags, $outfilename = null, array $cainfo = null, $extracerts = null, $content = null) {} + +/** + * Decrypts an S/MIME encrypted message + * @link http://www.php.net/manual/en/function.openssl-pkcs7-decrypt.php + * @param infilename string

+ *

+ * @param outfilename string

+ * The decrypted message is written to the file specified by + * outfilename. + *

+ * @param recipcert mixed

+ *

+ * @param recipkey mixed[optional]

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs7_decrypt ($infilename, $outfilename, $recipcert, $recipkey = null) {} + +/** + * Sign an S/MIME message + * @link http://www.php.net/manual/en/function.openssl-pkcs7-sign.php + * @param infilename string

+ *

+ * @param outfilename string

+ *

+ * @param signcert mixed

+ *

+ * @param privkey mixed

+ *

+ * @param headers array

+ * headers is an array of headers that + * will be prepended to the data after it has been signed (see + * openssl_pkcs7_encrypt for more information about + * the format of this parameter). + *

+ * @param flags int[optional]

+ * flags can be used to alter the output - see PKCS7 constants. + *

+ * @param extracerts string[optional]

+ * extracerts specifies the name of a file containing + * a bunch of extra certificates to include in the signature which can for + * example be used to help the recipient to verify the certificate that you used. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs7_sign ($infilename, $outfilename, $signcert, $privkey, array $headers, $flags = null, $extracerts = null) {} + +/** + * Encrypt an S/MIME message + * @link http://www.php.net/manual/en/function.openssl-pkcs7-encrypt.php + * @param infile string

+ *

+ * @param outfile string

+ *

+ * @param recipcerts mixed

+ * Either a lone X.509 certificate, or an array of X.509 certificates. + *

+ * @param headers array

+ * headers is an array of headers that + * will be prepended to the data after it has been encrypted. + *

+ *

+ * headers can be either an associative array + * keyed by header name, or an indexed array, where each element contains + * a single header line. + *

+ * @param flags int[optional]

+ * flags can be used to specify options that affect + * the encoding process - see PKCS7 + * constants. + *

+ * @param cipherid int[optional]

+ * Cipher can be selected with cipherid. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs7_encrypt ($infile, $outfile, $recipcerts, array $headers, $flags = null, $cipherid = null) {} + +/** + * Encrypts data with private key + * @link http://www.php.net/manual/en/function.openssl-private-encrypt.php + * @param data string

+ *

+ * @param crypted string

+ *

+ * @param key mixed

+ *

+ * @param padding int[optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_private_encrypt ($data, &$crypted, $key, $padding = null) {} + +/** + * Decrypts data with private key + * @link http://www.php.net/manual/en/function.openssl-private-decrypt.php + * @param data string

+ *

+ * @param decrypted string

+ *

+ * @param key mixed

+ * key must be the private key corresponding that + * was used to encrypt the data. + *

+ * @param padding int[optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_SSLV23_PADDING, + * OPENSSL_PKCS1_OAEP_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_private_decrypt ($data, &$decrypted, $key, $padding = null) {} + +/** + * Encrypts data with public key + * @link http://www.php.net/manual/en/function.openssl-public-encrypt.php + * @param data string

+ *

+ * @param crypted string

+ * This will hold the result of the encryption. + *

+ * @param key mixed

+ * The public key. + *

+ * @param padding int[optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_SSLV23_PADDING, + * OPENSSL_PKCS1_OAEP_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_public_encrypt ($data, &$crypted, $key, $padding = null) {} + +/** + * Decrypts data with public key + * @link http://www.php.net/manual/en/function.openssl-public-decrypt.php + * @param data string

+ *

+ * @param decrypted string

+ *

+ * @param key mixed

+ * key must be the public key corresponding that + * was used to encrypt the data. + *

+ * @param padding int[optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_public_decrypt ($data, &$decrypted, $key, $padding = null) {} + +/** + * Return openSSL error message + * @link http://www.php.net/manual/en/function.openssl-error-string.php + * @return string an error message string, or false if there are no more error + * messages to return. + * + * @jms-builtin + */ +function openssl_error_string () {} + +define ('OPENSSL_VERSION_TEXT', "OpenSSL 0.9.8n 24 Mar 2010"); +define ('OPENSSL_VERSION_NUMBER', 9470191); +define ('X509_PURPOSE_SSL_CLIENT', 1); +define ('X509_PURPOSE_SSL_SERVER', 2); +define ('X509_PURPOSE_NS_SSL_SERVER', 3); +define ('X509_PURPOSE_SMIME_SIGN', 4); +define ('X509_PURPOSE_SMIME_ENCRYPT', 5); +define ('X509_PURPOSE_CRL_SIGN', 6); +define ('X509_PURPOSE_ANY', 7); + +/** + * Used as default algorithm by openssl_sign and + * openssl_verify. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('OPENSSL_ALGO_SHA1', 1); +define ('OPENSSL_ALGO_MD5', 2); +define ('OPENSSL_ALGO_MD4', 3); +define ('OPENSSL_ALGO_DSS1', 5); + +/** + * When signing a message, use cleartext signing with the MIME + * type "multipart/signed". This is the default + * if you do not specify any flags to + * openssl_pkcs7_sign. + * If you turn this option off, the message will be signed using + * opaque signing, which is more resistant to translation by mail relays + * but cannot be read by mail agents that do not support S/MIME. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_DETACHED', 64); + +/** + * Adds text/plain content type headers to encrypted/signed + * message. If decrypting or verifying, it strips those headers from + * the output - if the decrypted or verified message is not of MIME type + * text/plain then an error will occur. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_TEXT', 1); + +/** + * When verifying a message, certificates (if + * any) included in the message are normally searched for the + * signing certificate. With this option only the + * certificates specified in the extracerts + * parameter of openssl_pkcs7_verify are + * used. The supplied certificates can still be used as + * untrusted CAs however. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOINTERN', 16); + +/** + * Do not verify the signers certificate of a signed + * message. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOVERIFY', 32); + +/** + * Do not chain verification of signers certificates: that is + * don't use the certificates in the signed message as untrusted CAs. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOCHAIN', 8); + +/** + * When signing a message the signer's certificate is normally + * included - with this option it is excluded. This will reduce the + * size of the signed message but the verifier must have a copy of the + * signers certificate available locally (passed using the + * extracerts to + * openssl_pkcs7_verify for example). + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOCERTS', 2); + +/** + * Normally when a message is signed, a set of attributes are + * included which include the signing time and the supported symmetric + * algorithms. With this option they are not included. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOATTR', 256); + +/** + * Normally the input message is converted to "canonical" format + * which is effectively using CR and LF + * as end of line: as required by the S/MIME specification. When this + * option is present, no translation occurs. This is useful when + * handling binary data which may not be in MIME format. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_BINARY', 128); + +/** + * Don't try and verify the signatures on a message + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOSIGS', 4); +define ('OPENSSL_PKCS1_PADDING', 1); +define ('OPENSSL_SSLV23_PADDING', 2); +define ('OPENSSL_NO_PADDING', 3); +define ('OPENSSL_PKCS1_OAEP_PADDING', 4); +define ('OPENSSL_CIPHER_RC2_40', 0); +define ('OPENSSL_CIPHER_RC2_128', 1); +define ('OPENSSL_CIPHER_RC2_64', 2); +define ('OPENSSL_CIPHER_DES', 3); +define ('OPENSSL_CIPHER_3DES', 4); +define ('OPENSSL_KEYTYPE_RSA', 0); +define ('OPENSSL_KEYTYPE_DSA', 1); +define ('OPENSSL_KEYTYPE_DH', 2); +define ('OPENSSL_KEYTYPE_EC', 3); + +// End of openssl v. +?> diff --git a/res/php-5.2-core-api/pcre.php b/res/php-5.2-core-api/pcre.php new file mode 100644 index 0000000..ab9057b --- /dev/null +++ b/res/php-5.2-core-api/pcre.php @@ -0,0 +1,459 @@ + + * The pattern to search for, as a string. + *

+ * @param subject string

+ * The input string. + *

+ * @param array $matches

+ * If matches is provided, then it is filled with + * the results of search. $matches[0] will contain the + * text that matched the full pattern, $matches[1] + * will have the text that matched the first captured parenthesized + * subpattern, and so on. + *

+ * @param flags int[optional]

+ * flags can be the following flag: + * PREG_OFFSET_CAPTURE + * If this flag is passed, for every occurring match the appendant string + * offset will also be returned. Note that this changes the value of + * matches into an array where every element is an + * array consisting of the matched string at offset 0 + * and its string offset into subject at offset + * 1. + * @param offset int[optional]

+ * Normally, the search starts from the beginning of the subject string. + * The optional parameter offset can be used to + * specify the alternate place from which to start the search (in bytes). + *

+ *

+ * Using offset is not equivalent to passing + * substr($subject, $offset) to + * preg_match in place of the subject string, + * because pattern can contain assertions such as + * ^, $ or + * (?<=x). Compare: + * ]]> + * &example.outputs; + *

+ * while this example + *

+ * ]]> + *

+ * will produce + *

+ * Array + * ( + * [0] => def + * [1] => 0 + * ) + * ) + * ]]> + *

+ * @return int preg_match returns the number of times + * pattern matches. That will be either 0 times + * (no match) or 1 time because preg_match will stop + * searching after the first match. preg_match_all + * on the contrary will continue until it reaches the end of + * subject. + * preg_match returns false if an error occurred. + * + * @jms-builtin + */ +function preg_match ($pattern, $subject, array &$matches = null, $flags = null, $offset = null) {} + +/** + * Perform a global regular expression match + * @link http://www.php.net/manual/en/function.preg-match-all.php + * @param pattern string

+ * The pattern to search for, as a string. + *

+ * @param subject string

+ * The input string. + *

+ * @param array> $matches

+ * Normally, the search starts from the beginning of the subject string. + * The optional parameter offset can be used to + * specify the alternate place from which to start the search (in bytes). + *

+ *

+ * Using offset is not equivalent to passing + * substr($subject, $offset) to + * preg_match_all in place of the subject string, + * because pattern can contain assertions such as + * ^, $ or + * (?<=x). See preg_match + * for examples. + *

+ * @param flags int[optional]

+ * Can be a combination of the following flags (note that it doesn't make + * sense to use PREG_PATTERN_ORDER together with + * PREG_SET_ORDER): + * PREG_PATTERN_ORDER + *

+ * Orders results so that $matches[0] is an array of full + * pattern matches, $matches[1] is an array of strings matched by + * the first parenthesized subpattern, and so on. + *

+ *

+ * ]]> + * &example.outputs; + * example: , this is a test + * example: , this is a test + * ]]> + *

+ * So, $out[0] contains array of strings that matched full pattern, + * and $out[1] contains array of strings enclosed by tags. + *

+ *

+ * @param offset int[optional] + * @return int the number of full pattern matches (which might be zero), + * or false if an error occurred. + * + * @jms-builtin + */ +function preg_match_all ($pattern, $subject, array &$matches, $flags = null, $offset = null) {} + +/** + * Perform a regular expression search and replace + * @link http://www.php.net/manual/en/function.preg-replace.php + * @param pattern mixed

+ * The pattern to search for. It can be either a string or an array with + * strings. + *

+ *

+ * The e modifier makes preg_replace + * treat the replacement parameter as PHP code after + * the appropriate references substitution is done. Tip: make sure that + * replacement constitutes a valid PHP code string, + * otherwise PHP will complain about a parse error at the line containing + * preg_replace. + *

+ * @param replacement mixed

+ * The string or an array with strings to replace. If this parameter is a + * string and the pattern parameter is an array, + * all patterns will be replaced by that string. If both + * pattern and replacement + * parameters are arrays, each pattern will be + * replaced by the replacement counterpart. If + * there are fewer elements in the replacement + * array than in the pattern array, any extra + * patterns will be replaced by an empty string. + *

+ *

+ * replacement may contain references of the form + * \\n or (since PHP 4.0.4) + * $n, with the latter form + * being the preferred one. Every such reference will be replaced by the text + * captured by the n'th parenthesized pattern. + * n can be from 0 to 99, and + * \\0 or $0 refers to the text matched + * by the whole pattern. Opening parentheses are counted from left to right + * (starting from 1) to obtain the number of the capturing subpattern. + * To use backslash in replacement, it must be doubled + * ("\\\\" PHP string). + *

+ *

+ * When working with a replacement pattern where a backreference is + * immediately followed by another number (i.e.: placing a literal number + * immediately after a matched pattern), you cannot use the familiar + * \\1 notation for your backreference. + * \\11, for example, would confuse + * preg_replace since it does not know whether you + * want the \\1 backreference followed by a literal + * 1, or the \\11 backreference + * followed by nothing. In this case the solution is to use + * \${1}1. This creates an isolated + * $1 backreference, leaving the 1 + * as a literal. + *

+ *

+ * When using the e modifier, this function escapes + * some characters (namely ', ", + * \ and NULL) in the strings that replace the + * backreferences. This is done to ensure that no syntax errors arise + * from backreference usage with either single or double quotes (e.g. + * 'strlen(\'$1\')+strlen("$2")'). Make sure you are + * aware of PHP's string + * syntax to know exactly how the interpreted string will look + * like. + *

+ * @param string|array $subject

+ * The string or an array with strings to search and replace. + *

+ *

+ * If subject is an array, then the search and + * replace is performed on every entry of subject, + * and the return value is an array as well. + *

+ * @param limit int[optional]

+ * The maximum possible replacements for each pattern in each + * subject string. Defaults to + * -1 (no limit). + *

+ * @param count int[optional]

+ * If specified, this variable will be filled with the number of + * replacements done. + *

+ * @return mixed preg_replace returns an array if the + * subject parameter is an array, or a string + * otherwise. + *

+ *

+ * If matches are found, the new subject will + * be returned, otherwise subject will be + * returned unchanged or &null; if an error occurred. + * + * @jms-builtin + */ +function preg_replace ($pattern, $replacement, $subject, $limit = null, &$count = null) {} + +/** + * Perform a regular expression search and replace using a callback + * @link http://www.php.net/manual/en/function.preg-replace-callback.php + * @param string|array $pattern

+ * The pattern to search for. It can be either a string or an array with + * strings. + *

+ * @param callback callback

+ * A callback that will be called and passed an array of matched elements + * in the subject string. The callback should + * return the replacement string. + *

+ *

+ * You'll often need the callback function + * for a preg_replace_callback in just one place. + * In this case you can use an + * anonymous function (since + * PHP 5.3.0) or create_function to + * declare an anonymous function as callback within the call to + * preg_replace_callback. By doing it this way + * you have all information for the call in one place and do not + * clutter the function namespace with a callback function's name + * not used anywhere else. + *

+ *

+ * preg_replace_callback and + * create_function + * ]]> + *

+ * @param string|array $subject

+ * The string or an array with strings to search and replace. + *

+ * @param limit int[optional]

+ * The maximum possible replacements for each pattern in each + * subject string. Defaults to + * -1 (no limit). + *

+ * @param count int[optional]

+ * If specified, this variable will be filled with the number of + * replacements done. + *

+ * @return string|array preg_replace_callback returns an array if the + * subject parameter is an array, or a string + * otherwise. On errors the return value is &null; + *

+ *

+ * If matches are found, the new subject will be returned, otherwise + * subject will be returned unchanged. + * + * @jms-builtin + */ +function preg_replace_callback ($pattern, $callback, $subject, $limit = null, &$count = null) {} + +/** + * Split string by a regular expression + * @link http://www.php.net/manual/en/function.preg-split.php + * @param pattern string

+ * The pattern to search for, as a string. + *

+ * @param subject string

+ * The input string. + *

+ * @param limit int[optional]

+ * If specified, then only substrings up to limit + * are returned with the rest of the string being placed in the last + * substring. A limit of -1, 0 or null means "no limit" + * and, as is standard across PHP, you can use null to skip to the + * flags parameter. + *

+ * @param flags int[optional]

+ * flags can be any combination of the following + * flags (combined with the | bitwise operator): + * PREG_SPLIT_NO_EMPTY + * If this flag is set, only non-empty pieces will be returned by + * preg_split. + * @return array an array containing substrings of subject + * split along boundaries matched by pattern. + * + * @jms-builtin + */ +function preg_split ($pattern, $subject, $limit = null, $flags = null) {} + +/** + * Quote regular expression characters + * @link http://www.php.net/manual/en/function.preg-quote.php + * @param str string

+ * The input string. + *

+ * @param delimiter string[optional]

+ * If the optional delimiter is specified, it + * will also be escaped. This is useful for escaping the delimiter + * that is required by the PCRE functions. The / is the most commonly + * used delimiter. + *

+ * @return string the quoted string. + * + * @jms-builtin + */ +function preg_quote ($str, $delimiter = null) {} + +/** + * Return array entries that match the pattern + * @link http://www.php.net/manual/en/function.preg-grep.php + * @param pattern string

+ * The pattern to search for, as a string. + *

+ * @param input array

+ * The input array. + *

+ * @param flags int[optional]

+ * If set to PREG_GREP_INVERT, this function returns + * the elements of the input array that do not match + * the given pattern. + *

+ * @return array an array indexed using the keys from the + * input array. + * + * @jms-builtin + */ +function preg_grep ($pattern, array $input, $flags = null) {} + +/** + * Returns the error code of the last PCRE regex execution + * @link http://www.php.net/manual/en/function.preg-last-error.php + * @return int one of the following constants (explained on their own page): + * PREG_NO_ERROR + * PREG_INTERNAL_ERROR + * PREG_BACKTRACK_LIMIT_ERROR (see also pcre.backtrack_limit) + * PREG_RECURSION_LIMIT_ERROR (see also pcre.recursion_limit) + * PREG_BAD_UTF8_ERROR + * PREG_BAD_UTF8_OFFSET_ERROR (since PHP 5.3.0) + * + * @jms-builtin + */ +function preg_last_error () {} + + +/** + * Orders results so that $matches[0] is an array of full pattern + * matches, $matches[1] is an array of strings matched by the first + * parenthesized subpattern, and so on. This flag is only used with + * preg_match_all. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_PATTERN_ORDER', 1); + +/** + * Orders results so that $matches[0] is an array of first set of + * matches, $matches[1] is an array of second set of matches, and so + * on. This flag is only used with preg_match_all. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_SET_ORDER', 2); + +/** + * See the description of + * PREG_SPLIT_OFFSET_CAPTURE. This flag is + * available since PHP 4.3.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_OFFSET_CAPTURE', 256); + +/** + * This flag tells preg_split to return only non-empty + * pieces. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_SPLIT_NO_EMPTY', 1); + +/** + * This flag tells preg_split to capture + * parenthesized expression in the delimiter pattern as well. This flag + * is available since PHP 4.0.5. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_SPLIT_DELIM_CAPTURE', 2); + +/** + * If this flag is set, for every occurring match the appendant string + * offset will also be returned. Note that this changes the return + * values in an array where every element is an array consisting of the + * matched string at offset 0 and its string offset within subject at + * offset 1. This flag is available since PHP 4.3.0 + * and is only used for preg_split. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_SPLIT_OFFSET_CAPTURE', 4); +define ('PREG_GREP_INVERT', 1); + +/** + * Returned by preg_last_error if there were no + * errors. Available since PHP 5.2.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_NO_ERROR', 0); + +/** + * Returned by preg_last_error if there was an + * internal PCRE error. Available since PHP 5.2.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_INTERNAL_ERROR', 1); + +/** + * Returned by preg_last_error if backtrack limit was exhausted. + * Available since PHP 5.2.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_BACKTRACK_LIMIT_ERROR', 2); + +/** + * Returned by preg_last_error if recursion limit was exhausted. + * Available since PHP 5.2.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_RECURSION_LIMIT_ERROR', 3); + +/** + * Returned by preg_last_error if the last error was + * caused by malformed UTF-8 data (only when running a regex in UTF-8 mode). Available + * since PHP 5.2.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_BAD_UTF8_ERROR', 4); + +/** + * Returned by preg_last_error if the offset didn't + * correspond to the begin of a valid UTF-8 code point (only when running + * a regex in UTF-8 + * mode). Available since PHP 5.3.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_BAD_UTF8_OFFSET_ERROR', 5); + +/** + * PCRE version and release date (e.g. "7.0 18-Dec-2006"). + * Available since PHP 5.2.4. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PCRE_VERSION', "7.9 2009-04-11"); + +// End of pcre v. +?> diff --git a/res/php-5.2-core-api/pdo_mysql.php b/res/php-5.2-core-api/pdo_mysql.php new file mode 100644 index 0000000..b6fdd63 --- /dev/null +++ b/res/php-5.2-core-api/pdo_mysql.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.2-core-api/pdo_pgsql.php b/res/php-5.2-core-api/pdo_pgsql.php new file mode 100644 index 0000000..e551b7a --- /dev/null +++ b/res/php-5.2-core-api/pdo_pgsql.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.2-core-api/pdo_sqlite.php b/res/php-5.2-core-api/pdo_sqlite.php new file mode 100644 index 0000000..d33f2d2 --- /dev/null +++ b/res/php-5.2-core-api/pdo_sqlite.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.2-core-api/pgsql.php b/res/php-5.2-core-api/pgsql.php new file mode 100644 index 0000000..9538745 --- /dev/null +++ b/res/php-5.2-core-api/pgsql.php @@ -0,0 +1,2018 @@ + + * The connection_string can be empty to use all default parameters, or it + * can contain one or more parameter settings separated by whitespace. + * Each parameter setting is in the form keyword = value. Spaces around + * the equal sign are optional. To write an empty value or a value + * containing spaces, surround it with single quotes, e.g., keyword = + * 'a value'. Single quotes and backslashes within the value must be + * escaped with a backslash, i.e., \' and \\. + *

+ *

+ * The currently recognized parameter keywords are: + * host, hostaddr, port, + * dbname, user, + * password, connect_timeout, + * options, tty (ignored), sslmode, + * requiressl (deprecated in favor of sslmode), and + * service. Which of these arguments exist depends + * on your PostgreSQL version. + *

+ * @param connect_type int[optional]

+ * If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection + * is created, even if the connection_string is identical to + * an existing connection. + *

+ * @return resource PostgreSQL connection resource on success, false on failure. + * + * @jms-builtin + */ +function pg_connect ($connection_string, $connect_type = null) {} + +/** + * Open a persistent PostgreSQL connection + * @link http://www.php.net/manual/en/function.pg-pconnect.php + * @param connection_string string

+ * The connection_string can be empty to use all default parameters, or it + * can contain one or more parameter settings separated by whitespace. + * Each parameter setting is in the form keyword = value. Spaces around + * the equal sign are optional. To write an empty value or a value + * containing spaces, surround it with single quotes, e.g., keyword = + * 'a value'. Single quotes and backslashes within the value must be + * escaped with a backslash, i.e., \' and \\. + *

+ *

+ * The currently recognized parameter keywords are: + * host, hostaddr, port, + * dbname, user, + * password, connect_timeout, + * options, tty (ignored), sslmode, + * requiressl (deprecated in favor of sslmode), and + * service. Which of these arguments exist depends + * on your PostgreSQL version. + *

+ * @param connect_type int[optional]

+ * If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection + * is created, even if the connection_string is identical to + * an existing connection. + *

+ * @return resource PostgreSQL connection resource on success, false on failure. + * + * @jms-builtin + */ +function pg_pconnect ($connection_string, $connect_type = null) {} + +/** + * Closes a PostgreSQL connection + * @link http://www.php.net/manual/en/function.pg-close.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_close ($connection = null) {} + +/** + * Get connection status + * @link http://www.php.net/manual/en/function.pg-connection-status.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return int PGSQL_CONNECTION_OK or + * PGSQL_CONNECTION_BAD. + * + * @jms-builtin + */ +function pg_connection_status ($connection) {} + +/** + * Get connection is busy or not + * @link http://www.php.net/manual/en/function.pg-connection-busy.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return bool true if the connection is busy, false otherwise. + * + * @jms-builtin + */ +function pg_connection_busy ($connection) {} + +/** + * Reset connection (reconnect) + * @link http://www.php.net/manual/en/function.pg-connection-reset.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_connection_reset ($connection) {} + +/** + * Returns the host name associated with the connection + * @link http://www.php.net/manual/en/function.pg-host.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the name of the host the + * connection is to, or false on error. + * + * @jms-builtin + */ +function pg_host ($connection = null) {} + +/** + * Get the database name + * @link http://www.php.net/manual/en/function.pg-dbname.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the name of the database the + * connection is to, or false on error. + * + * @jms-builtin + */ +function pg_dbname ($connection = null) {} + +/** + * Return the port number associated with the connection + * @link http://www.php.net/manual/en/function.pg-port.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return int An int containing the port number of the database + * server the connection is to, + * or false on error. + * + * @jms-builtin + */ +function pg_port ($connection = null) {} + +/** + * Return the TTY name associated with the connection + * @link http://www.php.net/manual/en/function.pg-tty.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the debug TTY of + * the connection, or false on error. + * + * @jms-builtin + */ +function pg_tty ($connection = null) {} + +/** + * Get the options associated with the connection + * @link http://www.php.net/manual/en/function.pg-options.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the connection + * options, or false on error. + * + * @jms-builtin + */ +function pg_options ($connection = null) {} + +/** + * Returns an array with client, protocol and server version (when available) + * @link http://www.php.net/manual/en/function.pg-version.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return array an array with client, protocol + * and server keys and values (if available). Returns + * false on error or invalid connection. + * + * @jms-builtin + */ +function pg_version ($connection = null) {} + +/** + * Ping database connection + * @link http://www.php.net/manual/en/function.pg-ping.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_ping ($connection = null) {} + +/** + * Looks up a current parameter setting of the server. + * @link http://www.php.net/manual/en/function.pg-parameter-status.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param param_name string

+ * Possible param_name values include server_version, + * server_encoding, client_encoding, + * is_superuser, session_authorization, + * DateStyle, TimeZone, and + * integer_datetimes. + *

+ * @return string A string containing the value of the parameter, false on failure or invalid + * param_name. + * + * @jms-builtin + */ +function pg_parameter_status ($connection = null, $param_name) {} + +/** + * Returns the current in-transaction status of the server. + * @link http://www.php.net/manual/en/function.pg-transaction-status.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return int The status can be PGSQL_TRANSACTION_IDLE (currently idle), + * PGSQL_TRANSACTION_ACTIVE (a command is in progress), + * PGSQL_TRANSACTION_INTRANS (idle, in a valid transaction block), + * or PGSQL_TRANSACTION_INERROR (idle, in a failed transaction block). + * PGSQL_TRANSACTION_UNKNOWN is reported if the connection is bad. + * PGSQL_TRANSACTION_ACTIVE is reported only when a query + * has been sent to the server and not yet completed. + * + * @jms-builtin + */ +function pg_transaction_status ($connection) {} + +/** + * Execute a query + * @link http://www.php.net/manual/en/function.pg-query.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param query string

+ * The SQL statement or statements to be executed. When multiple statements are passed to the function, + * they are automatically executed as one transaction, unless there are explicit BEGIN/COMMIT commands + * included in the query string. However, using multiple transactions in one function call is not recommended. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return resource A query result resource on success&return.falseforfailure;. + * + * @jms-builtin + */ +function pg_query ($connection = null, $query) {} + +/** + * Submits a command to the server and waits for the result, with the ability to pass parameters separately from the SQL command text. + * @link http://www.php.net/manual/en/function.pg-query-params.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param query string

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @param params array

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ * @return resource A query result resource on success&return.falseforfailure;. + * + * @jms-builtin + */ +function pg_query_params ($connection = null, $query, array $params) {} + +/** + * Submits a request to create a prepared statement with the + given parameters, and waits for completion. + * @link http://www.php.net/manual/en/function.pg-prepare.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param stmtname string

+ * The name to give the prepared statement. Must be unique per-connection. If + * "" is specified, then an unnamed statement is created, overwriting any + * previously defined unnamed statement. + *

+ * @param query string

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @return resource A query result resource on success&return.falseforfailure;. + * + * @jms-builtin + */ +function pg_prepare ($connection = null, $stmtname, $query) {} + +/** + * Sends a request to execute a prepared statement with given parameters, and waits for the result. + * @link http://www.php.net/manual/en/function.pg-execute.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param stmtname string

+ * The name of the prepared statement to execute. if + * "" is specified, then the unnamed statement is executed. The name must have + * been previously prepared using pg_prepare, + * pg_send_prepare or a PREPARE SQL + * command. + *

+ * @param params array

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ *

+ * Elements are converted to strings by calling this function. + *

+ * @return resource A query result resource on success&return.falseforfailure;. + * + * @jms-builtin + */ +function pg_execute ($connection = null, $stmtname, array $params) {} + +/** + * Sends asynchronous query + * @link http://www.php.net/manual/en/function.pg-send-query.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param query string

+ * The SQL statement or statements to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return bool Returns true on success or false on failure.

+ *

+ * Use pg_get_result to determine the query result. + * + * @jms-builtin + */ +function pg_send_query ($connection, $query) {} + +/** + * Submits a command and separate parameters to the server without waiting for the result(s). + * @link http://www.php.net/manual/en/function.pg-send-query-params.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param query string

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @param params array

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ * @return bool Returns true on success or false on failure.

+ *

+ * Use pg_get_result to determine the query result. + * + * @jms-builtin + */ +function pg_send_query_params ($connection, $query, array $params) {} + +/** + * Sends a request to create a prepared statement with the given parameters, without waiting for completion. + * @link http://www.php.net/manual/en/function.pg-send-prepare.php + * @param connection resource

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param stmtname string

+ * The name to give the prepared statement. Must be unique per-connection. If + * "" is specified, then an unnamed statement is created, overwriting any + * previously defined unnamed statement. + *

+ * @param query string

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @return bool true on success, false on failure. Use pg_get_result + * to determine the query result. + * + * @jms-builtin + */ +function pg_send_prepare ($connection, $stmtname, $query) {} + +/** + * Sends a request to execute a prepared statement with given parameters, without waiting for the result(s). + * @link http://www.php.net/manual/en/function.pg-send-execute.php + * @param connection resource

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param stmtname string

+ * The name of the prepared statement to execute. if + * "" is specified, then the unnamed statement is executed. The name must have + * been previously prepared using pg_prepare, + * pg_send_prepare or a PREPARE SQL + * command. + *

+ * @param params array

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ * @return bool true on success, false on failure. Use pg_get_result + * to determine the query result. + * + * @jms-builtin + */ +function pg_send_execute ($connection, $stmtname, array $params) {} + +/** + * Cancel an asynchronous query + * @link http://www.php.net/manual/en/function.pg-cancel-query.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_cancel_query ($connection) {} + +/** + * Returns values from a result resource + * @link http://www.php.net/manual/en/function.pg-fetch-result.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @param field mixed

+ * A string representing the name of the field (column) to fetch, otherwise + * an int representing the field number to fetch. Fields are + * numbered from 0 upwards. + *

+ * @return string Boolean is returned as "t" or "f". All + * other types, including arrays are returned as strings formatted + * in the same default PostgreSQL manner that you would see in the + * psql program. Database NULL + * values are returned as &null;. + *

+ *

+ * false is returned if row exceeds the number + * of rows in the set, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_result ($result, $row, $field) {} + +/** + * Get a row as an enumerated array + * @link http://www.php.net/manual/en/function.pg-fetch-row.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int[optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @param result_type int[optional] + * @return array An array, indexed from 0 upwards, with each value + * represented as a string. Database NULL + * values are returned as &null;. + *

+ *

+ * false is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_row ($result, $row = null, $result_type = null) {} + +/** + * Fetch a row as an associative array + * @link http://www.php.net/manual/en/function.pg-fetch-assoc.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int[optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @return array An array indexed associatively (by field name). + * Each value in the array is represented as a + * string. Database NULL + * values are returned as &null;. + *

+ *

+ * false is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_assoc ($result, $row = null) {} + +/** + * Fetch a row as an array + * @link http://www.php.net/manual/en/function.pg-fetch-array.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int[optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @param result_type int[optional]

+ * An optional parameter that controls + * how the returned array is indexed. + * result_type is a constant and can take the + * following values: PGSQL_ASSOC, + * PGSQL_NUM and PGSQL_BOTH. + * Using PGSQL_NUM, pg_fetch_array + * will return an array with numerical indices, using + * PGSQL_ASSOC it will return only associative indices + * while PGSQL_BOTH, the default, will return both + * numerical and associative indices. + *

+ * @return array An array indexed numerically (beginning with 0) or + * associatively (indexed by field name), or both. + * Each value in the array is represented as a + * string. Database NULL + * values are returned as &null;. + *

+ *

+ * false is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_array ($result, $row = null, $result_type = null) {} + +/** + * Fetch a row as an object + * @link http://www.php.net/manual/en/function.pg-fetch-object.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int[optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @param result_type int[optional]

+ * Ignored and deprecated. + *

+ * @return object An object with one attribute for each field + * name in the result. Database NULL + * values are returned as &null;. + *

+ *

+ * false is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_object ($result, $row = null, $result_type = null) {} + +/** + * Fetches all rows from a result as an array + * @link http://www.php.net/manual/en/function.pg-fetch-all.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return array An array with all rows in the result. Each row is an array + * of field values indexed by field name. + *

+ *

+ * false is returned if there are no rows in the result, or on any + * other error. + * + * @jms-builtin + */ +function pg_fetch_all ($result) {} + +/** + * Fetches all rows in a particular result column as an array + * @link http://www.php.net/manual/en/function.pg-fetch-all-columns.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param column int[optional]

+ * Column number, zero-based, to be retrieved from the result resource. Defaults + * to the first column if not specified. + *

+ * @return array An array with all values in the result column. + *

+ *

+ * false is returned if column is larger than the number + * of columns in the result, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_all_columns ($result, $column = null) {} + +/** + * Returns number of affected records (tuples) + * @link http://www.php.net/manual/en/function.pg-affected-rows.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return int The number of rows affected by the query. If no tuple is + * affected, it will return 0. + * + * @jms-builtin + */ +function pg_affected_rows ($result) {} + +/** + * Get asynchronous query result + * @link http://www.php.net/manual/en/function.pg-get-result.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. + *

+ * @return resource The result resource, or false if no more results are available. + * + * @jms-builtin + */ +function pg_get_result ($connection = null) {} + +/** + * Set internal row offset in result resource + * @link http://www.php.net/manual/en/function.pg-result-seek.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param offset int

+ * Row to move the internal offset to in the result resource. + * Rows are numbered starting from zero. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_result_seek ($result, $offset) {} + +/** + * Get status of query result + * @link http://www.php.net/manual/en/function.pg-result-status.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param type int[optional]

+ * Either PGSQL_STATUS_LONG to return the numeric status + * of the result, or PGSQL_STATUS_STRING + * to return the command tag of the result. + * If not specified, PGSQL_STATUS_LONG is the default. + *

+ * @return mixed Possible return values are PGSQL_EMPTY_QUERY, + * PGSQL_COMMAND_OK, PGSQL_TUPLES_OK, PGSQL_COPY_OUT, + * PGSQL_COPY_IN, PGSQL_BAD_RESPONSE, PGSQL_NONFATAL_ERROR and + * PGSQL_FATAL_ERROR if PGSQL_STATUS_LONG is + * specified. Otherwise, a string containing the PostgreSQL command tag is returned. + * + * @jms-builtin + */ +function pg_result_status ($result, $type = null) {} + +/** + * Free result memory + * @link http://www.php.net/manual/en/function.pg-free-result.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_free_result ($result) {} + +/** + * Returns the last row's OID + * @link http://www.php.net/manual/en/function.pg-last-oid.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return string A string containing the OID assigned to the most recently inserted + * row in the specified connection, or false on error or + * no available OID. + * + * @jms-builtin + */ +function pg_last_oid ($result) {} + +/** + * Returns the number of rows in a result + * @link http://www.php.net/manual/en/function.pg-num-rows.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return int The number of rows in the result. On error, -1 is returned. + * + * @jms-builtin + */ +function pg_num_rows ($result) {} + +/** + * Returns the number of fields in a result + * @link http://www.php.net/manual/en/function.pg-num-fields.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return int The number of fields (columns) in the result. On error, -1 is returned. + * + * @jms-builtin + */ +function pg_num_fields ($result) {} + +/** + * Returns the name of a field + * @link http://www.php.net/manual/en/function.pg-field-name.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_number int

+ * Field number, starting from 0. + *

+ * @return string The field name, or false on error. + * + * @jms-builtin + */ +function pg_field_name ($result, $field_number) {} + +/** + * Returns the field number of the named field + * @link http://www.php.net/manual/en/function.pg-field-num.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_name string

+ * The name of the field. + *

+ * @return int The field number (numbered from 0), or -1 on error. + * + * @jms-builtin + */ +function pg_field_num ($result, $field_name) {} + +/** + * Returns the internal storage size of the named field + * @link http://www.php.net/manual/en/function.pg-field-size.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_number int

+ * Field number, starting from 0. + *

+ * @return int The internal field storage size (in bytes). -1 indicates a variable + * length field. false is returned on error. + * + * @jms-builtin + */ +function pg_field_size ($result, $field_number) {} + +/** + * Returns the type name for the corresponding field number + * @link http://www.php.net/manual/en/function.pg-field-type.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_number int

+ * Field number, starting from 0. + *

+ * @return string A string containing the base name of the field's type, or false + * on error. + * + * @jms-builtin + */ +function pg_field_type ($result, $field_number) {} + +/** + * Returns the type ID (OID) for the corresponding field number + * @link http://www.php.net/manual/en/function.pg-field-type-oid.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_number int

+ * Field number, starting from 0. + *

+ * @return int The OID of the field's base type. false is returned on error. + * + * @jms-builtin + */ +function pg_field_type_oid ($result, $field_number) {} + +/** + * Returns the printed length + * @link http://www.php.net/manual/en/function.pg-field-prtlen.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row_number int + * @param field_name_or_number mixed + * @return int The field printed length, or false on error. + * + * @jms-builtin + */ +function pg_field_prtlen ($result, $row_number, $field_name_or_number) {} + +/** + * Test if a field is SQL NULL + * @link http://www.php.net/manual/en/function.pg-field-is-null.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * current row is fetched. + *

+ * @param field mixed

+ * Field number (starting from 0) as an integer or + * the field name as a string. + *

+ * @return int 1 if the field in the given row is SQL NULL, 0 + * if not. false is returned if the row is out of range, or upon any other error. + * + * @jms-builtin + */ +function pg_field_is_null ($result, $row, $field) {} + +/** + * Returns the name or oid of the tables field + * @link http://www.php.net/manual/en/function.pg-field-table.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_number int

+ * Field number, starting from 0. + *

+ * @param oid_only bool[optional]

+ * By default the tables name that field belongs to is returned but + * if oid_only is set to true, then the + * oid will instead be returned. + *

+ * @return mixed On success either the fields table name or oid. Or, false on failure. + * + * @jms-builtin + */ +function pg_field_table ($result, $field_number, $oid_only = null) {} + +/** + * Gets SQL NOTIFY message + * @link http://www.php.net/manual/en/function.pg-get-notify.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param result_type int[optional]

+ * An optional parameter that controls + * how the returned array is indexed. + * result_type is a constant and can take the + * following values: PGSQL_ASSOC, + * PGSQL_NUM and PGSQL_BOTH. + * Using PGSQL_NUM, pg_get_notify + * will return an array with numerical indices, using + * PGSQL_ASSOC it will return only associative indices + * while PGSQL_BOTH, the default, will return both + * numerical and associative indices. + *

+ * @return array An array containing the NOTIFY message name and backend PID. + * Otherwise if no NOTIFY is waiting, then false is returned. + * + * @jms-builtin + */ +function pg_get_notify ($connection, $result_type = null) {} + +/** + * Gets the backend's process ID + * @link http://www.php.net/manual/en/function.pg-get-pid.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return int The backend database process ID. + * + * @jms-builtin + */ +function pg_get_pid ($connection) {} + +/** + * Get error message associated with result + * @link http://www.php.net/manual/en/function.pg-result-error.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return string a string if there is an error associated with the + * result parameter, false otherwise. + * + * @jms-builtin + */ +function pg_result_error ($result) {} + +/** + * Returns an individual field of an error report. + * @link http://www.php.net/manual/en/function.pg-result-error-field.php + * @param result resource

+ * A PostgreSQL query result resource from a previously executed + * statement. + *

+ * @param fieldcode int

+ * Possible fieldcode values are: PGSQL_DIAG_SEVERITY, + * PGSQL_DIAG_SQLSTATE, PGSQL_DIAG_MESSAGE_PRIMARY, + * PGSQL_DIAG_MESSAGE_DETAIL, + * PGSQL_DIAG_MESSAGE_HINT, PGSQL_DIAG_STATEMENT_POSITION, + * PGSQL_DIAG_INTERNAL_POSITION (PostgreSQL 8.0+ only), + * PGSQL_DIAG_INTERNAL_QUERY (PostgreSQL 8.0+ only), + * PGSQL_DIAG_CONTEXT, PGSQL_DIAG_SOURCE_FILE, + * PGSQL_DIAG_SOURCE_LINE or + * PGSQL_DIAG_SOURCE_FUNCTION. + *

+ * @return string A string containing the contents of the error field, &null; if the field does not exist or false + * on failure. + * + * @jms-builtin + */ +function pg_result_error_field ($result, $fieldcode) {} + +/** + * Get the last error message string of a connection + * @link http://www.php.net/manual/en/function.pg-last-error.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the last error message on the + * given connection, or false on error. + * + * @jms-builtin + */ +function pg_last_error ($connection = null) {} + +/** + * Returns the last notice message from PostgreSQL server + * @link http://www.php.net/manual/en/function.pg-last-notice.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return string A string containing the last notice on the + * given connection, or false on error. + * + * @jms-builtin + */ +function pg_last_notice ($connection) {} + +/** + * Send a NULL-terminated string to PostgreSQL backend + * @link http://www.php.net/manual/en/function.pg-put-line.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param data string

+ * A line of text to be sent directly to the PostgreSQL backend. A NULL + * terminator is added automatically. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_put_line ($connection = null, $data) {} + +/** + * Sync with PostgreSQL backend + * @link http://www.php.net/manual/en/function.pg-end-copy.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_end_copy ($connection = null) {} + +/** + * Copy a table to an array + * @link http://www.php.net/manual/en/function.pg-copy-to.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table from which to copy the data into rows. + *

+ * @param delimiter string[optional]

+ * The token that separates values for each field in each element of + * rows. Default is TAB. + *

+ * @param null_as string[optional]

+ * How SQL NULL values are represented in the + * rows. Default is \N ("\\N"). + *

+ * @return array An array with one element for each line of COPY data. + * It returns false on failure. + * + * @jms-builtin + */ +function pg_copy_to ($connection, $table_name, $delimiter = null, $null_as = null) {} + +/** + * Insert records into a table from an array + * @link http://www.php.net/manual/en/function.pg-copy-from.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table into which to copy the rows. + *

+ * @param rows array

+ * An array of data to be copied into table_name. + * Each value in rows becomes a row in table_name. + * Each value in rows should be a delimited string of the values + * to insert into each field. Values should be linefeed terminated. + *

+ * @param delimiter string[optional]

+ * The token that separates values for each field in each element of + * rows. Default is TAB. + *

+ * @param null_as string[optional]

+ * How SQL NULL values are represented in the + * rows. Default is \N ("\\N"). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_copy_from ($connection, $table_name, array $rows, $delimiter = null, $null_as = null) {} + +/** + * Enable tracing a PostgreSQL connection + * @link http://www.php.net/manual/en/function.pg-trace.php + * @param pathname string

+ * An optional file access mode, same as for fopen. + *

+ * @param mode string[optional] + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_trace ($pathname, $mode = null, $connection = null) {} + +/** + * Disable tracing of a PostgreSQL connection + * @link http://www.php.net/manual/en/function.pg-untrace.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Always returns true. + * + * @jms-builtin + */ +function pg_untrace ($connection = null) {} + +/** + * Create a large object + * @link http://www.php.net/manual/en/function.pg-lo-create.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param object_id mixed[optional]

+ * If an object_id is given the function + * will try to create a large object with this id, else a free + * object id is assigned by the server. The parameter + * was added in PHP 5.3 and relies on functionality that first + * appeared in PostgreSQL 8.1. + *

+ * @return int A large object OID or false on error. + * + * @jms-builtin + */ +function pg_lo_create ($connection = null, $object_id = null) {} + +/** + * Delete a large object + * @link http://www.php.net/manual/en/function.pg-lo-unlink.php + * @param connection resource

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param oid int

+ * The OID of the large object in the database. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_lo_unlink ($connection, $oid) {} + +/** + * Open a large object + * @link http://www.php.net/manual/en/function.pg-lo-open.php + * @param connection resource

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param oid int

+ * The OID of the large object in the database. + *

+ * @param mode string

+ * Can be either "r" for read-only, "w" for write only or "rw" for read and + * write. + *

+ * @return resource A large object resource or false on error. + * + * @jms-builtin + */ +function pg_lo_open ($connection, $oid, $mode) {} + +/** + * Close a large object + * @link http://www.php.net/manual/en/function.pg-lo-close.php + * @param large_object resource + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_lo_close ($large_object) {} + +/** + * Read a large object + * @link http://www.php.net/manual/en/function.pg-lo-read.php + * @param large_object resource

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @param len int[optional]

+ * An optional maximum number of bytes to return. + *

+ * @return string A string containing len bytes from the + * large object, or false on error. + * + * @jms-builtin + */ +function pg_lo_read ($large_object, $len = null) {} + +/** + * Write to a large object + * @link http://www.php.net/manual/en/function.pg-lo-write.php + * @param large_object resource

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @param data string

+ * The data to be written to the large object. If len is + * specified and is less than the length of data, only + * len bytes will be written. + *

+ * @param len int[optional]

+ * An optional maximum number of bytes to write. Must be greater than zero + * and no greater than the length of data. Defaults to + * the length of data. + *

+ * @return int The number of bytes written to the large object, or false on error. + * + * @jms-builtin + */ +function pg_lo_write ($large_object, $data, $len = null) {} + +/** + * Reads an entire large object and send straight to browser + * @link http://www.php.net/manual/en/function.pg-lo-read-all.php + * @param large_object resource

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @return int Number of bytes read or false on error. + * + * @jms-builtin + */ +function pg_lo_read_all ($large_object) {} + +/** + * Import a large object from file + * @link http://www.php.net/manual/en/function.pg-lo-import.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param pathname string

+ * The full path and file name of the file on the client + * filesystem from which to read the large object data. + *

+ * @param object_id mixed[optional]

+ * If an object_id is given the function + * will try to create a large object with this id, else a free + * object id is assigned by the server. The parameter + * was added in PHP 5.3 and relies on functionality that first + * appeared in PostgreSQL 8.1. + *

+ * @return int The OID of the newly created large object, or + * false on failure. + * + * @jms-builtin + */ +function pg_lo_import ($connection = null, $pathname, $object_id = null) {} + +/** + * Export a large object to file + * @link http://www.php.net/manual/en/function.pg-lo-export.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param oid int

+ * The OID of the large object in the database. + *

+ * @param pathname string

+ * The full path and file name of the file in which to write the + * large object on the client filesystem. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_lo_export ($connection = null, $oid, $pathname) {} + +/** + * Seeks position within a large object + * @link http://www.php.net/manual/en/function.pg-lo-seek.php + * @param large_object resource

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @param offset int

+ * The number of bytes to seek. + *

+ * @param whence int[optional]

+ * One of the constants PGSQL_SEEK_SET (seek from object start), + * PGSQL_SEEK_CUR (seek from current position) + * or PGSQL_SEEK_END (seek from object end) . + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_lo_seek ($large_object, $offset, $whence = null) {} + +/** + * Returns current seek position a of large object + * @link http://www.php.net/manual/en/function.pg-lo-tell.php + * @param large_object resource

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @return int The current seek offset (in number of bytes) from the beginning of the large + * object. If there is an error, the return value is negative. + * + * @jms-builtin + */ +function pg_lo_tell ($large_object) {} + +/** + * Escape a string for insertion into a text field + * @link http://www.php.net/manual/en/function.pg-escape-string.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param data string

+ * A string containing text to be escaped. + *

+ * @return string A string containing the escaped data. + * + * @jms-builtin + */ +function pg_escape_string ($connection = null, $data) {} + +/** + * Escape a string for insertion into a bytea field + * @link http://www.php.net/manual/en/function.pg-escape-bytea.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param data string

+ * A string containing text or binary data to be inserted into a bytea + * column. + *

+ * @return string A string containing the escaped data. + * + * @jms-builtin + */ +function pg_escape_bytea ($connection = null, $data) {} + +/** + * Unescape binary for bytea type + * @link http://www.php.net/manual/en/function.pg-unescape-bytea.php + * @param data string

+ * A string containing PostgreSQL bytea data to be converted into + * a PHP binary string. + *

+ * @return string A string containing the unescaped data. + * + * @jms-builtin + */ +function pg_unescape_bytea ($data) {} + +/** + * Determines the verbosity of messages returned by pg_last_error + and pg_result_error. + * @link http://www.php.net/manual/en/function.pg-set-error-verbosity.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param verbosity int

+ * The required verbosity: PGSQL_ERRORS_TERSE, + * PGSQL_ERRORS_DEFAULT + * or PGSQL_ERRORS_VERBOSE. + *

+ * @return int The previous verbosity level: PGSQL_ERRORS_TERSE, + * PGSQL_ERRORS_DEFAULT + * or PGSQL_ERRORS_VERBOSE. + * + * @jms-builtin + */ +function pg_set_error_verbosity ($connection = null, $verbosity) {} + +/** + * Gets the client encoding + * @link http://www.php.net/manual/en/function.pg-client-encoding.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string The client encoding, or false on error. + * + * @jms-builtin + */ +function pg_client_encoding ($connection = null) {} + +/** + * Set the client encoding + * @link http://www.php.net/manual/en/function.pg-set-client-encoding.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param encoding string

+ * The required client encoding. One of SQL_ASCII, EUC_JP, + * EUC_CN, EUC_KR, EUC_TW, + * UNICODE, MULE_INTERNAL, LATINX (X=1...9), + * KOI8, WIN, ALT, SJIS, + * BIG5 or WIN1250. + *

+ *

+ * The exact list of available encodings depends on your PostgreSQL version, so check your + * PostgreSQL manual for a more specific list. + *

+ * @return int 0 on success or -1 on error. + * + * @jms-builtin + */ +function pg_set_client_encoding ($connection = null, $encoding) {} + +/** + * Get meta data for table + * @link http://www.php.net/manual/en/function.pg-meta-data.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * The name of the table. + *

+ * @return array An array of the table definition, or false on error. + * + * @jms-builtin + */ +function pg_meta_data ($connection, $table_name) {} + +/** + * Convert associative array values into suitable for SQL statement + * @link http://www.php.net/manual/en/function.pg-convert.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table against which to convert types. + *

+ * @param assoc_array array

+ * Data to be converted. + *

+ * @param options int[optional]

+ * Any number of PGSQL_CONV_IGNORE_DEFAULT, + * PGSQL_CONV_FORCE_NULL or + * PGSQL_CONV_IGNORE_NOT_NULL, combined. + *

+ * @return array An array of converted values, or false on error. + * + * @jms-builtin + */ +function pg_convert ($connection, $table_name, array $assoc_array, $options = null) {} + +/** + * Insert array into table + * @link http://www.php.net/manual/en/function.pg-insert.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table into which to insert rows. The table table_name must at least + * have as many columns as assoc_array has elements. + *

+ * @param assoc_array array

+ * An array whose keys are field names in the table table_name, + * and whose values are the values of those fields that are to be inserted. + *

+ * @param options int[optional]

+ * Any number of PGSQL_CONV_OPTS, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC, + * PGSQL_DML_ASYNC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed Returns true on success or false on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * + * @jms-builtin + */ +function pg_insert ($connection, $table_name, array $assoc_array, $options = null) {} + +/** + * Update table + * @link http://www.php.net/manual/en/function.pg-update.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table into which to update rows. + *

+ * @param data array

+ * An array whose keys are field names in the table table_name, + * and whose values are what matched rows are to be updated to. + *

+ * @param condition array

+ * An array whose keys are field names in the table table_name, + * and whose values are the conditions that a row must meet to be updated. + *

+ * @param options int[optional]

+ * Any number of PGSQL_CONV_OPTS, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed Returns true on success or false on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * + * @jms-builtin + */ +function pg_update ($connection, $table_name, array $data, array $condition, $options = null) {} + +/** + * Deletes records + * @link http://www.php.net/manual/en/function.pg-delete.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table from which to delete rows. + *

+ * @param assoc_array array

+ * An array whose keys are field names in the table table_name, + * and whose values are the values of those fields that are to be deleted. + *

+ * @param options int[optional]

+ * Any number of PGSQL_CONV_FORCE_NULL, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed Returns true on success or false on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * + * @jms-builtin + */ +function pg_delete ($connection, $table_name, array $assoc_array, $options = null) {} + +/** + * Select records + * @link http://www.php.net/manual/en/function.pg-select.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table from which to select rows. + *

+ * @param assoc_array array

+ * An array whose keys are field names in the table table_name, + * and whose values are the conditions that a row must meet to be retrieved. + *

+ * @param options int[optional]

+ * Any number of PGSQL_CONV_FORCE_NULL, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC, + * PGSQL_DML_ASYNC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed Returns true on success or false on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * + * @jms-builtin + */ +function pg_select ($connection, $table_name, array $assoc_array, $options = null) {} + +function pg_exec () {} + +function pg_getlastoid () {} + +function pg_cmdtuples () {} + +function pg_errormessage () {} + +function pg_numrows () {} + +function pg_numfields () {} + +function pg_fieldname () {} + +function pg_fieldsize () {} + +function pg_fieldtype () {} + +function pg_fieldnum () {} + +function pg_fieldprtlen () {} + +function pg_fieldisnull () {} + +function pg_freeresult () {} + +function pg_result () {} + +function pg_loreadall () {} + +function pg_locreate () {} + +function pg_lounlink () {} + +function pg_loopen () {} + +function pg_loclose () {} + +function pg_loread () {} + +function pg_lowrite () {} + +function pg_loimport () {} + +function pg_loexport () {} + +function pg_clientencoding () {} + +function pg_setclientencoding () {} + + +/** + * Passed to pg_connect to force the creation of a new connection, + * rather then re-using an existing identical connection. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONNECT_FORCE_NEW', 2); + +/** + * Passed to pg_fetch_array. Return an associative array of field + * names and values. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ASSOC', 1); + +/** + * Passed to pg_fetch_array. Return a numerically indexed array of field + * numbers and values. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_NUM', 2); + +/** + * Passed to pg_fetch_array. Return an array of field values + * that is both numerically indexed (by field number) and associated (by field name). + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_BOTH', 3); + +/** + * Returned by pg_connection_status indicating that the database + * connection is in an invalid state. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONNECTION_BAD', 1); + +/** + * Returned by pg_connection_status indicating that the database + * connection is in a valid state. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONNECTION_OK', 0); + +/** + * Returned by pg_transaction_status. Connection is + * currently idle, not in a transaction. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_IDLE', 0); + +/** + * Returned by pg_transaction_status. A command + * is in progress on the connection. A query has been sent via the connection + * and not yet completed. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_ACTIVE', 1); + +/** + * Returned by pg_transaction_status. The connection + * is idle, in a transaction block. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_INTRANS', 2); + +/** + * Returned by pg_transaction_status. The connection + * is idle, in a failed transaction block. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_INERROR', 3); + +/** + * Returned by pg_transaction_status. The connection + * is bad. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_UNKNOWN', 4); + +/** + * Passed to pg_set_error_verbosity. + * Specified that returned messages include severity, primary text, + * and position only; this will normally fit on a single line. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ERRORS_TERSE', 0); + +/** + * Passed to pg_set_error_verbosity. + * The default mode produces messages that include the above + * plus any detail, hint, or context fields (these may span + * multiple lines). + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ERRORS_DEFAULT', 1); + +/** + * Passed to pg_set_error_verbosity. + * The verbose mode includes all available fields. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ERRORS_VERBOSE', 2); + +/** + * Passed to pg_lo_seek. Seek operation is to begin + * from the start of the object. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_SEEK_SET', 0); + +/** + * Passed to pg_lo_seek. Seek operation is to begin + * from the current position. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_SEEK_CUR', 1); + +/** + * Passed to pg_lo_seek. Seek operation is to begin + * from the end of the object. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_SEEK_END', 2); + +/** + * Passed to pg_result_status. Indicates that + * numerical result code is desired. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_STATUS_LONG', 1); + +/** + * Passed to pg_result_status. Indicates that + * textual result command tag is desired. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_STATUS_STRING', 2); + +/** + * Returned by pg_result_status. The string sent to the server + * was empty. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_EMPTY_QUERY', 0); + +/** + * Returned by pg_result_status. Successful completion of a + * command returning no data. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_COMMAND_OK', 1); + +/** + * Returned by pg_result_status. Successful completion of a command + * returning data (such as a SELECT or SHOW). + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TUPLES_OK', 2); + +/** + * Returned by pg_result_status. Copy Out (from server) data + * transfer started. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_COPY_OUT', 3); + +/** + * Returned by pg_result_status. Copy In (to server) data + * transfer started. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_COPY_IN', 4); + +/** + * Returned by pg_result_status. The server's response + * was not understood. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_BAD_RESPONSE', 5); + +/** + * Returned by pg_result_status. A nonfatal error + * (a notice or warning) occurred. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_NONFATAL_ERROR', 6); + +/** + * Returned by pg_result_status. A fatal error + * occurred. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_FATAL_ERROR', 7); + +/** + * Passed to pg_result_error_field. + * The severity; the field contents are ERROR, + * FATAL, or PANIC (in an error message), or + * WARNING, NOTICE, DEBUG, + * INFO, or LOG (in a notice message), or a localized + * translation of one of these. Always present. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SEVERITY', 83); + +/** + * Passed to pg_result_error_field. + * The SQLSTATE code for the error. The SQLSTATE code identifies the type of error + * that has occurred; it can be used by front-end applications to perform specific + * operations (such as error handling) in response to a particular database error. + * This field is not localizable, and is always present. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SQLSTATE', 67); + +/** + * Passed to pg_result_error_field. + * The primary human-readable error message (typically one line). Always present. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_MESSAGE_PRIMARY', 77); + +/** + * Passed to pg_result_error_field. + * Detail: an optional secondary error message carrying more detail about the problem. May run to multiple lines. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_MESSAGE_DETAIL', 68); + +/** + * Passed to pg_result_error_field. + * Hint: an optional suggestion what to do about the problem. This is intended to differ from detail in that it + * offers advice (potentially inappropriate) rather than hard facts. May run to multiple lines. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_MESSAGE_HINT', 72); + +/** + * Passed to pg_result_error_field. + * A string containing a decimal integer indicating an error cursor position as an index into the original + * statement string. The first character has index 1, and positions are measured in characters not bytes. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_STATEMENT_POSITION', 80); + +/** + * Passed to pg_result_error_field. + * This is defined the same as the PG_DIAG_STATEMENT_POSITION field, but + * it is used when the cursor position refers to an internally generated + * command rather than the one submitted by the client. The + * PG_DIAG_INTERNAL_QUERY field will always appear when this + * field appears. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_INTERNAL_POSITION', 112); + +/** + * Passed to pg_result_error_field. + * The text of a failed internally-generated command. This could be, for example, a + * SQL query issued by a PL/pgSQL function. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_INTERNAL_QUERY', 113); + +/** + * Passed to pg_result_error_field. + * An indication of the context in which the error occurred. Presently + * this includes a call stack traceback of active procedural language + * functions and internally-generated queries. The trace is one entry + * per line, most recent first. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_CONTEXT', 87); + +/** + * Passed to pg_result_error_field. + * The file name of the PostgreSQL source-code location where the error + * was reported. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SOURCE_FILE', 70); + +/** + * Passed to pg_result_error_field. + * The line number of the PostgreSQL source-code location where the + * error was reported. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SOURCE_LINE', 76); + +/** + * Passed to pg_result_error_field. + * The name of the PostgreSQL source-code function reporting the error. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SOURCE_FUNCTION', 82); + +/** + * Passed to pg_convert. + * Ignore conversion of &null; into SQL NOT NULL columns. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONV_IGNORE_DEFAULT', 2); + +/** + * Passed to pg_convert. + * Use SQL NULL in place of an empty string. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONV_FORCE_NULL', 4); +define ('PGSQL_CONV_IGNORE_NOT_NULL', 8); +define ('PGSQL_DML_NO_CONV', 256); +define ('PGSQL_DML_EXEC', 512); +define ('PGSQL_DML_ASYNC', 1024); +define ('PGSQL_DML_STRING', 2048); + +// End of pgsql v. +?> diff --git a/res/php-5.2-core-api/posix.php b/res/php-5.2-core-api/posix.php new file mode 100644 index 0000000..7eaaa22 --- /dev/null +++ b/res/php-5.2-core-api/posix.php @@ -0,0 +1,798 @@ + + * The process identifier. + *

+ * @param sig int

+ * One of the PCNTL signals constants. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_kill ($pid, $sig) {} + +/** + * Return the current process identifier + * @link http://www.php.net/manual/en/function.posix-getpid.php + * @return int the identifier, as an integer. + * + * @jms-builtin + */ +function posix_getpid () {} + +/** + * Return the parent process identifier + * @link http://www.php.net/manual/en/function.posix-getppid.php + * @return int the identifier, as an integer. + * + * @jms-builtin + */ +function posix_getppid () {} + +/** + * Return the real user ID of the current process + * @link http://www.php.net/manual/en/function.posix-getuid.php + * @return int the user id, as an integer + * + * @jms-builtin + */ +function posix_getuid () {} + +/** + * Set the UID of the current process + * @link http://www.php.net/manual/en/function.posix-setuid.php + * @param uid int

+ * The user id. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_setuid ($uid) {} + +/** + * Return the effective user ID of the current process + * @link http://www.php.net/manual/en/function.posix-geteuid.php + * @return int the user id, as an integer + * + * @jms-builtin + */ +function posix_geteuid () {} + +/** + * Set the effective UID of the current process + * @link http://www.php.net/manual/en/function.posix-seteuid.php + * @param uid int

+ * The user id. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_seteuid ($uid) {} + +/** + * Return the real group ID of the current process + * @link http://www.php.net/manual/en/function.posix-getgid.php + * @return int the real group id, as an integer. + * + * @jms-builtin + */ +function posix_getgid () {} + +/** + * Set the GID of the current process + * @link http://www.php.net/manual/en/function.posix-setgid.php + * @param gid int

+ * The group id. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_setgid ($gid) {} + +/** + * Return the effective group ID of the current process + * @link http://www.php.net/manual/en/function.posix-getegid.php + * @return int an integer of the effective group ID. + * + * @jms-builtin + */ +function posix_getegid () {} + +/** + * Set the effective GID of the current process + * @link http://www.php.net/manual/en/function.posix-setegid.php + * @param gid int

+ * The group id. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_setegid ($gid) {} + +/** + * Return the group set of the current process + * @link http://www.php.net/manual/en/function.posix-getgroups.php + * @return array an array of integers containing the numeric group ids of the group + * set of the current process. + * + * @jms-builtin + */ +function posix_getgroups () {} + +/** + * Return login name + * @link http://www.php.net/manual/en/function.posix-getlogin.php + * @return string the login name of the user, as a string. + * + * @jms-builtin + */ +function posix_getlogin () {} + +/** + * Return the current process group identifier + * @link http://www.php.net/manual/en/function.posix-getpgrp.php + * @return int the identifier, as an integer. + * + * @jms-builtin + */ +function posix_getpgrp () {} + +/** + * Make the current process a session leader + * @link http://www.php.net/manual/en/function.posix-setsid.php + * @return int the session id, or -1 on errors. + * + * @jms-builtin + */ +function posix_setsid () {} + +/** + * Set process group id for job control + * @link http://www.php.net/manual/en/function.posix-setpgid.php + * @param pid int

+ * The process id. + *

+ * @param pgid int

+ * The process group id. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_setpgid ($pid, $pgid) {} + +/** + * Get process group id for job control + * @link http://www.php.net/manual/en/function.posix-getpgid.php + * @param pid int

+ * The process id. + *

+ * @return int the identifier, as an integer. + * + * @jms-builtin + */ +function posix_getpgid ($pid) {} + +/** + * Get the current sid of the process + * @link http://www.php.net/manual/en/function.posix-getsid.php + * @param pid int

+ * The process identifier. If set to 0, the current process is + * assumed. If an invalid pid is + * specified, then false is returned and an error is set which + * can be checked with posix_get_last_error. + *

+ * @return int the identifier, as an integer. + * + * @jms-builtin + */ +function posix_getsid ($pid) {} + +/** + * Get system name + * @link http://www.php.net/manual/en/function.posix-uname.php + * @return array a hash of strings with information about the + * system. The indices of the hash are + * sysname - operating system name (e.g. Linux) + * nodename - system name (e.g. valiant) + * release - operating system release (e.g. 2.2.10) + * version - operating system version (e.g. #4 Tue Jul 20 + * 17:01:36 MEST 1999) + * machine - system architecture (e.g. i586) + * domainname - DNS domainname (e.g. example.com) + *

+ *

+ * domainname is a GNU extension and not part of POSIX.1, so this + * field is only available on GNU systems or when using the GNU + * libc. + * + * @jms-builtin + */ +function posix_uname () {} + +/** + * Get process times + * @link http://www.php.net/manual/en/function.posix-times.php + * @return array a hash of strings with information about the current + * process CPU usage. The indices of the hash are: + * ticks - the number of clock ticks that have elapsed since + * reboot. + * utime - user time used by the current process. + * stime - system time used by the current process. + * cutime - user time used by current process and children. + * cstime - system time used by current process and children. + * + * @jms-builtin + */ +function posix_times () {} + +/** + * Get path name of controlling terminal + * @link http://www.php.net/manual/en/function.posix-ctermid.php + * @return string Upon successful completion, returns string of the pathname to + * the current controlling terminal. Otherwise false is returned and errno + * is set, which can be checked with posix_get_last_error. + * + * @jms-builtin + */ +function posix_ctermid () {} + +/** + * Determine terminal device name + * @link http://www.php.net/manual/en/function.posix-ttyname.php + * @param fd int

+ * The file descriptor. + *

+ * @return string On success, returns a string of the absolute path of the + * fd. On failure, returns false + * + * @jms-builtin + */ +function posix_ttyname ($fd) {} + +/** + * Determine if a file descriptor is an interactive terminal + * @link http://www.php.net/manual/en/function.posix-isatty.php + * @param fd int

+ * The file descriptor. + *

+ * @return bool true if fd is an open descriptor connected + * to a terminal and false otherwise. + * + * @jms-builtin + */ +function posix_isatty ($fd) {} + +/** + * Pathname of current directory + * @link http://www.php.net/manual/en/function.posix-getcwd.php + * @return string a string of the absolute pathname on success. + * On error, returns false and sets errno which can be checked with + * posix_get_last_error. + * + * @jms-builtin + */ +function posix_getcwd () {} + +/** + * Create a fifo special file (a named pipe) + * @link http://www.php.net/manual/en/function.posix-mkfifo.php + * @param pathname string

+ * Path to the FIFO file. + *

+ * @param mode int

+ * The second parameter mode has to be given in + * octal notation (e.g. 0644). The permission of the newly created + * FIFO also depends on the setting of the current + * umask. The permissions of the created file are + * (mode & ~umask). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_mkfifo ($pathname, $mode) {} + +/** + * Create a special or ordinary file (POSIX.1) + * @link http://www.php.net/manual/en/function.posix-mknod.php + * @param pathname string

+ * The file to create + *

+ * @param mode int

+ * This parameter is constructed by a bitwise OR between file type (one of + * the following constants: POSIX_S_IFREG, + * POSIX_S_IFCHR, POSIX_S_IFBLK, + * POSIX_S_IFIFO or + * POSIX_S_IFSOCK) and permissions. + *

+ * @param major int[optional]

+ * The major device kernel identifier (required to pass when using + * S_IFCHR or S_IFBLK). + *

+ * @param minor int[optional]

+ * The minor device kernel identifier. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_mknod ($pathname, $mode, $major = null, $minor = null) {} + +/** + * Determine accessibility of a file + * @link http://www.php.net/manual/en/function.posix-access.php + * @param file string

+ * The name of the file to be tested. + *

+ * @param mode int[optional]

+ * A mask consisting of one or more of POSIX_F_OK, + * POSIX_R_OK, POSIX_W_OK and + * POSIX_X_OK. + *

+ *

+ * POSIX_R_OK, POSIX_W_OK and + * POSIX_X_OK request checking whether the file + * exists and has read, write and execute permissions, respectively. + * POSIX_F_OK just requests checking for the + * existence of the file. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_access ($file, $mode = null) {} + +/** + * Return info about a group by name + * @link http://www.php.net/manual/en/function.posix-getgrnam.php + * @param name string

The name of the group

+ * @return array The array elements returned are: + * + * The group information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the name of the group. This is + * a short, usually less than 16 character "handle" of the + * group, not the real, full name. This should be the same as + * the name parameter used when + * calling the function, and hence redundant. + *
passwd + * The passwd element contains the group's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
gid + * Group ID of the group in numeric form. + *
members + * This consists of an array of + * string's for all the members in the group. + *
+ * + * @jms-builtin + */ +function posix_getgrnam ($name) {} + +/** + * Return info about a group by group id + * @link http://www.php.net/manual/en/function.posix-getgrgid.php + * @param gid int

+ * The group id. + *

+ * @return array The array elements returned are: + * + * The group information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the name of the group. This is + * a short, usually less than 16 character "handle" of the + * group, not the real, full name. + *
passwd + * The passwd element contains the group's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
gid + * Group ID, should be the same as the + * gid parameter used when calling the + * function, and hence redundant. + *
members + * This consists of an array of + * string's for all the members in the group. + *
+ * + * @jms-builtin + */ +function posix_getgrgid ($gid) {} + +/** + * Return info about a user by username + * @link http://www.php.net/manual/en/function.posix-getpwnam.php + * @param username string

+ * An alphanumeric username. + *

+ * @return array On success an array with the following elements is returned, else + * false is returned: + * + * The user information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the username of the user. This is + * a short, usually less than 16 character "handle" of the + * user, not the real, full name. This should be the same as + * the username parameter used when + * calling the function, and hence redundant. + *
passwd + * The passwd element contains the user's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
uid + * User ID of the user in numeric form. + *
gid + * The group ID of the user. Use the function + * posix_getgrgid to resolve the group + * name and a list of its members. + *
gecos + * GECOS is an obsolete term that refers to the finger + * information field on a Honeywell batch processing system. + * The field, however, lives on, and its contents have been + * formalized by POSIX. The field contains a comma separated + * list containing the user's full name, office phone, office + * number, and home phone number. On most systems, only the + * user's full name is available. + *
dir + * This element contains the absolute path to the home + * directory of the user. + *
shell + * The shell element contains the absolute path to the + * executable of the user's default shell. + *
+ * + * @jms-builtin + */ +function posix_getpwnam ($username) {} + +/** + * Return info about a user by user id + * @link http://www.php.net/manual/en/function.posix-getpwuid.php + * @param uid int

+ * The user identifier. + *

+ * @return array an associative array with the following elements: + * + * The user information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the username of the user. This is + * a short, usually less than 16 character "handle" of the + * user, not the real, full name. + *
passwd + * The passwd element contains the user's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
uid + * User ID, should be the same as the + * uid parameter used when calling the + * function, and hence redundant. + *
gid + * The group ID of the user. Use the function + * posix_getgrgid to resolve the group + * name and a list of its members. + *
gecos + * GECOS is an obsolete term that refers to the finger + * information field on a Honeywell batch processing system. + * The field, however, lives on, and its contents have been + * formalized by POSIX. The field contains a comma separated + * list containing the user's full name, office phone, office + * number, and home phone number. On most systems, only the + * user's full name is available. + *
dir + * This element contains the absolute path to the + * home directory of the user. + *
shell + * The shell element contains the absolute path to the + * executable of the user's default shell. + *
+ * + * @jms-builtin + */ +function posix_getpwuid ($uid) {} + +/** + * Return info about system resource limits + * @link http://www.php.net/manual/en/function.posix-getrlimit.php + * @return array an associative array of elements for each + * limit that is defined. Each limit has a soft and a hard limit. + * + * List of possible limits returned + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Limit nameLimit description
core + * The maximum size of the core file. When 0, not core files are + * created. When core files are larger than this size, they will + * be truncated at this size. + *
totalmem + * The maximum size of the memory of the process, in bytes. + *
virtualmem + * The maximum size of the virtual memory for the process, in bytes. + *
data + * The maximum size of the data segment for the process, in bytes. + *
stack + * The maximum size of the process stack, in bytes. + *
rss + * The maximum number of virtual pages resident in RAM + *
maxproc + * The maximum number of processes that can be created for the + * real user ID of the calling process. + *
memlock + * The maximum number of bytes of memory that may be locked into RAM. + *
cpu + * The amount of time the process is allowed to use the CPU. + *
filesize + * The maximum size of the data segment for the process, in bytes. + *
openfiles + * One more than the maximum number of open file descriptors. + *
+ * + * @jms-builtin + */ +function posix_getrlimit () {} + +/** + * Retrieve the error number set by the last posix function that failed + * @link http://www.php.net/manual/en/function.posix-get-last-error.php + * @return int the errno (error number) set by the last posix function that + * failed. If no errors exist, 0 is returned. + * + * @jms-builtin + */ +function posix_get_last_error () {} + +/** + * &Alias; posix_get_last_error + * @link http://www.php.net/manual/en/function.posix-errno.php + * + * @jms-builtin + */ +function posix_errno () {} + +/** + * Retrieve the system error message associated with the given errno + * @link http://www.php.net/manual/en/function.posix-strerror.php + * @param errno int

+ * A POSIX error number, returned by + * posix_get_last_error. If set to 0, then the + * string "Success" is returned. + *

+ * @return string the error message, as a string. + * + * @jms-builtin + */ +function posix_strerror ($errno) {} + +/** + * Calculate the group access list + * @link http://www.php.net/manual/en/function.posix-initgroups.php + * @param name string

+ * The user to calculate the list for. + *

+ * @param base_group_id int

+ * Typically the group number from the password file. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_initgroups ($name, $base_group_id) {} + + +/** + * Check whether the file exists. + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_F_OK', 0); + +/** + * Check whether the file exists and has execute permissions. + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_X_OK', 1); + +/** + * Check whether the file exists and has write permissions. + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_W_OK', 2); + +/** + * Check whether the file exists and has read permissions. + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_R_OK', 4); + +/** + * Normal file + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFREG', 32768); + +/** + * Character special file + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFCHR', 8192); + +/** + * Block special file + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFBLK', 24576); + +/** + * FIFO (named pipe) special file + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFIFO', 4096); + +/** + * Socket + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFSOCK', 49152); + +// End of posix v. +?> diff --git a/res/php-5.2-core-api/session.php b/res/php-5.2-core-api/session.php new file mode 100644 index 0000000..bc4347b --- /dev/null +++ b/res/php-5.2-core-api/session.php @@ -0,0 +1,357 @@ + + * The session name references the session id in cookies and URLs. It + * should contain only alphanumeric characters; it should be short and + * descriptive (i.e. for users with enabled cookie warnings). + * If name is specified, the name of the current + * session is changed to its value. + *

+ *

+ *

+ * The session name can't consist of digits only, at least one letter + * must be present. Otherwise a new session id is generated every time. + *

+ *

+ * @return string the name of the current session. + * + * @jms-builtin + */ +function session_name ($name = null) {} + +/** + * Get and/or set the current session module + * @link http://www.php.net/manual/en/function.session-module-name.php + * @param module string[optional]

+ * If module is specified, that module will be + * used instead. + *

+ * @return string the name of the current session module. + * + * @jms-builtin + */ +function session_module_name ($module = null) {} + +/** + * Get and/or set the current session save path + * @link http://www.php.net/manual/en/function.session-save-path.php + * @param path string[optional]

+ * Session data path. If specified, the path to which data is saved will + * be changed. session_save_path needs to be called + * before session_start for that purpose. + *

+ *

+ *

+ * On some operating systems, you may want to specify a path on a + * filesystem that handles lots of small files efficiently. For example, + * on Linux, reiserfs may provide better performance than ext2fs. + *

+ *

+ * @return string the path of the current directory used for data storage. + * + * @jms-builtin + */ +function session_save_path ($path = null) {} + +/** + * Get and/or set the current session id + * @link http://www.php.net/manual/en/function.session-id.php + * @param id string[optional]

+ * If id is specified, it will replace the current + * session id. session_id needs to be called before + * session_start for that purpose. Depending on the + * session handler, not all characters are allowed within the session id. + * For example, the file session handler only allows characters in the + * range a-z A-Z 0-9 , (comma) and - (minus)! + *

+ * When using session cookies, specifying an id + * for session_id will always send a new cookie + * when session_start is called, regardless if the + * current session id is identical to the one being set. + * @return string session_id returns the session id for the current + * session or the empty string ("") if there is no current + * session (no current session id exists). + * + * @jms-builtin + */ +function session_id ($id = null) {} + +/** + * Update the current session id with a newly generated one + * @link http://www.php.net/manual/en/function.session-regenerate-id.php + * @param delete_old_session bool[optional]

+ * Whether to delete the old associated session file or not. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_regenerate_id ($delete_old_session = null) {} + +/** + * Decodes session data from a string + * @link http://www.php.net/manual/en/function.session-decode.php + * @param data string

+ * The encoded data to be stored. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_decode ($data) {} + +/** + * Register one or more global variables with the current session + * @link http://www.php.net/manual/en/function.session-register.php + * @param name mixed

+ * A string holding the name of a variable or an array consisting of + * variable names or other arrays. + *

+ * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_register ($name, $_ = null) {} + +/** + * Unregister a global variable from the current session + * @link http://www.php.net/manual/en/function.session-unregister.php + * @param name string

+ * The variable name. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_unregister ($name) {} + +/** + * Find out whether a global variable is registered in a session + * @link http://www.php.net/manual/en/function.session-is-registered.php + * @param name string

+ * The variable name. + *

+ * @return bool session_is_registered returns true if there is a + * global variable with the name name registered in + * the current session, false otherwise. + * + * @jms-builtin + */ +function session_is_registered ($name) {} + +/** + * Encodes the current session data as a string + * @link http://www.php.net/manual/en/function.session-encode.php + * @return string the contents of the current session encoded. + * + * @jms-builtin + */ +function session_encode () {} + +/** + * Initialize session data + * @link http://www.php.net/manual/en/function.session-start.php + * @return bool This function returns true if a session was successfully started, + * otherwise false. + * + * @jms-builtin + */ +function session_start () {} + +/** + * Destroys all data registered to a session + * @link http://www.php.net/manual/en/function.session-destroy.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_destroy () {} + +/** + * Free all session variables + * @link http://www.php.net/manual/en/function.session-unset.php + * @return void + * + * @jms-builtin + */ +function session_unset () {} + +/** + * Sets user-level session storage functions + * @link http://www.php.net/manual/en/function.session-set-save-handler.php + * @param open callback

+ * Open function, this works like a constructor in classes and is + * executed when the session is being opened. The open function + * expects two parameters, where the first is the save path and + * the second is the session name. + *

+ * @param close callback

+ * Close function, this works like a destructor in classes and is + * executed when the session operation is done. + *

+ * @param read callback

+ * Read function must return string value always to make save handler + * work as expected. Return empty string if there is no data to read. + * Return values from other handlers are converted to boolean expression. + * true for success, false for failure. + *

+ * @param write callback

+ *

+ * The "write" handler is not executed until after the output stream is + * closed. Thus, output from debugging statements in the "write" + * handler will never be seen in the browser. If debugging output is + * necessary, it is suggested that the debug output be written to a + * file instead. + *

+ *

+ * @param destroy callback

+ * The destroy handler, this is executed when a session is destroyed with + * session_destroy and takes the session id as its + * only parameter. + *

+ * @param gc callback

+ * The garbage collector, this is executed when the session garbage collector + * is executed and takes the max session lifetime as its only parameter. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_set_save_handler ($open, $close, $read, $write, $destroy, $gc) {} + +/** + * Get and/or set the current cache limiter + * @link http://www.php.net/manual/en/function.session-cache-limiter.php + * @param cache_limiter string[optional]

+ * If cache_limiter is specified, the name of the + * current cache limiter is changed to the new value. + *

+ * + * Possible values + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueHeaders sent
public + *
private_no_expire + *
private + *
nocache + *
+ * @return string the name of the current cache limiter. + * + * @jms-builtin + */ +function session_cache_limiter ($cache_limiter = null) {} + +/** + * Return current cache expire + * @link http://www.php.net/manual/en/function.session-cache-expire.php + * @param new_cache_expire string[optional]

+ * If new_cache_expire is given, the current cache + * expire is replaced with new_cache_expire. + *

+ *

+ * Setting new_cache_expire is of value only, if + * session.cache_limiter is set to a value + * different from nocache. + *

+ * @return int the current setting of session.cache_expire. + * The value returned should be read in minutes, defaults to 180. + * + * @jms-builtin + */ +function session_cache_expire ($new_cache_expire = null) {} + +/** + * Set the session cookie parameters + * @link http://www.php.net/manual/en/function.session-set-cookie-params.php + * @param lifetime int

+ * Lifetime of the + * session cookie, defined in seconds. + *

+ * @param path string[optional]

+ * Path on the domain where + * the cookie will work. Use a single slash ('/') for all paths on the + * domain. + *

+ * @param domain string[optional]

+ * Cookie domain, for + * example 'www.php.net'. To make cookies visible on all subdomains then + * the domain must be prefixed with a dot like '.php.net'. + *

+ * @param secure bool[optional]

+ * If true cookie will only be sent over + * secure connections. + *

+ * @param httponly bool[optional]

+ * If set to true then PHP will attempt to send the + * httponly + * flag when setting the session cookie. + *

+ * @return void + * + * @jms-builtin + */ +function session_set_cookie_params ($lifetime, $path = null, $domain = null, $secure = null, $httponly = null) {} + +/** + * Get the session cookie parameters + * @link http://www.php.net/manual/en/function.session-get-cookie-params.php + * @return array an array with the current session cookie information, the array + * contains the following items: + * "lifetime" - The + * lifetime of the cookie in seconds. + * "path" - The path where + * information is stored. + * "domain" - The domain + * of the cookie. + * "secure" - The cookie + * should only be sent over secure connections. + * "httponly" - The + * cookie can only be accessed through the HTTP protocol. + * + * @jms-builtin + */ +function session_get_cookie_params () {} + +/** + * Write session data and end session + * @link http://www.php.net/manual/en/function.session-write-close.php + * @return void + * + * @jms-builtin + */ +function session_write_close () {} + +/** + * &Alias; session_write_close + * @link http://www.php.net/manual/en/function.session-commit.php + * + * @jms-builtin + */ +function session_commit () {} + +// End of session v. +?> diff --git a/res/php-5.2-core-api/soap.php b/res/php-5.2-core-api/soap.php new file mode 100644 index 0000000..b945eca --- /dev/null +++ b/res/php-5.2-core-api/soap.php @@ -0,0 +1,468 @@ + + * The name of the SOAP function to call. + *

+ * @param arguments array

+ * An array of the arguments to pass to the function. This can be either + * an ordered or an associative array. + *

+ * @param options array[optional]

+ * An associative array of options to pass to the client. + *

+ *

+ * The location option is the URL of the remote Web service. + *

+ *

+ * The uri option is the target namespace of the SOAP service. + *

+ *

+ * The soapaction option is the action to call. + *

+ * @param input_headers mixed[optional]

+ * An array of headers to be sent along with the SOAP request. + *

+ * @param output_headers array[optional]

+ * If supplied, this array will be filled with the headers from the SOAP response. + *

+ * @return mixed SOAP functions may return one, or multiple values. If only one value is returned + * by the SOAP function, the return value of __soapCall will be + * a simple value (e.g. an integer, a string, etc). If multiple values are + * returned, __soapCall will return + * an associative array of named output parameters. + *

+ *

+ * On error, if the SoapClient object was constructed with the trace + * option set to false, a SoapFault object will be returned. + */ + public function __soapCall ($function_name, array $arguments, array $options = null, $input_headers = null, array &$output_headers = null) {} + + /** + * Returns last SOAP request + * @link http://www.php.net/manual/en/soapclient.getlastrequest.php + * @return string The last SOAP request, as an XML string. + */ + public function __getLastRequest () {} + + /** + * Returns last SOAP response + * @link http://www.php.net/manual/en/soapclient.getlastresponse.php + * @return string The last SOAP response, as an XML string. + */ + public function __getLastResponse () {} + + /** + * Returns the SOAP headers from the last request + * @link http://www.php.net/manual/en/soapclient.getlastrequestheaders.php + * @return string The last SOAP request headers. + */ + public function __getLastRequestHeaders () {} + + /** + * Returns the SOAP headers from the last response + * @link http://www.php.net/manual/en/soapclient.getlastresponseheaders.php + * @return string The last SOAP response headers. + */ + public function __getLastResponseHeaders () {} + + /** + * Returns list of available SOAP functions + * @link http://www.php.net/manual/en/soapclient.getfunctions.php + * @return array The list of SOAP functions. + */ + public function __getFunctions () {} + + /** + * Returns a list of SOAP types + * @link http://www.php.net/manual/en/soapclient.gettypes.php + * @return array An array of SOAP types. + */ + public function __getTypes () {} + + /** + * Performs a SOAP request + * @link http://www.php.net/manual/en/soapclient.dorequest.php + * @param request string

+ * The XML SOAP request. + *

+ * @param location string

+ * The URL to request. + *

+ * @param action string

+ * The SOAP action. + *

+ * @param version int

+ * The SOAP version. + *

+ * @param one_way int[optional]

+ * If one_way is set to 1, this method returns nothing. + * Use this where a response is not expected. + *

+ * @return string The XML SOAP response. + */ + public function __doRequest ($request, $location, $action, $version, $one_way = null) {} + + /** + * The __setCookie purpose + * @link http://www.php.net/manual/en/soapclient.setcookie.php + * @param name string

+ * The name of the cookie. + *

+ * @param value string[optional]

+ * The value of the cookie. If not specified, the cookie will be deleted. + *

+ * @return void + */ + public function __setCookie ($name, $value = null) {} + + /** + * Sets the location of the Web service to use + * @link http://www.php.net/manual/en/soapclient.setlocation.php + * @param new_location string[optional]

+ * The new endpoint URL. + *

+ * @return string The old endpoint URL. + */ + public function __setLocation ($new_location = null) {} + + /** + * Sets SOAP headers for subsequent calls + * @link http://www.php.net/manual/en/soapclient.setsoapheaders.php + * @param soapheaders mixed[optional]

+ * The headers to be set. It could be SoapHeader + * object or array of SoapHeader objects. + * If not specified or set to &null;, the headers will be deleted. + *

+ * @return bool Returns true on success or false on failure. + */ + public function __setSoapHeaders ($soapheaders = null) {} + +} + +/** @jms-builtin */ +class SoapVar { + + /** + * SoapVar constructor + * @link http://www.php.net/manual/en/soapvar.soapvar.php + */ + public function SoapVar () {} + +} + +/** @jms-builtin */ +class SoapServer { + + /** + * SoapServer constructor + * @link http://www.php.net/manual/en/soapserver.soapserver.php + */ + public function SoapServer () {} + + /** + * Sets SoapServer persistence mode + * @link http://www.php.net/manual/en/soapserver.setpersistence.php + * @param mode string

+ * One of the SOAP_PERSISTENCE_XXX constants. + *

+ *

+ * SOAP_PERSISTENCE_REQUEST - persist the object for the duration of a request. + *

+ *

+ * SOAP_PERSISTENCE_SESSION - persist the object for the duration of a session. + *

+ * @return void + */ + public function setPersistence ($mode) {} + + /** + * Sets the class which handles SOAP requests + * @link http://www.php.net/manual/en/soapserver.setclass.php + * @param class_name string

+ * The name of the exported class. + *

+ * @param args string[optional]

+ * These optional parameters will be passed to the default class constructor + * during object creation. + *

+ * @return void + */ + public function setClass ($class_name, $args = null) {} + + /** + * Sets the object which will be used to handle SOAP requests + * @link http://www.php.net/manual/en/soapserver.setobject.php + * @param object string

+ * The object to handle the requests. + *

+ * @return void + */ + public function setObject ($object) {} + + /** + * Adds one or more functions to handle SOAP requests + * @link http://www.php.net/manual/en/soapserver.addfunction.php + * @param functions string

+ * To export one function, pass the function name into this parameter as + * a string. + *

+ *

+ * To export several functions, pass an array of function names. + *

+ *

+ * To export all the functions, pass a special constant SOAP_FUNCTIONS_ALL. + *

+ *

+ * functions must receive all input arguments in the same + * order as defined in the WSDL file (They should not receive any output parameters + * as arguments) and return one or more values. To return several values they must + * return an array with named output parameters. + *

+ * @return void + */ + public function addFunction ($functions) {} + + /** + * Returns list of defined functions + * @link http://www.php.net/manual/en/soapserver.getfunctions.php + * @return array An array of the defined functions. + */ + public function getFunctions () {} + + /** + * Handles a SOAP request + * @link http://www.php.net/manual/en/soapserver.handle.php + * @param soap_request string[optional]

+ * The SOAP request. If this argument is omitted, the request is assumed to be + * in the raw POST data of the HTTP request. + *

+ * @return void + */ + public function handle ($soap_request = null) {} + + /** + * Issue SoapServer fault indicating an error + * @link http://www.php.net/manual/en/soapserver.fault.php + * @param code string

+ * The error code to return + *

+ * @param string string

+ * A brief description of the error + *

+ * @param actor string[optional]

+ * A string identifying the actor that caused the fault. + *

+ * @param details string[optional]

+ * More details of the fault + *

+ * @param name string[optional]

+ * The name of the fault. This can be used to select a name from a WSDL file. + *

+ * @return void + */ + public function fault ($code, $string, $actor = null, $details = null, $name = null) {} + + /** + * Add a SOAP header to the response + * @link http://www.php.net/manual/en/soapserver.addsoapheader.php + * @param object SoapHeader

+ * The header to be returned. + *

+ * @return void + */ + public function addSoapHeader (SoapHeader $object) {} + +} + +/** @jms-builtin */ +class SoapFault extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * SoapFault constructor + * @link http://www.php.net/manual/en/soapfault.soapfault.php + */ + public function SoapFault () {} + + /** + * Obtain a string representation of a SoapFault + * @link http://www.php.net/manual/en/soapfault.tostring.php + * @return string A string describing the SoapFault. + */ + public function __toString () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + */ + public function __construct ($message, $code) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class SoapParam { + + /** + * SoapParam constructor + * @link http://www.php.net/manual/en/soapparam.soapparam.php + */ + public function SoapParam () {} + +} + +/** @jms-builtin */ +class SoapHeader { + + /** + * SoapHeader constructor + * @link http://www.php.net/manual/en/soapheader.soapheader.php + */ + public function SoapHeader () {} + +} + +/** + * Set whether to use the SOAP error handler + * @link http://www.php.net/manual/en/function.use-soap-error-handler.php + * @param handler bool[optional]

+ * Set to true to send error details to clients. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function use_soap_error_handler ($handler = null) {} + +/** + * Checks if a SOAP call has failed + * @link http://www.php.net/manual/en/function.is-soap-fault.php + * @param object mixed

+ * The object to test. + *

+ * @return bool This will return true on error, and false otherwise. + * + * @jms-builtin + */ +function is_soap_fault ($object) {} + +define ('SOAP_1_1', 1); +define ('SOAP_1_2', 2); +define ('SOAP_PERSISTENCE_SESSION', 1); +define ('SOAP_PERSISTENCE_REQUEST', 2); +define ('SOAP_FUNCTIONS_ALL', 999); +define ('SOAP_ENCODED', 1); +define ('SOAP_LITERAL', 2); +define ('SOAP_RPC', 1); +define ('SOAP_DOCUMENT', 2); +define ('SOAP_ACTOR_NEXT', 1); +define ('SOAP_ACTOR_NONE', 2); +define ('SOAP_ACTOR_UNLIMATERECEIVER', 3); +define ('SOAP_COMPRESSION_ACCEPT', 32); +define ('SOAP_COMPRESSION_GZIP', 0); +define ('SOAP_COMPRESSION_DEFLATE', 16); +define ('SOAP_AUTHENTICATION_BASIC', 0); +define ('SOAP_AUTHENTICATION_DIGEST', 1); +define ('UNKNOWN_TYPE', 999998); +define ('XSD_STRING', 101); +define ('XSD_BOOLEAN', 102); +define ('XSD_DECIMAL', 103); +define ('XSD_FLOAT', 104); +define ('XSD_DOUBLE', 105); +define ('XSD_DURATION', 106); +define ('XSD_DATETIME', 107); +define ('XSD_TIME', 108); +define ('XSD_DATE', 109); +define ('XSD_GYEARMONTH', 110); +define ('XSD_GYEAR', 111); +define ('XSD_GMONTHDAY', 112); +define ('XSD_GDAY', 113); +define ('XSD_GMONTH', 114); +define ('XSD_HEXBINARY', 115); +define ('XSD_BASE64BINARY', 116); +define ('XSD_ANYURI', 117); +define ('XSD_QNAME', 118); +define ('XSD_NOTATION', 119); +define ('XSD_NORMALIZEDSTRING', 120); +define ('XSD_TOKEN', 121); +define ('XSD_LANGUAGE', 122); +define ('XSD_NMTOKEN', 123); +define ('XSD_NAME', 124); +define ('XSD_NCNAME', 125); +define ('XSD_ID', 126); +define ('XSD_IDREF', 127); +define ('XSD_IDREFS', 128); +define ('XSD_ENTITY', 129); +define ('XSD_ENTITIES', 130); +define ('XSD_INTEGER', 131); +define ('XSD_NONPOSITIVEINTEGER', 132); +define ('XSD_NEGATIVEINTEGER', 133); +define ('XSD_LONG', 134); +define ('XSD_INT', 135); +define ('XSD_SHORT', 136); +define ('XSD_BYTE', 137); +define ('XSD_NONNEGATIVEINTEGER', 138); +define ('XSD_UNSIGNEDLONG', 139); +define ('XSD_UNSIGNEDINT', 140); +define ('XSD_UNSIGNEDSHORT', 141); +define ('XSD_UNSIGNEDBYTE', 142); +define ('XSD_POSITIVEINTEGER', 143); +define ('XSD_NMTOKENS', 144); +define ('XSD_ANYTYPE', 145); +define ('XSD_ANYXML', 147); +define ('APACHE_MAP', 200); +define ('SOAP_ENC_OBJECT', 301); +define ('SOAP_ENC_ARRAY', 300); +define ('XSD_1999_TIMEINSTANT', 401); +define ('XSD_NAMESPACE', "http://www.w3.org/2001/XMLSchema"); +define ('XSD_1999_NAMESPACE', "http://www.w3.org/1999/XMLSchema"); +define ('SOAP_SINGLE_ELEMENT_ARRAYS', 1); +define ('SOAP_WAIT_ONE_WAY_CALLS', 2); +define ('SOAP_USE_XSI_ARRAY_TYPE', 4); +define ('WSDL_CACHE_NONE', 0); +define ('WSDL_CACHE_DISK', 1); +define ('WSDL_CACHE_MEMORY', 2); +define ('WSDL_CACHE_BOTH', 3); + +// End of soap v. +?> diff --git a/res/php-5.2-core-api/sockets.php b/res/php-5.2-core-api/sockets.php new file mode 100644 index 0000000..ecb53b6 --- /dev/null +++ b/res/php-5.2-core-api/sockets.php @@ -0,0 +1,1762 @@ + + * The sockets listed in the read array will be + * watched to see if characters become available for reading (more + * precisely, to see if a read will not block - in particular, a socket + * resource is also ready on end-of-file, in which case a + * socket_read will return a zero length string). + *

+ * @param write array

+ * The sockets listed in the write array will be + * watched to see if a write will not block. + *

+ * @param except array

+ * The sockets listed in the except array will be + * watched for exceptions. + *

+ * @param tv_sec int

+ * The tv_sec and tv_usec + * together form the timeout parameter. The + * timeout is an upper bound on the amount of time + * elapsed before socket_select return. + * tv_sec may be zero , causing + * socket_select to return immediately. This is useful + * for polling. If tv_sec is &null; (no timeout), + * socket_select can block indefinitely. + *

+ * @param tv_usec int[optional]

+ *

+ * @return int On success socket_select returns the number of + * socket resources contained in the modified arrays, which may be zero if + * the timeout expires before anything interesting happens. On error false + * is returned. The error code can be retrieved with + * socket_last_error. + *

+ *

+ * Be sure to use the === operator when checking for an + * error. Since the socket_select may return 0 the + * comparison with == would evaluate to true: + * Understanding socket_select's result + * ]]> + * + * @jms-builtin + */ +function socket_select (array &$read, array &$write, array &$except, $tv_sec, $tv_usec = null) {} + +/** + * Create a socket (endpoint for communication) + * @link http://www.php.net/manual/en/function.socket-create.php + * @param domain int

+ * The domain parameter specifies the protocol + * family to be used by the socket. + *

+ * + * Available address/protocol families + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
DomainDescription
AF_INET + * IPv4 Internet based protocols. TCP and UDP are common protocols of + * this protocol family. + *
AF_INET6 + * IPv6 Internet based protocols. TCP and UDP are common protocols of + * this protocol family. + *
AF_UNIX + * Local communication protocol family. High efficiency and low + * overhead make it a great form of IPC (Interprocess Communication). + *
+ * @param type int

+ * The type parameter selects the type of communication + * to be used by the socket. + *

+ * + * Available socket types + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeDescription
SOCK_STREAM + * Provides sequenced, reliable, full-duplex, connection-based byte streams. + * An out-of-band data transmission mechanism may be supported. + * The TCP protocol is based on this socket type. + *
SOCK_DGRAM + * Supports datagrams (connectionless, unreliable messages of a fixed maximum length). + * The UDP protocol is based on this socket type. + *
SOCK_SEQPACKET + * Provides a sequenced, reliable, two-way connection-based data transmission path for + * datagrams of fixed maximum length; a consumer is required to read an + * entire packet with each read call. + *
SOCK_RAW + * Provides raw network protocol access. This special type of socket + * can be used to manually construct any type of protocol. A common use + * for this socket type is to perform ICMP requests (like ping). + *
SOCK_RDM + * Provides a reliable datagram layer that does not guarantee ordering. + * This is most likely not implemented on your operating system. + *
+ * @param protocol int

+ * The protocol parameter sets the specific + * protocol within the specified domain to be used + * when communicating on the returned socket. The proper value can be + * retrieved by name by using getprotobyname. If + * the desired protocol is TCP, or UDP the corresponding constants + * SOL_TCP, and SOL_UDP + * can also be used. + *

+ * + * Common protocols + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
icmp + * The Internet Control Message Protocol is used primarily by gateways + * and hosts to report errors in datagram communication. The "ping" + * command (present in most modern operating systems) is an example + * application of ICMP. + *
udp + * The User Datagram Protocol is a connectionless, unreliable, + * protocol with fixed record lengths. Due to these aspects, UDP + * requires a minimum amount of protocol overhead. + *
tcp + * The Transmission Control Protocol is a reliable, connection based, + * stream oriented, full duplex protocol. TCP guarantees that all data packets + * will be received in the order in which they were sent. If any packet is somehow + * lost during communication, TCP will automatically retransmit the packet until + * the destination host acknowledges that packet. For reliability and performance + * reasons, the TCP implementation itself decides the appropriate octet boundaries + * of the underlying datagram communication layer. Therefore, TCP applications must + * allow for the possibility of partial record transmission. + *
+ * @return resource socket_create returns a socket resource on success, + * or false on error. The actual error code can be retrieved by calling + * socket_last_error. This error code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * + * @jms-builtin + */ +function socket_create ($domain, $type, $protocol) {} + +/** + * Opens a socket on port to accept connections + * @link http://www.php.net/manual/en/function.socket-create-listen.php + * @param port int

+ * The port on which to listen on all interfaces. + *

+ * @param backlog int[optional]

+ * The backlog parameter defines the maximum length + * the queue of pending connections may grow to. + * SOMAXCONN may be passed as + * backlog parameter, see + * socket_listen for more information. + *

+ * @return resource socket_create_listen returns a new socket resource + * on success or false on error. The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * + * @jms-builtin + */ +function socket_create_listen ($port, $backlog = null) {} + +/** + * Creates a pair of indistinguishable sockets and stores them in an array + * @link http://www.php.net/manual/en/function.socket-create-pair.php + * @param domain int

+ * The domain parameter specifies the protocol + * family to be used by the socket. See socket_create + * for the full list. + *

+ * @param type int

+ * The type parameter selects the type of communication + * to be used by the socket. See socket_create for the + * full list. + *

+ * @param protocol int

+ * The protocol parameter sets the specific + * protocol within the specified domain to be used + * when communicating on the returned socket. The proper value can be retrieved by + * name by using getprotobyname. If + * the desired protocol is TCP, or UDP the corresponding constants + * SOL_TCP, and SOL_UDP + * can also be used. + *

+ *

+ * See socket_create for the full list of supported + * protocols. + *

+ * @param fd array

+ * Reference to an array in which the two socket resources will be inserted. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function socket_create_pair ($domain, $type, $protocol, array &$fd) {} + +/** + * Accepts a connection on a socket + * @link http://www.php.net/manual/en/function.socket-accept.php + * @param socket resource

+ * A valid socket resource created with socket_create. + *

+ * @return resource a new socket resource on success, or false on error. The actual + * error code can be retrieved by calling + * socket_last_error. This error code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * + * @jms-builtin + */ +function socket_accept ($socket) {} + +/** + * Sets nonblocking mode for file descriptor fd + * @link http://www.php.net/manual/en/function.socket-set-nonblock.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function socket_set_nonblock ($socket) {} + +/** + * Sets blocking mode on a socket resource + * @link http://www.php.net/manual/en/function.socket-set-block.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function socket_set_block ($socket) {} + +/** + * Listens for a connection on a socket + * @link http://www.php.net/manual/en/function.socket-listen.php + * @param socket resource

+ * A valid socket resource created with socket_create. + *

+ * @param backlog int[optional]

+ * A maximum of backlog incoming connections will be + * queued for processing. If a connection request arrives with the queue + * full the client may receive an error with an indication of + * ECONNREFUSED, or, if the underlying protocol supports + * retransmission, the request may be ignored so that retries may succeed. + *

+ *

+ * The maximum number passed to the backlog + * parameter highly depends on the underlying platform. On Linux, it is + * silently truncated to SOMAXCONN. On win32, if + * passed SOMAXCONN, the underlying service provider + * responsible for the socket will set the backlog to a maximum + * reasonable value. There is no standard provision to + * find out the actual backlog value on this platform. + *

+ * @return bool Returns true on success or false on failure. The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * + * @jms-builtin + */ +function socket_listen ($socket, $backlog = null) {} + +/** + * Closes a socket resource + * @link http://www.php.net/manual/en/function.socket-close.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @return void + * + * @jms-builtin + */ +function socket_close ($socket) {} + +/** + * Write to a socket + * @link http://www.php.net/manual/en/function.socket-write.php + * @param socket resource

+ *

+ * @param buffer string

+ * The buffer to be written. + *

+ * @param length int[optional]

+ * The optional parameter length can specify an + * alternate length of bytes written to the socket. If this length is + * greater then the buffer length, it is silently truncated to the length + * of the buffer. + *

+ * @return int the number of bytes successfully written to the socket&return.falseforfailure;. + * The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + *

+ *

+ * It is perfectly valid for socket_write to + * return zero which means no bytes have been written. Be sure to use the + * === operator to check for false in case of an + * error. + * + * @jms-builtin + */ +function socket_write ($socket, $buffer, $length = null) {} + +/** + * Reads a maximum of length bytes from a socket + * @link http://www.php.net/manual/en/function.socket-read.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param length int

+ * The maximum number of bytes read is specified by the + * length parameter. Otherwise you can use + * \r, \n, + * or \0 to end reading (depending on the type + * parameter, see below). + *

+ * @param type int[optional]

+ * Optional type parameter is a named constant: + * PHP_BINARY_READ (Default) - use the system + * recv() function. Safe for reading binary data. + * @return string socket_read returns the data as a string on success, + * or false on error (including if the remote host has closed the + * connection). The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual representation of + * the error. + *

+ *

+ * socket_read returns a zero length string ("") + * when there is no more data to read. + * + * @jms-builtin + */ +function socket_read ($socket, $length, $type = null) {} + +/** + * Queries the local side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type + * @link http://www.php.net/manual/en/function.socket-getsockname.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param addr string

+ * If the given socket is of type AF_INET + * or AF_INET6, socket_getsockname + * will return the local IP address in appropriate notation (e.g. + * 127.0.0.1 or fe80::1) in the + * address parameter and, if the optional + * port parameter is present, also the associated port. + *

+ *

+ * If the given socket is of type AF_UNIX, + * socket_getsockname will return the Unix filesystem + * path (e.g. /var/run/daemon.sock) in the + * address parameter. + *

+ * @param port int[optional]

+ * If provided, this will hold the associated port. + *

+ * @return bool Returns true on success or false on failure. socket_getsockname may also return + * false if the socket type is not any of AF_INET, + * AF_INET6, or AF_UNIX, in which + * case the last socket error code is not updated. + * + * @jms-builtin + */ +function socket_getsockname ($socket, &$addr, &$port = null) {} + +/** + * Queries the remote side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type + * @link http://www.php.net/manual/en/function.socket-getpeername.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param address string

+ * If the given socket is of type AF_INET or + * AF_INET6, socket_getpeername + * will return the peers (remote) IP address in + * appropriate notation (e.g. 127.0.0.1 or + * fe80::1) in the address + * parameter and, if the optional port parameter is + * present, also the associated port. + *

+ *

+ * If the given socket is of type AF_UNIX, + * socket_getpeername will return the Unix filesystem + * path (e.g. /var/run/daemon.sock) in the + * address parameter. + *

+ * @param port int[optional]

+ * If given, this will hold the port associated to + * address. + *

+ * @return bool Returns true on success or false on failure. socket_getpeername may also return + * false if the socket type is not any of AF_INET, + * AF_INET6, or AF_UNIX, in which + * case the last socket error code is not updated. + * + * @jms-builtin + */ +function socket_getpeername ($socket, &$address, &$port = null) {} + +/** + * Initiates a connection on a socket + * @link http://www.php.net/manual/en/function.socket-connect.php + * @param socket resource

+ *

+ * @param address string

+ * The address parameter is either an IPv4 address + * in dotted-quad notation (e.g. 127.0.0.1) if + * socket is AF_INET, a valid + * IPv6 address (e.g. ::1) if IPv6 support is enabled and + * socket is AF_INET6 + * or the pathname of a Unix domain socket, if the socket family is + * AF_UNIX. + *

+ * @param port int[optional]

+ * The port parameter is only used and is mandatory + * when connecting to an AF_INET or an + * AF_INET6 socket, and designates + * the port on the remote host to which a connection should be made. + *

+ * @return bool Returns true on success or false on failure. The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + *

+ *

+ * If the socket is non-blocking then this function returns false with an + * error Operation now in progress. + * + * @jms-builtin + */ +function socket_connect ($socket, $address, $port = null) {} + +/** + * Return a string describing a socket error + * @link http://www.php.net/manual/en/function.socket-strerror.php + * @param errno int

+ * A valid socket error number, likely produced by + * socket_last_error. + *

+ * @return string the error message associated with the errno + * parameter. + * + * @jms-builtin + */ +function socket_strerror ($errno) {} + +/** + * Binds a name to a socket + * @link http://www.php.net/manual/en/function.socket-bind.php + * @param socket resource

+ * A valid socket resource created with socket_create. + *

+ * @param address string

+ * If the socket is of the AF_INET family, the + * address is an IP in dotted-quad notation + * (e.g. 127.0.0.1). + *

+ *

+ * If the socket is of the AF_UNIX family, the + * address is the path of a + * Unix-domain socket (e.g. /tmp/my.sock). + *

+ * @param port int[optional]

+ * The port parameter is only used when + * connecting to an AF_INET socket, and + * designates the port on the remote host to which a connection + * should be made. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * The error code can be retrieved with socket_last_error. + * This code may be passed to socket_strerror to get a + * textual explanation of the error. + * + * @jms-builtin + */ +function socket_bind ($socket, $address, $port = null) {} + +/** + * Receives data from a connected socket + * @link http://www.php.net/manual/en/function.socket-recv.php + * @param socket resource

+ * The socket must be a socket resource previously + * created by socket_create(). + *

+ * @param buf string

+ * The data received will be fetched to the variable specified with + * buf. If an error occurs, if the + * connection is reset, or if no data is + * available, buf will be set to &null;. + *

+ * @param len int

+ * Up to len bytes will be fetched from remote host. + *

+ * @param flags int

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + *

+ * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
MSG_OOB + * Process out-of-band data. + *
MSG_PEEK + * Receive data from the beginning of the receive queue without + * removing it from the queue. + *
MSG_WAITALL + * Block until at least len are received. + * However, if a signal is caught or the remote host disconnects, the + * function may return less data. + *
MSG_DONTWAIT + * With this flag set, the function returns even if it would normally + * have blocked. + *
+ * @return int socket_recv returns the number of bytes received, + * or false if there was an error. The actual error code can be retrieved by + * calling socket_last_error. This error code may be + * passed to socket_strerror to get a textual explanation + * of the error. + * + * @jms-builtin + */ +function socket_recv ($socket, &$buf, $len, $flags) {} + +/** + * Sends data to a connected socket + * @link http://www.php.net/manual/en/function.socket-send.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param buf string

+ * A buffer containing the data that will be sent to the remote host. + *

+ * @param len int

+ * The number of bytes that will be sent to the remote host from + * buf. + *

+ * @param flags int

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
MSG_OOB + * Send OOB (out-of-band) data. + *
MSG_EOR + * Indicate a record mark. The sent data completes the record. + *
MSG_EOF + * Close the sender side of the socket and include an appropriate + * notification of this at the end of the sent data. The sent data + * completes the transaction. + *
MSG_DONTROUTE + * Bypass routing, use direct interface. + *
+ *

+ * @return int socket_send returns the number of bytes sent, or false on error. + * + * @jms-builtin + */ +function socket_send ($socket, $buf, $len, $flags) {} + +/** + * Receives data from a socket whether or not it is connection-oriented + * @link http://www.php.net/manual/en/function.socket-recvfrom.php + * @param socket resource

+ * The socket must be a socket resource previously + * created by socket_create(). + *

+ * @param buf string

+ * The data received will be fetched to the variable specified with + * buf. + *

+ * @param len int

+ * Up to len bytes will be fetched from remote host. + *

+ * @param flags int

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + *

+ * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
MSG_OOB + * Process out-of-band data. + *
MSG_PEEK + * Receive data from the beginning of the receive queue without + * removing it from the queue. + *
MSG_WAITALL + * Block until at least len are received. + * However, if a signal is caught or the remote host disconnects, the + * function may return less data. + *
MSG_DONTWAIT + * With this flag set, the function returns even if it would normally + * have blocked. + *
+ * @param name string

+ * If the socket is of the type AF_UNIX type, + * name is the path to the file. Else, for + * unconnected sockets, name is the IP address of, + * the remote host, or &null; if the socket is connection-oriented. + *

+ * @param port int[optional]

+ * This argument only applies to AF_INET and + * AF_INET6 sockets, and specifies the remote port + * from which the data is received. If the socket is connection-oriented, + * port will be &null;. + *

+ * @return int socket_recvfrom returns the number of bytes received, + * or false if there was an error. The actual error code can be retrieved by + * calling socket_last_error. This error code may be + * passed to socket_strerror to get a textual explanation + * of the error. + * + * @jms-builtin + */ +function socket_recvfrom ($socket, &$buf, $len, $flags, &$name, &$port = null) {} + +/** + * Sends a message to a socket, whether it is connected or not + * @link http://www.php.net/manual/en/function.socket-sendto.php + * @param socket resource

+ * A valid socket resource created using socket_create. + *

+ * @param buf string

+ * The sent data will be taken from buffer buf. + *

+ * @param len int

+ * len bytes from buf will be + * sent. + *

+ * @param flags int

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
MSG_OOB + * Send OOB (out-of-band) data. + *
MSG_EOR + * Indicate a record mark. The sent data completes the record. + *
MSG_EOF + * Close the sender side of the socket and include an appropriate + * notification of this at the end of the sent data. The sent data + * completes the transaction. + *
MSG_DONTROUTE + * Bypass routing, use direct interface. + *
+ *

+ * @param addr string

+ * IP address of the remote host. + *

+ * @param port int[optional]

+ * port is the remote port number at which the data + * will be sent. + *

+ * @return int socket_sendto returns the number of bytes sent to the + * remote host, or false if an error occurred. + * + * @jms-builtin + */ +function socket_sendto ($socket, $buf, $len, $flags, $addr, $port = null) {} + +/** + * Gets socket options for the socket + * @link http://www.php.net/manual/en/function.socket-get-option.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param level int

+ * The level parameter specifies the protocol + * level at which the option resides. For example, to retrieve options at + * the socket level, a level parameter of + * SOL_SOCKET would be used. Other levels, such as + * TCP, can be used by + * specifying the protocol number of that level. Protocol numbers can be + * found by using the getprotobyname function. + *

+ * @param optname int + * Available Socket Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionDescriptionType
SO_DEBUG + * Reports whether debugging information is being recorded. + * + * int + *
SO_BROADCAST + * Reports whether transmission of broadcast messages is supported. + * + * int + *
SO_REUSEADDR + * Reports whether local addresses can be reused. + * + * int + *
SO_KEEPALIVE + * Reports whether connections are kept active with periodic transmission + * of messages. If the connected socket fails to respond to these messages, + * the connection is broken and processes writing to that socket are notified + * with a SIGPIPE signal. + * + * int + *
SO_LINGER + *

+ * Reports whether the socket lingers on + * socket_close if data is present. By default, + * when the socket is closed, it attempts to send all unsent data. + * In the case of a connection-oriented socket, + * socket_close will wait for its peer to + * acknowledge the data. + *

+ *

+ * If l_onoff is non-zero and + * l_linger is zero, all the + * unsent data will be discarded and RST (reset) is sent to the + * peer in the case of a connection-oriented socket. + *

+ *

+ * On the other hand, if l_onoff is + * non-zero and l_linger is non-zero, + * socket_close will block until all the data + * is sent or the time specified in l_linger + * elapses. If the socket is non-blocking, + * socket_close will fail and return an error. + *

+ *
+ * array. The array will contain two keys: + * l_onoff and + * l_linger. + *
SO_OOBINLINE + * Reports whether the socket leaves out-of-band data inline. + * + * int + *
SO_SNDBUF + * Reports the size of the send buffer. + * + * int + *
SO_RCVBUF + * Reports the size of the receive buffer. + * + * int + *
SO_ERROR + * Reports information about error status and clears it. + * + * int (cannot be set by socket_set_option) + *
SO_TYPE + * Reports the socket type (e.g. + * SOCK_STREAM). + * + * int (cannot be set by socket_set_option) + *
SO_DONTROUTE + * Reports whether outgoing messages bypass the standard routing facilities. + * + * int + *
SO_RCVLOWAT + * Reports the minimum number of bytes to process for socket + * input operations. + * + * int + *
SO_RCVTIMEO + * Reports the timeout value for input operations. + * + * array. The array will contain two keys: + * sec which is the seconds part on the timeout + * value and usec which is the microsecond part + * of the timeout value. + *
SO_SNDTIMEO + * Reports the timeout value specifying the amount of time that an output + * function blocks because flow control prevents data from being sent. + * + * array. The array will contain two keys: + * sec which is the seconds part on the timeout + * value and usec which is the microsecond part + * of the timeout value. + *
SO_SNDLOWAT + * Reports the minimum number of bytes to process for socket output operations. + * + * int + *
TCP_NODELAY + * Reports whether the Nagle TCP algorithm is disabled. + * + * int + *
+ * @return mixed the value of the given option, or false on errors. + * + * @jms-builtin + */ +function socket_get_option ($socket, $level, $optname) {} + +/** + * Sets socket options for the socket + * @link http://www.php.net/manual/en/function.socket-set-option.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param level int

+ * The level parameter specifies the protocol + * level at which the option resides. For example, to retrieve options at + * the socket level, a level parameter of + * SOL_SOCKET would be used. Other levels, such as + * TCP, can be used by specifying the protocol number of that level. + * Protocol numbers can be found by using the + * getprotobyname function. + *

+ * @param optname int

+ * The available socket options are the same as those for the + * socket_get_option function. + *

+ * @param optval mixed

+ * The option value. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function socket_set_option ($socket, $level, $optname, $optval) {} + +/** + * Shuts down a socket for receiving, sending, or both + * @link http://www.php.net/manual/en/function.socket-shutdown.php + * @param socket resource

+ * A valid socket resource created with socket_create. + *

+ * @param how int[optional]

+ * The value of how can be one of the following: + * + * possible values for how + * + * + * + * + * + * + * + * + * + * + * + * + *
0 + * Shutdown socket reading + *
1 + * Shutdown socket writing + *
2 + * Shutdown socket reading and writing + *
+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function socket_shutdown ($socket, $how = null) {} + +/** + * Returns the last error on the socket + * @link http://www.php.net/manual/en/function.socket-last-error.php + * @param socket resource[optional]

+ * A valid socket resource created with socket_create. + *

+ * @return int This function returns a socket error code. + * + * @jms-builtin + */ +function socket_last_error ($socket = null) {} + +/** + * Clears the error on the socket or the last error code + * @link http://www.php.net/manual/en/function.socket-clear-error.php + * @param socket resource[optional]

+ * A valid socket resource created with socket_create. + *

+ * @return void + * + * @jms-builtin + */ +function socket_clear_error ($socket = null) {} + +function socket_getopt () {} + +function socket_setopt () {} + +define ('AF_UNIX', 1); +define ('AF_INET', 2); + +/** + * Only available if compiled with IPv6 support. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('AF_INET6', 10); +define ('SOCK_STREAM', 1); +define ('SOCK_DGRAM', 2); +define ('SOCK_RAW', 3); +define ('SOCK_SEQPACKET', 5); +define ('SOCK_RDM', 4); +define ('MSG_OOB', 1); +define ('MSG_WAITALL', 256); +define ('MSG_DONTWAIT', 64); +define ('MSG_PEEK', 2); +define ('MSG_DONTROUTE', 4); + +/** + * Not available on Windows platforms. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('MSG_EOR', 128); + +/** + * Not available on Windows platforms. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('MSG_EOF', 512); +define ('SO_DEBUG', 1); +define ('SO_REUSEADDR', 2); +define ('SO_KEEPALIVE', 9); +define ('SO_DONTROUTE', 5); +define ('SO_LINGER', 13); +define ('SO_BROADCAST', 6); +define ('SO_OOBINLINE', 10); +define ('SO_SNDBUF', 7); +define ('SO_RCVBUF', 8); +define ('SO_SNDLOWAT', 19); +define ('SO_RCVLOWAT', 18); +define ('SO_SNDTIMEO', 21); +define ('SO_RCVTIMEO', 20); +define ('SO_TYPE', 3); +define ('SO_ERROR', 4); +define ('SOL_SOCKET', 1); +define ('SOMAXCONN', 128); + +/** + * Used to disable Nagle TCP algorithm. + * Added in PHP 5.2.7. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('TCP_NODELAY', 1); +define ('PHP_NORMAL_READ', 1); +define ('PHP_BINARY_READ', 2); + +/** + * Operation not permitted. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPERM', 1); + +/** + * No such file or directory. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOENT', 2); + +/** + * Interrupted system call. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EINTR', 4); + +/** + * I/O error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EIO', 5); + +/** + * No such device or address. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENXIO', 6); + +/** + * Arg list too long. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_E2BIG', 7); + +/** + * Bad file number. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADF', 9); + +/** + * Try again. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EAGAIN', 11); + +/** + * Out of memory. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOMEM', 12); + +/** + * Permission denied. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EACCES', 13); + +/** + * Bad address. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EFAULT', 14); + +/** + * Block device required. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTBLK', 15); + +/** + * Device or resource busy. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBUSY', 16); + +/** + * File exists. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EEXIST', 17); + +/** + * Cross-device link. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EXDEV', 18); + +/** + * No such device. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENODEV', 19); + +/** + * Not a directory. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTDIR', 20); + +/** + * Is a directory. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EISDIR', 21); + +/** + * Invalid argument. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EINVAL', 22); + +/** + * File table overflow. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENFILE', 23); + +/** + * Too many open files. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMFILE', 24); + +/** + * Not a typewriter. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTTY', 25); + +/** + * No space left on device. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSPC', 28); + +/** + * Illegal seek. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESPIPE', 29); + +/** + * Read-only file system. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EROFS', 30); + +/** + * Too many links. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMLINK', 31); + +/** + * Broken pipe. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPIPE', 32); + +/** + * File name too long. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENAMETOOLONG', 36); + +/** + * No record locks available. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOLCK', 37); + +/** + * Function not implemented. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSYS', 38); + +/** + * Directory not empty. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTEMPTY', 39); + +/** + * Too many symbolic links encountered. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ELOOP', 40); + +/** + * Operation would block. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EWOULDBLOCK', 11); + +/** + * No message of desired type. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOMSG', 42); + +/** + * Identifier removed. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EIDRM', 43); + +/** + * Channel number out of range. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECHRNG', 44); + +/** + * Level 2 not synchronized. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL2NSYNC', 45); + +/** + * Level 3 halted. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL3HLT', 46); + +/** + * Level 3 reset. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL3RST', 47); + +/** + * Link number out of range. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ELNRNG', 48); + +/** + * Protocol driver not attached. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EUNATCH', 49); + +/** + * No CSI structure available. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOCSI', 50); + +/** + * Level 2 halted. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL2HLT', 51); + +/** + * Invalid exchange. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADE', 52); + +/** + * Invalid request descriptor. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADR', 53); + +/** + * Exchange full. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EXFULL', 54); + +/** + * No anode. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOANO', 55); + +/** + * Invalid request code. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADRQC', 56); + +/** + * Invalid slot. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADSLT', 57); + +/** + * Device not a stream. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSTR', 60); + +/** + * No data available. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENODATA', 61); + +/** + * Timer expired. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ETIME', 62); + +/** + * Out of streams resources. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSR', 63); + +/** + * Machine is not on the network. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENONET', 64); + +/** + * Object is remote. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EREMOTE', 66); + +/** + * Link has been severed. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOLINK', 67); + +/** + * Advertise error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EADV', 68); + +/** + * Srmount error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESRMNT', 69); + +/** + * Communication error on send. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECOMM', 70); + +/** + * Protocol error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPROTO', 71); + +/** + * Multihop attempted. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMULTIHOP', 72); + +/** + * Not a data message. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADMSG', 74); + +/** + * Name not unique on network. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTUNIQ', 76); + +/** + * File descriptor in bad state. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADFD', 77); + +/** + * Remote address changed. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EREMCHG', 78); + +/** + * Interrupted system call should be restarted. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ERESTART', 85); + +/** + * Streams pipe error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESTRPIPE', 86); + +/** + * Too many users. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EUSERS', 87); + +/** + * Socket operation on non-socket. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTSOCK', 88); + +/** + * Destination address required. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EDESTADDRREQ', 89); + +/** + * Message too long. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMSGSIZE', 90); + +/** + * Protocol wrong type for socket. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPROTOTYPE', 91); +define ('SOCKET_ENOPROTOOPT', 92); + +/** + * Protocol not supported. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPROTONOSUPPORT', 93); + +/** + * Socket type not supported. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESOCKTNOSUPPORT', 94); + +/** + * Operation not supported on transport endpoint. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EOPNOTSUPP', 95); + +/** + * Protocol family not supported. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPFNOSUPPORT', 96); + +/** + * Address family not supported by protocol. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EAFNOSUPPORT', 97); +define ('SOCKET_EADDRINUSE', 98); + +/** + * Cannot assign requested address. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EADDRNOTAVAIL', 99); + +/** + * Network is down. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENETDOWN', 100); + +/** + * Network is unreachable. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENETUNREACH', 101); + +/** + * Network dropped connection because of reset. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENETRESET', 102); + +/** + * Software caused connection abort. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECONNABORTED', 103); + +/** + * Connection reset by peer. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECONNRESET', 104); + +/** + * No buffer space available. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOBUFS', 105); + +/** + * Transport endpoint is already connected. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EISCONN', 106); + +/** + * Transport endpoint is not connected. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTCONN', 107); + +/** + * Cannot send after transport endpoint shutdown. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESHUTDOWN', 108); + +/** + * Too many references: cannot splice. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ETOOMANYREFS', 109); + +/** + * Connection timed out. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ETIMEDOUT', 110); + +/** + * Connection refused. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECONNREFUSED', 111); + +/** + * Host is down. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EHOSTDOWN', 112); + +/** + * No route to host. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EHOSTUNREACH', 113); + +/** + * Operation already in progress. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EALREADY', 114); + +/** + * Operation now in progress. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EINPROGRESS', 115); + +/** + * Is a named type file. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EISNAM', 120); + +/** + * Remote I/O error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EREMOTEIO', 121); + +/** + * Quota exceeded. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EDQUOT', 122); + +/** + * No medium found. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOMEDIUM', 123); + +/** + * Wrong medium type. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMEDIUMTYPE', 124); +define ('SOL_TCP', 6); +define ('SOL_UDP', 17); + +// End of sockets v. +?> diff --git a/res/php-5.2-core-api/standard.php b/res/php-5.2-core-api/standard.php new file mode 100644 index 0000000..be97fe1 --- /dev/null +++ b/res/php-5.2-core-api/standard.php @@ -0,0 +1,12245 @@ + + * The constant name. + *

+ * @return mixed the value of the constant, or &null; if the constant is not + * defined. + * + * @jms-builtin + */ +function constant ($name) {} + +/** + * Convert binary data into hexadecimal representation + * @link http://www.php.net/manual/en/function.bin2hex.php + * @param str string

+ * A character. + *

+ * @return string the hexadecimal representation of the given string. + * + * @jms-builtin + */ +function bin2hex ($str) {} + +/** + * Delay execution + * @link http://www.php.net/manual/en/function.sleep.php + * @param seconds int

+ * Halt time in seconds. + *

+ * @return int zero on success, or false on errors. If the call was interrupted + * by a signal, sleep returns the number of seconds left + * to sleep. + * + * @jms-builtin + */ +function sleep ($seconds) {} + +/** + * Delay execution in microseconds + * @link http://www.php.net/manual/en/function.usleep.php + * @param micro_seconds int

+ * Halt time in micro seconds. A micro second is one millionth of a + * second. + *

+ * @return void + * + * @jms-builtin + */ +function usleep ($micro_seconds) {} + +/** + * Delay for a number of seconds and nanoseconds + * @link http://www.php.net/manual/en/function.time-nanosleep.php + * @param seconds int

+ * Must be a positive integer. + *

+ * @param nanoseconds int

+ * Must be a positive integer less than 1 billion. + *

+ * @return mixed Returns true on success or false on failure. + *

+ *

+ * If the delay was interrupted by a signal, an associative array will be + * returned with the components: + * seconds - number of seconds remaining in + * the delay + * nanoseconds - number of nanoseconds + * remaining in the delay + * + * @jms-builtin + */ +function time_nanosleep ($seconds, $nanoseconds) {} + +/** + * Make the script sleep until the specified time + * @link http://www.php.net/manual/en/function.time-sleep-until.php + * @param timestamp float

+ * The timestamp when the script should wake. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function time_sleep_until ($timestamp) {} + +/** + * Parse a time/date generated with strftime + * @link http://www.php.net/manual/en/function.strptime.php + * @param date string

+ * The string to parse (e.g. returned from strftime) + *

+ * @param format string

+ * The format used in date (e.g. the same as + * used in strftime). + *

+ *

+ * For more information about the format options, read the + * strftime page. + *

+ * @return array an array&return.falseforfailure;. + *

+ *

+ * + * The following parameters are returned in the array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
parametersDescription
"tm_sec"Seconds after the minute (0-61)
"tm_min"Minutes after the hour (0-59)
"tm_hour"Hour since midnight (0-23)
"tm_mday"Day of the month (1-31)
"tm_mon"Months since January (0-11)
"tm_year"Years since 1900
"tm_wday"Days since Sunday (0-6)
"tm_yday"Days since January 1 (0-365)
"unparsed"the date part which was not + * recognized using the specified format
+ * + * @jms-builtin + */ +function strptime ($date, $format) {} + +/** + * Flush the output buffer + * @link http://www.php.net/manual/en/function.flush.php + * @return void + * + * @jms-builtin + */ +function flush () {} + +/** + * Wraps a string to a given number of characters + * @link http://www.php.net/manual/en/function.wordwrap.php + * @param str string

+ * The input string. + *

+ * @param width int[optional]

+ * The column width. + *

+ * @param break string[optional]

+ * The line is broken using the optional + * break parameter. + *

+ * @param cut bool[optional]

+ * If the cut is set to true, the string is + * always wrapped at or before the specified width. So if you have + * a word that is larger than the given width, it is broken apart. + * (See second example). + *

+ * @return string the given string wrapped at the specified column. + * + * @jms-builtin + */ +function wordwrap ($str, $width = null, $break = null, $cut = null) {} + +/** + * Convert special characters to HTML entities + * @link http://www.php.net/manual/en/function.htmlspecialchars.php + * @param string string

+ * The string being converted. + *

+ * @param quote_style int[optional]

+ * The optional second argument, quote_style, tells + * the function what to do with single and double quote characters. + * The default mode, ENT_COMPAT, is the backwards compatible mode + * which only translates the double-quote character and leaves the + * single-quote untranslated. If ENT_QUOTES is set, both single and + * double quotes are translated and if ENT_NOQUOTES is set neither + * single nor double quotes are translated. + *

+ * @param charset string[optional]

+ * Defines character set used in conversion. + * The default character set is ISO-8859-1. + *

+ *

+ * For the purposes of this function, the charsets + * ISO-8859-1, ISO-8859-15, + * UTF-8, cp866, + * cp1251, cp1252, and + * KOI8-R are effectively equivalent, as the + * characters affected by htmlspecialchars + * occupy the same positions in all of these charsets. + *

+ * &reference.strings.charsets; + * @param double_encode bool[optional]

+ * When double_encode is turned off PHP will not + * encode existing html entities, the default is to convert everything. + *

+ * @return string The converted string. + * + * @jms-builtin + */ +function htmlspecialchars ($string, $quote_style = null, $charset = null, $double_encode = null) {} + +/** + * Convert all applicable characters to HTML entities + * @link http://www.php.net/manual/en/function.htmlentities.php + * @param string string

+ * The input string. + *

+ * @param quote_style int[optional]

+ * Like htmlspecialchars, the optional second + * quote_style parameter lets you define what will + * be done with 'single' and "double" quotes. It takes on one of three + * constants with the default being ENT_COMPAT: + * + * Available quote_style constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATWill convert double-quotes and leave single-quotes alone.
ENT_QUOTESWill convert both double and single quotes.
ENT_NOQUOTESWill leave both double and single quotes unconverted.
+ *

+ * @param charset string[optional]

+ * Like htmlspecialchars, it takes an optional + * third argument charset which defines character + * set used in conversion. + * Presently, the ISO-8859-1 character set is used as the default. + *

+ * &reference.strings.charsets; + * @param double_encode bool[optional]

+ * When double_encode is turned off PHP will not + * encode existing html entities. The default is to convert everything. + *

+ * @return string the encoded string. + * + * @jms-builtin + */ +function htmlentities ($string, $quote_style = null, $charset = null, $double_encode = null) {} + +/** + * Convert all HTML entities to their applicable characters + * @link http://www.php.net/manual/en/function.html-entity-decode.php + * @param string string

+ * The input string. + *

+ * @param quote_style int[optional]

+ * The optional second quote_style parameter lets + * you define what will be done with 'single' and "double" quotes. It takes + * on one of three constants with the default being + * ENT_COMPAT: + * + * Available quote_style constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATWill convert double-quotes and leave single-quotes alone.
ENT_QUOTESWill convert both double and single quotes.
ENT_NOQUOTESWill leave both double and single quotes unconverted.
+ *

+ * @param charset string[optional]

+ * The ISO-8859-1 character set is used as default for the optional third + * charset. This defines the character set used in + * conversion. + *

+ * &reference.strings.charsets; + * @return string the decoded string. + * + * @jms-builtin + */ +function html_entity_decode ($string, $quote_style = null, $charset = null) {} + +/** + * Convert special HTML entities back to characters + * @link http://www.php.net/manual/en/function.htmlspecialchars-decode.php + * @param string string

+ * The string to decode + *

+ * @param quote_style int[optional]

+ * The quote style. One of the following constants: + * + * quote_style constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATWill convert double-quotes and leave single-quotes alone + * (default)
ENT_QUOTESWill convert both double and single quotes
ENT_NOQUOTESWill leave both double and single quotes unconverted
+ *

+ * @return string the decoded string. + * + * @jms-builtin + */ +function htmlspecialchars_decode ($string, $quote_style = null) {} + +/** + * Returns the translation table used by htmlspecialchars and htmlentities + * @link http://www.php.net/manual/en/function.get-html-translation-table.php + * @param table int[optional]

+ * There are two new constants (HTML_ENTITIES, + * HTML_SPECIALCHARS) that allow you to specify the + * table you want. + *

+ * @param quote_style int[optional]

+ * Like the htmlspecialchars and + * htmlentities functions you can optionally specify + * the quote_style you are working with. + * See the description + * of these modes in htmlspecialchars. + *

+ * @return array the translation table as an array. + * + * @jms-builtin + */ +function get_html_translation_table ($table = null, $quote_style = null) {} + +/** + * Calculate the sha1 hash of a string + * @link http://www.php.net/manual/en/function.sha1.php + * @param str string

+ * The input string. + *

+ * @param raw_output bool[optional]

+ * If the optional raw_output is set to true, + * then the sha1 digest is instead returned in raw binary format with a + * length of 20, otherwise the returned value is a 40-character + * hexadecimal number. + *

+ * @return string the sha1 hash as a string. + * + * @jms-builtin + */ +function sha1 ($str, $raw_output = null) {} + +/** + * Calculate the sha1 hash of a file + * @link http://www.php.net/manual/en/function.sha1-file.php + * @param filename string

+ * The filename of the file to hash. + *

+ * @param raw_output bool[optional]

+ * When true, returns the digest in raw binary format with a length of + * 20. + *

+ * @return string a string on success, false otherwise. + * + * @jms-builtin + */ +function sha1_file ($filename, $raw_output = null) {} + +/** + * Calculate the md5 hash of a string + * @link http://www.php.net/manual/en/function.md5.php + * @param str string

+ * The string. + *

+ * @param raw_output bool[optional]

+ * If the optional raw_output is set to true, + * then the md5 digest is instead returned in raw binary format with a + * length of 16. + *

+ * @return string the hash as a 32-character hexadecimal number. + * + * @jms-builtin + */ +function md5 ($str, $raw_output = null) {} + +/** + * Calculates the md5 hash of a given file + * @link http://www.php.net/manual/en/function.md5-file.php + * @param filename string

+ * The filename + *

+ * @param raw_output bool[optional]

+ * When true, returns the digest in raw binary format with a length of + * 16. + *

+ * @return string a string on success, false otherwise. + * + * @jms-builtin + */ +function md5_file ($filename, $raw_output = null) {} + +/** + * Calculates the crc32 polynomial of a string + * @link http://www.php.net/manual/en/function.crc32.php + * @param str string

+ * The data. + *

+ * @return int the crc32 checksum of str as an integer. + * + * @jms-builtin + */ +function crc32 ($str) {} + +/** + * Parse a binary IPTC block into single tags. + * @link http://www.php.net/manual/en/function.iptcparse.php + * @param iptcblock string

+ * A binary IPTC block. + *

+ * @return array an array using the tagmarker as an index and the value as the + * value. It returns false on error or if no IPTC data was found. + * + * @jms-builtin + */ +function iptcparse ($iptcblock) {} + +/** + * Embeds binary IPTC data into a JPEG image + * @link http://www.php.net/manual/en/function.iptcembed.php + * @param iptcdata string

+ * The data to be written. + *

+ * @param jpeg_file_name string

+ * Path to the JPEG image. + *

+ * @param spool int[optional]

+ * Spool flag. If the spool flag is over 2 then the JPEG will be + * returned as a string. + *

+ * @return mixed If success and spool flag is lower than 2 then the JPEG will not be + * returned as a string, false on errors. + * + * @jms-builtin + */ +function iptcembed ($iptcdata, $jpeg_file_name, $spool = null) {} + +/** + * Get the size of an image + * @link http://www.php.net/manual/en/function.getimagesize.php + * @param filename string

+ * This parameter specifies the file you wish to retrieve information + * about. It can reference a local file or (configuration permitting) a + * remote file using one of the supported streams. + *

+ * @param imageinfo array[optional]

+ * This optional parameter allows you to extract some extended + * information from the image file. Currently, this will return the + * different JPG APP markers as an associative array. + * Some programs use these APP markers to embed text information in + * images. A very common one is to embed + * IPTC information in the APP13 marker. + * You can use the iptcparse function to parse the + * binary APP13 marker into something readable. + *

+ * @return array an array with 7 elements. + *

+ *

+ * Index 0 and 1 contains respectively the width and the height of the image. + *

+ *

+ * Some formats may contain no image or may contain multiple images. In these + * cases, getimagesize might not be able to properly + * determine the image size. getimagesize will return + * zero for width and height in these cases. + *

+ *

+ * Index 2 is one of the IMAGETYPE_XXX constants indicating + * the type of the image. + *

+ *

+ * Index 3 is a text string with the correct + * height="yyy" width="xxx" string that can be used + * directly in an IMG tag. + *

+ *

+ * mime is the correspondant MIME type of the image. + * This information can be used to deliver images with correct the HTTP + * Content-type header: + * getimagesize and MIME types + * ]]> + *

+ *

+ * channels will be 3 for RGB pictures and 4 for CMYK + * pictures. + *

+ *

+ * bits is the number of bits for each color. + *

+ *

+ * For some image types, the presence of channels and + * bits values can be a bit + * confusing. As an example, GIF always uses 3 channels + * per pixel, but the number of bits per pixel cannot be calculated for an + * animated GIF with a global color table. + *

+ *

+ * On failure, false is returned. + * + * @jms-builtin + */ +function getimagesize ($filename, array &$imageinfo = null) {} + +/** + * Get Mime-Type for image-type returned by getimagesize, + exif_read_data, exif_thumbnail, exif_imagetype + * @link http://www.php.net/manual/en/function.image-type-to-mime-type.php + * @param imagetype int

+ * One of the IMAGETYPE_XXX constants. + *

+ * @return string The returned values are as follows + * + * Returned values Constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
imagetypeReturned value
IMAGETYPE_GIFimage/gif
IMAGETYPE_JPEGimage/jpeg
IMAGETYPE_PNGimage/png
IMAGETYPE_SWFapplication/x-shockwave-flash
IMAGETYPE_PSDimage/psd
IMAGETYPE_BMPimage/bmp
IMAGETYPE_TIFF_II (intel byte order)image/tiff
+ * IMAGETYPE_TIFF_MM (motorola byte order) + * image/tiff
IMAGETYPE_JPCapplication/octet-stream
IMAGETYPE_JP2image/jp2
IMAGETYPE_JPXapplication/octet-stream
IMAGETYPE_JB2application/octet-stream
IMAGETYPE_SWCapplication/x-shockwave-flash
IMAGETYPE_IFFimage/iff
IMAGETYPE_WBMPimage/vnd.wap.wbmp
IMAGETYPE_XBMimage/xbm
IMAGETYPE_ICOimage/vnd.microsoft.icon
+ * + * @jms-builtin + */ +function image_type_to_mime_type ($imagetype) {} + +/** + * Get file extension for image type + * @link http://www.php.net/manual/en/function.image-type-to-extension.php + * @param imagetype int

+ * One of the IMAGETYPE_XXX constant. + *

+ * @param include_dot bool[optional]

+ * Whether to prepend a dot to the extension or not. Default to true. + *

+ * @return string A string with the extension corresponding to the given image type. + * + * @jms-builtin + */ +function image_type_to_extension ($imagetype, $include_dot = null) {} + +/** + * Outputs information about PHP's configuration + * @link http://www.php.net/manual/en/function.phpinfo.php + * @param what int[optional]

+ * The output may be customized by passing one or more of the + * following constants bitwise values summed + * together in the optional what parameter. + * One can also combine the respective constants or bitwise values + * together with the or operator. + *

+ *

+ * + * phpinfo options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Name (constant)ValueDescription
INFO_GENERAL1 + * The configuration line, &php.ini; location, build date, Web + * Server, System and more. + *
INFO_CREDITS2 + * PHP Credits. See also phpcredits. + *
INFO_CONFIGURATION4 + * Current Local and Master values for PHP directives. See + * also ini_get. + *
INFO_MODULES8 + * Loaded modules and their respective settings. See also + * get_loaded_extensions. + *
INFO_ENVIRONMENT16 + * Environment Variable information that's also available in + * $_ENV. + *
INFO_VARIABLES32 + * Shows all + * predefined variables from EGPCS (Environment, GET, + * POST, Cookie, Server). + *
INFO_LICENSE64 + * PHP License information. See also the license FAQ. + *
INFO_ALL-1 + * Shows all of the above. + *
+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function phpinfo ($what = null) {} + +/** + * Gets the current PHP version + * @link http://www.php.net/manual/en/function.phpversion.php + * @param extension string[optional]

+ * An optional extension name. + *

+ * @return string If the optional extension parameter is + * specified, phpversion returns the version of that + * extension, or false if there is no version information associated or + * the extension isn't enabled. + * + * @jms-builtin + */ +function phpversion ($extension = null) {} + +/** + * Prints out the credits for PHP + * @link http://www.php.net/manual/en/function.phpcredits.php + * @param flag int[optional]

+ * To generate a custom credits page, you may want to use the + * flag parameter. + *

+ *

+ * + * Pre-defined phpcredits flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
namedescription
CREDITS_ALL + * All the credits, equivalent to using: CREDITS_DOCS + + * CREDITS_GENERAL + CREDITS_GROUP + + * CREDITS_MODULES + CREDITS_FULLPAGE. + * It generates a complete stand-alone HTML page with the appropriate tags. + *
CREDITS_DOCSThe credits for the documentation team
CREDITS_FULLPAGE + * Usually used in combination with the other flags. Indicates + * that a complete stand-alone HTML page needs to be + * printed including the information indicated by the other + * flags. + *
CREDITS_GENERAL + * General credits: Language design and concept, PHP authors + * and SAPI module. + *
CREDITS_GROUPA list of the core developers
CREDITS_MODULES + * A list of the extension modules for PHP, and their authors + *
CREDITS_SAPI + * A list of the server API modules for PHP, and their authors + *
+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function phpcredits ($flag = null) {} + +/** + * Gets the logo guid + * @link http://www.php.net/manual/en/function.php-logo-guid.php + * @return string PHPE9568F34-D428-11d2-A769-00AA001ACF42. + * + * @jms-builtin + */ +function php_logo_guid () {} + +function php_real_logo_guid () {} + +function php_egg_logo_guid () {} + +/** + * Gets the Zend guid + * @link http://www.php.net/manual/en/function.zend-logo-guid.php + * @return string PHPE9568F35-D428-11d2-A769-00AA001ACF42. + * + * @jms-builtin + */ +function zend_logo_guid () {} + +/** + * Returns the type of interface between web server and PHP + * @link http://www.php.net/manual/en/function.php-sapi-name.php + * @return string the interface type, as a lowercase string. + *

+ *

+ * Although not exhaustive, the possible return values include + * aolserver, apache, + * apache2filter, apache2handler, + * caudium, cgi (until PHP 5.3), + * cgi-fcgi, cli, + * continuity, embed, + * isapi, litespeed, + * milter, nsapi, + * phttpd, pi3web, roxen, + * thttpd, tux, and webjames. + * + * @jms-builtin + */ +function php_sapi_name () {} + +/** + * Returns information about the operating system PHP is running on + * @link http://www.php.net/manual/en/function.php-uname.php + * @param mode string[optional]

+ * mode is a single character that defines what + * information is returned: + * 'a': This is the default. Contains all modes in + * the sequence "s n r v m". + * @return string the description, as a string. + * + * @jms-builtin + */ +function php_uname ($mode = null) {} + +/** + * Return a list of .ini files parsed from the additional ini dir + * @link http://www.php.net/manual/en/function.php-ini-scanned-files.php + * @return string a comma-separated string of .ini files on success. Each comma is + * followed by a newline. If the directive --with-config-file-scan-dir wasn't set, + * false is returned. If it was set and the directory was empty, an + * empty string is returned. If a file is unrecognizable, the file will + * still make it into the returned string but a PHP error will also result. + * This PHP error will be seen both at compile time and while using + * php_ini_scanned_files. + * + * @jms-builtin + */ +function php_ini_scanned_files () {} + +/** + * Retrieve a path to the loaded php.ini file + * @link http://www.php.net/manual/en/function.php-ini-loaded-file.php + * @return string The loaded &php.ini; path, or false if one is not loaded. + * + * @jms-builtin + */ +function php_ini_loaded_file () {} + +/** + * String comparisons using a "natural order" algorithm + * @link http://www.php.net/manual/en/function.strnatcmp.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @return int Similar to other string comparison functions, this one returns < 0 if + * str1 is less than str2; > + * 0 if str1 is greater than + * str2, and 0 if they are equal. + * + * @jms-builtin + */ +function strnatcmp ($str1, $str2) {} + +/** + * Case insensitive string comparisons using a "natural order" algorithm + * @link http://www.php.net/manual/en/function.strnatcasecmp.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @return int Similar to other string comparison functions, this one returns < 0 if + * str1 is less than str2 > + * 0 if str1 is greater than + * str2, and 0 if they are equal. + * + * @jms-builtin + */ +function strnatcasecmp ($str1, $str2) {} + +/** + * Count the number of substring occurrences + * @link http://www.php.net/manual/en/function.substr-count.php + * @param haystack string

+ * The string to search in + *

+ * @param needle string

+ * The substring to search for + *

+ * @param offset int[optional]

+ * The offset where to start counting + *

+ * @param length int[optional]

+ * The maximum length after the specified offset to search for the + * substring. It outputs a warning if the offset plus the length is + * greater than the haystack length. + *

+ * @return int This functions returns an integer. + * + * @jms-builtin + */ +function substr_count ($haystack, $needle, $offset = null, $length = null) {} + +/** + * Finds the length of the first segment of a string consisting + entirely of characters contained within a given mask. + * @link http://www.php.net/manual/en/function.strspn.php + * @param subject string

+ * The string to examine. + *

+ * @param mask string

+ * The list of allowable characters to include in counted segments. + *

+ * @param start int[optional]

+ * The position in subject to + * start searching. + *

+ *

+ * If start is given and is non-negative, + * then strspn will begin + * examining subject at + * the start'th position. For instance, in + * the string 'abcdef', the character at + * position 0 is 'a', the + * character at position 2 is + * 'c', and so forth. + *

+ *

+ * If start is given and is negative, + * then strspn will begin + * examining subject at + * the start'th position from the end + * of subject. + *

+ * @param length int[optional]

+ * The length of the segment from subject + * to examine. + *

+ *

+ * If length is given and is non-negative, + * then subject will be examined + * for length characters after the starting + * position. + *

+ *

+ * If lengthis given and is negative, + * then subject will be examined from the + * starting position up to length + * characters from the end of subject. + *

+ * @return int the length of the initial segment of str1 + * which consists entirely of characters in str2. + * + * @jms-builtin + */ +function strspn ($subject, $mask, $start = null, $length = null) {} + +/** + * Find length of initial segment not matching mask + * @link http://www.php.net/manual/en/function.strcspn.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @param start int[optional]

+ * The start position of the string to examine. + *

+ * @param length int[optional]

+ * The length of the string to examine. + *

+ * @return int the length of the segment as an integer. + * + * @jms-builtin + */ +function strcspn ($str1, $str2, $start = null, $length = null) {} + +/** + * Tokenize string + * @link http://www.php.net/manual/en/function.strtok.php + * @param str string

+ * The string being split up into smaller strings (tokens). + *

+ * @param token string

+ * The delimiter used when splitting up str. + *

+ * @return string A string token. + * + * @jms-builtin + */ +function strtok ($str, $token) {} + +/** + * Make a string uppercase + * @link http://www.php.net/manual/en/function.strtoupper.php + * @param string string

+ * The input string. + *

+ * @return string the uppercased string. + * + * @jms-builtin + */ +function strtoupper ($string) {} + +/** + * Make a string lowercase + * @link http://www.php.net/manual/en/function.strtolower.php + * @param str string

+ * The input string. + *

+ * @return string the lowercased string. + * + * @jms-builtin + */ +function strtolower ($str) {} + +/** + * Find position of first occurrence of a string + * @link http://www.php.net/manual/en/function.strpos.php + * @param haystack string

+ * The string to search in + *

+ * @param needle mixed

+ * If needle is not a string, it is converted + * to an integer and applied as the ordinal value of a character. + *

+ * @param offset int[optional]

+ * The optional offset parameter allows you + * to specify which character in haystack to + * start searching. The position returned is still relative to the + * beginning of haystack. + *

+ * @return int the position as an integer. If needle is + * not found, strpos will return boolean + * false. + * + * @jms-builtin + */ +function strpos ($haystack, $needle, $offset = null) {} + +/** + * Find position of first occurrence of a case-insensitive string + * @link http://www.php.net/manual/en/function.stripos.php + * @param haystack string

+ * The string to search in + *

+ * @param needle string

+ * Note that the needle may be a string of one or + * more characters. + *

+ *

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @param offset int[optional]

+ * The optional offset parameter allows you + * to specify which character in haystack to + * start searching. The position returned is still relative to the + * beginning of haystack. + *

+ * @return int If needle is not found, + * stripos will return boolean false. + * + * @jms-builtin + */ +function stripos ($haystack, $needle, $offset = null) {} + +/** + * Find position of last occurrence of a char in a string + * @link http://www.php.net/manual/en/function.strrpos.php + * @param haystack string

+ * The string to search in. + *

+ * @param needle string

+ * If needle is not a string, it is converted + * to an integer and applied as the ordinal value of a character. + *

+ * @param offset int[optional]

+ * May be specified to begin searching an arbitrary number of characters into + * the string. Negative values will stop searching at an arbitrary point + * prior to the end of the string. + *

+ * @return int the position where the needle exists. Returns false if the needle + * was not found. + * + * @jms-builtin + */ +function strrpos ($haystack, $needle, $offset = null) {} + +/** + * Find position of last occurrence of a case-insensitive string in a string + * @link http://www.php.net/manual/en/function.strripos.php + * @param haystack string

+ * The string to search in + *

+ * @param needle string

+ * Note that the needle may be a string of one or + * more characters. + *

+ * @param offset int[optional]

+ * The offset parameter may be specified to begin + * searching an arbitrary number of characters into the string. + *

+ *

+ * Negative offset values will start the search at + * offset characters from the + * start of the string. + *

+ * @return int the numerical position of the last occurrence of + * needle. Also note that string positions start at 0, + * and not 1. + *

+ *

+ * If needle is not found, false is returned. + * + * @jms-builtin + */ +function strripos ($haystack, $needle, $offset = null) {} + +/** + * Reverse a string + * @link http://www.php.net/manual/en/function.strrev.php + * @param string string

+ * The string to be reversed. + *

+ * @return string the reversed string. + * + * @jms-builtin + */ +function strrev ($string) {} + +/** + * Convert logical Hebrew text to visual text + * @link http://www.php.net/manual/en/function.hebrev.php + * @param hebrew_text string

+ * A Hebrew input string. + *

+ * @param max_chars_per_line int[optional]

+ * This optional parameter indicates maximum number of characters per + * line that will be returned. + *

+ * @return string the visual string. + * + * @jms-builtin + */ +function hebrev ($hebrew_text, $max_chars_per_line = null) {} + +/** + * Convert logical Hebrew text to visual text with newline conversion + * @link http://www.php.net/manual/en/function.hebrevc.php + * @param hebrew_text string

+ * A Hebrew input string. + *

+ * @param max_chars_per_line int[optional]

+ * This optional parameter indicates maximum number of characters per + * line that will be returned. + *

+ * @return string the visual string. + * + * @jms-builtin + */ +function hebrevc ($hebrew_text, $max_chars_per_line = null) {} + +/** + * Inserts HTML line breaks before all newlines in a string + * @link http://www.php.net/manual/en/function.nl2br.php + * @param string string

+ * The input string. + *

+ * @param is_xhtml bool[optional]

+ * Whenever to use XHTML compatible line breaks or not. + *

+ * @return string the altered string. + * + * @jms-builtin + */ +function nl2br ($string, $is_xhtml = null) {} + +/** + * Returns filename component of path + * @link http://www.php.net/manual/en/function.basename.php + * @param path string

+ * A path. + *

+ *

+ * On Windows, both slash (/) and backslash + * (\) are used as directory separator character. In + * other environments, it is the forward slash (/). + *

+ * @param suffix string[optional]

+ * If the filename ends in suffix this will also + * be cut off. + *

+ * @return string the base name of the given path. + * + * @jms-builtin + */ +function basename ($path, $suffix = null) {} + +/** + * Returns directory name component of path + * @link http://www.php.net/manual/en/function.dirname.php + * @param path string

+ * A path. + *

+ *

+ * On Windows, both slash (/) and backslash + * (\) are used as directory separator character. In + * other environments, it is the forward slash (/). + *

+ * @return string the name of the directory. If there are no slashes in + * path, a dot ('.') is returned, + * indicating the current directory. Otherwise, the returned string is + * path with any trailing + * /component removed. + * + * @jms-builtin + */ +function dirname ($path) {} + +/** + * Returns information about a file path + * @link http://www.php.net/manual/en/function.pathinfo.php + * @param path string

+ * The path being checked. + *

+ * @param options int[optional]

+ * You can specify which elements are returned with optional parameter + * options. It composes from + * PATHINFO_DIRNAME, + * PATHINFO_BASENAME, + * PATHINFO_EXTENSION and + * PATHINFO_FILENAME. It + * defaults to return all elements. + *

+ * @return mixed The following associative array elements are returned: + * dirname, basename, + * extension (if any), and filename. + *

+ *

+ * If options is used, this function will return a + * string if not all elements are requested. + * + * @jms-builtin + */ +function pathinfo ($path, $options = null) {} + +/** + * Un-quotes a quoted string + * @link http://www.php.net/manual/en/function.stripslashes.php + * @param str string

+ * The input string. + *

+ * @return string a string with backslashes stripped off. + * (\' becomes ' and so on.) + * Double backslashes (\\) are made into a single + * backslash (\). + * + * @jms-builtin + */ +function stripslashes ($str) {} + +/** + * Un-quote string quoted with addcslashes + * @link http://www.php.net/manual/en/function.stripcslashes.php + * @param str string

+ * The string to be unescaped. + *

+ * @return string the unescaped string. + * + * @jms-builtin + */ +function stripcslashes ($str) {} + +/** + * Find first occurrence of a string + * @link http://www.php.net/manual/en/function.strstr.php + * @param haystack string

+ * The input string. + *

+ * @param needle mixed

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @param before_needle bool[optional]

+ * If true, strstr returns + * the part of the haystack before the first + * occurrence of the needle. + *

+ * @return string the portion of string, or false if needle + * is not found. + * + * @jms-builtin + */ +function strstr ($haystack, $needle, $before_needle = null) {} + +/** + * Case-insensitive strstr + * @link http://www.php.net/manual/en/function.stristr.php + * @param haystack string

+ * The string to search in + *

+ * @param needle mixed

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @param before_needle bool[optional]

+ * If true, stristr + * returns the part of the haystack before the + * first occurrence of the needle. + *

+ * @return string the matched substring. If needle is not + * found, returns false. + * + * @jms-builtin + */ +function stristr ($haystack, $needle, $before_needle = null) {} + +/** + * Find the last occurrence of a character in a string + * @link http://www.php.net/manual/en/function.strrchr.php + * @param haystack string

+ * The string to search in + *

+ * @param needle mixed

+ * If needle contains more than one character, + * only the first is used. This behavior is different from that of + * strstr. + *

+ *

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @return string This function returns the portion of string, or false if + * needle is not found. + * + * @jms-builtin + */ +function strrchr ($haystack, $needle) {} + +/** + * Randomly shuffles a string + * @link http://www.php.net/manual/en/function.str-shuffle.php + * @param str string

+ * The input string. + *

+ * @return string the shuffled string. + * + * @jms-builtin + */ +function str_shuffle ($str) {} + +/** + * Return information about words used in a string + * @link http://www.php.net/manual/en/function.str-word-count.php + * @param string string

+ * The string + *

+ * @param format int[optional]

+ * Specify the return value of this function. The current supported values + * are: + * 0 - returns the number of words found + * @param charlist string[optional]

+ * A list of additional characters which will be considered as 'word' + *

+ * @return mixed an array or an integer, depending on the + * format chosen. + * + * @jms-builtin + */ +function str_word_count ($string, $format = null, $charlist = null) {} + +/** + * Convert a string to an array + * @link http://www.php.net/manual/en/function.str-split.php + * @param string string

+ * The input string. + *

+ * @param split_length int[optional]

+ * Maximum length of the chunk. + *

+ * @return array If the optional split_length parameter is + * specified, the returned array will be broken down into chunks with each + * being split_length in length, otherwise each chunk + * will be one character in length. + *

+ *

+ * false is returned if split_length is less than 1. + * If the split_length length exceeds the length of + * string, the entire string is returned as the first + * (and only) array element. + * + * @jms-builtin + */ +function str_split ($string, $split_length = null) {} + +/** + * Search a string for any of a set of characters + * @link http://www.php.net/manual/en/function.strpbrk.php + * @param haystack string

+ * The string where char_list is looked for. + *

+ * @param char_list string

+ * This parameter is case sensitive. + *

+ * @return string a string starting from the character found, or false if it is + * not found. + * + * @jms-builtin + */ +function strpbrk ($haystack, $char_list) {} + +/** + * Binary safe comparison of two strings from an offset, up to length characters + * @link http://www.php.net/manual/en/function.substr-compare.php + * @param main_str string

+ * The main string being compared. + *

+ * @param str string

+ * The secondary string being compared. + *

+ * @param offset int

+ * The start position for the comparison. If negative, it starts counting + * from the end of the string. + *

+ * @param length int[optional]

+ * The length of the comparison. The default value is the largest of the + * length of the str compared to the length of + * main_str less the + * offset. + *

+ * @param case_insensitivity bool[optional]

+ * If case_insensitivity is true, comparison is + * case insensitive. + *

+ * @return int < 0 if main_str from position + * offset is less than str, > + * 0 if it is greater than str, and 0 if they are equal. + * If offset is equal to or greater than the length of + * main_str or length is set and + * is less than 1, substr_compare prints a warning and returns + * false. + * + * @jms-builtin + */ +function substr_compare ($main_str, $str, $offset, $length = null, $case_insensitivity = null) {} + +/** + * Locale based string comparison + * @link http://www.php.net/manual/en/function.strcoll.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if + * str1 is greater than + * str2, and 0 if they are equal. + * + * @jms-builtin + */ +function strcoll ($str1, $str2) {} + +/** + * Formats a number as a currency string + * @link http://www.php.net/manual/en/function.money-format.php + * @param format string

+ * The format specification consists of the following sequence: + *

a % character

+ * @param number float

+ * The number to be formatted. + *

+ * @return string the formatted string. Characters before and after the formatting + * string will be returned unchanged. + * Non-numeric number causes returning &null; and + * emitting E_WARNING. + * + * @jms-builtin + */ +function money_format ($format, $number) {} + +/** + * Return part of a string + * @link http://www.php.net/manual/en/function.substr.php + * @param string string

+ * The input string. + *

+ * @param start int

+ * If start is non-negative, the returned string + * will start at the start'th position in + * string, counting from zero. For instance, + * in the string 'abcdef', the character at + * position 0 is 'a', the + * character at position 2 is + * 'c', and so forth. + *

+ *

+ * If start is negative, the returned string + * will start at the start'th character + * from the end of string. + *

+ *

+ * If string is less than or equal to + * start characters long, false will be returned. + *

+ *

+ * Using a negative start + * ]]> + *

+ * @param length int[optional]

+ * If length is given and is positive, the string + * returned will contain at most length characters + * beginning from start (depending on the length of + * string). + *

+ *

+ * If length is given and is negative, then that many + * characters will be omitted from the end of string + * (after the start position has been calculated when a + * start is negative). If + * start denotes a position beyond this truncation, + * an empty string will be returned. + *

+ *

+ * If length is given and is 0, + * false or &null; an empty string will be returned. + *

+ * Using a negative length + * ]]> + * @return string the extracted part of string&return.falseforfailure;. + * + * @jms-builtin + */ +function substr ($string, $start, $length = null) {} + +/** + * Replace text within a portion of a string + * @link http://www.php.net/manual/en/function.substr-replace.php + * @param string mixed

+ * The input string. + *

+ * @param replacement string

+ * The replacement string. + *

+ * @param start int

+ * If start is positive, the replacing will + * begin at the start'th offset into + * string. + *

+ *

+ * If start is negative, the replacing will + * begin at the start'th character from the + * end of string. + *

+ * @param length int[optional]

+ * If given and is positive, it represents the length of the portion of + * string which is to be replaced. If it is + * negative, it represents the number of characters from the end of + * string at which to stop replacing. If it + * is not given, then it will default to strlen( + * string ); i.e. end the replacing at the + * end of string. Of course, if + * length is zero then this function will have the + * effect of inserting replacement into + * string at the given + * start offset. + *

+ * @return mixed The result string is returned. If string is an + * array then array is returned. + * + * @jms-builtin + */ +function substr_replace ($string, $replacement, $start, $length = null) {} + +/** + * Quote meta characters + * @link http://www.php.net/manual/en/function.quotemeta.php + * @param str string

+ * The input string. + *

+ * @return string the string with meta characters quoted. + * + * @jms-builtin + */ +function quotemeta ($str) {} + +/** + * Make a string's first character uppercase + * @link http://www.php.net/manual/en/function.ucfirst.php + * @param str string

+ * The input string. + *

+ * @return string the resulting string. + * + * @jms-builtin + */ +function ucfirst ($str) {} + +/** + * Uppercase the first character of each word in a string + * @link http://www.php.net/manual/en/function.ucwords.php + * @param str string

+ * The input string. + *

+ * @return string the modified string. + * + * @jms-builtin + */ +function ucwords ($str) {} + +/** + * Translate certain characters + * @link http://www.php.net/manual/en/function.strtr.php + * @param str string

+ * The string being translated. + *

+ * @param from string

+ * The string being translated to to. + *

+ * @param to string

+ * The string replacing from. + *

+ * @return string This function returns a copy of str, + * translating all occurrences of each character in + * from to the corresponding character in + * to. + * + * @jms-builtin + */ +function strtr ($str, $from, $to) {} + +/** + * Quote string with slashes + * @link http://www.php.net/manual/en/function.addslashes.php + * @param str string

+ * The string to be escaped. + *

+ * @return string the escaped string. + * + * @jms-builtin + */ +function addslashes ($str) {} + +/** + * Quote string with slashes in a C style + * @link http://www.php.net/manual/en/function.addcslashes.php + * @param str string

+ * The string to be escaped. + *

+ * @param charlist string

+ * A list of characters to be escaped. If + * charlist contains characters + * \n, \r etc., they are + * converted in C-like style, while other non-alphanumeric characters + * with ASCII codes lower than 32 and higher than 126 converted to + * octal representation. + *

+ *

+ * When you define a sequence of characters in the charlist argument + * make sure that you know what characters come between the + * characters that you set as the start and end of the range. + * ]]> + * Also, if the first character in a range has a higher ASCII value + * than the second character in the range, no range will be + * constructed. Only the start, end and period characters will be + * escaped. Use the ord function to find the + * ASCII value for a character. + * ]]> + *

+ *

+ * Be careful if you choose to escape characters 0, a, b, f, n, r, + * t and v. They will be converted to \0, \a, \b, \f, \n, \r, \t + * and \v. + * In PHP \0 (NULL), \r (carriage return), \n (newline), \f (form feed), + * \v (vertical tab) and \t (tab) are predefined escape sequences, + * while in C all of these are predefined escape sequences. + *

+ * @return string the escaped string. + * + * @jms-builtin + */ +function addcslashes ($str, $charlist) {} + +/** + * Strip whitespace (or other characters) from the end of a string + * @link http://www.php.net/manual/en/function.rtrim.php + * @param str string

+ * The input string. + *

+ * @param charlist string[optional]

+ * You can also specify the characters you want to strip, by means + * of the charlist parameter. + * Simply list all characters that you want to be stripped. With + * .. you can specify a range of characters. + *

+ * @return string the modified string. + * + * @jms-builtin + */ +function rtrim ($str, $charlist = null) {} + +/** + * Replace all occurrences of the search string with the replacement string + * @link http://www.php.net/manual/en/function.str-replace.php + * @param search mixed

+ * The value being searched for, otherwise known as the needle. + * An array may be used to designate multiple needles. + *

+ * @param replace mixed

+ * The replacement value that replaces found search + * values. An array may be used to designate multiple replacements. + *

+ * @param subject mixed

+ * The string or array being searched and replaced on, + * otherwise known as the haystack. + *

+ *

+ * If subject is an array, then the search and + * replace is performed with every entry of + * subject, and the return value is an array as + * well. + *

+ * @param count int[optional] If passed, this will hold the number of matched and replaced needles. + * @return mixed This function returns a string or an array with the replaced values. + * + * @jms-builtin + */ +function str_replace ($search, $replace, $subject, &$count = null) {} + +/** + * Case-insensitive version of str_replace. + * @link http://www.php.net/manual/en/function.str-ireplace.php + * @param search mixed

+ * Every replacement with search array is + * performed on the result of previous replacement. + *

+ * @param replace mixed

+ *

+ * @param subject mixed

+ * If subject is an array, then the search and + * replace is performed with every entry of + * subject, and the return value is an array as + * well. + *

+ * @param count int[optional]

+ * The number of matched and replaced needles will + * be returned in count which is passed by + * reference. + *

+ * @return mixed a string or an array of replacements. + * + * @jms-builtin + */ +function str_ireplace ($search, $replace, $subject, &$count = null) {} + +/** + * Repeat a string + * @link http://www.php.net/manual/en/function.str-repeat.php + * @param input string

+ * The string to be repeated. + *

+ * @param multiplier int

+ * Number of time the input string should be + * repeated. + *

+ *

+ * multiplier has to be greater than or equal to 0. + * If the multiplier is set to 0, the function + * will return an empty string. + *

+ * @return string the repeated string. + * + * @jms-builtin + */ +function str_repeat ($input, $multiplier) {} + +/** + * Return information about characters used in a string + * @link http://www.php.net/manual/en/function.count-chars.php + * @param string string

+ * The examined string. + *

+ * @param mode int[optional]

+ * See return values. + *

+ * @return mixed Depending on mode + * count_chars returns one of the following: + * 0 - an array with the byte-value as key and the frequency of + * every byte as value. + * 1 - same as 0 but only byte-values with a frequency greater + * than zero are listed. + * 2 - same as 0 but only byte-values with a frequency equal to + * zero are listed. + * 3 - a string containing all unique characters is returned. + * 4 - a string containing all not used characters is returned. + * + * @jms-builtin + */ +function count_chars ($string, $mode = null) {} + +/** + * Split a string into smaller chunks + * @link http://www.php.net/manual/en/function.chunk-split.php + * @param body string

+ * The string to be chunked. + *

+ * @param chunklen int[optional]

+ * The chunk length. + *

+ * @param end string[optional]

+ * The line ending sequence. + *

+ * @return string the chunked string. + * + * @jms-builtin + */ +function chunk_split ($body, $chunklen = null, $end = null) {} + +/** + * Strip whitespace (or other characters) from the beginning and end of a string + * @link http://www.php.net/manual/en/function.trim.php + * @param str string

+ * The string that will be trimmed. + *

+ * @param charlist string[optional]

+ * Optionally, the stripped characters can also be specified using + * the charlist parameter. + * Simply list all characters that you want to be stripped. With + * .. you can specify a range of characters. + *

+ * @return string The trimmed string. + * + * @jms-builtin + */ +function trim ($str, $charlist = null) {} + +/** + * Strip whitespace (or other characters) from the beginning of a string + * @link http://www.php.net/manual/en/function.ltrim.php + * @param str string

+ * The input string. + *

+ * @param charlist string[optional]

+ * You can also specify the characters you want to strip, by means of the + * charlist parameter. + * Simply list all characters that you want to be stripped. With + * .. you can specify a range of characters. + *

+ * @return string This function returns a string with whitespace stripped from the + * beginning of str. + * Without the second parameter, + * ltrim will strip these characters: + * " " (ASCII 32 + * (0x20)), an ordinary space. + * "\t" (ASCII 9 + * (0x09)), a tab. + * "\n" (ASCII 10 + * (0x0A)), a new line (line feed). + * "\r" (ASCII 13 + * (0x0D)), a carriage return. + * "\0" (ASCII 0 + * (0x00)), the NUL-byte. + * "\x0B" (ASCII 11 + * (0x0B)), a vertical tab. + * + * @jms-builtin + */ +function ltrim ($str, $charlist = null) {} + +/** + * Strip HTML and PHP tags from a string + * @link http://www.php.net/manual/en/function.strip-tags.php + * @param str string

+ * The input string. + *

+ * @param allowable_tags string[optional]

+ * You can use the optional second parameter to specify tags which should + * not be stripped. + *

+ *

+ * HTML comments and PHP tags are also stripped. This is hardcoded and + * can not be changed with allowable_tags. + *

+ * @return string the stripped string. + * + * @jms-builtin + */ +function strip_tags ($str, $allowable_tags = null) {} + +/** + * Calculate the similarity between two strings + * @link http://www.php.net/manual/en/function.similar-text.php + * @param first string

+ * The first string. + *

+ * @param second string

+ * The second string. + *

+ * @param percent float[optional]

+ * By passing a reference as third argument, + * similar_text will calculate the similarity in + * percent for you. + *

+ * @return int the number of matching chars in both strings. + * + * @jms-builtin + */ +function similar_text ($first, $second, &$percent = null) {} + +/** + * Split a string by string + * @link http://www.php.net/manual/en/function.explode.php + * @param delimiter string

+ * The boundary string. + *

+ * @param string string

+ * The input string. + *

+ * @param limit int[optional]

+ * If limit is set and positive, the returned array will contain + * a maximum of limit elements with the last + * element containing the rest of string. + *

+ *

+ * If the limit parameter is negative, all components + * except the last -limit are returned. + *

+ *

+ * If the limit parameter is zero, then this is treated as 1. + *

+ * @return array If delimiter is an empty string (""), + * explode will return false. + * If delimiter contains a value that is not + * contained in string and a negative + * limit is used, then an empty array will be + * returned. For any other limit, an array containing + * string will be returned. + * + * @jms-builtin + */ +function explode ($delimiter, $string, $limit = null) {} + +/** + * Join array elements with a string + * @link http://www.php.net/manual/en/function.implode.php + * @param glue string

+ * Defaults to an empty string. This is not the preferred usage of + * implode as glue would be + * the second parameter and thus, the bad prototype would be used. + *

+ * @param pieces array

+ * The array of strings to implode. + *

+ * @return string a string containing a string representation of all the array + * elements in the same order, with the glue string between each element. + * + * @jms-builtin + * @jms-variable-parameters + */ +function implode ($glue, array $pieces) {} + +/** + * Set locale information + * @link http://www.php.net/manual/en/function.setlocale.php + * @param category int

+ * category is a named constant specifying the + * category of the functions affected by the locale setting: + * LC_ALL for all of the below + * @param locale string

+ * If locale is &null; or the empty string + * "", the locale names will be set from the + * values of environment variables with the same names as the above + * categories, or from "LANG". + *

+ *

+ * If locale is "0", + * the locale setting is not affected, only the current setting is returned. + *

+ *

+ * If locale is an array or followed by additional + * parameters then each array element or parameter is tried to be set as + * new locale until success. This is useful if a locale is known under + * different names on different systems or for providing a fallback + * for a possibly not available locale. + *

+ * @param _ string[optional] + * @return string the new current locale, or false if the locale functionality is + * not implemented on your platform, the specified locale does not exist or + * the category name is invalid. + *

+ *

+ * An invalid category name also causes a warning message. Category/locale + * names can be found in RFC 1766 + * and ISO 639. + * Different systems have different naming schemes for locales. + *

+ *

+ * The return value of setlocale depends + * on the system that PHP is running. It returns exactly + * what the system setlocale function returns. + * + * @jms-builtin + */ +function setlocale ($category, $locale, $_ = null) {} + +/** + * Get numeric formatting information + * @link http://www.php.net/manual/en/function.localeconv.php + * @return array localeconv returns data based upon the current locale + * as set by setlocale. The associative array that is + * returned contains the following fields: + * + * Array element + * Description + * + * + * decimal_point + * Decimal point character + * + * + * thousands_sep + * Thousands separator + * + * + * grouping + * Array containing numeric groupings + * + * + * int_curr_symbol + * International currency symbol (i.e. USD) + * + * + * currency_symbol + * Local currency symbol (i.e. $) + * + * + * mon_decimal_point + * Monetary decimal point character + * + * + * mon_thousands_sep + * Monetary thousands separator + * + * + * mon_grouping + * Array containing monetary groupings + * + * + * positive_sign + * Sign for positive values + * + * + * negative_sign + * Sign for negative values + * + * + * int_frac_digits + * International fractional digits + * + * + * frac_digits + * Local fractional digits + * + * + * p_cs_precedes + * + * true if currency_symbol precedes a positive value, false + * if it succeeds one + * + * + * + * p_sep_by_space + * + * true if a space separates currency_symbol from a positive + * value, false otherwise + * + * + * + * n_cs_precedes + * + * true if currency_symbol precedes a negative value, false + * if it succeeds one + * + * + * + * n_sep_by_space + * + * true if a space separates currency_symbol from a negative + * value, false otherwise + * + * + * p_sign_posn + * + * 0 - Parentheses surround the quantity and currency_symbol + * 1 - The sign string precedes the quantity and currency_symbol + * 2 - The sign string succeeds the quantity and currency_symbol + * 3 - The sign string immediately precedes the currency_symbol + * 4 - The sign string immediately succeeds the currency_symbol + * + * + * n_sign_posn + * + * 0 - Parentheses surround the quantity and currency_symbol + * 1 - The sign string precedes the quantity and currency_symbol + * 2 - The sign string succeeds the quantity and currency_symbol + * 3 - The sign string immediately precedes the currency_symbol + * 4 - The sign string immediately succeeds the currency_symbol + * + * + *

+ *

+ * The p_sign_posn, and n_sign_posn contain a string + * of formatting options. Each number representing one of the above listed conditions. + *

+ *

+ * The grouping fields contain arrays that define the way numbers should be + * grouped. For example, the monetary grouping field for the nl_NL locale (in + * UTF-8 mode with the euro sign), would contain a 2 item array with the + * values 3 and 3. The higher the index in the array, the farther left the + * grouping is. If an array element is equal to CHAR_MAX, + * no further grouping is done. If an array element is equal to 0, the previous + * element should be used. + * + * @jms-builtin + */ +function localeconv () {} + +/** + * Query language and locale information + * @link http://www.php.net/manual/en/function.nl-langinfo.php + * @param item int

+ * item may be an integer value of the element or the + * constant name of the element. The following is a list of constant names + * for item that may be used and their description. + * Some of these constants may not be defined or hold no value for certain + * locales. + * + * nl_langinfo Constants + * + * + * + * + * + * LC_TIME Category Constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * LC_MONETARY Category Constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Returns 0 if parentheses surround the quantity and CURRENCY_SYMBOL. + * @return string the element as a string, or false if item + * is not valid. + * + * @jms-builtin + */ +function nl_langinfo ($item) {} + +/** + * Calculate the soundex key of a string + * @link http://www.php.net/manual/en/function.soundex.php + * @param str string

+ * The input string. + *

+ * @return string the soundex key as a string. + * + * @jms-builtin + */ +function soundex ($str) {} + +/** + * Calculate Levenshtein distance between two strings + * @link http://www.php.net/manual/en/function.levenshtein.php + * @param str1 string

+ * One of the strings being evaluated for Levenshtein distance. + *

+ * @param str2 string

+ * One of the strings being evaluated for Levenshtein distance. + *

+ * @return int This function returns the Levenshtein-Distance between the + * two argument strings or -1, if one of the argument strings + * is longer than the limit of 255 characters. + * + * @jms-builtin + */ +function levenshtein ($str1, $str2) {} + +/** + * Return a specific character + * @link http://www.php.net/manual/en/function.chr.php + * @param ascii int

+ * The ascii code. + *

+ * @return string the specified character. + * + * @jms-builtin + */ +function chr ($ascii) {} + +/** + * Return ASCII value of character + * @link http://www.php.net/manual/en/function.ord.php + * @param string string

+ * A character. + *

+ * @return int the ASCII value as an integer. + * + * @jms-builtin + */ +function ord ($string) {} + +/** + * Parses the string into variables + * @link http://www.php.net/manual/en/function.parse-str.php + * @param str string

+ * The input string. + *

+ * @param arr array[optional]

+ * If the second parameter arr is present, + * variables are stored in this variable as array elements instead. + *

+ * @return void + * + * @jms-builtin + */ +function parse_str ($str, array &$arr = null) {} + +/** + * Pad a string to a certain length with another string + * @link http://www.php.net/manual/en/function.str-pad.php + * @param input string

+ * The input string. + *

+ * @param pad_length int

+ * If the value of pad_length is negative, + * less than, or equal to the length of the input string, no padding + * takes place. + *

+ * @param pad_string string[optional]

+ * The pad_string may be truncated if the + * required number of padding characters can't be evenly divided by the + * pad_string's length. + *

+ * @param pad_type int[optional]

+ * Optional argument pad_type can be + * STR_PAD_RIGHT, STR_PAD_LEFT, + * or STR_PAD_BOTH. If + * pad_type is not specified it is assumed to be + * STR_PAD_RIGHT. + *

+ * @return string the padded string. + * + * @jms-builtin + */ +function str_pad ($input, $pad_length, $pad_string = null, $pad_type = null) {} + +/** + * &Alias; rtrim + * @link http://www.php.net/manual/en/function.chop.php + * @param str + * @param character_mask[optional] + * + * @jms-builtin + */ +function chop ($str, $character_mask) {} + +/** + * &Alias; strstr + * @link http://www.php.net/manual/en/function.strchr.php + * @param haystack + * @param needle + * + * @jms-builtin + */ +function strchr ($haystack, $needle) {} + +/** + * Return a formatted string + * @link http://www.php.net/manual/en/function.sprintf.php + * @param format string

+ * The format string is composed of zero or more directives: + * ordinary characters (excluding %) that are + * copied directly to the result, and conversion + * specifications, each of which results in fetching its + * own parameter. This applies to both sprintf + * and printf. + *

+ *

+ * Each conversion specification consists of a percent sign + * (%), followed by one or more of these + * elements, in order: + * An optional sign specifier that forces a sign + * (- or +) to be used on a number. By default, only the - sign is used + * on a number if it's negative. This specifier forces positive numbers + * to have the + sign attached as well, and was added in PHP 4.3.0. + * @param args mixed[optional]

+ *

+ * @param _ mixed[optional] + * @return string a string produced according to the formatting string + * format. + * + * @jms-builtin + */ +function sprintf ($format, $args = null, $_ = null) {} + +/** + * Output a formatted string + * @link http://www.php.net/manual/en/function.printf.php + * @param format string

+ * See sprintf for a description of + * format. + *

+ * @param args mixed[optional]

+ *

+ * @param _ mixed[optional] + * @return int the length of the outputted string. + * + * @jms-builtin + */ +function printf ($format, $args = null, $_ = null) {} + +/** + * Output a formatted string + * @link http://www.php.net/manual/en/function.vprintf.php + * @param format string

+ * See sprintf for a description of + * format. + *

+ * @param args array

+ *

+ * @return int the length of the outputted string. + * + * @jms-builtin + */ +function vprintf ($format, array $args) {} + +/** + * Return a formatted string + * @link http://www.php.net/manual/en/function.vsprintf.php + * @param format string

+ * See sprintf for a description of + * format. + *

+ * @param args array

+ *

+ * @return string Return array values as a formatted string according to + * format (which is described in the documentation + * for sprintf). + * + * @jms-builtin + */ +function vsprintf ($format, array $args) {} + +/** + * Write a formatted string to a stream + * @link http://www.php.net/manual/en/function.fprintf.php + * @param handle resource &fs.file.pointer; + * @param format string

+ * See sprintf for a description of + * format. + *

+ * @param args mixed[optional]

+ *

+ * @param _ mixed[optional] + * @return int the length of the string written. + * + * @jms-builtin + */ +function fprintf ($handle, $format, $args = null, $_ = null) {} + +/** + * Write a formatted string to a stream + * @link http://www.php.net/manual/en/function.vfprintf.php + * @param handle resource

+ *

+ * @param format string

+ * See sprintf for a description of + * format. + *

+ * @param args array

+ *

+ * @return int the length of the outputted string. + * + * @jms-builtin + */ +function vfprintf ($handle, $format, array $args) {} + +/** + * Parses input from a string according to a format + * @link http://www.php.net/manual/en/function.sscanf.php + * @param str string

+ * The input string being parsed. + *

+ * @param format string

+ * The interpreted format for str, which is + * described in the documentation for sprintf with + * following differences: + * Function is not locale-aware. + * F, g, G and + * b are not supported. + * D stands for decimal number. + * i stands for integer with base detection. + * n stands for number of characters processed so far. + *

+ * @param _ mixed[optional] + * @return mixed If only + * two parameters were passed to this function, the values parsed + * will be returned as an array. Otherwise, if optional parameters are passed, + * the function will return the number of assigned values. The optional + * parameters must be passed by reference. + * + * @jms-builtin + */ +function sscanf ($str, $format, &$_ = null) {} + +/** + * Parses input from a file according to a format + * @link http://www.php.net/manual/en/function.fscanf.php + * @param handle resource &fs.file.pointer; + * @param format string

+ * The specified format as described in the + * sprintf documentation. + *

+ * @param _ mixed[optional] + * @return mixed If only two parameters were passed to this function, the values parsed will be + * returned as an array. Otherwise, if optional parameters are passed, the + * function will return the number of assigned values. The optional + * parameters must be passed by reference. + * + * @jms-builtin + */ +function fscanf ($handle, $format, &$_ = null) {} + +/** + * Parse a URL and return its components + * @link http://www.php.net/manual/en/function.parse-url.php + * @param url string

+ * The URL to parse. Invalid characters are replaced by + * _. + *

+ * @param component int[optional]

+ * Specify one of PHP_URL_SCHEME, + * PHP_URL_HOST, PHP_URL_PORT, + * PHP_URL_USER, PHP_URL_PASS, + * PHP_URL_PATH, PHP_URL_QUERY + * or PHP_URL_FRAGMENT to retrieve just a specific + * URL component as a string. + *

+ * @return mixed On seriously malformed URLs, parse_url may return + * false and emit a E_WARNING. Otherwise an associative + * array is returned, whose components may be (at least one): + * scheme - e.g. http + * host + * port + * user + * pass + * path + * query - after the question mark ? + * fragment - after the hashmark # + *

+ *

+ * If the component parameter is specified a + * string is returned instead of an array. + * + * @jms-builtin + */ +function parse_url ($url, $component = null) {} + +/** + * URL-encodes string + * @link http://www.php.net/manual/en/function.urlencode.php + * @param str string

+ * The string to be encoded. + *

+ * @return string a string in which all non-alphanumeric characters except + * -_. have been replaced with a percent + * (%) sign followed by two hex digits and spaces encoded + * as plus (+) signs. It is encoded the same way that the + * posted data from a WWW form is encoded, that is the same way as in + * application/x-www-form-urlencoded media type. This + * differs from the RFC 1738 encoding (see + * rawurlencode) in that for historical reasons, spaces + * are encoded as plus (+) signs. + * + * @jms-builtin + */ +function urlencode ($str) {} + +/** + * Decodes URL-encoded string + * @link http://www.php.net/manual/en/function.urldecode.php + * @param str string

+ * The string to be decoded. + *

+ * @return string the decoded string. + * + * @jms-builtin + */ +function urldecode ($str) {} + +/** + * URL-encode according to RFC 1738 + * @link http://www.php.net/manual/en/function.rawurlencode.php + * @param str string

+ * The URL to be encoded. + *

+ * @return string a string in which all non-alphanumeric characters except + * -_. have been replaced with a percent + * (%) sign followed by two hex digits. This is the + * encoding described in RFC 1738 for + * protecting literal characters from being interpreted as special URL + * delimiters, and for protecting URLs from being mangled by transmission + * media with character conversions (like some email systems). + * + * @jms-builtin + */ +function rawurlencode ($str) {} + +/** + * Decode URL-encoded strings + * @link http://www.php.net/manual/en/function.rawurldecode.php + * @param str string

+ * The URL to be decoded. + *

+ * @return string the decoded URL, as a string. + * + * @jms-builtin + */ +function rawurldecode ($str) {} + +/** + * Generate URL-encoded query string + * @link http://www.php.net/manual/en/function.http-build-query.php + * @param formdata array

+ * May be an array or object containing properties. + *

+ *

+ * The array form may be a simple one-dimensional structure, or an array + * of arrays (who in turn may contain other arrays). + *

+ * @param numeric_prefix string[optional]

+ * If numeric indices are used in the base array and this parameter is + * provided, it will be prepended to the numeric index for elements in + * the base array only. + *

+ *

+ * This is meant to allow for legal variable names when the data is + * decoded by PHP or another CGI application later on. + *

+ * @param arg_separator string[optional]

+ * arg_separator.output + * is used to separate arguments, unless this parameter is specified, + * and is then used. + *

+ * @return string a URL-encoded string. + * + * @jms-builtin + */ +function http_build_query (array $formdata, $numeric_prefix = null, $arg_separator = null) {} + +/** + * Returns the target of a symbolic link + * @link http://www.php.net/manual/en/function.readlink.php + * @param path string

+ * The symbolic link path. + *

+ * @return string the contents of the symbolic link path or false on error. + * + * @jms-builtin + */ +function readlink ($path) {} + +/** + * Gets information about a link + * @link http://www.php.net/manual/en/function.linkinfo.php + * @param path string

+ * Path to the link. + *

+ * @return int linkinfo returns the st_dev field + * of the Unix C stat structure returned by the lstat + * system call. Returns 0 or false in case of error. + * + * @jms-builtin + */ +function linkinfo ($path) {} + +/** + * @param target + * @param link + * + * @jms-builtin + */ +function symlink ($target, $link) {} + +/** + * Create a hard link + * @link http://www.php.net/manual/en/function.link.php + * @param from_path string

+ * The link name. + *

+ * @param to_path string

+ * Target of the link. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function link ($from_path, $to_path) {} + +/** + * Deletes a file + * @link http://www.php.net/manual/en/function.unlink.php + * @param filename string

+ * Path to the file. + *

+ * @param context resource[optional] ¬e.context-support; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function unlink ($filename, $context = null) {} + +/** + * Execute an external program + * @link http://www.php.net/manual/en/function.exec.php + * @param command string

+ * The command that will be executed. + *

+ * @param output array[optional]

+ * If the output argument is present, then the + * specified array will be filled with every line of output from the + * command. Trailing whitespace, such as \n, is not + * included in this array. Note that if the array already contains some + * elements, exec will append to the end of the array. + * If you do not want the function to append elements, call + * unset on the array before passing it to + * exec. + *

+ * @param return_var int[optional]

+ * If the return_var argument is present + * along with the output argument, then the + * return status of the executed command will be written to this + * variable. + *

+ * @return string The last line from the result of the command. If you need to execute a + * command and have all the data from the command passed directly back without + * any interference, use the passthru function. + *

+ *

+ * To get the output of the executed command, be sure to set and use the + * output parameter. + * + * @jms-builtin + */ +function exec ($command, array &$output = null, &$return_var = null) {} + +/** + * Execute an external program and display the output + * @link http://www.php.net/manual/en/function.system.php + * @param command string

+ * The command that will be executed. + *

+ * @param return_var int[optional]

+ * If the return_var argument is present, then the + * return status of the executed command will be written to this + * variable. + *

+ * @return string the last line of the command output on success, and false + * on failure. + * + * @jms-builtin + */ +function system ($command, &$return_var = null) {} + +/** + * Escape shell metacharacters + * @link http://www.php.net/manual/en/function.escapeshellcmd.php + * @param command string

+ * The command that will be escaped. + *

+ * @return string The escaped string. + * + * @jms-builtin + */ +function escapeshellcmd ($command) {} + +/** + * Escape a string to be used as a shell argument + * @link http://www.php.net/manual/en/function.escapeshellarg.php + * @param arg string

+ * The argument that will be escaped. + *

+ * @return string The escaped string. + * + * @jms-builtin + */ +function escapeshellarg ($arg) {} + +/** + * Execute an external program and display raw output + * @link http://www.php.net/manual/en/function.passthru.php + * @param command string

+ * The command that will be executed. + *

+ * @param return_var int[optional]

+ * If the return_var argument is present, the + * return status of the Unix command will be placed here. + *

+ * @return void + * + * @jms-builtin + */ +function passthru ($command, &$return_var = null) {} + +/** + * Execute command via shell and return the complete output as a string + * @link http://www.php.net/manual/en/function.shell-exec.php + * @param cmd string

+ * The command that will be executed. + *

+ * @return string The output from the executed command. + * + * @jms-builtin + */ +function shell_exec ($cmd) {} + +/** + * Execute a command and open file pointers for input/output + * @link http://www.php.net/manual/en/function.proc-open.php + * @param cmd string

+ * The command to execute + *

+ * @param descriptorspec array

+ * An indexed array where the key represents the descriptor number and the + * value represents how PHP will pass that descriptor to the child + * process. 0 is stdin, 1 is stdout, while 2 is stderr. + *

+ *

+ * Each element can be: + * An array describing the pipe to pass to the process. The first + * element is the descriptor type and the second element is an option for + * the given type. Valid types are pipe (the second + * element is either r to pass the read end of the pipe + * to the process, or w to pass the write end) and + * file (the second element is a filename). + * A stream resource representing a real file descriptor (e.g. opened file, + * a socket, STDIN). + *

+ *

+ * The file descriptor numbers are not limited to 0, 1 and 2 - you may + * specify any valid file descriptor number and it will be passed to the + * child process. This allows your script to interoperate with other + * scripts that run as "co-processes". In particular, this is useful for + * passing passphrases to programs like PGP, GPG and openssl in a more + * secure manner. It is also useful for reading status information + * provided by those programs on auxiliary file descriptors. + *

+ * @param pipes array

+ * Will be set to an indexed array of file pointers that correspond to + * PHP's end of any pipes that are created. + *

+ * @param cwd string[optional]

+ * The initial working dir for the command. This must be an + * absolute directory path, or &null; + * if you want to use the default value (the working dir of the current + * PHP process) + *

+ * @param env array[optional]

+ * An array with the environment variables for the command that will be + * run, or &null; to use the same environment as the current PHP process + *

+ * @param other_options array[optional]

+ * Allows you to specify additional options. Currently supported options + * include: + * suppress_errors (windows only): suppresses errors + * generated by this function when it's set to true + * bypass_shell (windows only): bypass + * cmd.exe shell when set to true + * context: stream context used when opening files + * (created with stream_context_create) + * binary_pipes: open pipes in binary mode, instead + * of using the usual stream_encoding + *

+ * @return resource a resource representing the process, which should be freed using + * proc_close when you are finished with it. On failure + * returns false. + * + * @jms-builtin + */ +function proc_open ($cmd, array $descriptorspec, array &$pipes, $cwd = null, array $env = null, array $other_options = null) {} + +/** + * Close a process opened by proc_open and return the exit code of that process + * @link http://www.php.net/manual/en/function.proc-close.php + * @param process resource

+ * The proc_open resource that will + * be closed. + *

+ * @return int the termination status of the process that was run. + * + * @jms-builtin + */ +function proc_close ($process) {} + +/** + * Kills a process opened by proc_open + * @link http://www.php.net/manual/en/function.proc-terminate.php + * @param process resource

+ * The proc_open resource that will + * be closed. + *

+ * @param signal int[optional]

+ * This optional parameter is only useful on POSIX + * operating systems; you may specify a signal to send to the process + * using the kill(2) system call. The default is + * SIGTERM. + *

+ * @return bool the termination status of the process that was run. + * + * @jms-builtin + */ +function proc_terminate ($process, $signal = null) {} + +/** + * Get information about a process opened by proc_open + * @link http://www.php.net/manual/en/function.proc-get-status.php + * @param process resource

+ * The proc_open resource that will + * be evaluated. + *

+ * @return array An array of collected information on success, and false + * on failure. The returned array contains the following elements: + *

+ *

+ *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * @jms-builtin + */ +function proc_get_status ($process) {} + +/** + * Change the priority of the current process + * @link http://www.php.net/manual/en/function.proc-nice.php + * @param increment int

+ * The increment value of the priority change. + *

+ * @return bool Returns true on success or false on failure. + * If an error occurs, like the user lacks permission to change the priority, + * an error of level E_WARNING is also generated. + * + * @jms-builtin + */ +function proc_nice ($increment) {} + +/** + * Generate a random integer + * @link http://www.php.net/manual/en/function.rand.php + * @param min[optional] + * @param max[optional] + * @return int A pseudo random value between min + * (or 0) and max (or getrandmax, inclusive). + * + * @jms-builtin + */ +function rand ($min = 0, $max = 0) {} + +/** + * Seed the random number generator + * @link http://www.php.net/manual/en/function.srand.php + * @param seed int[optional]

+ * Optional seed value + *

+ * @return void + * + * @jms-builtin + */ +function srand ($seed = null) {} + +/** + * Show largest possible random value + * @link http://www.php.net/manual/en/function.getrandmax.php + * @return int The largest possible random value returned by rand + * + * @jms-builtin + */ +function getrandmax () {} + +/** + * Generate a better random value + * @link http://www.php.net/manual/en/function.mt-rand.php + * @param min[optional] + * @param max[optional] + * @return int A random integer value between min (or 0) + * and max (or mt_getrandmax, inclusive) + * + * @jms-builtin + */ +function mt_rand ($min = 0, $max = 0) {} + +/** + * Seed the better random number generator + * @link http://www.php.net/manual/en/function.mt-srand.php + * @param seed int[optional]

+ * An optional seed value + *

+ * @return void + * + * @jms-builtin + */ +function mt_srand ($seed = null) {} + +/** + * Show largest possible random value + * @link http://www.php.net/manual/en/function.mt-getrandmax.php + * @return int the maximum random value returned by mt_rand + * + * @jms-builtin + */ +function mt_getrandmax () {} + +/** + * Get port number associated with an Internet service and protocol + * @link http://www.php.net/manual/en/function.getservbyname.php + * @param service string

+ * The Internet service name, as a string. + *

+ * @param protocol string

+ * protocol is either "tcp" + * or "udp" (in lowercase). + *

+ * @return int the port number, or false if service or + * protocol is not found. + * + * @jms-builtin + */ +function getservbyname ($service, $protocol) {} + +/** + * Get Internet service which corresponds to port and protocol + * @link http://www.php.net/manual/en/function.getservbyport.php + * @param port int

+ * The port number. + *

+ * @param protocol string

+ * protocol is either "tcp" + * or "udp" (in lowercase). + *

+ * @return string the Internet service name as a string. + * + * @jms-builtin + */ +function getservbyport ($port, $protocol) {} + +/** + * Get protocol number associated with protocol name + * @link http://www.php.net/manual/en/function.getprotobyname.php + * @param name string

+ * The protocol name. + *

+ * @return int the protocol number or -1 if the protocol is not found. + * + * @jms-builtin + */ +function getprotobyname ($name) {} + +/** + * Get protocol name associated with protocol number + * @link http://www.php.net/manual/en/function.getprotobynumber.php + * @param number int

+ * The protocol number. + *

+ * @return string the protocol name as a string. + * + * @jms-builtin + */ +function getprotobynumber ($number) {} + +/** + * Gets PHP script owner's UID + * @link http://www.php.net/manual/en/function.getmyuid.php + * @return int the user ID of the current script, or false on error. + * + * @jms-builtin + */ +function getmyuid () {} + +/** + * Get PHP script owner's GID + * @link http://www.php.net/manual/en/function.getmygid.php + * @return int the group ID of the current script, or false on error. + * + * @jms-builtin + */ +function getmygid () {} + +/** + * Gets PHP's process ID + * @link http://www.php.net/manual/en/function.getmypid.php + * @return int the current PHP process ID, or false on error. + * + * @jms-builtin + */ +function getmypid () {} + +/** + * Gets the inode of the current script + * @link http://www.php.net/manual/en/function.getmyinode.php + * @return int the current script's inode as an integer, or false on error. + * + * @jms-builtin + */ +function getmyinode () {} + +/** + * Gets time of last page modification + * @link http://www.php.net/manual/en/function.getlastmod.php + * @return int the time of the last modification of the current + * page. The value returned is a Unix timestamp, suitable for + * feeding to date. Returns false on error. + * + * @jms-builtin + */ +function getlastmod () {} + +/** + * Decodes data encoded with MIME base64 + * @link http://www.php.net/manual/en/function.base64-decode.php + * @param data string

+ * The encoded data. + *

+ * @param strict bool[optional]

+ * Returns false if input contains character from outside the base64 + * alphabet. + *

+ * @return string the original data&return.falseforfailure;. The returned data may be + * binary. + * + * @jms-builtin + */ +function base64_decode ($data, $strict = null) {} + +/** + * Encodes data with MIME base64 + * @link http://www.php.net/manual/en/function.base64-encode.php + * @param data string

+ * The data to encode. + *

+ * @return string The encoded data, as a string. + * + * @jms-builtin + */ +function base64_encode ($data) {} + +/** + * Uuencode a string + * @link http://www.php.net/manual/en/function.convert-uuencode.php + * @param data string

+ * The data to be encoded. + *

+ * @return string the uuencoded data. + * + * @jms-builtin + */ +function convert_uuencode ($data) {} + +/** + * Decode a uuencoded string + * @link http://www.php.net/manual/en/function.convert-uudecode.php + * @param data string

+ * The uuencoded data. + *

+ * @return string the decoded data as a string. + * + * @jms-builtin + */ +function convert_uudecode ($data) {} + +/** + * Absolute value + * @link http://www.php.net/manual/en/function.abs.php + * @param number mixed

+ * The numeric value to process + *

+ * @return number The absolute value of number. If the + * argument number is + * of type float, the return type is also float, + * otherwise it is integer (as float usually has a + * bigger value range than integer). + * + * @jms-builtin + */ +function abs ($number) {} + +/** + * Round fractions up + * @link http://www.php.net/manual/en/function.ceil.php + * @param value float

+ * The value to round + *

+ * @return float value rounded up to the next highest + * integer. + * The return value of ceil is still of type + * float as the value range of float is + * usually bigger than that of integer. + * + * @jms-builtin + */ +function ceil ($value) {} + +/** + * Round fractions down + * @link http://www.php.net/manual/en/function.floor.php + * @param value float

+ * The numeric value to round + *

+ * @return float value rounded to the next lowest integer. + * The return value of floor is still of type + * float because the value range of float is + * usually bigger than that of integer. + * + * @jms-builtin + */ +function floor ($value) {} + +/** + * Rounds a float + * @link http://www.php.net/manual/en/function.round.php + * @param val float

+ * The value to round + *

+ * @param precision int[optional]

+ * The optional number of decimal digits to round to. + *

+ * @param mode int[optional]

+ * One of PHP_ROUND_HALF_UP, + * PHP_ROUND_HALF_DOWN, + * PHP_ROUND_HALF_EVEN, or + * PHP_ROUND_HALF_ODD. + *

+ * @return float The rounded value + * + * @jms-builtin + */ +function round ($val, $precision = null, $mode = null) {} + +/** + * Sine + * @link http://www.php.net/manual/en/function.sin.php + * @param arg float

+ * A value in radians + *

+ * @return float The sine of arg + * + * @jms-builtin + */ +function sin ($arg) {} + +/** + * Cosine + * @link http://www.php.net/manual/en/function.cos.php + * @param arg float

+ * An angle in radians + *

+ * @return float The cosine of arg + * + * @jms-builtin + */ +function cos ($arg) {} + +/** + * Tangent + * @link http://www.php.net/manual/en/function.tan.php + * @param arg float

+ * The argument to process in radians + *

+ * @return float The tangent of arg + * + * @jms-builtin + */ +function tan ($arg) {} + +/** + * Arc sine + * @link http://www.php.net/manual/en/function.asin.php + * @param arg float

+ * The argument to process + *

+ * @return float The arc sine of arg in radians + * + * @jms-builtin + */ +function asin ($arg) {} + +/** + * Arc cosine + * @link http://www.php.net/manual/en/function.acos.php + * @param arg float

+ * The argument to process + *

+ * @return float The arc cosine of arg in radians. + * + * @jms-builtin + */ +function acos ($arg) {} + +/** + * Arc tangent + * @link http://www.php.net/manual/en/function.atan.php + * @param arg float

+ * The argument to process + *

+ * @return float The arc tangent of arg in radians. + * + * @jms-builtin + */ +function atan ($arg) {} + +/** + * Arc tangent of two variables + * @link http://www.php.net/manual/en/function.atan2.php + * @param y float

+ * Dividend parameter + *

+ * @param x float

+ * Divisor parameter + *

+ * @return float The arc tangent of y/x + * in radians. + * + * @jms-builtin + */ +function atan2 ($y, $x) {} + +/** + * Hyperbolic sine + * @link http://www.php.net/manual/en/function.sinh.php + * @param arg float

+ * The argument to process + *

+ * @return float The hyperbolic sine of arg + * + * @jms-builtin + */ +function sinh ($arg) {} + +/** + * Hyperbolic cosine + * @link http://www.php.net/manual/en/function.cosh.php + * @param arg float

+ * The argument to process + *

+ * @return float The hyperbolic cosine of arg + * + * @jms-builtin + */ +function cosh ($arg) {} + +/** + * Hyperbolic tangent + * @link http://www.php.net/manual/en/function.tanh.php + * @param arg float

+ * The argument to process + *

+ * @return float The hyperbolic tangent of arg + * + * @jms-builtin + */ +function tanh ($arg) {} + +/** + * Inverse hyperbolic sine + * @link http://www.php.net/manual/en/function.asinh.php + * @param arg float

+ * The argument to process + *

+ * @return float The inverse hyperbolic sine of arg + * + * @jms-builtin + */ +function asinh ($arg) {} + +/** + * Inverse hyperbolic cosine + * @link http://www.php.net/manual/en/function.acosh.php + * @param arg float

+ * The value to process + *

+ * @return float The inverse hyperbolic cosine of arg + * + * @jms-builtin + */ +function acosh ($arg) {} + +/** + * Inverse hyperbolic tangent + * @link http://www.php.net/manual/en/function.atanh.php + * @param arg float

+ * The argument to process + *

+ * @return float Inverse hyperbolic tangent of arg + * + * @jms-builtin + */ +function atanh ($arg) {} + +/** + * Returns exp(number) - 1, computed in a way that is accurate even + when the value of number is close to zero + * @link http://www.php.net/manual/en/function.expm1.php + * @param arg float

+ * The argument to process + *

+ * @return float 'e' to the power of arg minus one + * + * @jms-builtin + */ +function expm1 ($arg) {} + +/** + * Returns log(1 + number), computed in a way that is accurate even when + the value of number is close to zero + * @link http://www.php.net/manual/en/function.log1p.php + * @param number float

+ * The argument to process + *

+ * @return float log(1 + number) + * + * @jms-builtin + */ +function log1p ($number) {} + +/** + * Get value of pi + * @link http://www.php.net/manual/en/function.pi.php + * @return float The value of pi as float. + * + * @jms-builtin + */ +function pi () {} + +/** + * Finds whether a value is a legal finite number + * @link http://www.php.net/manual/en/function.is-finite.php + * @param val float

+ * The value to check + *

+ * @return bool true if val is a legal finite + * number within the allowed range for a PHP float on this platform, + * else false. + * + * @jms-builtin + */ +function is_finite ($val) {} + +/** + * Finds whether a value is not a number + * @link http://www.php.net/manual/en/function.is-nan.php + * @param val float

+ * The value to check + *

+ * @return bool true if val is 'not a number', + * else false. + * + * @jms-builtin + */ +function is_nan ($val) {} + +/** + * Finds whether a value is infinite + * @link http://www.php.net/manual/en/function.is-infinite.php + * @param val float

+ * The value to check + *

+ * @return bool true if val is infinite, else false. + * + * @jms-builtin + */ +function is_infinite ($val) {} + +/** + * Exponential expression + * @link http://www.php.net/manual/en/function.pow.php + * @param base number

+ * The base to use + *

+ * @param exp number

+ * The exponent + *

+ * @return number base raised to the power of exp. + * If the result can be represented as integer it will be returned as type + * integer, else it will be returned as type float. + * If the power cannot be computed false will be returned instead. + * + * @jms-builtin + */ +function pow ($base, $exp) {} + +/** + * Calculates the exponent of e + * @link http://www.php.net/manual/en/function.exp.php + * @param arg float

+ * The argument to process + *

+ * @return float 'e' raised to the power of arg + * + * @jms-builtin + */ +function exp ($arg) {} + +/** + * Natural logarithm + * @link http://www.php.net/manual/en/function.log.php + * @param arg float

+ * The value to calculate the logarithm for + *

+ * @param base float[optional]

+ * The optional logarithmic base to use + * (defaults to 'e' and so to the natural logarithm). + *

+ * @return float The logarithm of arg to + * base, if given, or the + * natural logarithm. + * + * @jms-builtin + */ +function log ($arg, $base = null) {} + +/** + * Base-10 logarithm + * @link http://www.php.net/manual/en/function.log10.php + * @param arg float

+ * The argument to process + *

+ * @return float The base-10 logarithm of arg + * + * @jms-builtin + */ +function log10 ($arg) {} + +/** + * Square root + * @link http://www.php.net/manual/en/function.sqrt.php + * @param arg float

+ * The argument to process + *

+ * @return float The square root of arg + * or the special value NAN for negative numbers. + * + * @jms-builtin + */ +function sqrt ($arg) {} + +/** + * Calculate the length of the hypotenuse of a right-angle triangle + * @link http://www.php.net/manual/en/function.hypot.php + * @param x float

+ * Length of first side + *

+ * @param y float

+ * Length of second side + *

+ * @return float Calculated length of the hypotenuse + * + * @jms-builtin + */ +function hypot ($x, $y) {} + +/** + * Converts the number in degrees to the radian equivalent + * @link http://www.php.net/manual/en/function.deg2rad.php + * @param number float

+ * Angular value in degrees + *

+ * @return float The radian equivalent of number + * + * @jms-builtin + */ +function deg2rad ($number) {} + +/** + * Converts the radian number to the equivalent number in degrees + * @link http://www.php.net/manual/en/function.rad2deg.php + * @param number float

+ * A radian value + *

+ * @return float The equivalent of number in degrees + * + * @jms-builtin + */ +function rad2deg ($number) {} + +/** + * Binary to decimal + * @link http://www.php.net/manual/en/function.bindec.php + * @param binary_string string

+ * The binary string to convert + *

+ * @return number The decimal value of binary_string + * + * @jms-builtin + */ +function bindec ($binary_string) {} + +/** + * Hexadecimal to decimal + * @link http://www.php.net/manual/en/function.hexdec.php + * @param hex_string string

+ * The hexadecimal string to convert + *

+ * @return number The decimal representation of hex_string + * + * @jms-builtin + */ +function hexdec ($hex_string) {} + +/** + * Octal to decimal + * @link http://www.php.net/manual/en/function.octdec.php + * @param octal_string string

+ * The octal string to convert + *

+ * @return number The decimal representation of octal_string + * + * @jms-builtin + */ +function octdec ($octal_string) {} + +/** + * Decimal to binary + * @link http://www.php.net/manual/en/function.decbin.php + * @param number int

+ * Decimal value to convert + *

+ *
ConstantDescription
ABDAY_(1-7)Abbreviated name of n-th day of the week.
DAY_(1-7)Name of the n-th day of the week (DAY_1 = Sunday).
ABMON_(1-12)Abbreviated name of the n-th month of the year.
MON_(1-12)Name of the n-th month of the year.
AM_STRString for Ante meridian.
PM_STRString for Post meridian.
D_T_FMTString that can be used as the format string for strftime to represent time and date.
D_FMTString that can be used as the format string for strftime to represent date.
T_FMTString that can be used as the format string for strftime to represent time.
T_FMT_AMPMString that can be used as the format string for strftime to represent time in 12-hour format with ante/post meridian.
ERAAlternate era.
ERA_YEARYear in alternate era format.
ERA_D_T_FMTDate and time in alternate era format (string can be used in strftime).
ERA_D_FMTDate in alternate era format (string can be used in strftime).
ERA_T_FMTTime in alternate era format (string can be used in strftime).
INT_CURR_SYMBOLInternational currency symbol.
CURRENCY_SYMBOLLocal currency symbol.
CRNCYSTRSame value as CURRENCY_SYMBOL.
MON_DECIMAL_POINTDecimal point character.
MON_THOUSANDS_SEPThousands separator (groups of three digits).
MON_GROUPINGLike "grouping" element.
POSITIVE_SIGNSign for positive values.
NEGATIVE_SIGNSign for negative values.
INT_FRAC_DIGITSInternational fractional digits.
FRAC_DIGITSLocal fractional digits.
P_CS_PRECEDESReturns 1 if CURRENCY_SYMBOL precedes a positive value.
P_SEP_BY_SPACEReturns 1 if a space separates CURRENCY_SYMBOL from a positive value.
N_CS_PRECEDESReturns 1 if CURRENCY_SYMBOL precedes a negative value.
N_SEP_BY_SPACEReturns 1 if a space separates CURRENCY_SYMBOL from a negative value.
P_SIGN_POSN
elementtypedescription
commandstring + * The command string that was passed to proc_open. + *
pidintprocess id
runningbool + * true if the process is still running, false if it has + * terminated. + *
signaledbool + * true if the child process has been terminated by + * an uncaught signal. Always set to false on Windows. + *
stoppedbool + * true if the child process has been stopped by a + * signal. Always set to false on Windows. + *
exitcodeint + * The exit code returned by the process (which is only + * meaningful if running is false). + * Only first call of this function return real value, next calls return + * -1. + *
termsigint + * The number of the signal that caused the child process to terminate + * its execution (only meaningful if signaled is true). + *
stopsigint + * The number of the signal that caused the child process to stop its + * execution (only meaningful if stopped is true). + *
+ * Range of inputs on 32-bit machines + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + *
positive numbernegative numberreturn value
00
11
210
21474836461111111111111111111111111111110
2147483647 (largest signed integer)1111111111111111111111111111111 (31 1's)
2147483648-214748364810000000000000000000000000000000
4294967294-211111111111111111111111111111110
4294967295 (largest unsigned integer)-111111111111111111111111111111111 (32 1's)
+ * + * Range of inputs on 64-bit machines + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + *
positive numbernegative numberreturn value
00
11
210
9223372036854775806111111111111111111111111111111111111111111111111111111111111110
9223372036854775807 (largest signed integer)111111111111111111111111111111111111111111111111111111111111111 (31 1's)
-92233720368547758081000000000000000000000000000000000000000000000000000000000000000
-21111111111111111111111111111111111111111111111111111111111111110
-11111111111111111111111111111111111111111111111111111111111111111 (64 1's)
+ * @return string Binary string representation of number + * + * @jms-builtin + */ +function decbin ($number) {} + +/** + * Decimal to octal + * @link http://www.php.net/manual/en/function.decoct.php + * @param number int

+ * Decimal value to convert + *

+ * @return string Octal string representation of number + * + * @jms-builtin + */ +function decoct ($number) {} + +/** + * Decimal to hexadecimal + * @link http://www.php.net/manual/en/function.dechex.php + * @param number int

+ * Decimal value to convert + *

+ * @return string Hexadecimal string representation of number + * + * @jms-builtin + */ +function dechex ($number) {} + +/** + * Convert a number between arbitrary bases + * @link http://www.php.net/manual/en/function.base-convert.php + * @param number string

+ * The number to convert + *

+ * @param frombase int

+ * The base number is in + *

+ * @param tobase int

+ * The base to convert number to + *

+ * @return string number converted to base tobase + * + * @jms-builtin + */ +function base_convert ($number, $frombase, $tobase) {} + +/** + * Format a number with grouped thousands + * @link http://www.php.net/manual/en/function.number-format.php + * @param number float

+ * The number being formatted. + *

+ * @param decimals int[optional]

+ * Sets the number of decimal points. + *

+ * @return string A formatted version of number. + * + * @jms-builtin + */ +function number_format ($number, $decimals = null) {} + +/** + * Returns the floating point remainder (modulo) of the division + of the arguments + * @link http://www.php.net/manual/en/function.fmod.php + * @param x float

+ * The dividend + *

+ * @param y float

+ * The divisor + *

+ * @return float The floating point remainder of + * x/y + * + * @jms-builtin + */ +function fmod ($x, $y) {} + +/** + * Converts a packed internet address to a human readable representation + * @link http://www.php.net/manual/en/function.inet-ntop.php + * @param in_addr string

+ * A 32bit IPv4, or 128bit IPv6 address. + *

+ * @return string a string representation of the address&return.falseforfailure;. + * + * @jms-builtin + */ +function inet_ntop ($in_addr) {} + +/** + * Converts a human readable IP address to its packed in_addr representation + * @link http://www.php.net/manual/en/function.inet-pton.php + * @param address string

+ * A human readable IPv4 or IPv6 address. + *

+ * @return string the in_addr representation of the given + * address + * + * @jms-builtin + */ +function inet_pton ($address) {} + +/** + * Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address + * @link http://www.php.net/manual/en/function.ip2long.php + * @param ip_address string

+ * A standard format address. + *

+ * @return int the IPv4 address or false if ip_address + * is invalid. + * + * @jms-builtin + */ +function ip2long ($ip_address) {} + +/** + * Converts an (IPv4) Internet network address into a string in Internet standard dotted format + * @link http://www.php.net/manual/en/function.long2ip.php + * @param proper_address string

+ * A proper address representation. + *

+ * @return string the Internet IP address as a string. + * + * @jms-builtin + */ +function long2ip ($proper_address) {} + +/** + * Gets the value of an environment variable + * @link http://www.php.net/manual/en/function.getenv.php + * @param varname string

+ * The variable name. + *

+ * @return string the value of the environment variable + * varname, or false on an error. + * + * @jms-builtin + */ +function getenv ($varname) {} + +/** + * Sets the value of an environment variable + * @link http://www.php.net/manual/en/function.putenv.php + * @param setting string

+ * The setting, like "FOO=BAR" + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function putenv ($setting) {} + +/** + * Gets options from the command line argument list + * @link http://www.php.net/manual/en/function.getopt.php + * @param options string Each character in this string will be used as option characters and + * matched against options passed to the script starting with a single + * hyphen (-). + * For example, an option string "x" recognizes an + * option -x. + * Only a-z, A-Z and 0-9 are allowed. + * @param longopts array[optional] An array of options. Each element in this array will be used as option + * strings and matched against options passed to the script starting with + * two hyphens (--). + * For example, an longopts element "opt" recognizes an + * option --opt. + * Prior to PHP5.3.0 this parameter was only available on few systems + * @return array This function will return an array of option / argument pairs or false on + * failure. + *

+ *

+ * The parsing of options will end at the first non-option found, anything + * that follows is discarded. + * + * @jms-builtin + */ +function getopt ($options, array $longopts = null) {} + +/** + * Gets system load average + * @link http://www.php.net/manual/en/function.sys-getloadavg.php + * @return array an array with three samples (last 1, 5 and 15 + * minutes). + * + * @jms-builtin + */ +function sys_getloadavg () {} + +/** + * Return current Unix timestamp with microseconds + * @link http://www.php.net/manual/en/function.microtime.php + * @param get_as_float bool[optional]

+ * When called without the optional argument, this function returns the string + * "msec sec" where sec is the current time measured in the number of + * seconds since the Unix Epoch (0:00:00 January 1, 1970 GMT), and + * msec is the microseconds part. + * Both portions of the string are returned in units of seconds. + *

+ *

+ * If the optional get_as_float is set to + * true then a float (in seconds) is returned. + *

+ * @return string|float + * + * @jms-builtin + */ +function microtime ($get_as_float = null) {} + +/** + * Get current time + * @link http://www.php.net/manual/en/function.gettimeofday.php + * @param return_float bool[optional]

+ * When set to true, a float instead of an array is returned. + *

+ * @return mixed By default an array is returned. If return_float + * is set, then a float is returned. + *

+ *

+ * Array keys: + * "sec" - seconds since the Unix Epoch + * "usec" - microseconds + * "minuteswest" - minutes west of Greenwich + * "dsttime" - type of dst correction + * + * @jms-builtin + */ +function gettimeofday ($return_float = null) {} + +/** + * Gets the current resource usages + * @link http://www.php.net/manual/en/function.getrusage.php + * @param who int[optional]

+ * If who is 1, getrusage will be called with + * RUSAGE_CHILDREN. + *

+ * @return array an associative array containing the data returned from the system + * call. All entries are accessible by using their documented field names. + * + * @jms-builtin + */ +function getrusage ($who = null) {} + +/** + * Generate a unique ID + * @link http://www.php.net/manual/en/function.uniqid.php + * @param prefix string[optional]

+ * Can be useful, for instance, if you generate identifiers + * simultaneously on several hosts that might happen to generate the + * identifier at the same microsecond. + *

+ *

+ * With an empty prefix, the returned string will + * be 13 characters long. If more_entropy is + * true, it will be 23 characters. + *

+ * @param more_entropy bool[optional]

+ * If set to true, uniqid will add additional + * entropy (using the combined linear congruential generator) at the end + * of the return value, which should make the results more unique. + *

+ * @return string the unique identifier, as a string. + * + * @jms-builtin + */ +function uniqid ($prefix = null, $more_entropy = null) {} + +/** + * Convert a quoted-printable string to an 8 bit string + * @link http://www.php.net/manual/en/function.quoted-printable-decode.php + * @param str string

+ * The input string. + *

+ * @return string the 8-bit binary string. + * + * @jms-builtin + */ +function quoted_printable_decode ($str) {} + +/** + * Convert from one Cyrillic character set to another + * @link http://www.php.net/manual/en/function.convert-cyr-string.php + * @param str string

+ * The string to be converted. + *

+ * @param from string

+ * The source Cyrillic character set, as a single character. + *

+ * @param to string

+ * The target Cyrillic character set, as a single character. + *

+ * @return string the converted string. + * + * @jms-builtin + */ +function convert_cyr_string ($str, $from, $to) {} + +/** + * Gets the name of the owner of the current PHP script + * @link http://www.php.net/manual/en/function.get-current-user.php + * @return string the username as a string. + * + * @jms-builtin + */ +function get_current_user () {} + +/** + * Limits the maximum execution time + * @link http://www.php.net/manual/en/function.set-time-limit.php + * @param seconds int

+ * The maximum execution time, in seconds. If set to zero, no time limit + * is imposed. + *

+ * @return void + * + * @jms-builtin + */ +function set_time_limit ($seconds) {} + +/** + * Gets the value of a PHP configuration option + * @link http://www.php.net/manual/en/function.get-cfg-var.php + * @param option string

+ * The configuration option name. + *

+ * @return string the current value of the PHP configuration variable specified by + * option, or false if an error occurs. + * + * @jms-builtin + */ +function get_cfg_var ($option) {} + +/** + * &Alias; set_magic_quotes_runtime + * @link http://www.php.net/manual/en/function.magic-quotes-runtime.php + * + * @jms-builtin + */ +function magic_quotes_runtime () {} + +/** + * Sets the current active configuration setting of magic_quotes_runtime + * @link http://www.php.net/manual/en/function.set-magic-quotes-runtime.php + * @param new_setting bool

+ * false for off, true for on. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function set_magic_quotes_runtime ($new_setting) {} + +/** + * Gets the current configuration setting of magic_quotes_gpc + * @link http://www.php.net/manual/en/function.get-magic-quotes-gpc.php + * @return int 0 if magic_quotes_gpc is off, 1 otherwise. + * + * @jms-builtin + */ +function get_magic_quotes_gpc () {} + +/** + * Gets the current active configuration setting of magic_quotes_runtime + * @link http://www.php.net/manual/en/function.get-magic-quotes-runtime.php + * @return int 0 if magic_quotes_runtime is off, 1 otherwise. + * + * @jms-builtin + */ +function get_magic_quotes_runtime () {} + +/** + * Import GET/POST/Cookie variables into the global scope + * @link http://www.php.net/manual/en/function.import-request-variables.php + * @param types string

+ * Using the types parameter, you can specify + * which request variables to import. You can use 'G', 'P' and 'C' + * characters respectively for GET, POST and Cookie. These characters are + * not case sensitive, so you can also use any combination of 'g', 'p' + * and 'c'. POST includes the POST uploaded file information. + *

+ *

+ * Note that the order of the letters matters, as when using + * "GP", the + * POST variables will overwrite GET variables with the same name. Any + * other letters than GPC are discarded. + *

+ * @param prefix string[optional]

+ * Variable name prefix, prepended before all variable's name imported + * into the global scope. So if you have a GET value named + * "userid", and provide a prefix + * "pref_", then you'll get a global variable named + * $pref_userid. + *

+ *

+ * Although the prefix parameter is optional, you + * will get an E_NOTICE level + * error if you specify no prefix, or specify an empty string as a + * prefix. This is a possible security hazard. Notice level errors are + * not displayed using the default error reporting level. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function import_request_variables ($types, $prefix = null) {} + +/** + * Send an error message somewhere + * @link http://www.php.net/manual/en/function.error-log.php + * @param message string

+ * The error message that should be logged. + *

+ * @param message_type int[optional]

+ * Says where the error should go. The possible message types are as + * follows: + *

+ *

+ * + * error_log log types + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
0 + * message is sent to PHP's system logger, using + * the Operating System's system logging mechanism or a file, depending + * on what the error_log + * configuration directive is set to. This is the default option. + *
1 + * message is sent by email to the address in + * the destination parameter. This is the only + * message type where the fourth parameter, + * extra_headers is used. + *
2 + * No longer an option. + *
3 + * message is appended to the file + * destination. A newline is not automatically + * added to the end of the message string. + *
4 + * message is sent directly to the SAPI logging + * handler. + *
+ *

+ * @param destination string[optional]

+ * The destination. Its meaning depends on the + * message_type parameter as described above. + *

+ * @param extra_headers string[optional]

+ * The extra headers. It's used when the message_type + * parameter is set to 1. + * This message type uses the same internal function as + * mail does. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function error_log ($message, $message_type = null, $destination = null, $extra_headers = null) {} + +/** + * Get the last occurred error + * @link http://www.php.net/manual/en/function.error-get-last.php + * @return array an associative array describing the last error with keys "type", + * "message", "file" and "line". Returns &null; if there hasn't been an error + * yet. + * + * @jms-builtin + */ +function error_get_last () {} + +/** + * Call a user function given by the first parameter + * @link http://www.php.net/manual/en/function.call-user-func.php + * @param function callback

+ * The function to be called. Class methods may also be invoked + * statically using this function by passing + * array($classname, $methodname) to this parameter. + * Additionally class methods of an object instance may be called by passing + * array($objectinstance, $methodname) to this parameter. + *

+ * @param parameter mixed[optional]

+ * Zero or more parameters to be passed to the function. + *

+ *

+ * Note that the parameters for call_user_func are + * not passed by reference. + * call_user_func example and references + * ]]> + * &example.outputs; + *

+ * @param _ mixed[optional] + * @return mixed the function result, or false on error. + * + * @jms-builtin + */ +function call_user_func ($function, $parameter = null, $_ = null) {} + +/** + * Call a user function given with an array of parameters + * @link http://www.php.net/manual/en/function.call-user-func-array.php + * @param function callback

+ * The function to be called. + *

+ * @param param_arr array

+ * The parameters to be passed to the function, as an indexed array. + *

+ * @return mixed the function result, or false on error. + * + * @jms-builtin + */ +function call_user_func_array ($function, array $param_arr) {} + +/** + * Call a user method on an specific object [deprecated] + * @link http://www.php.net/manual/en/function.call-user-method.php + * @param method_name string

+ * The method name being called. + *

+ * @param obj object

+ * The object that method_name + * is being called on. + *

+ * @param parameter mixed[optional] + * @param _ mixed[optional] + * @return mixed + * + * @jms-builtin + */ +function call_user_method ($method_name, &$obj, $parameter = null, $_ = null) {} + +/** + * Call a user method given with an array of parameters [deprecated] + * @link http://www.php.net/manual/en/function.call-user-method-array.php + * @param method_name string

+ * The method name being called. + *

+ * @param obj object

+ * The object that method_name + * is being called on. + *

+ * @param params array

+ * An array of parameters. + *

+ * @return mixed + * + * @jms-builtin + */ +function call_user_method_array ($method_name, &$obj, array $params) {} + +/** + * Generates a storable representation of a value + * @link http://www.php.net/manual/en/function.serialize.php + * @param value mixed

+ * The value to be serialized. serialize + * handles all types, except the resource-type. + * You can even serialize arrays that contain + * references to itself. Circular references inside the array/object you + * are serializing will also be stored. Any other + * reference will be lost. + *

+ *

+ * When serializing objects, PHP will attempt to call the member function + * __sleep prior to serialization. + * This is to allow the object to do any last minute clean-up, etc. prior + * to being serialized. Likewise, when the object is restored using + * unserialize the __wakeup member function is called. + *

+ *

+ * Object's private members have the class name prepended to the member + * name; protected members have a '*' prepended to the member name. + * These prepended values have null bytes on either side. + *

+ * @return string a string containing a byte-stream representation of + * value that can be stored anywhere. + * + * @jms-builtin + */ +function serialize ($value) {} + +/** + * Creates a PHP value from a stored representation + * @link http://www.php.net/manual/en/function.unserialize.php + * @param str string

+ * The serialized string. + *

+ *

+ * If the variable being unserialized is an object, after successfully + * reconstructing the object PHP will automatically attempt to call the + * __wakeup member function (if it exists). + *

+ *

+ * unserialize_callback_func directive + *

+ * It's possible to set a callback-function which will be called, + * if an undefined class should be instantiated during unserializing. + * (to prevent getting an incomplete object "__PHP_Incomplete_Class".) + * Use your &php.ini;, ini_set or &htaccess; + * to define 'unserialize_callback_func'. Everytime an undefined class + * should be instantiated, it'll be called. To disable this feature just + * empty this setting. + *

+ *

+ * @return mixed The converted value is returned, and can be a boolean, + * integer, float, string, + * array or object. + *

+ *

+ * In case the passed string is not unserializeable, false is returned and + * E_NOTICE is issued. + * + * @jms-builtin + */ +function unserialize ($str) {} + +/** + * Dumps information about a variable + * @link http://www.php.net/manual/en/function.var-dump.php + * @param expression mixed

+ * The variable you want to export. + *

+ * @param expression mixed[optional] + * @return void + * + * @jms-builtin + */ +function var_dump ($expression, $expression = null) {} + +/** + * Outputs or returns a parsable string representation of a variable + * @link http://www.php.net/manual/en/function.var-export.php + * @param expression mixed

+ * The variable you want to export. + *

+ * @param return bool[optional]

+ * If used and set to true, var_export will return + * the variable representation instead of outputing it. + *

+ * ¬e.uses-ob; + * @return string|null the variable representation when the return + * parameter is used and evaluates to true. Otherwise, this function will + * return &null;. + * + * @jms-builtin + */ +function var_export ($expression, $return = null) {} + +/** + * Dumps a string representation of an internal zend value to output + * @link http://www.php.net/manual/en/function.debug-zval-dump.php + * @param variable mixed

+ * The variable being evaluated. + *

+ * @return void + * + * @jms-builtin + */ +function debug_zval_dump ($variable) {} + +/** + * Prints human-readable information about a variable + * @link http://www.php.net/manual/en/function.print-r.php + * @param expression mixed

+ * The expression to be printed. + *

+ * @param return bool[optional]

+ * If you would like to capture the output of print_r, + * use the return parameter. When this parameter is set + * to true, print_r will return the information rather than print it. + *

+ * @return mixed If given a string, integer or float, + * the value itself will be printed. If given an array, values + * will be presented in a format that shows keys and elements. Similar + * notation is used for objects. + *

+ *

+ * When the return parameter is true, this function + * will return a string. Otherwise, the return value is true. + * + * @jms-builtin + */ +function print_r ($expression, $return = null) {} + +/** + * Returns the amount of memory allocated to PHP + * @link http://www.php.net/manual/en/function.memory-get-usage.php + * @param real_usage bool[optional]

+ * Set this to true to get the real size of memory allocated from + * system. If not set or false only the memory used by + * emalloc() is reported. + *

+ * @return int the memory amount in bytes. + * + * @jms-builtin + */ +function memory_get_usage ($real_usage = null) {} + +/** + * Returns the peak of memory allocated by PHP + * @link http://www.php.net/manual/en/function.memory-get-peak-usage.php + * @param real_usage bool[optional]

+ * Set this to true to get the real size of memory allocated from + * system. If not set or false only the memory used by + * emalloc() is reported. + *

+ * @return int the memory peak in bytes. + * + * @jms-builtin + */ +function memory_get_peak_usage ($real_usage = null) {} + +/** + * Register a function for execution on shutdown + * @link http://www.php.net/manual/en/function.register-shutdown-function.php + * @param function callback

+ * The shutdown function to register. + *

+ *

+ * The shutdown functions are called as the part of the request so that + * it's possible to send the output from them. There is currently no way + * to process the data with output buffering functions in the shutdown + * function. + *

+ *

+ * Shutdown functions are called after closing all opened output buffers + * thus, for example, its output will not be compressed if zlib.output_compression is + * enabled. + *

+ * @param parameter mixed[optional]

+ * It is possible to pass parameters to the shutdown function by passing + * additional parameters. + *

+ * @param _ mixed[optional] + * @return void + * + * @jms-builtin + */ +function register_shutdown_function ($function, $parameter = null, $_ = null) {} + +/** + * Register a function for execution on each tick + * @link http://www.php.net/manual/en/function.register-tick-function.php + * @param function callback

+ * The function name as a string, or an array consisting of an object and + * a method. + *

+ * @param arg mixed[optional]

+ *

+ * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function register_tick_function ($function, $arg = null, $_ = null) {} + +/** + * De-register a function for execution on each tick + * @link http://www.php.net/manual/en/function.unregister-tick-function.php + * @param function_name string

+ * The function name, as a string. + *

+ * @return void + * + * @jms-builtin + */ +function unregister_tick_function ($function_name) {} + +/** + * Syntax highlighting of a file + * @link http://www.php.net/manual/en/function.highlight-file.php + * @param filename string

+ * Path to the PHP file to be highlighted. + *

+ * @param return bool[optional]

+ * Set this parameter to true to make this function return the + * highlighted code. + *

+ * @return mixed If return is set to true, returns the highlighted + * code as a string instead of printing it out. Otherwise, it will return + * true on success, false on failure. + * + * @jms-builtin + */ +function highlight_file ($filename, $return = null) {} + +/** + * &Alias; highlight_file + * @link http://www.php.net/manual/en/function.show-source.php + * @param file_name + * @param return[optional] + * + * @jms-builtin + */ +function show_source ($file_name, $return) {} + +/** + * Syntax highlighting of a string + * @link http://www.php.net/manual/en/function.highlight-string.php + * @param str string

+ * The PHP code to be highlighted. This should include the opening tag. + *

+ * @param return bool[optional]

+ * Set this parameter to true to make this function return the + * highlighted code. + *

+ * @return mixed If return is set to true, returns the highlighted + * code as a string instead of printing it out. Otherwise, it will return + * true on success, false on failure. + * + * @jms-builtin + */ +function highlight_string ($str, $return = null) {} + +/** + * Return source with stripped comments and whitespace + * @link http://www.php.net/manual/en/function.php-strip-whitespace.php + * @param filename string

+ * Path to the PHP file. + *

+ * @return string The stripped source code will be returned on success, or an empty string + * on failure. + *

+ *

+ * This function works as described as of PHP 5.0.1. Before this it would + * only return an empty string. For more information on this bug and its + * prior behavior, see bug report + * #29606. + * + * @jms-builtin + */ +function php_strip_whitespace ($filename) {} + +/** + * Gets the value of a configuration option + * @link http://www.php.net/manual/en/function.ini-get.php + * @param varname string

+ * The configuration option name. + *

+ * @return string the value of the configuration option as a string on success, or + * an empty string on failure or for null values. + * + * @jms-builtin + */ +function ini_get ($varname) {} + +/** + * Gets all configuration options + * @link http://www.php.net/manual/en/function.ini-get-all.php + * @param extension string[optional]

+ * An optional extension name. If set, the function return only options + * specific for that extension. + *

+ * @param details bool[optional]

+ * Retrieve details settings or only the current value for each setting. + * Default is true (retrieve details). + *

+ * @return array an associative array with directive name as the array key. + *

+ *

+ * When details is true (default) the array will + * contain global_value (set in + * &php.ini;), local_value (perhaps set with + * ini_set or &htaccess;), and + * access (the access level). + *

+ *

+ * When details is false the value will be the + * current value of the option. + *

+ *

+ * See the manual section + * for information on what access levels mean. + *

+ *

+ * It's possible for a directive to have multiple access levels, which is + * why access shows the appropriate bitmask values. + * + * @jms-builtin + */ +function ini_get_all ($extension = null, $details = null) {} + +/** + * Sets the value of a configuration option + * @link http://www.php.net/manual/en/function.ini-set.php + * @param varname string

+ *

+ *

+ * Not all the available options can be changed using + * ini_set. There is a list of all available options + * in the appendix. + *

+ * @param newvalue string

+ * The new value for the option. + *

+ * @return string the old value on success, false on failure. + * + * @jms-builtin + */ +function ini_set ($varname, $newvalue) {} + +/** + * &Alias; ini_set + * @link http://www.php.net/manual/en/function.ini-alter.php + * @param varname + * @param newvalue + * + * @jms-builtin + */ +function ini_alter ($varname, $newvalue) {} + +/** + * Restores the value of a configuration option + * @link http://www.php.net/manual/en/function.ini-restore.php + * @param varname string

+ * The configuration option name. + *

+ * @return void + * + * @jms-builtin + */ +function ini_restore ($varname) {} + +/** + * Gets the current include_path configuration option + * @link http://www.php.net/manual/en/function.get-include-path.php + * @return string the path, as a string. + * + * @jms-builtin + */ +function get_include_path () {} + +/** + * Sets the include_path configuration option + * @link http://www.php.net/manual/en/function.set-include-path.php + * @param new_include_path string

+ * The new value for the include_path + *

+ * @return string the old include_path on + * success&return.falseforfailure;. + * + * @jms-builtin + */ +function set_include_path ($new_include_path) {} + +/** + * Restores the value of the include_path configuration option + * @link http://www.php.net/manual/en/function.restore-include-path.php + * @return void + * + * @jms-builtin + */ +function restore_include_path () {} + +/** + * Send a cookie + * @link http://www.php.net/manual/en/function.setcookie.php + * @param name string

+ * The name of the cookie. + *

+ * @param value string[optional]

+ * The value of the cookie. This value is stored on the clients + * computer; do not store sensitive information. + * Assuming the name is 'cookiename', this + * value is retrieved through $_COOKIE['cookiename'] + *

+ * @param expire int[optional]

+ * The time the cookie expires. This is a Unix timestamp so is + * in number of seconds since the epoch. In other words, you'll + * most likely set this with the time function + * plus the number of seconds before you want it to expire. Or + * you might use mktime. + * time()+60*60*24*30 will set the cookie to + * expire in 30 days. If set to 0, or omitted, the cookie will expire at + * the end of the session (when the browser closes). + *

+ *

+ *

+ * You may notice the expire parameter takes on a + * Unix timestamp, as opposed to the date format Wdy, DD-Mon-YYYY + * HH:MM:SS GMT, this is because PHP does this conversion + * internally. + *

+ *

+ * expire is compared to the client's time which can + * differ from server's time. + *

+ *

+ * @param path string[optional]

+ * The path on the server in which the cookie will be available on. + * If set to '/', the cookie will be available + * within the entire domain. If set to + * '/foo/', the cookie will only be available + * within the /foo/ directory and all + * sub-directories such as /foo/bar/ of + * domain. The default value is the + * current directory that the cookie is being set in. + *

+ * @param domain string[optional]

+ * The domain that the cookie is available. + * To make the cookie available on all subdomains of example.com + * then you'd set it to '.example.com'. The + * . is not required but makes it compatible + * with more browsers. Setting it to www.example.com + * will make the cookie only available in the www + * subdomain. Refer to tail matching in the + * spec for details. + *

+ * @param secure bool[optional]

+ * Indicates that the cookie should only be transmitted over a + * secure HTTPS connection from the client. When set to true, the + * cookie will only be set if a secure connection exists. + * On the server-side, it's on the programmer to send this + * kind of cookie only on secure connection (e.g. with respect to + * $_SERVER["HTTPS"]). + *

+ * @param httponly bool[optional]

+ * When true the cookie will be made accessible only through the HTTP + * protocol. This means that the cookie won't be accessible by + * scripting languages, such as JavaScript. This setting can effectively + * help to reduce identity theft through XSS attacks (although it is + * not supported by all browsers). Added in PHP 5.2.0. + * true or false + *

+ * @return bool If output exists prior to calling this function, + * setcookie will fail and return false. If + * setcookie successfully runs, it will return true. + * This does not indicate whether the user accepted the cookie. + * + * @jms-builtin + */ +function setcookie ($name, $value = null, $expire = null, $path = null, $domain = null, $secure = null, $httponly = null) {} + +/** + * Send a cookie without urlencoding the cookie value + * @link http://www.php.net/manual/en/function.setrawcookie.php + * @param name string + * @param value string[optional] + * @param expire int[optional] + * @param path string[optional] + * @param domain string[optional] + * @param secure bool[optional] + * @param httponly bool[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function setrawcookie ($name, $value = null, $expire = null, $path = null, $domain = null, $secure = null, $httponly = null) {} + +/** + * Send a raw HTTP header + * @link http://www.php.net/manual/en/function.header.php + * @param string string

+ * The header string. + *

+ *

+ * There are two special-case header calls. The first is a header + * that starts with the string "HTTP/" (case is not + * significant), which will be used to figure out the HTTP status + * code to send. For example, if you have configured Apache to + * use a PHP script to handle requests for missing files (using + * the ErrorDocument directive), you may want to + * make sure that your script generates the proper status code. + *

+ *

+ * ]]> + *

+ *

+ * The second special case is the "Location:" header. Not only does + * it send this header back to the browser, but it also returns a + * REDIRECT (302) status code to the browser + * unless the 201 or + * a 3xx status code has already been set. + *

+ *

+ * ]]> + *

+ * @param replace bool[optional]

+ * The optional replace parameter indicates + * whether the header should replace a previous similar header, or + * add a second header of the same type. By default it will replace, + * but if you pass in false as the second argument you can force + * multiple headers of the same type. For example: + *

+ *

+ * ]]> + *

+ * @param http_response_code int[optional]

+ * Forces the HTTP response code to the specified value. + *

+ * @return void + * + * @jms-builtin + */ +function header ($string, $replace = null, $http_response_code = null) {} + +/** + * Checks if or where headers have been sent + * @link http://www.php.net/manual/en/function.headers-sent.php + * @param file string[optional]

+ * If the optional file and + * line parameters are set, + * headers_sent will put the PHP source file name + * and line number where output started in the file + * and line variables. + *

+ * @param line int[optional]

+ * The line number where the output started. + *

+ * @return bool headers_sent will return false if no HTTP headers + * have already been sent or true otherwise. + * + * @jms-builtin + */ +function headers_sent (&$file = null, &$line = null) {} + +/** + * Returns a list of response headers sent (or ready to send) + * @link http://www.php.net/manual/en/function.headers-list.php + * @return array a numerically indexed array of headers. + * + * @jms-builtin + */ +function headers_list () {} + +/** + * Check whether client disconnected + * @link http://www.php.net/manual/en/function.connection-aborted.php + * @return int 1 if client disconnected, 0 otherwise. + * + * @jms-builtin + */ +function connection_aborted () {} + +/** + * Returns connection status bitfield + * @link http://www.php.net/manual/en/function.connection-status.php + * @return int the connection status bitfield, which can be used against the + * CONNECTION_XXX constants to determine the connection + * status. + * + * @jms-builtin + */ +function connection_status () {} + +/** + * Set whether a client disconnect should abort script execution + * @link http://www.php.net/manual/en/function.ignore-user-abort.php + * @param value string[optional]

+ * If set, this function will set the ignore_user_abort ini setting + * to the given value. If not, this function will + * only return the previous setting without changing it. + *

+ * @return int the previous setting, as an integer. + * + * @jms-builtin + */ +function ignore_user_abort ($value = null) {} + +/** + * Parse a configuration file + * @link http://www.php.net/manual/en/function.parse-ini-file.php + * @param filename string

+ * The filename of the ini file being parsed. + *

+ * @param process_sections bool[optional]

+ * By setting the process_sections + * parameter to true, you get a multidimensional array, with + * the section names and settings included. The default + * for process_sections is false + *

+ * @param scanner_mode int[optional]

+ * Can either be INI_SCANNER_NORMAL (default) or + * INI_SCANNER_RAW. If INI_SCANNER_RAW + * is supplied, then option values will not be parsed. + *

+ * @return array The settings are returned as an associative array on success, + * and false on failure. + * + * @jms-builtin + */ +function parse_ini_file ($filename, $process_sections = null, $scanner_mode = null) {} + +/** + * Tells whether the file was uploaded via HTTP POST + * @link http://www.php.net/manual/en/function.is-uploaded-file.php + * @param filename string

+ * The filename being checked. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function is_uploaded_file ($filename) {} + +/** + * Moves an uploaded file to a new location + * @link http://www.php.net/manual/en/function.move-uploaded-file.php + * @param filename string

+ * The filename of the uploaded file. + *

+ * @param destination string

+ * The destination of the moved file. + *

+ * @return bool If filename is not a valid upload file, + * then no action will occur, and + * move_uploaded_file will return + * false. + *

+ *

+ * If filename is a valid upload file, but + * cannot be moved for some reason, no action will occur, and + * move_uploaded_file will return + * false. Additionally, a warning will be issued. + * + * @jms-builtin + */ +function move_uploaded_file ($filename, $destination) {} + +/** + * Get the Internet host name corresponding to a given IP address + * @link http://www.php.net/manual/en/function.gethostbyaddr.php + * @param ip_address string

+ * The host IP address. + *

+ * @return string the host name or the unmodified ip_address + * on failure. + * + * @jms-builtin + */ +function gethostbyaddr ($ip_address) {} + +/** + * Get the IPv4 address corresponding to a given Internet host name + * @link http://www.php.net/manual/en/function.gethostbyname.php + * @param hostname string

+ * The host name. + *

+ * @return string the IPv4 address or a string containing the unmodified + * hostname on failure. + * + * @jms-builtin + */ +function gethostbyname ($hostname) {} + +/** + * Get a list of IPv4 addresses corresponding to a given Internet host + name + * @link http://www.php.net/manual/en/function.gethostbynamel.php + * @param hostname string

+ * The host name. + *

+ * @return array an array of IPv4 addresses or false if + * hostname could not be resolved. + * + * @jms-builtin + */ +function gethostbynamel ($hostname) {} + +/** + * &Alias; checkdnsrr + * @link http://www.php.net/manual/en/function.dns-check-record.php + * @param host + * @param type[optional] + * + * @jms-builtin + */ +function dns_check_record ($host, $type) {} + +/** + * Check DNS records corresponding to a given Internet host name or IP address + * @link http://www.php.net/manual/en/function.checkdnsrr.php + * @param host string

+ * host may either be the IP address in + * dotted-quad notation or the host name. + *

+ * @param type string[optional]

+ * type may be any one of: A, MX, NS, SOA, + * PTR, CNAME, AAAA, A6, SRV, NAPTR, TXT or ANY. + *

+ * @return bool true if any records are found; returns false if no records + * were found or if an error occurred. + * + * @jms-builtin + */ +function checkdnsrr ($host, $type = null) {} + +/** + * &Alias; getmxrr + * @link http://www.php.net/manual/en/function.dns-get-mx.php + * @param hostname + * @param mxhosts + * @param weight[optional] + * + * @jms-builtin + */ +function dns_get_mx ($hostname, &$mxhosts, &$weight) {} + +/** + * Get MX records corresponding to a given Internet host name + * @link http://www.php.net/manual/en/function.getmxrr.php + * @param hostname string

+ * The Internet host name. + *

+ * @param mxhosts array

+ * A list of the MX records found is placed into the array + * mxhosts. + *

+ * @param weight array[optional]

+ * If the weight array is given, it will be filled + * with the weight information gathered. + *

+ * @return bool true if any records are found; returns false if no records + * were found or if an error occurred. + * + * @jms-builtin + */ +function getmxrr ($hostname, array &$mxhosts, array &$weight = null) {} + +/** + * Fetch DNS Resource Records associated with a hostname + * @link http://www.php.net/manual/en/function.dns-get-record.php + * @param hostname string

+ * hostname should be a valid DNS hostname such + * as "www.example.com". Reverse lookups can be generated + * using in-addr.arpa notation, but + * gethostbyaddr is more suitable for + * the majority of reverse lookups. + *

+ *

+ * Per DNS standards, email addresses are given in user.host format (for + * example: hostmaster.example.com as opposed to hostmaster@example.com), + * be sure to check this value and modify if necessary before using it + * with a functions such as mail. + *

+ * @param type int[optional]

+ * By default, dns_get_record will search for any + * resource records associated with hostname. + * To limit the query, specify the optional type + * parameter. May be any one of the following: + * DNS_A, DNS_CNAME, + * DNS_HINFO, DNS_MX, + * DNS_NS, DNS_PTR, + * DNS_SOA, DNS_TXT, + * DNS_AAAA, DNS_SRV, + * DNS_NAPTR, DNS_A6, + * DNS_ALL or DNS_ANY. + *

+ *

+ * Because of eccentricities in the performance of libresolv + * between platforms, DNS_ANY will not + * always return every record, the slower DNS_ALL + * will collect all records more reliably. + *

+ * @param authns array[optional]

+ * Passed by reference and, if given, will be populated with Resource + * Records for the Authoritative Name Servers. + *

+ * @param addtl array[optional]

+ * Passed by reference and, if given, will be populated with any + * Additional Records. + *

+ * @return array This function returns an array of associative arrays. Each associative array contains + * at minimum the following keys: + * + * Basic DNS attributes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
AttributeMeaning
host + * The record in the DNS namespace to which the rest of the associated data refers. + *
class + * dns_get_record only returns Internet class records and as + * such this parameter will always return IN. + *
type + * String containing the record type. Additional attributes will also be contained + * in the resulting array dependant on the value of type. See table below. + *
ttl + * "Time To Live" remaining for this record. This will not equal + * the record's original ttl, but will rather equal the original ttl minus whatever + * length of time has passed since the authoritative name server was queried. + *
+ *

+ *

+ * + * Other keys in associative arrays dependant on 'type' + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeExtra Columns
A + * ip: An IPv4 addresses in dotted decimal notation. + *
MX + * pri: Priority of mail exchanger. + * Lower numbers indicate greater priority. + * target: FQDN of the mail exchanger. + * See also dns_get_mx. + *
CNAME + * target: FQDN of location in DNS namespace to which + * the record is aliased. + *
NS + * target: FQDN of the name server which is authoritative + * for this hostname. + *
PTR + * target: Location within the DNS namespace to which + * this record points. + *
TXT + * txt: Arbitrary string data associated with this record. + *
HINFO + * cpu: IANA number designating the CPU of the machine + * referenced by this record. + * os: IANA number designating the Operating System on + * the machine referenced by this record. + * See IANA's Operating System + * Names for the meaning of these values. + *
SOA + * mname: FQDN of the machine from which the resource + * records originated. + * rname: Email address of the administrative contain + * for this domain. + * serial: Serial # of this revision of the requested + * domain. + * refresh: Refresh interval (seconds) secondary name + * servers should use when updating remote copies of this domain. + * retry: Length of time (seconds) to wait after a + * failed refresh before making a second attempt. + * expire: Maximum length of time (seconds) a secondary + * DNS server should retain remote copies of the zone data without a + * successful refresh before discarding. + * minimum-ttl: Minimum length of time (seconds) a + * client can continue to use a DNS resolution before it should request + * a new resolution from the server. Can be overridden by individual + * resource records. + *
AAAA + * ipv6: IPv6 address + *
A6(PHP >= 5.1.0) + * masklen: Length (in bits) to inherit from the target + * specified by chain. + * ipv6: Address for this specific record to merge with + * chain. + * chain: Parent record to merge with + * ipv6 data. + *
SRV + * pri: (Priority) lowest priorities should be used first. + * weight: Ranking to weight which of commonly prioritized + * targets should be chosen at random. + * target and port: hostname and port + * where the requested service can be found. + * For additional information see: RFC 2782 + *
NAPTR + * order and pref: Equivalent to + * pri and weight above. + * flags, services, regex, + * and replacement: Parameters as defined by + * RFC 2915. + *
+ * + * @jms-builtin + */ +function dns_get_record ($hostname, $type = null, array &$authns = null, array &$addtl = null) {} + +/** + * Get the integer value of a variable + * @link http://www.php.net/manual/en/function.intval.php + * @param var mixed

+ * The scalar value being converted to an integer + *

+ * @param base int[optional]

+ * The base for the conversion + *

+ * @return int The integer value of var on success, or 0 on + * failure. Empty arrays and objects return 0, non-empty arrays and + * objects return 1. + *

+ *

+ * The maximum value depends on the system. 32 bit systems have a + * maximum signed integer range of -2147483648 to 2147483647. So for example + * on such a system, intval('1000000000000') will return + * 2147483647. The maximum signed integer value for 64 bit systems is + * 9223372036854775807. + *

+ *

+ * Strings will most likely return 0 although this depends on the + * leftmost characters of the string. The common rules of + * integer casting + * apply. + * + * @jms-builtin + */ +function intval ($var, $base = null) {} + +/** + * Get float value of a variable + * @link http://www.php.net/manual/en/function.floatval.php + * @param var mixed

+ * May be any scalar type. floatval should not be used + * on objects, as doing so will emit an E_NOTICE level + * error and return 1. + *

+ * @return float The float value of the given variable. Empty arrays return 0, non-empty + * arrays return 1. + * + * @jms-builtin + */ +function floatval ($var) {} + +/** + * &Alias; floatval + * @link http://www.php.net/manual/en/function.doubleval.php + * @param var + * + * @jms-builtin + */ +function doubleval ($var) {} + +/** + * Get string value of a variable + * @link http://www.php.net/manual/en/function.strval.php + * @param var mixed

+ * The variable that is being converted to a string. + *

+ *

+ * var may be any scalar type. You cannot use + * strval on arrays or objects. + *

+ * @return string The string value of var. + * + * @jms-builtin + */ +function strval ($var) {} + +/** + * Get the type of a variable + * @link http://www.php.net/manual/en/function.gettype.php + * @param var mixed

+ * The variable being type checked. + *

+ * @return string Possibles values for the returned string are: + * "boolean" + * "integer" + * "double" (for historical reasons "double" is + * returned in case of a float, and not simply + * "float") + * "string" + * "array" + * "object" + * "resource" + * "NULL" + * "unknown type" + * + * @jms-builtin + */ +function gettype ($var) {} + +/** + * Set the type of a variable + * @link http://www.php.net/manual/en/function.settype.php + * @param var mixed

+ * The variable being converted. + *

+ * @param type string

+ * Possibles values of type are: + * "boolean" (or, since PHP 4.2.0, "bool") + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function settype (&$var, $type) {} + +/** + * Finds whether a variable is &null; + * @link http://www.php.net/manual/en/function.is-null.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is null, false + * otherwise. + * + * @jms-builtin + */ +function is_null ($var) {} + +/** + * Finds whether a variable is a resource + * @link http://www.php.net/manual/en/function.is-resource.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is a resource, + * false otherwise. + * + * @jms-builtin + */ +function is_resource ($var) {} + +/** + * Finds out whether a variable is a boolean + * @link http://www.php.net/manual/en/function.is-bool.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is a boolean, + * false otherwise. + * + * @jms-builtin + */ +function is_bool ($var) {} + +/** + * &Alias; is_int + * @link http://www.php.net/manual/en/function.is-long.php + * @param var + * + * @jms-builtin + */ +function is_long ($var) {} + +/** + * Finds whether the type of a variable is float + * @link http://www.php.net/manual/en/function.is-float.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is a float, + * false otherwise. + * + * @jms-builtin + */ +function is_float ($var) {} + +/** + * Find whether the type of a variable is integer + * @link http://www.php.net/manual/en/function.is-int.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is an integer, + * false otherwise. + * + * @jms-builtin + */ +function is_int ($var) {} + +/** + * &Alias; is_int + * @link http://www.php.net/manual/en/function.is-integer.php + * @param var + * + * @jms-builtin + */ +function is_integer ($var) {} + +/** + * &Alias; is_float + * @link http://www.php.net/manual/en/function.is-double.php + * @param var + * + * @jms-builtin + */ +function is_double ($var) {} + +/** + * &Alias; is_float + * @link http://www.php.net/manual/en/function.is-real.php + * @param var + * + * @jms-builtin + */ +function is_real ($var) {} + +/** + * Finds whether a variable is a number or a numeric string + * @link http://www.php.net/manual/en/function.is-numeric.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is a number or a numeric + * string, false otherwise. + * + * @jms-builtin + */ +function is_numeric ($var) {} + +/** + * Find whether the type of a variable is string + * @link http://www.php.net/manual/en/function.is-string.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is of type string, + * false otherwise. + * + * @jms-builtin + */ +function is_string ($var) {} + +/** + * Finds whether a variable is an array + * @link http://www.php.net/manual/en/function.is-array.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is an array, + * false otherwise. + * + * @jms-builtin + */ +function is_array ($var) {} + +/** + * Finds whether a variable is an object + * @link http://www.php.net/manual/en/function.is-object.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is an object, + * false otherwise. + * + * @jms-builtin + */ +function is_object ($var) {} + +/** + * Finds whether a variable is a scalar + * @link http://www.php.net/manual/en/function.is-scalar.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is a scalar false + * otherwise. + * + * @jms-builtin + */ +function is_scalar ($var) {} + +/** + * Verify that the contents of a variable can be called as a function + * @link http://www.php.net/manual/en/function.is-callable.php + * @param mixed $name

+ * Can be either the name of a function stored in a string variable, or + * an object and the name of a method within the object, like this: + * array($SomeObject, 'MethodName') + *

+ * @param syntax_only bool [optional]

+ * If set to true the function only verifies that + * name might be a function or method. It will only + * reject simple variables that are not strings, or an array that does + * not have a valid structure to be used as a callback. The valid ones + * are supposed to have only 2 entries, the first of which is an object + * or a string, and the second a string. + *

+ * @param callable_name string [optional]

+ * Receives the "callable name". In the example below it is + * "someClass::someMethod". Note, however, that despite the implication + * that someClass::SomeMethod() is a callable static method, this is not + * the case. + *

+ * @return bool true if name is callable, false + * otherwise. + * + * @jms-builtin + */ +function is_callable ($name, $syntax_only = null, &$callable_name = null) {} + +/** + * Regular expression match + * @link http://www.php.net/manual/en/function.ereg.php + * @param pattern string

+ * Case sensitive regular expression. + *

+ * @param string string

+ * The input string. + *

+ * @param regs array[optional]

+ * If matches are found for parenthesized substrings of + * pattern and the function is called with the + * third argument regs, the matches will be stored + * in the elements of the array regs. + *

+ *

+ * $regs[1] will contain the substring which starts at + * the first left parenthesis; $regs[2] will contain + * the substring starting at the second, and so on. + * $regs[0] will contain a copy of the complete string + * matched. + *

+ * @return int the length of the matched string if a match for + * pattern was found in string, + * or false if no matches were found or an error occurred. + *

+ *

+ * If the optional parameter regs was not passed or + * the length of the matched string is 0, this function returns 1. + * + * @jms-builtin + */ +function ereg ($pattern, $string, array &$regs = null) {} + +/** + * Replace regular expression + * @link http://www.php.net/manual/en/function.ereg-replace.php + * @param pattern string

+ * A POSIX extended regular expression. + *

+ * @param replacement string

+ * If pattern contains parenthesized substrings, + * replacement may contain substrings of the form + * \\digit, which will be + * replaced by the text matching the digit'th parenthesized substring; + * \\0 will produce the entire contents of string. + * Up to nine substrings may be used. Parentheses may be nested, in which + * case they are counted by the opening parenthesis. + *

+ * @param string string

+ * The input string. + *

+ * @return string The modified string is returned. If no matches are found in + * string, then it will be returned unchanged. + * + * @jms-builtin + */ +function ereg_replace ($pattern, $replacement, $string) {} + +/** + * Case insensitive regular expression match + * @link http://www.php.net/manual/en/function.eregi.php + * @param pattern string

+ * Case insensitive regular expression. + *

+ * @param string string

+ * The input string. + *

+ * @param regs array[optional]

+ * If matches are found for parenthesized substrings of + * pattern and the function is called with the + * third argument regs, the matches will be stored + * in the elements of the array regs. + *

+ *

+ * $regs[1] will contain the substring which starts at the first left + * parenthesis; $regs[2] will contain the substring starting at the + * second, and so on. $regs[0] will contain a copy of the complete string + * matched. + *

+ * @return int the length of the matched string if a match for + * pattern was found in string, + * or false if no matches were found or an error occurred. + *

+ *

+ * If the optional parameter regs was not passed or + * the length of the matched string is 0, this function returns 1. + * + * @jms-builtin + */ +function eregi ($pattern, $string, array &$regs = null) {} + +/** + * Replace regular expression case insensitive + * @link http://www.php.net/manual/en/function.eregi-replace.php + * @param pattern string

+ * A POSIX extended regular expression. + *

+ * @param replacement string

+ * If pattern contains parenthesized substrings, + * replacement may contain substrings of the form + * \\digit, which will be + * replaced by the text matching the digit'th parenthesized substring; + * \\0 will produce the entire contents of string. + * Up to nine substrings may be used. Parentheses may be nested, in which + * case they are counted by the opening parenthesis. + *

+ * @param string string

+ * The input string. + *

+ * @return string The modified string is returned. If no matches are found in + * string, then it will be returned unchanged. + * + * @jms-builtin + */ +function eregi_replace ($pattern, $replacement, $string) {} + +/** + * Split string into array by regular expression + * @link http://www.php.net/manual/en/function.split.php + * @param pattern string

+ * Case sensitive regular expression. + *

+ *

+ * If you want to split on any of the characters which are considered + * special by regular expressions, you'll need to escape them first. If + * you think split (or any other regex function, for + * that matter) is doing something weird, please read the file + * regex.7, included in the + * regex/ subdirectory of the PHP distribution. It's + * in manpage format, so you'll want to do something along the lines of + * man /usr/local/src/regex/regex.7 in order to read it. + *

+ * @param string string

+ * The input string. + *

+ * @param limit int[optional]

+ * If limit is set, the returned array will + * contain a maximum of limit elements with the + * last element containing the whole rest of + * string. + *

+ * @return array an array of strings, each of which is a substring of + * string formed by splitting it on boundaries formed + * by the case-sensitive regular expression pattern. + *

+ *

+ * If there are n occurrences of + * pattern, the returned array will contain + * n+1 items. For example, if + * there is no occurrence of pattern, an array with + * only one element will be returned. Of course, this is also true if + * string is empty. If an error occurs, + * split returns false. + * + * @jms-builtin + */ +function split ($pattern, $string, $limit = null) {} + +/** + * Split string into array by regular expression case insensitive + * @link http://www.php.net/manual/en/function.spliti.php + * @param pattern string

+ * Case insensitive regular expression. + *

+ *

+ * If you want to split on any of the characters which are considered + * special by regular expressions, you'll need to escape them first. If + * you think spliti (or any other regex function, for + * that matter) is doing something weird, please read the file + * regex.7, included in the + * regex/ subdirectory of the PHP distribution. It's + * in manpage format, so you'll want to do something along the lines of + * man /usr/local/src/regex/regex.7 in order to read it. + *

+ * @param string string

+ * The input string. + *

+ * @param limit int[optional]

+ * If limit is set, the returned array will + * contain a maximum of limit elements with the + * last element containing the whole rest of + * string. + *

+ * @return array an array of strings, each of which is a substring of + * string formed by splitting it on boundaries formed + * by the case insensitive regular expression pattern. + *

+ *

+ * If there are n occurrences of + * pattern, the returned array will contain + * n+1 items. For example, if + * there is no occurrence of pattern, an array with + * only one element will be returned. Of course, this is also true if + * string is empty. If an error occurs, + * spliti returns false. + * + * @jms-builtin + */ +function spliti ($pattern, $string, $limit = null) {} + +/** + * &Alias; implode + * @link http://www.php.net/manual/en/function.join.php + * @param glue + * @param pieces + * + * @jms-builtin + */ +function join ($glue, $pieces) {} + +/** + * Make regular expression for case insensitive match + * @link http://www.php.net/manual/en/function.sql-regcase.php + * @param string string

+ * The input string. + *

+ * @return string a valid regular expression which will match + * string, ignoring case. This expression is + * string with each alphabetic character converted to + * a bracket expression; this bracket expression contains that character's + * uppercase and lowercase form. Other characters remain unchanged. + * + * @jms-builtin + */ +function sql_regcase ($string) {} + +/** + * Loads a PHP extension at runtime + * @link http://www.php.net/manual/en/function.dl.php + * @param library string

+ * This parameter is only the filename of the + * extension to load which also depends on your platform. For example, + * the sockets extension (if compiled + * as a shared module, not the default!) would be called + * sockets.so on Unix platforms whereas it is called + * php_sockets.dll on the Windows platform. + *

+ *

+ * The directory where the extension is loaded from depends on your + * platform: + *

+ *

+ * Windows - If not explicitly set in the &php.ini;, the extension is + * loaded from C:\php4\extensions\ (PHP4) or + * C:\php5\ (PHP5) by default. + *

+ *

+ * Unix - If not explicitly set in the &php.ini;, the default extension + * directory depends on + * whether PHP has been built with --enable-debug + * or not + * @return bool Returns true on success or false on failure. If the functionality of loading modules is not available + * or has been disabled (either by setting + * enable_dl off or by enabling &safemode; + * in &php.ini;) an E_ERROR is emitted + * and execution is stopped. If dl fails because the + * specified library couldn't be loaded, in addition to false an + * E_WARNING message is emitted. + * + * @jms-builtin + */ +function dl ($library) {} + +/** + * Closes process file pointer + * @link http://www.php.net/manual/en/function.pclose.php + * @param handle resource

+ * The file pointer must be valid, and must have been returned by a + * successful call to popen. + *

+ * @return int the termination status of the process that was run. + * + * @jms-builtin + */ +function pclose ($handle) {} + +/** + * Opens process file pointer + * @link http://www.php.net/manual/en/function.popen.php + * @param command string

+ * The command + *

+ * @param mode string

+ * The mode + *

+ * @return resource a file pointer identical to that returned by + * fopen, except that it is unidirectional (may + * only be used for reading or writing) and must be closed with + * pclose. This pointer may be used with + * fgets, fgetss, and + * fwrite. + *

+ *

+ * If an error occurs, returns false. + * + * @jms-builtin + */ +function popen ($command, $mode) {} + +/** + * Outputs a file + * @link http://www.php.net/manual/en/function.readfile.php + * @param filename string

+ * The filename being read. + *

+ * @param use_include_path bool[optional]

+ * You can use the optional second parameter and set it to true, if + * you want to search for the file in the include_path, too. + *

+ * @param context resource[optional]

+ * A context stream resource. + *

+ * @return int the number of bytes read from the file. If an error + * occurs, false is returned and unless the function was called as + * @readfile, an error message is printed. + * + * @jms-builtin + */ +function readfile ($filename, $use_include_path = null, $context = null) {} + +/** + * Rewind the position of a file pointer + * @link http://www.php.net/manual/en/function.rewind.php + * @param handle resource

+ * The file pointer must be valid, and must point to a file + * successfully opened by fopen. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function rewind ($handle) {} + +/** + * Removes directory + * @link http://www.php.net/manual/en/function.rmdir.php + * @param dirname string

+ * Path to the directory. + *

+ * @param context resource[optional] ¬e.context-support; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function rmdir ($dirname, $context = null) {} + +/** + * Changes the current umask + * @link http://www.php.net/manual/en/function.umask.php + * @param mask int[optional]

+ * The new umask. + *

+ * @return int umask without arguments simply returns the + * current umask otherwise the old umask is returned. + * + * @jms-builtin + */ +function umask ($mask = null) {} + +/** + * Closes an open file pointer + * @link http://www.php.net/manual/en/function.fclose.php + * @param handle resource

+ * The file pointer must be valid, and must point to a file successfully + * opened by fopen or fsockopen. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function fclose ($handle) {} + +/** + * Tests for end-of-file on a file pointer + * @link http://www.php.net/manual/en/function.feof.php + * @param handle resource &fs.validfp.all; + * @return bool true if the file pointer is at EOF or an error occurs + * (including socket timeout); otherwise returns false. + * + * @jms-builtin + */ +function feof ($handle) {} + +/** + * Gets character from file pointer + * @link http://www.php.net/manual/en/function.fgetc.php + * @param handle resource &fs.validfp.all; + * @return string a string containing a single character read from the file pointed + * to by handle. Returns false on EOF. + * + * @jms-builtin + */ +function fgetc ($handle) {} + +/** + * Gets line from file pointer + * @link http://www.php.net/manual/en/function.fgets.php + * @param handle resource &fs.validfp.all; + * @param length int[optional]

+ * Reading ends when length - 1 bytes have been + * read, on a newline (which is included in the return value), or on EOF + * (whichever comes first). If no length is specified, it will keep + * reading from the stream until it reaches the end of the line. + *

+ *

+ * Until PHP 4.3.0, omitting it would assume 1024 as the line length. + * If the majority of the lines in the file are all larger than 8KB, + * it is more resource efficient for your script to specify the maximum + * line length. + *

+ * @return string a string of up to length - 1 bytes read from + * the file pointed to by handle. + *

+ *

+ * If an error occurs, returns false. + * + * @jms-builtin + */ +function fgets ($handle, $length = null) {} + +/** + * Gets line from file pointer and strip HTML tags + * @link http://www.php.net/manual/en/function.fgetss.php + * @param handle resource &fs.validfp.all; + * @param length int[optional]

+ * Length of the data to be retrieved. + *

+ * @param allowable_tags string[optional]

+ * You can use the optional third parameter to specify tags which should + * not be stripped. + *

+ * @return string a string of up to length - 1 bytes read from + * the file pointed to by handle, with all HTML and PHP + * code stripped. + *

+ *

+ * If an error occurs, returns false. + * + * @jms-builtin + */ +function fgetss ($handle, $length = null, $allowable_tags = null) {} + +/** + * Binary-safe file read + * @link http://www.php.net/manual/en/function.fread.php + * @param handle resource &fs.file.pointer; + * @param length int

+ * Up to length number of bytes read. + *

+ * @return string the read string &return.falseforfailure;. + * + * @jms-builtin + */ +function fread ($handle, $length) {} + +/** + * Opens file or URL + * @link http://www.php.net/manual/en/function.fopen.php + * @param filename string

+ * If filename is of the form "scheme://...", it + * is assumed to be a URL and PHP will search for a protocol handler + * (also known as a wrapper) for that scheme. If no wrappers for that + * protocol are registered, PHP will emit a notice to help you track + * potential problems in your script and then continue as though + * filename specifies a regular file. + *

+ *

+ * If PHP has decided that filename specifies + * a local file, then it will try to open a stream on that file. + * The file must be accessible to PHP, so you need to ensure that + * the file access permissions allow this access. + * If you have enabled &safemode;, + * or open_basedir further + * restrictions may apply. + *

+ *

+ * If PHP has decided that filename specifies + * a registered protocol, and that protocol is registered as a + * network URL, PHP will check to make sure that + * allow_url_fopen is + * enabled. If it is switched off, PHP will emit a warning and + * the fopen call will fail. + *

+ *

+ * The list of supported protocols can be found in . Some protocols (also referred to as + * wrappers) support context + * and/or &php.ini; options. Refer to the specific page for the + * protocol in use for a list of options which can be set. (e.g. + * &php.ini; value user_agent used by the + * http wrapper). + *

+ *

+ * On the Windows platform, be careful to escape any backslashes + * used in the path to the file, or use forward slashes. + * ]]> + *

+ * @param mode string

+ * The mode parameter specifies the type of access + * you require to the stream. It may be any of the following: + * + * A list of possible modes for fopen + * using mode + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
modeDescription
'r' + * Open for reading only; place the file pointer at the + * beginning of the file. + *
'r+' + * Open for reading and writing; place the file pointer at + * the beginning of the file. + *
'w' + * Open for writing only; place the file pointer at the + * beginning of the file and truncate the file to zero length. + * If the file does not exist, attempt to create it. + *
'w+' + * Open for reading and writing; place the file pointer at + * the beginning of the file and truncate the file to zero + * length. If the file does not exist, attempt to create it. + *
'a' + * Open for writing only; place the file pointer at the end of + * the file. If the file does not exist, attempt to create it. + *
'a+' + * Open for reading and writing; place the file pointer at + * the end of the file. If the file does not exist, attempt to + * create it. + *
'x' + * Create and open for writing only; place the file pointer at the + * beginning of the file. If the file already exists, the + * fopen call will fail by returning false and + * generating an error of level E_WARNING. If + * the file does not exist, attempt to create it. This is equivalent + * to specifying O_EXCL|O_CREAT flags for the + * underlying open(2) system call. + *
'x+' + * Create and open for reading and writing; place the file pointer at + * the beginning of the file. If the file already exists, the + * fopen call will fail by returning false and + * generating an error of level E_WARNING. If + * the file does not exist, attempt to create it. This is equivalent + * to specifying O_EXCL|O_CREAT flags for the + * underlying open(2) system call. + *
+ *

+ *

+ * Different operating system families have different line-ending + * conventions. When you write a text file and want to insert a line + * break, you need to use the correct line-ending character(s) for your + * operating system. Unix based systems use \n as the + * line ending character, Windows based systems use \r\n + * as the line ending characters and Macintosh based systems use + * \r as the line ending character. + *

+ *

+ * If you use the wrong line ending characters when writing your files, you + * might find that other applications that open those files will "look + * funny". + *

+ *

+ * Windows offers a text-mode translation flag ('t') + * which will transparently translate \n to + * \r\n when working with the file. In contrast, you + * can also use 'b' to force binary mode, which will not + * translate your data. To use these flags, specify either + * 'b' or 't' as the last character + * of the mode parameter. + *

+ *

+ * The default translation mode depends on the SAPI and version of PHP that + * you are using, so you are encouraged to always specify the appropriate + * flag for portability reasons. You should use the 't' + * mode if you are working with plain-text files and you use + * \n to delimit your line endings in your script, but + * expect your files to be readable with applications such as notepad. You + * should use the 'b' in all other cases. + *

+ *

+ * If you do not specify the 'b' flag when working with binary files, you + * may experience strange problems with your data, including broken image + * files and strange problems with \r\n characters. + *

+ *

+ * For portability, it is strongly recommended that you always + * use the 'b' flag when opening files with fopen. + *

+ *

+ * Again, for portability, it is also strongly recommended that + * you re-write code that uses or relies upon the 't' + * mode so that it uses the correct line endings and + * 'b' mode instead. + *

+ * @param use_include_path bool[optional]

+ * The optional third use_include_path parameter + * can be set to '1' or true if you want to search for the file in the + * include_path, too. + *

+ * @param context resource[optional] ¬e.context-support; + * @return resource a file pointer resource on success, or false on error. + * + * @jms-builtin + */ +function fopen ($filename, $mode, $use_include_path = null, $context = null) {} + +/** + * Output all remaining data on a file pointer + * @link http://www.php.net/manual/en/function.fpassthru.php + * @param handle resource &fs.validfp.all; + * @return int If an error occurs, fpassthru returns + * false. Otherwise, fpassthru returns + * the number of characters read from handle + * and passed through to the output. + * + * @jms-builtin + */ +function fpassthru ($handle) {} + +/** + * Truncates a file to a given length + * @link http://www.php.net/manual/en/function.ftruncate.php + * @param handle resource

+ * The file pointer. + *

+ *

+ * The handle must be open for writing. + *

+ * @param size int

+ * The size to truncate to. + *

+ *

+ * If size is larger than the file it is extended + * with null bytes. + *

+ *

+ * If size is smaller than the extra data + * will be lost. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftruncate ($handle, $size) {} + +/** + * Gets information about a file using an open file pointer + * @link http://www.php.net/manual/en/function.fstat.php + * @param handle resource &fs.file.pointer; + * @return array an array with the statistics of the file; the format of the array + * is described in detail on the stat manual page. + * + * @jms-builtin + */ +function fstat ($handle) {} + +/** + * Seeks on a file pointer + * @link http://www.php.net/manual/en/function.fseek.php + * @param handle resource &fs.file.pointer; + * @param offset int

+ * The offset. + *

+ *

+ * To move to a position before the end-of-file, you need to pass + * a negative value in offset and + * set whence + * to SEEK_END. + *

+ * @param whence int[optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + * SEEK_END - Set position to end-of-file plus offset. + *

+ * @return int Upon success, returns 0; otherwise, returns -1. Note that seeking + * past EOF is not considered an error. + * + * @jms-builtin + */ +function fseek ($handle, $offset, $whence = null) {} + +/** + * Returns the current position of the file read/write pointer + * @link http://www.php.net/manual/en/function.ftell.php + * @param handle resource

+ * The file pointer must be valid, and must point to a file successfully + * opened by fopen or popen. + * ftell gives undefined results for append-only streams + * (opened with "a" flag). + *

+ * @return int the position of the file pointer referenced by + * handle as an integer; i.e., its offset into the file stream. + *

+ *

+ * If an error occurs, returns false. + * + * @jms-builtin + */ +function ftell ($handle) {} + +/** + * Flushes the output to a file + * @link http://www.php.net/manual/en/function.fflush.php + * @param handle resource &fs.validfp.all; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function fflush ($handle) {} + +/** + * Binary-safe file write + * @link http://www.php.net/manual/en/function.fwrite.php + * @param handle resource &fs.file.pointer; + * @param string string

+ * The string that is to be written. + *

+ * @param length int[optional]

+ * If the length argument is given, writing will + * stop after length bytes have been written or + * the end of string is reached, whichever comes + * first. + *

+ *

+ * Note that if the length argument is given, + * then the magic_quotes_runtime + * configuration option will be ignored and no slashes will be + * stripped from string. + *

+ * @return int + * + * @jms-builtin + */ +function fwrite ($handle, $string, $length = null) {} + +/** + * &Alias; fwrite + * @link http://www.php.net/manual/en/function.fputs.php + * @param fp + * @param str + * @param length[optional] + * + * @jms-builtin + */ +function fputs ($fp, $str, $length) {} + +/** + * Makes directory + * @link http://www.php.net/manual/en/function.mkdir.php + * @param pathname string

+ * The directory path. + *

+ * @param mode int[optional]

+ * The mode is 0777 by default, which means the widest possible + * access. For more information on modes, read the details + * on the chmod page. + *

+ *

+ * mode is ignored on Windows. + *

+ *

+ * Note that you probably want to specify the mode as an octal number, + * which means it should have a leading zero. The mode is also modified + * by the current umask, which you can change using + * umask. + *

+ * @param recursive bool[optional]

+ * Allows the creation of nested directories specified in the + * pathname. Defaults to false. + *

+ * @param context resource[optional] ¬e.context-support; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mkdir ($pathname, $mode = null, $recursive = null, $context = null) {} + +/** + * Renames a file or directory + * @link http://www.php.net/manual/en/function.rename.php + * @param oldname string

+ *

+ *

+ * The old name. The wrapper used in oldname + * must match the wrapper used in + * newname. + *

+ * @param newname string

+ * The new name. + *

+ * @param context resource[optional] ¬e.context-support; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function rename ($oldname, $newname, $context = null) {} + +/** + * Copies file + * @link http://www.php.net/manual/en/function.copy.php + * @param source string

+ * Path to the source file. + *

+ * @param dest string

+ * The destination path. If dest is a URL, the + * copy operation may fail if the wrapper does not support overwriting of + * existing files. + *

+ *

+ * If the destination file already exists, it will be overwritten. + *

+ * @param context resource[optional]

+ * A valid context resource created with + * stream_context_create. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function copy ($source, $dest, $context = null) {} + +/** + * Create file with unique file name + * @link http://www.php.net/manual/en/function.tempnam.php + * @param dir string

+ * The directory where the temporary filename will be created. + *

+ * @param prefix string

+ * The prefix of the generated temporary filename. + *

+ * Windows uses only the first three characters of prefix. + * @return string the new temporary filename, or false on + * failure. + * + * @jms-builtin + */ +function tempnam ($dir, $prefix) {} + +/** + * Creates a temporary file + * @link http://www.php.net/manual/en/function.tmpfile.php + * @return resource a file handle, similar to the one returned by + * fopen, for the new file&return.falseforfailure;. + * + * @jms-builtin + */ +function tmpfile () {} + +/** + * Reads entire file into an array + * @link http://www.php.net/manual/en/function.file.php + * @param filename string

+ * Path to the file. + *

+ * &tip.fopen-wrapper; + * @param flags int[optional]

+ * The optional parameter flags can be one, or + * more, of the following constants: + * FILE_USE_INCLUDE_PATH + * Search for the file in the include_path. + * @param context resource[optional]

+ * A context resource created with the + * stream_context_create function. + *

+ *

+ * ¬e.context-support; + *

+ * @return array the file in an array. Each element of the array corresponds to a + * line in the file, with the newline still attached. Upon failure, + * file returns false. + *

+ *

+ * Each line in the resulting array will include the line ending, unless + * FILE_IGNORE_NEW_LINES is used, so you still need to + * use rtrim if you do not want the line ending + * present. + * + * @jms-builtin + */ +function file ($filename, $flags = null, $context = null) {} + +/** + * Reads entire file into a string + * @link http://www.php.net/manual/en/function.file-get-contents.php + * @param filename string

+ * Name of the file to read. + *

+ * @param use_include_path bool[optional]

+ * As of PHP 5 the FILE_USE_INCLUDE_PATH can be used + * to trigger include path + * search. + *

+ * @param context resource[optional]

+ * A valid context resource created with + * stream_context_create. If you don't need to use a + * custom context, you can skip this parameter by &null;. + *

+ * @param offset int[optional]

+ * The offset where the reading starts on the original stream. + *

+ * @param maxlen int[optional]

+ * Maximum length of data read. The default is to read until end + * of file is reached. Note that this parameter is applied to the + * stream processed by the filters. + *

+ * @return string The function returns the read data&return.falseforfailure;. + * + * @jms-builtin + */ +function file_get_contents ($filename, $use_include_path = null, $context = null, $offset = null, $maxlen = null) {} + +/** + * Write a string to a file + * @link http://www.php.net/manual/en/function.file-put-contents.php + * @param filename string

+ * Path to the file where to write the data. + *

+ * @param data mixed

+ * The data to write. Can be either a string, an + * array or a stream resource. + *

+ *

+ * If data is a stream resource, the + * remaining buffer of that stream will be copied to the specified file. + * This is similar with using stream_copy_to_stream. + *

+ *

+ * You can also specify the data parameter as a single + * dimension array. This is equivalent to + * file_put_contents($filename, implode('', $array)). + *

+ * @param flags int[optional]

+ * The value of flags can be any combination of + * the following flags (with some restrictions), joined with the binary OR + * (|) operator. + *

+ *

+ * + * Available flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
+ * FILE_USE_INCLUDE_PATH + * + * Search for filename in the include directory. + * See include_path for more + * information. + *
+ * FILE_APPEND + * + * If file filename already exists, append + * the data to the file instead of overwriting it. Mutually + * exclusive with LOCK_EX since appends are atomic and thus there + * is no reason to lock. + *
+ * LOCK_EX + * + * Acquire an exclusive lock on the file while proceeding to the + * writing. Mutually exclusive with FILE_APPEND. + *
+ *

+ * @param context resource[optional]

+ * A valid context resource created with + * stream_context_create. + *

+ * @return int The function returns the number of bytes that were written to the file, or + * false on failure. + * + * @jms-builtin + */ +function file_put_contents ($filename, $data, $flags = null, $context = null) {} + +/** + * Runs the equivalent of the select() system call on the given + arrays of streams with a timeout specified by tv_sec and tv_usec + * @link http://www.php.net/manual/en/function.stream-select.php + * @param read array

+ * The streams listed in the read array will be watched to + * see if characters become available for reading (more precisely, to see if + * a read will not block - in particular, a stream resource is also ready on + * end-of-file, in which case an fread will return + * a zero length string). + *

+ * @param write array

+ * The streams listed in the write array will be + * watched to see if a write will not block. + *

+ * @param except array

+ * The streams listed in the except array will be + * watched for high priority exceptional ("out-of-band") data arriving. + *

+ *

+ * When stream_select returns, the arrays + * read, write and + * except are modified to indicate which stream + * resource(s) actually changed status. + *

+ * You do not need to pass every array to + * stream_select. You can leave it out and use an + * empty array or &null; instead. Also do not forget that those arrays are + * passed by reference and will be modified after + * stream_select returns. + * @param tv_sec int

+ * The tv_sec and tv_usec + * together form the timeout parameter, + * tv_sec specifies the number of seconds while + * tv_usec the number of microseconds. + * The timeout is an upper bound on the amount of time + * that stream_select will wait before it returns. + * If tv_sec and tv_usec are + * both set to 0, stream_select will + * not wait for data - instead it will return immediately, indicating the + * current status of the streams. + *

+ *

+ * If tv_sec is &null; stream_select + * can block indefinitely, returning only when an event on one of the + * watched streams occurs (or if a signal interrupts the system call). + *

+ *

+ * Using a timeout value of 0 allows you to + * instantaneously poll the status of the streams, however, it is NOT a + * good idea to use a 0 timeout value in a loop as it + * will cause your script to consume too much CPU time. + *

+ *

+ * It is much better to specify a timeout value of a few seconds, although + * if you need to be checking and running other code concurrently, using a + * timeout value of at least 200000 microseconds will + * help reduce the CPU usage of your script. + *

+ *

+ * Remember that the timeout value is the maximum time that will elapse; + * stream_select will return as soon as the + * requested streams are ready for use. + *

+ * @param tv_usec int[optional]

+ * See tv_sec description. + *

+ * @return int On success stream_select returns the number of + * stream resources contained in the modified arrays, which may be zero if + * the timeout expires before anything interesting happens. On error false + * is returned and a warning raised (this can happen if the system call is + * interrupted by an incoming signal). + * + * @jms-builtin + */ +function stream_select (array &$read, array &$write, array &$except, $tv_sec, $tv_usec = null) {} + +/** + * Create a streams context + * @link http://www.php.net/manual/en/function.stream-context-create.php + * @param options array[optional]

+ * Must be an associative array of associative arrays in the format + * $arr['wrapper']['option'] = $value. + *

+ *

+ * Default to an empty array. + *

+ * @param params array[optional]

+ * Must be an associative array in the format + * $arr['parameter'] = $value. + * Refer to context parameters for + * a listing of standard stream parameters. + *

+ * @return resource A stream context resource. + * + * @jms-builtin + */ +function stream_context_create (array $options = null, array $params = null) {} + +/** + * Set parameters for a stream/wrapper/context + * @link http://www.php.net/manual/en/function.stream-context-set-params.php + * @param stream_or_context resource

+ * The stream or context to apply the parameters too. + *

+ * @param params array

+ * An array of parameters to set. + *

+ *

+ * params should be an associative array of the structure: + * $params['paramname'] = "paramvalue";. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_context_set_params ($stream_or_context, array $params) {} + +/** + * Sets an option for a stream/wrapper/context + * @link http://www.php.net/manual/en/function.stream-context-set-option.php + * @param stream_or_context resource

+ * The stream or context resource to apply the options too. + *

+ * @param wrapper string + * @param option string + * @param value mixed + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_context_set_option ($stream_or_context, $wrapper, $option, $value) {} + +/** + * Retrieve options for a stream/wrapper/context + * @link http://www.php.net/manual/en/function.stream-context-get-options.php + * @param stream_or_context resource

+ * The stream or context to get options from + *

+ * @return array an associative array with the options. + * + * @jms-builtin + */ +function stream_context_get_options ($stream_or_context) {} + +/** + * Retreive the default streams context + * @link http://www.php.net/manual/en/function.stream-context-get-default.php + * @param options array[optional] options must be an associative + * array of associative arrays in the format + * $arr['wrapper']['option'] = $value. + *

+ * As of PHP 5.3.0, the stream_context_set_default function + * can be used to set the default context. + *

+ * @return resource A stream context resource. + * + * @jms-builtin + */ +function stream_context_get_default (array $options = null) {} + +/** + * Attach a filter to a stream + * @link http://www.php.net/manual/en/function.stream-filter-prepend.php + * @param stream resource

+ * The target stream. + *

+ * @param filtername string

+ * The filter name. + *

+ * @param read_write int[optional]

+ * By default, stream_filter_prepend will + * attach the filter to the read filter chain + * if the file was opened for reading (i.e. File Mode: + * r, and/or +). The filter + * will also be attached to the write filter chain + * if the file was opened for writing (i.e. File Mode: + * w, a, and/or +). + * STREAM_FILTER_READ, + * STREAM_FILTER_WRITE, and/or + * STREAM_FILTER_ALL can also be passed to the + * read_write parameter to override this behavior. + * See stream_filter_append for an example of + * using this parameter. + *

+ * @param params mixed[optional]

+ * This filter will be added with the specified params + * to the beginning of the list and will therefore be + * called first during stream operations. To add a filter to the end of the + * list, use stream_filter_append. + *

+ * @return resource a resource which can be used to refer to this filter + * instance during a call to stream_filter_remove. + * + * @jms-builtin + */ +function stream_filter_prepend ($stream, $filtername, $read_write = null, $params = null) {} + +/** + * Attach a filter to a stream + * @link http://www.php.net/manual/en/function.stream-filter-append.php + * @param stream resource

+ * The target stream. + *

+ * @param filtername string

+ * The filter name. + *

+ * @param read_write int[optional]

+ * By default, stream_filter_append will + * attach the filter to the read filter chain + * if the file was opened for reading (i.e. File Mode: + * r, and/or +). The filter + * will also be attached to the write filter chain + * if the file was opened for writing (i.e. File Mode: + * w, a, and/or +). + * STREAM_FILTER_READ, + * STREAM_FILTER_WRITE, and/or + * STREAM_FILTER_ALL can also be passed to the + * read_write parameter to override this behavior. + *

+ * @param params mixed[optional]

+ * This filter will be added with the specified + * params to the end of + * the list and will therefore be called last during stream operations. + * To add a filter to the beginning of the list, use + * stream_filter_prepend. + *

+ * @return resource a resource which can be used to refer to this filter + * instance during a call to stream_filter_remove. + * + * @jms-builtin + */ +function stream_filter_append ($stream, $filtername, $read_write = null, $params = null) {} + +/** + * Remove a filter from a stream + * @link http://www.php.net/manual/en/function.stream-filter-remove.php + * @param stream_filter resource

+ * The stream filter to be removed. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_filter_remove ($stream_filter) {} + +/** + * Open Internet or Unix domain socket connection + * @link http://www.php.net/manual/en/function.stream-socket-client.php + * @param remote_socket string

+ * Address to the socket to connect to. + *

+ * @param errno int[optional]

+ * Will be set to the system level error number if connection fails. + *

+ * @param errstr string[optional]

+ * Will be set to the system level error message if the connection fails. + *

+ * @param timeout float[optional]

+ * Number of seconds until the connect() system call + * should timeout. + * This parameter only applies when not making asynchronous + * connection attempts. + *

+ * To set a timeout for reading/writing data over the socket, use the + * stream_set_timeout, as the + * timeout only applies while making connecting + * the socket. + *

+ *

+ * @param flags int[optional]

+ * Bitmask field which may be set to any combination of connection flags. + * Currently the select of connection flags is limited to + * STREAM_CLIENT_CONNECT (default), + * STREAM_CLIENT_ASYNC_CONNECT and + * STREAM_CLIENT_PERSISTENT. + *

+ * @param context resource[optional]

+ * A valid context resource created with stream_context_create. + *

+ * @return resource On success a stream resource is returned which may + * be used together with the other file functions (such as + * fgets, fgetss, + * fwrite, fclose, and + * feof), false on failure. + * + * @jms-builtin + */ +function stream_socket_client ($remote_socket, &$errno = null, &$errstr = null, $timeout = null, $flags = null, $context = null) {} + +/** + * Create an Internet or Unix domain server socket + * @link http://www.php.net/manual/en/function.stream-socket-server.php + * @param local_socket string

+ * The type of socket created is determined by the transport specified + * using standard URL formatting: transport://target. + *

+ *

+ * For Internet Domain sockets (AF_INET) such as TCP and UDP, the + * target portion of the + * remote_socket parameter should consist of a + * hostname or IP address followed by a colon and a port number. For + * Unix domain sockets, the target portion should + * point to the socket file on the filesystem. + *

+ *

+ * Depending on the environment, Unix domain sockets may not be available. + * A list of available transports can be retrieved using + * stream_get_transports. See + * for a list of bulitin transports. + *

+ * @param errno int[optional]

+ * If the optional errno and errstr + * arguments are present they will be set to indicate the actual system + * level error that occurred in the system-level socket(), + * bind(), and listen() calls. If + * the value returned in errno is + * 0 and the function returned false, it is an + * indication that the error occurred before the bind() + * call. This is most likely due to a problem initializing the socket. + * Note that the errno and + * errstr arguments will always be passed by reference. + *

+ * @param errstr string[optional]

+ * See errno description. + *

+ * @param flags int[optional]

+ * A bitmask field which may be set to any combination of socket creation + * flags. + *

+ *

+ * For UDP sockets, you must use STREAM_SERVER_BIND as + * the flags parameter. + *

+ * @param context resource[optional]

+ *

+ * @return resource the created stream, or false on error. + * + * @jms-builtin + */ +function stream_socket_server ($local_socket, &$errno = null, &$errstr = null, $flags = null, $context = null) {} + +/** + * Accept a connection on a socket created by stream_socket_server + * @link http://www.php.net/manual/en/function.stream-socket-accept.php + * @param server_socket resource + * @param timeout float[optional]

+ * Override the default socket accept timeout. Time should be given in + * seconds. + *

+ * @param peername string[optional]

+ * Will be set to the name (address) of the client which connected, if + * included and available from the selected transport. + *

+ *

+ * Can also be determined later using + * stream_socket_get_name. + *

+ * @return resource Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_socket_accept ($server_socket, $timeout = null, &$peername = null) {} + +/** + * Retrieve the name of the local or remote sockets + * @link http://www.php.net/manual/en/function.stream-socket-get-name.php + * @param handle resource

+ * The socket to get the name of. + *

+ * @param want_peer bool

+ * If set to true the remote socket name will be returned, if set + * to false the local socket name will be returned. + *

+ * @return string The name of the socket. + * + * @jms-builtin + */ +function stream_socket_get_name ($handle, $want_peer) {} + +/** + * Receives data from a socket, connected or not + * @link http://www.php.net/manual/en/function.stream-socket-recvfrom.php + * @param socket resource

+ * The remote socket. + *

+ * @param length int

+ * The number of bytes to receive from the socket. + *

+ * @param flags int[optional]

+ * The value of flags can be any combination + * of the following: + * + * Possible values for flags + * + * + * + * + * + * + * + * + *
STREAM_OOB + * Process OOB (out-of-band) data. + *
STREAM_PEEK + * Retrieve data from the socket, but do not consume the buffer. + * Subsequent calls to fread or + * stream_socket_recvfrom will see + * the same data. + *
+ *

+ * @param address string[optional]

+ * If address is provided it will be populated with + * the address of the remote socket. + *

+ * @return string the read data, as a string + * + * @jms-builtin + */ +function stream_socket_recvfrom ($socket, $length, $flags = null, &$address = null) {} + +/** + * Sends a message to a socket, whether it is connected or not + * @link http://www.php.net/manual/en/function.stream-socket-sendto.php + * @param socket resource

+ * The socket to send data to. + *

+ * @param data string

+ * The data to be sent. + *

+ * @param flags int[optional]

+ * The value of flags can be any combination + * of the following: + * + * possible values for flags + * + * + * + * + *
STREAM_OOB + * Process OOB (out-of-band) data. + *
+ *

+ * @param address string[optional]

+ * The address specified when the socket stream was created will be used + * unless an alternate address is specified in address. + *

+ *

+ * If specified, it must be in dotted quad (or [ipv6]) format. + *

+ * @return int a result code, as an integer. + * + * @jms-builtin + */ +function stream_socket_sendto ($socket, $data, $flags = null, $address = null) {} + +/** + * Turns encryption on/off on an already connected socket + * @link http://www.php.net/manual/en/function.stream-socket-enable-crypto.php + * @param stream resource

+ * The stream resource. + *

+ * @param enable bool

+ * Enable/disable cryptography on the stream. + *

+ * @param crypto_type int[optional]

+ * Setup encryption on the stream. + * Valid methods are + * STREAM_CRYPTO_METHOD_SSLv2_CLIENT + * @param session_stream resource[optional]

+ * Seed the stream with settings from session_stream. + *

+ * @return mixed true on success, false if negotiation has failed or + * 0 if there isn't enough data and you should try again + * (only for non-blocking sockets). + * + * @jms-builtin + */ +function stream_socket_enable_crypto ($stream, $enable, $crypto_type = null, $session_stream = null) {} + +/** + * Shutdown a full-duplex connection + * @link http://www.php.net/manual/en/function.stream-socket-shutdown.php + * @param stream resource

+ * An open stream (opened with stream_socket_client, + * for example) + *

+ * @param how int

+ * One of the following constants: STREAM_SHUT_RD + * (disable further receptions), STREAM_SHUT_WR + * (disable further transmissions) or + * STREAM_SHUT_RDWR (disable further receptions and + * transmissions). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_socket_shutdown ($stream, $how) {} + +/** + * Creates a pair of connected, indistinguishable socket streams + * @link http://www.php.net/manual/en/function.stream-socket-pair.php + * @param domain int

+ * The protocol family to be used: STREAM_PF_INET, + * STREAM_PF_INET6 or + * STREAM_PF_UNIX + *

+ * @param type int

+ * The type of communication to be used: + * STREAM_SOCK_DGRAM, + * STREAM_SOCK_RAW, + * STREAM_SOCK_RDM, + * STREAM_SOCK_SEQPACKET or + * STREAM_SOCK_STREAM + *

+ * @param protocol int

+ * The protocol to be used: STREAM_IPPROTO_ICMP, + * STREAM_IPPROTO_IP, + * STREAM_IPPROTO_RAW, + * STREAM_IPPROTO_TCP or + * STREAM_IPPROTO_UDP + *

+ * @return array an array with the two socket resources on success, or + * false on failure. + * + * @jms-builtin + */ +function stream_socket_pair ($domain, $type, $protocol) {} + +/** + * Copies data from one stream to another + * @link http://www.php.net/manual/en/function.stream-copy-to-stream.php + * @param source resource

+ * The source stream + *

+ * @param dest resource

+ * The destination stream + *

+ * @param maxlength int[optional]

+ * Maximum bytes to copy + *

+ * @param offset int[optional]

+ * The offset where to start to copy data + *

+ * @return int the total count of bytes copied. + * + * @jms-builtin + */ +function stream_copy_to_stream ($source, $dest, $maxlength = null, $offset = null) {} + +/** + * Reads remainder of a stream into a string + * @link http://www.php.net/manual/en/function.stream-get-contents.php + * @param handle resource

+ * A stream resource (e.g. returned from fopen) + *

+ * @param maxlength int[optional]

+ * The maximum bytes to read. Defaults to -1 (read all the remaining + * buffer). + *

+ * @param offset int[optional]

+ * Seek to the specified offset before reading. + *

+ * @return string a string&return.falseforfailure;. + * + * @jms-builtin + */ +function stream_get_contents ($handle, $maxlength = null, $offset = null) {} + +/** + * Gets line from file pointer and parse for CSV fields + * @link http://www.php.net/manual/en/function.fgetcsv.php + * @param handle resource

+ * A valid file pointer to a file successfully opened by + * fopen, popen, or + * fsockopen. + *

+ * @param length int[optional]

+ * Must be greater than the longest line (in characters) to be found in + * the CSV file (allowing for trailing line-end characters). It became + * optional in PHP 5. Omitting this parameter (or setting it to 0 in PHP + * 5.0.4 and later) the maximum line length is not limited, which is + * slightly slower. + *

+ * @param delimiter string[optional]

+ * Set the field delimiter (one character only). + *

+ * @param enclosure string[optional]

+ * Set the field enclosure character (one character only). + *

+ * @param escape string[optional]

+ * Set the escape character (one character only). Defaults as a backslash. + *

+ * @return array an indexed array containing the fields read. + *

+ *

+ * A blank line in a CSV file will be returned as an array + * comprising a single null field, and will not be treated + * as an error. + *

+ * ¬e.line-endings; + *

+ * fgetcsv returns &null; if an invalid + * handle is supplied or false on other errors, + * including end of file. + * + * @jms-builtin + */ +function fgetcsv ($handle, $length = null, $delimiter = null, $enclosure = null, $escape = null) {} + +/** + * Format line as CSV and write to file pointer + * @link http://www.php.net/manual/en/function.fputcsv.php + * @param handle resource &fs.validfp.all; + * @param fields array

+ * An array of values. + *

+ * @param delimiter string[optional]

+ * The optional delimiter parameter sets the field + * delimiter (one character only). + *

+ * @param enclosure string[optional]

+ * The optional enclosure parameter sets the field + * enclosure (one character only). + *

+ * @return int the length of the written string&return.falseforfailure;. + * + * @jms-builtin + */ +function fputcsv ($handle, array $fields, $delimiter = null, $enclosure = null) {} + +/** + * Portable advisory file locking + * @link http://www.php.net/manual/en/function.flock.php + * @param handle resource

+ * An open file pointer. + *

+ * @param operation int

+ * operation is one of the following: + * LOCK_SH to acquire a shared lock (reader). + * @param wouldblock int[optional]

+ * The optional third argument is set to true if the lock would block + * (EWOULDBLOCK errno condition). (not supported on Windows) + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function flock ($handle, $operation, &$wouldblock = null) {} + +/** + * Extracts all meta tag content attributes from a file and returns an array + * @link http://www.php.net/manual/en/function.get-meta-tags.php + * @param filename string

+ * The path to the HTML file, as a string. This can be a local file or an + * URL. + *

+ *

+ * What get_meta_tags parses + * ]]> + * (pay attention to line endings - PHP uses a native function to + * parse the input, so a Mac file won't work on Unix). + *

+ * @param use_include_path bool[optional]

+ * Setting use_include_path to true will result + * in PHP trying to open the file along the standard include path as per + * the include_path directive. + * This is used for local files, not URLs. + *

+ * @return array an array with all the parsed meta tags. + *

+ *

+ * The value of the name property becomes the key, the value of the content + * property becomes the value of the returned array, so you can easily use + * standard array functions to traverse it or access single values. + * Special characters in the value of the name property are substituted with + * '_', the rest is converted to lower case. If two meta tags have the same + * name, only the last one is returned. + * + * @jms-builtin + */ +function get_meta_tags ($filename, $use_include_path = null) {} + +/** + * Sets file buffering on the given stream + * @link http://www.php.net/manual/en/function.stream-set-write-buffer.php + * @param stream resource

+ * The file pointer. + *

+ * @param buffer int

+ * The number of bytes to buffer. If buffer + * is 0 then write operations are unbuffered. This ensures that all writes + * with fwrite are completed before other processes are + * allowed to write to that output stream. + *

+ * @return int 0 on success, or EOF if the request cannot be honored. + * + * @jms-builtin + */ +function stream_set_write_buffer ($stream, $buffer) {} + +/** + * &Alias; stream_set_write_buffer + * @link http://www.php.net/manual/en/function.set-file-buffer.php + * @param fp + * @param buffer + * + * @jms-builtin + */ +function set_file_buffer ($fp, $buffer) {} + +/** + * &Alias; stream_set_blocking + * @link http://www.php.net/manual/en/function.set-socket-blocking.php + * @param socket + * @param mode + * + * @jms-builtin + */ +function set_socket_blocking ($socket, $mode) {} + +/** + * Set blocking/non-blocking mode on a stream + * @link http://www.php.net/manual/en/function.stream-set-blocking.php + * @param stream resource

+ * The stream. + *

+ * @param mode int

+ * If mode is 0, the given stream + * will be switched to non-blocking mode, and if 1, it + * will be switched to blocking mode. This affects calls like + * fgets and fread + * that read from the stream. In non-blocking mode an + * fgets call will always return right away + * while in blocking mode it will wait for data to become available + * on the stream. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_set_blocking ($stream, $mode) {} + +/** + * &Alias; stream_set_blocking + * @link http://www.php.net/manual/en/function.socket-set-blocking.php + * @param socket + * @param mode + * + * @jms-builtin + */ +function socket_set_blocking ($socket, $mode) {} + +/** + * Retrieves header/meta data from streams/file pointers + * @link http://www.php.net/manual/en/function.stream-get-meta-data.php + * @param stream resource

+ * The stream can be any stream created by fopen, + * fsockopen and pfsockopen. + *

+ * @return array The result array contains the following items: + *

+ *

+ * timed_out (bool) - true if the stream + * timed out while waiting for data on the last call to + * fread or fgets. + *

+ *

+ * blocked (bool) - true if the stream is + * in blocking IO mode. See stream_set_blocking. + *

+ *

+ * eof (bool) - true if the stream has reached + * end-of-file. Note that for socket streams this member can be true + * even when unread_bytes is non-zero. To + * determine if there is more data to be read, use + * feof instead of reading this item. + *

+ *

+ * unread_bytes (int) - the number of bytes + * currently contained in the PHP's own internal buffer. + *

+ * You shouldn't use this value in a script. + *

+ * stream_type (string) - a label describing + * the underlying implementation of the stream. + *

+ *

+ * wrapper_type (string) - a label describing + * the protocol wrapper implementation layered over the stream. + * See for more information about wrappers. + *

+ *

+ * wrapper_data (mixed) - wrapper specific + * data attached to this stream. See for + * more information about wrappers and their wrapper data. + *

+ *

+ * filters (array) - and array containing + * the names of any filters that have been stacked onto this stream. + * Documentation on filters can be found in the + * Filters appendix. + *

+ *

+ * mode (string) - the type of access required for + * this stream (see Table 1 of the fopen() reference) + *

+ *

+ * seekable (bool) - whether the current stream can + * be seeked. + *

+ *

+ * uri (string) - the URI/filename associated with this + * stream. + * + * @jms-builtin + */ +function stream_get_meta_data ($stream) {} + +/** + * Gets line from stream resource up to a given delimiter + * @link http://www.php.net/manual/en/function.stream-get-line.php + * @param handle resource

+ * A valid file handle. + *

+ * @param length int

+ * The number of bytes to read from the handle. + *

+ * @param ending string[optional]

+ * An optional string delimiter. + *

+ * @return string a string of up to length bytes read from the file + * pointed to by handle. + *

+ *

+ * If an error occurs, returns false. + * + * @jms-builtin + */ +function stream_get_line ($handle, $length, $ending = null) {} + +/** + * Register a URL wrapper implemented as a PHP class + * @link http://www.php.net/manual/en/function.stream-wrapper-register.php + * @param protocol string

+ * The wrapper name to be registered. + *

+ * @param classname string

+ * The classname which implements the protocol. + *

+ * @param flags int[optional]

+ * Should be set to STREAM_IS_URL if + * protocol is a URL protocol. Default is 0, local + * stream. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * stream_wrapper_register will return false if the + * protocol already has a handler. + * + * @jms-builtin + */ +function stream_wrapper_register ($protocol, $classname, $flags = null) {} + +/** + * &Alias; stream_wrapper_register + * @link http://www.php.net/manual/en/function.stream-register-wrapper.php + * @param protocol + * @param classname + * @param flags[optional] + * + * @jms-builtin + */ +function stream_register_wrapper ($protocol, $classname, $flags) {} + +/** + * Unregister a URL wrapper + * @link http://www.php.net/manual/en/function.stream-wrapper-unregister.php + * @param protocol string

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_wrapper_unregister ($protocol) {} + +/** + * Restores a previously unregistered built-in wrapper + * @link http://www.php.net/manual/en/function.stream-wrapper-restore.php + * @param protocol string

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_wrapper_restore ($protocol) {} + +/** + * Retrieve list of registered streams + * @link http://www.php.net/manual/en/function.stream-get-wrappers.php + * @return array an indexed array containing the name of all stream wrappers + * available on the running system. + * + * @jms-builtin + */ +function stream_get_wrappers () {} + +/** + * Retrieve list of registered socket transports + * @link http://www.php.net/manual/en/function.stream-get-transports.php + * @return array an indexed array of socket transports names. + * + * @jms-builtin + */ +function stream_get_transports () {} + +/** + * Checks if a stream is a local stream + * @link http://www.php.net/manual/en/function.stream-is-local.php + * @param stream_or_url mixed

+ * The stream resource or URL to check. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_is_local ($stream_or_url) {} + +/** + * Fetches all the headers sent by the server in response to a HTTP request + * @link http://www.php.net/manual/en/function.get-headers.php + * @param url string

+ * The target URL. + *

+ * @param format int[optional]

+ * If the optional format parameter is set to non-zero, + * get_headers parses the response and sets the + * array's keys. + *

+ * @return array an indexed or associative array with the headers, or false on + * failure. + * + * @jms-builtin + */ +function get_headers ($url, $format = null) {} + +/** + * Set timeout period on a stream + * @link http://www.php.net/manual/en/function.stream-set-timeout.php + * @param stream resource

+ * The target stream. + *

+ * @param seconds int

+ * The seconds part of the timeout to be set. + *

+ * @param microseconds int[optional]

+ * The microseconds part of the timeout to be set. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_set_timeout ($stream, $seconds, $microseconds = null) {} + +/** + * &Alias; stream_set_timeout + * @link http://www.php.net/manual/en/function.socket-set-timeout.php + * @param stream + * @param seconds + * @param microseconds + * + * @jms-builtin + */ +function socket_set_timeout ($stream, $seconds, $microseconds) {} + +/** + * &Alias; stream_get_meta_data + * @link http://www.php.net/manual/en/function.socket-get-status.php + * @param fp + * + * @jms-builtin + */ +function socket_get_status ($fp) {} + +/** + * Returns canonicalized absolute pathname + * @link http://www.php.net/manual/en/function.realpath.php + * @param path string

+ * The path being checked. + *

+ * @return string the canonicalized absolute pathname on success. The resulting path + * will have no symbolic link, '/./' or '/../' components. + *

+ *

+ * realpath returns false on failure, e.g. if + * the file does not exist. + *

+ *

+ * The running script must have executable permissions on all directories in + * the hierarchy, otherwise realpath will return + * false. + * + * @jms-builtin + */ +function realpath ($path) {} + +/** + * Match filename against a pattern + * @link http://www.php.net/manual/en/function.fnmatch.php + * @param pattern string

+ * The shell wildcard pattern. + *

+ * @param string string

+ * The tested string. This function is especially useful for filenames, + * but may also be used on regular strings. + *

+ *

+ * The average user may be used to shell patterns or at least in their + * simplest form to '?' and '*' + * wildcards so using fnmatch instead of + * preg_match for + * frontend search expression input may be way more convenient for + * non-programming users. + *

+ * @param flags int[optional]

+ * The value of flags can be any combination of + * the following flags, joined with the + * binary OR (|) operator. + * + * A list of possible flags for fnmatch + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
FNM_NOESCAPE + * Disable backslash escaping. + *
FNM_PATHNAME + * Slash in string only matches slash in the given pattern. + *
FNM_PERIOD + * Leading period in string must be exactly matched by period in the given pattern. + *
FNM_CASEFOLD + * Caseless match. Part of the GNU extension. + *
+ *

+ * @return bool true if there is a match, false otherwise. + * + * @jms-builtin + */ +function fnmatch ($pattern, $string, $flags = null) {} + +/** + * Open Internet or Unix domain socket connection + * @link http://www.php.net/manual/en/function.fsockopen.php + * @param hostname string

+ * If you have compiled in OpenSSL support, you may prefix the + * hostname with either ssl:// + * or tls:// to use an SSL or TLS client connection + * over TCP/IP to connect to the remote host. + *

+ * @param port int[optional]

+ * The port number. + *

+ * @param errno int[optional]

+ * If provided, holds the system level error number that occurred in the + * system-level connect() call. + *

+ *

+ * If the value returned in errno is + * 0 and the function returned false, it is an + * indication that the error occurred before the + * connect() call. This is most likely due to a + * problem initializing the socket. + *

+ * @param errstr string[optional]

+ * The error message as a string. + *

+ * @param timeout float[optional]

+ * The connection timeout, in seconds. + *

+ *

+ * If you need to set a timeout for reading/writing data over the + * socket, use stream_set_timeout, as the + * timeout parameter to + * fsockopen only applies while connecting the + * socket. + *

+ * @return resource fsockopen returns a file pointer which may be used + * together with the other file functions (such as + * fgets, fgetss, + * fwrite, fclose, and + * feof). If the call fails, it will return false + * + * @jms-builtin + */ +function fsockopen ($hostname, $port = null, &$errno = null, &$errstr = null, $timeout = null) {} + +/** + * Open persistent Internet or Unix domain socket connection + * @link http://www.php.net/manual/en/function.pfsockopen.php + * @param hostname string + * @param port int[optional] + * @param errno int[optional] + * @param errstr string[optional] + * @param timeout float[optional] + * @return resource + * + * @jms-builtin + */ +function pfsockopen ($hostname, $port = null, &$errno = null, &$errstr = null, $timeout = null) {} + +/** + * Pack data into binary string + * @link http://www.php.net/manual/en/function.pack.php + * @param format string

+ * The format string consists of format codes + * followed by an optional repeater argument. The repeater argument can + * be either an integer value or * for repeating to + * the end of the input data. For a, A, h, H the repeat count specifies + * how many characters of one data argument are taken, for @ it is the + * absolute position where to put the next data, for everything else the + * repeat count specifies how many data arguments are consumed and packed + * into the resulting binary string. + *

+ *

+ * Currently implemented formats are: + * + * pack format characters + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CodeDescription
aNUL-padded string
ASPACE-padded string
hHex string, low nibble first
HHex string, high nibble first
csigned char
Cunsigned char
ssigned short (always 16 bit, machine byte order)
Sunsigned short (always 16 bit, machine byte order)
nunsigned short (always 16 bit, big endian byte order)
vunsigned short (always 16 bit, little endian byte order)
isigned integer (machine dependent size and byte order)
Iunsigned integer (machine dependent size and byte order)
lsigned long (always 32 bit, machine byte order)
Lunsigned long (always 32 bit, machine byte order)
Nunsigned long (always 32 bit, big endian byte order)
Vunsigned long (always 32 bit, little endian byte order)
ffloat (machine dependent size and representation)
ddouble (machine dependent size and representation)
xNUL byte
XBack up one byte
@NUL-fill to absolute position
+ *

+ * @param args mixed[optional]

+ *

+ * @param _ mixed[optional] + * @return string a binary string containing data. + * + * @jms-builtin + */ +function pack ($format, $args = null, $_ = null) {} + +/** + * Unpack data from binary string + * @link http://www.php.net/manual/en/function.unpack.php + * @param format string

+ * See pack for an explanation of the format codes. + *

+ * @param data string

+ * The packed data. + *

+ * @return array an associative array containing unpacked elements of binary + * string. + * + * @jms-builtin + */ +function unpack ($format, $data) {} + +/** + * Tells what the user's browser is capable of + * @link http://www.php.net/manual/en/function.get-browser.php + * @param user_agent string[optional]

+ * The User Agent to be analyzed. By default, the value of HTTP + * User-Agent header is used; however, you can alter this (i.e., look up + * another browser's info) by passing this parameter. + *

+ *

+ * You can bypass this parameter with a &null; value. + *

+ * @param return_array bool[optional]

+ * If set to true, this function will return an array + * instead of an object. + *

+ * @return mixed The information is returned in an object or an array which will contain + * various data elements representing, for instance, the browser's major and + * minor version numbers and ID string; true/false values for features + * such as frames, JavaScript, and cookies; and so forth. + *

+ *

+ * The cookies value simply means that the browser + * itself is capable of accepting cookies and does not mean the user has + * enabled the browser to accept cookies or not. The only way to test if + * cookies are accepted is to set one with setcookie, + * reload, and check for the value. + * + * @jms-builtin + */ +function get_browser ($user_agent = null, $return_array = null) {} + +/** + * One-way string hashing + * @link http://www.php.net/manual/en/function.crypt.php + * @param str string

+ * The string to be hashed. + *

+ * @param salt string[optional]

+ * An optional salt string to base the hashing on. If not provided, + * one will be randomly generated by PHP each time you call this function. + *

+ *

+ * If you are using the supplied salt, you should be aware that the salt + * is generated once. If you are calling this function repeatedly, this + * may impact both appearance and security. + *

+ * @return string the hashed string or a string that is shorter than 13 characters + * and is guaranteed to differ from the salt on failure. + * + * @jms-builtin + */ +function crypt ($str, $salt = null) {} + +/** + * Open directory handle + * @link http://www.php.net/manual/en/function.opendir.php + * @param path string

+ * The directory path that is to be opened + *

+ * @param context resource[optional]

+ * For a description of the context parameter, + * refer to the streams section of + * the manual. + *

+ * @return resource a directory handle resource on success, or + * false on failure. + *

+ *

+ * If path is not a valid directory or the + * directory can not be opened due to permission restrictions or + * filesystem errors, opendir returns false and + * generates a PHP error of level + * E_WARNING. You can suppress the error output of + * opendir by prepending + * '@' to the + * front of the function name. + * + * @jms-builtin + */ +function opendir ($path, $context = null) {} + +/** + * Close directory handle + * @link http://www.php.net/manual/en/function.closedir.php + * @param dir_handle resource[optional]

+ * The directory handle resource previously opened + * with opendir. If the directory handle is + * not specified, the last link opened by opendir + * is assumed. + *

+ * @return void + * + * @jms-builtin + */ +function closedir ($dir_handle = null) {} + +/** + * Change directory + * @link http://www.php.net/manual/en/function.chdir.php + * @param directory string

+ * The new current directory + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function chdir ($directory) {} + +/** + * Gets the current working directory + * @link http://www.php.net/manual/en/function.getcwd.php + * @return string the current working directory on success, or false on + * failure. + *

+ *

+ * On some Unix variants, getcwd will return + * false if any one of the parent directories does not have the + * readable or search mode set, even if the current directory + * does. See chmod for more information on + * modes and permissions. + * + * @jms-builtin + */ +function getcwd () {} + +/** + * Rewind directory handle + * @link http://www.php.net/manual/en/function.rewinddir.php + * @param dir_handle resource[optional]

+ * The directory handle resource previously opened + * with opendir. If the directory handle is + * not specified, the last link opened by opendir + * is assumed. + *

+ * @return void + * + * @jms-builtin + */ +function rewinddir ($dir_handle = null) {} + +/** + * Read entry from directory handle + * @link http://www.php.net/manual/en/function.readdir.php + * @param dir_handle resource[optional]

+ * The directory handle resource previously opened + * with opendir. If the directory handle is + * not specified, the last link opened by opendir + * is assumed. + *

+ * @return string the filename on success&return.falseforfailure;. + * + * @jms-builtin + */ +function readdir ($dir_handle = null) {} + +/** + * Return an instance of the Directory class + * @link http://www.php.net/manual/en/class.dir.php + * @param directory + * @param context[optional] + * @return string + * + * @jms-builtin + */ +function dir ($directory, $context) {} + +/** + * List files and directories inside the specified path + * @link http://www.php.net/manual/en/function.scandir.php + * @param directory string

+ * The directory that will be scanned. + *

+ * @param sorting_order int[optional]

+ * By default, the sorted order is alphabetical in ascending order. If + * the optional sorting_order is set to non-zero, + * then the sort order is alphabetical in descending order. + *

+ * @param context resource[optional]

+ * For a description of the context parameter, + * refer to the streams section of + * the manual. + *

+ * @return array an array of filenames on success, or false on + * failure. If directory is not a directory, then + * boolean false is returned, and an error of level + * E_WARNING is generated. + * + * @jms-builtin + */ +function scandir ($directory, $sorting_order = null, $context = null) {} + +/** + * Find pathnames matching a pattern + * @link http://www.php.net/manual/en/function.glob.php + * @param pattern string

+ * The pattern. No tilde expansion or parameter substitution is done. + *

+ * @param flags int[optional]

+ * Valid flags: + * GLOB_MARK - Adds a slash to each directory returned + * @return array an array containing the matched files/directories, an empty array + * if no file matched or false on error. + *

+ *

+ * On some systems it is impossible to distinguish between empty match and an + * error. + * + * @jms-builtin + */ +function glob ($pattern, $flags = null) {} + +/** + * Gets last access time of file + * @link http://www.php.net/manual/en/function.fileatime.php + * @param filename string

+ * Path to the file. + *

+ * @return int the time the file was last accessed, &return.falseforfailure;. + * The time is returned as a Unix timestamp. + * + * @jms-builtin + */ +function fileatime ($filename) {} + +/** + * Gets inode change time of file + * @link http://www.php.net/manual/en/function.filectime.php + * @param filename string

+ * Path to the file. + *

+ * @return int the time the file was last changed, &return.falseforfailure;. + * The time is returned as a Unix timestamp. + * + * @jms-builtin + */ +function filectime ($filename) {} + +/** + * Gets file group + * @link http://www.php.net/manual/en/function.filegroup.php + * @param filename string

+ * Path to the file. + *

+ * @return int the group ID of the file, or false in case + * of an error. The group ID is returned in numerical format, use + * posix_getgrgid to resolve it to a group name. + * Upon failure, false is returned. + * + * @jms-builtin + */ +function filegroup ($filename) {} + +/** + * Gets file inode + * @link http://www.php.net/manual/en/function.fileinode.php + * @param filename string

+ * Path to the file. + *

+ * @return int the inode number of the file, &return.falseforfailure;. + * + * @jms-builtin + */ +function fileinode ($filename) {} + +/** + * Gets file modification time + * @link http://www.php.net/manual/en/function.filemtime.php + * @param filename string

+ * Path to the file. + *

+ * @return int the time the file was last modified, &return.falseforfailure;. + * The time is returned as a Unix timestamp, which is + * suitable for the date function. + * + * @jms-builtin + */ +function filemtime ($filename) {} + +/** + * Gets file owner + * @link http://www.php.net/manual/en/function.fileowner.php + * @param filename string

+ * Path to the file. + *

+ * @return int the user ID of the owner of the file, &return.falseforfailure;. + * The user ID is returned in numerical format, use + * posix_getpwuid to resolve it to a username. + * + * @jms-builtin + */ +function fileowner ($filename) {} + +/** + * Gets file permissions + * @link http://www.php.net/manual/en/function.fileperms.php + * @param filename string

+ * Path to the file. + *

+ * @return int the permissions on the file, &return.falseforfailure;. + * + * @jms-builtin + */ +function fileperms ($filename) {} + +/** + * Gets file size + * @link http://www.php.net/manual/en/function.filesize.php + * @param filename string

+ * Path to the file. + *

+ * @return int the size of the file in bytes, or false (and generates an error + * of level E_WARNING) in case of an error. + * + * @jms-builtin + */ +function filesize ($filename) {} + +/** + * Gets file type + * @link http://www.php.net/manual/en/function.filetype.php + * @param filename string

+ * Path to the file. + *

+ * @return string the type of the file. Possible values are fifo, char, + * dir, block, link, file, socket and unknown. + *

+ *

+ * Returns false if an error occurs. filetype will also + * produce an E_NOTICE message if the stat call fails + * or if the file type is unknown. + * + * @jms-builtin + */ +function filetype ($filename) {} + +/** + * Checks whether a file or directory exists + * @link http://www.php.net/manual/en/function.file-exists.php + * @param filename string

+ * Path to the file or directory. + *

+ *

+ * On windows, use //computername/share/filename or + * \\computername\share\filename to check files on + * network shares. + *

+ * @return bool true if the file or directory specified by + * filename exists; false otherwise. + *

+ *

+ * This function will return false for symlinks pointing to non-existing + * files. + *

+ *

+ * This function returns false for files inaccessible due to safe mode restrictions. However these + * files still can be included if + * they are located in safe_mode_include_dir. + *

+ *

+ * The check is done using the real UID/GID instead of the effective one. + * + * @jms-builtin + */ +function file_exists ($filename) {} + +/** + * Tells whether the filename is writable + * @link http://www.php.net/manual/en/function.is-writable.php + * @param filename string

+ * The filename being checked. + *

+ * @return bool true if the filename exists and is + * writable. + * + * @jms-builtin + */ +function is_writable ($filename) {} + +/** + * &Alias; is_writable + * @link http://www.php.net/manual/en/function.is-writeable.php + * @param filename + * + * @jms-builtin + */ +function is_writeable ($filename) {} + +/** + * Tells whether a file exists and is readable + * @link http://www.php.net/manual/en/function.is-readable.php + * @param filename string

+ * Path to the file. + *

+ * @return bool true if the file or directory specified by + * filename exists and is readable, false otherwise. + * + * @jms-builtin + */ +function is_readable ($filename) {} + +/** + * Tells whether the filename is executable + * @link http://www.php.net/manual/en/function.is-executable.php + * @param filename string

+ * Path to the file. + *

+ * @return bool true if the filename exists and is executable, or false on + * error. + * + * @jms-builtin + */ +function is_executable ($filename) {} + +/** + * Tells whether the filename is a regular file + * @link http://www.php.net/manual/en/function.is-file.php + * @param filename string

+ * Path to the file. + *

+ * @return bool true if the filename exists and is a regular file, false + * otherwise. + * + * @jms-builtin + */ +function is_file ($filename) {} + +/** + * Tells whether the filename is a directory + * @link http://www.php.net/manual/en/function.is-dir.php + * @param filename string

+ * Path to the file. If filename is a relative + * filename, it will be checked relative to the current working + * directory. If filename is a symbolic or hard link + * then the link will be resolved and checked. If you have enabled &safemode;, + * or open_basedir further + * restrictions may apply. + *

+ * @return bool true if the filename exists and is a directory, false + * otherwise. + * + * @jms-builtin + */ +function is_dir ($filename) {} + +/** + * Tells whether the filename is a symbolic link + * @link http://www.php.net/manual/en/function.is-link.php + * @param filename string

+ * Path to the file. + *

+ * @return bool true if the filename exists and is a symbolic link, false + * otherwise. + * + * @jms-builtin + */ +function is_link ($filename) {} + +/** + * Gives information about a file + * @link http://www.php.net/manual/en/function.stat.php + * @param filename string

+ * Path to the file. + *

+ * @return array + * stat and fstat result + * format + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NumericAssociative (since PHP 4.0.6)Description
0devdevice number
1inoinode number *
2modeinode protection mode
3nlinknumber of links
4uiduserid of owner *
5gidgroupid of owner *
6rdevdevice type, if inode device
7sizesize in bytes
8atimetime of last access (Unix timestamp)
9mtimetime of last modification (Unix timestamp)
10ctimetime of last inode change (Unix timestamp)
11blksizeblocksize of filesystem IO **
12blocksnumber of 512-byte blocks allocated **
+ * * On Windows this will always be 0. + *

+ *

+ * ** Only valid on systems supporting the st_blksize type - other + * systems (e.g. Windows) return -1. + *

+ *

+ * In case of error, stat returns false. + * + * @jms-builtin + */ +function stat ($filename) {} + +/** + * Gives information about a file or symbolic link + * @link http://www.php.net/manual/en/function.lstat.php + * @param filename string

+ * Path to a file or a symbolic link. + *

+ * @return array See the manual page for stat for information on + * the structure of the array that lstat returns. + * This function is identical to the stat function + * except that if the filename parameter is a symbolic + * link, the status of the symbolic link is returned, not the status of the + * file pointed to by the symbolic link. + * + * @jms-builtin + */ +function lstat ($filename) {} + +/** + * Changes file owner + * @link http://www.php.net/manual/en/function.chown.php + * @param filename string

+ * Path to the file. + *

+ * @param user mixed

+ * A user name or number. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function chown ($filename, $user) {} + +/** + * Changes file group + * @link http://www.php.net/manual/en/function.chgrp.php + * @param filename string

+ * Path to the file. + *

+ * @param group mixed

+ * A group name or number. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function chgrp ($filename, $group) {} + +/** + * Changes user ownership of symlink + * @link http://www.php.net/manual/en/function.lchown.php + * @param filename string

+ * Path to the file. + *

+ * @param user mixed

+ * User name or number. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function lchown ($filename, $user) {} + +/** + * Changes group ownership of symlink + * @link http://www.php.net/manual/en/function.lchgrp.php + * @param filename string

+ * Path to the symlink. + *

+ * @param group mixed

+ * The group specified by name or number. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function lchgrp ($filename, $group) {} + +/** + * Changes file mode + * @link http://www.php.net/manual/en/function.chmod.php + * @param filename string

+ * Path to the file. + *

+ * @param mode int

+ * Note that mode is not automatically + * assumed to be an octal value, so strings (such as "g+w") will + * not work properly. To ensure the expected operation, + * you need to prefix mode with a zero (0): + *

+ *

+ * ]]> + *

+ *

+ * The mode parameter consists of three octal + * number components specifying access restrictions for the owner, + * the user group in which the owner is in, and to everybody else in + * this order. One component can be computed by adding up the needed + * permissions for that target user base. Number 1 means that you + * grant execute rights, number 2 means that you make the file + * writeable, number 4 means that you make the file readable. Add + * up these numbers to specify needed rights. You can also read more + * about modes on Unix systems with 'man 1 chmod' + * and 'man 2 chmod'. + *

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function chmod ($filename, $mode) {} + +/** + * Sets access and modification time of file + * @link http://www.php.net/manual/en/function.touch.php + * @param filename string

+ * The name of the file being touched. + *

+ * @param time int[optional]

+ * The touch time. If time is not supplied, + * the current system time is used. + *

+ * @param atime int[optional]

+ * If present, the access time of the given filename is set to + * the value of atime. Otherwise, it is set to + * time. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function touch ($filename, $time = null, $atime = null) {} + +/** + * Clears file status cache + * @link http://www.php.net/manual/en/function.clearstatcache.php + * @param clear_realpath_cache bool[optional]

+ * Whether to clear the realpath cache or not. + *

+ * @param filename string[optional]

+ * Clear the realpath cache for a specific filename; only used if + * clear_realpath_cache is true. + *

+ * @return void + * + * @jms-builtin + */ +function clearstatcache ($clear_realpath_cache = null, $filename = null) {} + +/** + * Returns the total size of a filesystem or disk partition + * @link http://www.php.net/manual/en/function.disk-total-space.php + * @param directory string

+ * A directory of the filesystem or disk partition. + *

+ * @return float the total number of bytes as a float + * &return.falseforfailure;. + * + * @jms-builtin + */ +function disk_total_space ($directory) {} + +/** + * Returns available space on filesystem or disk partition + * @link http://www.php.net/manual/en/function.disk-free-space.php + * @param directory string

+ * A directory of the filesystem or disk partition. + *

+ *

+ * Given a file name instead of a directory, the behaviour of the + * function is unspecified and may differ between operating systems and + * PHP versions. + *

+ * @return float the number of available bytes as a float + * &return.falseforfailure;. + * + * @jms-builtin + */ +function disk_free_space ($directory) {} + +/** + * &Alias; disk_free_space + * @link http://www.php.net/manual/en/function.diskfreespace.php + * @param path + * + * @jms-builtin + */ +function diskfreespace ($path) {} + +/** + * Send mail + * @link http://www.php.net/manual/en/function.mail.php + * @param to string

+ * Receiver, or receivers of the mail. + *

+ *

+ * The formatting of this string must comply with + * RFC 2822. Some examples are: + * user@example.com + * user@example.com, anotheruser@example.com + * User <user@example.com> + * User <user@example.com>, Another User <anotheruser@example.com> + *

+ * @param subject string

+ * Subject of the email to be sent. + *

+ *

+ * Subject must satisfy RFC 2047. + *

+ * @param message string

+ * Message to be sent. + *

+ *

+ * Each line should be separated with a LF (\n). Lines should not be larger + * than 70 characters. + *

+ *

+ * (Windows only) When PHP is talking to a SMTP server directly, if a full + * stop is found on the start of a line, it is removed. To counter-act this, + * replace these occurrences with a double dot. + * ]]> + *

+ * @param additional_headers string[optional]

+ * String to be inserted at the end of the email header. + *

+ *

+ * This is typically used to add extra headers (From, Cc, and Bcc). + * Multiple extra headers should be separated with a CRLF (\r\n). + *

+ *

+ * When sending mail, the mail must contain + * a From header. This can be set with the + * additional_headers parameter, or a default + * can be set in &php.ini;. + *

+ *

+ * Failing to do this will result in an error + * message similar to Warning: mail(): "sendmail_from" not + * set in php.ini or custom "From:" header missing. + * The From header sets also + * Return-Path under Windows. + *

+ *

+ * If messages are not received, try using a LF (\n) only. + * Some poor quality Unix mail transfer agents replace LF by CRLF + * automatically (which leads to doubling CR if CRLF is used). + * This should be a last resort, as it does not comply with + * RFC 2822. + *

+ * @param additional_parameters string[optional]

+ * The additional_parameters parameter + * can be used to pass additional flags as command line options to the + * program configured to be used when sending mail, as defined by the + * sendmail_path configuration setting. For example, + * this can be used to set the envelope sender address when using + * sendmail with the -f sendmail option. + *

+ *

+ * The user that the webserver runs as should be added as a trusted user to the + * sendmail configuration to prevent a 'X-Warning' header from being added + * to the message when the envelope sender (-f) is set using this method. + * For sendmail users, this file is /etc/mail/trusted-users. + *

+ * @return bool true if the mail was successfully accepted for delivery, false otherwise. + *

+ *

+ * It is important to note that just because the mail was accepted for delivery, + * it does NOT mean the mail will actually reach the intended destination. + * + * @jms-builtin + */ +function mail ($to, $subject, $message, $additional_headers = null, $additional_parameters = null) {} + +/** + * Calculate the hash value needed by EZMLM + * @link http://www.php.net/manual/en/function.ezmlm-hash.php + * @param addr string

+ * The email address that's being hashed. + *

+ * @return int The hash value of addr. + * + * @jms-builtin + */ +function ezmlm_hash ($addr) {} + +/** + * Open connection to system logger + * @link http://www.php.net/manual/en/function.openlog.php + * @param ident string

+ * The string ident is added to each message. + *

+ * @param option int

+ * The option argument is used to indicate + * what logging options will be used when generating a log message. + * + * openlog Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
LOG_CONS + * if there is an error while sending data to the system logger, + * write directly to the system console + *
LOG_NDELAY + * open the connection to the logger immediately + *
LOG_ODELAY + * (default) delay opening the connection until the first + * message is logged + *
LOG_PERRORprint log message also to standard error
LOG_PIDinclude PID with each message
+ * You can use one or more of this options. When using multiple options + * you need to OR them, i.e. to open the connection + * immediately, write to the console and include the PID in each message, + * you will use: LOG_CONS | LOG_NDELAY | LOG_PID + *

+ * @param facility int

+ * The facility argument is used to specify what + * type of program is logging the message. This allows you to specify + * (in your machine's syslog configuration) how messages coming from + * different facilities will be handled. + * + * openlog Facilities + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
LOG_AUTH + * security/authorization messages (use + * LOG_AUTHPRIV instead + * in systems where that constant is defined) + *
LOG_AUTHPRIVsecurity/authorization messages (private)
LOG_CRONclock daemon (cron and at)
LOG_DAEMONother system daemons
LOG_KERNkernel messages
LOG_LOCAL0 ... LOG_LOCAL7reserved for local use, these are not available in Windows
LOG_LPRline printer subsystem
LOG_MAILmail subsystem
LOG_NEWSUSENET news subsystem
LOG_SYSLOGmessages generated internally by syslogd
LOG_USERgeneric user-level messages
LOG_UUCPUUCP subsystem
+ *

+ *

+ * LOG_USER is the only valid log type under Windows + * operating systems + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openlog ($ident, $option, $facility) {} + +/** + * Generate a system log message + * @link http://www.php.net/manual/en/function.syslog.php + * @param priority int

+ * priority is a combination of the facility and + * the level. Possible values are: + * + * syslog Priorities (in descending order) + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
LOG_EMERGsystem is unusable
LOG_ALERTaction must be taken immediately
LOG_CRITcritical conditions
LOG_ERRerror conditions
LOG_WARNINGwarning conditions
LOG_NOTICEnormal, but significant, condition
LOG_INFOinformational message
LOG_DEBUGdebug-level message
+ *

+ * @param message string

+ * The message to send, except that the two characters + * %m will be replaced by the error message string + * (strerror) corresponding to the present value of + * errno. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function syslog ($priority, $message) {} + +/** + * Close connection to system logger + * @link http://www.php.net/manual/en/function.closelog.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function closelog () {} + +/** + * Initializes all syslog related variables + * @link http://www.php.net/manual/en/function.define-syslog-variables.php + * @return void + * + * @jms-builtin + */ +function define_syslog_variables () {} + +/** + * Combined linear congruential generator + * @link http://www.php.net/manual/en/function.lcg-value.php + * @return float A pseudo random float value in the range of (0, 1) + * + * @jms-builtin + */ +function lcg_value () {} + +/** + * Calculate the metaphone key of a string + * @link http://www.php.net/manual/en/function.metaphone.php + * @param str string

+ * The input string. + *

+ * @param phonemes int[optional]

+ * This parameter restricts the returned metaphone key to + * phonemes characters in length. + * The default value of 0 means no restriction. + *

+ * @return string the metaphone key as a string, &return.falseforfailure;. + * + * @jms-builtin + */ +function metaphone ($str, $phonemes = null) {} + +/** + * Turn on output buffering + * @link http://www.php.net/manual/en/function.ob-start.php + * @param output_callback callback[optional]

+ * An optional output_callback function may be + * specified. This function takes a string as a parameter and should + * return a string. The function will be called when + * the output buffer is flushed (sent) or cleaned (with + * ob_flush, ob_clean or similar + * function) or when the output buffer + * is flushed to the browser at the end of the request. When + * output_callback is called, it will receive the + * contents of the output buffer as its parameter and is expected to + * return a new output buffer as a result, which will be sent to the + * browser. If the output_callback is not a + * callable function, this function will return false. + *

+ *

+ * If the callback function has two parameters, the second parameter is + * filled with a bit-field consisting of + * PHP_OUTPUT_HANDLER_START, + * PHP_OUTPUT_HANDLER_CONT and + * PHP_OUTPUT_HANDLER_END. + *

+ *

+ * If output_callback returns false original + * input is sent to the browser. + *

+ *

+ * The output_callback parameter may be bypassed + * by passing a &null; value. + *

+ *

+ * ob_end_clean, ob_end_flush, + * ob_clean, ob_flush and + * ob_start may not be called from a callback + * function. If you call them from callback function, the behavior is + * undefined. If you would like to delete the contents of a buffer, + * return "" (a null string) from callback function. + * You can't even call functions using the output buffering functions like + * print_r($expression, true) or + * highlight_file($filename, true) from a callback + * function. + *

+ *

+ * In PHP 4.0.4, ob_gzhandler was introduced to + * facilitate sending gz-encoded data to web browsers that support + * compressed web pages. ob_gzhandler determines + * what type of content encoding the browser will accept and will return + * its output accordingly. + *

+ * @param chunk_size int[optional]

+ * If the optional parameter chunk_size is passed, the + * buffer will be flushed after any output call which causes the buffer's + * length to equal or exceed chunk_size. + * Default value 0 means that the function is called only in the end, + * other special value 1 sets chunk_size to 4096. + *

+ * @param erase bool[optional]

+ * If the optional parameter erase is set to false, + * the buffer will not be deleted until the script finishes. + * This causes that flushing and cleaning functions would issue a notice + * and return false if called. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ob_start ($output_callback = null, $chunk_size = null, $erase = null) {} + +/** + * Flush (send) the output buffer + * @link http://www.php.net/manual/en/function.ob-flush.php + * @return void + * + * @jms-builtin + */ +function ob_flush () {} + +/** + * Clean (erase) the output buffer + * @link http://www.php.net/manual/en/function.ob-clean.php + * @return void + * + * @jms-builtin + */ +function ob_clean () {} + +/** + * Flush (send) the output buffer and turn off output buffering + * @link http://www.php.net/manual/en/function.ob-end-flush.php + * @return bool Returns true on success or false on failure. Reasons for failure are first that you called the + * function without an active buffer or that for some reason a buffer could + * not be deleted (possible for special buffer). + * + * @jms-builtin + */ +function ob_end_flush () {} + +/** + * Clean (erase) the output buffer and turn off output buffering + * @link http://www.php.net/manual/en/function.ob-end-clean.php + * @return bool Returns true on success or false on failure. Reasons for failure are first that you called the + * function without an active buffer or that for some reason a buffer could + * not be deleted (possible for special buffer). + * + * @jms-builtin + */ +function ob_end_clean () {} + +/** + * Flush the output buffer, return it as a string and turn off output buffering + * @link http://www.php.net/manual/en/function.ob-get-flush.php + * @return string the output buffer or false if no buffering is active. + * + * @jms-builtin + */ +function ob_get_flush () {} + +/** + * Get current buffer contents and delete current output buffer + * @link http://www.php.net/manual/en/function.ob-get-clean.php + * @return string the contents of the output buffer and end output buffering. + * If output buffering isn't active then false is returned. + * + * @jms-builtin + */ +function ob_get_clean () {} + +/** + * Return the length of the output buffer + * @link http://www.php.net/manual/en/function.ob-get-length.php + * @return int the length of the output buffer contents or false if no + * buffering is active. + * + * @jms-builtin + */ +function ob_get_length () {} + +/** + * Return the nesting level of the output buffering mechanism + * @link http://www.php.net/manual/en/function.ob-get-level.php + * @return int the level of nested output buffering handlers or zero if output + * buffering is not active. + * + * @jms-builtin + */ +function ob_get_level () {} + +/** + * Get status of output buffers + * @link http://www.php.net/manual/en/function.ob-get-status.php + * @param full_status bool[optional]

+ * true to return all active output buffer levels. If false or not + * set, only the top level output buffer is returned. + *

+ * @return array If called without the full_status parameter + * or with full_status = false a simple array + * with the following elements is returned: + * 2 + * [type] => 0 + * [status] => 0 + * [name] => URL-Rewriter + * [del] => 1 + * ) + * ]]> + * Simple ob_get_status results + * KeyValue + * levelOutput nesting level + * typePHP_OUTPUT_HANDLER_INTERNAL (0) or PHP_OUTPUT_HANDLER_USER (1) + * statusOne of PHP_OUTPUT_HANDLER_START (0), PHP_OUTPUT_HANDLER_CONT (1) or PHP_OUTPUT_HANDLER_END (2) + * nameName of active output handler or ' default output handler' if none is set + * delErase-flag as set by ob_start + *

+ *

+ * If called with full_status = true an array + * with one element for each active output buffer level is returned. + * The output level is used as key of the top level array and each array + * element itself is another array holding status information + * on one active output level. + * Array + * ( + * [chunk_size] => 0 + * [size] => 40960 + * [block_size] => 10240 + * [type] => 1 + * [status] => 0 + * [name] => default output handler + * [del] => 1 + * ) + * [1] => Array + * ( + * [chunk_size] => 0 + * [size] => 40960 + * [block_size] => 10240 + * [type] => 0 + * [buffer_size] => 0 + * [status] => 0 + * [name] => URL-Rewriter + * [del] => 1 + * ) + * ) + * ]]> + *

+ *

+ * The full output contains these additional elements: + * Full ob_get_status results + * KeyValue + * chunk_sizeChunk size as set by ob_start + * size... + * blocksize... + * + * @jms-builtin + */ +function ob_get_status ($full_status = null) {} + +/** + * Return the contents of the output buffer + * @link http://www.php.net/manual/en/function.ob-get-contents.php + * @return string This will return the contents of the output buffer or false, if output + * buffering isn't active. + * + * @jms-builtin + */ +function ob_get_contents () {} + +/** + * Turn implicit flush on/off + * @link http://www.php.net/manual/en/function.ob-implicit-flush.php + * @param flag int[optional]

+ * true to turn implicit flushing on, false otherwise. + *

+ * @return void + * + * @jms-builtin + */ +function ob_implicit_flush ($flag = null) {} + +/** + * List all output handlers in use + * @link http://www.php.net/manual/en/function.ob-list-handlers.php + * @return array This will return an array with the output handlers in use (if any). If + * output_buffering is enabled or + * an anonymous function was used with ob_start, + * ob_list_handlers will return "default output + * handler". + * + * @jms-builtin + */ +function ob_list_handlers () {} + +/** + * Sort an array by key + * @link http://www.php.net/manual/en/function.ksort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * You may modify the behavior of the sort using the optional + * parameter sort_flags, for details + * see sort. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ksort (array &$array, $sort_flags = null) {} + +/** + * Sort an array by key in reverse order + * @link http://www.php.net/manual/en/function.krsort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * You may modify the behavior of the sort using the optional parameter + * sort_flags, for details see + * sort. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function krsort (array &$array, $sort_flags = null) {} + +/** + * Sort an array using a "natural order" algorithm + * @link http://www.php.net/manual/en/function.natsort.php + * @param array array

+ * The input array. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function natsort (array &$array) {} + +/** + * Sort an array using a case insensitive "natural order" algorithm + * @link http://www.php.net/manual/en/function.natcasesort.php + * @param array array

+ * The input array. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function natcasesort (array &$array) {} + +/** + * Sort an array and maintain index association + * @link http://www.php.net/manual/en/function.asort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * You may modify the behavior of the sort using the optional + * parameter sort_flags, for details + * see sort. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function asort (array &$array, $sort_flags = null) {} + +/** + * Sort an array in reverse order and maintain index association + * @link http://www.php.net/manual/en/function.arsort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * You may modify the behavior of the sort using the optional parameter + * sort_flags, for details see + * sort. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function arsort (array &$array, $sort_flags = null) {} + +/** + * Sort an array + * @link http://www.php.net/manual/en/function.sort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * The optional second parameter sort_flags + * may be used to modify the sorting behavior using these values: + *

+ *

+ * Sorting type flags: + * SORT_REGULAR - compare items normally + * (don't change types) + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function sort (array &$array, $sort_flags = null) {} + +/** + * Sort an array in reverse order + * @link http://www.php.net/manual/en/function.rsort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * You may modify the behavior of the sort using the optional + * parameter sort_flags, for details see + * sort. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function rsort (array &$array, $sort_flags = null) {} + +/** + * Sort an array by values using a user-defined comparison function + * @link http://www.php.net/manual/en/function.usort.php + * @param array array

+ * The input array. + *

+ * @param cmp_function callback

+ * The comparison function must return an integer less than, equal to, or + * greater than zero if the first argument is considered to be + * respectively less than, equal to, or greater than the second. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function usort (array &$array, $cmp_function) {} + +/** + * Sort an array with a user-defined comparison function and maintain index association + * @link http://www.php.net/manual/en/function.uasort.php + * @param array array

+ * The input array. + *

+ * @param cmp_function callback

+ * See usort and uksort for + * examples of user-defined comparison functions. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function uasort (array &$array, $cmp_function) {} + +/** + * Sort an array by keys using a user-defined comparison function + * @link http://www.php.net/manual/en/function.uksort.php + * @param array array

+ * The input array. + *

+ * @param cmp_function callback

+ * The callback comparison function. + *

+ *

+ * Function cmp_function should accept two + * parameters which will be filled by pairs of array keys. + * The comparison function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function uksort (array &$array, $cmp_function) {} + +/** + * Shuffle an array + * @link http://www.php.net/manual/en/function.shuffle.php + * @param array array

+ * The array. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function shuffle (array &$array) {} + +/** + * Apply a user function to every member of an array + * @link http://www.php.net/manual/en/function.array-walk.php + * @param array array

+ * The input array. + *

+ * @param funcname callback

+ * Typically, funcname takes on two parameters. + * The array parameter's value being the first, and + * the key/index second. + *

+ *

+ * If funcname needs to be working with the + * actual values of the array, specify the first parameter of + * funcname as a + * reference. Then, + * any changes made to those elements will be made in the + * original array itself. + *

+ *

+ * Users may not change the array itself from the + * callback function. e.g. Add/delete elements, unset elements, etc. If + * the array that array_walk is applied to is + * changed, the behavior of this function is undefined, and unpredictable. + *

+ * @param userdata mixed[optional]

+ * If the optional userdata parameter is supplied, + * it will be passed as the third parameter to the callback + * funcname. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function array_walk (array &$array, $funcname, $userdata = null) {} + +/** + * Apply a user function recursively to every member of an array + * @link http://www.php.net/manual/en/function.array-walk-recursive.php + * @param input array

+ * The input array. + *

+ * @param funcname callback

+ * Typically, funcname takes on two parameters. + * The input parameter's value being the first, and + * the key/index second. + *

+ *

+ * If funcname needs to be working with the + * actual values of the array, specify the first parameter of + * funcname as a + * reference. Then, + * any changes made to those elements will be made in the + * original array itself. + *

+ * @param userdata mixed[optional]

+ * If the optional userdata parameter is supplied, + * it will be passed as the third parameter to the callback + * funcname. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function array_walk_recursive (array &$input, $funcname, $userdata = null) {} + +/** + * Count all elements in an array, or properties in an object + * @link http://www.php.net/manual/en/function.count.php + * @param var mixed

+ * The array. + *

+ * @param mode int[optional]

+ * If the optional mode parameter is set to + * COUNT_RECURSIVE (or 1), count + * will recursively count the array. This is particularly useful for + * counting all the elements of a multidimensional array. + * count does not detect infinite recursion. + *

+ * @return int the number of elements in var, which is + * typically an array, since anything else will have one + * element. + *

+ *

+ * If var is not an array or an object with + * implemented Countable interface, + * 1 will be returned. + * There is one exception, if var is &null;, + * 0 will be returned. + *

+ *

+ * count may return 0 for a variable that isn't set, + * but it may also return 0 for a variable that has been initialized with an + * empty array. Use isset to test if a variable is set. + * + * @jms-builtin + */ +function count ($var, $mode = null) {} + +/** + * Set the internal pointer of an array to its last element + * @link http://www.php.net/manual/en/function.end.php + * @param array array

+ * The array. This array is passed by reference because it is modified by + * the function. This means you must pass it a real variable and not + * a function returning an array because only actual variables may be + * passed by reference. + *

+ * @return mixed the value of the last element or false for empty array. + * + * @jms-builtin + */ +function end (array &$array) {} + +/** + * Rewind the internal array pointer + * @link http://www.php.net/manual/en/function.prev.php + * @param array array

+ * The input array. + *

+ * @return mixed the array value in the previous place that's pointed to by + * the internal array pointer, or false if there are no more + * elements. + * + * @jms-builtin + */ +function prev (array &$array) {} + +/** + * Advance the internal array pointer of an array + * @link http://www.php.net/manual/en/function.next.php + * @param array array

+ * The array being affected. + *

+ * @return mixed the array value in the next place that's pointed to by the + * internal array pointer, or false if there are no more elements. + * + * @jms-builtin + */ +function next (array &$array) {} + +/** + * Set the internal pointer of an array to its first element + * @link http://www.php.net/manual/en/function.reset.php + * @param array array

+ * The input array. + *

+ * @return mixed the value of the first array element, or false if the array is + * empty. + * + * @jms-builtin + */ +function reset (array &$array) {} + +/** + * Return the current element in an array + * @link http://www.php.net/manual/en/function.current.php + * @param array array

+ * The array. + *

+ * @return mixed The current function simply returns the + * value of the array element that's currently being pointed to by the + * internal pointer. It does not move the pointer in any way. If the + * internal pointer points beyond the end of the elements list or the array is + * empty, current returns false. + * + * @jms-builtin + */ +function current (array $array) {} + +/** + * Fetch a key from an array + * @link http://www.php.net/manual/en/function.key.php + * @param array array

+ * The array. + *

+ * @return mixed The key function simply returns the + * key of the array element that's currently being pointed to by the + * internal pointer. It does not move the pointer in any way. If the + * internal pointer points beyond the end of the elements list or the array is + * empty, key returns &null;. + * + * @jms-builtin + */ +function key (array &$array) {} + +/** + * Find lowest value + * @link http://www.php.net/manual/en/function.min.php + * @param values array

+ * An array containing the values. + *

+ * @return mixed min returns the numerically lowest of the + * parameter values. + * + * @jms-builtin + * @jms-variable-parameters + */ +function min (array $values) {} + +/** + * Find highest value + * @link http://www.php.net/manual/en/function.max.php + * @param values array

+ * An array containing the values. + *

+ * @return mixed max returns the numerically highest of the + * parameter values. If multiple values can be considered of the same size, + * the one that is listed first will be returned. + *

+ *

+ * When max is given multiple arrays, the + * longest array is returned. If all the arrays have the same length, + * max will use lexicographic ordering to find the return + * value. + *

+ *

+ * When given a string it will be cast as an integer + * when comparing. + * + * @jms-builtin + * @jms-variable-parameters + */ +function max (array $values) {} + +/** + * Checks if a value exists in an array + * @link http://www.php.net/manual/en/function.in-array.php + * @param needle mixed

+ * The searched value. + *

+ *

+ * If needle is a string, the comparison is done + * in a case-sensitive manner. + *

+ * @param haystack array

+ * The array. + *

+ * @param strict bool[optional]

+ * If the third parameter strict is set to true + * then the in_array function will also check the + * types of the + * needle in the haystack. + *

+ * @return bool true if needle is found in the array, + * false otherwise. + * + * @jms-builtin + */ +function in_array ($needle, array $haystack, $strict = null) {} + +/** + * Searches the array for a given value and returns the corresponding key if successful + * @link http://www.php.net/manual/en/function.array-search.php + * @param needle mixed

+ * The searched value. + *

+ *

+ * If needle is a string, the comparison is done + * in a case-sensitive manner. + *

+ * @param haystack array

+ * The array. + *

+ * @param strict bool[optional]

+ * If the third parameter strict is set to true + * then the array_search function will search for + * identical elements in the + * haystack. This means it will also check the + * types of the + * needle in the haystack, + * and objects must be the same instance. + *

+ * @return mixed the key for needle if it is found in the + * array, false otherwise. + *

+ *

+ * If needle is found in haystack + * more than once, the first matching key is returned. To return the keys for + * all matching values, use array_keys with the optional + * search_value parameter instead. + * + * @jms-builtin + */ +function array_search ($needle, array $haystack, $strict = null) {} + +/** + * Import variables into the current symbol table from an array + * @link http://www.php.net/manual/en/function.extract.php + * @param var_array array

+ * Note that prefix is only required if + * extract_type is EXTR_PREFIX_SAME, + * EXTR_PREFIX_ALL, EXTR_PREFIX_INVALID + * or EXTR_PREFIX_IF_EXISTS. If + * the prefixed result is not a valid variable name, it is not + * imported into the symbol table. Prefixes are automatically separated from + * the array key by an underscore character. + *

+ * @param extract_type int[optional]

+ * The way invalid/numeric keys and collisions are treated is determined + * by the extract_type. It can be one of the + * following values: + * EXTR_OVERWRITE + * If there is a collision, overwrite the existing variable. + * @param prefix string[optional] Only overwrite the variable if it already exists in the + * current symbol table, otherwise do nothing. This is useful + * for defining a list of valid variables and then extracting + * only those variables you have defined out of + * $_REQUEST, for example. + * @return int the number of variables successfully imported into the symbol + * table. + * + * @jms-builtin + */ +function extract (array $var_array, $extract_type = null, $prefix = null) {} + +/** + * Create array containing variables and their values + * @link http://www.php.net/manual/en/function.compact.php + * @param varname mixed

+ * compact takes a variable number of parameters. + * Each parameter can be either a string containing the name of the + * variable, or an array of variable names. The array can contain other + * arrays of variable names inside it; compact + * handles it recursively. + *

+ * @param _ mixed[optional] + * @return array the output array with all the variables added to it. + * + * @jms-builtin + */ +function compact ($varname, $_ = null) {} + +/** + * Fill an array with values + * @link http://www.php.net/manual/en/function.array-fill.php + * @param start_index int

+ * The first index of the returned array. + * Supports non-negative indexes only. + *

+ * @param num int

+ * Number of elements to insert + *

+ * @param value mixed

+ * Value to use for filling + *

+ * @return array the filled array + * + * @jms-builtin + */ +function array_fill ($start_index, $num, $value) {} + +/** + * Fill an array with values, specifying keys + * @link http://www.php.net/manual/en/function.array-fill-keys.php + * @param keys array

+ * Array of values that will be used as keys. Illegal values + * for key will be converted to string. + *

+ * @param value mixed

+ * Value to use for filling + *

+ * @return array the filled array + * + * @jms-builtin + */ +function array_fill_keys (array $keys, $value) {} + +/** + * Create an array containing a range of elements + * @link http://www.php.net/manual/en/function.range.php + * @param low mixed

+ * Low value. + *

+ * @param high mixed

+ * High value. + *

+ * @param step number[optional]

+ * If a step value is given, it will be used as the + * increment between elements in the sequence. step + * should be given as a positive number. If not specified, + * step will default to 1. + *

+ * @return array an array of elements from low to + * high, inclusive. If low > high, the sequence will + * be from high to low. + * + * @jms-builtin + */ +function range ($low, $high, $step = null) {} + +/** + * Sort multiple or multi-dimensional arrays + * @link http://www.php.net/manual/en/function.array-multisort.php + * @param arr array

+ * An array being sorted. + *

+ * @param arg mixed[optional]

+ * Optionally another array, or sort options for the + * previous array argument: + * SORT_ASC, + * SORT_DESC, + * SORT_REGULAR, + * SORT_NUMERIC, + * SORT_STRING. + *

+ * @param arg mixed[optional] + * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function array_multisort (array &$arr, $arg = null, $arg = null, $_ = null) {} + +/** + * Push one or more elements onto the end of array + * @link http://www.php.net/manual/en/function.array-push.php + * @param array array

+ * The input array. + *

+ * @param var mixed

+ * The pushed value. + *

+ * @param _ mixed[optional] + * @return int the new number of elements in the array. + * + * @jms-builtin + */ +function array_push (array &$array, $var, $_ = null) {} + +/** + * Pop the element off the end of array + * @link http://www.php.net/manual/en/function.array-pop.php + * @param array array

+ * The array to get the value from. + *

+ * @return mixed the last value of array. + * If array is empty (or is not an array), + * &null; will be returned. + * + * @jms-builtin + */ +function array_pop (array &$array) {} + +/** + * Shift an element off the beginning of array + * @link http://www.php.net/manual/en/function.array-shift.php + * @param array array

+ * The input array. + *

+ * @return mixed the shifted value, or &null; if array is + * empty or is not an array. + * + * @jms-builtin + */ +function array_shift (array &$array) {} + +/** + * Prepend one or more elements to the beginning of an array + * @link http://www.php.net/manual/en/function.array-unshift.php + * @param array array

+ * The input array. + *

+ * @param var mixed

+ * The prepended variable. + *

+ * @param _ mixed[optional] + * @return int the new number of elements in the array. + * + * @jms-builtin + */ +function array_unshift (array &$array, $var, $_ = null) {} + +/** + * Remove a portion of the array and replace it with something else + * @link http://www.php.net/manual/en/function.array-splice.php + * @param input array

+ * The input array. + *

+ * @param offset int

+ * If offset is positive then the start of removed + * portion is at that offset from the beginning of the + * input array. If offset + * is negative then it starts that far from the end of the + * input array. + *

+ * @param length int[optional]

+ * If length is omitted, removes everything + * from offset to the end of the array. If + * length is specified and is positive, then + * that many elements will be removed. If + * length is specified and is negative then + * the end of the removed portion will be that many elements from + * the end of the array. Tip: to remove everything from + * offset to the end of the array when + * replacement is also specified, use + * count($input) for + * length. + *

+ * @param replacement mixed[optional]

+ * If replacement array is specified, then the + * removed elements are replaced with elements from this array. + *

+ *

+ * If offset and length + * are such that nothing is removed, then the elements from the + * replacement array are inserted in the place + * specified by the offset. Note that keys in + * replacement array are not preserved. + *

+ *

+ * If replacement is just one element it is + * not necessary to put array() + * around it, unless the element is an array itself, an object or &null;. + *

+ * @return array the array consisting of the extracted elements. + * + * @jms-builtin + */ +function array_splice (array &$input, $offset, $length = null, $replacement = null) {} + +/** + * Extract a slice of the array + * @link http://www.php.net/manual/en/function.array-slice.php + * @param array array

+ * The input array. + *

+ * @param offset int

+ * If offset is non-negative, the sequence will + * start at that offset in the array. If + * offset is negative, the sequence will + * start that far from the end of the array. + *

+ * @param length int[optional]

+ * If length is given and is positive, then + * the sequence will have that many elements in it. If + * length is given and is negative then the + * sequence will stop that many elements from the end of the + * array. If it is omitted, then the sequence will have everything + * from offset up until the end of the + * array. + *

+ * @param preserve_keys bool[optional]

+ * Note that array_slice will reorder and reset the + * array indices by default. You can change this behaviour by setting + * preserve_keys to true. + *

+ * @return array the slice. + * + * @jms-builtin + */ +function array_slice (array $array, $offset, $length = null, $preserve_keys = null) {} + +/** + * Merge one or more arrays + * @link http://www.php.net/manual/en/function.array-merge.php + * @param array1 array

+ * Initial array to merge. + *

+ * @param array2 array[optional] + * @param _ array[optional] + * @return array the resulting array. + * + * @jms-builtin + */ +function array_merge (array $array1, array $array2 = array(), array $_ = array()) {} + +/** + * Merge two or more arrays recursively + * @link http://www.php.net/manual/en/function.array-merge-recursive.php + * @param array1 array

+ * Initial array to merge. + *

+ * @param _ array[optional] + * @return array An array of values resulted from merging the arguments together. + * + * @jms-builtin + */ +function array_merge_recursive (array $array1, array $_ = array()) {} + +/** + * Return all the keys of an array + * @link http://www.php.net/manual/en/function.array-keys.php + * @param input array

+ * An array containing keys to return. + *

+ * @param search_value mixed[optional]

+ * If specified, then only keys containing these values are returned. + *

+ * @param strict bool[optional]

+ * Determines if strict comparison (===) should be used during the search. + *

+ * @return array an array of all the keys in input. + * + * @jms-builtin + */ +function array_keys (array $input, $search_value = null, $strict = null) {} + +/** + * Return all the values of an array + * @link http://www.php.net/manual/en/function.array-values.php + * @param input array

+ * The array. + *

+ * @return array an indexed array of values. + * + * @jms-builtin + */ +function array_values (array $input) {} + +/** + * Counts all the values of an array + * @link http://www.php.net/manual/en/function.array-count-values.php + * @param input array

+ * The array of values to count + *

+ * @return array an associative array of values from input as + * keys and their count as value. + * + * @jms-builtin + */ +function array_count_values (array $input) {} + +/** + * Return an array with elements in reverse order + * @link http://www.php.net/manual/en/function.array-reverse.php + * @param array array

+ * The input array. + *

+ * @param preserve_keys bool[optional]

+ * If set to true keys are preserved. + *

+ * @return array the reversed array. + * + * @jms-builtin + */ +function array_reverse (array $array, $preserve_keys = null) {} + +/** + * Iteratively reduce the array to a single value using a callback function + * @link http://www.php.net/manual/en/function.array-reduce.php + * @param input array

+ * The input array. + *

+ * @param function callback

+ * The callback function. + *

+ * @param initial mixed[optional]

+ * If the optional initial is available, it will + * be used at the beginning of the process, or as a final result in case + * the array is empty. + *

+ * @return mixed the resulting value. + *

+ *

+ * If the array is empty and initial is not passed, + * array_reduce returns &null;. + * + * @jms-builtin + */ +function array_reduce (array $input, $function, $initial = null) {} + +/** + * Pad array to the specified length with a value + * @link http://www.php.net/manual/en/function.array-pad.php + * @param input array

+ * Initial array of values to pad. + *

+ * @param pad_size int

+ * New size of the array. + *

+ * @param pad_value mixed

+ * Value to pad if input is less than + * pad_size. + *

+ * @return array a copy of the input padded to size specified + * by pad_size with value + * pad_value. If pad_size is + * positive then the array is padded on the right, if it's negative then + * on the left. If the absolute value of pad_size is less than or equal to + * the length of the input then no padding takes place. + * + * @jms-builtin + */ +function array_pad (array $input, $pad_size, $pad_value) {} + +/** + * Exchanges all keys with their associated values in an array + * @link http://www.php.net/manual/en/function.array-flip.php + * @param trans array

+ * An array of key/value pairs to be flipped. + *

+ * @return array the flipped array on success and &null; on failure. + * + * @jms-builtin + */ +function array_flip (array $trans) {} + +/** + * Changes all keys in an array + * @link http://www.php.net/manual/en/function.array-change-key-case.php + * @param input array

+ * The array to work on + *

+ * @param case int[optional]

+ * Either CASE_UPPER or + * CASE_LOWER (default) + *

+ * @return array an array with its keys lower or uppercased, or false if + * input is not an array. + * + * @jms-builtin + */ +function array_change_key_case (array $input, $case = null) {} + +/** + * Pick one or more random entries out of an array + * @link http://www.php.net/manual/en/function.array-rand.php + * @param input array

+ * The input array. + *

+ * @param num_req int[optional]

+ * Specifies how many entries you want to pick. Trying to pick more + * elements than there are in the array will result in an + * E_WARNING level error. + *

+ * @return mixed If you are picking only one entry, array_rand + * returns the key for a random entry. Otherwise, it returns an array + * of keys for the random entries. This is done so that you can pick + * random keys as well as values out of the array. + * + * @jms-builtin + */ +function array_rand (array $input, $num_req = null) {} + +/** + * Removes duplicate values from an array + * @link http://www.php.net/manual/en/function.array-unique.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * The optional second parameter sort_flags + * may be used to modify the sorting behavior using these values: + *

+ *

+ * Sorting type flags: + * SORT_REGULAR - compare items normally + * (don't change types) + * @return array the filtered array. + * + * @jms-builtin + */ +function array_unique (array $array, $sort_flags = null) {} + +/** + * Computes the intersection of arrays + * @link http://www.php.net/manual/en/function.array-intersect.php + * @param array1 array

+ * The array with master values to check. + *

+ * @param array2 array

+ * An array to compare values against. + *

+ * @param _ array[optional] + * @return array an array containing all of the values in + * array1 whose values exist in all of the parameters. + * + * @jms-builtin + */ +function array_intersect (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the intersection of arrays using keys for comparison + * @link http://www.php.net/manual/en/function.array-intersect-key.php + * @param array1 array

+ * The array with master keys to check. + *

+ * @param array2 array

+ * An array to compare keys against. + *

+ * @param _ array[optional] + * @return array an associative array containing all the entries of + * array1 which have keys that are present in all + * arguments. + * + * @jms-builtin + */ +function array_intersect_key (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the intersection of arrays using a callback function on the keys for comparison + * @link http://www.php.net/manual/en/function.array-intersect-ukey.php + * @param array1 array

+ * Initial array for comparison of the arrays. + *

+ * @param array2 array

+ * First array to compare keys against. + *

+ * @param _ array[optional] + * @param key_compare_func callback

+ * User supplied callback function to do the comparison. + *

+ * @return array the values of array1 whose keys exist + * in all the arguments. + * + * @jms-builtin + */ +function array_intersect_ukey (array $array1, array $array2, array $_ = null, $key_compare_func) {} + +/** + * Computes the intersection of arrays, compares data by a callback function + * @link http://www.php.net/manual/en/function.array-uintersect.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * The callback comparison function. + *

+ *

+ * The user supplied callback function is used for comparison. + * It must return an integer less than, equal to, or greater than zero if + * the first argument is considered to be respectively less than, equal + * to, or greater than the second. + *

+ * @return array an array containing all the values of array1 + * that are present in all the arguments. + * + * @jms-builtin + */ +function array_uintersect (array $array1, array $array2, array $_ = null, $data_compare_func) {} + +/** + * Computes the intersection of arrays with additional index check + * @link http://www.php.net/manual/en/function.array-intersect-assoc.php + * @param array1 array

+ * The array with master values to check. + *

+ * @param array2 array

+ * An array to compare values against. + *

+ * @param _ array[optional] + * @return array an associative array containing all the values in + * array1 that are present in all of the arguments. + * + * @jms-builtin + */ +function array_intersect_assoc (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the intersection of arrays with additional index check, compares data by a callback function + * @link http://www.php.net/manual/en/function.array-uintersect-assoc.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * For comparison is used the user supplied callback function. + * It must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @return array an array containing all the values of + * array1 that are present in all the arguments. + * + * @jms-builtin + */ +function array_uintersect_assoc (array $array1, array $array2, array $_ = null, $data_compare_func) {} + +/** + * Computes the intersection of arrays with additional index check, compares indexes by a callback function + * @link http://www.php.net/manual/en/function.array-intersect-uassoc.php + * @param array1 array

+ * Initial array for comparison of the arrays. + *

+ * @param array2 array

+ * First array to compare keys against. + *

+ * @param _ array[optional] + * @param key_compare_func callback

+ * User supplied callback function to do the comparison. + *

+ * @return array the values of array1 whose values exist + * in all of the arguments. + * + * @jms-builtin + */ +function array_intersect_uassoc (array $array1, array $array2, array $_ = null, $key_compare_func) {} + +/** + * Computes the intersection of arrays with additional index check, compares data and indexes by a callback functions + * @link http://www.php.net/manual/en/function.array-uintersect-uassoc.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * For comparison is used the user supplied callback function. + * It must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @param key_compare_func callback

+ * Key comparison callback function. + *

+ * @return array an array containing all the values of + * array1 that are present in all the arguments. + * + * @jms-builtin + */ +function array_uintersect_uassoc (array $array1, array $array2, array $_ = null, $data_compare_func, $key_compare_func) {} + +/** + * Computes the difference of arrays + * @link http://www.php.net/manual/en/function.array-diff.php + * @param array1 array

+ * The array to compare from + *

+ * @param array2 array

+ * An array to compare against + *

+ * @param _ array[optional] + * @return array an array containing all the entries from + * array1 that are not present in any of the other arrays. + * + * @jms-builtin + */ +function array_diff (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the difference of arrays using keys for comparison + * @link http://www.php.net/manual/en/function.array-diff-key.php + * @param array1 array

+ * The array to compare from + *

+ * @param array2 array

+ * An array to compare against + *

+ * @param _ array[optional] + * @return array an array containing all the entries from + * array1 whose keys are not present in any of the + * other arrays. + * + * @jms-builtin + */ +function array_diff_key (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the difference of arrays using a callback function on the keys for comparison + * @link http://www.php.net/manual/en/function.array-diff-ukey.php + * @param array1 array

+ * The array to compare from + *

+ * @param array2 array

+ * An array to compare against + *

+ * @param _ array[optional] + * @param key_compare_func callback

+ * callback function to use. + * The callback function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the second. + *

+ * @return array an array containing all the entries from + * array1 that are not present in any of the other arrays. + * + * @jms-builtin + */ +function array_diff_ukey (array $array1, array $array2, array $_ = null, $key_compare_func) {} + +/** + * Computes the difference of arrays by using a callback function for data comparison + * @link http://www.php.net/manual/en/function.array-udiff.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * The callback comparison function. + *

+ *

+ * The user supplied callback function is used for comparison. + * It must return an integer less than, equal to, or greater than zero if + * the first argument is considered to be respectively less than, equal + * to, or greater than the second. + *

+ * @return array an array containing all the values of array1 + * that are not present in any of the other arguments. + * + * @jms-variable-parameters + * @jms-builtin + */ +function array_udiff (array $array1, array $array2, array $_ = null, $data_compare_func) {} + +/** + * Computes the difference of arrays with additional index check + * @link http://www.php.net/manual/en/function.array-diff-assoc.php + * @param array1 array

+ * The array to compare from + *

+ * @param array2 array

+ * An array to compare against + *

+ * @param _ array[optional] + * @return array an array containing all the values from + * array1 that are not present in any of the other arrays. + * + * @jms-builtin + */ +function array_diff_assoc (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the difference of arrays with additional index check, compares data by a callback function + * @link http://www.php.net/manual/en/function.array-udiff-assoc.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * The callback comparison function. + *

+ *

+ * The user supplied callback function is used for comparison. + * It must return an integer less than, equal to, or greater than zero if + * the first argument is considered to be respectively less than, equal + * to, or greater than the second. + *

+ * @return array array_udiff_assoc returns an array + * containing all the values from array1 + * that are not present in any of the other arguments. + * Note that the keys are used in the comparison unlike + * array_diff and array_udiff. + * The comparison of arrays' data is performed by using an user-supplied + * callback. In this aspect the behaviour is opposite to the behaviour of + * array_diff_assoc which uses internal function for + * comparison. + * + * @jms-builtin + */ +function array_udiff_assoc (array $array1, array $array2, array $_ = null, $data_compare_func) {} + +/** + * Computes the difference of arrays with additional index check which is performed by a user supplied callback function + * @link http://www.php.net/manual/en/function.array-diff-uassoc.php + * @param array1 array

+ * The array to compare from + *

+ * @param array2 array

+ * An array to compare against + *

+ * @param _ array[optional] + * @param key_compare_func callback

+ * callback function to use. + * The callback function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the second. + *

+ * @return array an array containing all the entries from + * array1 that are not present in any of the other arrays. + * + * @jms-builtin + */ +function array_diff_uassoc (array $array1, array $array2, array $_ = null, $key_compare_func) {} + +/** + * Computes the difference of arrays with additional index check, compares data and indexes by a callback function + * @link http://www.php.net/manual/en/function.array-udiff-uassoc.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * The callback comparison function. + *

+ *

+ * The user supplied callback function is used for comparison. + * It must return an integer less than, equal to, or greater than zero if + * the first argument is considered to be respectively less than, equal + * to, or greater than the second. + *

+ *

+ * The comparison of arrays' data is performed by using an user-supplied + * callback : data_compare_func. In this aspect + * the behaviour is opposite to the behaviour of + * array_diff_assoc which uses internal function for + * comparison. + *

+ * @param key_compare_func callback

+ * The comparison of keys (indices) is done also by the callback function + * key_compare_func. This behaviour is unlike what + * array_udiff_assoc does, since the latter compares + * the indices by using an internal function. + *

+ * @return array an array containing all the values from + * array1 that are not present in any of the other + * arguments. + * + * @jms-builtin + */ +function array_udiff_uassoc (array $array1, array $array2, array $_ = null, $data_compare_func, $key_compare_func) {} + +/** + * Calculate the sum of values in an array + * @link http://www.php.net/manual/en/function.array-sum.php + * @param array array

+ * The input array. + *

+ * @return number the sum of values as an integer or float. + * + * @jms-builtin + */ +function array_sum (array $array) {} + +/** + * Calculate the product of values in an array + * @link http://www.php.net/manual/en/function.array-product.php + * @param array array

+ * The array. + *

+ * @return number the product as an integer or float. + * + * @jms-builtin + */ +function array_product (array $array) {} + +/** + * Filters elements of an array using a callback function + * @link http://www.php.net/manual/en/function.array-filter.php + * @param input array

+ * The array to iterate over + *

+ * @param callback callback[optional]

+ * The callback function to use + *

+ *

+ * If no callback is supplied, all entries of + * input equal to false (see + * converting to + * boolean) will be removed. + *

+ * @return array the filtered array. + * + * @jms-builtin + */ +function array_filter (array $input, $callback = null) {} + +/** + * Applies the callback to the elements of the given arrays + * @link http://www.php.net/manual/en/function.array-map.php + * @param callback callback

+ * Callback function to run for each element in each array. + *

+ * @param arr1 array

+ * An array to run through the callback function. + *

+ * @param _ array[optional] + * @return array an array containing all the elements of arr1 + * after applying the callback function to each one. + * + * @jms-builtin + */ +function array_map ($callback, array $arr1, array $_ = null) {} + +/** + * Split an array into chunks + * @link http://www.php.net/manual/en/function.array-chunk.php + * @param input array

+ * The array to work on + *

+ * @param size int

+ * The size of each chunk + *

+ * @param preserve_keys bool[optional]

+ * When set to true keys will be preserved. + * Default is false which will reindex the chunk numerically + *

+ * @return array a multidimensional numerically indexed array, starting with zero, + * with each dimension containing size elements. + * + * @jms-builtin + */ +function array_chunk (array $input, $size, $preserve_keys = null) {} + +/** + * Creates an array by using one array for keys and another for its values + * @link http://www.php.net/manual/en/function.array-combine.php + * @param keys array

+ * Array of keys to be used. Illegal values for key will be + * converted to string. + *

+ * @param values array

+ * Array of values to be used + *

+ * @return array the combined array, false if the number of elements + * for each array isn't equal or if the arrays are empty. + * + * @jms-builtin + */ +function array_combine (array $keys, array $values) {} + +/** + * Checks if the given key or index exists in the array + * @link http://www.php.net/manual/en/function.array-key-exists.php + * @param key mixed

+ * Value to check. + *

+ * @param search array

+ * An array with keys to check. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function array_key_exists ($key, array $search) {} + +/** + * &Alias; current + * @link http://www.php.net/manual/en/function.pos.php + * @param arg + * + * @jms-builtin + */ +function pos (&$arg) {} + +/** + * &Alias; count + * @link http://www.php.net/manual/en/function.sizeof.php + * @param var + * @param mode[optional] + * + * @jms-builtin + */ +function sizeof ($var, $mode = null) {} + +/** + * @param key + * @param search + * + * @jms-builtin + */ +function key_exists ($key, $search) {} + +/** + * Checks if assertion is &false; + * @link http://www.php.net/manual/en/function.assert.php + * @param assertion mixed

+ * The assertion. + *

+ * @return bool false if the assertion is false, true otherwise. + * + * @jms-builtin + */ +function assert ($assertion) {} + +/** + * Set/get the various assert flags + * @link http://www.php.net/manual/en/function.assert-options.php + * @param what int

+ * + * Assert Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionINI SettingDefault valueDescription
ASSERT_ACTIVEassert.active1enable assert evaluation
ASSERT_WARNINGassert.warning1issue a PHP warning for each failed assertion
ASSERT_BAILassert.bail0terminate execution on failed assertions
ASSERT_QUIET_EVALassert.quiet_eval0 + * disable error_reporting during assertion expression + * evaluation + *
ASSERT_CALLBACKassert.callbackCallback to call on failed assertions
+ *

+ * @param value mixed[optional]

+ * An optional new value for the option. + *

+ * @return mixed the original setting of any option or false on errors. + * + * @jms-builtin + */ +function assert_options ($what, $value = null) {} + +/** + * Compares two "PHP-standardized" version number strings + * @link http://www.php.net/manual/en/function.version-compare.php + * @param version1 string

+ * First version number. + *

+ * @param version2 string

+ * Second version number. + *

+ * @param operator string[optional]

+ * If you specify the third optional operator + * argument, you can test for a particular relationship. The + * possible operators are: <, + * lt, <=, + * le, >, + * gt, >=, + * ge, ==, + * =, eq, + * !=, <>, + * ne respectively. + *

+ *

+ * This parameter is case-sensitive, so values should be lowercase. + *

+ * @return mixed By default, version_compare returns + * -1 if the first version is lower than the second, + * 0 if they are equal, and + * 1 if the second is lower. + *

+ *

+ * When using the optional operator argument, the + * function will return true if the relationship is the one specified + * by the operator, false otherwise. + * + * @jms-builtin + */ +function version_compare ($version1, $version2, $operator = null) {} + +/** + * Convert a pathname and a project identifier to a System V IPC key + * @link http://www.php.net/manual/en/function.ftok.php + * @param pathname string

+ * Path to an accessible file. + *

+ * @param proj string

+ * Project identifier. This must be a one character string. + *

+ * @return int On success the return value will be the created key value, otherwise + * -1 is returned. + * + * @jms-builtin + */ +function ftok ($pathname, $proj) {} + +/** + * Perform the rot13 transform on a string + * @link http://www.php.net/manual/en/function.str-rot13.php + * @param str string

+ * The input string. + *

+ * @return string the ROT13 version of the given string. + * + * @jms-builtin + */ +function str_rot13 ($str) {} + +/** + * Retrieve list of registered filters + * @link http://www.php.net/manual/en/function.stream-get-filters.php + * @return array an indexed array containing the name of all stream filters + * available. + * + * @jms-builtin + */ +function stream_get_filters () {} + +/** + * Register a user defined stream filter + * @link http://www.php.net/manual/en/function.stream-filter-register.php + * @param filtername string

+ * The filter name to be registered. + *

+ * @param classname string

+ * To implement a filter, you need to define a class as an extension of + * php_user_filter with a number of member functions + * as defined below. When performing read/write operations on the stream + * to which your filter is attached, PHP will pass the data through your + * filter (and any other filters attached to that stream) so that the + * data may be modified as desired. You must implement the methods + * exactly as described below - doing otherwise will lead to undefined + * behaviour. + *

+ * intfilter + * resourcein + * resourceout + * intconsumed + * boolclosing + *

+ * This method is called whenever data is read from or written to + * the attached stream (such as with fread or fwrite). + * in is a resource pointing to a bucket brigade + * which contains one or more bucket objects containing data to be filtered. + * out is a resource pointing to a second bucket brigade + * into which your modified buckets should be placed. + * consumed, which must always + * be declared by reference, should be incremented by the length of the data + * which your filter reads in and alters. In most cases this means you will + * increment consumed by $bucket->datalen + * for each $bucket. If the stream is in the process of closing + * (and therefore this is the last pass through the filterchain), + * the closing parameter will be set to true. + * The filter method must return one of + * three values upon completion. + * + * Return Value + * Meaning + * + * + * PSFS_PASS_ON + * + * Filter processed successfully with data available in the + * out bucket brigade. + * + * + * + * PSFS_FEED_ME + * + * Filter processed successfully, however no data was available to + * return. More data is required from the stream or prior filter. + * + * + * + * PSFS_ERR_FATAL (default) + * + * The filter experienced an unrecoverable error and cannot continue. + * + * + *

+ * boolonCreate + * This method is called during instantiation of the filter class + * object. If your filter allocates or initializes any other resources + * (such as a buffer), this is the place to do it. Your implementation of + * this method should return false on failure, or true on success. + * When your filter is first instantiated, and + * yourfilter->onCreate() is called, a number of properties + * will be available as shown in the table below. + *

+ * + * Property + * Contents + * + * + * FilterClass->filtername + * + * A string containing the name the filter was instantiated with. + * Filters may be registered under multiple names or under wildcards. + * Use this property to determine which name was used. + * + * + * + * FilterClass->params + * + * The contents of the params parameter passed + * to stream_filter_append + * or stream_filter_prepend. + * + * + * + * FilterClass->stream + * + * The stream resource being filtered. Maybe available only during + * filter calls when the + * closing parameter is set to false. + * + * + *

+ * voidonClose + *

+ * This method is called upon filter shutdown (typically, this is also + * during stream shutdown), and is executed after + * the flush method is called. If any resources + * were allocated or initialized during onCreate() + * this would be the time to destroy or dispose of them. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * stream_filter_register will return false if the + * filtername is already defined. + * + * @jms-builtin + */ +function stream_filter_register ($filtername, $classname) {} + +/** + * Return a bucket object from the brigade for operating on + * @link http://www.php.net/manual/en/function.stream-bucket-make-writeable.php + * @param brigade resource + * @return object + * + * @jms-builtin + */ +function stream_bucket_make_writeable ($brigade) {} + +/** + * Prepend bucket to brigade + * @link http://www.php.net/manual/en/function.stream-bucket-prepend.php + * @param brigade resource + * @param bucket resource + * @return void + * + * @jms-builtin + */ +function stream_bucket_prepend ($brigade, $bucket) {} + +/** + * Append bucket to brigade + * @link http://www.php.net/manual/en/function.stream-bucket-append.php + * @param brigade resource + * @param bucket resource + * @return void + * + * @jms-builtin + */ +function stream_bucket_append ($brigade, $bucket) {} + +/** + * Create a new bucket for use on the current stream + * @link http://www.php.net/manual/en/function.stream-bucket-new.php + * @param stream resource + * @param buffer string + * @return object + * + * @jms-builtin + */ +function stream_bucket_new ($stream, $buffer) {} + +/** + * Add URL rewriter values + * @link http://www.php.net/manual/en/function.output-add-rewrite-var.php + * @param name string

+ * The variable name. + *

+ * @param value string

+ * The variable value. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function output_add_rewrite_var ($name, $value) {} + +/** + * Reset URL rewriter values + * @link http://www.php.net/manual/en/function.output-reset-rewrite-vars.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function output_reset_rewrite_vars () {} + +/** + * Returns directory path used for temporary files + * @link http://www.php.net/manual/en/function.sys-get-temp-dir.php + * @return string the path of the temporary directory. + * + * @jms-builtin + */ +function sys_get_temp_dir () {} + +define ('CONNECTION_ABORTED', 1); +define ('CONNECTION_NORMAL', 0); +define ('CONNECTION_TIMEOUT', 2); +define ('INI_USER', 1); +define ('INI_PERDIR', 2); +define ('INI_SYSTEM', 4); +define ('INI_ALL', 7); +define ('PHP_URL_SCHEME', 0); +define ('PHP_URL_HOST', 1); +define ('PHP_URL_PORT', 2); +define ('PHP_URL_USER', 3); +define ('PHP_URL_PASS', 4); +define ('PHP_URL_PATH', 5); +define ('PHP_URL_QUERY', 6); +define ('PHP_URL_FRAGMENT', 7); +define ('M_E', 2.718281828459); +define ('M_LOG2E', 1.442695040889); +define ('M_LOG10E', 0.43429448190325); +define ('M_LN2', 0.69314718055995); +define ('M_LN10', 2.302585092994); + +/** + * Round halves up + * @link http://www.php.net/manual/en/math.constants.php + */ +define ('M_PI', 3.1415926535898); +define ('M_PI_2', 1.5707963267949); +define ('M_PI_4', 0.78539816339745); +define ('M_1_PI', 0.31830988618379); +define ('M_2_PI', 0.63661977236758); +define ('M_SQRTPI', 1.7724538509055); +define ('M_2_SQRTPI', 1.1283791670955); +define ('M_LNPI', 1.1447298858494); +define ('M_EULER', 0.57721566490153); +define ('M_SQRT2', 1.4142135623731); +define ('M_SQRT1_2', 0.70710678118655); +define ('M_SQRT3', 1.7320508075689); +define ('INF', INF); +define ('NAN', NAN); +define ('INFO_GENERAL', 1); + +/** + * PHP Credits. See also phpcredits. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_CREDITS', 2); + +/** + * Current Local and Master values for PHP directives. See + * also ini_get. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_CONFIGURATION', 4); + +/** + * Loaded modules and their respective settings. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_MODULES', 8); + +/** + * Environment Variable information that's also available in + * $_ENV. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_ENVIRONMENT', 16); + +/** + * Shows all + * predefined variables from EGPCS (Environment, GET, + * POST, Cookie, Server). + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_VARIABLES', 32); + +/** + * PHP License information. See also the license faq. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_LICENSE', 64); +define ('INFO_ALL', -1); + +/** + * A list of the core developers + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_GROUP', 1); + +/** + * General credits: Language design and concept, PHP + * authors and SAPI module. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_GENERAL', 2); + +/** + * A list of the server API modules for PHP, and their authors. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_SAPI', 4); + +/** + * A list of the extension modules for PHP, and their authors. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_MODULES', 8); + +/** + * The credits for the documentation team. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_DOCS', 16); + +/** + * Usually used in combination with the other flags. Indicates + * that a complete stand-alone HTML page needs to be + * printed including the information indicated by the other + * flags. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_FULLPAGE', 32); + +/** + * The credits for the quality assurance team. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_QA', 64); + +/** + * The configuration line, &php.ini; location, build date, Web + * Server, System and more. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_ALL', -1); +define ('HTML_SPECIALCHARS', 0); +define ('HTML_ENTITIES', 1); +define ('ENT_COMPAT', 2); +define ('ENT_QUOTES', 3); +define ('ENT_NOQUOTES', 0); +define ('STR_PAD_LEFT', 0); +define ('STR_PAD_RIGHT', 1); +define ('STR_PAD_BOTH', 2); +define ('PATHINFO_DIRNAME', 1); +define ('PATHINFO_BASENAME', 2); +define ('PATHINFO_EXTENSION', 4); + +/** + * Since PHP 5.2.0. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('PATHINFO_FILENAME', 8); +define ('CHAR_MAX', 127); +define ('LC_CTYPE', 0); +define ('LC_NUMERIC', 1); +define ('LC_TIME', 2); +define ('LC_COLLATE', 3); +define ('LC_MONETARY', 4); +define ('LC_ALL', 6); +define ('LC_MESSAGES', 5); +define ('SEEK_SET', 0); +define ('SEEK_CUR', 1); +define ('SEEK_END', 2); +define ('LOCK_SH', 1); +define ('LOCK_EX', 2); +define ('LOCK_UN', 3); +define ('LOCK_NB', 4); + +/** + * A connection with an external resource has been established. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_CONNECT', 2); + +/** + * Additional authorization is required to access the specified resource. + * Typical issued with severity level of + * STREAM_NOTIFY_SEVERITY_ERR. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_AUTH_REQUIRED', 3); + +/** + * Authorization has been completed (with or without success). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_AUTH_RESULT', 10); + +/** + * The mime-type of resource has been identified, + * refer to message for a description of the + * discovered type. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_MIME_TYPE_IS', 4); + +/** + * The size of the resource has been discovered. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_FILE_SIZE_IS', 5); + +/** + * The external resource has redirected the stream to an alternate + * location. Refer to message. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_REDIRECTED', 6); + +/** + * Indicates current progress of the stream transfer in + * bytes_transferred and possibly + * bytes_max as well. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_PROGRESS', 7); + +/** + * A generic error occurred on the stream, consult + * message and message_code + * for details. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_FAILURE', 9); + +/** + * There is no more data available on the stream. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_COMPLETED', 8); + +/** + * A remote address required for this stream has been resolved, or the resolution + * failed. See severity for an indication of which happened. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_RESOLVE', 1); + +/** + * Normal, non-error related, notification. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_SEVERITY_INFO', 0); + +/** + * Non critical error condition. Processing may continue. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_SEVERITY_WARN', 1); + +/** + * A critical error occurred. Processing cannot continue. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_SEVERITY_ERR', 2); + +/** + * Used with stream_filter_append and + * stream_filter_prepend to indicate + * that the specified filter should only be applied when + * reading + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_FILTER_READ', 1); + +/** + * Used with stream_filter_append and + * stream_filter_prepend to indicate + * that the specified filter should only be applied when + * writing + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_FILTER_WRITE', 2); + +/** + * This constant is equivalent to + * STREAM_FILTER_READ | STREAM_FILTER_WRITE + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_FILTER_ALL', 3); + +/** + * Client socket opened with stream_socket_client + * should remain persistent between page loads. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_CLIENT_PERSISTENT', 1); + +/** + * Open client socket asynchronously. This option must be used + * together with the STREAM_CLIENT_CONNECT flag. + * Used with stream_socket_client. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_CLIENT_ASYNC_CONNECT', 2); + +/** + * Open client socket connection. Client sockets should always + * include this flag. Used with stream_socket_client. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_CLIENT_CONNECT', 4); +define ('STREAM_CRYPTO_METHOD_SSLv2_CLIENT', 0); +define ('STREAM_CRYPTO_METHOD_SSLv3_CLIENT', 1); +define ('STREAM_CRYPTO_METHOD_SSLv23_CLIENT', 2); +define ('STREAM_CRYPTO_METHOD_TLS_CLIENT', 3); +define ('STREAM_CRYPTO_METHOD_SSLv2_SERVER', 4); +define ('STREAM_CRYPTO_METHOD_SSLv3_SERVER', 5); +define ('STREAM_CRYPTO_METHOD_SSLv23_SERVER', 6); +define ('STREAM_CRYPTO_METHOD_TLS_SERVER', 7); + +/** + * Used with stream_socket_shutdown to disable + * further receptions. Added in PHP 5.2.1. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SHUT_RD', 0); + +/** + * Used with stream_socket_shutdown to disable + * further transmissions. Added in PHP 5.2.1. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SHUT_WR', 1); + +/** + * Used with stream_socket_shutdown to disable + * further receptions and transmissions. Added in PHP 5.2.1. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SHUT_RDWR', 2); + +/** + * Internet Protocol Version 4 (IPv4). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_PF_INET', 2); + +/** + * Internet Protocol Version 6 (IPv6). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_PF_INET6', 10); + +/** + * Unix system internal protocols. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_PF_UNIX', 1); + +/** + * Provides a IP socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_IP', 0); + +/** + * Provides a TCP socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_TCP', 6); + +/** + * Provides a UDP socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_UDP', 17); + +/** + * Provides a ICMP socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_ICMP', 1); + +/** + * Provides a RAW socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_RAW', 255); + +/** + * Provides sequenced, two-way byte streams with a transmission mechanism + * for out-of-band data (TCP, for example). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_STREAM', 1); + +/** + * Provides datagrams, which are connectionless messages (UDP, for + * example). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_DGRAM', 2); + +/** + * Provides a raw socket, which provides access to internal network + * protocols and interfaces. Usually this type of socket is just available + * to the root user. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_RAW', 3); + +/** + * Provides a sequenced packet stream socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_SEQPACKET', 5); + +/** + * Provides a RDM (Reliably-delivered messages) socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_RDM', 4); +define ('STREAM_PEEK', 2); +define ('STREAM_OOB', 1); + +/** + * Tells a stream created with stream_socket_server + * to bind to the specified target. Server sockets should always include this flag. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SERVER_BIND', 4); + +/** + * Tells a stream created with stream_socket_server + * and bound using the STREAM_SERVER_BIND flag to start + * listening on the socket. Connection-orientated transports (such as TCP) + * must use this flag, otherwise the server socket will not be enabled. + * Using this flag for connect-less transports (such as UDP) is an error. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SERVER_LISTEN', 8); + +/** + * Search for filename in + * include_path (since PHP 5). + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_USE_INCLUDE_PATH', 1); + +/** + * Strip EOL characters (since PHP 5). + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_IGNORE_NEW_LINES', 2); + +/** + * Skip empty lines (since PHP 5). + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_SKIP_EMPTY_LINES', 4); + +/** + * Append content to existing file. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_APPEND', 8); +define ('FILE_NO_DEFAULT_CONTEXT', 16); + +/** + *

+ * Text mode (since PHP 5.2.7). + *

+ * This constant has no effect, and is only available for + * forward compatibility. + *

+ *

+ * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_TEXT', 0); + +/** + *

+ * Binary mode (since PHP 5.2.7). + *

+ * This constant has no effect, and is only available for + * forward compatibility. + *

+ *

+ * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_BINARY', 0); + +/** + * Disable backslash escaping. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FNM_NOESCAPE', 2); + +/** + * Slash in string only matches slash in the given pattern. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FNM_PATHNAME', 1); + +/** + * Leading period in string must be exactly matched by period in the given pattern. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FNM_PERIOD', 4); + +/** + * Caseless match. Part of the GNU extension. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FNM_CASEFOLD', 16); + +/** + * Return Code indicating that the + * userspace filter returned buckets in $out. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_PASS_ON', 2); + +/** + * Return Code indicating that the + * userspace filter did not return buckets in $out + * (i.e. No data available). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_FEED_ME', 1); + +/** + * Return Code indicating that the + * userspace filter encountered an unrecoverable error + * (i.e. Invalid data received). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_ERR_FATAL', 0); + +/** + * Regular read/write. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_FLAG_NORMAL', 0); + +/** + * An incremental flush. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_FLAG_FLUSH_INC', 1); + +/** + * Final flush prior to closing. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_FLAG_FLUSH_CLOSE', 2); +define ('ABDAY_1', 131072); +define ('ABDAY_2', 131073); +define ('ABDAY_3', 131074); +define ('ABDAY_4', 131075); +define ('ABDAY_5', 131076); +define ('ABDAY_6', 131077); +define ('ABDAY_7', 131078); +define ('DAY_1', 131079); +define ('DAY_2', 131080); +define ('DAY_3', 131081); +define ('DAY_4', 131082); +define ('DAY_5', 131083); +define ('DAY_6', 131084); +define ('DAY_7', 131085); +define ('ABMON_1', 131086); +define ('ABMON_2', 131087); +define ('ABMON_3', 131088); +define ('ABMON_4', 131089); +define ('ABMON_5', 131090); +define ('ABMON_6', 131091); +define ('ABMON_7', 131092); +define ('ABMON_8', 131093); +define ('ABMON_9', 131094); +define ('ABMON_10', 131095); +define ('ABMON_11', 131096); +define ('ABMON_12', 131097); +define ('MON_1', 131098); +define ('MON_2', 131099); +define ('MON_3', 131100); +define ('MON_4', 131101); +define ('MON_5', 131102); +define ('MON_6', 131103); +define ('MON_7', 131104); +define ('MON_8', 131105); +define ('MON_9', 131106); +define ('MON_10', 131107); +define ('MON_11', 131108); +define ('MON_12', 131109); +define ('AM_STR', 131110); +define ('PM_STR', 131111); +define ('D_T_FMT', 131112); +define ('D_FMT', 131113); +define ('T_FMT', 131114); +define ('T_FMT_AMPM', 131115); +define ('ERA', 131116); +define ('ERA_D_T_FMT', 131120); +define ('ERA_D_FMT', 131118); +define ('ERA_T_FMT', 131121); +define ('ALT_DIGITS', 131119); +define ('CRNCYSTR', 262159); +define ('RADIXCHAR', 65536); +define ('THOUSEP', 65537); +define ('YESEXPR', 327680); +define ('NOEXPR', 327681); +define ('CODESET', 14); +define ('CRYPT_SALT_LENGTH', 12); +define ('CRYPT_STD_DES', 1); +define ('CRYPT_EXT_DES', 0); +define ('CRYPT_MD5', 1); +define ('CRYPT_BLOWFISH', 0); +define ('DIRECTORY_SEPARATOR', "/"); +define ('PATH_SEPARATOR', ":"); +define ('GLOB_BRACE', 1024); +define ('GLOB_MARK', 2); +define ('GLOB_NOSORT', 4); +define ('GLOB_NOCHECK', 16); +define ('GLOB_NOESCAPE', 64); +define ('GLOB_ERR', 1); +define ('GLOB_ONLYDIR', 8192); +define ('GLOB_AVAILABLE_FLAGS', 9303); + +/** + * system is unusable + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_EMERG', 0); + +/** + * action must be taken immediately + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_ALERT', 1); + +/** + * critical conditions + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_CRIT', 2); + +/** + * error conditions + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_ERR', 3); + +/** + * warning conditions + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_WARNING', 4); + +/** + * normal, but significant, condition + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_NOTICE', 5); + +/** + * informational message + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_INFO', 6); + +/** + * debug-level message + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_DEBUG', 7); + +/** + * kernel messages + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_KERN', 0); + +/** + * generic user-level messages + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_USER', 8); + +/** + * mail subsystem + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_MAIL', 16); + +/** + * other system daemons + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_DAEMON', 24); + +/** + * security/authorization messages (use LOG_AUTHPRIV instead + * in systems where that constant is defined) + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_AUTH', 32); + +/** + * messages generated internally by syslogd + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_SYSLOG', 40); + +/** + * line printer subsystem + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_LPR', 48); + +/** + * USENET news subsystem + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_NEWS', 56); + +/** + * UUCP subsystem + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_UUCP', 64); + +/** + * clock daemon (cron and at) + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_CRON', 72); + +/** + * security/authorization messages (private) + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_AUTHPRIV', 80); +define ('LOG_LOCAL0', 128); +define ('LOG_LOCAL1', 136); +define ('LOG_LOCAL2', 144); +define ('LOG_LOCAL3', 152); +define ('LOG_LOCAL4', 160); +define ('LOG_LOCAL5', 168); +define ('LOG_LOCAL6', 176); +define ('LOG_LOCAL7', 184); + +/** + * include PID with each message + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_PID', 1); + +/** + * if there is an error while sending data to the system logger, + * write directly to the system console + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_CONS', 2); + +/** + * (default) delay opening the connection until the first + * message is logged + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_ODELAY', 4); + +/** + * open the connection to the logger immediately + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_NDELAY', 8); +define ('LOG_NOWAIT', 16); + +/** + * print log message also to standard error + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_PERROR', 32); +define ('EXTR_OVERWRITE', 0); +define ('EXTR_SKIP', 1); +define ('EXTR_PREFIX_SAME', 2); +define ('EXTR_PREFIX_ALL', 3); +define ('EXTR_PREFIX_INVALID', 4); +define ('EXTR_PREFIX_IF_EXISTS', 5); +define ('EXTR_IF_EXISTS', 6); +define ('EXTR_REFS', 256); + +/** + * SORT_ASC is used with + * array_multisort to sort in ascending order. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_ASC', 4); + +/** + * SORT_DESC is used with + * array_multisort to sort in descending order. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_DESC', 3); + +/** + * SORT_REGULAR is used to compare items normally. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_REGULAR', 0); + +/** + * SORT_NUMERIC is used to compare items numerically. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_NUMERIC', 1); + +/** + * SORT_STRING is used to compare items as strings. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_STRING', 2); + +/** + * SORT_LOCALE_STRING is used to compare items as + * strings, based on the current locale. Added in PHP 4.4.0 and 5.0.2. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_LOCALE_STRING', 5); + +/** + * CASE_LOWER is used with + * array_change_key_case and is used to convert array + * keys to lower case. This is also the default case for + * array_change_key_case. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('CASE_LOWER', 0); + +/** + * CASE_UPPER is used with + * array_change_key_case and is used to convert array + * keys to upper case. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('CASE_UPPER', 1); +define ('COUNT_NORMAL', 0); +define ('COUNT_RECURSIVE', 1); +define ('ASSERT_ACTIVE', 1); +define ('ASSERT_CALLBACK', 2); +define ('ASSERT_BAIL', 3); +define ('ASSERT_WARNING', 4); +define ('ASSERT_QUIET_EVAL', 5); + +/** + * Flag indicating if the stream + * used the include path. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_USE_PATH', 1); +define ('STREAM_IGNORE_URL', 2); +define ('STREAM_ENFORCE_SAFE_MODE', 4); + +/** + * Flag indicating if the wrapper + * is responsible for raising errors using trigger_error + * during opening of the stream. If this flag is not set, you + * should not raise any errors. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_REPORT_ERRORS', 8); + +/** + * This flag is useful when your extension really must be able to randomly + * seek around in a stream. Some streams may not be seekable in their + * native form, so this flag asks the streams API to check to see if the + * stream does support seeking. If it does not, it will copy the stream + * into temporary storage (which may be a temporary file or a memory + * stream) which does support seeking. + * Please note that this flag is not useful when you want to seek the + * stream and write to it, because the stream you are accessing might + * not be bound to the actual resource you requested. + * If the requested resource is network based, this flag will cause the + * opener to block until the whole contents have been downloaded. + * @link http://www.php.net/manual/en/internals2.ze1.streams.constants.php + */ +define ('STREAM_MUST_SEEK', 16); +define ('STREAM_URL_STAT_LINK', 1); +define ('STREAM_URL_STAT_QUIET', 2); +define ('STREAM_MKDIR_RECURSIVE', 1); +define ('STREAM_IS_URL', 1); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_GIF', 1); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPEG', 2); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_PNG', 3); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_SWF', 4); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_PSD', 5); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_BMP', 6); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_TIFF_II', 7); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_TIFF_MM', 8); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPC', 9); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JP2', 10); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPX', 11); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JB2', 12); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_SWC', 13); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_IFF', 14); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_WBMP', 15); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPEG2000', 9); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_XBM', 16); + +/** + * IPv4 Address Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_A', 1); + +/** + * Authoritative Name Server Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_NS', 2); + +/** + * Alias (Canonical Name) Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_CNAME', 16); + +/** + * Start of Authority Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_SOA', 32); + +/** + * Pointer Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_PTR', 2048); + +/** + * Host Info Resource (See IANA's + * Operating System Names + * for the meaning of these values) + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_HINFO', 4096); + +/** + * Mail Exchanger Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_MX', 16384); + +/** + * Text Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_TXT', 32768); +define ('DNS_SRV', 33554432); +define ('DNS_NAPTR', 67108864); + +/** + * IPv6 Address Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_AAAA', 134217728); +define ('DNS_A6', 16777216); + +/** + * Any Resource Record. On most systems + * this returns all resource records, however + * it should not be counted upon for critical + * uses. Try DNS_ALL instead. + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_ANY', 268435456); + +/** + * Iteratively query the name server for + * each available record type. + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_ALL', 251713587); + +// End of standard v.5.2.13 +?> diff --git a/res/php-5.2-core-api/tidy.php b/res/php-5.2-core-api/tidy.php new file mode 100644 index 0000000..46c3801 --- /dev/null +++ b/res/php-5.2-core-api/tidy.php @@ -0,0 +1,691 @@ + + * You will find a list with each configuration option and their types + * at: &url.tidy.conf;. + *

+ * @return mixed the value of the specified option. + * The return type depends on the type of the specified one. + */ + public function getOpt ($option) {} + + /** + * Execute configured cleanup and repair operations on parsed markup + * @link http://www.php.net/manual/en/tidy.cleanrepair.php + * @return bool Returns true on success or false on failure. + */ + public function cleanRepair () {} + + /** + * Parse markup in file or URI + * @link http://www.php.net/manual/en/tidy.parsefile.php + * @param filename string

+ * If the filename parameter is given, this function + * will also read that file and initialize the object with the file, + * acting like tidy_parse_file. + *

+ * @param config mixed[optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * For an explanation about each option, see + * &url.tidy.conf;. + *

+ * @param encoding string[optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @param use_include_path bool[optional]

+ * Search for the file in the include_path. + *

+ * @return bool Returns true on success or false on failure. + */ + public function parseFile ($filename, $config = null, $encoding = null, $use_include_path = null) {} + + /** + * Parse a document stored in a string + * @link http://www.php.net/manual/en/tidy.parsestring.php + * @param input string

+ * The data to be parsed. + *

+ * @param config mixed[optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * For an explanation about each option, visit &url.tidy.conf;. + *

+ * @param encoding string[optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @return bool a new tidy instance. + */ + public function parseString ($input, $config = null, $encoding = null) {} + + /** + * Repair a string using an optionally provided configuration file + * @link http://www.php.net/manual/en/tidy.repairstring.php + * @param data string

+ * The data to be repaired. + *

+ * @param config mixed[optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * Check &url.tidy.conf; for + * an explanation about each option. + *

+ * @param encoding string[optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @return string the repaired string. + */ + public function repairString ($data, $config = null, $encoding = null) {} + + /** + * Repair a file and return it as a string + * @link http://www.php.net/manual/en/tidy.repairfile.php + * @param filename string

+ * The file to be repaired. + *

+ * @param config mixed[optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * Check http://tidy.sourceforge.net/docs/quickref.html for an + * explanation about each option. + *

+ * @param encoding string[optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @param use_include_path bool[optional]

+ * Search for the file in the include_path. + *

+ * @return string the repaired contents as a string. + */ + public function repairFile ($filename, $config = null, $encoding = null, $use_include_path = null) {} + + /** + * Run configured diagnostics on parsed and repaired markup + * @link http://www.php.net/manual/en/function.tidy-diagnose.php + * @return bool Returns true on success or false on failure. + */ + public function diagnose () {} + + /** + * Get release date (version) for Tidy library + * @link http://www.php.net/manual/en/tidy.getrelease.php + * @return string a string with the release date of the Tidy library. + */ + public function getRelease () {} + + /** + * Get current Tidy configuration + * @link http://www.php.net/manual/en/tidy.getconfig.php + * @return array an array of configuration options. + *

+ *

+ * For an explanation about each option, visit &url.tidy.conf;. + */ + public function getConfig () {} + + /** + * Get status of specified document + * @link http://www.php.net/manual/en/tidy.getstatus.php + * @return int 0 if no error/warning was raised, 1 for warnings or accessibility + * errors, or 2 for errors. + */ + public function getStatus () {} + + public function getHtmlVer () {} + + /** + * Returns the documentation for the given option name + * @link http://www.php.net/manual/en/tidy.getoptdoc.php + * @param optname string

+ * The option name + *

+ * @return string a string if the option exists and has documentation available, or + * false otherwise. + */ + public function getOptDoc ($optname) {} + + /** + * Indicates if the document is a XHTML document + * @link http://www.php.net/manual/en/tidy.isxhtml.php + * @return bool This function returns true if the specified tidy + * object is a XHTML document, or false otherwise. + *

+ *

+ * This function is not yet implemented in the Tidylib itself, so it always + * return false. + */ + public function isXhtml () {} + + /** + * Indicates if the document is a generic (non HTML/XHTML) XML document + * @link http://www.php.net/manual/en/tidy.isxml.php + * @return bool This function returns true if the specified tidy + * object is a generic XML document (non HTML/XHTML), + * or false otherwise. + *

+ *

+ * This function is not yet implemented in the Tidylib itself, so it always + * return false. + */ + public function isXml () {} + + /** + * Returns a tidyNode object representing the root of the tidy parse tree + * @link http://www.php.net/manual/en/tidy.root.php + * @return tidyNode the tidyNode object. + */ + public function root () {} + + /** + * Returns a tidyNode object starting from the <head> tag of the tidy parse tree + * @link http://www.php.net/manual/en/tidy.head.php + * @return tidyNode the tidyNode object. + */ + public function head () {} + + /** + * Returns a tidyNode object starting from the <html> tag of the tidy parse tree + * @link http://www.php.net/manual/en/tidy.html.php + * @return tidyNode the tidyNode object. + */ + public function html () {} + + /** + * Returns a tidyNode object starting from the <body> tag of the tidy parse tree + * @link http://www.php.net/manual/en/tidy.body.php + * @return tidyNode the detected HTML version. + *

+ *

+ * This function is not yet implemented in the Tidylib itself, so it always + * return 0. + */ + public function body () {} + + /** + * Constructs a new tidy object + * @link http://www.php.net/manual/en/tidy.construct.php + * @param filename string[optional]

+ * If the filename parameter is given, this function + * will also read that file and initialize the object with the file, + * acting like tidy_parse_file. + *

+ * @param config mixed[optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * For an explanation about each option, visit &url.tidy.conf;. + *

+ * @param encoding string[optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @param use_include_path bool[optional]

+ * Search for the file in the include_path. + *

+ * @return tidy the new tidy instance. + */ + public function __construct ($filename = null, $config = null, $encoding = null, $use_include_path = null) {} + +} + +/** @jms-builtin */ +final class tidyNode { + + /** + * Checks if a node has children + * @link http://www.php.net/manual/en/tidynode.haschildren.php + * @return bool true if the node has children, false otherwise. + */ + public function hasChildren () {} + + /** + * Checks if a node has siblings + * @link http://www.php.net/manual/en/tidynode.hassiblings.php + * @return bool true if the node has siblings, false otherwise. + */ + public function hasSiblings () {} + + /** + * Checks if a node represents a comment + * @link http://www.php.net/manual/en/tidynode.iscomment.php + * @return bool true if the node is a comment, false otherwise. + */ + public function isComment () {} + + /** + * Checks if a node is part of a HTML document + * @link http://www.php.net/manual/en/tidynode.ishtml.php + * @return bool true if the node is part of a HTML document, false otherwise. + */ + public function isHtml () {} + + /** + * Checks if a node represents text (no markup) + * @link http://www.php.net/manual/en/tidynode.istext.php + * @return bool true if the node represent a text, false otherwise. + */ + public function isText () {} + + /** + * Checks if this node is JSTE + * @link http://www.php.net/manual/en/tidynode.isjste.php + * @return bool true if the node is JSTE, false otherwise. + */ + public function isJste () {} + + /** + * Checks if this node is ASP + * @link http://www.php.net/manual/en/tidynode.isasp.php + * @return bool true if the node is ASP, false otherwise. + */ + public function isAsp () {} + + /** + * Checks if a node is PHP + * @link http://www.php.net/manual/en/tidynode.isphp.php + * @return bool true if the current node is PHP code, false otherwise. + */ + public function isPhp () {} + + /** + * Returns the parent node of the current node + * @link http://www.php.net/manual/en/tidynode.getparent.php + * @return tidyNode a tidyNode if the node has a parent, or &null; + * otherwise. + */ + public function getParent () {} + + private function __construct () {} + +} + +function tidy_getopt () {} + +function tidy_parse_string () {} + +function tidy_parse_file () {} + +/** + * Return a string representing the parsed tidy markup + * @link http://www.php.net/manual/en/function.tidy-get-output.php + * @param object tidy

+ * &tidy.object; + *

+ * @return string the parsed tidy markup. + * + * @jms-builtin + */ +function tidy_get_output (tidy $object) {} + +/** + * Return warnings and errors which occurred parsing the specified document + * @link http://www.php.net/manual/en/function.tidy-get-error-buffer.php + * @param object tidy

+ * &tidy.object; + *

+ * @return string the error buffer as a string. + * + * @jms-builtin + */ +function tidy_get_error_buffer (tidy $object) {} + +function tidy_clean_repair () {} + +function tidy_repair_string () {} + +function tidy_repair_file () {} + +function tidy_diagnose () {} + +function tidy_get_release () {} + +function tidy_get_config () {} + +function tidy_get_status () {} + +function tidy_get_html_ver () {} + +function tidy_is_xhtml () {} + +function tidy_is_xml () {} + +/** + * Returns the Number of Tidy errors encountered for specified document + * @link http://www.php.net/manual/en/function.tidy-error-count.php + * @param object tidy

+ * &tidy.object; + *

+ * @return int the number of errors. + * + * @jms-builtin + */ +function tidy_error_count (tidy $object) {} + +/** + * Returns the Number of Tidy warnings encountered for specified document + * @link http://www.php.net/manual/en/function.tidy-warning-count.php + * @param object tidy

+ * &tidy.object; + *

+ * @return int the number of warnings. + * + * @jms-builtin + */ +function tidy_warning_count (tidy $object) {} + +/** + * Returns the Number of Tidy accessibility warnings encountered for specified document + * @link http://www.php.net/manual/en/function.tidy-access-count.php + * @param object tidy

+ * &tidy.object; + *

+ * @return int the number of warnings. + * + * @jms-builtin + */ +function tidy_access_count (tidy $object) {} + +/** + * Returns the Number of Tidy configuration errors encountered for specified document + * @link http://www.php.net/manual/en/function.tidy-config-count.php + * @param object tidy

+ * &tidy.object; + *

+ * @return int the number of errors. + * + * @jms-builtin + */ +function tidy_config_count (tidy $object) {} + +function tidy_get_opt_doc () {} + +function tidy_get_root () {} + +function tidy_get_head () {} + +function tidy_get_html () {} + +function tidy_get_body () {} + +/** + * ob_start callback function to repair the buffer + * @link http://www.php.net/manual/en/function.ob-tidyhandler.php + * @param input string

+ * The buffer. + *

+ * @param mode int[optional]

+ * The buffer mode. + *

+ * @return string the modified buffer. + * + * @jms-builtin + */ +function ob_tidyhandler ($input, $mode = null) {} + + +/** + * description + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_TAG_UNKNOWN', 0); +define ('TIDY_TAG_A', 1); +define ('TIDY_TAG_ABBR', 2); +define ('TIDY_TAG_ACRONYM', 3); +define ('TIDY_TAG_ADDRESS', 4); +define ('TIDY_TAG_ALIGN', 5); +define ('TIDY_TAG_APPLET', 6); +define ('TIDY_TAG_AREA', 7); +define ('TIDY_TAG_B', 8); +define ('TIDY_TAG_BASE', 9); +define ('TIDY_TAG_BASEFONT', 10); +define ('TIDY_TAG_BDO', 11); +define ('TIDY_TAG_BGSOUND', 12); +define ('TIDY_TAG_BIG', 13); +define ('TIDY_TAG_BLINK', 14); +define ('TIDY_TAG_BLOCKQUOTE', 15); +define ('TIDY_TAG_BODY', 16); +define ('TIDY_TAG_BR', 17); +define ('TIDY_TAG_BUTTON', 18); +define ('TIDY_TAG_CAPTION', 19); +define ('TIDY_TAG_CENTER', 20); +define ('TIDY_TAG_CITE', 21); +define ('TIDY_TAG_CODE', 22); +define ('TIDY_TAG_COL', 23); +define ('TIDY_TAG_COLGROUP', 24); +define ('TIDY_TAG_COMMENT', 25); +define ('TIDY_TAG_DD', 26); +define ('TIDY_TAG_DEL', 27); +define ('TIDY_TAG_DFN', 28); +define ('TIDY_TAG_DIR', 29); +define ('TIDY_TAG_DIV', 30); +define ('TIDY_TAG_DL', 31); +define ('TIDY_TAG_DT', 32); +define ('TIDY_TAG_EM', 33); +define ('TIDY_TAG_EMBED', 34); +define ('TIDY_TAG_FIELDSET', 35); +define ('TIDY_TAG_FONT', 36); +define ('TIDY_TAG_FORM', 37); +define ('TIDY_TAG_FRAME', 38); +define ('TIDY_TAG_FRAMESET', 39); +define ('TIDY_TAG_H1', 40); +define ('TIDY_TAG_H2', 41); +define ('TIDY_TAG_H3', 42); +define ('TIDY_TAG_H4', 43); +define ('TIDY_TAG_H5', 44); +define ('TIDY_TAG_H6', 45); +define ('TIDY_TAG_HEAD', 46); +define ('TIDY_TAG_HR', 47); +define ('TIDY_TAG_HTML', 48); +define ('TIDY_TAG_I', 49); +define ('TIDY_TAG_IFRAME', 50); +define ('TIDY_TAG_ILAYER', 51); +define ('TIDY_TAG_IMG', 52); +define ('TIDY_TAG_INPUT', 53); +define ('TIDY_TAG_INS', 54); +define ('TIDY_TAG_ISINDEX', 55); +define ('TIDY_TAG_KBD', 56); +define ('TIDY_TAG_KEYGEN', 57); +define ('TIDY_TAG_LABEL', 58); +define ('TIDY_TAG_LAYER', 59); +define ('TIDY_TAG_LEGEND', 60); +define ('TIDY_TAG_LI', 61); +define ('TIDY_TAG_LINK', 62); +define ('TIDY_TAG_LISTING', 63); +define ('TIDY_TAG_MAP', 64); +define ('TIDY_TAG_MARQUEE', 65); +define ('TIDY_TAG_MENU', 66); +define ('TIDY_TAG_META', 67); +define ('TIDY_TAG_MULTICOL', 68); +define ('TIDY_TAG_NOBR', 69); +define ('TIDY_TAG_NOEMBED', 70); +define ('TIDY_TAG_NOFRAMES', 71); +define ('TIDY_TAG_NOLAYER', 72); +define ('TIDY_TAG_NOSAVE', 73); +define ('TIDY_TAG_NOSCRIPT', 74); +define ('TIDY_TAG_OBJECT', 75); +define ('TIDY_TAG_OL', 76); +define ('TIDY_TAG_OPTGROUP', 77); +define ('TIDY_TAG_OPTION', 78); +define ('TIDY_TAG_P', 79); +define ('TIDY_TAG_PARAM', 80); +define ('TIDY_TAG_PLAINTEXT', 81); +define ('TIDY_TAG_PRE', 82); +define ('TIDY_TAG_Q', 83); +define ('TIDY_TAG_RB', 84); +define ('TIDY_TAG_RBC', 85); +define ('TIDY_TAG_RP', 86); +define ('TIDY_TAG_RT', 87); +define ('TIDY_TAG_RTC', 88); +define ('TIDY_TAG_RUBY', 89); +define ('TIDY_TAG_S', 90); +define ('TIDY_TAG_SAMP', 91); +define ('TIDY_TAG_SCRIPT', 92); +define ('TIDY_TAG_SELECT', 93); +define ('TIDY_TAG_SERVER', 94); +define ('TIDY_TAG_SERVLET', 95); +define ('TIDY_TAG_SMALL', 96); +define ('TIDY_TAG_SPACER', 97); +define ('TIDY_TAG_SPAN', 98); +define ('TIDY_TAG_STRIKE', 99); +define ('TIDY_TAG_STRONG', 100); +define ('TIDY_TAG_STYLE', 101); +define ('TIDY_TAG_SUB', 102); +define ('TIDY_TAG_SUP', 103); +define ('TIDY_TAG_TABLE', 104); +define ('TIDY_TAG_TBODY', 105); +define ('TIDY_TAG_TD', 106); +define ('TIDY_TAG_TEXTAREA', 107); +define ('TIDY_TAG_TFOOT', 108); +define ('TIDY_TAG_TH', 109); +define ('TIDY_TAG_THEAD', 110); +define ('TIDY_TAG_TITLE', 111); +define ('TIDY_TAG_TR', 112); +define ('TIDY_TAG_TT', 113); +define ('TIDY_TAG_U', 114); +define ('TIDY_TAG_UL', 115); +define ('TIDY_TAG_VAR', 116); +define ('TIDY_TAG_WBR', 117); +define ('TIDY_TAG_XMP', 118); + +/** + * root node + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_ROOT', 0); + +/** + * doctype + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_DOCTYPE', 1); + +/** + * HTML comment + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_COMMENT', 2); + +/** + * Processing Instruction + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_PROCINS', 3); + +/** + * Text + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_TEXT', 4); + +/** + * start tag + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_START', 5); + +/** + * end tag + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_END', 6); + +/** + * empty tag + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_STARTEND', 7); + +/** + * CDATA + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_CDATA', 8); + +/** + * XML section + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_SECTION', 9); + +/** + * ASP code + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_ASP', 10); + +/** + * JSTE code + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_JSTE', 11); + +/** + * PHP code + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_PHP', 12); + +/** + * XML declaration + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_XMLDECL', 13); + +// End of tidy v.2.0 +?> diff --git a/res/php-5.2-core-api/tokenizer.php b/res/php-5.2-core-api/tokenizer.php new file mode 100644 index 0000000..5bcad63 --- /dev/null +++ b/res/php-5.2-core-api/tokenizer.php @@ -0,0 +1,155 @@ + + * The PHP source to parse. + *

+ * @return array An array of token identifiers. Each individual token identifier is either + * a single character (i.e.: ;, ., + * >, !, etc...), + * or a three element array containing the token index in element 0, the string + * content of the original token in element 1 and the line number in element 2. + * + * @jms-builtin + */ +function token_get_all ($source) {} + +/** + * Get the symbolic name of a given PHP token + * @link http://www.php.net/manual/en/function.token-name.php + * @param token int

+ * The token value. + *

+ * @return string The symbolic name of the given token. The returned + * name returned matches the name of the matching token constant. + * + * @jms-builtin + */ +function token_name ($token) {} + +define ('T_REQUIRE_ONCE', 258); +define ('T_REQUIRE', 259); +define ('T_EVAL', 260); +define ('T_INCLUDE_ONCE', 261); +define ('T_INCLUDE', 262); +define ('T_LOGICAL_OR', 263); +define ('T_LOGICAL_XOR', 264); +define ('T_LOGICAL_AND', 265); +define ('T_PRINT', 266); +define ('T_SR_EQUAL', 267); +define ('T_SL_EQUAL', 268); +define ('T_XOR_EQUAL', 269); +define ('T_OR_EQUAL', 270); +define ('T_AND_EQUAL', 271); +define ('T_MOD_EQUAL', 272); +define ('T_CONCAT_EQUAL', 273); +define ('T_DIV_EQUAL', 274); +define ('T_MUL_EQUAL', 275); +define ('T_MINUS_EQUAL', 276); +define ('T_PLUS_EQUAL', 277); +define ('T_BOOLEAN_OR', 278); +define ('T_BOOLEAN_AND', 279); +define ('T_IS_NOT_IDENTICAL', 280); +define ('T_IS_IDENTICAL', 281); +define ('T_IS_NOT_EQUAL', 282); +define ('T_IS_EQUAL', 283); +define ('T_IS_GREATER_OR_EQUAL', 284); +define ('T_IS_SMALLER_OR_EQUAL', 285); +define ('T_SR', 286); +define ('T_SL', 287); +define ('T_INSTANCEOF', 288); +define ('T_UNSET_CAST', 289); +define ('T_BOOL_CAST', 290); +define ('T_OBJECT_CAST', 291); +define ('T_ARRAY_CAST', 292); +define ('T_STRING_CAST', 293); +define ('T_DOUBLE_CAST', 294); +define ('T_INT_CAST', 295); +define ('T_DEC', 296); +define ('T_INC', 297); +define ('T_CLONE', 298); +define ('T_NEW', 299); +define ('T_EXIT', 300); +define ('T_IF', 301); +define ('T_ELSEIF', 302); +define ('T_ELSE', 303); +define ('T_ENDIF', 304); +define ('T_LNUMBER', 305); +define ('T_DNUMBER', 306); +define ('T_STRING', 307); +define ('T_STRING_VARNAME', 308); +define ('T_VARIABLE', 309); +define ('T_NUM_STRING', 310); +define ('T_INLINE_HTML', 311); +define ('T_CHARACTER', 312); +define ('T_BAD_CHARACTER', 313); +define ('T_ENCAPSED_AND_WHITESPACE', 314); +define ('T_CONSTANT_ENCAPSED_STRING', 315); +define ('T_ECHO', 316); +define ('T_DO', 317); +define ('T_WHILE', 318); +define ('T_ENDWHILE', 319); +define ('T_FOR', 320); +define ('T_ENDFOR', 321); +define ('T_FOREACH', 322); +define ('T_ENDFOREACH', 323); +define ('T_DECLARE', 324); +define ('T_ENDDECLARE', 325); +define ('T_AS', 326); +define ('T_SWITCH', 327); +define ('T_ENDSWITCH', 328); +define ('T_CASE', 329); +define ('T_DEFAULT', 330); +define ('T_BREAK', 331); +define ('T_CONTINUE', 332); +define ('T_FUNCTION', 333); +define ('T_CONST', 334); +define ('T_RETURN', 335); +define ('T_TRY', 336); +define ('T_CATCH', 337); +define ('T_THROW', 338); +define ('T_USE', 339); +define ('T_GLOBAL', 340); +define ('T_PUBLIC', 341); +define ('T_PROTECTED', 342); +define ('T_PRIVATE', 343); +define ('T_FINAL', 344); +define ('T_ABSTRACT', 345); +define ('T_STATIC', 346); +define ('T_VAR', 347); +define ('T_UNSET', 348); +define ('T_ISSET', 349); +define ('T_EMPTY', 350); +define ('T_HALT_COMPILER', 351); +define ('T_CLASS', 352); +define ('T_INTERFACE', 353); +define ('T_EXTENDS', 354); +define ('T_IMPLEMENTS', 355); +define ('T_OBJECT_OPERATOR', 356); +define ('T_DOUBLE_ARROW', 357); +define ('T_LIST', 358); +define ('T_ARRAY', 359); +define ('T_CLASS_C', 360); +define ('T_METHOD_C', 361); +define ('T_FUNC_C', 362); +define ('T_LINE', 363); +define ('T_FILE', 364); +define ('T_COMMENT', 365); +define ('T_DOC_COMMENT', 366); +define ('T_OPEN_TAG', 367); +define ('T_OPEN_TAG_WITH_ECHO', 368); +define ('T_CLOSE_TAG', 369); +define ('T_WHITESPACE', 370); +define ('T_START_HEREDOC', 371); +define ('T_END_HEREDOC', 372); +define ('T_DOLLAR_OPEN_CURLY_BRACES', 373); +define ('T_CURLY_OPEN', 374); +define ('T_PAAMAYIM_NEKUDOTAYIM', 375); +define ('T_DOUBLE_COLON', 375); + +// End of tokenizer v.0.1 +?> diff --git a/res/php-5.2-core-api/wddx.php b/res/php-5.2-core-api/wddx.php new file mode 100644 index 0000000..442934f --- /dev/null +++ b/res/php-5.2-core-api/wddx.php @@ -0,0 +1,84 @@ + + * The value to be serialized + *

+ * @param comment string[optional]

+ * An optional comment string that appears in the packet header. + *

+ * @return string the WDDX packet, or false on error. + * + * @jms-builtin + */ +function wddx_serialize_value ($var, $comment = null) {} + +/** + * Serialize variables into a WDDX packet + * @link http://www.php.net/manual/en/function.wddx-serialize-vars.php + * @param var_name mixed

+ * Can be either a string naming a variable or an array containing + * strings naming the variables or another array, etc. + *

+ * @param _ mixed[optional] + * @return string the WDDX packet, or false on error. + * + * @jms-builtin + */ +function wddx_serialize_vars ($var_name, $_ = null) {} + +/** + * Starts a new WDDX packet with structure inside it + * @link http://www.php.net/manual/en/function.wddx-packet-start.php + * @param comment string[optional]

+ * An optional comment string. + *

+ * @return resource a packet ID for use in later functions, or false on error. + * + * @jms-builtin + */ +function wddx_packet_start ($comment = null) {} + +/** + * Ends a WDDX packet with the specified ID + * @link http://www.php.net/manual/en/function.wddx-packet-end.php + * @param packet_id resource

+ * A WDDX packet, returned by wddx_packet_start. + *

+ * @return string the string containing the WDDX packet. + * + * @jms-builtin + */ +function wddx_packet_end ($packet_id) {} + +/** + * Add variables to a WDDX packet with the specified ID + * @link http://www.php.net/manual/en/function.wddx-add-vars.php + * @param packet_id resource

+ * A WDDX packet, returned by wddx_packet_start. + *

+ * @param var_name mixed

+ * Can be either a string naming a variable or an array containing + * strings naming the variables or another array, etc. + *

+ * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function wddx_add_vars ($packet_id, $var_name, $_ = null) {} + +/** + * &Alias; wddx_unserialize + * @link http://www.php.net/manual/en/function.wddx-deserialize.php + * + * @jms-builtin + */ +function wddx_deserialize () {} + +// End of wddx v. +?> diff --git a/res/php-5.2-core-api/xml.php b/res/php-5.2-core-api/xml.php new file mode 100644 index 0000000..9a512f2 --- /dev/null +++ b/res/php-5.2-core-api/xml.php @@ -0,0 +1,600 @@ + + * The optional encoding specifies the character + * encoding for the input/output in PHP 4. Starting from PHP 5, the input + * encoding is automatically detected, so that the + * encoding parameter specifies only the output + * encoding. In PHP 4, the default output encoding is the same as the + * input charset. If empty string is passed, the parser attempts to identify + * which encoding the document is encoded in by looking at the heading 3 or + * 4 bytes. In PHP 5.0.0 and 5.0.1, the default output charset is + * ISO-8859-1, while in PHP 5.0.2 and upper is UTF-8. The supported + * encodings are ISO-8859-1, UTF-8 and + * US-ASCII. + *

+ * @return resource a resource handle for the new XML parser. + * + * @jms-builtin + */ +function xml_parser_create ($encoding = null) {} + +/** + * Create an XML parser with namespace support + * @link http://www.php.net/manual/en/function.xml-parser-create-ns.php + * @param encoding string[optional]

+ * The optional encoding specifies the character + * encoding for the input/output in PHP 4. Starting from PHP 5, the input + * encoding is automatically detected, so that the + * encoding parameter specifies only the output + * encoding. In PHP 4, the default output encoding is the same as the + * input charset. In PHP 5.0.0 and 5.0.1, the default output charset is + * ISO-8859-1, while in PHP 5.0.2 and upper is UTF-8. The supported + * encodings are ISO-8859-1, UTF-8 and + * US-ASCII. + *

+ * @param separator string[optional]

+ * With a namespace aware parser tag parameters passed to the various + * handler functions will consist of namespace and tag name separated by + * the string specified in seperator. + *

+ * @return resource a resource handle for the new XML parser. + * + * @jms-builtin + */ +function xml_parser_create_ns ($encoding = null, $separator = null) {} + +/** + * Use XML Parser within an object + * @link http://www.php.net/manual/en/function.xml-set-object.php + * @param parser resource

+ *

+ * @param object object

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_object ($parser, &$object) {} + +/** + * Set up start and end element handlers + * @link http://www.php.net/manual/en/function.xml-set-element-handler.php + * @param parser resource

+ *

+ * @param start_element_handler callback

+ * The function named by start_element_handler + * must accept three parameters: + * start_element_handler + * resourceparser + * stringname + * arrayattribs + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @param end_element_handler callback

+ * The function named by end_element_handler + * must accept two parameters: + * end_element_handler + * resourceparser + * stringname + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_element_handler ($parser, $start_element_handler, $end_element_handler) {} + +/** + * Set up character data handler + * @link http://www.php.net/manual/en/function.xml-set-character-data-handler.php + * @param parser resource

+ *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * two parameters: + * handler + * resourceparser + * stringdata + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_character_data_handler ($parser, $handler) {} + +/** + * Set up processing instruction (PI) handler + * @link http://www.php.net/manual/en/function.xml-set-processing-instruction-handler.php + * @param parser resource

+ *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * three parameters: + * handler + * resourceparser + * stringtarget + * stringdata + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_processing_instruction_handler ($parser, $handler) {} + +/** + * Set up default handler + * @link http://www.php.net/manual/en/function.xml-set-default-handler.php + * @param parser resource

+ *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * two parameters: + * handler + * resourceparser + * stringdata + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_default_handler ($parser, $handler) {} + +/** + * Set up unparsed entity declaration handler + * @link http://www.php.net/manual/en/function.xml-set-unparsed-entity-decl-handler.php + * @param parser resource

+ *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept six + * parameters: + * handler + * resourceparser + * stringentity_name + * stringbase + * stringsystem_id + * stringpublic_id + * stringnotation_name + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the + * handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_unparsed_entity_decl_handler ($parser, $handler) {} + +/** + * Set up notation declaration handler + * @link http://www.php.net/manual/en/function.xml-set-notation-decl-handler.php + * @param parser resource

+ *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * five parameters: + * handler + * resourceparser + * stringnotation_name + * stringbase + * stringsystem_id + * stringpublic_id + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_notation_decl_handler ($parser, $handler) {} + +/** + * Set up external entity reference handler + * @link http://www.php.net/manual/en/function.xml-set-external-entity-ref-handler.php + * @param parser resource + * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * five parameters, and should return an integer value.If the + * value returned from the handler is false (which it will be if no + * value is returned), the XML parser will stop parsing and + * xml_get_error_code will return + * XML_ERROR_EXTERNAL_ENTITY_HANDLING. + * handler + * resourceparser + * stringopen_entity_names + * stringbase + * stringsystem_id + * stringpublic_id + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_external_entity_ref_handler ($parser, $handler) {} + +/** + * Set up start namespace declaration handler + * @link http://www.php.net/manual/en/function.xml-set-start-namespace-decl-handler.php + * @param parser resource

+ * A reference to the XML parser. + *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * four parameters, and should return an integer value. If the + * value returned from the handler is false (which it will be if no + * value is returned), the XML parser will stop parsing and + * xml_get_error_code will return + * XML_ERROR_EXTERNAL_ENTITY_HANDLING. + * handler + * resourceparser + * stringuser_data + * stringprefix + * stringuri + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_start_namespace_decl_handler ($parser, $handler) {} + +/** + * Set up end namespace declaration handler + * @link http://www.php.net/manual/en/function.xml-set-end-namespace-decl-handler.php + * @param parser resource

+ * A reference to the XML parser. + *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * three parameters, and should return an integer value. If the + * value returned from the handler is false (which it will be if no + * value is returned), the XML parser will stop parsing and + * xml_get_error_code will return + * XML_ERROR_EXTERNAL_ENTITY_HANDLING. + * handler + * resourceparser + * stringuser_data + * stringprefix + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_end_namespace_decl_handler ($parser, $handler) {} + +/** + * Start parsing an XML document + * @link http://www.php.net/manual/en/function.xml-parse.php + * @param parser resource

+ * A reference to the XML parser to use. + *

+ * @param data string

+ * Chunk of data to parse. A document may be parsed piece-wise by + * calling xml_parse several times with new data, + * as long as the is_final parameter is set and + * true when the last data is parsed. + *

+ * @param is_final bool[optional]

+ * If set and true, data is the last piece of + * data sent in this parse. + *

+ * @return int 1 on success or 0 on failure. + *

+ *

+ * For unsuccessful parses, error information can be retrieved with + * xml_get_error_code, + * xml_error_string, + * xml_get_current_line_number, + * xml_get_current_column_number and + * xml_get_current_byte_index. + *

+ *

+ * Entity errors are reported at the end of the data thus only if + * is_final is set and true. + * + * @jms-builtin + */ +function xml_parse ($parser, $data, $is_final = null) {} + +/** + * Parse XML data into an array structure + * @link http://www.php.net/manual/en/function.xml-parse-into-struct.php + * @param parser resource

+ *

+ * @param data string

+ *

+ * @param values array

+ *

+ * @param index array[optional]

+ *

+ * @return int xml_parse_into_struct returns 0 for failure and 1 for + * success. This is not the same as false and true, be careful with + * operators such as ===. + * + * @jms-builtin + */ +function xml_parse_into_struct ($parser, $data, array &$values, array &$index = null) {} + +/** + * Get XML parser error code + * @link http://www.php.net/manual/en/function.xml-get-error-code.php + * @param parser resource

+ * A reference to the XML parser to get error code from. + *

+ * @return int This function returns false if parser does + * not refer to a valid parser, or else it returns one of the error + * codes listed in the error codes + * section. + * + * @jms-builtin + */ +function xml_get_error_code ($parser) {} + +/** + * Get XML parser error string + * @link http://www.php.net/manual/en/function.xml-error-string.php + * @param code int

+ * An error code from xml_get_error_code. + *

+ * @return string a string with a textual description of the error + * code, or false if no description was found. + * + * @jms-builtin + */ +function xml_error_string ($code) {} + +/** + * Get current line number for an XML parser + * @link http://www.php.net/manual/en/function.xml-get-current-line-number.php + * @param parser resource

+ * A reference to the XML parser to get line number from. + *

+ * @return int This function returns false if parser does + * not refer to a valid parser, or else it returns which line the + * parser is currently at in its data buffer. + * + * @jms-builtin + */ +function xml_get_current_line_number ($parser) {} + +/** + * Get current column number for an XML parser + * @link http://www.php.net/manual/en/function.xml-get-current-column-number.php + * @param parser resource

+ * A reference to the XML parser to get column number from. + *

+ * @return int This function returns false if parser does + * not refer to a valid parser, or else it returns which column on + * the current line (as given by + * xml_get_current_line_number) the parser is + * currently at. + * + * @jms-builtin + */ +function xml_get_current_column_number ($parser) {} + +/** + * Get current byte index for an XML parser + * @link http://www.php.net/manual/en/function.xml-get-current-byte-index.php + * @param parser resource

+ * A reference to the XML parser to get byte index from. + *

+ * @return int This function returns false if parser does + * not refer to a valid parser, or else it returns which byte index + * the parser is currently at in its data buffer (starting at 0). + * + * @jms-builtin + */ +function xml_get_current_byte_index ($parser) {} + +/** + * Free an XML parser + * @link http://www.php.net/manual/en/function.xml-parser-free.php + * @param parser resource A reference to the XML parser to free. + * @return bool This function returns false if parser does not + * refer to a valid parser, or else it frees the parser and returns true. + * + * @jms-builtin + */ +function xml_parser_free ($parser) {} + +/** + * Set options in an XML parser + * @link http://www.php.net/manual/en/function.xml-parser-set-option.php + * @param parser resource

+ * A reference to the XML parser to set an option in. + *

+ * @param option int

+ * Which option to set. See below. + *

+ *

+ * The following options are available: + * + * XML parser options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Option constantData typeDescription
XML_OPTION_CASE_FOLDINGinteger + * Controls whether case-folding is enabled for this + * XML parser. Enabled by default. + *
XML_OPTION_SKIP_TAGSTARTinteger + * Specify how many characters should be skipped in the beginning of a + * tag name. + *
XML_OPTION_SKIP_WHITEinteger + * Whether to skip values consisting of whitespace characters. + *
XML_OPTION_TARGET_ENCODINGstring + * Sets which target encoding to + * use in this XML parser.By default, it is set to the same as the + * source encoding used by xml_parser_create. + * Supported target encodings are ISO-8859-1, + * US-ASCII and UTF-8. + *
+ *

+ * @param value mixed

+ * The option's new value. + *

+ * @return bool This function returns false if parser does not + * refer to a valid parser, or if the option could not be set. Else the + * option is set and true is returned. + * + * @jms-builtin + */ +function xml_parser_set_option ($parser, $option, $value) {} + +/** + * Get options from an XML parser + * @link http://www.php.net/manual/en/function.xml-parser-get-option.php + * @param parser resource A reference to the XML parser to get an option from. + * @param option int Which option to fetch. XML_OPTION_CASE_FOLDING + * and XML_OPTION_TARGET_ENCODING are available. + * See xml_parser_set_option for their description. + * @return mixed This function returns false if parser does + * not refer to a valid parser or if option isn't + * valid (generates also a E_WARNING). + * Else the option's value is returned. + * + * @jms-builtin + */ +function xml_parser_get_option ($parser, $option) {} + +/** + * Encodes an ISO-8859-1 string to UTF-8 + * @link http://www.php.net/manual/en/function.utf8-encode.php + * @param data string

+ * An ISO-8859-1 string. + *

+ * @return string the UTF-8 translation of data. + * + * @jms-builtin + */ +function utf8_encode ($data) {} + +/** + * Converts a string with ISO-8859-1 characters encoded with UTF-8 + to single-byte ISO-8859-1 + * @link http://www.php.net/manual/en/function.utf8-decode.php + * @param data string

+ * An UTF-8 encoded string. + *

+ * @return string the ISO-8859-1 translation of data. + * + * @jms-builtin + */ +function utf8_decode ($data) {} + +define ('XML_ERROR_NONE', 0); +define ('XML_ERROR_NO_MEMORY', 1); +define ('XML_ERROR_SYNTAX', 2); +define ('XML_ERROR_NO_ELEMENTS', 3); +define ('XML_ERROR_INVALID_TOKEN', 4); +define ('XML_ERROR_UNCLOSED_TOKEN', 5); +define ('XML_ERROR_PARTIAL_CHAR', 6); +define ('XML_ERROR_TAG_MISMATCH', 7); +define ('XML_ERROR_DUPLICATE_ATTRIBUTE', 8); +define ('XML_ERROR_JUNK_AFTER_DOC_ELEMENT', 9); +define ('XML_ERROR_PARAM_ENTITY_REF', 10); +define ('XML_ERROR_UNDEFINED_ENTITY', 11); +define ('XML_ERROR_RECURSIVE_ENTITY_REF', 12); +define ('XML_ERROR_ASYNC_ENTITY', 13); +define ('XML_ERROR_BAD_CHAR_REF', 14); +define ('XML_ERROR_BINARY_ENTITY_REF', 15); +define ('XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF', 16); +define ('XML_ERROR_MISPLACED_XML_PI', 17); +define ('XML_ERROR_UNKNOWN_ENCODING', 18); +define ('XML_ERROR_INCORRECT_ENCODING', 19); +define ('XML_ERROR_UNCLOSED_CDATA_SECTION', 20); +define ('XML_ERROR_EXTERNAL_ENTITY_HANDLING', 21); +define ('XML_OPTION_CASE_FOLDING', 1); +define ('XML_OPTION_TARGET_ENCODING', 2); +define ('XML_OPTION_SKIP_TAGSTART', 3); +define ('XML_OPTION_SKIP_WHITE', 4); + +/** + * Holds the SAX implementation method. + * Can be libxml or expat. + * @link http://www.php.net/manual/en/xml.constants.php + */ +define ('XML_SAX_IMPL', "libxml"); + +// End of xml v. +?> diff --git a/res/php-5.2-core-api/xmlreader.php b/res/php-5.2-core-api/xmlreader.php new file mode 100644 index 0000000..4852696 --- /dev/null +++ b/res/php-5.2-core-api/xmlreader.php @@ -0,0 +1,285 @@ + + * The name of the attribute. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given name is found or not positioned of element. + */ + public function getAttribute ($name) {} + + /** + * Get the value of an attribute by index + * @link http://www.php.net/manual/en/xmlreader.getattributeno.php + * @param index int

+ * The position of the attribute. + *

+ * @return string The value of the attribute, or an empty string if no attribute exists + * at index or not positioned of element. + */ + public function getAttributeNo ($index) {} + + /** + * Get the value of an attribute by localname and URI + * @link http://www.php.net/manual/en/xmlreader.getattributens.php + * @param localName string

+ * The local name. + *

+ * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given localName and + * namespaceURI is found or not positioned of element. + */ + public function getAttributeNs ($localName, $namespaceURI) {} + + /** + * Indicates if specified property has been set + * @link http://www.php.net/manual/en/xmlreader.getparserproperty.php + * @param property int

+ * One of the parser option + * constants. + *

+ * @return bool Returns true on success or false on failure. + */ + public function getParserProperty ($property) {} + + /** + * Indicates if the parsed document is valid + * @link http://www.php.net/manual/en/xmlreader.isvalid.php + * @return bool Returns true on success or false on failure. + */ + public function isValid () {} + + /** + * Lookup namespace for a prefix + * @link http://www.php.net/manual/en/xmlreader.lookupnamespace.php + * @param prefix string

+ * String containing the prefix. + *

+ * @return bool Returns true on success or false on failure. + */ + public function lookupNamespace ($prefix) {} + + /** + * Move cursor to an attribute by index + * @link http://www.php.net/manual/en/xmlreader.movetoattributeno.php + * @param index int

+ * The position of the attribute. + *

+ * @return bool Returns true on success or false on failure. + */ + public function moveToAttributeNo ($index) {} + + /** + * Move cursor to a named attribute + * @link http://www.php.net/manual/en/xmlreader.movetoattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @return bool Returns true on success or false on failure. + */ + public function moveToAttribute ($name) {} + + /** + * Move cursor to a named attribute + * @link http://www.php.net/manual/en/xmlreader.movetoattributens.php + * @param localName string

+ * The local name. + *

+ * @param namespaceURI string

+ * The namespace URI. + *

+ * @return bool Returns true on success or false on failure. + */ + public function moveToAttributeNs ($localName, $namespaceURI) {} + + /** + * Position cursor on the parent Element of current Attribute + * @link http://www.php.net/manual/en/xmlreader.movetoelement.php + * @return bool true if successful and false if it fails or not positioned on + * Attribute when this method is called. + */ + public function moveToElement () {} + + /** + * Position cursor on the first Attribute + * @link http://www.php.net/manual/en/xmlreader.movetofirstattribute.php + * @return bool Returns true on success or false on failure. + */ + public function moveToFirstAttribute () {} + + /** + * Position cursor on the next Attribute + * @link http://www.php.net/manual/en/xmlreader.movetonextattribute.php + * @return bool Returns true on success or false on failure. + */ + public function moveToNextAttribute () {} + + /** + * Set the URI containing the XML to parse + * @link http://www.php.net/manual/en/xmlreader.open.php + * @param URI string

+ * URI pointing to the document. + *

+ * @param encoding string[optional]

+ * The document encoding or &null;. + *

+ * @param options int[optional]

+ * A bitmask of the LIBXML_* + * constants. + *

+ * @return bool Returns true on success or false on failure. + */ + public function open ($URI, $encoding = null, $options = null) {} + + /** + * Move to next node in document + * @link http://www.php.net/manual/en/xmlreader.read.php + * @return bool Returns true on success or false on failure. + */ + public function read () {} + + /** + * Move cursor to next node skipping all subtrees + * @link http://www.php.net/manual/en/xmlreader.next.php + * @param localname string[optional]

+ * The name of the next node to move to. + *

+ * @return bool Returns true on success or false on failure. + */ + public function next ($localname = null) {} + + /** + * Retrieve XML from current node + * @link http://www.php.net/manual/en/xmlreader.readinnerxml.php + * @return string the contents of the current node as a string. Empty string on failure. + */ + public function readInnerXml () {} + + /** + * Retrieve XML from current node, including it self + * @link http://www.php.net/manual/en/xmlreader.readouterxml.php + * @return string the contents of current node, including itself, as a string. Empty string on failure. + */ + public function readOuterXml () {} + + /** + * Reads the contents of the current node as an string + * @link http://www.php.net/manual/en/xmlreader.readstring.php + * @return string the content of the current node as a string. Empty string on + * failure. + */ + public function readString () {} + + /** + * Validate document against XSD + * @link http://www.php.net/manual/en/xmlreader.setschema.php + * @param filename string

+ * The filename of the XSD schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setSchema ($filename) {} + + /** + * Set or Unset parser options + * @link http://www.php.net/manual/en/xmlreader.setparserproperty.php + * @param property int

+ * One of the parser option + * constants. + *

+ * @param value bool

+ * If set to true the option will be enabled otherwise will + * be disabled. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setParserProperty ($property, $value) {} + + /** + * Set the filename or URI for a RelaxNG Schema + * @link http://www.php.net/manual/en/xmlreader.setrelaxngschema.php + * @param filename string

+ * filename or URI pointing to a RelaxNG Schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setRelaxNGSchema ($filename) {} + + /** + * Set the data containing a RelaxNG Schema + * @link http://www.php.net/manual/en/xmlreader.setrelaxngschemasource.php + * @param source string

+ * String containing the RelaxNG Schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setRelaxNGSchemaSource ($source) {} + + /** + * Set the data containing the XML to parse + * @link http://www.php.net/manual/en/xmlreader.xml.php + * @param source string

+ * String containing the XML to be parsed. + *

+ * @param encoding string[optional]

+ * The document encoding or &null;. + *

+ * @param options int[optional]

+ * A bitmask of the LIBXML_* + * constants. + *

+ * @return bool Returns true on success or false on failure. + */ + public function XML ($source, $encoding = null, $options = null) {} + + /** + * Returns a copy of the current node as a DOM object + * @link http://www.php.net/manual/en/xmlreader.expand.php + * @return DOMNode The resulting DOMNode or false on error. + */ + public function expand () {} + +} +// End of xmlreader v.0.1 +?> diff --git a/res/php-5.2-core-api/xmlwriter.php b/res/php-5.2-core-api/xmlwriter.php new file mode 100644 index 0000000..e302c81 --- /dev/null +++ b/res/php-5.2-core-api/xmlwriter.php @@ -0,0 +1,1025 @@ + + * The URI of the resource for the output. + *

+ * @return bool &style.oop;: Returns true on success or false on failure. + *

+ *

+ * &style.procedural;: Returns a new xmlwriter &resource; for later use with the + * xmlwriter functions on success, false on error. + */ + public function openUri ($uri) {} + + /** + * Create new xmlwriter using memory for string output + * @link http://www.php.net/manual/en/function.xmlwriter-open-memory.php + * @return bool &style.oop;: Returns true on success or false on failure. + *

+ *

+ * &style.procedural;: Returns a new xmlwriter &resource; for later use with the + * xmlwriter functions on success, false on error. + */ + public function openMemory () {} + + /** + * Toggle indentation on/off + * @link http://www.php.net/manual/en/function.xmlwriter-set-indent.php + * @param indent bool

+ * Whether indentation is enabled. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setIndent ($indent) {} + + /** + * Set string used for indenting + * @link http://www.php.net/manual/en/function.xmlwriter-set-indent-string.php + * @param indentString string

+ * The indentation string. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setIndentString ($indentString) {} + + /** + * Create start comment + * @link http://www.php.net/manual/en/function.xmlwriter-start-comment.php + * @return bool Returns true on success or false on failure. + */ + public function startComment () {} + + /** + * Create end comment + * @link http://www.php.net/manual/en/function.xmlwriter-end-comment.php + * @return bool Returns true on success or false on failure. + */ + public function endComment () {} + + /** + * Create start attribute + * @link http://www.php.net/manual/en/function.xmlwriter-start-attribute.php + * @param name string

+ * The attribute name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startAttribute ($name) {} + + /** + * End attribute + * @link http://www.php.net/manual/en/function.xmlwriter-end-attribute.php + * @return bool Returns true on success or false on failure. + */ + public function endAttribute () {} + + /** + * Write full attribute + * @link http://www.php.net/manual/en/function.xmlwriter-write-attribute.php + * @param name string

+ * The name of the attribute. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeAttribute ($name, $value) {} + + /** + * Create start namespaced attribute + * @link http://www.php.net/manual/en/function.xmlwriter-start-attribute-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The attribute name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startAttributeNs ($prefix, $name, $uri) {} + + /** + * Write full namespaced attribute + * @link http://www.php.net/manual/en/function.xmlwriter-write-attribute-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The attribute name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @param content string

+ * The attribute value. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeAttributeNs ($prefix, $name, $uri, $content) {} + + /** + * Create start element tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-element.php + * @param name string

+ * The element name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startElement ($name) {} + + /** + * End current element + * @link http://www.php.net/manual/en/function.xmlwriter-end-element.php + * @return bool Returns true on success or false on failure. + */ + public function endElement () {} + + /** + * End current element + * @link http://www.php.net/manual/en/function.xmlwriter-full-end-element.php + * @return bool Returns true on success or false on failure. + */ + public function fullEndElement () {} + + /** + * Create start namespaced element tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-element-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The element name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startElementNs ($prefix, $name, $uri) {} + + /** + * Write full element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-element.php + * @param name string

+ * The element name. + *

+ * @param content string[optional]

+ * The element contents. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeElement ($name, $content = null) {} + + /** + * Write full namespaced element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-element-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The element name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @param content string[optional]

+ * The element contents. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeElementNs ($prefix, $name, $uri, $content = null) {} + + /** + * Create start PI tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-pi.php + * @param target string

+ * The target of the processing instruction. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startPi ($target) {} + + /** + * End current PI + * @link http://www.php.net/manual/en/function.xmlwriter-end-pi.php + * @return bool Returns true on success or false on failure. + */ + public function endPi () {} + + /** + * Writes a PI + * @link http://www.php.net/manual/en/function.xmlwriter-write-pi.php + * @param target string

+ * The target of the processing instruction. + *

+ * @param content string

+ * The content of the processing instruction. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writePi ($target, $content) {} + + /** + * Create start CDATA tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-cdata.php + * @return bool Returns true on success or false on failure. + */ + public function startCdata () {} + + /** + * End current CDATA + * @link http://www.php.net/manual/en/function.xmlwriter-end-cdata.php + * @return bool Returns true on success or false on failure. + */ + public function endCdata () {} + + /** + * Write full CDATA tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-cdata.php + * @param content string

+ * The contents of the CDATA. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeCdata ($content) {} + + /** + * Write text + * @link http://www.php.net/manual/en/function.xmlwriter-text.php + * @param content string

+ * The contents of the text. + *

+ * @return bool Returns true on success or false on failure. + */ + public function text ($content) {} + + /** + * Write a raw XML text + * @link http://www.php.net/manual/en/function.xmlwriter-write-raw.php + * @param content string

+ * The text string to write. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeRaw ($content) {} + + /** + * Create document tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-document.php + * @param version string[optional]

+ * The version number of the document as part of the XML declaration. + * Defaults to 1.0. + *

+ * @param encoding string[optional]

+ * The encoding of the document as part of the XML declaration. + * &null; by default. + *

+ * @param standalone string[optional]

+ * yes or no. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startDocument ($version = null, $encoding = null, $standalone = null) {} + + /** + * End current document + * @link http://www.php.net/manual/en/function.xmlwriter-end-document.php + * @return bool Returns true on success or false on failure. + */ + public function endDocument () {} + + /** + * Write full comment tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-comment.php + * @param content string

+ * The contents of the comment. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeComment ($content) {} + + /** + * Create start DTD tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd.php + * @param qualifiedName string

+ * The qualified name of the document type to create. + *

+ * @param publicId string[optional]

+ * The external subset public identifier. + *

+ * @param systemId string[optional]

+ * The external subset system identifier. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startDtd ($qualifiedName, $publicId = null, $systemId = null) {} + + /** + * End current DTD + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd.php + * @return bool Returns true on success or false on failure. + */ + public function endDtd () {} + + /** + * Write full DTD tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd.php + * @param name string

+ * The DTD name. + *

+ * @param publicId string[optional]

+ * The external subset public identifier. + *

+ * @param systemId string[optional]

+ * The external subset system identifier. + *

+ * @param subset string[optional]

+ * The content of the DTD. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeDtd ($name, $publicId = null, $systemId = null, $subset = null) {} + + /** + * Create start DTD element + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-element.php + * @param qualifiedName string

+ * The qualified name of the document type to create. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startDtdElement ($qualifiedName) {} + + /** + * End current DTD element + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-element.php + * @return bool Returns true on success or false on failure. + */ + public function endDtdElement () {} + + /** + * Write full DTD element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-element.php + * @param name string

+ * The name of the DTD element. + *

+ * @param content string

+ * The content of the element. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeDtdElement ($name, $content) {} + + /** + * Create start DTD AttList + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-attlist.php + * @param name string

+ * The attribute list name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startDtdAttlist ($name) {} + + /** + * End current DTD AttList + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-attlist.php + * @return bool Returns true on success or false on failure. + */ + public function endDtdAttlist () {} + + /** + * Write full DTD AttList tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-attlist.php + * @param name string

+ * The name of the DTD attribute list. + *

+ * @param content string

+ * The content of the DTD attribute list. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeDtdAttlist ($name, $content) {} + + /** + * Create start DTD Entity + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-entity.php + * @param name string

+ * The name of the entity. + *

+ * @param isparam bool

+ *

+ * @return bool Returns true on success or false on failure. + */ + public function startDtdEntity ($name, $isparam) {} + + /** + * End current DTD Entity + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-entity.php + * @return bool Returns true on success or false on failure. + */ + public function endDtdEntity () {} + + /** + * Write full DTD Entity tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-entity.php + * @param name string

+ * The name of the entity. + *

+ * @param content string

+ * The content of the entity. + *

+ * @param pe bool + * @param pubid string + * @param sysid string + * @param ndataid string + * @return bool Returns true on success or false on failure. + */ + public function writeDtdEntity ($name, $content, $pe, $pubid, $sysid, $ndataid) {} + + /** + * Returns current buffer + * @link http://www.php.net/manual/en/function.xmlwriter-output-memory.php + * @param flush bool[optional]

+ * Whether to flush the output buffer or no. Default is true. + *

+ * @return string the current buffer as a string. + */ + public function outputMemory ($flush = null) {} + + /** + * Flush current buffer + * @link http://www.php.net/manual/en/function.xmlwriter-flush.php + * @param empty bool[optional]

+ * Whether to empty the buffer or no. Default is true. + *

+ * @return mixed If you opened the writer in memory, this function returns the generated XML buffer, + * Else, if using URI, this function will write the buffer and return the number of + * written bytes. + */ + public function flush ($empty = null) {} + +} + +/** + * Create new xmlwriter using source uri for output + * @link http://www.php.net/manual/en/function.xmlwriter-open-uri.php + * @param uri string

+ * The URI of the resource for the output. + *

+ * @return bool &style.oop;: Returns true on success or false on failure. + *

+ *

+ * &style.procedural;: Returns a new xmlwriter &resource; for later use with the + * xmlwriter functions on success, false on error. + * + * @jms-builtin + */ +function xmlwriter_open_uri ($uri) {} + +/** + * Create new xmlwriter using memory for string output + * @link http://www.php.net/manual/en/function.xmlwriter-open-memory.php + * @return bool &style.oop;: Returns true on success or false on failure. + *

+ *

+ * &style.procedural;: Returns a new xmlwriter &resource; for later use with the + * xmlwriter functions on success, false on error. + * + * @jms-builtin + */ +function xmlwriter_open_memory () {} + +/** + * Toggle indentation on/off + * @link http://www.php.net/manual/en/function.xmlwriter-set-indent.php + * @param indent bool

+ * Whether indentation is enabled. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_set_indent ($indent) {} + +/** + * Set string used for indenting + * @link http://www.php.net/manual/en/function.xmlwriter-set-indent-string.php + * @param indentString string

+ * The indentation string. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_set_indent_string ($indentString) {} + +/** + * Create start comment + * @link http://www.php.net/manual/en/function.xmlwriter-start-comment.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_comment () {} + +/** + * Create end comment + * @link http://www.php.net/manual/en/function.xmlwriter-end-comment.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_comment () {} + +/** + * Create start attribute + * @link http://www.php.net/manual/en/function.xmlwriter-start-attribute.php + * @param name string

+ * The attribute name. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_attribute ($name) {} + +/** + * End attribute + * @link http://www.php.net/manual/en/function.xmlwriter-end-attribute.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_attribute () {} + +/** + * Write full attribute + * @link http://www.php.net/manual/en/function.xmlwriter-write-attribute.php + * @param name string

+ * The name of the attribute. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_attribute ($name, $value) {} + +/** + * Create start namespaced attribute + * @link http://www.php.net/manual/en/function.xmlwriter-start-attribute-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The attribute name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_attribute_ns ($prefix, $name, $uri) {} + +/** + * Write full namespaced attribute + * @link http://www.php.net/manual/en/function.xmlwriter-write-attribute-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The attribute name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @param content string

+ * The attribute value. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_attribute_ns ($prefix, $name, $uri, $content) {} + +/** + * Create start element tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-element.php + * @param name string

+ * The element name. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_element ($name) {} + +/** + * End current element + * @link http://www.php.net/manual/en/function.xmlwriter-end-element.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_element () {} + +/** + * End current element + * @link http://www.php.net/manual/en/function.xmlwriter-full-end-element.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_full_end_element () {} + +/** + * Create start namespaced element tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-element-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The element name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_element_ns ($prefix, $name, $uri) {} + +/** + * Write full element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-element.php + * @param name string

+ * The element name. + *

+ * @param content string[optional]

+ * The element contents. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_element ($name, $content = null) {} + +/** + * Write full namespaced element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-element-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The element name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @param content string[optional]

+ * The element contents. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_element_ns ($prefix, $name, $uri, $content = null) {} + +/** + * Create start PI tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-pi.php + * @param target string

+ * The target of the processing instruction. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_pi ($target) {} + +/** + * End current PI + * @link http://www.php.net/manual/en/function.xmlwriter-end-pi.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_pi () {} + +/** + * Writes a PI + * @link http://www.php.net/manual/en/function.xmlwriter-write-pi.php + * @param target string

+ * The target of the processing instruction. + *

+ * @param content string

+ * The content of the processing instruction. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_pi ($target, $content) {} + +/** + * Create start CDATA tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-cdata.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_cdata () {} + +/** + * End current CDATA + * @link http://www.php.net/manual/en/function.xmlwriter-end-cdata.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_cdata () {} + +/** + * Write full CDATA tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-cdata.php + * @param content string

+ * The contents of the CDATA. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_cdata ($content) {} + +/** + * Write text + * @link http://www.php.net/manual/en/function.xmlwriter-text.php + * @param content string

+ * The contents of the text. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_text ($content) {} + +/** + * Write a raw XML text + * @link http://www.php.net/manual/en/function.xmlwriter-write-raw.php + * @param content string

+ * The text string to write. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_raw ($content) {} + +/** + * Create document tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-document.php + * @param version string[optional]

+ * The version number of the document as part of the XML declaration. + * Defaults to 1.0. + *

+ * @param encoding string[optional]

+ * The encoding of the document as part of the XML declaration. + * &null; by default. + *

+ * @param standalone string[optional]

+ * yes or no. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_document ($version = null, $encoding = null, $standalone = null) {} + +/** + * End current document + * @link http://www.php.net/manual/en/function.xmlwriter-end-document.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_document () {} + +/** + * Write full comment tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-comment.php + * @param content string

+ * The contents of the comment. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_comment ($content) {} + +/** + * Create start DTD tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd.php + * @param qualifiedName string

+ * The qualified name of the document type to create. + *

+ * @param publicId string[optional]

+ * The external subset public identifier. + *

+ * @param systemId string[optional]

+ * The external subset system identifier. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_dtd ($qualifiedName, $publicId = null, $systemId = null) {} + +/** + * End current DTD + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_dtd () {} + +/** + * Write full DTD tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd.php + * @param name string

+ * The DTD name. + *

+ * @param publicId string[optional]

+ * The external subset public identifier. + *

+ * @param systemId string[optional]

+ * The external subset system identifier. + *

+ * @param subset string[optional]

+ * The content of the DTD. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_dtd ($name, $publicId = null, $systemId = null, $subset = null) {} + +/** + * Create start DTD element + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-element.php + * @param qualifiedName string

+ * The qualified name of the document type to create. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_dtd_element ($qualifiedName) {} + +/** + * End current DTD element + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-element.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_dtd_element () {} + +/** + * Write full DTD element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-element.php + * @param name string

+ * The name of the DTD element. + *

+ * @param content string

+ * The content of the element. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_dtd_element ($name, $content) {} + +/** + * Create start DTD AttList + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-attlist.php + * @param name string

+ * The attribute list name. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_dtd_attlist ($name) {} + +/** + * End current DTD AttList + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-attlist.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_dtd_attlist () {} + +/** + * Write full DTD AttList tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-attlist.php + * @param name string

+ * The name of the DTD attribute list. + *

+ * @param content string

+ * The content of the DTD attribute list. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_dtd_attlist ($name, $content) {} + +/** + * Create start DTD Entity + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-entity.php + * @param name string

+ * The name of the entity. + *

+ * @param isparam bool

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_dtd_entity ($name, $isparam) {} + +/** + * End current DTD Entity + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-entity.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_dtd_entity () {} + +/** + * Write full DTD Entity tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-entity.php + * @param name string

+ * The name of the entity. + *

+ * @param content string

+ * The content of the entity. + *

+ * @param pe bool + * @param pubid string + * @param sysid string + * @param ndataid string + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_dtd_entity ($name, $content, $pe, $pubid, $sysid, $ndataid) {} + +/** + * Returns current buffer + * @link http://www.php.net/manual/en/function.xmlwriter-output-memory.php + * @param flush bool[optional]

+ * Whether to flush the output buffer or no. Default is true. + *

+ * @return string the current buffer as a string. + * + * @jms-builtin + */ +function xmlwriter_output_memory ($flush = null) {} + +/** + * Flush current buffer + * @link http://www.php.net/manual/en/function.xmlwriter-flush.php + * @param empty bool[optional]

+ * Whether to empty the buffer or no. Default is true. + *

+ * @return mixed If you opened the writer in memory, this function returns the generated XML buffer, + * Else, if using URI, this function will write the buffer and return the number of + * written bytes. + * + * @jms-builtin + */ +function xmlwriter_flush ($empty = null) {} + +// End of xmlwriter v.0.1 +?> diff --git a/res/php-5.2-core-api/xsl.php b/res/php-5.2-core-api/xsl.php new file mode 100644 index 0000000..57fc710 --- /dev/null +++ b/res/php-5.2-core-api/xsl.php @@ -0,0 +1,143 @@ + + * The imported style sheet as a DOMDocument or + * SimpleXMLElement object. + *

+ * @return void + */ + public function importStylesheet ($stylesheet) {} + + /** + * Transform to a DOMDocument + * @link http://www.php.net/manual/en/xsltprocessor.transformtodoc.php + * @param doc DOMNode

+ * The node to be transformed. + *

+ * @return DOMDocument The resulting DOMDocument or false on error. + */ + public function transformToDoc (DOMNode $doc) {} + + /** + * Transform to URI + * @link http://www.php.net/manual/en/xsltprocessor.transformtouri.php + * @param doc DOMDocument

+ * The transformed document. + *

+ * @param uri string

+ *

+ * @return int the number of bytes written or false if an error occurred. + */ + public function transformToUri (DOMDocument $doc, $uri) {} + + /** + * Transform to XML + * @link http://www.php.net/manual/en/xsltprocessor.transformtoxml.php + * @param doc DOMDocument

+ * The transformed document. + *

+ * @return string The result of the transformation as a string or false on error. + */ + public function transformToXml (DOMDocument $doc) {} + + /** + * Set value for a parameter + * @link http://www.php.net/manual/en/xsltprocessor.setparameter.php + * @param namespace string

+ * The namespace URI of the XSLT parameter. + *

+ * @param options array

+ * An array of name => value pairs. This syntax is + * available since PHP 5.1.0. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setParameter ($namespace, array $options) {} + + /** + * Get value of a parameter + * @link http://www.php.net/manual/en/xsltprocessor.getparameter.php + * @param namespaceURI string

+ * The namespace URI of the XSLT parameter. + *

+ * @param localName string

+ * The local name of the XSLT parameter. + *

+ * @return string The value of the parameter or &null; if it's not set. + */ + public function getParameter ($namespaceURI, $localName) {} + + /** + * Remove parameter + * @link http://www.php.net/manual/en/xsltprocessor.removeparameter.php + * @param namespaceURI string

+ * The namespace URI of the XSLT parameter. + *

+ * @param localName string

+ * The local name of the XSLT parameter. + *

+ * @return bool Returns true on success or false on failure. + */ + public function removeParameter ($namespaceURI, $localName) {} + + /** + * Determine if PHP has EXSLT support + * @link http://www.php.net/manual/en/xsltprocessor.hasexsltsupport.php + * @return bool Returns true on success or false on failure. + */ + public function hasExsltSupport () {} + + /** + * Enables the ability to use PHP functions as XSLT functions + * @link http://www.php.net/manual/en/xsltprocessor.registerphpfunctions.php + * @param restrict mixed[optional]

+ * Use this parameter to only allow certain functions to be called from + * XSLT. + *

+ *

+ * This parameter can be either a string (a function name) or an array of + * functions. + *

+ * @return void + */ + public function registerPHPFunctions ($restrict = null) {} + +} +define ('XSL_CLONE_AUTO', 0); +define ('XSL_CLONE_NEVER', -1); +define ('XSL_CLONE_ALWAYS', 1); + +/** + * libxslt version like 10117. Available as of PHP 5.1.2. + * @link http://www.php.net/manual/en/xsl.constants.php + */ +define ('LIBXSLT_VERSION', 10123); + +/** + * libxslt version like 1.1.17. Available as of PHP 5.1.2. + * @link http://www.php.net/manual/en/xsl.constants.php + */ +define ('LIBXSLT_DOTTED_VERSION', "1.1.23"); + +/** + * libexslt version like 813. Available as of PHP 5.1.2. + * @link http://www.php.net/manual/en/xsl.constants.php + */ +define ('LIBEXSLT_VERSION', 813); + +/** + * libexslt version like 1.1.17. Available as of PHP 5.1.2. + * @link http://www.php.net/manual/en/xsl.constants.php + */ +define ('LIBEXSLT_DOTTED_VERSION', "1.1.23"); + +// End of xsl v.0.1 +?> diff --git a/res/php-5.2-core-api/zip.php b/res/php-5.2-core-api/zip.php new file mode 100644 index 0000000..45a4db8 --- /dev/null +++ b/res/php-5.2-core-api/zip.php @@ -0,0 +1,568 @@ + + * The file name of the ZIP archive to open. + *

+ * @param flags int[optional]

+ * The mode to use to open the archive. + *

+ * ZIPARCHIVE::OVERWRITE + *

+ * @return mixed Error codes + *

+ * Returns true on success or the error code. + *

+ * ZIPARCHIVE::ER_EXISTS + *

+ *

+ * ZIPARCHIVE::ER_INCONS + *

+ *

+ * ZIPARCHIVE::ER_INVAL + *

+ *

+ * ZIPARCHIVE::ER_MEMORY + *

+ *

+ * ZIPARCHIVE::ER_NOENT + *

+ *

+ * ZIPARCHIVE::ER_NOZIP + *

+ *

+ * ZIPARCHIVE::ER_OPEN + *

+ *

+ * ZIPARCHIVE::ER_READ + *

+ *

+ * ZIPARCHIVE::ER_SEEK + *

+ *

+ */ + public function open ($filename, $flags = null) {} + + /** + * Close the active archive (opened or newly created) + * @link http://www.php.net/manual/en/function.ziparchive-close.php + * @return bool Returns true on success or false on failure. + */ + public function close () {} + + /** + * Returns the status error message, system and/or zip messages + * @link http://www.php.net/manual/en/function.ziparchive-getstatusstring.php + * @return string a string with the status message on success&return.falseforfailure;. + */ + public function getStatusString () {} + + /** + * Add a new directory + * @link http://www.php.net/manual/en/function.ziparchive-addemptydir.php + * @param dirname string

+ * The directory to add. + *

+ * @return bool Returns true on success or false on failure. + */ + public function addEmptyDir ($dirname) {} + + /** + * Add a file to a ZIP archive using its contents + * @link http://www.php.net/manual/en/function.ziparchive-addfromstring.php + * @param localname string

+ * The name of the entry to create. + *

+ * @param contents string

+ * The contents to use to create the entry. It is used in a binary + * safe mode. + *

+ * @return bool Returns true on success or false on failure. + */ + public function addFromString ($localname, $contents) {} + + /** + * Adds a file to a ZIP archive from the given path + * @link http://www.php.net/manual/en/function.ziparchive-addfile.php + * @param filename string

+ * The path to the file to add. + *

+ * @param localname string[optional]

+ * local name inside ZIP archive. + *

+ * @return bool Returns true on success or false on failure. + */ + public function addFile ($filename, $localname = null) {} + + /** + * Renames an entry defined by its index + * @link http://www.php.net/manual/en/function.ziparchive-renameindex.php + * @param index int

+ * Index of the entry to rename. + *

+ * @param newname string

+ * New name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function renameIndex ($index, $newname) {} + + /** + * Renames an entry defined by its name + * @link http://www.php.net/manual/en/function.ziparchive-renamename.php + * @param name string

+ * Name of the entry to rename. + *

+ * @param newname string

+ * New name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function renameName ($name, $newname) {} + + /** + * Set the comment of a ZIP archive + * @link http://www.php.net/manual/en/function.ziparchive-setarchivecomment.php + * @param comment string

+ * The contents of the comment. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function setArchiveComment ($comment) {} + + /** + * Returns the Zip archive comment + * @link http://www.php.net/manual/en/function.ziparchive-getarchivecomment.php + * @return string the Zip archive comment&return.falseforfailure;. + */ + public function getArchiveComment () {} + + /** + * Set the comment of an entry defined by its index + * @link http://www.php.net/manual/en/function.ziparchive-setcommentindex.php + * @param index int

+ * Index of the entry. + *

+ * @param comment string

+ * The contents of the comment. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function setCommentIndex ($index, $comment) {} + + /** + * Set the comment of an entry defined by its name + * @link http://www.php.net/manual/en/function.ziparchive-setCommentName.php + * @param name string

+ * Name of the entry. + *

+ * @param comment string

+ * The contents of the comment. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function setCommentName ($name, $comment) {} + + /** + * Returns the comment of an entry using the entry index + * @link http://www.php.net/manual/en/function.ziparchive-getcommentindex.php + * @param index int

+ * Index of the entry + *

+ * @param flags int[optional]

+ * If flags is set to ZIPARCHIVE::FL_UNCHANGED, the original unchanged + * comment is returned. + *

+ * @return string the comment on success&return.falseforfailure;. + */ + public function getCommentIndex ($index, $flags = null) {} + + /** + * Returns the comment of an entry using the entry name + * @link http://www.php.net/manual/en/function.ziparchive-getcommentname.php + * @param name string

+ * Name of the entry + *

+ * @param flags int[optional]

+ * If flags is set to ZIPARCHIVE::FL_UNCHANGED, the original unchanged + * comment is returned. + *

+ * @return string the comment on success&return.falseforfailure;. + */ + public function getCommentName ($name, $flags = null) {} + + /** + * delete an entry in the archive using its index + * @link http://www.php.net/manual/en/function.ziparchive-deleteindex.php + * @param index int

+ * Index of the entry to delete. + *

+ * @return bool Returns true on success or false on failure. + */ + public function deleteIndex ($index) {} + + /** + * delete an entry in the archive using its name + * @link http://www.php.net/manual/en/function.ziparchive-deletename.php + * @param name string

+ * Name of the entry to delete. + *

+ * @return bool Returns true on success or false on failure. + */ + public function deleteName ($name) {} + + /** + * Get the details of an entry defined by its name. + * @link http://www.php.net/manual/en/function.ziparchive-statname.php + * @param name name

+ * Name of the entry + *

+ * @param flags int[optional]

+ * The flags argument specifies how the name lookup should be done. + * Also, ZIPARCHIVE::FL_UNCHANGED may be ORed to it to request + * information about the original file in the archive, + * ignoring any changes made. + *

+ * ZIPARCHIVE::FL_NOCASE + *

+ * @return mixed an array containing the entry details &return.falseforfailure;. + */ + public function statName ($name, $flags = null) {} + + /** + * Get the details of an entry defined by its index. + * @link http://www.php.net/manual/en/function.ziparchive-statindex.php + * @param index int

+ * Index of the entry + *

+ * @param flags int[optional]

+ * ZIPARCHIVE::FL_UNCHANGED may be ORed to it to request + * information about the original file in the archive, + * ignoring any changes made. + *

+ * @return mixed an array containing the entry details&return.falseforfailure;. + */ + public function statIndex ($index, $flags = null) {} + + /** + * Returns the index of the entry in the archive + * @link http://www.php.net/manual/en/function.ziparchive-locatename.php + * @param name string

+ * The name of the entry to look up + *

+ * @param flags int[optional]

+ * The flags are specified by ORing the following values, + * or 0 for none of them. + *

+ * ZIPARCHIVE::FL_NOCASE + *

+ * @return mixed the index of the entry on success&return.falseforfailure;. + */ + public function locateName ($name, $flags = null) {} + + /** + * Returns the name of an entry using its index + * @link http://www.php.net/manual/en/function.ziparchive-getnameindex.php + * @param index int

+ * Index of the entry. + *

+ * @return string the name on success&return.falseforfailure;. + */ + public function getNameIndex ($index) {} + + /** + * Revert all global changes done in the archive. + * @link http://www.php.net/manual/en/function.ziparchive-unchangearchive.php + * @return mixed Returns true on success or false on failure. + */ + public function unchangeArchive () {} + + /** + * Undo all changes done in the archive + * @link http://www.php.net/manual/en/function.ziparchive-unchangeall.php + * @return mixed Returns true on success or false on failure. + */ + public function unchangeAll () {} + + /** + * Revert all changes done to an entry at the given index + * @link http://www.php.net/manual/en/function.ziparchive-unchangeindex.php + * @param index int

+ * Index of the entry. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function unchangeIndex ($index) {} + + /** + * Revert all changes done to an entry with the given name. + * @link http://www.php.net/manual/en/function.ziparchive-unchangename.php + * @param name string

+ * Name of the entry. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function unchangeName ($name) {} + + /** + * Extract the archive contents + * @link http://www.php.net/manual/en/function.ziparchive-extractto.php + * @param destination string

+ * Location where to extract the files. + *

+ * @param entries mixed[optional]

+ * The entries to extract. It accepts either a single entry name or + * an array of names. + *

+ * @return bool Returns true on success or false on failure. + */ + public function extractTo ($destination, $entries = null) {} + + /** + * Returns the entry contents using its name + * @link http://www.php.net/manual/en/function.ziparchive-getfromname.php + * @param name string

+ * Name of the entry + *

+ * @param flags int[optional]

+ * The flags to use to open the archive. the following values may + * be ORed to it. + *

+ * ZIPARCHIVE::FL_UNCHANGED + *

+ * @return mixed the contents of the entry on success&return.falseforfailure;. + */ + public function getFromName ($name, $flags = null) {} + + /** + * Returns the entry contents using its index + * @link http://www.php.net/manual/en/function.ziparchive-getfromindex.php + * @param index int

+ * Index of the entry + *

+ * @param flags int[optional]

+ * The flags to use to open the archive. the following values may + * be ORed to it. + *

+ * ZIPARCHIVE::FL_UNCHANGED + *

+ * @return mixed the contents of the entry on success&return.falseforfailure;. + */ + public function getFromIndex ($index, $flags = null) {} + + /** + * Get a file handler to the entry defined by its name (read only). + * @link http://www.php.net/manual/en/function.ziparchive-getstream.php + * @param name string

+ * The name of the entry to use. + *

+ * @return resource a file pointer (resource) on success&return.falseforfailure;. + */ + public function getStream ($name) {} + +} + +/** + * Open a ZIP file archive + * @link http://www.php.net/manual/en/function.zip-open.php + * @param filename string

+ * The file name of the ZIP archive to open. + *

+ * @return mixed a resource handle for later use with + * zip_read and zip_close + * or returns the number of error if filename does not + * exist or in case of other error. + * + * @jms-builtin + */ +function zip_open ($filename) {} + +/** + * Close a ZIP file archive + * @link http://www.php.net/manual/en/function.zip-close.php + * @param zip resource

+ * A ZIP file previously opened with zip_open. + *

+ * @return void + * + * @jms-builtin + */ +function zip_close ($zip) {} + +/** + * Read next entry in a ZIP file archive + * @link http://www.php.net/manual/en/function.zip-read.php + * @param zip resource

+ * A ZIP file previously opened with zip_open. + *

+ * @return mixed a directory entry resource for later use with the + * zip_entry_... functions or false if + * there's no more entries to read or number of error in case of other error. + * + * @jms-builtin + */ +function zip_read ($zip) {} + +/** + * Open a directory entry for reading + * @link http://www.php.net/manual/en/function.zip-entry-open.php + * @param zip resource

+ * A valid resource handle returned by zip_open. + *

+ * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @param mode string[optional]

+ * Any of the modes specified in the documentation of + * fopen. + *

+ *

+ * Currently, mode is ignored and is always + * "rb". This is due to the fact that zip support + * in PHP is read only access. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * Unlike fopen and other similar functions, + * the return value of zip_entry_open only + * indicates the result of the operation and is not needed for + * reading or closing the directory entry. + * + * @jms-builtin + */ +function zip_entry_open ($zip, $zip_entry, $mode = null) {} + +/** + * Close a directory entry + * @link http://www.php.net/manual/en/function.zip-entry-close.php + * @param zip_entry resource

+ * A directory entry previously opened zip_entry_open. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function zip_entry_close ($zip_entry) {} + +/** + * Read from an open directory entry + * @link http://www.php.net/manual/en/function.zip-entry-read.php + * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @param length int[optional]

+ * The number of bytes to return. If not specified, this function will + * attempt to read 1024 bytes. + *

+ *

+ * This should be the uncompressed length you wish to read. + *

+ * @return string the data read, or false if the end of the file is + * reached. + * + * @jms-builtin + */ +function zip_entry_read ($zip_entry, $length = null) {} + +/** + * Retrieve the actual file size of a directory entry + * @link http://www.php.net/manual/en/function.zip-entry-filesize.php + * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @return int The size of the directory entry. + * + * @jms-builtin + */ +function zip_entry_filesize ($zip_entry) {} + +/** + * Retrieve the name of a directory entry + * @link http://www.php.net/manual/en/function.zip-entry-name.php + * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @return string The name of the directory entry. + * + * @jms-builtin + */ +function zip_entry_name ($zip_entry) {} + +/** + * Retrieve the compressed size of a directory entry + * @link http://www.php.net/manual/en/function.zip-entry-compressedsize.php + * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @return int The compressed size. + * + * @jms-builtin + */ +function zip_entry_compressedsize ($zip_entry) {} + +/** + * Retrieve the compression method of a directory entry + * @link http://www.php.net/manual/en/function.zip-entry-compressionmethod.php + * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @return string The compression method. + * + * @jms-builtin + */ +function zip_entry_compressionmethod ($zip_entry) {} + +// End of zip v.1.8.11 +?> diff --git a/res/php-5.2-core-api/zlib.php b/res/php-5.2-core-api/zlib.php new file mode 100644 index 0000000..8b9ee0a --- /dev/null +++ b/res/php-5.2-core-api/zlib.php @@ -0,0 +1,393 @@ + + * The file name. This file will be opened from the filesystem and its + * contents written to standard output. + *

+ * @param use_include_path int[optional]

+ * You can set this optional parameter to 1, if you + * want to search for the file in the include_path too. + *

+ * @return int the number of (uncompressed) bytes read from the file. If + * an error occurs, false is returned and unless the function was + * called as @readgzfile, an error message is + * printed. + * + * @jms-builtin + */ +function readgzfile ($filename, $use_include_path = null) {} + +/** + * Rewind the position of a gz-file pointer + * @link http://www.php.net/manual/en/function.gzrewind.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function gzrewind ($zp) {} + +/** + * Close an open gz-file pointer + * @link http://www.php.net/manual/en/function.gzclose.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function gzclose ($zp) {} + +/** + * Test for EOF on a gz-file pointer + * @link http://www.php.net/manual/en/function.gzeof.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return int true if the gz-file pointer is at EOF or an error occurs; + * otherwise returns false. + * + * @jms-builtin + */ +function gzeof ($zp) {} + +/** + * Get character from gz-file pointer + * @link http://www.php.net/manual/en/function.gzgetc.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return string The uncompressed character or false on EOF (unlike gzeof). + * + * @jms-builtin + */ +function gzgetc ($zp) {} + +/** + * Get line from file pointer + * @link http://www.php.net/manual/en/function.gzgets.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @param length int

+ * The length of data to get. + *

+ * @return string The uncompressed string, or false on error. + * + * @jms-builtin + */ +function gzgets ($zp, $length) {} + +/** + * Get line from gz-file pointer and strip HTML tags + * @link http://www.php.net/manual/en/function.gzgetss.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @param length int

+ * The length of data to get. + *

+ * @param allowable_tags string[optional]

+ * You can use this optional parameter to specify tags which should not + * be stripped. + *

+ * @return string The uncompressed and striped string, or false on error. + * + * @jms-builtin + */ +function gzgetss ($zp, $length, $allowable_tags = null) {} + +/** + * Binary-safe gz-file read + * @link http://www.php.net/manual/en/function.gzread.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @param length int

+ * The number of bytes to read. + *

+ * @return string The data that have been read. + * + * @jms-builtin + */ +function gzread ($zp, $length) {} + +/** + * Open gz-file + * @link http://www.php.net/manual/en/function.gzopen.php + * @param filename string

+ * The file name. + *

+ * @param mode string

+ * As in fopen (rb or + * wb) but can also include a compression level + * (wb9) or a strategy: f for + * filtered data as in wb6f, h for + * Huffman only compression as in wb1h. + * (See the description of deflateInit2 + * in zlib.h for + * more information about the strategy parameter.) + *

+ * @param use_include_path int[optional]

+ * You can set this optional parameter to 1, if you + * want to search for the file in the include_path too. + *

+ * @return resource a file pointer to the file opened, after that, everything you read + * from this file descriptor will be transparently decompressed and what you + * write gets compressed. + *

+ *

+ * If the open fails, the function returns false. + * + * @jms-builtin + */ +function gzopen ($filename, $mode, $use_include_path = null) {} + +/** + * Output all remaining data on a gz-file pointer + * @link http://www.php.net/manual/en/function.gzpassthru.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return int The number of uncompressed characters read from gz + * and passed through to the input, or false on error. + * + * @jms-builtin + */ +function gzpassthru ($zp) {} + +/** + * Seek on a gz-file pointer + * @link http://www.php.net/manual/en/function.gzseek.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @param offset int

+ * The seeked offset. + *

+ * @param whence int[optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + *

+ *

+ * If whence is not specified, it is assumed to be + * SEEK_SET. + *

+ * @return int Upon success, returns 0; otherwise, returns -1. Note that seeking + * past EOF is not considered an error. + * + * @jms-builtin + */ +function gzseek ($zp, $offset, $whence = null) {} + +/** + * Tell gz-file pointer read/write position + * @link http://www.php.net/manual/en/function.gztell.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return int The position of the file pointer or false if an error occurs. + * + * @jms-builtin + */ +function gztell ($zp) {} + +/** + * Binary-safe gz-file write + * @link http://www.php.net/manual/en/function.gzwrite.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @param string string

+ * The string to write. + *

+ * @param length int[optional]

+ * The number of uncompressed bytes to write. If supplied, writing will + * stop after length (uncompressed) bytes have been + * written or the end of string is reached, + * whichever comes first. + *

+ *

+ * Note that if the length argument is given, + * then the magic_quotes_runtime + * configuration option will be ignored and no slashes will be + * stripped from string. + *

+ * @return int the number of (uncompressed) bytes written to the given gz-file + * stream. + * + * @jms-builtin + */ +function gzwrite ($zp, $string, $length = null) {} + +/** + * &Alias; gzwrite + * @link http://www.php.net/manual/en/function.gzputs.php + * + * @jms-builtin + */ +function gzputs () {} + +/** + * Read entire gz-file into an array + * @link http://www.php.net/manual/en/function.gzfile.php + * @param filename string

+ * The file name. + *

+ * @param use_include_path int[optional]

+ * You can set this optional parameter to 1, if you + * want to search for the file in the include_path too. + *

+ * @return array An array containing the file, one line per cell. + * + * @jms-builtin + */ +function gzfile ($filename, $use_include_path = null) {} + +/** + * Compress a string + * @link http://www.php.net/manual/en/function.gzcompress.php + * @param data string

+ * The data to compress. + *

+ * @param level int[optional]

+ * The level of compression. Can be given as 0 for no compression up to 9 + * for maximum compression. + *

+ * @return string The compressed string or false if an error occurred. + * + * @jms-builtin + */ +function gzcompress ($data, $level = null) {} + +/** + * Uncompress a compressed string + * @link http://www.php.net/manual/en/function.gzuncompress.php + * @param data string

+ * The data compressed by gzcompress. + *

+ * @param length int[optional]

+ * The maximum length of data to decode. + *

+ * @return string The original uncompressed data or false on error. + *

+ *

+ * The function will return an error if the uncompressed data is more than + * 32768 times the length of the compressed input data + * or more than the optional parameter length. + * + * @jms-builtin + */ +function gzuncompress ($data, $length = null) {} + +/** + * Deflate a string + * @link http://www.php.net/manual/en/function.gzdeflate.php + * @param data string

+ * The data to deflate. + *

+ * @param level int[optional]

+ * The level of compression. Can be given as 0 for no compression up to 9 + * for maximum compression. If not given, the default compression level will + * be the default compression level of the zlib library. + *

+ * @return string The deflated string or false if an error occurred. + * + * @jms-builtin + */ +function gzdeflate ($data, $level = null) {} + +/** + * Inflate a deflated string + * @link http://www.php.net/manual/en/function.gzinflate.php + * @param data string

+ * The data compressed by gzdeflate. + *

+ * @param length int[optional]

+ * The maximum length of data to decode. + *

+ * @return string The original uncompressed data or false on error. + *

+ *

+ * The function will return an error if the uncompressed data is more than + * 32768 times the length of the compressed input data + * or more than the optional parameter length. + * + * @jms-builtin + */ +function gzinflate ($data, $length = null) {} + +/** + * Create a gzip compressed string + * @link http://www.php.net/manual/en/function.gzencode.php + * @param data string

+ * The data to encode. + *

+ * @param level int[optional]

+ * The level of compression. Can be given as 0 for no compression up to 9 + * for maximum compression. If not given, the default compression level will + * be the default compression level of the zlib library. + *

+ * @param encoding_mode int[optional]

+ * The encoding mode. Can be FORCE_GZIP (the default) + * or FORCE_DEFLATE. + *

+ *

+ * If you use FORCE_DEFLATE, you get a standard zlib + * deflated string (inclusive zlib headers) after the gzip file header but + * without the trailing crc32 checksum. + *

+ * @return string The encoded string, or false if an error occurred. + * + * @jms-builtin + */ +function gzencode ($data, $level = null, $encoding_mode = null) {} + +/** + * ob_start callback function to gzip output buffer + * @link http://www.php.net/manual/en/function.ob-gzhandler.php + * @param buffer string

+ *

+ * @param mode int

+ *

+ * @return string + * + * @jms-builtin + */ +function ob_gzhandler ($buffer, $mode) {} + +/** + * Returns the coding type used for output compression + * @link http://www.php.net/manual/en/function.zlib-get-coding-type.php + * @return string Possible return values are gzip, deflate, + * or false. + * + * @jms-builtin + */ +function zlib_get_coding_type () {} + +define ('FORCE_GZIP', 1); +define ('FORCE_DEFLATE', 2); + +// End of zlib v.1.1 +?> diff --git a/res/php-5.3-core-api/Core.php b/res/php-5.3-core-api/Core.php new file mode 100644 index 0000000..17ffe04 --- /dev/null +++ b/res/php-5.3-core-api/Core.php @@ -0,0 +1,1192 @@ + + * The argument offset. Function arguments are counted starting from + * zero. + *

+ * @return mixed the specified argument, or false on error. + * + * @jms-builtin + */ +function func_get_arg ($arg_num) {} + +/** + * Returns an array comprising a function's argument list + * @link http://www.php.net/manual/en/function.func-get-args.php + * @return array an array in which each element is a copy of the corresponding + * member of the current user-defined function's argument list. + * + * @jms-builtin + */ +function func_get_args () {} + +/** + * Get string length + * @link http://www.php.net/manual/en/function.strlen.php + * @param string string

+ * The string being measured for length. + *

+ * @return int The length of the string on success, + * and 0 if the string is empty. + * + * @jms-builtin + */ +function strlen ($string) {} + +/** + * Binary safe string comparison + * @link http://www.php.net/manual/en/function.strcmp.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 + * is greater than str2, and 0 if they are + * equal. + * + * @jms-builtin + */ +function strcmp ($str1, $str2) {} + +/** + * Binary safe string comparison of the first n characters + * @link http://www.php.net/manual/en/function.strncmp.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @param len int

+ * Number of characters to use in the comparison. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 + * is greater than str2, and 0 if they are + * equal. + * + * @jms-builtin + */ +function strncmp ($str1, $str2, $len) {} + +/** + * Binary safe case-insensitive string comparison + * @link http://www.php.net/manual/en/function.strcasecmp.php + * @param str1 string

+ * The first string + *

+ * @param str2 string

+ * The second string + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 + * is greater than str2, and 0 if they are + * equal. + * + * @jms-builtin + */ +function strcasecmp ($str1, $str2) {} + +/** + * Binary safe case-insensitive string comparison of the first n characters + * @link http://www.php.net/manual/en/function.strncasecmp.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @param len int

+ * The length of strings to be used in the comparison. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 is + * greater than str2, and 0 if they are equal. + * + * @jms-builtin + */ +function strncasecmp ($str1, $str2, $len) {} + +/** + * Return the current key and value pair from an array and advance the array cursor + * @link http://www.php.net/manual/en/function.each.php + * @param array array

+ * The input array. + *

+ * @return array the current key and value pair from the array + * array. This pair is returned in a four-element + * array, with the keys 0, 1, + * key, and value. Elements + * 0 and key contain the key name of + * the array element, and 1 and value + * contain the data. + *

+ *

+ * If the internal pointer for the array points past the end of the + * array contents, each returns + * false. + * + * @jms-builtin + */ +function each (array &$array) {} + +/** + * Sets which PHP errors are reported + * @link http://www.php.net/manual/en/function.error-reporting.php + * @param level int[optional]

+ * The new error_reporting + * level. It takes on either a bitmask, or named constants. Using named + * constants is strongly encouraged to ensure compatibility for future + * versions. As error levels are added, the range of integers increases, + * so older integer-based error levels will not always behave as expected. + *

+ *

+ * The available error level constants and the actual + * meanings of these error levels are described in the + * predefined constants. + *

+ * @return int the old error_reporting + * level or the current level if no level parameter is + * given. + * + * @jms-builtin + */ +function error_reporting ($level = null) {} + +/** + * Defines a named constant + * @link http://www.php.net/manual/en/function.define.php + * @param name string

+ * The name of the constant. + *

+ * @param value mixed

+ * The value of the constant; only scalar and null values are allowed. + * Scalar values are integer, + * float, string or boolean values. It is + * possible to define resource constants, however it is not recommended + * and may cause unpredictable behavior. + *

+ * @param case_insensitive bool[optional]

+ * If set to true, the constant will be defined case-insensitive. + * The default behavior is case-sensitive; i.e. + * CONSTANT and Constant represent + * different values. + *

+ *

+ * Case-insensitive constants are stored as lower-case. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function define ($name, $value, $case_insensitive = null) {} + +/** + * Checks whether a given named constant exists + * @link http://www.php.net/manual/en/function.defined.php + * @param name string

+ * The constant name. + *

+ * @return bool true if the named constant given by name + * has been defined, false otherwise. + * + * @jms-builtin + */ +function defined ($name) {} + +/** + * Returns the name of the class of an object + * @link http://www.php.net/manual/en/function.get-class.php + * @param object object[optional]

+ * The tested object + *

+ * @return string the name of the class of which object is an + * instance. Returns false if object is not an + * object. + * + * @jms-builtin + */ +function get_class ($object = null) {} + +/** + * the "Late Static Binding" class name + * @link http://www.php.net/manual/en/function.get-called-class.php + * @return string the class name. Returns false if called from outside a class. + * + * @jms-builtin + */ +function get_called_class () {} + +/** + * Retrieves the parent class name for object or class + * @link http://www.php.net/manual/en/function.get-parent-class.php + * @param object mixed[optional]

+ * The tested object or class name + *

+ * @return string the name of the parent class of the class of which + * object is an instance or the name. + *

+ *

+ * If the object does not have a parent false will be returned. + *

+ *

+ * If called without parameter outside object, this function returns false. + * + * @jms-builtin + */ +function get_parent_class ($object = null) {} + +/** + * Checks if the class method exists + * @link http://www.php.net/manual/en/function.method-exists.php + * @param object mixed

+ * An object instance or a class name + *

+ * @param method_name string

+ * The method name + *

+ * @return bool true if the method given by method_name + * has been defined for the given object, false + * otherwise. + * + * @jms-builtin + */ +function method_exists ($object, $method_name) {} + +/** + * Checks if the object or class has a property + * @link http://www.php.net/manual/en/function.property-exists.php + * @param class mixed

+ * The class name or an object of the class to test for + *

+ * @param property string

+ * The name of the property + *

+ * @return bool true if the property exists, false if it doesn't exist or + * &null; in case of an error. + * + * @jms-builtin + */ +function property_exists ($class, $property) {} + +/** + * Checks if the class has been defined + * @link http://www.php.net/manual/en/function.class-exists.php + * @param class_name string

+ * The class name. The name is matched in a case-insensitive manner. + *

+ * @param autoload bool[optional]

+ * Whether or not to call &link.autoload; by default. + *

+ * @return bool true if class_name is a defined class, + * false otherwise. + * + * @jms-builtin + */ +function class_exists ($class_name, $autoload = null) {} + +/** + * Checks if the interface has been defined + * @link http://www.php.net/manual/en/function.interface-exists.php + * @param interface_name string

+ * The interface name + *

+ * @param autoload bool[optional]

+ * Whether to call &link.autoload; or not by default. + *

+ * @return bool true if the interface given by + * interface_name has been defined, false otherwise. + * + * @jms-builtin + */ +function interface_exists ($interface_name, $autoload = null) {} + +/** + * Return &true; if the given function has been defined + * @link http://www.php.net/manual/en/function.function-exists.php + * @param function_name string

+ * The function name, as a string. + *

+ * @return bool true if function_name exists and is a + * function, false otherwise. + *

+ *

+ * This function will return false for constructs, such as + * include_once and echo. + * + * @jms-builtin + */ +function function_exists ($function_name) {} + +/** + * Creates an alias for a class + * @link http://www.php.net/manual/en/function.class-alias.php + * @param original string[optional]

+ * The original class. + *

+ * @param alias string[optional]

+ * The alias name for the class. + *

+ * @return boolean Returns true on success or false on failure. + * + * @jms-builtin + */ +function class_alias ($original = null, $alias = null) {} + +/** + * Returns an array with the names of included or required files + * @link http://www.php.net/manual/en/function.get-included-files.php + * @return array an array of the names of all files. + *

+ *

+ * The script originally called is considered an "included file," so it will + * be listed together with the files referenced by + * include and family. + *

+ *

+ * Files that are included or required multiple times only show up once in + * the returned array. + * + * @jms-builtin + */ +function get_included_files () {} + +/** + * &Alias; get_included_files + * @link http://www.php.net/manual/en/function.get-required-files.php + * + * @jms-builtin + */ +function get_required_files () {} + +/** + * Checks if the object has this class as one of its parents + * @link http://www.php.net/manual/en/function.is-subclass-of.php + * @param object mixed

+ * A class name or an object instance + *

+ * @param class_name string

+ * The class name + *

+ * @return bool This function returns true if the object object, + * belongs to a class which is a subclass of + * class_name, false otherwise. + * + * @jms-builtin + */ +function is_subclass_of ($object, $class_name) {} + +/** + * Checks if the object is of this class or has this class as one of its parents + * @link http://www.php.net/manual/en/function.is-a.php + * @param object object

+ * The tested object + *

+ * @param class_name string

+ * The class name + *

+ * @return bool true if the object is of this class or has this class as one of + * its parents, false otherwise. + * + * @jms-builtin + */ +function is_a ($object, $class_name) {} + +/** + * Get the default properties of the class + * @link http://www.php.net/manual/en/function.get-class-vars.php + * @param class_name string

+ * The class name + *

+ * @return array an associative array of declared properties visible from the + * current scope, with their default value. + * The resulting array elements are in the form of + * varname => value. + * + * @jms-builtin + */ +function get_class_vars ($class_name) {} + +/** + * Gets the properties of the given object + * @link http://www.php.net/manual/en/function.get-object-vars.php + * @param object object

+ * An object instance. + *

+ * @return array an associative array of defined object accessible non-static properties + * for the specified object in scope. If a property have + * not been assigned a value, it will be returned with a &null; value. + * + * @jms-builtin + */ +function get_object_vars ($object) {} + +/** + * Gets the class methods' names + * @link http://www.php.net/manual/en/function.get-class-methods.php + * @param class_name mixed

+ * The class name or an object instance + *

+ * @return array an array of method names defined for the class specified by + * class_name. In case of an error, it returns &null;. + * + * @jms-builtin + */ +function get_class_methods ($class_name) {} + +/** + * Generates a user-level error/warning/notice message + * @link http://www.php.net/manual/en/function.trigger-error.php + * @param error_msg string

+ * The designated error message for this error. It's limited to 1024 + * characters in length. Any additional characters beyond 1024 will be + * truncated. + *

+ * @param error_type int[optional]

+ * The designated error type for this error. It only works with the E_USER + * family of constants, and will default to E_USER_NOTICE. + *

+ * @return bool This function returns false if wrong error_type is + * specified, true otherwise. + * + * @jms-builtin + */ +function trigger_error ($error_msg, $error_type = null) {} + +/** + * Alias of trigger_error + * @link http://www.php.net/manual/en/function.user-error.php + * @param messsage + * @param error_type[optional] + * + * @jms-builtin + */ +function user_error ($messsage, $error_type) {} + +/** + * Sets a user-defined error handler function + * @link http://www.php.net/manual/en/function.set-error-handler.php + * @param error_handler callback

+ * The user function needs to accept two parameters: the error code, and a + * string describing the error. Then there are three optional parameters + * that may be supplied: the filename in which the error occurred, the + * line number in which the error occurred, and the context in which the + * error occurred (an array that points to the active symbol table at the + * point the error occurred). The function can be shown as: + *

+ *

+ * handler + * interrno + * stringerrstr + * stringerrfile + * interrline + * arrayerrcontext + * errno + * The first parameter, errno, contains the + * level of the error raised, as an integer. + * @param error_types int[optional]

+ * Can be used to mask the triggering of the + * error_handler function just like the error_reporting ini setting + * controls which errors are shown. Without this mask set the + * error_handler will be called for every error + * regardless to the setting of the error_reporting setting. + *

+ * @return mixed a string containing the previously defined error handler (if any). If + * the built-in error handler is used &null; is returned. &null; is also returned + * in case of an error such as an invalid callback. If the previous error handler + * was a class method, this function will return an indexed array with the class + * and the method name. + * + * @jms-builtin + */ +function set_error_handler ($error_handler, $error_types = null) {} + +/** + * Restores the previous error handler function + * @link http://www.php.net/manual/en/function.restore-error-handler.php + * @return bool This function always returns true. + * + * @jms-builtin + */ +function restore_error_handler () {} + +/** + * Sets a user-defined exception handler function + * @link http://www.php.net/manual/en/function.set-exception-handler.php + * @param exception_handler callback

+ * Name of the function to be called when an uncaught exception occurs. + * This function must be defined before calling + * set_exception_handler. This handler function + * needs to accept one parameter, which will be the exception object that + * was thrown. + *

+ * @return callback the name of the previously defined exception handler, or &null; on error. If + * no previous handler was defined, &null; is also returned. + * + * @jms-builtin + */ +function set_exception_handler ($exception_handler) {} + +/** + * Restores the previously defined exception handler function + * @link http://www.php.net/manual/en/function.restore-exception-handler.php + * @return bool This function always returns true. + * + * @jms-builtin + */ +function restore_exception_handler () {} + +/** + * Returns an array with the name of the defined classes + * @link http://www.php.net/manual/en/function.get-declared-classes.php + * @return array an array of the names of the declared classes in the current + * script. + *

+ *

+ * Note that depending on what extensions you have compiled or + * loaded into PHP, additional classes could be present. This means that + * you will not be able to define your own classes using these + * names. There is a list of predefined classes in the Predefined Classes section of + * the appendices. + * + * @jms-builtin + */ +function get_declared_classes () {} + +/** + * Returns an array of all declared interfaces + * @link http://www.php.net/manual/en/function.get-declared-interfaces.php + * @return array an array of the names of the declared interfaces in the current + * script. + * + * @jms-builtin + */ +function get_declared_interfaces () {} + +/** + * Returns an array of all defined functions + * @link http://www.php.net/manual/en/function.get-defined-functions.php + * @return array an multidimensional array containing a list of all defined + * functions, both built-in (internal) and user-defined. The internal + * functions will be accessible via $arr["internal"], and + * the user defined ones using $arr["user"] (see example + * below). + * + * @jms-builtin + */ +function get_defined_functions () {} + +/** + * Returns an array of all defined variables + * @link http://www.php.net/manual/en/function.get-defined-vars.php + * @return array A multidimensional array with all the variables. + * + * @jms-builtin + */ +function get_defined_vars () {} + +/** + * Create an anonymous (lambda-style) function + * @link http://www.php.net/manual/en/function.create-function.php + * @param args string

+ * The function arguments. + *

+ * @param code string

+ * The function code. + *

+ * @return string a unique function name as a string, or false on error. + * + * @jms-builtin + */ +function create_function ($args, $code) {} + +/** + * Returns the resource type + * @link http://www.php.net/manual/en/function.get-resource-type.php + * @param handle resource

+ * The evaluated resource handle. + *

+ * @return string If the given handle is a resource, this function + * will return a string representing its type. If the type is not identified + * by this function, the return value will be the string + * Unknown. + *

+ *

+ * This function will return false and generate an error if + * handle is not a resource. + * + * @jms-builtin + */ +function get_resource_type ($handle) {} + +/** + * Returns an array with the names of all modules compiled and loaded + * @link http://www.php.net/manual/en/function.get-loaded-extensions.php + * @param zend_extensions bool[optional]

+ * Return zend_extensions or not, defaults to false (do not list + * zend_extensions). + *

+ * @return array an indexed array of all the modules names. + * + * @jms-builtin + */ +function get_loaded_extensions ($zend_extensions = null) {} + +/** + * Find out whether an extension is loaded + * @link http://www.php.net/manual/en/function.extension-loaded.php + * @param name string

+ * The extension name. + *

+ *

+ * You can see the names of various extensions by using + * phpinfo or if you're using the + * CGI or CLI version of + * PHP you can use the -m switch to + * list all available extensions: + *

+ * @return bool true if the extension identified by name + * is loaded, false otherwise. + * + * @jms-builtin + */ +function extension_loaded ($name) {} + +/** + * Returns an array with the names of the functions of a module + * @link http://www.php.net/manual/en/function.get-extension-funcs.php + * @param module_name string

+ * The module name. + *

+ *

+ * This parameter must be in lowercase. + *

+ * @return array an array with all the functions, or false if + * module_name is not a valid extension. + * + * @jms-builtin + */ +function get_extension_funcs ($module_name) {} + +/** + * Returns an associative array with the names of all the constants and their values + * @link http://www.php.net/manual/en/function.get-defined-constants.php + * @param categorize bool[optional]

+ * Causing this function to return a multi-dimensional + * array with categories in the keys of the first dimension and constants + * and their values in the second dimension. + * ]]> + * &example.outputs.similar; + * Array + * ( + * [E_ERROR] => 1 + * [E_WARNING] => 2 + * [E_PARSE] => 4 + * [E_NOTICE] => 8 + * [E_CORE_ERROR] => 16 + * [E_CORE_WARNING] => 32 + * [E_COMPILE_ERROR] => 64 + * [E_COMPILE_WARNING] => 128 + * [E_USER_ERROR] => 256 + * [E_USER_WARNING] => 512 + * [E_USER_NOTICE] => 1024 + * [E_ALL] => 2047 + * [TRUE] => 1 + * ) + * [pcre] => Array + * ( + * [PREG_PATTERN_ORDER] => 1 + * [PREG_SET_ORDER] => 2 + * [PREG_OFFSET_CAPTURE] => 256 + * [PREG_SPLIT_NO_EMPTY] => 1 + * [PREG_SPLIT_DELIM_CAPTURE] => 2 + * [PREG_SPLIT_OFFSET_CAPTURE] => 4 + * [PREG_GREP_INVERT] => 1 + * ) + * [user] => Array + * ( + * [MY_CONSTANT] => 1 + * ) + * ) + * ]]> + *

+ * @return array + * + * @jms-builtin + */ +function get_defined_constants ($categorize = null) {} + +/** + * Generates a backtrace + * @link http://www.php.net/manual/en/function.debug-backtrace.php + * @param provide_object bool[optional]

+ * Whether or not to populate the "object" index. + *

+ * @return array an associative array. The possible returned elements + * are as follows: + *

+ *

+ * + * Possible returned elements from debug_backtrace + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
&Name;&Type;&Description;
functionstring + * The current function name. See also + * __FUNCTION__. + *
lineinteger + * The current line number. See also + * __LINE__. + *
filestring + * The current file name. See also + * __FILE__. + *
classstring + * The current class name. See also + * __CLASS__ + *
objectobject + * The current object. + *
typestring + * The current call type. If a method call, "->" is returned. If a static + * method call, "::" is returned. If a function call, nothing is returned. + *
argsarray + * If inside a function, this lists the functions arguments. If + * inside an included file, this lists the included file name(s). + *
+ * + * @jms-builtin + */ +function debug_backtrace ($provide_object = null) {} + +/** + * Prints a backtrace + * @link http://www.php.net/manual/en/function.debug-print-backtrace.php + * @return void + * + * @jms-builtin + */ +function debug_print_backtrace () {} + +/** + * Forces collection of any existing garbage cycles + * @link http://www.php.net/manual/en/function.gc-collect-cycles.php + * @return int number of collected cycles. + * + * @jms-builtin + */ +function gc_collect_cycles () {} + +/** + * Returns status of the circular reference collector + * @link http://www.php.net/manual/en/function.gc-enabled.php + * @return bool true if the garbage collector is enabled, false otherwise. + * + * @jms-builtin + */ +function gc_enabled () {} + +/** + * Activates the circular reference collector + * @link http://www.php.net/manual/en/function.gc-enable.php + * @return void + * + * @jms-builtin + */ +function gc_enable () {} + +/** + * Deactivates the circular reference collector + * @link http://www.php.net/manual/en/function.gc-disable.php + * @return void + * + * @jms-builtin + */ +function gc_disable () {} + + +/** + * Fatal run-time errors. These indicate errors that can not be + * recovered from, such as a memory allocation problem. + * Execution of the script is halted. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_ERROR', 1); + +/** + * Catchable fatal error. It indicates that a probably dangerous error + * occured, but did not leave the Engine in an unstable state. If the error + * is not caught by a user defined handle (see also + * set_error_handler), the application aborts as it + * was an E_ERROR. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_RECOVERABLE_ERROR', 4096); + +/** + * Run-time warnings (non-fatal errors). Execution of the script is not + * halted. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_WARNING', 2); + +/** + * Compile-time parse errors. Parse errors should only be generated by + * the parser. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_PARSE', 4); + +/** + * Run-time notices. Indicate that the script encountered something that + * could indicate an error, but could also happen in the normal course of + * running a script. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_NOTICE', 8); + +/** + * Enable to have PHP suggest changes + * to your code which will ensure the best interoperability + * and forward compatibility of your code. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_STRICT', 2048); + +/** + * Run-time notices. Enable this to receive warnings about code + * that will not work in future versions. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_DEPRECATED', 8192); + +/** + * Fatal errors that occur during PHP's initial startup. This is like an + * E_ERROR, except it is generated by the core of PHP. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_CORE_ERROR', 16); + +/** + * Warnings (non-fatal errors) that occur during PHP's initial startup. + * This is like an E_WARNING, except it is generated + * by the core of PHP. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_CORE_WARNING', 32); + +/** + * Fatal compile-time errors. This is like an E_ERROR, + * except it is generated by the Zend Scripting Engine. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_COMPILE_ERROR', 64); + +/** + * Compile-time warnings (non-fatal errors). This is like an + * E_WARNING, except it is generated by the Zend + * Scripting Engine. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_COMPILE_WARNING', 128); + +/** + * User-generated error message. This is like an + * E_ERROR, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_ERROR', 256); + +/** + * User-generated warning message. This is like an + * E_WARNING, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_WARNING', 512); + +/** + * User-generated notice message. This is like an + * E_NOTICE, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_NOTICE', 1024); + +/** + * User-generated warning message. This is like an + * E_DEPRECATED, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_DEPRECATED', 16384); + +/** + * All errors and warnings, as supported, except of level + * E_STRICT. + * @link http://www.php.net/manual/en/errorfunc.constants.php + */ +define ('E_ALL', 30719); +define ('TRUE', true); +define ('FALSE', false); +define ('NULL', null); +define ('ZEND_THREAD_SAFE', false); +define ('ZEND_DEBUG_BUILD', false); +define ('PHP_VERSION', "5.3.2"); +define ('PHP_MAJOR_VERSION', 5); +define ('PHP_MINOR_VERSION', 3); +define ('PHP_RELEASE_VERSION', 2); +define ('PHP_EXTRA_VERSION', ""); +define ('PHP_VERSION_ID', 50302); +define ('PHP_ZTS', 0); +define ('PHP_DEBUG', 0); +define ('PHP_OS', "Linux"); +define ('PHP_SAPI', "cli"); +define ('DEFAULT_INCLUDE_PATH', ".:/usr/local/zend/share/pear"); +define ('PEAR_INSTALL_DIR', "/usr/local/zend/share/pear"); +define ('PEAR_EXTENSION_DIR', "/usr/local/zend/lib/php/20090626"); +define ('PHP_EXTENSION_DIR', "/usr/local/zend/lib/php/20090626"); +define ('PHP_PREFIX', "/usr/local/zend"); +define ('PHP_BINDIR', "/usr/local/zend/bin"); +define ('PHP_LIBDIR', "/usr/local/zend/lib/php"); +define ('PHP_DATADIR', "${prefix}/share"); +define ('PHP_SYSCONFDIR', "/usr/local/zend/etc"); +define ('PHP_LOCALSTATEDIR', "/usr/local/zend/var"); +define ('PHP_CONFIG_FILE_PATH', "/usr/local/zend/etc"); +define ('PHP_CONFIG_FILE_SCAN_DIR', ""); +define ('PHP_SHLIB_SUFFIX', "so"); +define ('PHP_EOL', "\n"); +define ('PHP_MAXPATHLEN', 4096); +define ('PHP_INT_MAX', 2147483647); +define ('PHP_INT_SIZE', 4); +define ('PHP_OUTPUT_HANDLER_START', 1); +define ('PHP_OUTPUT_HANDLER_CONT', 2); +define ('PHP_OUTPUT_HANDLER_END', 4); +define ('UPLOAD_ERR_OK', 0); +define ('UPLOAD_ERR_INI_SIZE', 1); +define ('UPLOAD_ERR_FORM_SIZE', 2); +define ('UPLOAD_ERR_PARTIAL', 3); +define ('UPLOAD_ERR_NO_FILE', 4); +define ('UPLOAD_ERR_NO_TMP_DIR', 6); +define ('UPLOAD_ERR_CANT_WRITE', 7); +define ('UPLOAD_ERR_EXTENSION', 8); +define ('DEBUGGER_VERSION', 5.3); +define ('STDIN', "Resource id #1"); +define ('STDOUT', "Resource id #2"); +define ('STDERR', "Resource id #3"); + +// End of Core v.5.3.2 +?> diff --git a/res/php-5.3-core-api/PDO.php b/res/php-5.3-core-api/PDO.php new file mode 100644 index 0000000..1badfbe --- /dev/null +++ b/res/php-5.3-core-api/PDO.php @@ -0,0 +1,751 @@ + + * This must be a valid SQL statement for the target database server. + *

+ * @param driver_options array[optional]

+ * This array holds one or more key=>value pairs to set + * attribute values for the PDOStatement object that this method + * returns. You would most commonly use this to set the + * PDO::ATTR_CURSOR value to + * PDO::CURSOR_SCROLL to request a scrollable cursor. + * Some drivers have driver specific options that may be set at + * prepare-time. + *

+ * @return PDOStatement If the database server successfully prepares the statement, + * PDO::prepare returns a + * PDOStatement object. + * If the database server cannot successfully prepare the statement, + * PDO::prepare returns false or emits + * PDOException (depending on error handling). + *

+ *

+ * Emulated prepared statements does not communicate with the database server + * so PDO::prepare does not check the statement. + */ + public function prepare ($statement, array $driver_options = null) {} + + /** + * Initiates a transaction + * @link http://www.php.net/manual/en/pdo.begintransaction.php + * @return bool Returns true on success or false on failure. + */ + public function beginTransaction () {} + + /** + * Commits a transaction + * @link http://www.php.net/manual/en/pdo.commit.php + * @return bool Returns true on success or false on failure. + */ + public function commit () {} + + /** + * Rolls back a transaction + * @link http://www.php.net/manual/en/pdo.rollback.php + * @return bool Returns true on success or false on failure. + */ + public function rollBack () {} + + /** + * Set an attribute + * @link http://www.php.net/manual/en/pdo.setattribute.php + * @param attribute int + * @param value mixed + * @return bool Returns true on success or false on failure. + */ + public function setAttribute ($attribute, $value) {} + + /** + * Execute an SQL statement and return the number of affected rows + * @link http://www.php.net/manual/en/pdo.exec.php + * @param statement string

+ * The SQL statement to prepare and execute. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return int PDO::exec returns the number of rows that were modified + * or deleted by the SQL statement you issued. If no rows were affected, + * PDO::exec returns 0. + *

+ * &return.falseproblem; + *

+ * The following example incorrectly relies on the return value of + * PDO::exec, wherein a statement that affected 0 rows + * results in a call to die: + * exec() or die(print_r($db->errorInfo(), true)); + * ?> + * ]]> + */ + public function exec ($statement) {} + + /** + * Executes an SQL statement, returning a result set as a PDOStatement object + * @link http://www.php.net/manual/en/pdo.query.php + * @param statement string

+ * The SQL statement to prepare and execute. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return PDOStatement PDO::query returns a PDOStatement object, or false + * on failure. + */ + public function query ($statement) {} + + /** + * Returns the ID of the last inserted row or sequence value + * @link http://www.php.net/manual/en/pdo.lastinsertid.php + * @param name string[optional]

+ * Name of the sequence object from which the ID should be returned. + *

+ * @return string If a sequence name was not specified for the name + * parameter, PDO::lastInsertId returns a + * string representing the row ID of the last row that was inserted into + * the database. + *

+ *

+ * If a sequence name was specified for the name + * parameter, PDO::lastInsertId returns a + * string representing the last value retrieved from the specified sequence + * object. + *

+ *

+ * If the PDO driver does not support this capability, + * PDO::lastInsertId triggers an + * IM001 SQLSTATE. + */ + public function lastInsertId ($name = null) {} + + /** + * Fetch the SQLSTATE associated with the last operation on the database handle + * @link http://www.php.net/manual/en/pdo.errorcode.php + * @return mixed a SQLSTATE, a five characters alphanumeric identifier defined in + * the ANSI SQL-92 standard. Briefly, an SQLSTATE consists of a + * two characters class value followed by a three characters subclass value. A + * class value of 01 indicates a warning and is accompanied by a return code + * of SQL_SUCCESS_WITH_INFO. Class values other than '01', except for the + * class 'IM', indicate an error. The class 'IM' is specific to warnings + * and errors that derive from the implementation of PDO (or perhaps ODBC, + * if you're using the ODBC driver) itself. The subclass value '000' in any + * class indicates that there is no subclass for that SQLSTATE. + *

+ *

+ * PDO::errorCode only retrieves error codes for operations + * performed directly on the database handle. If you create a PDOStatement + * object through PDO::prepare or + * PDO::query and invoke an error on the statement + * handle, PDO::errorCode will not reflect that error. + * You must call PDOStatement::errorCode to return the error + * code for an operation performed on a particular statement handle. + *

+ *

+ * Returns &null; if no operation has been run on the database handle. + */ + public function errorCode () {} + + /** + * Fetch extended error information associated with the last operation on the database handle + * @link http://www.php.net/manual/en/pdo.errorinfo.php + * @return array PDO::errorInfo returns an array of error information + * about the last operation performed by this database handle. The array + * consists of the following fields: + * + * Element + * Information + * + * + * 0 + * SQLSTATE error code (a five characters alphanumeric identifier defined + * in the ANSI SQL standard). + * + * + * 1 + * Driver-specific error code. + * + * + * 2 + * Driver-specific error message. + * + *

+ *

+ * If the SQLSTATE error code is not set or there is no driver-specific + * error, the elements following element 0 will be set to &null;. + *

+ *

+ * PDO::errorInfo only retrieves error information for + * operations performed directly on the database handle. If you create a + * PDOStatement object through PDO::prepare or + * PDO::query and invoke an error on the statement + * handle, PDO::errorInfo will not reflect the error + * from the statement handle. You must call + * PDOStatement::errorInfo to return the error + * information for an operation performed on a particular statement handle. + */ + public function errorInfo () {} + + /** + * Retrieve a database connection attribute + * @link http://www.php.net/manual/en/pdo.getattribute.php + * @param attribute int

+ * One of the PDO::ATTR_* constants. The constants that + * apply to database connections are as follows: + * PDO::ATTR_AUTOCOMMIT + * PDO::ATTR_CASE + * PDO::ATTR_CLIENT_VERSION + * PDO::ATTR_CONNECTION_STATUS + * PDO::ATTR_DRIVER_NAME + * PDO::ATTR_ERRMODE + * PDO::ATTR_ORACLE_NULLS + * PDO::ATTR_PERSISTENT + * PDO::ATTR_PREFETCH + * PDO::ATTR_SERVER_INFO + * PDO::ATTR_SERVER_VERSION + * PDO::ATTR_TIMEOUT + *

+ * @return mixed A successful call returns the value of the requested PDO attribute. + * An unsuccessful call returns null. + */ + public function getAttribute ($attribute) {} + + /** + * Quotes a string for use in a query. + * @link http://www.php.net/manual/en/pdo.quote.php + * @param string string

+ * The string to be quoted. + *

+ * @param parameter_type int[optional]

+ * Provides a data type hint for drivers that have alternate quoting styles. + *

+ * @return string a quoted string that is theoretically safe to pass into an + * SQL statement. Returns false if the driver does not support quoting in + * this way. + */ + public function quote ($string, $parameter_type = null) {} + + final public function __wakeup () {} + + final public function __sleep () {} + + /** + * Return an array of available PDO drivers + * @link http://www.php.net/manual/en/pdo.getavailabledrivers.php + * @return array PDO::getAvailableDrivers returns an array of PDO driver names. If + * no drivers are available, it returns an empty array. + */ + public static function getAvailableDrivers () {} + +} + +/** @jms-builtin */ +class PDOStatement implements Traversable { + public $queryString; + + + /** + * Executes a prepared statement + * @link http://www.php.net/manual/en/pdostatement.execute.php + * @param input_parameters array[optional]

+ * An array of values with as many elements as there are bound + * parameters in the SQL statement being executed. + * All values are treated as PDO::PARAM_STR. + *

+ *

+ * You cannot bind multiple values to a single parameter; for example, + * you cannot bind two values to a single named parameter in an IN() + * clause. + *

+ * @return bool Returns true on success or false on failure. + */ + public function execute (array $input_parameters = null) {} + + /** + * Fetches the next row from a result set + * @link http://www.php.net/manual/en/pdostatement.fetch.php + * @param fetch_style int[optional]

+ * Controls how the next row will be returned to the caller. This value + * must be one of the PDO::FETCH_* constants, + * defaulting to PDO::FETCH_BOTH. + *

+ * PDO::FETCH_ASSOC: returns an array indexed by column + * name as returned in your result set + *

+ * @param cursor_orientation int[optional]

+ * For a PDOStatement object representing a scrollable cursor, this + * value determines which row will be returned to the caller. This value + * must be one of the PDO::FETCH_ORI_* constants, + * defaulting to PDO::FETCH_ORI_NEXT. To request a + * scrollable cursor for your PDOStatement object, you must set the + * PDO::ATTR_CURSOR attribute to + * PDO::CURSOR_SCROLL when you prepare the SQL + * statement with PDO::prepare. + *

+ * @param cursor_offset int[optional] + * @return mixed The return value of this function on success depends on the fetch type. In + * all cases, false is returned on failure. + */ + public function fetch ($fetch_style = null, $cursor_orientation = null, $cursor_offset = null) {} + + /** + * Binds a parameter to the specified variable name + * @link http://www.php.net/manual/en/pdostatement.bindparam.php + * @param parameter mixed

+ * Parameter identifier. For a prepared statement using named + * placeholders, this will be a parameter name of the form + * :name. For a prepared statement using + * question mark placeholders, this will be the 1-indexed position of + * the parameter. + *

+ * @param variable mixed

+ * Name of the PHP variable to bind to the SQL statement parameter. + *

+ * @param data_type int[optional]

+ * Explicit data type for the parameter using the PDO::PARAM_* + * constants. + * To return an INOUT parameter from a stored procedure, + * use the bitwise OR operator to set the PDO::PARAM_INPUT_OUTPUT bits + * for the data_type parameter. + *

+ * @param length int[optional]

+ * Length of the data type. To indicate that a parameter is an OUT + * parameter from a stored procedure, you must explicitly set the + * length. + *

+ * @param driver_options mixed[optional]

+ *

+ * @return bool Returns true on success or false on failure. + */ + public function bindParam ($parameter, &$variable, $data_type = null, $length = null, $driver_options = null) {} + + /** + * Bind a column to a PHP variable + * @link http://www.php.net/manual/en/pdostatement.bindcolumn.php + * @param column mixed

+ * Number of the column (1-indexed) or name of the column in the result set. + * If using the column name, be aware that the name should match the + * case of the column, as returned by the driver. + *

+ * @param param mixed

+ * Name of the PHP variable to which the column will be bound. + *

+ * @param type int[optional]

+ * Data type of the parameter, specified by the PDO::PARAM_* constants. + *

+ * @param maxlen int[optional]

+ * A hint for pre-allocation. + *

+ * @param driverdata mixed[optional]

+ * Optional parameter(s) for the driver. + *

+ * @return bool Returns true on success or false on failure. + */ + public function bindColumn ($column, &$param, $type = null, $maxlen = null, $driverdata = null) {} + + /** + * Binds a value to a parameter + * @link http://www.php.net/manual/en/pdostatement.bindvalue.php + * @param parameter mixed

+ * Parameter identifier. For a prepared statement using named + * placeholders, this will be a parameter name of the form + * :name. For a prepared statement using + * question mark placeholders, this will be the 1-indexed position of + * the parameter. + *

+ * @param value mixed

+ * The value to bind to the parameter. + *

+ * @param data_type int[optional]

+ * Explicit data type for the parameter using the PDO::PARAM_* + * constants. + *

+ * @return bool Returns true on success or false on failure. + */ + public function bindValue ($parameter, $value, $data_type = null) {} + + /** + * Returns the number of rows affected by the last SQL statement + * @link http://www.php.net/manual/en/pdostatement.rowcount.php + * @return int the number of rows. + */ + public function rowCount () {} + + /** + * Returns a single column from the next row of a result set + * @link http://www.php.net/manual/en/pdostatement.fetchcolumn.php + * @param column_number int[optional]

+ * 0-indexed number of the column you wish to retrieve from the row. If + * no value is supplied, PDOStatement::fetchColumn + * fetches the first column. + *

+ * @return string PDOStatement::fetchColumn returns a single column + * in the next row of a result set. + *

+ *

+ * There is no way to return another column from the same row if you + * use PDOStatement::fetchColumn to retrieve data. + */ + public function fetchColumn ($column_number = null) {} + + /** + * Returns an array containing all of the result set rows + * @link http://www.php.net/manual/en/pdostatement.fetchall.php + * @param fetch_style int[optional]

+ * Controls the contents of the returned array as documented in + * PDOStatement::fetch. + *

+ *

+ * To return an array consisting of all values of a single column from + * the result set, specify PDO::FETCH_COLUMN. You + * can specify which column you want with the + * column-index parameter. + *

+ *

+ * To fetch only the unique values of a single column from the result set, + * bitwise-OR PDO::FETCH_COLUMN with + * PDO::FETCH_UNIQUE. + *

+ *

+ * To return an associative array grouped by the values of a specified + * column, bitwise-OR PDO::FETCH_COLUMN with + * PDO::FETCH_GROUP. + *

+ * @param column_index int[optional]

+ * Returns the indicated 0-indexed column when the value of + * fetch_style is + * PDO::FETCH_COLUMN. + *

+ * @param ctor_args array[optional]

+ * Arguments of custom class constructor. + *

+ * @return array PDOStatement::fetchAll returns an array containing + * all of the remaining rows in the result set. The array represents each + * row as either an array of column values or an object with properties + * corresponding to each column name. + *

+ *

+ * Using this method to fetch large result sets will result in a heavy + * demand on system and possibly network resources. Rather than retrieving + * all of the data and manipulating it in PHP, consider using the database + * server to manipulate the result sets. For example, use the WHERE and + * SORT BY clauses in SQL to restrict results before retrieving and + * processing them with PHP. + */ + public function fetchAll ($fetch_style = null, $column_index = null, array $ctor_args = null) {} + + /** + * Fetches the next row and returns it as an object. + * @link http://www.php.net/manual/en/pdostatement.fetchobject.php + * @param class_name string[optional]

+ * Name of the created class. + *

+ * @param ctor_args array[optional]

+ * Elements of this array are passed to the constructor. + *

+ * @return mixed an instance of the required class with property names that + * correspond to the column names &return.falseforfailure;. + */ + public function fetchObject ($class_name = null, array $ctor_args = null) {} + + /** + * Fetch the SQLSTATE associated with the last operation on the statement handle + * @link http://www.php.net/manual/en/pdostatement.errorcode.php + * @return string Identical to PDO::errorCode, except that + * PDOStatement::errorCode only retrieves error codes + * for operations performed with PDOStatement objects. + */ + public function errorCode () {} + + /** + * Fetch extended error information associated with the last operation on the statement handle + * @link http://www.php.net/manual/en/pdostatement.errorinfo.php + * @return array PDOStatement::errorInfo returns an array of + * error information about the last operation performed by this + * statement handle. The array consists of the following fields: + * + * Element + * Information + * + * + * 0 + * SQLSTATE error code (a five characters alphanumeric identifier defined + * in the ANSI SQL standard). + * + * + * 1 + * Driver specific error code. + * + * + * 2 + * Driver specific error message. + * + */ + public function errorInfo () {} + + /** + * Set a statement attribute + * @link http://www.php.net/manual/en/pdostatement.setattribute.php + * @param attribute int + * @param value mixed + * @return bool Returns true on success or false on failure. + */ + public function setAttribute ($attribute, $value) {} + + /** + * Retrieve a statement attribute + * @link http://www.php.net/manual/en/pdostatement.getattribute.php + * @param attribute int + * @return mixed the attribute value. + */ + public function getAttribute ($attribute) {} + + /** + * Returns the number of columns in the result set + * @link http://www.php.net/manual/en/pdostatement.columncount.php + * @return int the number of columns in the result set represented by the + * PDOStatement object. If there is no result set, + * PDOStatement::columnCount returns 0. + */ + public function columnCount () {} + + /** + * Returns metadata for a column in a result set + * @link http://www.php.net/manual/en/pdostatement.getcolumnmeta.php + * @param column int

+ * The 0-indexed column in the result set. + *

+ * @return array an associative array containing the following values representing + * the metadata for a single column: + *

+ * + * Column metadata + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameValue
native_typeThe PHP native type used to represent the column value.
driver:decl_typeThe SQL type used to represent the column value in the database. + * If the column in the result set is the result of a function, this value + * is not returned by PDOStatement::getColumnMeta. + *
flagsAny flags set for this column.
nameThe name of this column as returned by the database.
tableThe name of this column's table as returned by the database.
lenThe length of this column. Normally -1 for + * types other than floating point decimals.
precisionThe numeric precision of this column. Normally + * 0 for types other than floating point + * decimals.
pdo_typeThe type of this column as represented by the + * PDO::PARAM_* constants.
+ *

+ * Returns false if the requested column does not exist in the result set, + * or if no result set exists. + */ + public function getColumnMeta ($column) {} + + /** + * Set the default fetch mode for this statement + * @link http://www.php.net/manual/en/pdostatement.setfetchmode.php + * @param mode int

+ * The fetch mode must be one of the PDO::FETCH_* constants. + *

+ * @return bool 1 on success&return.falseforfailure;. + */ + public function setFetchMode ($mode) {} + + /** + * Advances to the next rowset in a multi-rowset statement handle + * @link http://www.php.net/manual/en/pdostatement.nextrowset.php + * @return bool Returns true on success or false on failure. + */ + public function nextRowset () {} + + /** + * Closes the cursor, enabling the statement to be executed again. + * @link http://www.php.net/manual/en/pdostatement.closecursor.php + * @return bool Returns true on success or false on failure. + */ + public function closeCursor () {} + + /** + * Dump a SQL prepared command + * @link http://www.php.net/manual/en/pdostatement.debugdumpparams.php + * @return bool + */ + public function debugDumpParams () {} + + final public function __wakeup () {} + + final public function __sleep () {} + +} + +/** @jms-builtin */ +final class PDORow { +} + +function pdo_drivers () {} + +// End of PDO v.1.0.4dev +?> diff --git a/res/php-5.3-core-api/Phar.php b/res/php-5.3-core-api/Phar.php new file mode 100644 index 0000000..6927b94 --- /dev/null +++ b/res/php-5.3-core-api/Phar.php @@ -0,0 +1,2175 @@ + + * Path to an existing Phar archive or to-be-created archive + *

+ * @param flags int[optional]

+ * Flags to pass to parent class RecursiveDirectoryIterator. + *

+ * @param alias string[optional]

+ * Alias with which this Phar archive should be referred to in calls to stream + * functionality. + *

+ * @return void + */ + public function __construct ($fname, $flags = null, $alias = null) {} + + public function __destruct () {} + + /** + * Add an empty directory to the phar archive + * @link http://www.php.net/manual/en/phar.addemptydir.php + * @param dirname string

+ * The name of the empty directory to create in the phar archive + *

+ * @return void no return value, exception is thrown on failure. + */ + public function addEmptyDir ($dirname) {} + + /** + * Add a file from the filesystem to the phar archive + * @link http://www.php.net/manual/en/phar.addfile.php + * @param file string

+ * Full or relative path to a file on disk to be added + * to the phar archive. + *

+ * @param localname string[optional]

+ * Path that the file will be stored in the archive. + *

+ * @return void no return value, exception is thrown on failure. + */ + public function addFile ($file, $localname = null) {} + + /** + * Add a file from the filesystem to the phar archive + * @link http://www.php.net/manual/en/phar.addfromstring.php + * @param localname string

+ * Path that the file will be stored in the archive. + *

+ * @param contents string

+ * The file contents to store + *

+ * @return void no return value, exception is thrown on failure. + */ + public function addFromString ($localname, $contents) {} + + /** + * Construct a phar archive from the files within a directory. + * @link http://www.php.net/manual/en/phar.buildfromdirectory.php + * @param base_dir string

+ * The full or relative path to the directory that contains all files + * to add to the archive. + *

+ * @param regex string[optional]

+ * An optional pcre regular expression that is used to filter the + * list of files. Only file paths matching the regular expression + * will be included in the archive. + *

+ * @return array Phar::buildFromDirectory returns an associative array + * mapping internal path of file to the full path of the file on the + * filesystem. + */ + public function buildFromDirectory ($base_dir, $regex = null) {} + + /** + * Construct a phar archive from an iterator. + * @link http://www.php.net/manual/en/phar.buildfromiterator.php + * @param iter Iterator

+ * Any iterator that either associatively maps phar file to location or + * returns SplFileInfo objects + *

+ * @param base_directory string[optional]

+ * For iterators that return SplFileInfo objects, the portion of each + * file's full path to remove when adding to the phar archive + *

+ * @return array Phar::buildFromIterator returns an associative array + * mapping internal path of file to the full path of the file on the + * filesystem. + */ + public function buildFromIterator ($iter, $base_directory = null) {} + + /** + * Compresses all files in the current Phar archive + * @link http://www.php.net/manual/en/phar.compressfiles.php + * @param compression int

+ * Compression must be one of Phar::GZ, + * Phar::BZ2 to add compression, or Phar::NONE + * to remove compression. + *

+ * @return void + */ + public function compressFiles ($compression) {} + + /** + * Decompresses all files in the current Phar archive + * @link http://www.php.net/manual/en/phar.decompressfiles.php + * @return bool Returns true on success or false on failure. + */ + public function decompressFiles () {} + + /** + * Compresses the entire Phar archive using Gzip or Bzip2 compression + * @link http://www.php.net/manual/en/phar.compress.php + * @param compression int

+ * Compression must be one of Phar::GZ, + * Phar::BZ2 to add compression, or Phar::NONE + * to remove compression. + *

+ * @param extension string[optional]

+ * By default, the extension is .phar.gz + * or .phar.bz2 for compressing phar archives, and + * .phar.tar.gz or .phar.tar.bz2 for + * compressing tar archives. For decompressing, the default file extensions + * are .phar and .phar.tar. + *

+ * @return object a Phar object. + */ + public function compress ($compression, $extension = null) {} + + /** + * Decompresses the entire Phar archive + * @link http://www.php.net/manual/en/phar.decompress.php + * @param extension string[optional]

+ * For decompressing, the default file extensions + * are .phar and .phar.tar. + * Use this parameter to specify another file extension. Be aware + * that all executable phar archives must contain .phar + * in their filename. + *

+ * @return object A Phar object is returned. + */ + public function decompress ($extension = null) {} + + /** + * Convert a phar archive to another executable phar archive file format + * @link http://www.php.net/manual/en/phar.converttoexecutable.php + * @param format int[optional]

+ * This should be one of Phar::PHAR, Phar::TAR, + * or Phar::ZIP. If set to &null;, the existing file format + * will be preserved. + *

+ * @param compression int[optional]

+ * This should be one of Phar::NONE for no whole-archive + * compression, Phar::GZ for zlib-based compression, and + * Phar::BZ2 for bzip-based compression. + *

+ * @param extension string[optional]

+ * This parameter is used to override the default file extension for a + * converted archive. Note that all zip- and tar-based phar archives must contain + * .phar in their file extension in order to be processed as a + * phar archive. + *

+ *

+ * If converting to a phar-based archive, the default extensions are + * .phar, .phar.gz, or .phar.bz2 + * depending on the specified compression. For tar-based phar archives, the + * default extensions are .phar.tar, .phar.tar.gz, + * and .phar.tar.bz2. For zip-based phar archives, the + * default extension is .phar.zip. + *

+ * @return Phar The method returns a Phar object on success and throws an + * exception on failure. + */ + public function convertToExecutable ($format = null, $compression = null, $extension = null) {} + + /** + * Convert a phar archive to a non-executable tar or zip file + * @link http://www.php.net/manual/en/phar.converttodata.php + * @param format int[optional]

+ * This should be one of Phar::TAR + * or Phar::ZIP. If set to &null;, the existing file format + * will be preserved. + *

+ * @param compression int[optional]

+ * This should be one of Phar::NONE for no whole-archive + * compression, Phar::GZ for zlib-based compression, and + * Phar::BZ2 for bzip-based compression. + *

+ * @param extension string[optional]

+ * This parameter is used to override the default file extension for a + * converted archive. Note that .phar cannot be used + * anywhere in the filename for a non-executable tar or zip archive. + *

+ *

+ * If converting to a tar-based phar archive, the + * default extensions are .tar, .tar.gz, + * and .tar.bz2 depending on specified compression. + * For zip-based archives, the + * default extension is .zip. + *

+ * @return PharData The method returns a PharData object on success and throws an + * exception on failure. + */ + public function convertToData ($format = null, $compression = null, $extension = null) {} + + /** + * Copy a file internal to the phar archive to another new file within the phar + * @link http://www.php.net/manual/en/phar.copy.php + * @param oldfile string

+ *

+ * @param newfile string

+ *

+ * @return bool returns true on success, but it is safer to encase method call in a + * try/catch block and assume success if no exception is thrown. + */ + public function copy ($oldfile, $newfile) {} + + /** + * Returns the number of entries (files) in the Phar archive + * @link http://www.php.net/manual/en/phar.count.php + * @return int The number of files contained within this phar, or 0 (the number zero) + * if none. + */ + public function count () {} + + /** + * Delete a file within a phar archive + * @link http://www.php.net/manual/en/phar.delete.php + * @param entry string

+ * Path within an archive to the file to delete. + *

+ * @return bool returns true on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function delete ($entry) {} + + /** + * Deletes the global metadata of the phar + * @link http://www.php.net/manual/en/phar.delmetadata.php + * @return bool returns true on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function delMetadata () {} + + /** + * Extract the contents of a phar archive to a directory + * @link http://www.php.net/manual/en/phar.extractto.php + * @param pathto string

+ * Path within an archive to the file to delete. + *

+ * @param files string|array[optional]

+ * The name of a file or directory to extract, or an array of files/directories to extract + *

+ * @param overwrite bool[optional]

+ * Set to true to enable overwriting existing files + *

+ * @return bool returns true on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function extractTo ($pathto, $files = null, $overwrite = null) {} + + public function getAlias () {} + + public function getPath () {} + + /** + * Returns phar archive meta-data + * @link http://www.php.net/manual/en/phar.getmetadata.php + * @return mixed any PHP variable that can be serialized and is stored as meta-data for the Phar archive, + * or &null; if no meta-data is stored. + */ + public function getMetadata () {} + + /** + * Return whether phar was modified + * @link http://www.php.net/manual/en/phar.getmodified.php + * @return bool true if the phar has been modified since opened, false if not. + */ + public function getModified () {} + + /** + * Return MD5/SHA1/SHA256/SHA512/OpenSSL signature of a Phar archive + * @link http://www.php.net/manual/en/phar.getsignature.php + * @return array Array with the opened archive's signature in hash key and MD5, + * SHA-1, + * SHA-256, SHA-512, or OpenSSL + * in hash_type. This signature is a hash calculated on the + * entire phar's contents, and may be used to verify the integrity of the archive. + * A valid signature is absolutely required of all executable phar archives if the + * phar.require_hash INI variable + * is set to true. + */ + public function getSignature () {} + + /** + * Return the PHP loader or bootstrap stub of a Phar archive + * @link http://www.php.net/manual/en/phar.getstub.php + * @return string a string containing the contents of the bootstrap loader (stub) of + * the current Phar archive. + */ + public function getStub () {} + + /** + * Return version info of Phar archive + * @link http://www.php.net/manual/en/phar.getversion.php + * @return string The opened archive's API version. This is not to be confused with + * the API version that the loaded phar extension will use to create + * new phars. Each Phar archive has the API version hard-coded into + * its manifest. See Phar file format + * documentation for more information. + */ + public function getVersion () {} + + /** + * Returns whether phar has global meta-data + * @link http://www.php.net/manual/en/phar.hasmetadata.php + * @return bool true if meta-data has been set, and false if not. + */ + public function hasMetadata () {} + + /** + * Used to determine whether Phar write operations are being buffered, or are flushing directly to disk + * @link http://www.php.net/manual/en/phar.isbuffering.php + * @return bool true if the write operations are being buffer, false otherwise. + */ + public function isBuffering () {} + + /** + * Returns Phar::GZ or PHAR::BZ2 if the entire phar archive is compressed (.tar.gz/tar.bz and so on) + * @link http://www.php.net/manual/en/phar.iscompressed.php + * @return mixed Phar::GZ, Phar::BZ2 or false + */ + public function isCompressed () {} + + /** + * Returns true if the phar archive is based on the tar/phar/zip file format depending on the parameter + * @link http://www.php.net/manual/en/phar.isfileformat.php + * @param format int

+ * Either Phar::PHAR, Phar::TAR, or + * Phar::ZIP to test for the format of the archive. + *

+ * @return bool true if the phar archive matches the file format requested by the parameter + */ + public function isFileFormat ($format) {} + + /** + * Returns true if the phar archive can be modified + * @link http://www.php.net/manual/en/phar.iswritable.php + * @return bool true if the phar archive can be modified + */ + public function isWritable () {} + + /** + * determines whether a file exists in the phar + * @link http://www.php.net/manual/en/phar.offsetexists.php + * @param offset string

+ * The filename (relative path) to look for in a Phar. + *

+ * @return bool true if the file exists within the phar, or false if not. + */ + public function offsetExists ($offset) {} + + /** + * Gets a PharFileInfo object for a specific file + * @link http://www.php.net/manual/en/phar.offsetget.php + * @param offset string

+ * The filename (relative path) to look for in a Phar. + *

+ * @return int A PharFileInfo object is returned that can be used to + * iterate over a file's contents or to retrieve information about the current file. + */ + public function offsetGet ($offset) {} + + /** + * set the contents of an internal file to those of an external file + * @link http://www.php.net/manual/en/phar.offsetset.php + * @param offset string

+ * The filename (relative path) to modify in a Phar. + *

+ * @param value string

+ * Content of the file. + *

+ * @return void No return values. + */ + public function offsetSet ($offset, $value) {} + + /** + * remove a file from a phar + * @link http://www.php.net/manual/en/phar.offsetunset.php + * @param offset string

+ * The filename (relative path) to modify in a Phar. + *

+ * @return bool Returns true on success or false on failure. + */ + public function offsetUnset ($offset) {} + + /** + * Set the alias for the Phar archive + * @link http://www.php.net/manual/en/phar.setalias.php + * @param alias string

+ * A shorthand string that this archive can be referred to in phar + * stream wrapper access. + *

+ * @return bool + */ + public function setAlias ($alias) {} + + /** + * Used to set the PHP loader or bootstrap stub of a Phar archive to the default loader + * @link http://www.php.net/manual/en/phar.setdefaultstub.php + * @param index string[optional]

+ * Relative path within the phar archive to run if accessed on the command-line + *

+ * @param webindex string[optional]

+ * Relative path within the phar archive to run if accessed through a web browser + *

+ * @return bool Returns true on success or false on failure. + */ + public function setDefaultStub ($index = null, $webindex = null) {} + + /** + * Sets phar archive meta-data + * @link http://www.php.net/manual/en/phardata.setmetadata.php + * @param metadata mixed

+ * Any PHP variable containing information to store that describes the phar archive + *

+ * @return void + */ + public function setMetadata ($metadata) {} + + /** + * set the signature algorithm for a phar and apply it. The + * @link http://www.php.net/manual/en/phardata.setsignaturealgorithm.php + * @param sigtype int

+ * One of Phar::MD5, + * Phar::SHA1, Phar::SHA256, + * Phar::SHA512, or Phar::PGP + *

+ * @param privatekey string[optional]

+ * The contents of an OpenSSL private key, as extracted from a certificate or + * OpenSSL key file: + * setSignatureAlgorithm(Phar::OPENSSL, $pkey); + * ?> + * ]]> + * See phar introduction for instructions on + * naming and placement of the public key file. + *

+ * @return void + */ + public function setSignatureAlgorithm ($sigtype, $privatekey = null) {} + + /** + * Used to set the PHP loader or bootstrap stub of a Phar archive + * @link http://www.php.net/manual/en/phar.setstub.php + * @param stub string

+ * A string or an open stream handle to use as the executable stub for this + * phar archive. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setStub ($stub) {} + + /** + * Start buffering Phar write operations, do not modify the Phar object on disk + * @link http://www.php.net/manual/en/phar.startbuffering.php + * @return void + */ + public function startBuffering () {} + + /** + * Stop buffering write requests to the Phar archive, and save changes to disk + * @link http://www.php.net/manual/en/phar.stopbuffering.php + * @return void + */ + public function stopBuffering () {} + + /** + * Returns the api version + * @link http://www.php.net/manual/en/phar.apiversion.php + * @return string The API version string as in "1.0.0". + */ + final public static function apiVersion () {} + + /** + * Returns whether phar extension supports compression using either zlib or bzip2 + * @link http://www.php.net/manual/en/phar.cancompress.php + * @param type int[optional]

+ * Either Phar::GZ or Phar::BZ2 can be + * used to test whether compression is possible with a specific compression + * algorithm (zlib or bzip2). + *

+ * @return bool true if compression/decompression is available, false if not. + */ + final public static function canCompress ($type = null) {} + + /** + * Returns whether phar extension supports writing and creating phars + * @link http://www.php.net/manual/en/phar.canwrite.php + * @return bool true if write access is enabled, false if it is disabled. + */ + final public static function canWrite () {} + + /** + * Create a phar-file format specific stub + * @link http://www.php.net/manual/en/phar.createdefaultstub.php + * @param indexfile string[optional] + * @param webindexfile string[optional] + * @return string a string containing the contents of a customized bootstrap loader (stub) + * that allows the created Phar archive to work with or without the Phar extension + * enabled. + */ + final public static function createDefaultStub ($indexfile = null, $webindexfile = null) {} + + /** + * Return array of supported compression algorithms + * @link http://www.php.net/manual/en/phar.getsupportedcompression.php + * @return array an array containing any of Phar::GZ or + * Phar::BZ2, depending on the availability of + * the zlib extension or the + * bz2 extension. + */ + final public static function getSupportedCompression () {} + + /** + * Return array of supported signature types + * @link http://www.php.net/manual/en/phar.getsupportedsignatures.php + * @return array an array containing any of MD5, SHA-1, + * SHA-256, SHA-512, or OpenSSL. + */ + final public static function getSupportedSignatures () {} + + /** + * instructs phar to intercept fopen, file_get_contents, opendir, and all of the stat-related functions + * @link http://www.php.net/manual/en/phar.interceptfilefuncs.php + * @return void + */ + final public static function interceptFileFuncs () {} + + /** + * Returns whether the given filename is a valid phar filename + * @link http://www.php.net/manual/en/phar.isvalidpharfilename.php + * @param filename string

+ * The name or full path to a phar archive not yet created + *

+ * @param executable bool[optional]

+ * This parameter determines whether the filename should be treated as + * a phar executable archive, or a data non-executable archive + *

+ * @return bool true if the filename is valid, false if not. + */ + final public static function isValidPharFilename ($filename, $executable = null) {} + + /** + * Loads any phar archive with an alias + * @link http://www.php.net/manual/en/phar.loadphar.php + * @param filename string

+ * the full or relative path to the phar archive to open + *

+ * @param alias string[optional]

+ * The alias that may be used to refer to the phar archive. Note + * that many phar archives specify an explicit alias inside the + * phar archive, and a PharException will be thrown if + * a new alias is specified in this case. + *

+ * @return bool Returns true on success or false on failure. + */ + final public static function loadPhar ($filename, $alias = null) {} + + /** + * Reads the currently executed file (a phar) and registers its manifest + * @link http://www.php.net/manual/en/phar.mapphar.php + * @param alias string[optional]

+ * The alias that can be used in phar:// URLs to + * refer to this archive, rather than its full path. + *

+ * @param dataoffset int[optional]

+ * Unused variable, here for compatibility with PEAR's PHP_Archive. + *

+ * @return bool Returns true on success or false on failure. + */ + final public static function mapPhar ($alias = null, $dataoffset = null) {} + + /** + * Returns the full path on disk or full phar URL to the currently executing Phar archive + * @link http://www.php.net/manual/en/phar.running.php + * @param retphar bool[optional]

+ * If false, the full path on disk to the phar + * archive is returned. If true, a full phar URL is returned. + *

+ * @return string the filename if valid, empty string otherwise. + */ + final public static function running ($retphar = null) {} + + /** + * Mount an external path or file to a virtual location within the phar archive + * @link http://www.php.net/manual/en/phar.mount.php + * @param pharpath string

+ * The internal path within the phar archive to use as the mounted path location. + * If executed within a phar archive, this may be a relative path, otherwise this must + * be a full phar URL. + *

+ * @param externalpath string

+ * A path or URL to an external file or directory to mount within the phar archive + *

+ * @return void No return. PharException is thrown on failure. + */ + final public static function mount ($pharpath, $externalpath) {} + + /** + * Defines a list of up to 4 $_SERVER variables that should be modified for execution + * @link http://www.php.net/manual/en/phar.mungserver.php + * @param munglist array

+ * an array containing as string indices any of + * REQUEST_URI, PHP_SELF, + * SCRIPT_NAME and SCRIPT_FILENAME. + * Other values trigger an exception, and Phar::mungServer + * is case-sensitive. + *

+ * @return void No return. + */ + final public static function mungServer (array $munglist) {} + + /** + * Completely remove a phar archive from disk and from memory + * @link http://www.php.net/manual/en/phar.unlinkarchive.php + * @param archive string

+ * The path on disk to the phar archive. + *

+ * @return bool Returns true on success or false on failure. + */ + final public static function unlinkArchive ($archive) {} + + /** + * mapPhar for web-based phars. front controller for web applications + * @link http://www.php.net/manual/en/phar.webphar.php + * @param alias string[optional]

+ * The alias that can be used in phar:// URLs to + * refer to this archive, rather than its full path. + *

+ * @param index string[optional]

+ * The location within the phar of the directory index. + *

+ * @param f404 string[optional]

+ * The location of the script to run when a file is not found. This + * script should output the proper HTTP 404 headers. + *

+ * @param mimetypes array[optional]

+ * An array mapping additional file extensions to MIME type. By default, + * these extensions are mapped to these mime types: + * 2, // pass to highlight_file() + * 'c' => 'text/plain', + * 'cc' => 'text/plain', + * 'cpp' => 'text/plain', + * 'c++' => 'text/plain', + * 'dtd' => 'text/plain', + * 'h' => 'text/plain', + * 'log' => 'text/plain', + * 'rng' => 'text/plain', + * 'txt' => 'text/plain', + * 'xsd' => 'text/plain', + * 'php' => 1, // parse as PHP + * 'inc' => 1, // parse as PHP + * 'avi' => 'video/avi', + * 'bmp' => 'image/bmp', + * 'css' => 'text/css', + * 'gif' => 'image/gif', + * 'htm' => 'text/html', + * 'html' => 'text/html', + * 'htmls' => 'text/html', + * 'ico' => 'image/x-ico', + * 'jpe' => 'image/jpeg', + * 'jpg' => 'image/jpeg', + * 'jpeg' => 'image/jpeg', + * 'js' => 'application/x-javascript', + * 'midi' => 'audio/midi', + * 'mid' => 'audio/midi', + * 'mod' => 'audio/mod', + * 'mov' => 'movie/quicktime', + * 'mp3' => 'audio/mp3', + * 'mpg' => 'video/mpeg', + * 'mpeg' => 'video/mpeg', + * 'pdf' => 'application/pdf', + * 'png' => 'image/png', + * 'swf' => 'application/shockwave-flash', + * 'tif' => 'image/tiff', + * 'tiff' => 'image/tiff', + * 'wav' => 'audio/wav', + * 'xbm' => 'image/xbm', + * 'xml' => 'text/xml', + * ); + * ?> + * ]]> + *

+ * @param rewrites array[optional]

+ * An array mapping URI to internal file, simulating mod_rewrite of apache. + * For example: + * 'myinfo.php' + * ); + * ?> + * ]]> + * would route calls to http://<host>/myphar.phar/myinfo + * to the file phar:///path/to/myphar.phar/myinfo.php, preserving + * GET/POST. This does not quite work like mod_rewrite in that it would not + * match http://<host>/myphar.phar/myinfo/another. + *

+ * @return void + */ + final public static function webPhar ($alias = null, $index = null, $f404 = null, array $mimetypes = null, array $rewrites = null) {} + + /** + * Returns whether current entry is a directory and not '.' or '..' + * @link http://www.php.net/manual/en/recursivedirectoryiterator.haschildren.php + * @param allow_links bool[optional]

+ *

+ * @return bool whether the current entry is a directory, but not '.' or '..' + */ + public function hasChildren ($allow_links = null) {} + + /** + * Returns an iterator for the current entry if it is a directory + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getchildren.php + * @return object An iterator for the current entry, if it is a directory. + */ + public function getChildren () {} + + /** + * Get sub path + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getsubpath.php + * @return string The sub path (sub directory). + */ + public function getSubPath () {} + + /** + * Get sub path and name + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getsubpathname.php + * @return string The sub path (sub directory) and filename. + */ + public function getSubPathname () {} + + /** + * Rewinds back to the beginning + * @link http://www.php.net/manual/en/filesystemiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Move to the next file + * @link http://www.php.net/manual/en/filesystemiterator.next.php + * @return void + */ + public function next () {} + + /** + * Retrieve the key for the current file + * @link http://www.php.net/manual/en/filesystemiterator.key.php + * @return string the pathname or filename depending on the set flags. + * See the FilesystemIterator constants. + */ + public function key () {} + + /** + * The current file + * @link http://www.php.net/manual/en/filesystemiterator.current.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator constants. + */ + public function current () {} + + /** + * Get the handling flags + * @link http://www.php.net/manual/en/filesystemiterator.getflags.php + * @return int The integer value of the set flags. + */ + public function getFlags () {} + + /** + * Sets handling flags + * @link http://www.php.net/manual/en/filesystemiterator.setflags.php + * @param flags int[optional]

+ * The handling flags to set. + * See the FilesystemIterator constants. + *

+ * @return void + */ + public function setFlags ($flags = null) {} + + /** + * Return file name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * Get base name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getbasename.php + * @param suffix string[optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * Determine if current DirectoryIterator item is '.' or '..' + * @link http://www.php.net/manual/en/directoryiterator.isdot.php + * @return bool true if the entry is . or .., + * otherwise false + */ + public function isDot () {} + + /** + * Check whether current DirectoryIterator position is a valid file + * @link http://www.php.net/manual/en/directoryiterator.valid.php + * @return bool true if the position is valid, otherwise false + */ + public function valid () {} + + /** + * Seek to a DirectoryIterator item + * @link http://www.php.net/manual/en/directoryiterator.seek.php + * @param position int

+ * The zero-based numeric position to seek to. + *

+ * @return void + */ + public function seek ($position) {} + + /** + * Get file name as a string + * @link http://www.php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class PharData extends RecursiveDirectoryIterator implements RecursiveIterator, SeekableIterator, Traversable, Iterator, Countable, ArrayAccess { + const CURRENT_MODE_MASK = 240; + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const KEY_MODE_MASK = 3840; + const KEY_AS_PATHNAME = 0; + const FOLLOW_SYMLINKS = 512; + const KEY_AS_FILENAME = 256; + const NEW_CURRENT_AND_KEY = 256; + const SKIP_DOTS = 4096; + const UNIX_PATHS = 8192; + + + /** + * Construct a non-executable tar or zip archive object + * @link http://www.php.net/manual/en/phardata.construct.php + * @param fname string

+ * Path to an existing tar/zip archive or to-be-created archive + *

+ * @param flags int[optional]

+ * Flags to pass to Phar parent class RecursiveDirectoryIterator. + *

+ * @return void + */ + public function __construct ($fname, $flags = null) {} + + public function __destruct () {} + + /** + * Add an empty directory to the tar/zip archive + * @link http://www.php.net/manual/en/phardata.addemptydir.php + * @param dirname string

+ * The name of the empty directory to create in the phar archive + *

+ * @return bool no return value, exception is thrown on failure. + */ + public function addEmptyDir ($dirname) {} + + /** + * Add a file from the filesystem to the tar/zip archive + * @link http://www.php.net/manual/en/phardata.addfile.php + * @param file string

+ * Full or relative path to a file on disk to be added + * to the phar archive. + *

+ * @param localname string[optional]

+ * Path that the file will be stored in the archive. + *

+ * @return void no return value, exception is thrown on failure. + */ + public function addFile ($file, $localname = null) {} + + /** + * Add a file from the filesystem to the tar/zip archive + * @link http://www.php.net/manual/en/phardata.addfromstring.php + * @param localname string

+ * Path that the file will be stored in the archive. + *

+ * @param contents string

+ * The file contents to store + *

+ * @return bool no return value, exception is thrown on failure. + */ + public function addFromString ($localname, $contents) {} + + /** + * Construct a tar/zip archive from the files within a directory. + * @link http://www.php.net/manual/en/phardata.buildfromdirectory.php + * @param base_dir string

+ * The full or relative path to the directory that contains all files + * to add to the archive. + *

+ * @param regex string[optional]

+ * An optional pcre regular expression that is used to filter the + * list of files. Only file paths matching the regular expression + * will be included in the archive. + *

+ * @return array Phar::buildFromDirectory returns an associative array + * mapping internal path of file to the full path of the file on the + * filesystem. + */ + public function buildFromDirectory ($base_dir, $regex = null) {} + + /** + * Construct a tar or zip archive from an iterator. + * @link http://www.php.net/manual/en/phardata.buildfromiterator.php + * @param iter Iterator

+ * Any iterator that either associatively maps tar/zip file to location or + * returns SplFileInfo objects + *

+ * @param base_directory string[optional]

+ * For iterators that return SplFileInfo objects, the portion of each + * file's full path to remove when adding to the tar/zip archive + *

+ * @return array PharData::buildFromIterator returns an associative array + * mapping internal path of file to the full path of the file on the + * filesystem. + */ + public function buildFromIterator ($iter, $base_directory = null) {} + + /** + * Compresses all files in the current tar/zip archive + * @link http://www.php.net/manual/en/phardata.compressfiles.php + * @param compression int

+ * Compression must be one of Phar::GZ, + * Phar::BZ2 to add compression, or Phar::NONE + * to remove compression. + *

+ * @return bool Returns true on success or false on failure. + */ + public function compressFiles ($compression) {} + + /** + * Decompresses all files in the current zip archive + * @link http://www.php.net/manual/en/phardata.decompressfiles.php + * @return bool Returns true on success or false on failure. + */ + public function decompressFiles () {} + + /** + * Compresses the entire tar/zip archive using Gzip or Bzip2 compression + * @link http://www.php.net/manual/en/phardata.compress.php + * @param compression int

+ * Compression must be one of Phar::GZ, + * Phar::BZ2 to add compression, or Phar::NONE + * to remove compression. + *

+ * @param extension string

+ * By default, the extension is .tar.gz or .tar.bz2 + * for compressing a tar, and .tar for decompressing. + *

+ * @return object A PharData object is returned. + */ + public function compress ($compression, $extension) {} + + /** + * Decompresses the entire Phar archive + * @link http://www.php.net/manual/en/phardata.decompress.php + * @param extension string[optional]

+ * For decompressing, the default file extension + * is .phar.tar. + * Use this parameter to specify another file extension. Be aware + * that no non-executable archives cannot contain .phar + * in their filename. + *

+ * @return object A PharData object is returned. + */ + public function decompress ($extension = null) {} + + /** + * Convert a non-executable tar/zip archive to an executable phar archive + * @link http://www.php.net/manual/en/phardata.converttoexecutable.php + * @param format int[optional]

+ * This should be one of Phar::PHAR, Phar::TAR, + * or Phar::ZIP. If set to &null;, the existing file format + * will be preserved. + *

+ * @param compression int[optional]

+ * This should be one of Phar::NONE for no whole-archive + * compression, Phar::GZ for zlib-based compression, and + * Phar::BZ2 for bzip-based compression. + *

+ * @param extension string[optional]

+ * This parameter is used to override the default file extension for a + * converted archive. Note that all zip- and tar-based phar archives must contain + * .phar in their file extension in order to be processed as a + * phar archive. + *

+ *

+ * If converting to a phar-based archive, the default extensions are + * .phar, .phar.gz, or .phar.bz2 + * depending on the specified compression. For tar-based phar archives, the + * default extensions are .phar.tar, .phar.tar.gz, + * and .phar.tar.bz2. For zip-based phar archives, the + * default extension is .phar.zip. + *

+ * @return Phar The method returns a Phar object on success and throws an + * exception on failure. + */ + public function convertToExecutable ($format = null, $compression = null, $extension = null) {} + + /** + * Convert a phar archive to a non-executable tar or zip file + * @link http://www.php.net/manual/en/phardata.converttodata.php + * @param format int[optional]

+ * This should be one of Phar::TAR + * or Phar::ZIP. If set to &null;, the existing file format + * will be preserved. + *

+ * @param compression int[optional]

+ * This should be one of Phar::NONE for no whole-archive + * compression, Phar::GZ for zlib-based compression, and + * Phar::BZ2 for bzip-based compression. + *

+ * @param extension string[optional]

+ * This parameter is used to override the default file extension for a + * converted archive. Note that .phar cannot be used + * anywhere in the filename for a non-executable tar or zip archive. + *

+ *

+ * If converting to a tar-based phar archive, the + * default extensions are .tar, .tar.gz, + * and .tar.bz2 depending on specified compression. + * For zip-based archives, the + * default extension is .zip. + *

+ * @return PharData The method returns a PharData object on success and throws an + * exception on failure. + */ + public function convertToData ($format = null, $compression = null, $extension = null) {} + + /** + * Copy a file internal to the phar archive to another new file within the phar + * @link http://www.php.net/manual/en/phardata.copy.php + * @param oldfile string

+ *

+ * @param newfile string

+ *

+ * @return bool returns true on success, but it is safer to encase method call in a + * try/catch block and assume success if no exception is thrown. + */ + public function copy ($oldfile, $newfile) {} + + public function count () {} + + /** + * Delete a file within a tar/zip archive + * @link http://www.php.net/manual/en/phardata.delete.php + * @param entry string

+ * Path within an archive to the file to delete. + *

+ * @return int returns true on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function delete ($entry) {} + + /** + * Deletes the global metadata of a zip archive + * @link http://www.php.net/manual/en/phardata.delmetadata.php + * @return int returns true on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function delMetadata () {} + + /** + * Extract the contents of a tar/zip archive to a directory + * @link http://www.php.net/manual/en/phardata.extractto.php + * @param pathto string

+ * Path within an archive to the file to delete. + *

+ * @param files string|array[optional]

+ * The name of a file or directory to extract, or an array of files/directories to extract + *

+ * @param overwrite bool[optional]

+ * Set to true to enable overwriting existing files + *

+ * @return int returns true on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function extractTo ($pathto, $files = null, $overwrite = null) {} + + public function getAlias () {} + + public function getPath () {} + + public function getMetadata () {} + + public function getModified () {} + + public function getSignature () {} + + public function getStub () {} + + public function getVersion () {} + + public function hasMetadata () {} + + public function isBuffering () {} + + public function isCompressed () {} + + /** + * @param fileformat + */ + public function isFileFormat ($fileformat) {} + + /** + * Returns true if the tar/zip archive can be modified + * @link http://www.php.net/manual/en/phardata.iswritable.php + * @return bool true if the tar/zip archive can be modified + */ + public function isWritable () {} + + /** + * @param entry + */ + public function offsetExists ($entry) {} + + /** + * @param entry + */ + public function offsetGet ($entry) {} + + /** + * set the contents of a file within the tar/zip to those of an external file or string + * @link http://www.php.net/manual/en/phardata.offsetset.php + * @param offset string

+ * The filename (relative path) to modify in a tar or zip archive. + *

+ * @param value string

+ * Content of the file. + *

+ * @return void No return values. + */ + public function offsetSet ($offset, $value) {} + + /** + * remove a file from a tar/zip archive + * @link http://www.php.net/manual/en/phardata.offsetunset.php + * @param offset string

+ * The filename (relative path) to modify in the tar/zip archive. + *

+ * @return bool Returns true on success or false on failure. + */ + public function offsetUnset ($offset) {} + + /** + * dummy function (Phar::setAlias is not valid for PharData) + * @link http://www.php.net/manual/en/phardata.setalias.php + * @param alias string

+ * A shorthand string that this archive can be referred to in phar + * stream wrapper access. This parameter is ignored. + *

+ * @return bool + */ + public function setAlias ($alias) {} + + /** + * dummy function (Phar::setDefaultStub is not valid for PharData) + * @link http://www.php.net/manual/en/phardata.setdefaultstub.php + * @param index string[optional]

+ * Relative path within the phar archive to run if accessed on the command-line + *

+ * @param webindex string[optional]

+ * Relative path within the phar archive to run if accessed through a web browser + *

+ * @return void + */ + public function setDefaultStub ($index = null, $webindex = null) {} + + /** + * @param metadata + */ + public function setMetadata ($metadata) {} + + /** + * @param algorithm + * @param privatekey[optional] + */ + public function setSignatureAlgorithm ($algorithm, $privatekey) {} + + /** + * dummy function (Phar::setStub is not valid for PharData) + * @link http://www.php.net/manual/en/phardata.setstub.php + * @param stub string

+ * A string or an open stream handle to use as the executable stub for this + * phar archive. This parameter is ignored. + *

+ * @return void + */ + public function setStub ($stub) {} + + public function startBuffering () {} + + public function stopBuffering () {} + + final public static function apiVersion () {} + + final public static function canCompress () {} + + final public static function canWrite () {} + + /** + * @param index[optional] + * @param webindex[optional] + */ + final public static function createDefaultStub ($index, $webindex) {} + + final public static function getSupportedCompression () {} + + final public static function getSupportedSignatures () {} + + final public static function interceptFileFuncs () {} + + final public static function isValidPharFilename () {} + + /** + * @param filename + * @param alias[optional] + */ + final public static function loadPhar ($filename, $alias) {} + + /** + * @param alias[optional] + * @param offset[optional] + */ + final public static function mapPhar ($alias, $offset) {} + + /** + * @param retphar + */ + final public static function running ($retphar) {} + + /** + * @param inphar + * @param externalfile + */ + final public static function mount ($inphar, $externalfile) {} + + /** + * @param munglist + */ + final public static function mungServer ($munglist) {} + + /** + * @param archive + */ + final public static function unlinkArchive ($archive) {} + + /** + * @param alias[optional] + * @param index[optional] + * @param f404[optional] + * @param mimetypes[optional] + * @param rewrites[optional] + */ + final public static function webPhar ($alias, $index, $f404, $mimetypes, $rewrites) {} + + /** + * Returns whether current entry is a directory and not '.' or '..' + * @link http://www.php.net/manual/en/recursivedirectoryiterator.haschildren.php + * @param allow_links bool[optional]

+ *

+ * @return bool whether the current entry is a directory, but not '.' or '..' + */ + public function hasChildren ($allow_links = null) {} + + /** + * Returns an iterator for the current entry if it is a directory + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getchildren.php + * @return object An iterator for the current entry, if it is a directory. + */ + public function getChildren () {} + + /** + * Get sub path + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getsubpath.php + * @return string The sub path (sub directory). + */ + public function getSubPath () {} + + /** + * Get sub path and name + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getsubpathname.php + * @return string The sub path (sub directory) and filename. + */ + public function getSubPathname () {} + + /** + * Rewinds back to the beginning + * @link http://www.php.net/manual/en/filesystemiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Move to the next file + * @link http://www.php.net/manual/en/filesystemiterator.next.php + * @return void + */ + public function next () {} + + /** + * Retrieve the key for the current file + * @link http://www.php.net/manual/en/filesystemiterator.key.php + * @return string the pathname or filename depending on the set flags. + * See the FilesystemIterator constants. + */ + public function key () {} + + /** + * The current file + * @link http://www.php.net/manual/en/filesystemiterator.current.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator constants. + */ + public function current () {} + + /** + * Get the handling flags + * @link http://www.php.net/manual/en/filesystemiterator.getflags.php + * @return int The integer value of the set flags. + */ + public function getFlags () {} + + /** + * Sets handling flags + * @link http://www.php.net/manual/en/filesystemiterator.setflags.php + * @param flags int[optional]

+ * The handling flags to set. + * See the FilesystemIterator constants. + *

+ * @return void + */ + public function setFlags ($flags = null) {} + + /** + * Return file name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * Get base name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getbasename.php + * @param suffix string[optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * Determine if current DirectoryIterator item is '.' or '..' + * @link http://www.php.net/manual/en/directoryiterator.isdot.php + * @return bool true if the entry is . or .., + * otherwise false + */ + public function isDot () {} + + /** + * Check whether current DirectoryIterator position is a valid file + * @link http://www.php.net/manual/en/directoryiterator.valid.php + * @return bool true if the position is valid, otherwise false + */ + public function valid () {} + + /** + * Seek to a DirectoryIterator item + * @link http://www.php.net/manual/en/directoryiterator.seek.php + * @param position int

+ * The zero-based numeric position to seek to. + *

+ * @return void + */ + public function seek ($position) {} + + /** + * Get file name as a string + * @link http://www.php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class PharFileInfo extends SplFileInfo { + + /** + * Construct a Phar entry object + * @link http://www.php.net/manual/en/pharfileinfo.construct.php + * @param entry string

+ * The full url to retrieve a file. If you wish to retrieve the information + * for the file my/file.php from the phar boo.phar, + * the entry should be phar://boo.phar/my/file.php. + *

+ * @return void + */ + public function __construct ($entry) {} + + public function __destruct () {} + + /** + * Sets file-specific permission bits + * @link http://www.php.net/manual/en/pharfileinfo.chmod.php + * @param permissions int

+ * permissions (see chmod) + *

+ * @return void + */ + public function chmod ($permissions) {} + + /** + * Compresses the current Phar entry with either zlib or bzip2 compression + * @link http://www.php.net/manual/en/pharfileinfo.compress.php + * @param compression int + * @return bool Returns true on success or false on failure. + */ + public function compress ($compression) {} + + /** + * Decompresses the current Phar entry within the phar + * @link http://www.php.net/manual/en/pharfileinfo.decompress.php + * @return bool Returns true on success or false on failure. + */ + public function decompress () {} + + /** + * Deletes the metadata of the entry + * @link http://www.php.net/manual/en/pharfileinfo.delmetadata.php + * @return bool true if successful, false if the entry had no metadata. + * As with all functionality that modifies the contents of + * a phar, the phar.readonly INI variable + * must be off in order to succeed if the file is within a Phar + * archive. Files within PharData archives do not have + * this restriction. + */ + public function delMetadata () {} + + /** + * Returns the actual size of the file (with compression) inside the Phar archive + * @link http://www.php.net/manual/en/pharfileinfo.getcompressedsize.php + * @return int The size in bytes of the file within the Phar archive on disk. + */ + public function getCompressedSize () {} + + /** + * Returns CRC32 code or throws an exception if CRC has not been verified + * @link http://www.php.net/manual/en/pharfileinfo.getcrc32.php + * @return int The crc32 checksum of the file within the Phar archive. + */ + public function getCRC32 () {} + + public function getContent () {} + + /** + * Returns file-specific meta-data saved with a file + * @link http://www.php.net/manual/en/pharfileinfo.getmetadata.php + * @return mixed any PHP variable that can be serialized and is stored as meta-data for the file, + * or &null; if no meta-data is stored. + */ + public function getMetadata () {} + + /** + * Returns the Phar file entry flags + * @link http://www.php.net/manual/en/pharfileinfo.getpharflags.php + * @return int The Phar flags (always 0 in the current implementation) + */ + public function getPharFlags () {} + + /** + * Returns the metadata of the entry + * @link http://www.php.net/manual/en/pharfileinfo.hasmetadata.php + * @return bool false if no metadata is set or is &null;, true if metadata is not &null; + */ + public function hasMetadata () {} + + /** + * Returns whether the entry is compressed + * @link http://www.php.net/manual/en/pharfileinfo.iscompressed.php + * @param compression_type int[optional]

+ * One of Phar::GZ or Phar::BZ2, + * defaults to any compression. + *

+ * @return bool true if the file is compressed within the Phar archive, false if not. + */ + public function isCompressed ($compression_type = null) {} + + /** + * Returns whether file entry has had its CRC verified + * @link http://www.php.net/manual/en/pharfileinfo.iscrcchecked.php + * @return bool true if the file has had its CRC verified, false if not. + */ + public function isCRCChecked () {} + + /** + * Sets file-specific meta-data saved with a file + * @link http://www.php.net/manual/en/pharfileinfo.setmetadata.php + * @param metadata mixed

+ * Any PHP variable containing information to store alongside a file + *

+ * @return void + */ + public function setMetadata ($metadata) {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the filename + * @link http://www.php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * Gets the base name of the file + * @link http://www.php.net/manual/en/splfileinfo.getbasename.php + * @param suffix string[optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + + /** + * Returns the path to the file as a string + * @link http://www.php.net/manual/en/splfileinfo.tostring.php + * @return void the path to the file. + */ + public function __toString () {} + +} +// End of Phar v.2.0.1 +?> diff --git a/res/php-5.3-core-api/Reflection.php b/res/php-5.3-core-api/Reflection.php new file mode 100644 index 0000000..52db683 --- /dev/null +++ b/res/php-5.3-core-api/Reflection.php @@ -0,0 +1,1891 @@ + + * The modifiers to get, which is from a numeric value. + *

+ * @return array An array of modifier names. + */ + public static function getModifierNames ($modifiers) {} + + /** + * Exports + * @link http://www.php.net/manual/en/reflection.export.php + * @param reflector Reflector

+ * &reflection.export.param.name; + *

+ * @param return string[optional]

+ * &reflection.export.param.return; + *

+ * @return void &reflection.export.return; + */ + public static function export ($reflector, $return = null) {} + +} + +interface Reflector { + + /** + * Exports + * @link http://www.php.net/manual/en/reflector.export.php + * @return string + */ + abstract public static function export () {} + + /** + * To string + * @link http://www.php.net/manual/en/reflector.tostring.php + * @return string + */ + abstract public function __toString () {} + +} + +abstract class ReflectionFunctionAbstract implements Reflector { + + public $name; + + /** + * Clones function + * @link http://www.php.net/manual/en/reflectionfunctionabstract.clone.php + * @return void + */ + final private function __clone () {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionfunctionabstract.tostring.php + * @return void The string. + */ + abstract public function __toString () {} + + /** + * Checks if function in namespace + * @link http://www.php.net/manual/en/reflectionfunctionabstract.innamespace.php + * @return bool true if it's in a namespace, otherwise false + */ + public function inNamespace () {} + + /** + * Checks if closure + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isclosure.php + * @return bool true if it's a closure, otherwise false + */ + public function isClosure () {} + + /** + * Checks if deprecated + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isdeprecated.php + * @return bool true if it's deprecated, otherwise false + */ + public function isDeprecated () {} + + /** + * Checks if is internal + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isinternal.php + * @return bool true if it's internal, otherwise false + */ + public function isInternal () {} + + /** + * Checks if user defined + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isuserdefined.php + * @return bool true if it's user-defined, otherwise false; + */ + public function isUserDefined () {} + + /** + * Gets doc comment + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getdoccomment.php + * @return string The doc comment if it exists, otherwise false + */ + public function getDocComment () {} + + /** + * Gets end line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getendline.php + * @return int The ending line number of the user defined class, or false if unknown. + */ + public function getEndLine () {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextension.php + * @return ReflectionExtension The extension information, as a ReflectionExtension object. + */ + public function getExtension () {} + + /** + * Gets extension name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * Gets file name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getfilename.php + * @return string The file name. + */ + public function getFileName () {} + + /** + * Gets function name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getname.php + * @return string The name of the function. + */ + public function getName () {} + + /** + * Gets namespace name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnamespacename.php + * @return string The namespace name. + */ + public function getNamespaceName () {} + + /** + * Gets number of parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofparameters.php + * @return int The number of parameters. + */ + public function getNumberOfParameters () {} + + /** + * Gets number of required parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofrequiredparameters.php + * @return int The number of required parameters. + */ + public function getNumberOfRequiredParameters () {} + + /** + * Gets parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getparameters.php + * @return array The parameters, as a ReflectionParameter object. + */ + public function getParameters () {} + + /** + * Gets function short name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getshortname.php + * @return string The short name of the function. + */ + public function getShortName () {} + + /** + * Gets starting line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstartline.php + * @return int The starting line number. + */ + public function getStartLine () {} + + /** + * Gets static variables + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php + * @return array An array of static variables. + */ + public function getStaticVariables () {} + + /** + * Checks if returns reference + * @link http://www.php.net/manual/en/reflectionfunctionabstract.returnsreference.php + * @return bool true if it returns a reference, otherwise false + */ + public function returnsReference () {} + +} + +/** @jms-builtin */ +class ReflectionFunction extends ReflectionFunctionAbstract implements Reflector { + const IS_DEPRECATED = 262144; + + public $name; + + + /** + * Constructs a ReflectionFunction object + * @link http://www.php.net/manual/en/reflectionfunction.construct.php + * @param name + */ + public function __construct ($name) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionfunction.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Exports function + * @link http://www.php.net/manual/en/reflectionfunction.export.php + * @param name string

+ * &reflection.export.param.name; + *

+ * @param return string[optional]

+ * &reflection.export.param.return; + *

+ * @return string &reflection.export.return; + */ + public static function export ($name, $return = null) {} + + /** + * Checks if function is disabled + * @link http://www.php.net/manual/en/reflectionfunction.isdisabled.php + * @return bool true if it's disable, otherwise false + */ + public function isDisabled () {} + + /** + * Invokes function + * @link http://www.php.net/manual/en/reflectionfunction.invoke.php + * @param mixed $args

+ * The passed in argument list. It accepts a variable number of + * arguments which are passed to the function much like + * call_user_func is. + *

+ * @return mixed + * + * @jms-variable-parameters + */ + public function invoke ($args = null) {} + + /** + * Invokes function args + * @link http://www.php.net/manual/en/reflectionfunction.invokeargs.php + * @param args array

+ * The args to invoke. + *

+ * @return mixed + */ + public function invokeArgs (array $args) {} + + /** + * Clones function + * @link http://www.php.net/manual/en/reflectionfunctionabstract.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Checks if function in namespace + * @link http://www.php.net/manual/en/reflectionfunctionabstract.innamespace.php + * @return bool true if it's in a namespace, otherwise false + */ + public function inNamespace () {} + + /** + * Checks if closure + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isclosure.php + * @return bool true if it's a closure, otherwise false + */ + public function isClosure () {} + + /** + * Checks if deprecated + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isdeprecated.php + * @return bool true if it's deprecated, otherwise false + */ + public function isDeprecated () {} + + /** + * Checks if is internal + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isinternal.php + * @return bool true if it's internal, otherwise false + */ + public function isInternal () {} + + /** + * Checks if user defined + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isuserdefined.php + * @return bool true if it's user-defined, otherwise false; + */ + public function isUserDefined () {} + + /** + * Gets doc comment + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getdoccomment.php + * @return string The doc comment if it exists, otherwise false + */ + public function getDocComment () {} + + /** + * Gets end line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getendline.php + * @return int The ending line number of the user defined class, or false if unknown. + */ + public function getEndLine () {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextension.php + * @return ReflectionExtension The extension information, as a ReflectionExtension object. + */ + public function getExtension () {} + + /** + * Gets extension name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * Gets file name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getfilename.php + * @return string The file name. + */ + public function getFileName () {} + + /** + * Gets function name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getname.php + * @return string The name of the function. + */ + public function getName () {} + + /** + * Gets namespace name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnamespacename.php + * @return string The namespace name. + */ + public function getNamespaceName () {} + + /** + * Gets number of parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofparameters.php + * @return int The number of parameters. + */ + public function getNumberOfParameters () {} + + /** + * Gets number of required parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofrequiredparameters.php + * @return int The number of required parameters. + */ + public function getNumberOfRequiredParameters () {} + + /** + * Gets parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getparameters.php + * @return array The parameters, as a ReflectionParameter object. + */ + public function getParameters () {} + + /** + * Gets function short name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getshortname.php + * @return string The short name of the function. + */ + public function getShortName () {} + + /** + * Gets starting line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstartline.php + * @return int The starting line number. + */ + public function getStartLine () {} + + /** + * Gets static variables + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php + * @return array An array of static variables. + */ + public function getStaticVariables () {} + + /** + * Checks if returns reference + * @link http://www.php.net/manual/en/reflectionfunctionabstract.returnsreference.php + * @return bool true if it returns a reference, otherwise false + */ + public function returnsReference () {} + +} + +/** @jms-builtin */ +class ReflectionParameter implements Reflector { + public $name; + + + /** + * Clone + * @link http://www.php.net/manual/en/reflectionparameter.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Exports + * @link http://www.php.net/manual/en/reflectionparameter.export.php + * @param function string

+ * The function name. + *

+ * @param parameter string

+ * The parameter name. + *

+ * @param return bool[optional]

+ * &reflection.export.param.return; + *

+ * @return string The exported reflection. + */ + public static function export ($function, $parameter, $return = null) {} + + /** + * Construct + * @link http://www.php.net/manual/en/reflectionparameter.construct.php + * @param function + * @param parameter + */ + public function __construct ($function, $parameter) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionparameter.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Gets parameter name + * @link http://www.php.net/manual/en/reflectionparameter.getname.php + * @return string The name of the reflected parameter. + */ + public function getName () {} + + /** + * Checks if passed by reference + * @link http://www.php.net/manual/en/reflectionparameter.ispassedbyreference.php + * @return bool true if the parameter is passed in by reference, otherwise false + */ + public function isPassedByReference () {} + + /** + * Gets declaring function + * @link http://www.php.net/manual/en/reflectionparameter.getdeclaringfunction.php + * @return ReflectionFunction A ReflectionFunction object. + */ + public function getDeclaringFunction () {} + + /** + * Gets declaring class + * @link http://www.php.net/manual/en/reflectionparameter.getdeclaringclass.php + * @return ReflectionClass A ReflectionClass object. + */ + public function getDeclaringClass () {} + + /** + * Get class + * @link http://www.php.net/manual/en/reflectionparameter.getclass.php + * @return ReflectionClass A ReflectionClass object. + */ + public function getClass () {} + + /** + * Checks if parameter expects an array + * @link http://www.php.net/manual/en/reflectionparameter.isarray.php + * @return bool true if an array is expected, false otherwise. + */ + public function isArray () {} + + /** + * Checks if null is allowed + * @link http://www.php.net/manual/en/reflectionparameter.allowsnull.php + * @return bool true if &null; is allowed, otherwise false + */ + public function allowsNull () {} + + /** + * Gets parameter position + * @link http://www.php.net/manual/en/reflectionparameter.getposition.php + * @return int The position of the parameter, left to right, starting at position #0. + */ + public function getPosition () {} + + /** + * Checks if optional + * @link http://www.php.net/manual/en/reflectionparameter.isoptional.php + * @return bool true if the parameter is optional, otherwise false + */ + public function isOptional () {} + + /** + * Checks if a default value is available + * @link http://www.php.net/manual/en/reflectionparameter.isdefaultvalueavailable.php + * @return bool true if a default value is available, otherwise false + */ + public function isDefaultValueAvailable () {} + + /** + * Gets default parameter value + * @link http://www.php.net/manual/en/reflectionparameter.getdefaultvalue.php + * @return mixed The parameters default value. + */ + public function getDefaultValue () {} + +} + +/** @jms-builtin */ +class ReflectionMethod extends ReflectionFunctionAbstract implements Reflector { + const IS_STATIC = 1; + const IS_PUBLIC = 256; + const IS_PROTECTED = 512; + const IS_PRIVATE = 1024; + const IS_ABSTRACT = 2; + const IS_FINAL = 4; + + public $name; + public $class; + + + /** + * Export + * @link http://www.php.net/manual/en/reflectionmethod.export.php + * @param class string

+ * The class name. + *

+ * @param name string

+ * The name of the method. + *

+ * @param return bool[optional]

+ * &reflection.export.param.return; + *

+ * @return string &reflection.export.return; + */ + public static function export ($class, $name, $return = null) {} + + /** + * Constructs a ReflectionMethod + * @link http://www.php.net/manual/en/reflectionmethod.construct.php + * @param class_or_method + * @param name[optional] + */ + public function __construct ($class_or_method, $name) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionmethod.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Checks if method is public + * @link http://www.php.net/manual/en/reflectionmethod.ispublic.php + * @return bool true if the method is public, otherwise false + */ + public function isPublic () {} + + /** + * Checks if method is private + * @link http://www.php.net/manual/en/reflectionmethod.isprivate.php + * @return bool true if the method is private, otherwise false + */ + public function isPrivate () {} + + /** + * Checks if method is protected + * @link http://www.php.net/manual/en/reflectionmethod.isprotected.php + * @return bool true if the method is protected, otherwise false + */ + public function isProtected () {} + + /** + * Checks if method is abstract + * @link http://www.php.net/manual/en/reflectionmethod.isabstract.php + * @return bool true if the method is abstract, otherwise false + */ + public function isAbstract () {} + + /** + * Checks if method is final + * @link http://www.php.net/manual/en/reflectionmethod.isfinal.php + * @return bool true if the method is final, otherwise false + */ + public function isFinal () {} + + /** + * Checks if method is static + * @link http://www.php.net/manual/en/reflectionmethod.isstatic.php + * @return bool true if the method is static, otherwise false + */ + public function isStatic () {} + + /** + * Checks if method is a constructor + * @link http://www.php.net/manual/en/reflectionmethod.isconstructor.php + * @return bool true if the method is a constructor, otherwise false + */ + public function isConstructor () {} + + /** + * Checks if method is a destructor + * @link http://www.php.net/manual/en/reflectionmethod.isdestructor.php + * @return bool true if the method is a destructor, otherwise false; + */ + public function isDestructor () {} + + /** + * Gets modifiers + * @link http://www.php.net/manual/en/reflectionmethod.getmodifiers.php + * @return int A numeric representation of the modifiers. + */ + public function getModifiers () {} + + /** + * Invoke + * @link http://www.php.net/manual/en/reflectionmethod.invoke.php + * @param object $object

+ * The object to invoke. + *

+ * @param mixed $args

+ * The passed in argument list. It accepts a variable number of + * arguments which are passed to the function much like + * call_user_func is. + *

+ * @return mixed + * + * @jms-variable-parameters + */ + public function invoke ($object, $args = null) {} + + /** + * Invoke args + * @link http://www.php.net/manual/en/reflectionmethod.invokeargs.php + * @param object $object

+ *

+ * @param array $args

+ *

+ * @return mixed + */ + public function invokeArgs ($object, array $args) {} + + /** + * Gets declaring class + * @link http://www.php.net/manual/en/reflectionmethod.getdeclaringclass.php + * @return ReflectionClass A ReflectionClass. + */ + public function getDeclaringClass () {} + + /** + * Gets prototype + * @link http://www.php.net/manual/en/reflectionmethod.getprototype.php + * @return void The prototype. + */ + public function getPrototype () {} + + /** + * Set method accessibility + * @link http://www.php.net/manual/en/reflectionmethod.setaccessible.php + * @param accessible bool

+ * true to allow accessibility, or false. + *

+ * @return void + */ + public function setAccessible ($accessible) {} + + /** + * Clones function + * @link http://www.php.net/manual/en/reflectionfunctionabstract.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Checks if function in namespace + * @link http://www.php.net/manual/en/reflectionfunctionabstract.innamespace.php + * @return bool true if it's in a namespace, otherwise false + */ + public function inNamespace () {} + + /** + * Checks if closure + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isclosure.php + * @return bool true if it's a closure, otherwise false + */ + public function isClosure () {} + + /** + * Checks if deprecated + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isdeprecated.php + * @return bool true if it's deprecated, otherwise false + */ + public function isDeprecated () {} + + /** + * Checks if is internal + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isinternal.php + * @return bool true if it's internal, otherwise false + */ + public function isInternal () {} + + /** + * Checks if user defined + * @link http://www.php.net/manual/en/reflectionfunctionabstract.isuserdefined.php + * @return bool true if it's user-defined, otherwise false; + */ + public function isUserDefined () {} + + /** + * Gets doc comment + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getdoccomment.php + * @return string The doc comment if it exists, otherwise false + */ + public function getDocComment () {} + + /** + * Gets end line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getendline.php + * @return int The ending line number of the user defined class, or false if unknown. + */ + public function getEndLine () {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextension.php + * @return ReflectionExtension The extension information, as a ReflectionExtension object. + */ + public function getExtension () {} + + /** + * Gets extension name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * Gets file name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getfilename.php + * @return string The file name. + */ + public function getFileName () {} + + /** + * Gets function name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getname.php + * @return string The name of the function. + */ + public function getName () {} + + /** + * Gets namespace name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnamespacename.php + * @return string The namespace name. + */ + public function getNamespaceName () {} + + /** + * Gets number of parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofparameters.php + * @return int The number of parameters. + */ + public function getNumberOfParameters () {} + + /** + * Gets number of required parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getnumberofrequiredparameters.php + * @return int The number of required parameters. + */ + public function getNumberOfRequiredParameters () {} + + /** + * Gets parameters + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getparameters.php + * @return array The parameters, as a ReflectionParameter object. + */ + public function getParameters () {} + + /** + * Gets function short name + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getshortname.php + * @return string The short name of the function. + */ + public function getShortName () {} + + /** + * Gets starting line number + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstartline.php + * @return int The starting line number. + */ + public function getStartLine () {} + + /** + * Gets static variables + * @link http://www.php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php + * @return array An array of static variables. + */ + public function getStaticVariables () {} + + /** + * Checks if returns reference + * @link http://www.php.net/manual/en/reflectionfunctionabstract.returnsreference.php + * @return bool true if it returns a reference, otherwise false + */ + public function returnsReference () {} + +} + +/** @jms-builtin */ +class ReflectionClass implements Reflector { + const IS_IMPLICIT_ABSTRACT = 16; + const IS_EXPLICIT_ABSTRACT = 32; + const IS_FINAL = 64; + + public $name; + + + /** + * Clones object + * @link http://www.php.net/manual/en/reflectionclass.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Exports a class + * @link http://www.php.net/manual/en/reflectionclass.export.php + * @param argument mixed

+ * &reflection.export.param.name; + *

+ * @param return bool[optional]

+ * &reflection.export.param.return; + *

+ * @return string &reflection.export.return; + */ + public static function export ($argument, $return = null) {} + + /** + * Constructs a ReflectionClass + * @link http://www.php.net/manual/en/reflectionclass.construct.php + * @param argument + */ + public function __construct ($argument) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionclass.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Gets class name + * @link http://www.php.net/manual/en/reflectionclass.getname.php + * @return string The class name. + */ + public function getName () {} + + /** + * Checks if internal + * @link http://www.php.net/manual/en/reflectionclass.isinternal.php + * @return bool Returns true on success or false on failure. + */ + public function isInternal () {} + + /** + * Checks if user defined + * @link http://www.php.net/manual/en/reflectionclass.isuserdefined.php + * @return bool Returns true on success or false on failure. + */ + public function isUserDefined () {} + + /** + * Checks if instantiable + * @link http://www.php.net/manual/en/reflectionclass.isinstantiable.php + * @return bool Returns true on success or false on failure. + */ + public function isInstantiable () {} + + /** + * Gets a filename + * @link http://www.php.net/manual/en/reflectionclass.getfilename.php + * @return string The filename. + */ + public function getFileName () {} + + /** + * Gets starting line number + * @link http://www.php.net/manual/en/reflectionclass.getstartline.php + * @return int The starting line number, as an integer. + */ + public function getStartLine () {} + + /** + * Gets end line + * @link http://www.php.net/manual/en/reflectionclass.getendline.php + * @return int The ending line number of the user defined class, or false if unknown. + */ + public function getEndLine () {} + + /** + * Gets doc comments + * @link http://www.php.net/manual/en/reflectionclass.getdoccomment.php + * @return string The doc comment if it exists, otherwise false + */ + public function getDocComment () {} + + /** + * Gets constructor + * @link http://www.php.net/manual/en/reflectionclass.getconstructor.php + * @return object A ReflectionMethod object. + */ + public function getConstructor () {} + + /** + * Checks if method is defined + * @link http://www.php.net/manual/en/reflectionclass.hasmethod.php + * @param name string

+ * Name of the method being checked for. + *

+ * @return bool true if it has the method, otherwise false + */ + public function hasMethod ($name) {} + + /** + * Gets a ReflectionMethod + * @link http://www.php.net/manual/en/reflectionclass.getmethod.php + * @param name string

+ * The method name to reflect. + *

+ * @return object A ReflectionMethod. + */ + public function getMethod ($name) {} + + /** + * Gets a list of methods + * @link http://www.php.net/manual/en/reflectionclass.getmethods.php + * @param filter string[optional]

+ * Any combination of ReflectionMethod::IS_STATIC, + * ReflectionMethod::IS_PUBLIC, + * ReflectionMethod::IS_PROTECTED, + * ReflectionMethod::IS_PRIVATE, + * ReflectionMethod::IS_ABSTRACT, + * ReflectionMethod::IS_FINAL. + *

+ * @return array An array of methods. + */ + public function getMethods ($filter = null) {} + + /** + * Checks if property is defined + * @link http://www.php.net/manual/en/reflectionclass.hasproperty.php + * @param name string

+ * Name of the property being checked for. + *

+ * @return bool true if it has the property, otherwise false + */ + public function hasProperty ($name) {} + + /** + * Gets property + * @link http://www.php.net/manual/en/reflectionclass.getproperty.php + * @param name string

+ * The property name. + *

+ * @return ReflectionProperty A ReflectionProperty. + */ + public function getProperty ($name) {} + + /** + * Gets properties + * @link http://www.php.net/manual/en/reflectionclass.getproperties.php + * @param filter int[optional]

+ * The optional filter, for filtering desired property types. It's configured using + * the ReflectionProperty constants, + * and defaults to all property types. + *

+ * @return array An array of ReflectionProperty objects. + */ + public function getProperties ($filter = null) {} + + /** + * Checks if constant is defined + * @link http://www.php.net/manual/en/reflectionclass.hasconstant.php + * @param name string

+ * The name of the constant being checked for. + *

+ * @return bool true if the constant is defined, otherwise false. + */ + public function hasConstant ($name) {} + + /** + * Gets constants + * @link http://www.php.net/manual/en/reflectionclass.getconstants.php + * @return array An array of constants. + */ + public function getConstants () {} + + /** + * Gets defined constants + * @link http://www.php.net/manual/en/reflectionclass.getconstant.php + * @param name string

+ *

+ * @return mixed + */ + public function getConstant ($name) {} + + /** + * Gets the interfaces + * @link http://www.php.net/manual/en/reflectionclass.getinterfaces.php + * @return array An associative array of interfaces, with keys as interface + * names and the array values as ReflectionClass objects. + */ + public function getInterfaces () {} + + /** + * Gets the interface names + * @link http://www.php.net/manual/en/reflectionclass.getinterfacenames.php + * @return array A numerical array with interface names as the values. + */ + public function getInterfaceNames () {} + + /** + * Checks if interface + * @link http://www.php.net/manual/en/reflectionclass.isinterface.php + * @return bool Returns true on success or false on failure. + */ + public function isInterface () {} + + /** + * Checks if class is abstract + * @link http://www.php.net/manual/en/reflectionclass.isabstract.php + * @return bool Returns true on success or false on failure. + */ + public function isAbstract () {} + + /** + * Checks if class is final + * @link http://www.php.net/manual/en/reflectionclass.isfinal.php + * @return bool Returns true on success or false on failure. + */ + public function isFinal () {} + + /** + * Gets modifiers + * @link http://www.php.net/manual/en/reflectionclass.getmodifiers.php + * @return int + */ + public function getModifiers () {} + + /** + * Checks class for instance + * @link http://www.php.net/manual/en/reflectionclass.isinstance.php + * @param object object

+ * The object being compared to. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isInstance ($object) {} + + /** + * New instance + * @link http://www.php.net/manual/en/reflectionclass.newinstance.php + * @param args mixed

+ * Accepts a variable number of arguments which are passed to the function + * much like call_user_func. + *

+ * @param _ mixed[optional] + * @return object + */ + public function newInstance ($args, $_ = null) {} + + /** + * New instance args + * @link http://www.php.net/manual/en/reflectionclass.newinstanceargs.php + * @param args array[optional]

+ *

+ * @return object + */ + public function newInstanceArgs (array $args = null) {} + + /** + * Gets parent class + * @link http://www.php.net/manual/en/reflectionclass.getparentclass.php + * @return object A ReflectionClass. + */ + public function getParentClass () {} + + /** + * Checks if a subclass + * @link http://www.php.net/manual/en/reflectionclass.issubclassof.php + * @param class string

+ * The class name being checked against. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSubclassOf ($class) {} + + /** + * Gets static properties + * @link http://www.php.net/manual/en/reflectionclass.getstaticproperties.php + * @return array The static properties, as an array. + */ + public function getStaticProperties () {} + + /** + * Gets static property value + * @link http://www.php.net/manual/en/reflectionclass.getstaticpropertyvalue.php + * @param name string

+ *

+ * @param default string[optional]

+ *

+ * @return mixed + */ + public function getStaticPropertyValue ($name, $default = null) {} + + /** + * Sets static property value + * @link http://www.php.net/manual/en/reflectionclass.setstaticpropertyvalue.php + * @param name string

+ * Property name. + *

+ * @param value string

+ * New property value. + *

+ * @return void + */ + public function setStaticPropertyValue ($name, $value) {} + + /** + * Gets default properties + * @link http://www.php.net/manual/en/reflectionclass.getdefaultproperties.php + * @return array An array of default properties. + */ + public function getDefaultProperties () {} + + /** + * Checks if iterateable + * @link http://www.php.net/manual/en/reflectionclass.isiterateable.php + * @return bool Returns true on success or false on failure. + */ + public function isIterateable () {} + + /** + * Implements interface + * @link http://www.php.net/manual/en/reflectionclass.implementsinterface.php + * @param interface string

+ * The interface name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function implementsInterface ($interface) {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionclass.getextension.php + * @return ReflectionExtension A ReflectionExtension object. + */ + public function getExtension () {} + + /** + * Gets an extensions name + * @link http://www.php.net/manual/en/reflectionclass.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * Checks if in namespace + * @link http://www.php.net/manual/en/reflectionclass.innamespace.php + * @return bool Returns true on success or false on failure. + */ + public function inNamespace () {} + + /** + * Gets namespace name + * @link http://www.php.net/manual/en/reflectionclass.getnamespacename.php + * @return string The namespace name. + */ + public function getNamespaceName () {} + + /** + * Gets short name + * @link http://www.php.net/manual/en/reflectionclass.getshortname.php + * @return string The class short name. + */ + public function getShortName () {} + +} + +/** @jms-builtin */ +class ReflectionObject extends ReflectionClass implements Reflector { + const IS_IMPLICIT_ABSTRACT = 16; + const IS_EXPLICIT_ABSTRACT = 32; + const IS_FINAL = 64; + + public $name; + + + /** + * Export + * @link http://www.php.net/manual/en/reflectionobject.export.php + * @param argument string

+ * &reflection.export.param.name; + *

+ * @param return bool[optional]

+ * &reflection.export.param.return; + *

+ * @return string &reflection.export.return; + */ + public static function export ($argument, $return = null) {} + + /** + * Constructs a ReflectionObject + * @link http://www.php.net/manual/en/reflectionobject.construct.php + * @param argument + */ + public function __construct ($argument) {} + + /** + * Clones object + * @link http://www.php.net/manual/en/reflectionclass.clone.php + * @return void + */ + final private function __clone () {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionclass.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Gets class name + * @link http://www.php.net/manual/en/reflectionclass.getname.php + * @return string The class name. + */ + public function getName () {} + + /** + * Checks if internal + * @link http://www.php.net/manual/en/reflectionclass.isinternal.php + * @return bool Returns true on success or false on failure. + */ + public function isInternal () {} + + /** + * Checks if user defined + * @link http://www.php.net/manual/en/reflectionclass.isuserdefined.php + * @return bool Returns true on success or false on failure. + */ + public function isUserDefined () {} + + /** + * Checks if instantiable + * @link http://www.php.net/manual/en/reflectionclass.isinstantiable.php + * @return bool Returns true on success or false on failure. + */ + public function isInstantiable () {} + + /** + * Gets a filename + * @link http://www.php.net/manual/en/reflectionclass.getfilename.php + * @return string The filename. + */ + public function getFileName () {} + + /** + * Gets starting line number + * @link http://www.php.net/manual/en/reflectionclass.getstartline.php + * @return int The starting line number, as an integer. + */ + public function getStartLine () {} + + /** + * Gets end line + * @link http://www.php.net/manual/en/reflectionclass.getendline.php + * @return int The ending line number of the user defined class, or false if unknown. + */ + public function getEndLine () {} + + /** + * Gets doc comments + * @link http://www.php.net/manual/en/reflectionclass.getdoccomment.php + * @return string The doc comment if it exists, otherwise false + */ + public function getDocComment () {} + + /** + * Gets constructor + * @link http://www.php.net/manual/en/reflectionclass.getconstructor.php + * @return object A ReflectionMethod object. + */ + public function getConstructor () {} + + /** + * Checks if method is defined + * @link http://www.php.net/manual/en/reflectionclass.hasmethod.php + * @param name string

+ * Name of the method being checked for. + *

+ * @return bool true if it has the method, otherwise false + */ + public function hasMethod ($name) {} + + /** + * Gets a ReflectionMethod + * @link http://www.php.net/manual/en/reflectionclass.getmethod.php + * @param name string

+ * The method name to reflect. + *

+ * @return object A ReflectionMethod. + */ + public function getMethod ($name) {} + + /** + * Gets a list of methods + * @link http://www.php.net/manual/en/reflectionclass.getmethods.php + * @param filter string[optional]

+ * Any combination of ReflectionMethod::IS_STATIC, + * ReflectionMethod::IS_PUBLIC, + * ReflectionMethod::IS_PROTECTED, + * ReflectionMethod::IS_PRIVATE, + * ReflectionMethod::IS_ABSTRACT, + * ReflectionMethod::IS_FINAL. + *

+ * @return array An array of methods. + */ + public function getMethods ($filter = null) {} + + /** + * Checks if property is defined + * @link http://www.php.net/manual/en/reflectionclass.hasproperty.php + * @param name string

+ * Name of the property being checked for. + *

+ * @return bool true if it has the property, otherwise false + */ + public function hasProperty ($name) {} + + /** + * Gets property + * @link http://www.php.net/manual/en/reflectionclass.getproperty.php + * @param name string

+ * The property name. + *

+ * @return ReflectionProperty A ReflectionProperty. + */ + public function getProperty ($name) {} + + /** + * Gets properties + * @link http://www.php.net/manual/en/reflectionclass.getproperties.php + * @param filter int[optional]

+ * The optional filter, for filtering desired property types. It's configured using + * the ReflectionProperty constants, + * and defaults to all property types. + *

+ * @return array An array of ReflectionProperty objects. + */ + public function getProperties ($filter = null) {} + + /** + * Checks if constant is defined + * @link http://www.php.net/manual/en/reflectionclass.hasconstant.php + * @param name string

+ * The name of the constant being checked for. + *

+ * @return bool true if the constant is defined, otherwise false. + */ + public function hasConstant ($name) {} + + /** + * Gets constants + * @link http://www.php.net/manual/en/reflectionclass.getconstants.php + * @return array An array of constants. + */ + public function getConstants () {} + + /** + * Gets defined constants + * @link http://www.php.net/manual/en/reflectionclass.getconstant.php + * @param name string

+ *

+ * @return mixed + */ + public function getConstant ($name) {} + + /** + * Gets the interfaces + * @link http://www.php.net/manual/en/reflectionclass.getinterfaces.php + * @return array An associative array of interfaces, with keys as interface + * names and the array values as ReflectionClass objects. + */ + public function getInterfaces () {} + + /** + * Gets the interface names + * @link http://www.php.net/manual/en/reflectionclass.getinterfacenames.php + * @return array A numerical array with interface names as the values. + */ + public function getInterfaceNames () {} + + /** + * Checks if interface + * @link http://www.php.net/manual/en/reflectionclass.isinterface.php + * @return bool Returns true on success or false on failure. + */ + public function isInterface () {} + + /** + * Checks if class is abstract + * @link http://www.php.net/manual/en/reflectionclass.isabstract.php + * @return bool Returns true on success or false on failure. + */ + public function isAbstract () {} + + /** + * Checks if class is final + * @link http://www.php.net/manual/en/reflectionclass.isfinal.php + * @return bool Returns true on success or false on failure. + */ + public function isFinal () {} + + /** + * Gets modifiers + * @link http://www.php.net/manual/en/reflectionclass.getmodifiers.php + * @return int + */ + public function getModifiers () {} + + /** + * Checks class for instance + * @link http://www.php.net/manual/en/reflectionclass.isinstance.php + * @param object object

+ * The object being compared to. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isInstance ($object) {} + + /** + * New instance + * @link http://www.php.net/manual/en/reflectionclass.newinstance.php + * @param args mixed

+ * Accepts a variable number of arguments which are passed to the function + * much like call_user_func. + *

+ * @param _ mixed[optional] + * @return object + */ + public function newInstance ($args, $_ = null) {} + + /** + * New instance args + * @link http://www.php.net/manual/en/reflectionclass.newinstanceargs.php + * @param args array[optional]

+ *

+ * @return object + */ + public function newInstanceArgs (array $args = null) {} + + /** + * Gets parent class + * @link http://www.php.net/manual/en/reflectionclass.getparentclass.php + * @return object A ReflectionClass. + */ + public function getParentClass () {} + + /** + * Checks if a subclass + * @link http://www.php.net/manual/en/reflectionclass.issubclassof.php + * @param class string

+ * The class name being checked against. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSubclassOf ($class) {} + + /** + * Gets static properties + * @link http://www.php.net/manual/en/reflectionclass.getstaticproperties.php + * @return array The static properties, as an array. + */ + public function getStaticProperties () {} + + /** + * Gets static property value + * @link http://www.php.net/manual/en/reflectionclass.getstaticpropertyvalue.php + * @param name string

+ *

+ * @param default string[optional]

+ *

+ * @return mixed + */ + public function getStaticPropertyValue ($name, $default = null) {} + + /** + * Sets static property value + * @link http://www.php.net/manual/en/reflectionclass.setstaticpropertyvalue.php + * @param name string

+ * Property name. + *

+ * @param value string

+ * New property value. + *

+ * @return void + */ + public function setStaticPropertyValue ($name, $value) {} + + /** + * Gets default properties + * @link http://www.php.net/manual/en/reflectionclass.getdefaultproperties.php + * @return array An array of default properties. + */ + public function getDefaultProperties () {} + + /** + * Checks if iterateable + * @link http://www.php.net/manual/en/reflectionclass.isiterateable.php + * @return bool Returns true on success or false on failure. + */ + public function isIterateable () {} + + /** + * Implements interface + * @link http://www.php.net/manual/en/reflectionclass.implementsinterface.php + * @param interface string

+ * The interface name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function implementsInterface ($interface) {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionclass.getextension.php + * @return ReflectionExtension A ReflectionExtension object. + */ + public function getExtension () {} + + /** + * Gets an extensions name + * @link http://www.php.net/manual/en/reflectionclass.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * Checks if in namespace + * @link http://www.php.net/manual/en/reflectionclass.innamespace.php + * @return bool Returns true on success or false on failure. + */ + public function inNamespace () {} + + /** + * Gets namespace name + * @link http://www.php.net/manual/en/reflectionclass.getnamespacename.php + * @return string The namespace name. + */ + public function getNamespaceName () {} + + /** + * Gets short name + * @link http://www.php.net/manual/en/reflectionclass.getshortname.php + * @return string The class short name. + */ + public function getShortName () {} + +} + +/** @jms-builtin */ +class ReflectionProperty implements Reflector { + const IS_STATIC = 1; + const IS_PUBLIC = 256; + const IS_PROTECTED = 512; + const IS_PRIVATE = 1024; + + public $name; + public $class; + + + /** + * Clone + * @link http://www.php.net/manual/en/reflectionproperty.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Export + * @link http://www.php.net/manual/en/reflectionproperty.export.php + * @param class mixed + * @param name string

+ * The property name. + *

+ * @param return bool[optional]

+ * &reflection.export.param.return; + *

+ * @return string + */ + public static function export ($class, $name, $return = null) {} + + /** + * Construct a ReflectionProperty object + * @link http://www.php.net/manual/en/reflectionproperty.construct.php + * @param class[optional] + * @param name[optional] + */ + public function __construct ($class, $name) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionproperty.tostring.php + * @return string + */ + public function __toString () {} + + /** + * Gets property name + * @link http://www.php.net/manual/en/reflectionproperty.getname.php + * @return string The name of the reflected property. + */ + public function getName () {} + + /** + * Gets value + * @link http://www.php.net/manual/en/reflectionproperty.getvalue.php + * @param object string[optional]

+ * The object being reflected. + *

+ * @return mixed The current value of the property. + */ + public function getValue ($object = null) {} + + /** + * Set property value + * @link http://www.php.net/manual/en/reflectionproperty.setvalue.php + * @param object object

+ * The object name. + *

+ * @param value mixed

+ * The new value. + *

+ * @return void + */ + public function setValue ($object, $value) {} + + /** + * Checks if property is public + * @link http://www.php.net/manual/en/reflectionproperty.ispublic.php + * @return bool true if the property is public, false otherwise. + */ + public function isPublic () {} + + /** + * Checks if property is private + * @link http://www.php.net/manual/en/reflectionproperty.isprivate.php + * @return bool true if the property is private, false otherwise. + */ + public function isPrivate () {} + + /** + * Checks if property is protected + * @link http://www.php.net/manual/en/reflectionproperty.isprotected.php + * @return bool true if the property is protected, false otherwise. + */ + public function isProtected () {} + + /** + * Checks if property is static + * @link http://www.php.net/manual/en/reflectionproperty.isstatic.php + * @return bool true if the property is static, false otherwise. + */ + public function isStatic () {} + + /** + * Checks if default value + * @link http://www.php.net/manual/en/reflectionproperty.isdefault.php + * @return bool true if the property was declared at compile-time, or false if + * it was created at run-time. + */ + public function isDefault () {} + + /** + * Gets modifiers + * @link http://www.php.net/manual/en/reflectionproperty.getmodifiers.php + * @return int A numeric representation of the modifiers. + */ + public function getModifiers () {} + + /** + * Gets declaring class + * @link http://www.php.net/manual/en/reflectionproperty.getdeclaringclass.php + * @return ReflectionClass A ReflectionClass object. + */ + public function getDeclaringClass () {} + + /** + * Gets doc comment + * @link http://www.php.net/manual/en/reflectionproperty.getdoccomment.php + * @return string The doc comment. + */ + public function getDocComment () {} + + /** + * Set property accessibility + * @link http://www.php.net/manual/en/reflectionproperty.setaccessible.php + * @param accessible bool

+ * true to allow accessibility, or false. + *

+ * @return void + */ + public function setAccessible ($accessible) {} + +} + +/** @jms-builtin */ +class ReflectionExtension implements Reflector { + public $name; + + + /** + * Clones + * @link http://www.php.net/manual/en/reflectionextension.clone.php + * @return void + */ + final private function __clone () {} + + /** + * Export + * @link http://www.php.net/manual/en/reflectionextension.export.php + * @param name string

+ * &reflection.export.param.name; + *

+ * @param return string[optional]

+ * &reflection.export.param.return; + *

+ * @return string &reflection.export.return; + */ + public static function export ($name, $return = null) {} + + /** + * Constructs a ReflectionExtension + * @link http://www.php.net/manual/en/reflectionextension.construct.php + * @param name + */ + public function __construct ($name) {} + + /** + * To string + * @link http://www.php.net/manual/en/reflectionextension.tostring.php + * @return string A string. + */ + public function __toString () {} + + /** + * Gets extension name + * @link http://www.php.net/manual/en/reflectionextension.getname.php + * @return string The extensions name. + */ + public function getName () {} + + /** + * Gets extension version + * @link http://www.php.net/manual/en/reflectionextension.getversion.php + * @return string The version of the extension. + */ + public function getVersion () {} + + /** + * Gets extension functions + * @link http://www.php.net/manual/en/reflectionextension.getfunctions.php + * @return array An associative array of ReflectionFunction objects, + * for each function defined in the extension with the keys being the function + * names. If no function are defined, an empty array is returned. + */ + public function getFunctions () {} + + /** + * Gets constants + * @link http://www.php.net/manual/en/reflectionextension.getconstants.php + * @return array An associative array with constant names as keys. + */ + public function getConstants () {} + + /** + * Gets extension ini entries + * @link http://www.php.net/manual/en/reflectionextension.getinientries.php + * @return array An associative array with the ini entries as keys, + * with their defined values as values. + */ + public function getINIEntries () {} + + /** + * Gets classes + * @link http://www.php.net/manual/en/reflectionextension.getclasses.php + * @return array An array of ReflectionClass objects, one + * for each class within the extension. If no classes are defined, + * an empty array is returned. + */ + public function getClasses () {} + + /** + * Gets class names + * @link http://www.php.net/manual/en/reflectionextension.getclassnames.php + * @return array An array of class names, as defined in the extension. + * If no classes are defined, an empty array is returned. + */ + public function getClassNames () {} + + /** + * Gets dependencies + * @link http://www.php.net/manual/en/reflectionextension.getdependencies.php + * @return array An associative array with dependencies as keys and + * either Required or Conflicts + * as the values. + */ + public function getDependencies () {} + + /** + * Gets extension info + * @link http://www.php.net/manual/en/reflectionextension.info.php + * @return string Information about the extension. + */ + public function info () {} + +} +// End of Reflection v.$Revision: 1.5 $ +?> diff --git a/res/php-5.3-core-api/SPL.php b/res/php-5.3-core-api/SPL.php new file mode 100644 index 0000000..b34e66e --- /dev/null +++ b/res/php-5.3-core-api/SPL.php @@ -0,0 +1,6998 @@ + + * The maximum allowed depth. -1 is used + * for any depth. + *

+ * @return void + */ + public function setMaxDepth ($max_depth = null) {} + + /** + * Get max depth + * @link http://www.php.net/manual/en/recursiveiteratoriterator.getmaxdepth.php + * @return mixed The maximum accepted depth, or false if any depth is allowed. + */ + public function getMaxDepth () {} + +} + +interface OuterIterator extends Iterator, Traversable { + + /** + * Returns the inner iterator for the current entry. + * @link http://www.php.net/manual/en/outeriterator.getchildren.php + * @return Iterator The inner iterator for the current entry. + */ + abstract public function getInnerIterator () {} + + abstract public function current () {} + + abstract public function next () {} + + abstract public function key () {} + + abstract public function valid () {} + + abstract public function rewind () {} + +} + +/** @jms-builtin */ +class IteratorIterator implements Iterator, Traversable, OuterIterator { + + /** + * Create an iterator from anything that is traversable + * @link http://www.php.net/manual/en/iteratoriterator.construct.php + * @param iterator Traversable + */ + public function __construct (Traversable $iterator) {} + + /** + * Rewind to the first element + * @link http://www.php.net/manual/en/iteratoriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Checks if the iterator is valid + * @link http://www.php.net/manual/en/iteratoriterator.valid.php + * @return bool true if the iterator is valid, otherwise false + */ + public function valid () {} + + /** + * Get the key of the current element + * @link http://www.php.net/manual/en/iteratoriterator.key.php + * @return void The key of the current element. + */ + public function key () {} + + /** + * Get the current value + * @link http://www.php.net/manual/en/iteratoriterator.current.php + * @return void The value of the current element. + */ + public function current () {} + + /** + * Forward to the next element + * @link http://www.php.net/manual/en/iteratoriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/iteratoriterator.getinneriterator.php + * @return void The inner iterator as passed to IteratorIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +abstract class FilterIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * Construct a filterIterator + * @link http://www.php.net/manual/en/filteriterator.construct.php + * @param iterator Iterator + */ + public function __construct (Iterator $iterator) {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/filteriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/filteriterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current element value + * @link http://www.php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/filteriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + + /** + * Check whether the current element of the iterator is acceptable + * @link http://www.php.net/manual/en/filteriterator.accept.php + * @return bool true if the current element is acceptable, otherwise false. + */ + abstract public function accept () {} + +} + +abstract class RecursiveFilterIterator extends FilterIterator implements Iterator, Traversable, OuterIterator, RecursiveIterator { + + /** + * Create a RecursiveFilterIterator from a RecursiveIterator + * @link http://www.php.net/manual/en/recursivefilteriterator.construct.php + * @param iterator RecursiveIterator + */ + public function __construct (RecursiveIterator $iterator) {} + + /** + * Check whether the inner iterator's current element has children + * @link http://www.php.net/manual/en/recursivefilteriterator.haschildren.php + * @return void true if the inner iterator has children, otherwise false + */ + public function hasChildren () {} + + /** + * Return the inner iterator's children contained in a RecursiveFilterIterator + * @link http://www.php.net/manual/en/recursivefilteriterator.getchildren.php + * @return void a RecursiveFilterIterator containing the inner iterator's children. + */ + public function getChildren () {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/filteriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/filteriterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current element value + * @link http://www.php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/filteriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + + /** + * Check whether the current element of the iterator is acceptable + * @link http://www.php.net/manual/en/filteriterator.accept.php + * @return bool true if the current element is acceptable, otherwise false. + */ + abstract public function accept () {} + +} + +/** @jms-builtin */ +class ParentIterator extends RecursiveFilterIterator implements RecursiveIterator, OuterIterator, Traversable, Iterator { + + /** + * Constructs a ParentIterator + * @link http://www.php.net/manual/en/parentiterator.construct.php + * @param iterator RecursiveIterator + */ + public function __construct (RecursiveIterator $iterator) {} + + /** + * Determines acceptability + * @link http://www.php.net/manual/en/parentiterator.accept.php + * @return bool true if the current element is acceptable, otherwise false. + */ + public function accept () {} + + /** + * Check whether the inner iterator's current element has children + * @link http://www.php.net/manual/en/recursivefilteriterator.haschildren.php + * @return void true if the inner iterator has children, otherwise false + */ + public function hasChildren () {} + + /** + * Return the inner iterator's children contained in a RecursiveFilterIterator + * @link http://www.php.net/manual/en/recursivefilteriterator.getchildren.php + * @return void a RecursiveFilterIterator containing the inner iterator's children. + */ + public function getChildren () {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/filteriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/filteriterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current element value + * @link http://www.php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/filteriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +interface Countable { + + /** + * Count elements of an object + * @link http://www.php.net/manual/en/countable.count.php + * @return int The custom count as an integer. + *

+ *

+ * The return value is cast to an integer. + */ + abstract public function count () {} + +} + +interface SeekableIterator extends Iterator, Traversable { + + /** + * Seeks to a position + * @link http://www.php.net/manual/en/seekableiterator.seek.php + * @param position int

+ * The position to seek to. + *

+ * @return void + */ + abstract public function seek ($position) {} + + abstract public function current () {} + + abstract public function next () {} + + abstract public function key () {} + + abstract public function valid () {} + + abstract public function rewind () {} + +} + +/** @jms-builtin */ +class LimitIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * Construct a LimitIterator + * @link http://www.php.net/manual/en/limititerator.construct.php + * @param iterator Iterator + * @param offset[optional] + * @param count[optional] + */ + public function __construct (Iterator $iterator, $offset, $count) {} + + /** + * Rewind the iterator to the specified starting offset + * @link http://www.php.net/manual/en/limititerator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/limititerator.valid.php + * @return bool Returns true on success or false on failure. + */ + public function valid () {} + + /** + * Get current key + * @link http://www.php.net/manual/en/limititerator.key.php + * @return mixed the key for the current item. + */ + public function key () {} + + /** + * Get current element + * @link http://www.php.net/manual/en/limititerator.current.php + * @return mixed the current element or &null; if there is none. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/limititerator.next.php + * @return void + */ + public function next () {} + + /** + * Seek to the given position + * @link http://www.php.net/manual/en/limititerator.seek.php + * @param position int

+ * The position to seek to. + *

+ * @return int the offset position after seeking. + */ + public function seek ($position) {} + + /** + * Return the current position + * @link http://www.php.net/manual/en/limititerator.getposition.php + * @return int The current position. + */ + public function getPosition () {} + + /** + * Get inner iterator + * @link http://www.php.net/manual/en/limititerator.getinneriterator.php + * @return Iterator The inner iterator passed to LimitIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class CachingIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator, ArrayAccess, Countable { + const CALL_TOSTRING = 1; + const CATCH_GET_CHILD = 16; + const TOSTRING_USE_KEY = 2; + const TOSTRING_USE_CURRENT = 4; + const TOSTRING_USE_INNER = 8; + const FULL_CACHE = 256; + + + /** + * Construct a new CachingIterator object for the iterator. + * @link http://www.php.net/manual/en/cachingiterator.construct.php + * @param iterator Iterator + * @param flags[optional] + */ + public function __construct (Iterator $iterator, $flags) {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/cachingiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/cachingiterator.valid.php + * @return void Returns true on success or false on failure. + */ + public function valid () {} + + /** + * Return the key for the current element + * @link http://www.php.net/manual/en/cachingiterator.key.php + * @return void + */ + public function key () {} + + /** + * Return the current element + * @link http://www.php.net/manual/en/cachingiterator.current.php + * @return void Mixed + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/cachingiterator.next.php + * @return void + */ + public function next () {} + + /** + * Check whether the inner iterator has a valid next element + * @link http://www.php.net/manual/en/cachingiterator.hasnext.php + * @return void Returns true on success or false on failure. + */ + public function hasNext () {} + + /** + * Return the string representation of the current element + * @link http://www.php.net/manual/en/cachingiterator.tostring.php + * @return void The string representation of the current element. + */ + public function __toString () {} + + /** + * Return the innter iterator + * @link http://www.php.net/manual/en/cachingiterator.getinneriterator.php + * @return void an object implementing the Iterator interface. + */ + public function getInnerIterator () {} + + /** + * Get flags used + * @link http://www.php.net/manual/en/cachingiterator.getflags.php + * @return void Description... + */ + public function getFlags () {} + + /** + * The setFlags purpose + * @link http://www.php.net/manual/en/cachingiterator.setflags.php + * @param flags bitmask

+ * Bitmask of the flags to set. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * The offsetGet purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetget.php + * @param index string

+ * Description... + *

+ * @return void Description... + */ + public function offsetGet ($index) {} + + /** + * The offsetSet purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetset.php + * @param index string

+ * The index of the element to be set. + *

+ * @param newval string

+ * The new value for the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * The offsetUnset purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetunset.php + * @param index string

+ * The index of the element to be unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * The offsetExists purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetexists.php + * @param index string

+ * The index being checked. + *

+ * @return void true if an entry referenced by the offset exists, false otherwise. + */ + public function offsetExists ($index) {} + + /** + * The getCache purpose + * @link http://www.php.net/manual/en/cachingiterator.getcache.php + * @return void Description... + */ + public function getCache () {} + + /** + * The number of elements in the iterator + * @link http://www.php.net/manual/en/cachingiterator.count.php + * @return void The count of the elements iterated over. + */ + public function count () {} + +} + +/** @jms-builtin */ +class RecursiveCachingIterator extends CachingIterator implements Countable, ArrayAccess, Iterator, Traversable, OuterIterator, RecursiveIterator { + const CALL_TOSTRING = 1; + const CATCH_GET_CHILD = 16; + const TOSTRING_USE_KEY = 2; + const TOSTRING_USE_CURRENT = 4; + const TOSTRING_USE_INNER = 8; + const FULL_CACHE = 256; + + + /** + * Construct + * @link http://www.php.net/manual/en/recursivecachingiterator.construct.php + * @param iterator Iterator + * @param flags[optional] + */ + public function __construct (Iterator $iterator, $flags) {} + + /** + * Check whether the current element of the inner iterator has children + * @link http://www.php.net/manual/en/recursivecachingiterator.haschildren.php + * @return bool true if the inner iterator has children, otherwise false + */ + public function hasChildren () {} + + /** + * Return the inner iterator's children as a RecursiveCachingIterator + * @link http://www.php.net/manual/en/recursivecachingiterator.getchildren.php + * @return RecursiveCachingIterator The inner iterator's children, as a RecursiveCachingIterator. + */ + public function getChildren () {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/cachingiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/cachingiterator.valid.php + * @return void Returns true on success or false on failure. + */ + public function valid () {} + + /** + * Return the key for the current element + * @link http://www.php.net/manual/en/cachingiterator.key.php + * @return void + */ + public function key () {} + + /** + * Return the current element + * @link http://www.php.net/manual/en/cachingiterator.current.php + * @return void Mixed + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/cachingiterator.next.php + * @return void + */ + public function next () {} + + /** + * Check whether the inner iterator has a valid next element + * @link http://www.php.net/manual/en/cachingiterator.hasnext.php + * @return void Returns true on success or false on failure. + */ + public function hasNext () {} + + /** + * Return the string representation of the current element + * @link http://www.php.net/manual/en/cachingiterator.tostring.php + * @return void The string representation of the current element. + */ + public function __toString () {} + + /** + * Return the innter iterator + * @link http://www.php.net/manual/en/cachingiterator.getinneriterator.php + * @return void an object implementing the Iterator interface. + */ + public function getInnerIterator () {} + + /** + * Get flags used + * @link http://www.php.net/manual/en/cachingiterator.getflags.php + * @return void Description... + */ + public function getFlags () {} + + /** + * The setFlags purpose + * @link http://www.php.net/manual/en/cachingiterator.setflags.php + * @param flags bitmask

+ * Bitmask of the flags to set. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * The offsetGet purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetget.php + * @param index string

+ * Description... + *

+ * @return void Description... + */ + public function offsetGet ($index) {} + + /** + * The offsetSet purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetset.php + * @param index string

+ * The index of the element to be set. + *

+ * @param newval string

+ * The new value for the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * The offsetUnset purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetunset.php + * @param index string

+ * The index of the element to be unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * The offsetExists purpose + * @link http://www.php.net/manual/en/cachingiterator.offsetexists.php + * @param index string

+ * The index being checked. + *

+ * @return void true if an entry referenced by the offset exists, false otherwise. + */ + public function offsetExists ($index) {} + + /** + * The getCache purpose + * @link http://www.php.net/manual/en/cachingiterator.getcache.php + * @return void Description... + */ + public function getCache () {} + + /** + * The number of elements in the iterator + * @link http://www.php.net/manual/en/cachingiterator.count.php + * @return void The count of the elements iterated over. + */ + public function count () {} + +} + +/** @jms-builtin */ +class NoRewindIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * Construct a NoRewindIterator + * @link http://www.php.net/manual/en/norewinditerator.construct.php + * @param iterator Iterator + */ + public function __construct (Iterator $iterator) {} + + /** + * Prevents the rewind operation on the inner iterator. + * @link http://www.php.net/manual/en/norewinditerator.haschildren.php + * @return void + */ + public function rewind () {} + + /** + * Validates the iterator + * @link http://www.php.net/manual/en/norewinditerator.valid.php + * @return bool Returns true on success or false on failure. + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/norewinditerator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current value + * @link http://www.php.net/manual/en/norewinditerator.current.php + * @return mixed The current value. + */ + public function current () {} + + /** + * Forward to the next element + * @link http://www.php.net/manual/en/norewinditerator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/norewinditerator.getinneriterator.php + * @return iterator The inner iterator, as passed to NoRewindIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class AppendIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * Constructs an AppendIterator + * @link http://www.php.net/manual/en/appenditerator.construct.php + */ + public function __construct () {} + + /** + * Appends an iterator + * @link http://www.php.net/manual/en/appenditerator.append.php + * @param iterator Iterator

+ * The iterator to append. + *

+ * @return void + */ + public function append ($iterator) {} + + /** + * Rewinds the Iterator + * @link http://www.php.net/manual/en/appenditerator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Checks validity of the current element + * @link http://www.php.net/manual/en/appenditerator.valid.php + * @return void Returns true on success or false on failure. + */ + public function valid () {} + + /** + * Gets the current key + * @link http://www.php.net/manual/en/appenditerator.key.php + * @return void The current key if it is valid or &null; otherwise. + */ + public function key () {} + + /** + * Gets the current value + * @link http://www.php.net/manual/en/appenditerator.current.php + * @return void The current value if it is valid or &null; otherwise. + */ + public function current () {} + + /** + * Moves to the next element + * @link http://www.php.net/manual/en/appenditerator.next.php + * @return void + */ + public function next () {} + + /** + * Gets an inner iterator + * @link http://www.php.net/manual/en/appenditerator.getinneriterator.php + * @return void The current inner Iterator. + */ + public function getInnerIterator () {} + + /** + * Gets an index of iterators + * @link http://www.php.net/manual/en/appenditerator.getiteratorindex.php + * @return void The index of iterators. + */ + public function getIteratorIndex () {} + + /** + * The getArrayIterator method + * @link http://www.php.net/manual/en/appenditerator.getarrayiterator.php + * @return void + */ + public function getArrayIterator () {} + +} + +/** @jms-builtin */ +class InfiniteIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * Constructs an InfiniteIterator + * @link http://www.php.net/manual/en/infiniteiterator.construct.php + * @param iterator Iterator + */ + public function __construct (Iterator $iterator) {} + + /** + * Moves the inner Iterator forward or rewinds it + * @link http://www.php.net/manual/en/infiniteiterator.next.php + * @return void + */ + public function next () {} + + /** + * Rewind to the first element + * @link http://www.php.net/manual/en/iteratoriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Checks if the iterator is valid + * @link http://www.php.net/manual/en/iteratoriterator.valid.php + * @return bool true if the iterator is valid, otherwise false + */ + public function valid () {} + + /** + * Get the key of the current element + * @link http://www.php.net/manual/en/iteratoriterator.key.php + * @return void The key of the current element. + */ + public function key () {} + + /** + * Get the current value + * @link http://www.php.net/manual/en/iteratoriterator.current.php + * @return void The value of the current element. + */ + public function current () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/iteratoriterator.getinneriterator.php + * @return void The inner iterator as passed to IteratorIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class RegexIterator extends FilterIterator implements Iterator, Traversable, OuterIterator { + const USE_KEY = 1; + const MATCH = 0; + const GET_MATCH = 1; + const ALL_MATCHES = 2; + const SPLIT = 3; + const REPLACE = 4; + + public $replacement; + + + /** + * Create a new RegexIterator + * @link http://www.php.net/manual/en/regexiterator.construct.php + * @param iterator Iterator + * @param regex + * @param mode[optional] + * @param flags[optional] + * @param preg_flags[optional] + */ + public function __construct (Iterator $iterator, $regex, $mode, $flags, $preg_flags) {} + + /** + * Get accept status + * @link http://www.php.net/manual/en/regexiterator.accept.php + * @return bool true if a match, false otherwise. + */ + public function accept () {} + + /** + * Returns operation mode. + * @link http://www.php.net/manual/en/regexiterator.getmode.php + * @return int the operation mode. + */ + public function getMode () {} + + /** + * Sets the operation mode. + * @link http://www.php.net/manual/en/regexiterator.setmode.php + * @param mode int

+ * The operation mode. + *

+ *

+ * The available modes are listed below. The actual + * meanings of these modes are described in the + * predefined constants. + * + * RegexIterator modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
valueconstant
0 + * RegexIterator::MATCH + *
1 + * RegexIterator::GET_MATCH + *
2 + * RegexIterator::ALL_MATCHES + *
3 + * RegexIterator::SPLIT + *
4 + * RegexIterator::REPLACE + *
+ *

+ * @return void + */ + public function setMode ($mode) {} + + /** + * Get flags + * @link http://www.php.net/manual/en/regexiterator.getflags.php + * @return int the set flags. + */ + public function getFlags () {} + + /** + * Sets the flags. + * @link http://www.php.net/manual/en/regexiterator.setflags.php + * @param flags int

+ * The flags to set, a bitmask of class constants. + *

+ *

+ * The available flags are listed below. The actual + * meanings of these flags are described in the + * predefined constants. + * + * RegexIterator flags + * + * + * + * + * + * + * + * + *
valueconstant
1 + * RegexIterator::USE_KEY + *
+ *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Returns the regular expression flags. + * @link http://www.php.net/manual/en/regexiterator.getpregflags.php + * @return int a bitmask of the regular expression flags. + */ + public function getPregFlags () {} + + /** + * Sets the regular expression flags. + * @link http://www.php.net/manual/en/regexiterator.setpregflags.php + * @param preg_flags int

+ * The regular expression flags. See RegexIterator::__construct + * for an overview of available flags. + *

+ * @return void + */ + public function setPregFlags ($preg_flags) {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/filteriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/filteriterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current element value + * @link http://www.php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/filteriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class RecursiveRegexIterator extends RegexIterator implements OuterIterator, Traversable, Iterator, RecursiveIterator { + const USE_KEY = 1; + const MATCH = 0; + const GET_MATCH = 1; + const ALL_MATCHES = 2; + const SPLIT = 3; + const REPLACE = 4; + + public $replacement; + + + /** + * Creates a new RecursiveRegexIterator. + * @link http://www.php.net/manual/en/recursiveregexiterator.construct.php + * @param iterator RecursiveIterator + * @param regex + * @param mode[optional] + * @param flags[optional] + * @param preg_flags[optional] + */ + public function __construct (RecursiveIterator $iterator, $regex, $mode, $flags, $preg_flags) {} + + /** + * Returns whether an iterator can be obtained for the current entry. + * @link http://www.php.net/manual/en/recursiveregexiterator.haschildren.php + * @return bool true if an iterator can be obtained for the current entry, otherwise returns false. + */ + public function hasChildren () {} + + /** + * Returns an iterator for the current entry. + * @link http://www.php.net/manual/en/recursiveregexiterator.getchildren.php + * @return RecursiveRegexIterator An iterator for the current entry, if it can be iterated over by the inner iterator. + */ + public function getChildren () {} + + /** + * Get accept status + * @link http://www.php.net/manual/en/regexiterator.accept.php + * @return bool true if a match, false otherwise. + */ + public function accept () {} + + /** + * Returns operation mode. + * @link http://www.php.net/manual/en/regexiterator.getmode.php + * @return int the operation mode. + */ + public function getMode () {} + + /** + * Sets the operation mode. + * @link http://www.php.net/manual/en/regexiterator.setmode.php + * @param mode int

+ * The operation mode. + *

+ *

+ * The available modes are listed below. The actual + * meanings of these modes are described in the + * predefined constants. + * + * RegexIterator modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
valueconstant
0 + * RegexIterator::MATCH + *
1 + * RegexIterator::GET_MATCH + *
2 + * RegexIterator::ALL_MATCHES + *
3 + * RegexIterator::SPLIT + *
4 + * RegexIterator::REPLACE + *
+ *

+ * @return void + */ + public function setMode ($mode) {} + + /** + * Get flags + * @link http://www.php.net/manual/en/regexiterator.getflags.php + * @return int the set flags. + */ + public function getFlags () {} + + /** + * Sets the flags. + * @link http://www.php.net/manual/en/regexiterator.setflags.php + * @param flags int

+ * The flags to set, a bitmask of class constants. + *

+ *

+ * The available flags are listed below. The actual + * meanings of these flags are described in the + * predefined constants. + * + * RegexIterator flags + * + * + * + * + * + * + * + * + *
valueconstant
1 + * RegexIterator::USE_KEY + *
+ *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Returns the regular expression flags. + * @link http://www.php.net/manual/en/regexiterator.getpregflags.php + * @return int a bitmask of the regular expression flags. + */ + public function getPregFlags () {} + + /** + * Sets the regular expression flags. + * @link http://www.php.net/manual/en/regexiterator.setpregflags.php + * @param preg_flags int

+ * The regular expression flags. See RegexIterator::__construct + * for an overview of available flags. + *

+ * @return void + */ + public function setPregFlags ($preg_flags) {} + + /** + * Rewind the iterator + * @link http://www.php.net/manual/en/filteriterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/filteriterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Get the current key + * @link http://www.php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * Get the current element value + * @link http://www.php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Move the iterator forward + * @link http://www.php.net/manual/en/filteriterator.next.php + * @return void + */ + public function next () {} + + /** + * Get the inner iterator + * @link http://www.php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +/** @jms-builtin */ +class EmptyIterator implements Iterator, Traversable { + + /** + * The rewind() method + * @link http://www.php.net/manual/en/emptyiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * The valid() method + * @link http://www.php.net/manual/en/emptyiterator.valid.php + * @return void false + */ + public function valid () {} + + /** + * The key() method + * @link http://www.php.net/manual/en/emptyiterator.key.php + * @return void + */ + public function key () {} + + /** + * The current() method + * @link http://www.php.net/manual/en/emptyiterator.current.php + * @return void + */ + public function current () {} + + /** + * The next() method + * @link http://www.php.net/manual/en/emptyiterator.next.php + * @return void + */ + public function next () {} + +} + +/** @jms-builtin */ +class RecursiveTreeIterator extends RecursiveIteratorIterator implements OuterIterator, Traversable, Iterator { + const LEAVES_ONLY = 0; + const SELF_FIRST = 1; + const CHILD_FIRST = 2; + const CATCH_GET_CHILD = 16; + const BYPASS_CURRENT = 4; + const BYPASS_KEY = 8; + const PREFIX_LEFT = 0; + const PREFIX_MID_HAS_NEXT = 1; + const PREFIX_MID_LAST = 2; + const PREFIX_END_HAS_NEXT = 3; + const PREFIX_END_LAST = 4; + const PREFIX_RIGHT = 5; + + + /** + * Construct a RecursiveTreeIterator + * @link http://www.php.net/manual/en/recursivetreeiterator.construct.php + * @param iterator Traversable + * @param flags[optional] + * @param caching_it_flags[optional] + * @param mode[optional] + */ + public function __construct (Traversable $iterator, $flags, $caching_it_flags, $mode) {} + + /** + * Rewind iterator + * @link http://www.php.net/manual/en/recursivetreeiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check validity + * @link http://www.php.net/manual/en/recursivetreeiterator.valid.php + * @return bool true if the current position is valid, otherwise false + */ + public function valid () {} + + /** + * Get the key of the current element + * @link http://www.php.net/manual/en/recursivetreeiterator.key.php + * @return string the current key prefixed and postfixed. + */ + public function key () {} + + /** + * Get current element + * @link http://www.php.net/manual/en/recursivetreeiterator.current.php + * @return string the current element prefixed and postfixed. + */ + public function current () {} + + /** + * Move to next element + * @link http://www.php.net/manual/en/recursivetreeiterator.next.php + * @return void + */ + public function next () {} + + /** + * Begin iteration + * @link http://www.php.net/manual/en/recursivetreeiterator.beginiteration.php + * @return RecursiveIterator A RecursiveIterator. + */ + public function beginIteration () {} + + /** + * End iteration + * @link http://www.php.net/manual/en/recursivetreeiterator.enditeration.php + * @return void + */ + public function endIteration () {} + + /** + * Has children + * @link http://www.php.net/manual/en/recursivetreeiterator.callhaschildren.php + * @return bool true if there are children, otherwise false + */ + public function callHasChildren () {} + + /** + * Get children + * @link http://www.php.net/manual/en/recursivetreeiterator.callgetchildren.php + * @return RecursiveIterator A RecursiveIterator. + */ + public function callGetChildren () {} + + /** + * Begin children + * @link http://www.php.net/manual/en/recursivetreeiterator.beginchildren.php + * @return void + */ + public function beginChildren () {} + + /** + * End children + * @link http://www.php.net/manual/en/recursivetreeiterator.endchildren.php + * @return void + */ + public function endChildren () {} + + /** + * Next element + * @link http://www.php.net/manual/en/recursivetreeiterator.nextelement.php + * @return void + */ + public function nextElement () {} + + /** + * Get the prefix + * @link http://www.php.net/manual/en/recursivetreeiterator.getprefix.php + * @return string the string to place in front of current element + */ + public function getPrefix () {} + + /** + * Set a part of the prefix + * @link http://www.php.net/manual/en/recursivetreeiterator.setprefixpart.php + * @param part int

+ * One of the RecursiveTreeIterator::PREFIX_* constants. + *

+ * @param value string

+ * The value to assign to the part of the prefix specified in part. + *

+ * @return void + */ + public function setPrefixPart ($part, $value) {} + + /** + * Get current entry + * @link http://www.php.net/manual/en/recursivetreeiterator.getentry.php + * @return string the part of the tree built for the current element. + */ + public function getEntry () {} + + /** + * Get the postfix + * @link http://www.php.net/manual/en/recursivetreeiterator.getpostfix.php + * @return void the string to place after the current element. + */ + public function getPostfix () {} + + /** + * Get the current depth of the recursive iteration + * @link http://www.php.net/manual/en/recursiveiteratoriterator.getdepth.php + * @return int The current depth of the recursive iteration. + */ + public function getDepth () {} + + /** + * The current active sub iterator + * @link http://www.php.net/manual/en/recursiveiteratoriterator.getsubiterator.php + * @param level[optional] + * @return RecursiveIterator The current active sub iterator. + */ + public function getSubIterator ($level) {} + + /** + * Get inner iterator + * @link http://www.php.net/manual/en/recursiveiteratoriterator.getinneriterator.php + * @return iterator The current active sub iterator. + */ + public function getInnerIterator () {} + + /** + * Set max depth + * @link http://www.php.net/manual/en/recursiveiteratoriterator.setmaxdepth.php + * @param max_depth string[optional]

+ * The maximum allowed depth. -1 is used + * for any depth. + *

+ * @return void + */ + public function setMaxDepth ($max_depth = null) {} + + /** + * Get max depth + * @link http://www.php.net/manual/en/recursiveiteratoriterator.getmaxdepth.php + * @return mixed The maximum accepted depth, or false if any depth is allowed. + */ + public function getMaxDepth () {} + +} + +/** @jms-builtin */ +class ArrayObject implements IteratorAggregate, Traversable, ArrayAccess, Serializable, Countable { + const STD_PROP_LIST = 1; + const ARRAY_AS_PROPS = 2; + + + /** + * Construct a new array object + * @link http://www.php.net/manual/en/arrayobject.construct.php + * @param array + */ + public function __construct ($array) {} + + /** + * Returns whether the requested index exists + * @link http://www.php.net/manual/en/arrayobject.offsetexists.php + * @param index mixed

+ * The index being checked. + *

+ * @return bool true if the requested index exists, otherwise false + */ + public function offsetExists ($index) {} + + /** + * Returns the value at the specified index + * @link http://www.php.net/manual/en/arrayobject.offsetget.php + * @param index mixed

+ * The index with the value. + *

+ * @return mixed The value at the specified index or false. + */ + public function offsetGet ($index) {} + + /** + * Sets the value at the specified index to newval + * @link http://www.php.net/manual/en/arrayobject.offsetset.php + * @param index mixed

+ * The index being set. + *

+ * @param newval mixed

+ * The new value for the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * Unsets the value at the specified index + * @link http://www.php.net/manual/en/arrayobject.offsetunset.php + * @param index mixed

+ * The index being unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * Appends the value + * @link http://www.php.net/manual/en/arrayobject.append.php + * @param value mixed

+ * The value being appended. + *

+ * @return void + */ + public function append ($value) {} + + /** + * Creates a copy of the ArrayObject. + * @link http://www.php.net/manual/en/arrayobject.getarraycopy.php + * @return array a copy of the array. When the ArrayObject refers to an object + * an array of the public properties of that object will be returned. + */ + public function getArrayCopy () {} + + /** + * Get the number of public properties in the ArrayObject + * @link http://www.php.net/manual/en/arrayobject.count.php + * @return int The number of public properties in the ArrayObject. + *

+ *

+ * When the ArrayObject is constructed from an array all properties are public. + */ + public function count () {} + + /** + * Gets the behavior flags. + * @link http://www.php.net/manual/en/arrayobject.getflags.php + * @return int the behavior flags of the ArrayObject. + */ + public function getFlags () {} + + /** + * Sets the behavior flags. + * @link http://www.php.net/manual/en/arrayobject.setflags.php + * @param flags int

+ * The new ArrayObject behavior. + * It takes on either a bitmask, or named constants. Using named + * constants is strongly encouraged to ensure compatibility for future + * versions. + *

+ *

+ * The available behavior flags are listed below. The actual + * meanings of these flags are described in the + * predefined constants. + * + * ArrayObject behavior flags + * + * + * + * + * + * + * + * + * + * + * + * + *
valueconstant
1 + * ArrayObject::STD_PROP_LIST + *
2 + * ArrayObject::ARRAY_AS_PROPS + *
+ *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Sort the entries by value + * @link http://www.php.net/manual/en/arrayobject.asort.php + * @return void + */ + public function asort () {} + + /** + * Sort the entries by key + * @link http://www.php.net/manual/en/arrayobject.ksort.php + * @return void + */ + public function ksort () {} + + /** + * Sort the entries with a user-defined comparison function and maintain key association + * @link http://www.php.net/manual/en/arrayobject.uasort.php + * @param cmp_function callback

+ * Function cmp_function should accept two + * parameters which will be filled by pairs of entries. + * The comparison function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @return void + */ + public function uasort ($cmp_function) {} + + /** + * Sort the entries by keys using a user-defined comparison function + * @link http://www.php.net/manual/en/arrayobject.uksort.php + * @param cmp_function callback

+ * The callback comparison function. + *

+ *

+ * Function cmp_function should accept two + * parameters which will be filled by pairs of entry keys. + * The comparison function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @return void + */ + public function uksort ($cmp_function) {} + + /** + * Sort entries using a "natural order" algorithm + * @link http://www.php.net/manual/en/arrayobject.natsort.php + * @return void + */ + public function natsort () {} + + /** + * Sort an array using a case insensitive "natural order" algorithm + * @link http://www.php.net/manual/en/arrayobject.natcasesort.php + * @return void + */ + public function natcasesort () {} + + /** + * Unserialize an ArrayObject + * @link http://www.php.net/manual/en/arrayobject.unserialize.php + * @param serialized string

+ * The serialized ArrayObject. + *

+ * @return void The unserialized ArrayObject. + */ + public function unserialize ($serialized) {} + + /** + * Serialize an ArrayObject + * @link http://www.php.net/manual/en/arrayobject.serialize.php + * @return void The serialized representation of the ArrayObject. + */ + public function serialize () {} + + /** + * Create a new iterator from an ArrayObject instance + * @link http://www.php.net/manual/en/arrayobject.getiterator.php + * @return ArrayIterator An iterator from an ArrayObject. + */ + public function getIterator () {} + + /** + * Exchange the array for another one. + * @link http://www.php.net/manual/en/arrayobject.exchangearray.php + * @param input mixed

+ * The new array or object to exchange with the current array. + *

+ * @return array the old array. + */ + public function exchangeArray ($input) {} + + /** + * Sets the iterator classname for the ArrayObject. + * @link http://www.php.net/manual/en/arrayobject.setiteratorclass.php + * @param iterator_class string

+ * The classname of the array iterator to use when iterating over this object. + *

+ * @return void + */ + public function setIteratorClass ($iterator_class) {} + + /** + * Gets the iterator classname for the ArrayObject. + * @link http://www.php.net/manual/en/arrayobject.getiteratorclass.php + * @return string the iterator class name that is used to iterate over this object. + */ + public function getIteratorClass () {} + +} + +/** @jms-builtin */ +class ArrayIterator implements Iterator, Traversable, ArrayAccess, SeekableIterator, Serializable, Countable { + const STD_PROP_LIST = 1; + const ARRAY_AS_PROPS = 2; + + + /** + * Construct an ArrayIterator + * @link http://www.php.net/manual/en/arrayiterator.construct.php + * @param array + */ + public function __construct ($array) {} + + /** + * Check if offset exists + * @link http://www.php.net/manual/en/arrayiterator.offsetexists.php + * @param index string

+ * The offset being checked. + *

+ * @return void true if the offset exists, otherwise false + */ + public function offsetExists ($index) {} + + /** + * Get value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetget.php + * @param index string

+ * The offset to get the value from. + *

+ * @return mixed The value at offset index. + */ + public function offsetGet ($index) {} + + /** + * Set value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetset.php + * @param index string

+ * The index to set for. + *

+ * @param newval string

+ * The new value to store at the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * Unset value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetunset.php + * @param index string

+ * The offset to unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * Append an element + * @link http://www.php.net/manual/en/arrayiterator.append.php + * @param value string

+ * The value to append. + *

+ * @return void + */ + public function append ($value) {} + + /** + * Get array copy + * @link http://www.php.net/manual/en/arrayiterator.getarraycopy.php + * @return array A copy of the array, or array of public properties + * if ArrayIterator refers to an object. + */ + public function getArrayCopy () {} + + /** + * Count elements + * @link http://www.php.net/manual/en/arrayiterator.count.php + * @return void The number. + */ + public function count () {} + + /** + * Get flags + * @link http://www.php.net/manual/en/arrayiterator.getflags.php + * @return void The current flags. + */ + public function getFlags () {} + + /** + * Set behaviour flags + * @link http://www.php.net/manual/en/arrayiterator.setflags.php + * @param flags string

+ * A bitmask as follows: + * 0 = Properties of the object have their normal functionality + * when accessed as list (var_dump, foreach, etc.). + * 1 = Array indices can be accessed as properties in read/write. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Sort array by values + * @link http://www.php.net/manual/en/arrayiterator.asort.php + * @return void + */ + public function asort () {} + + /** + * Sort array by keys + * @link http://www.php.net/manual/en/arrayiterator.ksort.php + * @return void + */ + public function ksort () {} + + /** + * User defined sort + * @link http://www.php.net/manual/en/arrayiterator.uasort.php + * @param cmp_function string

+ * The compare function used for the sort. + *

+ * @return void + */ + public function uasort ($cmp_function) {} + + /** + * User defined sort + * @link http://www.php.net/manual/en/arrayiterator.uksort.php + * @param cmp_function string

+ * The compare function used for the sort. + *

+ * @return void + */ + public function uksort ($cmp_function) {} + + /** + * Sort an array naturally + * @link http://www.php.net/manual/en/arrayiterator.natsort.php + * @return void + */ + public function natsort () {} + + /** + * Sort an array naturally, case insensitive + * @link http://www.php.net/manual/en/arrayiterator.natcasesort.php + * @return void + */ + public function natcasesort () {} + + /** + * Unserialize + * @link http://www.php.net/manual/en/arrayiterator.unserialize.php + * @param serialized string

+ * The serialized ArrayIterator object to be unserialized. + *

+ * @return string The ArrayIterator. + */ + public function unserialize ($serialized) {} + + /** + * Serialize + * @link http://www.php.net/manual/en/arrayiterator.serialize.php + * @return string The serialized ArrayIterator. + */ + public function serialize () {} + + /** + * Rewind array back to the start + * @link http://www.php.net/manual/en/arrayiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current array entry + * @link http://www.php.net/manual/en/arrayiterator.current.php + * @return mixed The current array entry. + */ + public function current () {} + + /** + * Return current array key + * @link http://www.php.net/manual/en/arrayiterator.key.php + * @return mixed The current array key. + */ + public function key () {} + + /** + * Move to next entry + * @link http://www.php.net/manual/en/arrayiterator.next.php + * @return void + */ + public function next () {} + + /** + * Check whether array contains more entries + * @link http://www.php.net/manual/en/arrayiterator.valid.php + * @return bool + */ + public function valid () {} + + /** + * Seek to position + * @link http://www.php.net/manual/en/arrayiterator.seek.php + * @param position int

+ * The position to seek to. + *

+ * @return void + */ + public function seek ($position) {} + +} + +/** @jms-builtin */ +class RecursiveArrayIterator extends ArrayIterator implements Serializable, SeekableIterator, ArrayAccess, Traversable, Iterator, RecursiveIterator { + const CHILD_ARRAYS_ONLY = 4; + + + /** + * Returns whether current entry is an array or an object. + * @link http://www.php.net/manual/en/recursivearrayiterator.haschildren.php + * @return bool true if the current entry is an array or an object, + * otherwise false is returned. + */ + public function hasChildren () {} + + /** + * Returns an iterator for the current entry if it is an array or an object. + * @link http://www.php.net/manual/en/recursivearrayiterator.getchildren.php + * @return RecursiveArrayIterator An iterator for the current entry, if it is an array or object. + */ + public function getChildren () {} + + /** + * Construct an ArrayIterator + * @link http://www.php.net/manual/en/arrayiterator.construct.php + * @param array + */ + public function __construct ($array) {} + + /** + * Check if offset exists + * @link http://www.php.net/manual/en/arrayiterator.offsetexists.php + * @param index string

+ * The offset being checked. + *

+ * @return void true if the offset exists, otherwise false + */ + public function offsetExists ($index) {} + + /** + * Get value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetget.php + * @param index string

+ * The offset to get the value from. + *

+ * @return mixed The value at offset index. + */ + public function offsetGet ($index) {} + + /** + * Set value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetset.php + * @param index string

+ * The index to set for. + *

+ * @param newval string

+ * The new value to store at the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * Unset value for an offset + * @link http://www.php.net/manual/en/arrayiterator.offsetunset.php + * @param index string

+ * The offset to unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * Append an element + * @link http://www.php.net/manual/en/arrayiterator.append.php + * @param value string

+ * The value to append. + *

+ * @return void + */ + public function append ($value) {} + + /** + * Get array copy + * @link http://www.php.net/manual/en/arrayiterator.getarraycopy.php + * @return array A copy of the array, or array of public properties + * if ArrayIterator refers to an object. + */ + public function getArrayCopy () {} + + /** + * Count elements + * @link http://www.php.net/manual/en/arrayiterator.count.php + * @return void The number. + */ + public function count () {} + + /** + * Get flags + * @link http://www.php.net/manual/en/arrayiterator.getflags.php + * @return void The current flags. + */ + public function getFlags () {} + + /** + * Set behaviour flags + * @link http://www.php.net/manual/en/arrayiterator.setflags.php + * @param flags string

+ * A bitmask as follows: + * 0 = Properties of the object have their normal functionality + * when accessed as list (var_dump, foreach, etc.). + * 1 = Array indices can be accessed as properties in read/write. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Sort array by values + * @link http://www.php.net/manual/en/arrayiterator.asort.php + * @return void + */ + public function asort () {} + + /** + * Sort array by keys + * @link http://www.php.net/manual/en/arrayiterator.ksort.php + * @return void + */ + public function ksort () {} + + /** + * User defined sort + * @link http://www.php.net/manual/en/arrayiterator.uasort.php + * @param cmp_function string

+ * The compare function used for the sort. + *

+ * @return void + */ + public function uasort ($cmp_function) {} + + /** + * User defined sort + * @link http://www.php.net/manual/en/arrayiterator.uksort.php + * @param cmp_function string

+ * The compare function used for the sort. + *

+ * @return void + */ + public function uksort ($cmp_function) {} + + /** + * Sort an array naturally + * @link http://www.php.net/manual/en/arrayiterator.natsort.php + * @return void + */ + public function natsort () {} + + /** + * Sort an array naturally, case insensitive + * @link http://www.php.net/manual/en/arrayiterator.natcasesort.php + * @return void + */ + public function natcasesort () {} + + /** + * Unserialize + * @link http://www.php.net/manual/en/arrayiterator.unserialize.php + * @param serialized string

+ * The serialized ArrayIterator object to be unserialized. + *

+ * @return string The ArrayIterator. + */ + public function unserialize ($serialized) {} + + /** + * Serialize + * @link http://www.php.net/manual/en/arrayiterator.serialize.php + * @return string The serialized ArrayIterator. + */ + public function serialize () {} + + /** + * Rewind array back to the start + * @link http://www.php.net/manual/en/arrayiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current array entry + * @link http://www.php.net/manual/en/arrayiterator.current.php + * @return mixed The current array entry. + */ + public function current () {} + + /** + * Return current array key + * @link http://www.php.net/manual/en/arrayiterator.key.php + * @return mixed The current array key. + */ + public function key () {} + + /** + * Move to next entry + * @link http://www.php.net/manual/en/arrayiterator.next.php + * @return void + */ + public function next () {} + + /** + * Check whether array contains more entries + * @link http://www.php.net/manual/en/arrayiterator.valid.php + * @return bool + */ + public function valid () {} + + /** + * Seek to position + * @link http://www.php.net/manual/en/arrayiterator.seek.php + * @param position int

+ * The position to seek to. + *

+ * @return void + */ + public function seek ($position) {} + +} + +/** @jms-builtin */ +class SplFileInfo { + + /** + * Construct a new SplFileInfo object + * @link http://www.php.net/manual/en/splfileinfo.construct.php + * @param file_name + */ + public function __construct ($file_name) {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the filename + * @link http://www.php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * Gets the base name of the file + * @link http://www.php.net/manual/en/splfileinfo.getbasename.php + * @param suffix string[optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + + /** + * Returns the path to the file as a string + * @link http://www.php.net/manual/en/splfileinfo.tostring.php + * @return void the path to the file. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class DirectoryIterator extends SplFileInfo implements Iterator, Traversable, SeekableIterator { + + /** + * Constructs a new directory iterator from a path + * @link http://www.php.net/manual/en/directoryiterator.construct.php + * @param path + */ + public function __construct ($path) {} + + /** + * Return file name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * Get base name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getbasename.php + * @param suffix string[optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * Determine if current DirectoryIterator item is '.' or '..' + * @link http://www.php.net/manual/en/directoryiterator.isdot.php + * @return bool true if the entry is . or .., + * otherwise false + */ + public function isDot () {} + + /** + * Rewind the DirectoryIterator back to the start + * @link http://www.php.net/manual/en/directoryiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether current DirectoryIterator position is a valid file + * @link http://www.php.net/manual/en/directoryiterator.valid.php + * @return bool true if the position is valid, otherwise false + */ + public function valid () {} + + /** + * Return the key for the current DirectoryIterator item + * @link http://www.php.net/manual/en/directoryiterator.key.php + * @return string The key for the current DirectoryIterator item. + */ + public function key () {} + + /** + * Return the current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.current.php + * @return DirectoryIterator The current DirectoryIterator item. + */ + public function current () {} + + /** + * Move forward to next DirectoryIterator item + * @link http://www.php.net/manual/en/directoryiterator.next.php + * @return void + */ + public function next () {} + + /** + * Seek to a DirectoryIterator item + * @link http://www.php.net/manual/en/directoryiterator.seek.php + * @param position int

+ * The zero-based numeric position to seek to. + *

+ * @return void + */ + public function seek ($position) {} + + /** + * Get file name as a string + * @link http://www.php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class FilesystemIterator extends DirectoryIterator implements SeekableIterator, Traversable, Iterator { + const CURRENT_MODE_MASK = 240; + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const KEY_MODE_MASK = 3840; + const KEY_AS_PATHNAME = 0; + const FOLLOW_SYMLINKS = 512; + const KEY_AS_FILENAME = 256; + const NEW_CURRENT_AND_KEY = 256; + const SKIP_DOTS = 4096; + const UNIX_PATHS = 8192; + + + /** + * Constructs a new filesystem iterator + * @link http://www.php.net/manual/en/filesystemiterator.construct.php + * @param path + * @param flags[optional] + */ + public function __construct ($path, $flags) {} + + /** + * Rewinds back to the beginning + * @link http://www.php.net/manual/en/filesystemiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Move to the next file + * @link http://www.php.net/manual/en/filesystemiterator.next.php + * @return void + */ + public function next () {} + + /** + * Retrieve the key for the current file + * @link http://www.php.net/manual/en/filesystemiterator.key.php + * @return string the pathname or filename depending on the set flags. + * See the FilesystemIterator constants. + */ + public function key () {} + + /** + * The current file + * @link http://www.php.net/manual/en/filesystemiterator.current.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator constants. + */ + public function current () {} + + /** + * Get the handling flags + * @link http://www.php.net/manual/en/filesystemiterator.getflags.php + * @return int The integer value of the set flags. + */ + public function getFlags () {} + + /** + * Sets handling flags + * @link http://www.php.net/manual/en/filesystemiterator.setflags.php + * @param flags int[optional]

+ * The handling flags to set. + * See the FilesystemIterator constants. + *

+ * @return void + */ + public function setFlags ($flags = null) {} + + /** + * Return file name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * Get base name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getbasename.php + * @param suffix string[optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * Determine if current DirectoryIterator item is '.' or '..' + * @link http://www.php.net/manual/en/directoryiterator.isdot.php + * @return bool true if the entry is . or .., + * otherwise false + */ + public function isDot () {} + + /** + * Check whether current DirectoryIterator position is a valid file + * @link http://www.php.net/manual/en/directoryiterator.valid.php + * @return bool true if the position is valid, otherwise false + */ + public function valid () {} + + /** + * Seek to a DirectoryIterator item + * @link http://www.php.net/manual/en/directoryiterator.seek.php + * @param position int

+ * The zero-based numeric position to seek to. + *

+ * @return void + */ + public function seek ($position) {} + + /** + * Get file name as a string + * @link http://www.php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class RecursiveDirectoryIterator extends FilesystemIterator implements Iterator, Traversable, SeekableIterator, RecursiveIterator { + const CURRENT_MODE_MASK = 240; + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const KEY_MODE_MASK = 3840; + const KEY_AS_PATHNAME = 0; + const FOLLOW_SYMLINKS = 512; + const KEY_AS_FILENAME = 256; + const NEW_CURRENT_AND_KEY = 256; + const SKIP_DOTS = 4096; + const UNIX_PATHS = 8192; + + + /** + * Constructs a RecursiveDirectoryIterator + * @link http://www.php.net/manual/en/recursivedirectoryiterator.construct.php + * @param path + * @param flags[optional] + */ + public function __construct ($path, $flags) {} + + /** + * Returns whether current entry is a directory and not '.' or '..' + * @link http://www.php.net/manual/en/recursivedirectoryiterator.haschildren.php + * @param allow_links bool[optional]

+ *

+ * @return bool whether the current entry is a directory, but not '.' or '..' + */ + public function hasChildren ($allow_links = null) {} + + /** + * Returns an iterator for the current entry if it is a directory + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getchildren.php + * @return object An iterator for the current entry, if it is a directory. + */ + public function getChildren () {} + + /** + * Get sub path + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getsubpath.php + * @return string The sub path (sub directory). + */ + public function getSubPath () {} + + /** + * Get sub path and name + * @link http://www.php.net/manual/en/recursivedirectoryiterator.getsubpathname.php + * @return string The sub path (sub directory) and filename. + */ + public function getSubPathname () {} + + /** + * Rewinds back to the beginning + * @link http://www.php.net/manual/en/filesystemiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Move to the next file + * @link http://www.php.net/manual/en/filesystemiterator.next.php + * @return void + */ + public function next () {} + + /** + * Retrieve the key for the current file + * @link http://www.php.net/manual/en/filesystemiterator.key.php + * @return string the pathname or filename depending on the set flags. + * See the FilesystemIterator constants. + */ + public function key () {} + + /** + * The current file + * @link http://www.php.net/manual/en/filesystemiterator.current.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator constants. + */ + public function current () {} + + /** + * Get the handling flags + * @link http://www.php.net/manual/en/filesystemiterator.getflags.php + * @return int The integer value of the set flags. + */ + public function getFlags () {} + + /** + * Sets handling flags + * @link http://www.php.net/manual/en/filesystemiterator.setflags.php + * @param flags int[optional]

+ * The handling flags to set. + * See the FilesystemIterator constants. + *

+ * @return void + */ + public function setFlags ($flags = null) {} + + /** + * Return file name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * Get base name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getbasename.php + * @param suffix string[optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * Determine if current DirectoryIterator item is '.' or '..' + * @link http://www.php.net/manual/en/directoryiterator.isdot.php + * @return bool true if the entry is . or .., + * otherwise false + */ + public function isDot () {} + + /** + * Check whether current DirectoryIterator position is a valid file + * @link http://www.php.net/manual/en/directoryiterator.valid.php + * @return bool true if the position is valid, otherwise false + */ + public function valid () {} + + /** + * Seek to a DirectoryIterator item + * @link http://www.php.net/manual/en/directoryiterator.seek.php + * @param position int

+ * The zero-based numeric position to seek to. + *

+ * @return void + */ + public function seek ($position) {} + + /** + * Get file name as a string + * @link http://www.php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class GlobIterator extends FilesystemIterator implements Iterator, Traversable, SeekableIterator, Countable { + const CURRENT_MODE_MASK = 240; + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const KEY_MODE_MASK = 3840; + const KEY_AS_PATHNAME = 0; + const FOLLOW_SYMLINKS = 512; + const KEY_AS_FILENAME = 256; + const NEW_CURRENT_AND_KEY = 256; + const SKIP_DOTS = 4096; + const UNIX_PATHS = 8192; + + + /** + * Construct a directory using glob + * @link http://www.php.net/manual/en/globiterator.construct.php + * @param path + * @param flags[optional] + */ + public function __construct ($path, $flags) {} + + /** + * Get the number of directories and files + * @link http://www.php.net/manual/en/globiterator.count.php + * @return integer The number of returned directories and files, as an + * integer. + */ + public function count () {} + + /** + * Rewinds back to the beginning + * @link http://www.php.net/manual/en/filesystemiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Move to the next file + * @link http://www.php.net/manual/en/filesystemiterator.next.php + * @return void + */ + public function next () {} + + /** + * Retrieve the key for the current file + * @link http://www.php.net/manual/en/filesystemiterator.key.php + * @return string the pathname or filename depending on the set flags. + * See the FilesystemIterator constants. + */ + public function key () {} + + /** + * The current file + * @link http://www.php.net/manual/en/filesystemiterator.current.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator constants. + */ + public function current () {} + + /** + * Get the handling flags + * @link http://www.php.net/manual/en/filesystemiterator.getflags.php + * @return int The integer value of the set flags. + */ + public function getFlags () {} + + /** + * Sets handling flags + * @link http://www.php.net/manual/en/filesystemiterator.setflags.php + * @param flags int[optional]

+ * The handling flags to set. + * See the FilesystemIterator constants. + *

+ * @return void + */ + public function setFlags ($flags = null) {} + + /** + * Return file name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * Get base name of current DirectoryIterator item. + * @link http://www.php.net/manual/en/directoryiterator.getbasename.php + * @param suffix string[optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * Determine if current DirectoryIterator item is '.' or '..' + * @link http://www.php.net/manual/en/directoryiterator.isdot.php + * @return bool true if the entry is . or .., + * otherwise false + */ + public function isDot () {} + + /** + * Check whether current DirectoryIterator position is a valid file + * @link http://www.php.net/manual/en/directoryiterator.valid.php + * @return bool true if the position is valid, otherwise false + */ + public function valid () {} + + /** + * Seek to a DirectoryIterator item + * @link http://www.php.net/manual/en/directoryiterator.seek.php + * @param position int

+ * The zero-based numeric position to seek to. + *

+ * @return void + */ + public function seek ($position) {} + + /** + * Get file name as a string + * @link http://www.php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class SplFileObject extends SplFileInfo implements RecursiveIterator, Traversable, Iterator, SeekableIterator { + const DROP_NEW_LINE = 1; + const READ_AHEAD = 2; + const SKIP_EMPTY = 6; + const READ_CSV = 8; + + + /** + * Construct a new file object. + * @link http://www.php.net/manual/en/splfileobject.construct.php + * @param file_name + * @param open_mode[optional] + * @param use_include_path[optional] + * @param context[optional] + */ + public function __construct ($file_name, $open_mode, $use_include_path, $context) {} + + /** + * Rewind the file to the first line + * @link http://www.php.net/manual/en/splfileobject.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Reached end of file + * @link http://www.php.net/manual/en/splfileobject.eof.php + * @return boolean true if file is at EOF, false otherwise. + */ + public function eof () {} + + /** + * Not at EOF + * @link http://www.php.net/manual/en/splfileobject.valid.php + * @return bool true if not reached EOF, false otherwise. + */ + public function valid () {} + + /** + * Gets line from file + * @link http://www.php.net/manual/en/splfileobject.fgets.php + * @return string a string containing the next line from the file, or false on error. + */ + public function fgets () {} + + /** + * Gets line from file and parse as CSV fields + * @link http://www.php.net/manual/en/splfileobject.fgetcsv.php + * @param delimiter string[optional]

+ * The field delimiter (one character only). Defaults as a comma or the value set using SplFileObject::setCsvControl. + *

+ * @param enclosure string[optional]

+ * The field enclosure character (one character only). Defaults as a double quotation mark or the value set using SplFileObject::setCsvControl. + *

+ * @param escape string[optional]

+ * The escape character (one character only). Defaults as a backslash (\) or the value set using SplFileObject::setCsvControl. + *

+ * @return array an indexed array containing the fields read, or false on error. + *

+ *

+ * A blank line in a CSV file will be returned as an array + * comprising a single &null; field unless using SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, + * in which case empty lines are skipped. + */ + public function fgetcsv ($delimiter = null, $enclosure = null, $escape = null) {} + + /** + * Set the delimiter and enclosure character for CSV + * @link http://www.php.net/manual/en/splfileobject.setcsvcontrol.php + * @param delimiter string[optional]

+ * The field delimiter (one character only). + *

+ * @param enclosure string[optional]

+ * The field enclosure character (one character only). + *

+ * @param escape string[optional]

+ * The field escape character (one character only). + *

+ * @return void + */ + public function setCsvControl ($delimiter = null, $enclosure = null, $escape = null) {} + + /** + * Get the delimiter and enclosure character for CSV + * @link http://www.php.net/manual/en/splfileobject.getcsvcontrol.php + * @return array an indexed array containing the delimiter and enclosure character. + */ + public function getCsvControl () {} + + /** + * Portable file locking + * @link http://www.php.net/manual/en/splfileobject.flock.php + * @param operation int

+ * operation is one of the following: + * LOCK_SH to acquire a shared lock (reader). + * @param wouldblock int[optional]

+ * Set to true if the lock would block (EWOULDBLOCK errno condition). + *

+ * @return bool Returns true on success or false on failure. + */ + public function flock ($operation, &$wouldblock = null) {} + + /** + * Flushes the output to the file + * @link http://www.php.net/manual/en/splfileobject.fflush.php + * @return boolean Returns true on success or false on failure. + */ + public function fflush () {} + + /** + * Return current file position + * @link http://www.php.net/manual/en/splfileobject.ftell.php + * @return int the position of the file pointer as an integer, or false on error. + */ + public function ftell () {} + + /** + * Seek to a position + * @link http://www.php.net/manual/en/splfileobject.fseek.php + * @param offset int

+ * The offset. A negative value can be used to move backwards through the file which + * is useful when SEEK_END is used as the whence value. + *

+ * @param whence int[optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + * SEEK_END - Set position to end-of-file plus offset. + *

+ *

+ * If whence is not specified, it is assumed to be SEEK_SET. + *

+ * @return int 0 if the seek was successful, -1 otherwise. Note that seeking + * past EOF is not considered an error. + */ + public function fseek ($offset, $whence = null) {} + + /** + * Gets character from file + * @link http://www.php.net/manual/en/splfileobject.fgetc.php + * @return string a string containing a single character read from the file or false on EOF. + */ + public function fgetc () {} + + /** + * Output all remaining data on a file pointer + * @link http://www.php.net/manual/en/splfileobject.fpassthru.php + * @return int the number of characters read from handle + * and passed through to the output. + */ + public function fpassthru () {} + + /** + * Gets line from file and strip HTML tags + * @link http://www.php.net/manual/en/splfileobject.fgetss.php + * @param allowable_tags string[optional]

+ * You can use the optional third parameter to specify tags which should + * not be stripped. + *

+ * @return string a string containing the next line of the file with HTML and PHP + * code stripped, or false on error. + */ + public function fgetss ($allowable_tags = null) {} + + /** + * Parses input from file according to a format + * @link http://www.php.net/manual/en/splfileobject.fscanf.php + * @param format string

+ * The specified format as described in the sprintf documentation. + *

+ * @param _ mixed[optional] + * @return mixed If only two parameters were passed to this method, the values parsed will be + * returned as an array. Otherwise, if optional parameters are passed, the + * function will return the number of assigned values. The optional + * parameters must be passed by reference. + */ + public function fscanf ($format, &$_ = null) {} + + /** + * Write to file + * @link http://www.php.net/manual/en/splfileobject.fwrite.php + * @param str string

+ * The string to be written to the file. + *

+ * @param length int[optional]

+ * If the length argument is given, writing will + * stop after length bytes have been written or + * the end of string is reached, whichever comes + * first. + *

+ * @return int the number of bytes written, or &null; on error. + */ + public function fwrite ($str, $length = null) {} + + /** + * Gets information about the file + * @link http://www.php.net/manual/en/splfileobject.fstat.php + * @return array an array with the statistics of the file; the format of the array + * is described in detail on the stat manual page. + */ + public function fstat () {} + + /** + * Truncates the file to a given length + * @link http://www.php.net/manual/en/splfileobject.ftruncate.php + * @param size int

+ * The size to truncate to. + *

+ *

+ * If size is larger than the file it is extended with null bytes. + *

+ *

+ * If size is smaller than the file, the extra data will be lost. + *

+ * @return bool Returns true on success or false on failure. + */ + public function ftruncate ($size) {} + + /** + * Retrieve current line of file + * @link http://www.php.net/manual/en/splfileobject.current.php + * @return string|array Retrieves the current line of the file. If the SplFileObject::READ_CSV flag is set, this method returns an array containing the current line parsed as CSV data. + */ + public function current () {} + + /** + * Get line number + * @link http://www.php.net/manual/en/splfileobject.key.php + * @return int the current line number. + */ + public function key () {} + + /** + * Read next line + * @link http://www.php.net/manual/en/splfileobject.next.php + * @return void + */ + public function next () {} + + /** + * Sets flags for the SplFileObject + * @link http://www.php.net/manual/en/splfileobject.setflags.php + * @param flags int

+ * Bit mask of the flags to set. See + * SplFileObject constants + * for the available flags. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Gets flags for the SplFileObject + * @link http://www.php.net/manual/en/splfileobject.getflags.php + * @return int an integer representing the flags. + */ + public function getFlags () {} + + /** + * Set maximum line length + * @link http://www.php.net/manual/en/splfileobject.setmaxlinelen.php + * @param max_len int

+ * The maximum length of a line. + *

+ * @return void + */ + public function setMaxLineLen ($max_len) {} + + /** + * Get maximum line length + * @link http://www.php.net/manual/en/splfileobject.getmaxlinelen.php + * @return int the maximum line length if one has been set with + * SplFileObject::setMaxLineLen, default is 0. + */ + public function getMaxLineLen () {} + + /** + * SplFileObject does not have children + * @link http://www.php.net/manual/en/splfileobject.haschildren.php + * @return bool false + */ + public function hasChildren () {} + + /** + * No purpose + * @link http://www.php.net/manual/en/splfileobject.getchildren.php + * @return void + */ + public function getChildren () {} + + /** + * Seek to specified line + * @link http://www.php.net/manual/en/splfileobject.seek.php + * @param line_pos int

+ * The zero-based line number to seek to. + *

+ * @return void + */ + public function seek ($line_pos) {} + + /** + * Alias of SplFileObject::fgets + * @link http://www.php.net/manual/en/splfileobject.getcurrentline.php + */ + public function getCurrentLine () {} + + /** + * Alias of SplFileObject::current + * @link http://www.php.net/manual/en/splfileobject.tostring.php + */ + public function __toString () {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the filename + * @link http://www.php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * Gets the base name of the file + * @link http://www.php.net/manual/en/splfileinfo.getbasename.php + * @param suffix string[optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class SplTempFileObject extends SplFileObject implements SeekableIterator, Iterator, Traversable, RecursiveIterator { + const DROP_NEW_LINE = 1; + const READ_AHEAD = 2; + const SKIP_EMPTY = 6; + const READ_CSV = 8; + + + /** + * Construct a new temporary file object + * @link http://www.php.net/manual/en/spltempfileobject.construct.php + * @param max_memory[optional] + */ + public function __construct ($max_memory) {} + + /** + * Rewind the file to the first line + * @link http://www.php.net/manual/en/splfileobject.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Reached end of file + * @link http://www.php.net/manual/en/splfileobject.eof.php + * @return boolean true if file is at EOF, false otherwise. + */ + public function eof () {} + + /** + * Not at EOF + * @link http://www.php.net/manual/en/splfileobject.valid.php + * @return bool true if not reached EOF, false otherwise. + */ + public function valid () {} + + /** + * Gets line from file + * @link http://www.php.net/manual/en/splfileobject.fgets.php + * @return string a string containing the next line from the file, or false on error. + */ + public function fgets () {} + + /** + * Gets line from file and parse as CSV fields + * @link http://www.php.net/manual/en/splfileobject.fgetcsv.php + * @param delimiter string[optional]

+ * The field delimiter (one character only). Defaults as a comma or the value set using SplFileObject::setCsvControl. + *

+ * @param enclosure string[optional]

+ * The field enclosure character (one character only). Defaults as a double quotation mark or the value set using SplFileObject::setCsvControl. + *

+ * @param escape string[optional]

+ * The escape character (one character only). Defaults as a backslash (\) or the value set using SplFileObject::setCsvControl. + *

+ * @return array an indexed array containing the fields read, or false on error. + *

+ *

+ * A blank line in a CSV file will be returned as an array + * comprising a single &null; field unless using SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, + * in which case empty lines are skipped. + */ + public function fgetcsv ($delimiter = null, $enclosure = null, $escape = null) {} + + /** + * Set the delimiter and enclosure character for CSV + * @link http://www.php.net/manual/en/splfileobject.setcsvcontrol.php + * @param delimiter string[optional]

+ * The field delimiter (one character only). + *

+ * @param enclosure string[optional]

+ * The field enclosure character (one character only). + *

+ * @param escape string[optional]

+ * The field escape character (one character only). + *

+ * @return void + */ + public function setCsvControl ($delimiter = null, $enclosure = null, $escape = null) {} + + /** + * Get the delimiter and enclosure character for CSV + * @link http://www.php.net/manual/en/splfileobject.getcsvcontrol.php + * @return array an indexed array containing the delimiter and enclosure character. + */ + public function getCsvControl () {} + + /** + * Portable file locking + * @link http://www.php.net/manual/en/splfileobject.flock.php + * @param operation int

+ * operation is one of the following: + * LOCK_SH to acquire a shared lock (reader). + * @param wouldblock int[optional]

+ * Set to true if the lock would block (EWOULDBLOCK errno condition). + *

+ * @return bool Returns true on success or false on failure. + */ + public function flock ($operation, &$wouldblock = null) {} + + /** + * Flushes the output to the file + * @link http://www.php.net/manual/en/splfileobject.fflush.php + * @return boolean Returns true on success or false on failure. + */ + public function fflush () {} + + /** + * Return current file position + * @link http://www.php.net/manual/en/splfileobject.ftell.php + * @return int the position of the file pointer as an integer, or false on error. + */ + public function ftell () {} + + /** + * Seek to a position + * @link http://www.php.net/manual/en/splfileobject.fseek.php + * @param offset int

+ * The offset. A negative value can be used to move backwards through the file which + * is useful when SEEK_END is used as the whence value. + *

+ * @param whence int[optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + * SEEK_END - Set position to end-of-file plus offset. + *

+ *

+ * If whence is not specified, it is assumed to be SEEK_SET. + *

+ * @return int 0 if the seek was successful, -1 otherwise. Note that seeking + * past EOF is not considered an error. + */ + public function fseek ($offset, $whence = null) {} + + /** + * Gets character from file + * @link http://www.php.net/manual/en/splfileobject.fgetc.php + * @return string a string containing a single character read from the file or false on EOF. + */ + public function fgetc () {} + + /** + * Output all remaining data on a file pointer + * @link http://www.php.net/manual/en/splfileobject.fpassthru.php + * @return int the number of characters read from handle + * and passed through to the output. + */ + public function fpassthru () {} + + /** + * Gets line from file and strip HTML tags + * @link http://www.php.net/manual/en/splfileobject.fgetss.php + * @param allowable_tags string[optional]

+ * You can use the optional third parameter to specify tags which should + * not be stripped. + *

+ * @return string a string containing the next line of the file with HTML and PHP + * code stripped, or false on error. + */ + public function fgetss ($allowable_tags = null) {} + + /** + * Parses input from file according to a format + * @link http://www.php.net/manual/en/splfileobject.fscanf.php + * @param format string

+ * The specified format as described in the sprintf documentation. + *

+ * @param _ mixed[optional] + * @return mixed If only two parameters were passed to this method, the values parsed will be + * returned as an array. Otherwise, if optional parameters are passed, the + * function will return the number of assigned values. The optional + * parameters must be passed by reference. + */ + public function fscanf ($format, &$_ = null) {} + + /** + * Write to file + * @link http://www.php.net/manual/en/splfileobject.fwrite.php + * @param str string

+ * The string to be written to the file. + *

+ * @param length int[optional]

+ * If the length argument is given, writing will + * stop after length bytes have been written or + * the end of string is reached, whichever comes + * first. + *

+ * @return int the number of bytes written, or &null; on error. + */ + public function fwrite ($str, $length = null) {} + + /** + * Gets information about the file + * @link http://www.php.net/manual/en/splfileobject.fstat.php + * @return array an array with the statistics of the file; the format of the array + * is described in detail on the stat manual page. + */ + public function fstat () {} + + /** + * Truncates the file to a given length + * @link http://www.php.net/manual/en/splfileobject.ftruncate.php + * @param size int

+ * The size to truncate to. + *

+ *

+ * If size is larger than the file it is extended with null bytes. + *

+ *

+ * If size is smaller than the file, the extra data will be lost. + *

+ * @return bool Returns true on success or false on failure. + */ + public function ftruncate ($size) {} + + /** + * Retrieve current line of file + * @link http://www.php.net/manual/en/splfileobject.current.php + * @return string|array Retrieves the current line of the file. If the SplFileObject::READ_CSV flag is set, this method returns an array containing the current line parsed as CSV data. + */ + public function current () {} + + /** + * Get line number + * @link http://www.php.net/manual/en/splfileobject.key.php + * @return int the current line number. + */ + public function key () {} + + /** + * Read next line + * @link http://www.php.net/manual/en/splfileobject.next.php + * @return void + */ + public function next () {} + + /** + * Sets flags for the SplFileObject + * @link http://www.php.net/manual/en/splfileobject.setflags.php + * @param flags int

+ * Bit mask of the flags to set. See + * SplFileObject constants + * for the available flags. + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Gets flags for the SplFileObject + * @link http://www.php.net/manual/en/splfileobject.getflags.php + * @return int an integer representing the flags. + */ + public function getFlags () {} + + /** + * Set maximum line length + * @link http://www.php.net/manual/en/splfileobject.setmaxlinelen.php + * @param max_len int

+ * The maximum length of a line. + *

+ * @return void + */ + public function setMaxLineLen ($max_len) {} + + /** + * Get maximum line length + * @link http://www.php.net/manual/en/splfileobject.getmaxlinelen.php + * @return int the maximum line length if one has been set with + * SplFileObject::setMaxLineLen, default is 0. + */ + public function getMaxLineLen () {} + + /** + * SplFileObject does not have children + * @link http://www.php.net/manual/en/splfileobject.haschildren.php + * @return bool false + */ + public function hasChildren () {} + + /** + * No purpose + * @link http://www.php.net/manual/en/splfileobject.getchildren.php + * @return void + */ + public function getChildren () {} + + /** + * Seek to specified line + * @link http://www.php.net/manual/en/splfileobject.seek.php + * @param line_pos int

+ * The zero-based line number to seek to. + *

+ * @return void + */ + public function seek ($line_pos) {} + + /** + * Alias of SplFileObject::fgets + * @link http://www.php.net/manual/en/splfileobject.getcurrentline.php + */ + public function getCurrentLine () {} + + /** + * Alias of SplFileObject::current + * @link http://www.php.net/manual/en/splfileobject.tostring.php + */ + public function __toString () {} + + /** + * Gets the path without filename + * @link http://www.php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * Gets the filename + * @link http://www.php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * Gets the base name of the file + * @link http://www.php.net/manual/en/splfileinfo.getbasename.php + * @param suffix string[optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * Gets the path to the file + * @link http://www.php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * Gets file permissions + * @link http://www.php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * Gets the inode for the file + * @link http://www.php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * Gets file size + * @link http://www.php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * Gets the owner of the file + * @link http://www.php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * Gets the file group + * @link http://www.php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * Gets last access time of the file + * @link http://www.php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * Gets the last modified time + * @link http://www.php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * Gets the inode change time + * @link http://www.php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * Gets file type + * @link http://www.php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * Tells if the entry is writable + * @link http://www.php.net/manual/en/splfileinfo.iswritable.php + * @return bool true if writable, false otherwise; + */ + public function isWritable () {} + + /** + * Tells if file is readable + * @link http://www.php.net/manual/en/splfileinfo.isreadable.php + * @return bool true if readable, false otherwise. + */ + public function isReadable () {} + + /** + * Tells if the file is executable + * @link http://www.php.net/manual/en/splfileinfo.isexecutable.php + * @return bool true if executable, false otherwise. + */ + public function isExecutable () {} + + /** + * Tells if the object references a regular file + * @link http://www.php.net/manual/en/splfileinfo.isfile.php + * @return bool true if the file exists and is a regular file (not a link), false otherwise. + */ + public function isFile () {} + + /** + * Tells if the file is a directory + * @link http://www.php.net/manual/en/splfileinfo.isdir.php + * @return bool true if a directory, false otherwise. + */ + public function isDir () {} + + /** + * Tells if the file is a link + * @link http://www.php.net/manual/en/splfileinfo.islink.php + * @return bool true if the file is a link, false otherwise. + */ + public function isLink () {} + + /** + * Gets the target of a link + * @link http://www.php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * Gets absolute path to file + * @link http://www.php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * Gets an SplFileInfo object for the file + * @link http://www.php.net/manual/en/splfileinfo.getfileinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * Gets an SplFileInfo object for the path + * @link http://www.php.net/manual/en/splfileinfo.getpathinfo.php + * @param class_name string[optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * Gets an SplFileObject object for the file + * @link http://www.php.net/manual/en/splfileinfo.openfile.php + * @param open_mode string[optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param use_include_path bool[optional]

+ * ¶meter.use_include_path; + *

+ * @param context resource[optional]

+ * ¶meter.context; + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = null, $use_include_path = null, $context = null) {} + + /** + * Sets the class name used with SplFileInfo::openFile + * @link http://www.php.net/manual/en/splfileinfo.setfileclass.php + * @param class_name string[optional]

+ * The class name to use when openFile() is called. + *

+ * @return void + */ + public function setFileClass ($class_name = null) {} + + /** + * Sets the class used with getFileInfo and getPathInfo + * @link http://www.php.net/manual/en/splfileinfo.setinfoclass.php + * @param class_name string[optional]

+ * The class name to use. + *

+ * @return void + */ + public function setInfoClass ($class_name = null) {} + +} + +/** @jms-builtin */ +class SplDoublyLinkedList implements Iterator, Traversable, Countable, ArrayAccess { + const IT_MODE_LIFO = 2; + const IT_MODE_FIFO = 0; + const IT_MODE_DELETE = 1; + const IT_MODE_KEEP = 0; + + + /** + * Pops a node from the end of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.pop.php + * @return mixed The value of the popped node. + */ + public function pop () {} + + /** + * Shifts a node from the beginning of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.shift.php + * @return mixed The value of the shifted node. + */ + public function shift () {} + + /** + * Pushes an element at the end of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.push.php + * @param value mixed

+ * The value to push. + *

+ * @return void + */ + public function push ($value) {} + + /** + * Prepends the doubly linked list with an element + * @link http://www.php.net/manual/en/spldoublylinkedlist.unshift.php + * @param value mixed

+ * The value to unshift. + *

+ * @return void + */ + public function unshift ($value) {} + + /** + * Peeks at the node from the end of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.top.php + * @return mixed The value of the last node. + */ + public function top () {} + + /** + * Peeks at the node from the beginning of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.bottom.php + * @return mixed The value of the first node. + */ + public function bottom () {} + + /** + * Counts the number of elements in the doubly linked list. + * @link http://www.php.net/manual/en/spldoublylinkedlist.count.php + * @return int the number of elements in the doubly linked list. + */ + public function count () {} + + /** + * Checks whether the doubly linked list is empty. + * @link http://www.php.net/manual/en/spldoublylinkedlist.isempty.php + * @return bool whether the doubly linked list is empty. + */ + public function isEmpty () {} + + /** + * Sets the mode of iteration + * @link http://www.php.net/manual/en/spldoublylinkedlist.setiteratormode.php + * @param mode int

+ * There are two orthogonal sets of modes that can be set: + *

+ * The direction of the iteration (either one or the other): + * SplDoublyLinkedList::IT_MODE_LIFO (Stack style) + * @return void + */ + public function setIteratorMode ($mode) {} + + /** + * Returns the mode of iteration + * @link http://www.php.net/manual/en/spldoublylinkedlist.getiteratormode.php + * @return int the different modes and flags that affect the iteration. + */ + public function getIteratorMode () {} + + /** + * Returns whether the requested $index exists + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetexists.php + * @param index mixed

+ * The index being checked. + *

+ * @return bool true if the requested index exists, otherwise false + */ + public function offsetExists ($index) {} + + /** + * Returns the value at the specified $index + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetget.php + * @param index mixed

+ * The index with the value. + *

+ * @return mixed The value at the specified index. + */ + public function offsetGet ($index) {} + + /** + * Sets the value at the specified $index to $newval + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetset.php + * @param index mixed

+ * The index being set. + *

+ * @param newval mixed

+ * The new value for the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * Unsets the value at the specified $index + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetunset.php + * @param index mixed

+ * The index being unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * Rewind iterator back to the start + * @link http://www.php.net/manual/en/spldoublylinkedlist.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current array entry + * @link http://www.php.net/manual/en/spldoublylinkedlist.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * Return current node index + * @link http://www.php.net/manual/en/spldoublylinkedlist.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * Move to next entry + * @link http://www.php.net/manual/en/spldoublylinkedlist.next.php + * @return void + */ + public function next () {} + + /** + * Move to previous entry + * @link http://www.php.net/manual/en/spldoublylinkedlist.prev.php + * @return void + */ + public function prev () {} + + /** + * Check whether the doubly linked list contains more nodes + * @link http://www.php.net/manual/en/spldoublylinkedlist.valid.php + * @return bool true if the doubly linked list contains any more nodes, false otherwise. + */ + public function valid () {} + +} + +/** @jms-builtin */ +class SplQueue extends SplDoublyLinkedList implements ArrayAccess, Countable, Traversable, Iterator { + const IT_MODE_LIFO = 2; + const IT_MODE_FIFO = 0; + const IT_MODE_DELETE = 1; + const IT_MODE_KEEP = 0; + + + /** + * Adds an element to the queue. + * @link http://www.php.net/manual/en/splqueue.enqueue.php + * @param value mixed

+ * The value to enqueue. + *

+ * @return void + */ + public function enqueue ($value) {} + + /** + * Dequeues a node from the queue + * @link http://www.php.net/manual/en/splqueue.dequeue.php + * @return mixed The value of the dequeued node. + */ + public function dequeue () {} + + /** + * Pops a node from the end of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.pop.php + * @return mixed The value of the popped node. + */ + public function pop () {} + + /** + * Shifts a node from the beginning of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.shift.php + * @return mixed The value of the shifted node. + */ + public function shift () {} + + /** + * Pushes an element at the end of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.push.php + * @param value mixed

+ * The value to push. + *

+ * @return void + */ + public function push ($value) {} + + /** + * Prepends the doubly linked list with an element + * @link http://www.php.net/manual/en/spldoublylinkedlist.unshift.php + * @param value mixed

+ * The value to unshift. + *

+ * @return void + */ + public function unshift ($value) {} + + /** + * Peeks at the node from the end of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.top.php + * @return mixed The value of the last node. + */ + public function top () {} + + /** + * Peeks at the node from the beginning of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.bottom.php + * @return mixed The value of the first node. + */ + public function bottom () {} + + /** + * Counts the number of elements in the doubly linked list. + * @link http://www.php.net/manual/en/spldoublylinkedlist.count.php + * @return int the number of elements in the doubly linked list. + */ + public function count () {} + + /** + * Checks whether the doubly linked list is empty. + * @link http://www.php.net/manual/en/spldoublylinkedlist.isempty.php + * @return bool whether the doubly linked list is empty. + */ + public function isEmpty () {} + + /** + * Sets the mode of iteration + * @link http://www.php.net/manual/en/spldoublylinkedlist.setiteratormode.php + * @param mode int

+ * There are two orthogonal sets of modes that can be set: + *

+ * The direction of the iteration (either one or the other): + * SplDoublyLinkedList::IT_MODE_LIFO (Stack style) + * @return void + */ + public function setIteratorMode ($mode) {} + + /** + * Returns the mode of iteration + * @link http://www.php.net/manual/en/spldoublylinkedlist.getiteratormode.php + * @return int the different modes and flags that affect the iteration. + */ + public function getIteratorMode () {} + + /** + * Returns whether the requested $index exists + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetexists.php + * @param index mixed

+ * The index being checked. + *

+ * @return bool true if the requested index exists, otherwise false + */ + public function offsetExists ($index) {} + + /** + * Returns the value at the specified $index + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetget.php + * @param index mixed

+ * The index with the value. + *

+ * @return mixed The value at the specified index. + */ + public function offsetGet ($index) {} + + /** + * Sets the value at the specified $index to $newval + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetset.php + * @param index mixed

+ * The index being set. + *

+ * @param newval mixed

+ * The new value for the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * Unsets the value at the specified $index + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetunset.php + * @param index mixed

+ * The index being unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * Rewind iterator back to the start + * @link http://www.php.net/manual/en/spldoublylinkedlist.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current array entry + * @link http://www.php.net/manual/en/spldoublylinkedlist.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * Return current node index + * @link http://www.php.net/manual/en/spldoublylinkedlist.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * Move to next entry + * @link http://www.php.net/manual/en/spldoublylinkedlist.next.php + * @return void + */ + public function next () {} + + /** + * Move to previous entry + * @link http://www.php.net/manual/en/spldoublylinkedlist.prev.php + * @return void + */ + public function prev () {} + + /** + * Check whether the doubly linked list contains more nodes + * @link http://www.php.net/manual/en/spldoublylinkedlist.valid.php + * @return bool true if the doubly linked list contains any more nodes, false otherwise. + */ + public function valid () {} + +} + +/** @jms-builtin */ +class SplStack extends SplDoublyLinkedList implements ArrayAccess, Countable, Traversable, Iterator { + const IT_MODE_LIFO = 2; + const IT_MODE_FIFO = 0; + const IT_MODE_DELETE = 1; + const IT_MODE_KEEP = 0; + + + /** + * Pops a node from the end of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.pop.php + * @return mixed The value of the popped node. + */ + public function pop () {} + + /** + * Shifts a node from the beginning of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.shift.php + * @return mixed The value of the shifted node. + */ + public function shift () {} + + /** + * Pushes an element at the end of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.push.php + * @param value mixed

+ * The value to push. + *

+ * @return void + */ + public function push ($value) {} + + /** + * Prepends the doubly linked list with an element + * @link http://www.php.net/manual/en/spldoublylinkedlist.unshift.php + * @param value mixed

+ * The value to unshift. + *

+ * @return void + */ + public function unshift ($value) {} + + /** + * Peeks at the node from the end of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.top.php + * @return mixed The value of the last node. + */ + public function top () {} + + /** + * Peeks at the node from the beginning of the doubly linked list + * @link http://www.php.net/manual/en/spldoublylinkedlist.bottom.php + * @return mixed The value of the first node. + */ + public function bottom () {} + + /** + * Counts the number of elements in the doubly linked list. + * @link http://www.php.net/manual/en/spldoublylinkedlist.count.php + * @return int the number of elements in the doubly linked list. + */ + public function count () {} + + /** + * Checks whether the doubly linked list is empty. + * @link http://www.php.net/manual/en/spldoublylinkedlist.isempty.php + * @return bool whether the doubly linked list is empty. + */ + public function isEmpty () {} + + /** + * Sets the mode of iteration + * @link http://www.php.net/manual/en/spldoublylinkedlist.setiteratormode.php + * @param mode int

+ * There are two orthogonal sets of modes that can be set: + *

+ * The direction of the iteration (either one or the other): + * SplDoublyLinkedList::IT_MODE_LIFO (Stack style) + * @return void + */ + public function setIteratorMode ($mode) {} + + /** + * Returns the mode of iteration + * @link http://www.php.net/manual/en/spldoublylinkedlist.getiteratormode.php + * @return int the different modes and flags that affect the iteration. + */ + public function getIteratorMode () {} + + /** + * Returns whether the requested $index exists + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetexists.php + * @param index mixed

+ * The index being checked. + *

+ * @return bool true if the requested index exists, otherwise false + */ + public function offsetExists ($index) {} + + /** + * Returns the value at the specified $index + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetget.php + * @param index mixed

+ * The index with the value. + *

+ * @return mixed The value at the specified index. + */ + public function offsetGet ($index) {} + + /** + * Sets the value at the specified $index to $newval + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetset.php + * @param index mixed

+ * The index being set. + *

+ * @param newval mixed

+ * The new value for the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * Unsets the value at the specified $index + * @link http://www.php.net/manual/en/spldoublylinkedlist.offsetunset.php + * @param index mixed

+ * The index being unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * Rewind iterator back to the start + * @link http://www.php.net/manual/en/spldoublylinkedlist.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current array entry + * @link http://www.php.net/manual/en/spldoublylinkedlist.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * Return current node index + * @link http://www.php.net/manual/en/spldoublylinkedlist.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * Move to next entry + * @link http://www.php.net/manual/en/spldoublylinkedlist.next.php + * @return void + */ + public function next () {} + + /** + * Move to previous entry + * @link http://www.php.net/manual/en/spldoublylinkedlist.prev.php + * @return void + */ + public function prev () {} + + /** + * Check whether the doubly linked list contains more nodes + * @link http://www.php.net/manual/en/spldoublylinkedlist.valid.php + * @return bool true if the doubly linked list contains any more nodes, false otherwise. + */ + public function valid () {} + +} + +abstract class SplHeap implements Iterator, Traversable, Countable { + + /** + * Extracts a node from top of the heap and sift up. + * @link http://www.php.net/manual/en/splheap.extract.php + * @return mixed The value of the extracted node. + */ + public function extract () {} + + /** + * Inserts an element in the heap by sifting it up. + * @link http://www.php.net/manual/en/splheap.insert.php + * @param value mixed

+ * The value to insert. + *

+ * @return void + */ + public function insert ($value) {} + + /** + * Peaks at the node from the top of the heap + * @link http://www.php.net/manual/en/splheap.top.php + * @return mixed The value of the node on the top. + */ + public function top () {} + + /** + * Counts the number of elements in the heap. + * @link http://www.php.net/manual/en/splheap.count.php + * @return int the number of elements in the heap. + */ + public function count () {} + + /** + * Checks whether the heap is empty. + * @link http://www.php.net/manual/en/splheap.isempty.php + * @return bool whether the heap is empty. + */ + public function isEmpty () {} + + /** + * Rewind iterator back to the start (no-op) + * @link http://www.php.net/manual/en/splheap.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current node pointed by the iterator + * @link http://www.php.net/manual/en/splheap.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * Return current node index + * @link http://www.php.net/manual/en/splheap.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * Move to the next node + * @link http://www.php.net/manual/en/splheap.next.php + * @return void + */ + public function next () {} + + /** + * Check whether the heap contains more nodes + * @link http://www.php.net/manual/en/splheap.valid.php + * @return bool true if the heap contains any more nodes, false otherwise. + */ + public function valid () {} + + /** + * Recover from the corrupted state and allow further actions on the heap. + * @link http://www.php.net/manual/en/splheap.recoverfromcorruption.php + * @return void + */ + public function recoverFromCorruption () {} + + /** + * Compare elements in order to place them correctly in the heap while sifting up. + * @link http://www.php.net/manual/en/splheap.compare.php + * @param value1 mixed

+ * The value of the first node being compared. + *

+ * @param value2 mixed

+ * The value of the second node being compared. + *

+ * @return int Result of the comparison, positive integer if value1 is greater than value2, 0 if they are equal, negative integer otherwise. + *

+ *

+ * Having multiple elements with the same value in a Heap is not recommended. They will end up in an arbitrary relative position. + */ + abstract protected function compare ($value1, $value2) {} + +} + +/** @jms-builtin */ +class SplMinHeap extends SplHeap implements Countable, Traversable, Iterator { + + /** + * Compare elements in order to place them correctly in the heap while sifting up. + * @link http://www.php.net/manual/en/splminheap.compare.php + * @param value1 mixed

+ * The value of the first node being compared. + *

+ * @param value2 mixed

+ * The value of the second node being compared. + *

+ * @return void Result of the comparison, positive integer if value1 is lower than value2, 0 if they are equal, negative integer otherwise. + *

+ *

+ * Having multiple elements with the same value in a Heap is not recommended. They will end up in an arbitrary relative position. + */ + protected function compare ($value1, $value2) {} + + /** + * Extracts a node from top of the heap and sift up. + * @link http://www.php.net/manual/en/splheap.extract.php + * @return mixed The value of the extracted node. + */ + public function extract () {} + + /** + * Inserts an element in the heap by sifting it up. + * @link http://www.php.net/manual/en/splheap.insert.php + * @param value mixed

+ * The value to insert. + *

+ * @return void + */ + public function insert ($value) {} + + /** + * Peaks at the node from the top of the heap + * @link http://www.php.net/manual/en/splheap.top.php + * @return mixed The value of the node on the top. + */ + public function top () {} + + /** + * Counts the number of elements in the heap. + * @link http://www.php.net/manual/en/splheap.count.php + * @return int the number of elements in the heap. + */ + public function count () {} + + /** + * Checks whether the heap is empty. + * @link http://www.php.net/manual/en/splheap.isempty.php + * @return bool whether the heap is empty. + */ + public function isEmpty () {} + + /** + * Rewind iterator back to the start (no-op) + * @link http://www.php.net/manual/en/splheap.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current node pointed by the iterator + * @link http://www.php.net/manual/en/splheap.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * Return current node index + * @link http://www.php.net/manual/en/splheap.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * Move to the next node + * @link http://www.php.net/manual/en/splheap.next.php + * @return void + */ + public function next () {} + + /** + * Check whether the heap contains more nodes + * @link http://www.php.net/manual/en/splheap.valid.php + * @return bool true if the heap contains any more nodes, false otherwise. + */ + public function valid () {} + + /** + * Recover from the corrupted state and allow further actions on the heap. + * @link http://www.php.net/manual/en/splheap.recoverfromcorruption.php + * @return void + */ + public function recoverFromCorruption () {} + +} + +/** @jms-builtin */ +class SplMaxHeap extends SplHeap implements Countable, Traversable, Iterator { + + /** + * Compare elements in order to place them correctly in the heap while sifting up. + * @link http://www.php.net/manual/en/splmaxheap.compare.php + * @param value1 mixed

+ * The value of the first node being compared. + *

+ * @param value2 mixed

+ * The value of the second node being compared. + *

+ * @return void Result of the comparison, positive integer if value1 is greater than value2, 0 if they are equal, negative integer otherwise. + *

+ *

+ * Having multiple elements with the same value in a Heap is not recommended. They will end up in an arbitrary relative position. + */ + protected function compare ($value1, $value2) {} + + /** + * Extracts a node from top of the heap and sift up. + * @link http://www.php.net/manual/en/splheap.extract.php + * @return mixed The value of the extracted node. + */ + public function extract () {} + + /** + * Inserts an element in the heap by sifting it up. + * @link http://www.php.net/manual/en/splheap.insert.php + * @param value mixed

+ * The value to insert. + *

+ * @return void + */ + public function insert ($value) {} + + /** + * Peaks at the node from the top of the heap + * @link http://www.php.net/manual/en/splheap.top.php + * @return mixed The value of the node on the top. + */ + public function top () {} + + /** + * Counts the number of elements in the heap. + * @link http://www.php.net/manual/en/splheap.count.php + * @return int the number of elements in the heap. + */ + public function count () {} + + /** + * Checks whether the heap is empty. + * @link http://www.php.net/manual/en/splheap.isempty.php + * @return bool whether the heap is empty. + */ + public function isEmpty () {} + + /** + * Rewind iterator back to the start (no-op) + * @link http://www.php.net/manual/en/splheap.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current node pointed by the iterator + * @link http://www.php.net/manual/en/splheap.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * Return current node index + * @link http://www.php.net/manual/en/splheap.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * Move to the next node + * @link http://www.php.net/manual/en/splheap.next.php + * @return void + */ + public function next () {} + + /** + * Check whether the heap contains more nodes + * @link http://www.php.net/manual/en/splheap.valid.php + * @return bool true if the heap contains any more nodes, false otherwise. + */ + public function valid () {} + + /** + * Recover from the corrupted state and allow further actions on the heap. + * @link http://www.php.net/manual/en/splheap.recoverfromcorruption.php + * @return void + */ + public function recoverFromCorruption () {} + +} + +/** @jms-builtin */ +class SplPriorityQueue implements Iterator, Traversable, Countable { + const EXTR_BOTH = 3; + const EXTR_PRIORITY = 2; + const EXTR_DATA = 1; + + + /** + * Compare priorities in order to place elements correctly in the heap while sifting up. + * @link http://www.php.net/manual/en/splpriorityqueue.compare.php + * @param priority1 mixed

+ * The priority of the first node being compared. + *

+ * @param priority2 mixed

+ * The priority of the second node being compared. + *

+ * @return int Result of the comparison, positive integer if priority1 is greater than priority2, 0 if they are equal, negative integer otherwise. + *

+ *

+ * Multiple elements with the same priority will get dequeued in no particular order. + */ + public function compare ($priority1, $priority2) {} + + /** + * Inserts an element in the queue by sifting it up. + * @link http://www.php.net/manual/en/splpriorityqueue.insert.php + * @param value mixed

+ * The value to insert. + *

+ * @param priority mixed

+ * The associated priority. + *

+ * @return void + */ + public function insert ($value, $priority) {} + + /** + * Sets the mode of extraction + * @link http://www.php.net/manual/en/splpriorityqueue.setextractflags.php + * @param flags int

+ * Defines what is extracted by SplPriorityQueue::current, + * SplPriorityQueue::top and + * SplPriorityQueue::extract. + *

+ * SplPriorityQueue::EXTR_DATA (0x00000001): Extract the data + * @return void + */ + public function setExtractFlags ($flags) {} + + /** + * Peaks at the node from the top of the queue + * @link http://www.php.net/manual/en/splpriorityqueue.top.php + * @return mixed The value or priority (or both) of the top node, depending on the extract flag. + */ + public function top () {} + + /** + * Extracts a node from top of the heap and sift up. + * @link http://www.php.net/manual/en/splpriorityqueue.extract.php + * @return mixed The value or priority (or both) of the extracted node, depending on the extract flag. + */ + public function extract () {} + + /** + * Counts the number of elements in the queue. + * @link http://www.php.net/manual/en/splpriorityqueue.count.php + * @return int the number of elements in the queue. + */ + public function count () {} + + /** + * Checks whether the queue is empty. + * @link http://www.php.net/manual/en/splpriorityqueue.isempty.php + * @return bool whether the queue is empty. + */ + public function isEmpty () {} + + /** + * Rewind iterator back to the start (no-op) + * @link http://www.php.net/manual/en/splpriorityqueue.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current node pointed by the iterator + * @link http://www.php.net/manual/en/splpriorityqueue.current.php + * @return mixed The value or priority (or both) of the current node, depending on the extract flag. + */ + public function current () {} + + /** + * Return current node index + * @link http://www.php.net/manual/en/splpriorityqueue.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * Move to the next node + * @link http://www.php.net/manual/en/splpriorityqueue.next.php + * @return void + */ + public function next () {} + + /** + * Check whether the queue contains more nodes + * @link http://www.php.net/manual/en/splpriorityqueue.valid.php + * @return bool true if the queue contains any more nodes, false otherwise. + */ + public function valid () {} + + /** + * Recover from the corrupted state and allow further actions on the queue. + * @link http://www.php.net/manual/en/splpriorityqueue.recoverfromcorruption.php + * @return void + */ + public function recoverFromCorruption () {} + +} + +/** @jms-builtin */ +class SplFixedArray implements Iterator, Traversable, ArrayAccess, Countable { + + /** + * Constructs a new fixed array + * @link http://www.php.net/manual/en/splfixedarray.construct.php + * @param size[optional] + */ + public function __construct ($size) {} + + /** + * Returns the size of the array + * @link http://www.php.net/manual/en/splfixedarray.count.php + * @return int the size of the array. + */ + public function count () {} + + /** + * Returns a PHP array from the fixed array + * @link http://www.php.net/manual/en/splfixedarray.toarray.php + * @return array a PHP array, similar to the fixed array. + */ + public function toArray () {} + + /** + * Import a PHP array in a SplFixedArray instance + * @link http://www.php.net/manual/en/splfixedarray.fromarray.php + * @param array array

+ * The array to import. + *

+ * @param save_indexes boolean[optional]

+ * Try to save the numeric indexes used in the original array. + *

+ * @return SplFixedArray an instance of SplFixedArray + * containing the array content. + */ + public static function fromArray (array $array, $save_indexes = null) {} + + /** + * Gets the size of the array + * @link http://www.php.net/manual/en/splfixedarray.getsize.php + * @return int the size of the array, as an integer. + */ + public function getSize () {} + + /** + * Change the size of an array + * @link http://www.php.net/manual/en/splfixedarray.setsize.php + * @param size int

+ * The new array size. + *

+ * @return int + */ + public function setSize ($size) {} + + /** + * Returns whether the requested index exists + * @link http://www.php.net/manual/en/splfixedarray.offsetexists.php + * @param index int

+ * The index being checked. + *

+ * @return bool true if the requested index exists, otherwise false + */ + public function offsetExists ($index) {} + + /** + * Returns the value at the specified index + * @link http://www.php.net/manual/en/splfixedarray.offsetget.php + * @param index int

+ * The index with the value. + *

+ * @return mixed The value at the specified index. + */ + public function offsetGet ($index) {} + + /** + * Sets a new value at a specified index + * @link http://www.php.net/manual/en/splfixedarray.offsetset.php + * @param index int

+ * The index being set. + *

+ * @param newval mixed

+ * The new value for the index. + *

+ * @return void + */ + public function offsetSet ($index, $newval) {} + + /** + * Unsets the value at the specified $index + * @link http://www.php.net/manual/en/splfixedarray.offsetunset.php + * @param index int

+ * The index being unset. + *

+ * @return void + */ + public function offsetUnset ($index) {} + + /** + * Rewind iterator back to the start + * @link http://www.php.net/manual/en/splfixedarray.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Return current array entry + * @link http://www.php.net/manual/en/splfixedarray.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * Return current array index + * @link http://www.php.net/manual/en/splfixedarray.key.php + * @return int The current array index. + */ + public function key () {} + + /** + * Move to next entry + * @link http://www.php.net/manual/en/splfixedarray.next.php + * @return void + */ + public function next () {} + + /** + * Check whether the array contains more elements + * @link http://www.php.net/manual/en/splfixedarray.valid.php + * @return bool true if the array contains any more elements, false otherwise. + */ + public function valid () {} + +} + +interface SplObserver { + + /** + * Receive update from subject + * @link http://www.php.net/manual/en/splobserver.update.php + * @param subject SplSubject

+ * The SplSubject notifying the observer of an update. + *

+ * @return void + */ + abstract public function update ($subject) {} + +} + +interface SplSubject { + + /** + * Attach an SplObserver + * @link http://www.php.net/manual/en/splsubject.attach.php + * @param observer SplObserver

+ * The SplObserver to attach. + *

+ * @return void + */ + abstract public function attach ($observer) {} + + /** + * Detach an observer + * @link http://www.php.net/manual/en/splsubject.detach.php + * @param observer SplObserver

+ * The SplObserver to detach. + *

+ * @return void + */ + abstract public function detach ($observer) {} + + /** + * Notify an observer + * @link http://www.php.net/manual/en/splsubject.notify.php + * @return void + */ + abstract public function notify () {} + +} + +/** @jms-builtin */ +class SplObjectStorage implements Countable, Iterator, Traversable, Serializable, ArrayAccess { + + /** + * Adds an object in the storage + * @link http://www.php.net/manual/en/splobjectstorage.attach.php + * @param object object

+ * The object to add. + *

+ * @param data mixed[optional]

+ * The data to associate with the object. + *

+ * @return void + */ + public function attach ($object, $data = null) {} + + /** + * Removes an object from the storage + * @link http://www.php.net/manual/en/splobjectstorage.detach.php + * @param object object

+ * The object to remove. + *

+ * @return void + */ + public function detach ($object) {} + + /** + * Checks if the storage contains a specific object + * @link http://www.php.net/manual/en/splobjectstorage.contains.php + * @param object object

+ * The object to look for. + *

+ * @return boolean true if the object is in the storage, false otherwise. + */ + public function contains ($object) {} + + /** + * Adds all objects from another storage + * @link http://www.php.net/manual/en/splobjectstorage.addall.php + * @param storage SplObjectStorage

+ * The storage you want to import. + *

+ * @return void + */ + public function addAll (SplObjectStorage $storage) {} + + /** + * Removes objects contained in another storage from the current storage + * @link http://www.php.net/manual/en/splobjectstorage.removeall.php + * @param storage SplObjectStorage

+ * The storage containing the elements to remove. + *

+ * @return void + */ + public function removeAll (SplObjectStorage $storage) {} + + /** + * Returns the data associated with the current iterator entry + * @link http://www.php.net/manual/en/splobjectstorage.getinfo.php + * @return mixed The data associated with the current iterator position. + */ + public function getInfo () {} + + /** + * Sets the data associated with the current iterator entry + * @link http://www.php.net/manual/en/splobjectstorage.setinfo.php + * @param data mixed

+ * The data to associate with the current iterator entry. + *

+ * @return void + */ + public function setInfo ($data) {} + + /** + * Returns the number of objects in the storage + * @link http://www.php.net/manual/en/splobjectstorage.count.php + * @return int The number of objects in the storage. + */ + public function count () {} + + /** + * Rewind the iterator to the first storage element + * @link http://www.php.net/manual/en/splobjectstorage.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Returns if the current iterator entry is valid + * @link http://www.php.net/manual/en/splobjectstorage.valid.php + * @return boolean true if the iterator entry is valid, false otherwise. + */ + public function valid () {} + + /** + * Returns the index at which the iterator currently is + * @link http://www.php.net/manual/en/splobjectstorage.key.php + * @return int The index corresponding to the position of the iterator. + */ + public function key () {} + + /** + * Returns the current storage entry + * @link http://www.php.net/manual/en/splobjectstorage.current.php + * @return object The object at the current iterator position. + */ + public function current () {} + + /** + * Move to the next entry + * @link http://www.php.net/manual/en/splobjectstorage.next.php + * @return void + */ + public function next () {} + + /** + * Unserializes a storage from its string representation + * @link http://www.php.net/manual/en/splobjectstorage.unserialize.php + * @param serialized string

+ * The serialized representation of a storage. + *

+ * @return void + */ + public function unserialize ($serialized) {} + + /** + * Serializes the storage + * @link http://www.php.net/manual/en/splobjectstorage.serialize.php + * @return string A string representing the storage. + */ + public function serialize () {} + + /** + * Checks whether an object exists in the storage + * @link http://www.php.net/manual/en/splobjectstorage.offsetexists.php + * @param object object

+ * The object to look for. + *

+ * @return boolean true if the object exists in the storage, + * and false otherwise. + */ + public function offsetExists ($object) {} + + /** + * Associates data to an object in the storage + * @link http://www.php.net/manual/en/splobjectstorage.offsetset.php + * @param object object

+ * The object to associate data with. + *

+ * @param info mixed

+ * The data to associate with the object. + *

+ * @return void + */ + public function offsetSet ($object, $info) {} + + /** + * Removes an object from the storage + * @link http://www.php.net/manual/en/splobjectstorage.offsetunset.php + * @param object object

+ * The object to remove. + *

+ * @return void + */ + public function offsetUnset ($object) {} + + /** + * Returns the data associated with an object + * @link http://www.php.net/manual/en/splobjectstorage.offsetget.php + * @param object object

+ * The object to look for. + *

+ * @return mixed The data previously associated with the object in the storage. + */ + public function offsetGet ($object) {} + +} + +/** @jms-builtin */ +class MultipleIterator implements Iterator, Traversable { + const MIT_NEED_ANY = 0; + const MIT_NEED_ALL = 1; + const MIT_KEYS_NUMERIC = 0; + const MIT_KEYS_ASSOC = 2; + + + /** + * Constructs a new MultipleIterator + * @link http://www.php.net/manual/en/multipleiterator.construct.php + * @param flags + */ + public function __construct ($flags) {} + + /** + * Gets the flag information + * @link http://www.php.net/manual/en/multipleiterator.getflags.php + * @return void Information about the flags, as an integer. + */ + public function getFlags () {} + + /** + * Sets flags + * @link http://www.php.net/manual/en/multipleiterator.setflags.php + * @param flags integer

+ * The flags to set, according to the + * Flag Constants + *

+ * @return void + */ + public function setFlags ($flags) {} + + /** + * Attaches iterator information + * @link http://www.php.net/manual/en/multipleiterator.attachiterator.php + * @param iterator Iterator

+ * The new iterator to attach. + *

+ * @param infos string[optional]

+ * The associative information for the Iterator, which must be an + * integer, a string, or &null;. + *

+ * @return void Description... + */ + public function attachIterator ($iterator, $infos = null) {} + + /** + * Detaches an iterator + * @link http://www.php.net/manual/en/multipleiterator.detachiterator.php + * @param iterator Iterator

+ * The iterator to detach. + *

+ * @return void + */ + public function detachIterator ($iterator) {} + + /** + * Checks if an iterator is attached + * @link http://www.php.net/manual/en/multipleiterator.containsiterator.php + * @param iterator Iterator

+ * The iterator to check. + *

+ * @return void Returns true on success or false on failure. + */ + public function containsIterator ($iterator) {} + + /** + * Gets the number of attached iterator instances + * @link http://www.php.net/manual/en/multipleiterator.countiterators.php + * @return void The number of attached iterator instances (as an integer). + */ + public function countIterators () {} + + /** + * Rewinds all attached iterator instances + * @link http://www.php.net/manual/en/multipleiterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Checks the validity of sub iterators + * @link http://www.php.net/manual/en/multipleiterator.valid.php + * @return void true if one or all sub iterators are valid depending on flags, + * otherwise false + */ + public function valid () {} + + /** + * Gets the registered iterator instances + * @link http://www.php.net/manual/en/multipleiterator.key.php + * @return void An array of all registered iterator instances, + * or false if no sub iterator is attached. + */ + public function key () {} + + /** + * Gets the registered iterator instances + * @link http://www.php.net/manual/en/multipleiterator.current.php + * @return void An array of all registered iterator instances, + * or false if no sub iterator is attached. + */ + public function current () {} + + /** + * Moves all attached iterator instances forward + * @link http://www.php.net/manual/en/multipleiterator.next.php + * @return void + */ + public function next () {} + +} + +/** + * Return available SPL classes + * @link http://www.php.net/manual/en/function.spl-classes.php + * @return array + * + * @jms-builtin + */ +function spl_classes () {} + +/** + * Default implementation for __autoload() + * @link http://www.php.net/manual/en/function.spl-autoload.php + * @param class_name string

+ *

+ * @param file_extensions string[optional]

+ * By default it checks all include paths to + * contain filenames built up by the lowercase class name appended by the + * filename extensions .inc and .php. + *

+ * @return void + * + * @jms-builtin + */ +function spl_autoload ($class_name, $file_extensions = null) {} + +/** + * Register and return default file extensions for spl_autoload + * @link http://www.php.net/manual/en/function.spl-autoload-extensions.php + * @param file_extensions string[optional]

+ * When calling without an argument, it simply returns the current list + * of extensions each separated by comma. To modify the list of file + * extensions, simply invoke the functions with the new list of file + * extensions to use in a single string with each extensions separated + * by comma. + *

+ * @return string A comma delimited list of default file extensions for + * spl_autoload. + * + * @jms-builtin + */ +function spl_autoload_extensions ($file_extensions = null) {} + +/** + * Register given function as __autoload() implementation + * @link http://www.php.net/manual/en/function.spl-autoload-register.php + * @param autoload_function callback[optional]

+ * The autoload function being registered. + * If no parameter is provided, then the default implementation of + * spl_autoload will be registered. + *

+ * @param throw bool[optional]

+ * This parameter specifies whether + * spl_autoload_register should throw + * exceptions on error. + *

+ * @param prepend bool[optional]

+ * If true, spl_autoload_register will prepend + * the autoloader on the autoload stack instead of appending it. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function spl_autoload_register ($autoload_function = null, $throw = null, $prepend = null) {} + +/** + * Unregister given function as __autoload() implementation + * @link http://www.php.net/manual/en/function.spl-autoload-unregister.php + * @param autoload_function mixed

+ * The autoload function being unregistered. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function spl_autoload_unregister ($autoload_function) {} + +/** + * Return all registered __autoload() functions + * @link http://www.php.net/manual/en/function.spl-autoload-functions.php + * @return array An array of all registered __autoload functions. + * If the autoload stack is not activated then the return value is false. + * If no function is registered the return value will be an empty array. + * + * @jms-builtin + */ +function spl_autoload_functions () {} + +/** + * Try all registered __autoload() function to load the requested class + * @link http://www.php.net/manual/en/function.spl-autoload-call.php + * @param class_name string

+ * The class name being searched. + *

+ * @return void + * + * @jms-builtin + */ +function spl_autoload_call ($class_name) {} + +/** + * Return the parent classes of the given class + * @link http://www.php.net/manual/en/function.class-parents.php + * @param class mixed

+ * An object (class instance) or a string (class name). + *

+ * @param autoload bool[optional]

+ * Whether to allow this function to load the class automatically through + * the __autoload magic + * method. + *

+ * @return array An array on success, or false on error. + * + * @jms-builtin + */ +function class_parents ($class, $autoload = null) {} + +/** + * Return the interfaces which are implemented by the given class + * @link http://www.php.net/manual/en/function.class-implements.php + * @param class mixed

+ * An object (class instance) or a string (class name). + *

+ * @param autoload bool[optional]

+ * Whether to allow this function to load the class automatically through + * the __autoload magic + * method. + *

+ * @return array An array on success, or false on error. + * + * @jms-builtin + */ +function class_implements ($class, $autoload = null) {} + +/** + * Return hash id for given object + * @link http://www.php.net/manual/en/function.spl-object-hash.php + * @param obj object + * @return string A string that is unique for each currently existing object and is always + * the same for each object. + * + * @jms-builtin + */ +function spl_object_hash ($obj) {} + +/** + * Copy the iterator into an array + * @link http://www.php.net/manual/en/function.iterator-to-array.php + * @param iterator Traversable

+ * The iterator being copied. + *

+ * @param use_keys bool[optional]

+ * Whether to use the iterator element keys as index. + *

+ * @return array An array containing the elements of the iterator. + * + * @jms-builtin + */ +function iterator_to_array ($iterator, $use_keys = null) {} + +/** + * Count the elements in an iterator + * @link http://www.php.net/manual/en/function.iterator-count.php + * @param iterator Traversable

+ * The iterator being counted. + *

+ * @return int The number of elements in iterator. + * + * @jms-builtin + */ +function iterator_count ($iterator) {} + +/** + * Call a function for every element in an iterator + * @link http://www.php.net/manual/en/function.iterator-apply.php + * @param iterator Traversable

+ * The class to iterate over. + *

+ * @param function callback

+ * The callback function to call on every element. + * The function must return true in order to + * continue iterating over the iterator. + *

+ * @param args array[optional]

+ * Arguments to pass to the callback function. + *

+ * @return int the iteration count. + * + * @jms-builtin + */ +function iterator_apply ($iterator, $function, array $args = null) {} + +// End of SPL v.0.2 +?> diff --git a/res/php-5.3-core-api/SQLite.php b/res/php-5.3-core-api/SQLite.php new file mode 100644 index 0000000..7072036 --- /dev/null +++ b/res/php-5.3-core-api/SQLite.php @@ -0,0 +1,1026 @@ + + * The filename of the SQLite database. If the file does not exist, SQLite + * will attempt to create it. PHP must have write permissions to the file + * if data is inserted, the database schema is modified or to create the + * database if it does not exist. + *

+ * @param mode int[optional]

+ * The mode of the file. Intended to be used to open the database in + * read-only mode. Presently, this parameter is ignored by the sqlite + * library. The default value for mode is the octal value + * 0666 and this is the recommended value. + *

+ * @param error_message string[optional]

+ * Passed by reference and is set to hold a descriptive error message + * explaining why the database could not be opened if there was an error. + *

+ * + * @jms-builtin + */ +function sqlite_open ($filename, $mode = null, &$error_message = null) {} + +/** + * Opens a persistent handle to an SQLite database and create the database if it does not exist + * @link http://www.php.net/manual/en/function.sqlite-popen.php + * @param filename string

+ * The filename of the SQLite database. If the file does not exist, SQLite + * will attempt to create it. PHP must have write permissions to the file + * if data is inserted, the database schema is modified or to create the + * database if it does not exist. + *

+ * @param mode int[optional]

+ * The mode of the file. Intended to be used to open the database in + * read-only mode. Presently, this parameter is ignored by the sqlite + * library. The default value for mode is the octal value + * 0666 and this is the recommended value. + *

+ * @param error_message string[optional]

+ * Passed by reference and is set to hold a descriptive error message + * explaining why the database could not be opened if there was an error. + *

+ * @return resource a resource (database handle) on success, false on error. + * + * @jms-builtin + */ +function sqlite_popen ($filename, $mode = null, &$error_message = null) {} + +/** + * Closes an open SQLite database + * @link http://www.php.net/manual/en/function.sqlite-close.php + * @param dbhandle resource

+ * The SQLite Database resource; returned from sqlite_open + * when used procedurally. + *

+ * @return void + * + * @jms-builtin + */ +function sqlite_close ($dbhandle) {} + +/** + * Executes a query against a given database and returns a result handle + * @link http://www.php.net/manual/en/function.sqlite-query.php + * @param query string

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param result_type int[optional] &sqlite.result-type; + * @param error_msg string[optional]

+ * The specified variable will be filled if an error occurs. This is + * specially important because SQL syntax errors can't be fetched using + * the sqlite_last_error function. + *

+ * @return SQLiteResult This function will return a result handle&return.falseforfailure;. + * For queries that return rows, the result handle can then be used with + * functions such as sqlite_fetch_array and + * sqlite_seek. + *

+ *

+ * Regardless of the query type, this function will return false if the + * query failed. + *

+ *

+ * sqlite_query returns a buffered, seekable result + * handle. This is useful for reasonably small queries where you need to + * be able to randomly access the rows. Buffered result handles will + * allocate memory to hold the entire result and will not return until it + * has been fetched. If you only need sequential access to the data, it is + * recommended that you use the much higher performance + * sqlite_unbuffered_query instead. + * + * @jms-builtin + */ +function sqlite_query ($query, $result_type = null, &$error_msg = null) {} + +/** + * Executes a result-less query against a given database + * @link http://www.php.net/manual/en/function.sqlite-exec.php + * @param query string

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param error_msg string[optional]

+ * The specified variable will be filled if an error occurs. This is + * specially important because SQL syntax errors can't be fetched using + * the sqlite_last_error function. + *

+ * @return bool This function will return a boolean result; true for success or false for failure. + * If you need to run a query that returns rows, see sqlite_query. + * + * @jms-builtin + */ +function sqlite_exec ($query, &$error_msg = null) {} + +/** + * Execute a query against a given database and returns an array + * @link http://www.php.net/manual/en/function.sqlite-array-query.php + * @param query string

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param result_type int[optional] &sqlite.result-type; + * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return array an array of the entire result set; false otherwise. + * + * @jms-builtin + */ +function sqlite_array_query ($query, $result_type = null, $decode_binary = null) {} + +/** + * Executes a query and returns either an array for one single column or the value of the first row + * @link http://www.php.net/manual/en/function.sqlite-single-query.php + * @param query string + * @param first_row_only bool[optional] + * @param decode_binary bool[optional] + * @return array + * + * @jms-builtin + */ +function sqlite_single_query ($query, $first_row_only = null, $decode_binary = null) {} + +/** + * Fetches the next row from a result set as an array + * @link http://www.php.net/manual/en/function.sqlite-fetch-array.php + * @param result_type int[optional] &sqlite.result-type; + * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return array an array of the next row from a result set; false if the + * next position is beyond the final row. + * + * @jms-builtin + */ +function sqlite_fetch_array ($result_type = null, $decode_binary = null) {} + +/** + * Fetches the next row from a result set as an object + * @link http://www.php.net/manual/en/function.sqlite-fetch-object.php + * @param class_name string[optional] + * @param ctor_params array[optional] + * @param decode_binary bool[optional] + * @return object + * + * @jms-builtin + */ +function sqlite_fetch_object ($class_name = null, array $ctor_params = null, $decode_binary = null) {} + +/** + * Fetches the first column of a result set as a string + * @link http://www.php.net/manual/en/function.sqlite-fetch-single.php + * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return string the first column value, as a string. + * + * @jms-builtin + */ +function sqlite_fetch_single ($decode_binary = null) {} + +/** + * &Alias; sqlite_fetch_single + * @link http://www.php.net/manual/en/function.sqlite-fetch-string.php + * @param result + * @param decode_binary[optional] + * + * @jms-builtin + */ +function sqlite_fetch_string ($result, $decode_binary) {} + +/** + * Fetches all rows from a result set as an array of arrays + * @link http://www.php.net/manual/en/function.sqlite-fetch-all.php + * @param result_type int[optional] &sqlite.result-type; + * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return array an array of the remaining rows in a result set. If called right + * after sqlite_query, it returns all rows. If called + * after sqlite_fetch_array, it returns the rest. If + * there are no rows in a result set, it returns an empty array. + * + * @jms-builtin + */ +function sqlite_fetch_all ($result_type = null, $decode_binary = null) {} + +/** + * Fetches the current row from a result set as an array + * @link http://www.php.net/manual/en/function.sqlite-current.php + * @param result_type int[optional] &sqlite.result-type; + * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return array an array of the current row from a result set; false if the + * current position is beyond the final row. + * + * @jms-builtin + */ +function sqlite_current ($result_type = null, $decode_binary = null) {} + +/** + * Fetches a column from the current row of a result set + * @link http://www.php.net/manual/en/function.sqlite-column.php + * @param index_or_name mixed

+ * The column index or name to fetch. + *

+ * @param decode_binary bool[optional] &sqlite.decode-bin; + * @return mixed the column value. + * + * @jms-builtin + */ +function sqlite_column ($index_or_name, $decode_binary = null) {} + +/** + * Returns the version of the linked SQLite library + * @link http://www.php.net/manual/en/function.sqlite-libversion.php + * @return string the librart version, as a string. + * + * @jms-builtin + */ +function sqlite_libversion () {} + +/** + * Returns the encoding of the linked SQLite library + * @link http://www.php.net/manual/en/function.sqlite-libencoding.php + * @return string the library encoding. + * + * @jms-builtin + */ +function sqlite_libencoding () {} + +/** + * Returns the number of rows that were changed by the most + recent SQL statement + * @link http://www.php.net/manual/en/function.sqlite-changes.php + * @param db + * @return int the number of changed rows. + * + * @jms-builtin + */ +function sqlite_changes ($db) {} + +/** + * Returns the rowid of the most recently inserted row + * @link http://www.php.net/manual/en/function.sqlite-last-insert-rowid.php + * @param db + * @return int the row id, as an integer. + * + * @jms-builtin + */ +function sqlite_last_insert_rowid ($db) {} + +/** + * Returns the number of rows in a buffered result set + * @link http://www.php.net/manual/en/function.sqlite-num-rows.php + * @param result + * @return int the number of rows, as an integer. + * + * @jms-builtin + */ +function sqlite_num_rows ($result) {} + +/** + * Returns the number of fields in a result set + * @link http://www.php.net/manual/en/function.sqlite-num-fields.php + * @param result + * @return int the number of fields, as an integer. + * + * @jms-builtin + */ +function sqlite_num_fields ($result) {} + +/** + * Returns the name of a particular field + * @link http://www.php.net/manual/en/function.sqlite-field-name.php + * @param field_index int

+ * The ordinal column number in the result set. + *

+ * @return string the name of a field in an SQLite result set, given the ordinal + * column number; false on error. + * + * @jms-builtin + */ +function sqlite_field_name ($field_index) {} + +/** + * Seek to a particular row number of a buffered result set + * @link http://www.php.net/manual/en/function.sqlite-seek.php + * @param rownum int

+ * The ordinal row number to seek to. The row number is zero-based (0 is + * the first row). + *

+ * &sqlite.no-unbuffered; + * @return bool false if the row does not exist, true otherwise. + * + * @jms-builtin + */ +function sqlite_seek ($rownum) {} + +/** + * Seek to the first row number + * @link http://www.php.net/manual/en/function.sqlite-rewind.php + * @param result + * @return bool false if there are no rows in the result set, true otherwise. + * + * @jms-builtin + */ +function sqlite_rewind ($result) {} + +/** + * Seek to the next row number + * @link http://www.php.net/manual/en/function.sqlite-next.php + * @param result + * @return bool true on success, or false if there are no more rows. + * + * @jms-builtin + */ +function sqlite_next ($result) {} + +/** + * Seek to the previous row number of a result set + * @link http://www.php.net/manual/en/function.sqlite-prev.php + * @param result + * @return bool true on success, or false if there are no more previous rows. + * + * @jms-builtin + */ +function sqlite_prev ($result) {} + +/** + * Returns whether more rows are available + * @link http://www.php.net/manual/en/function.sqlite-valid.php + * @param result + * @return bool true if there are more rows available from the + * result handle, or false otherwise. + * + * @jms-builtin + */ +function sqlite_valid ($result) {} + +/** + * Finds whether or not more rows are available + * @link http://www.php.net/manual/en/function.sqlite-has-more.php + * @param result resource

+ * The SQLite result resource. + *

+ * @return bool true if there are more rows available from the + * result handle, or false otherwise. + * + * @jms-builtin + */ +function sqlite_has_more ($result) {} + +/** + * Returns whether or not a previous row is available + * @link http://www.php.net/manual/en/function.sqlite-has-prev.php + * @param result + * @return bool true if there are more previous rows available from the + * result handle, or false otherwise. + * + * @jms-builtin + */ +function sqlite_has_prev ($result) {} + +/** + * Escapes a string for use as a query parameter + * @link http://www.php.net/manual/en/function.sqlite-escape-string.php + * @param item string

+ * The string being quoted. + *

+ *

+ * If the item contains a NUL + * character, or if it begins with a character whose ordinal value is + * 0x01, PHP will apply a binary encoding scheme so that + * you can safely store and retrieve binary data. + *

+ * @return string an escaped string for use in an SQLite SQL statement. + * + * @jms-builtin + */ +function sqlite_escape_string ($item) {} + +/** + * Set busy timeout duration, or disable busy handlers + * @link http://www.php.net/manual/en/function.sqlite-busy-timeout.php + * @param milliseconds int

+ * The number of milliseconds. When set to + * 0, busy handlers will be disabled and SQLite will + * return immediately with a SQLITE_BUSY status code + * if another process/thread has the database locked for an update. + *

+ *

+ * PHP sets the default busy timeout to be 60 seconds when the database is + * opened. + *

+ *

+ * There are one thousand (1000) milliseconds in one second. + *

+ * @return void + * + * @jms-builtin + */ +function sqlite_busy_timeout ($milliseconds) {} + +/** + * Returns the error code of the last error for a database + * @link http://www.php.net/manual/en/function.sqlite-last-error.php + * @param db + * @return int an error code, or 0 if no error occurred. + * + * @jms-builtin + */ +function sqlite_last_error ($db) {} + +/** + * Returns the textual description of an error code + * @link http://www.php.net/manual/en/function.sqlite-error-string.php + * @param error_code int

+ * The error code being used, which might be passed in from + * sqlite_last_error. + *

+ * @return string a human readable description of the error_code, + * as a string. + * + * @jms-builtin + */ +function sqlite_error_string ($error_code) {} + +/** + * Execute a query that does not prefetch and buffer all data + * @link http://www.php.net/manual/en/function.sqlite-unbuffered-query.php + * @param query string

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param result_type int[optional] &sqlite.result-type; + * @param error_msg string[optional]

+ * The specified variable will be filled if an error occurs. This is + * specially important because SQL syntax errors can't be fetched using + * the sqlite_last_error function. + *

+ * @return SQLiteUnbuffered a result handle&return.falseforfailure;. + *

+ *

+ * sqlite_unbuffered_query returns a sequential + * forward-only result set that can only be used to read each row, one after + * the other. + * + * @jms-builtin + */ +function sqlite_unbuffered_query ($query, $result_type = null, &$error_msg = null) {} + +/** + * Register an aggregating UDF for use in SQL statements + * @link http://www.php.net/manual/en/function.sqlite-create-aggregate.php + * @param function_name string

+ * The name of the function used in SQL statements. + *

+ * @param step_func callback

+ * Callback function called for each row of the result set. + *

+ * @param finalize_func callback

+ * Callback function to aggregate the "stepped" data from each row. + *

+ * @param num_args int[optional]

+ * Hint to the SQLite parser if the callback function accepts a + * predetermined number of arguments. + *

+ * @return void + * + * @jms-builtin + */ +function sqlite_create_aggregate ($function_name, $step_func, $finalize_func, $num_args = null) {} + +/** + * Registers a "regular" User Defined Function for use in SQL statements + * @link http://www.php.net/manual/en/function.sqlite-create-function.php + * @param function_name string

+ * The name of the function used in SQL statements. + *

+ * @param callback callback

+ * Callback function to handle the defined SQL function. + *

+ * Callback functions should return a type understood by SQLite (i.e. + * scalar type). + * @param num_args int[optional]

+ * Hint to the SQLite parser if the callback function accepts a + * predetermined number of arguments. + *

+ * @return void + * + * @jms-builtin + */ +function sqlite_create_function ($function_name, $callback, $num_args = null) {} + +/** + * Opens a SQLite database and returns a SQLiteDatabase object + * @link http://www.php.net/manual/en/function.sqlite-factory.php + * @param filename string

+ * The filename of the SQLite database. + *

+ * @param mode int[optional]

+ * The mode of the file. Intended to be used to open the database in + * read-only mode. Presently, this parameter is ignored by the sqlite + * library. The default value for mode is the octal value + * 0666 and this is the recommended value. + *

+ * @param error_message string[optional]

+ * Passed by reference and is set to hold a descriptive error message + * explaining why the database could not be opened if there was an error. + *

+ * @return SQLiteDatabase a SQLiteDatabase object on success, &null; on error. + * + * @jms-builtin + */ +function sqlite_factory ($filename, $mode = null, &$error_message = null) {} + +/** + * Encode binary data before returning it from an UDF + * @link http://www.php.net/manual/en/function.sqlite-udf-encode-binary.php + * @param data string

+ * The string being encoded. + *

+ * @return string The encoded string. + * + * @jms-builtin + */ +function sqlite_udf_encode_binary ($data) {} + +/** + * Decode binary data passed as parameters to an UDF + * @link http://www.php.net/manual/en/function.sqlite-udf-decode-binary.php + * @param data string

+ * The encoded data that will be decoded, data that was applied by either + * sqlite_udf_encode_binary or + * sqlite_escape_string. + *

+ * @return string The decoded string. + * + * @jms-builtin + */ +function sqlite_udf_decode_binary ($data) {} + +/** + * Return an array of column types from a particular table + * @link http://www.php.net/manual/en/function.sqlite-fetch-column-types.php + * @param table_name string

+ * The table name to query. + *

+ * @param result_type int[optional]

+ * The optional result_type parameter accepts a + * constant and determines how the returned array will be indexed. Using + * SQLITE_ASSOC will return only associative indices + * (named fields) while SQLITE_NUM will return only + * numerical indices (ordinal field numbers). + * SQLITE_BOTH will return both associative and + * numerical indices. SQLITE_ASSOC is the default for + * this function. + *

+ * @return array an array of column data types; false on error. + * + * @jms-builtin + */ +function sqlite_fetch_column_types ($table_name, $result_type = null) {} + + +/** + * Columns are returned into the array having both a numerical index + * and the field name as the array index. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_BOTH', 3); + +/** + * Columns are returned into the array having a numerical index to the + * fields. This index starts with 0, the first field in the result. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NUM', 2); + +/** + * Columns are returned into the array having the field name as the array + * index. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ASSOC', 1); + +/** + * Successful result. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_OK', 0); + +/** + * SQL error or missing database. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ERROR', 1); + +/** + * An internal logic error in SQLite. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_INTERNAL', 2); + +/** + * Access permission denied. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_PERM', 3); + +/** + * Callback routine requested an abort. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ABORT', 4); + +/** + * The database file is locked. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_BUSY', 5); + +/** + * A table in the database is locked. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_LOCKED', 6); + +/** + * Memory allocation failed. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOMEM', 7); + +/** + * Attempt to write a readonly database. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_READONLY', 8); + +/** + * Operation terminated internally. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_INTERRUPT', 9); + +/** + * Disk I/O error occurred. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_IOERR', 10); + +/** + * The database disk image is malformed. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_CORRUPT', 11); + +/** + * (Internal) Table or record not found. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOTFOUND', 12); + +/** + * Insertion failed because database is full. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_FULL', 13); + +/** + * Unable to open the database file. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_CANTOPEN', 14); + +/** + * Database lock protocol error. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_PROTOCOL', 15); + +/** + * (Internal) Database table is empty. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_EMPTY', 16); + +/** + * The database schema changed. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_SCHEMA', 17); + +/** + * Too much data for one row of a table. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_TOOBIG', 18); + +/** + * Abort due to constraint violation. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_CONSTRAINT', 19); + +/** + * Data type mismatch. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_MISMATCH', 20); + +/** + * Library used incorrectly. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_MISUSE', 21); + +/** + * Uses of OS features not supported on host. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOLFS', 22); + +/** + * Authorized failed. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_AUTH', 23); + +/** + * File opened that is not a database file. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOTADB', 26); + +/** + * Auxiliary database format error. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_FORMAT', 24); + +/** + * Internal process has another row ready. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ROW', 100); + +/** + * Internal process has finished executing. + * @link http://www.php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_DONE', 101); + +// End of SQLite v.2.0-dev +?> diff --git a/res/php-5.3-core-api/SimpleXML.php b/res/php-5.3-core-api/SimpleXML.php new file mode 100644 index 0000000..545a9a4 --- /dev/null +++ b/res/php-5.3-core-api/SimpleXML.php @@ -0,0 +1,488 @@ + + * A well-formed XML string or the path or URL to an XML document if + * data_is_url is true. + *

+ * @param options int[optional]

+ * Optionally used to specify additional + * Libxml parameters. + *

+ * @param data_is_url bool[optional]

+ * By default, data_is_url is false. Use true to + * specify that data is a path or URL to an XML + * document instead of string data. + *

+ * @param ns string[optional]

+ *

+ * @param is_prefix bool[optional]

+ *

+ */ + final public function __construct ($data, $options = null, $data_is_url = null, $ns = null, $is_prefix = null) {} + + /** + * Return a well-formed XML string based on SimpleXML element + * @link http://www.php.net/manual/en/simplexmlelement.asXML.php + * @param filename string[optional]

+ * If specified, the function writes the data to the file rather than + * returning it. + *

+ * @return mixed If the filename isn't specified, this function + * returns a string on success and false on error. If the + * parameter is specified, it returns true if the file was written + * successfully and false otherwise. + */ + public function asXML ($filename = null) {} + + public function saveXML () {} + + /** + * Runs XPath query on XML data + * @link http://www.php.net/manual/en/simplexmlelement.xpath.php + * @param path string

+ * An XPath path + *

+ * @return array an array of SimpleXMLElement objects or false in + * case of an error. + */ + public function xpath ($path) {} + + /** + * Creates a prefix/ns context for the next XPath query + * @link http://www.php.net/manual/en/simplexmlelement.registerXPathNamespace.php + * @param prefix string

+ * The namespace prefix to use in the XPath query for the namespace given in + * ns. + *

+ * @param ns string

+ * The namespace to use for the XPath query. This must match a namespace in + * use by the XML document or the XPath query using + * prefix will not return any results. + *

+ * @return bool Returns true on success or false on failure. + */ + public function registerXPathNamespace ($prefix, $ns) {} + + /** + * Identifies an element's attributes + * @link http://www.php.net/manual/en/simplexmlelement.attributes.php + * @param ns string[optional]

+ * An optional namespace for the retrieved attributes + *

+ * @param is_prefix bool[optional]

+ * Default to false + *

+ * @return SimpleXMLElement + */ + public function attributes ($ns = null, $is_prefix = null) {} + + /** + * Finds children of given node + * @link http://www.php.net/manual/en/simplexmlelement.children.php + * @param ns string[optional]

+ * An XML namespace. + *

+ * @param is_prefix bool[optional]

+ * If is_prefix is true, + * ns will be regarded as a prefix. If false, + * ns will be regarded as a namespace + * URL. + *

+ * @return SimpleXMLElement a SimpleXMLElement element, whether the node + * has children or not. + */ + public function children ($ns = null, $is_prefix = null) {} + + /** + * Returns namespaces used in document + * @link http://www.php.net/manual/en/simplexmlelement.getNamespaces.php + * @param recursive bool[optional]

+ * If specified, returns all namespaces used in parent and child nodes. + * Otherwise, returns only namespaces used in root node. + *

+ * @return array The getNamespaces method returns an array of + * namespace names with their associated URIs. + */ + public function getNamespaces ($recursive = null) {} + + /** + * Returns namespaces declared in document + * @link http://www.php.net/manual/en/simplexmlelement.getDocNamespaces.php + * @param recursive bool[optional]

+ * If specified, returns all namespaces declared in parent and child nodes. + * Otherwise, returns only namespaces declared in root node. + *

+ * @return array The getDocNamespaces method returns an array + * of namespace names with their associated URIs. + */ + public function getDocNamespaces ($recursive = null) {} + + /** + * Gets the name of the XML element + * @link http://www.php.net/manual/en/simplexmlelement.getName.php + * @return string The getName method returns as a string the + * name of the XML tag referenced by the SimpleXMLElement object. + */ + public function getName () {} + + /** + * Adds a child element to the XML node + * @link http://www.php.net/manual/en/simplexmlelement.addChild.php + * @param name string

+ * The name of the child element to add. + *

+ * @param value string[optional]

+ * If specified, the value of the child element. + *

+ * @param namespace string[optional]

+ * If specified, the namespace to which the child element belongs. + *

+ * @return SimpleXMLElement The addChild method returns a SimpleXMLElement + * object representing the child added to the XML node. + */ + public function addChild ($name, $value = null, $namespace = null) {} + + /** + * Adds an attribute to the SimpleXML element + * @link http://www.php.net/manual/en/simplexmlelement.addAttribute.php + * @param name string

+ * The name of the attribute to add. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @param namespace string[optional]

+ * If specified, the namespace to which the attribute belongs. + *

+ * @return void + */ + public function addAttribute ($name, $value, $namespace = null) {} + + public function __toString () {} + + /** + * Counts the children of an element + * @link http://www.php.net/manual/en/simplexmlelement.count.php + * @return integer the number of elements of an element. + */ + public function count () {} + +} + +/** @jms-builtin */ +class SimpleXMLIterator extends SimpleXMLElement implements Traversable, RecursiveIterator, Iterator, Countable { + + /** + * Rewind to the first element + * @link http://www.php.net/manual/en/simplexmliterator.rewind.php + * @return void + */ + public function rewind () {} + + /** + * Check whether the current element is valid + * @link http://www.php.net/manual/en/simplexmliterator.valid.php + * @return bool true if the current element is valid, otherwise false + */ + public function valid () {} + + /** + * Returns the current element + * @link http://www.php.net/manual/en/simplexmliterator.current.php + * @return mixed the current element as a SimpleXMLIterator object or &null; on failure. + */ + public function current () {} + + /** + * Return current key + * @link http://www.php.net/manual/en/simplexmliterator.key.php + * @return mixed the XML tag name of the element referenced by the current SimpleXMLIterator object or false + */ + public function key () {} + + /** + * Move to next element + * @link http://www.php.net/manual/en/simplexmliterator.next.php + * @return void + */ + public function next () {} + + /** + * Checks whether the current element has sub elements. + * @link http://www.php.net/manual/en/simplexmliterator.haschildren.php + * @return bool true if the current element has sub-elements, otherwise false + */ + public function hasChildren () {} + + /** + * Returns the sub-elements of the current element + * @link http://www.php.net/manual/en/simplexmliterator.getchildren.php + * @return object a SimpleXMLIterator object containing + * the sub-elements of the current element. + */ + public function getChildren () {} + + /** + * Creates a new SimpleXMLElement object + * @link http://www.php.net/manual/en/simplexmlelement.construct.php + * @param data string

+ * A well-formed XML string or the path or URL to an XML document if + * data_is_url is true. + *

+ * @param options int[optional]

+ * Optionally used to specify additional + * Libxml parameters. + *

+ * @param data_is_url bool[optional]

+ * By default, data_is_url is false. Use true to + * specify that data is a path or URL to an XML + * document instead of string data. + *

+ * @param ns string[optional]

+ *

+ * @param is_prefix bool[optional]

+ *

+ */ + final public function __construct ($data, $options = null, $data_is_url = null, $ns = null, $is_prefix = null) {} + + /** + * Return a well-formed XML string based on SimpleXML element + * @link http://www.php.net/manual/en/simplexmlelement.asXML.php + * @param filename string[optional]

+ * If specified, the function writes the data to the file rather than + * returning it. + *

+ * @return mixed If the filename isn't specified, this function + * returns a string on success and false on error. If the + * parameter is specified, it returns true if the file was written + * successfully and false otherwise. + */ + public function asXML ($filename = null) {} + + public function saveXML () {} + + /** + * Runs XPath query on XML data + * @link http://www.php.net/manual/en/simplexmlelement.xpath.php + * @param path string

+ * An XPath path + *

+ * @return array an array of SimpleXMLElement objects or false in + * case of an error. + */ + public function xpath ($path) {} + + /** + * Creates a prefix/ns context for the next XPath query + * @link http://www.php.net/manual/en/simplexmlelement.registerXPathNamespace.php + * @param prefix string

+ * The namespace prefix to use in the XPath query for the namespace given in + * ns. + *

+ * @param ns string

+ * The namespace to use for the XPath query. This must match a namespace in + * use by the XML document or the XPath query using + * prefix will not return any results. + *

+ * @return bool Returns true on success or false on failure. + */ + public function registerXPathNamespace ($prefix, $ns) {} + + /** + * Identifies an element's attributes + * @link http://www.php.net/manual/en/simplexmlelement.attributes.php + * @param ns string[optional]

+ * An optional namespace for the retrieved attributes + *

+ * @param is_prefix bool[optional]

+ * Default to false + *

+ * @return SimpleXMLElement + */ + public function attributes ($ns = null, $is_prefix = null) {} + + /** + * Finds children of given node + * @link http://www.php.net/manual/en/simplexmlelement.children.php + * @param ns string[optional]

+ * An XML namespace. + *

+ * @param is_prefix bool[optional]

+ * If is_prefix is true, + * ns will be regarded as a prefix. If false, + * ns will be regarded as a namespace + * URL. + *

+ * @return SimpleXMLElement a SimpleXMLElement element, whether the node + * has children or not. + */ + public function children ($ns = null, $is_prefix = null) {} + + /** + * Returns namespaces used in document + * @link http://www.php.net/manual/en/simplexmlelement.getNamespaces.php + * @param recursive bool[optional]

+ * If specified, returns all namespaces used in parent and child nodes. + * Otherwise, returns only namespaces used in root node. + *

+ * @return array The getNamespaces method returns an array of + * namespace names with their associated URIs. + */ + public function getNamespaces ($recursive = null) {} + + /** + * Returns namespaces declared in document + * @link http://www.php.net/manual/en/simplexmlelement.getDocNamespaces.php + * @param recursive bool[optional]

+ * If specified, returns all namespaces declared in parent and child nodes. + * Otherwise, returns only namespaces declared in root node. + *

+ * @return array The getDocNamespaces method returns an array + * of namespace names with their associated URIs. + */ + public function getDocNamespaces ($recursive = null) {} + + /** + * Gets the name of the XML element + * @link http://www.php.net/manual/en/simplexmlelement.getName.php + * @return string The getName method returns as a string the + * name of the XML tag referenced by the SimpleXMLElement object. + */ + public function getName () {} + + /** + * Adds a child element to the XML node + * @link http://www.php.net/manual/en/simplexmlelement.addChild.php + * @param name string

+ * The name of the child element to add. + *

+ * @param value string[optional]

+ * If specified, the value of the child element. + *

+ * @param namespace string[optional]

+ * If specified, the namespace to which the child element belongs. + *

+ * @return SimpleXMLElement The addChild method returns a SimpleXMLElement + * object representing the child added to the XML node. + */ + public function addChild ($name, $value = null, $namespace = null) {} + + /** + * Adds an attribute to the SimpleXML element + * @link http://www.php.net/manual/en/simplexmlelement.addAttribute.php + * @param name string

+ * The name of the attribute to add. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @param namespace string[optional]

+ * If specified, the namespace to which the attribute belongs. + *

+ * @return void + */ + public function addAttribute ($name, $value, $namespace = null) {} + + public function __toString () {} + + /** + * Counts the children of an element + * @link http://www.php.net/manual/en/simplexmlelement.count.php + * @return integer the number of elements of an element. + */ + public function count () {} + +} + +/** + * Interprets an XML file into an object + * @link http://www.php.net/manual/en/function.simplexml-load-file.php + * @param filename string

+ * Path to the XML file + *

+ *

+ * Libxml 2 unescapes the URI, so if you want to pass e.g. + * b&c as the URI parameter a, + * you have to call + * simplexml_load_file(rawurlencode('http://example.com/?a=' . + * urlencode('b&c'))). Since PHP 5.1.0 you don't need to do + * this because PHP will do it for you. + *

+ * @param class_name string[optional]

+ * You may use this optional parameter so that + * simplexml_load_file will return an object of + * the specified class. That class should extend the + * SimpleXMLElement class. + *

+ * @param options int[optional]

+ * Since PHP 5.1.0 and Libxml 2.6.0, you may also use the + * options parameter to specify additional Libxml parameters. + *

+ * @param ns string[optional]

+ *

+ * @param is_prefix bool[optional]

+ *

+ * @return SimpleXMLElement an object of class SimpleXMLElement with + * properties containing the data held within the XML document. On errors, it + * will return false. + * + * @jms-builtin + */ +function simplexml_load_file ($filename, $class_name = null, $options = null, $ns = null, $is_prefix = null) {} + +/** + * Interprets a string of XML into an object + * @link http://www.php.net/manual/en/function.simplexml-load-string.php + * @param data string

+ * A well-formed XML string + *

+ * @param class_name string[optional]

+ * You may use this optional parameter so that + * simplexml_load_string will return an object of + * the specified class. That class should extend the + * SimpleXMLElement class. + *

+ * @param options int[optional]

+ * Since PHP 5.1.0 and Libxml 2.6.0, you may also use the + * options parameter to specify additional Libxml parameters. + *

+ * @param ns string[optional]

+ *

+ * @param is_prefix bool[optional]

+ *

+ * @return SimpleXMLElement an object of class SimpleXMLElement with + * properties containing the data held within the xml document. On errors, it + * will return false. + * + * @jms-builtin + */ +function simplexml_load_string ($data, $class_name = null, $options = null, $ns = null, $is_prefix = null) {} + +/** + * Get a SimpleXMLElement object from a DOM node. + * @link http://www.php.net/manual/en/function.simplexml-import-dom.php + * @param node DOMNode

+ * A DOM Element node + *

+ * @param class_name string[optional]

+ * You may use this optional parameter so that + * simplexml_import_dom will return an object of + * the specified class. That class should extend the + * SimpleXMLElement class. + *

+ * @return SimpleXMLElement a SimpleXMLElement&return.falseforfailure;. + * + * @jms-builtin + */ +function simplexml_import_dom (DOMNode $node, $class_name = null) {} + +// End of SimpleXML v.0.1 +?> diff --git a/res/php-5.3-core-api/basic.php b/res/php-5.3-core-api/basic.php new file mode 100644 index 0000000..a506891 --- /dev/null +++ b/res/php-5.3-core-api/basic.php @@ -0,0 +1,97 @@ + + * This parameter is only the filename of the + * extension to load which also depends on your platform. For example, + * the sockets extension (if compiled + * as a shared module, not the default!) would be called + * sockets.so on Unix platforms whereas it is called + * php_sockets.dll on the Windows platform. + *

+ *

+ * The directory where the extension is loaded from depends on your + * platform: + *

+ *

+ * Windows - If not explicitly set in the &php.ini;, the extension is + * loaded from C:\php4\extensions\ (PHP4) or + * C:\php5\ (PHP5) by default. + *

+ *

+ * Unix - If not explicitly set in the &php.ini;, the default extension + * directory depends on + * whether PHP has been built with --enable-debug + * or not + * @deprecated This function has been removed from some SAPIs in PHP 5.3. + * @return bool Returns true on success or false on failure. If the functionality of loading modules is not available + * or has been disabled (either by setting + * enable_dl off or by enabling &safemode; + * in &php.ini;) an E_ERROR is emitted + * and execution is stopped. If dl fails because the + * specified library couldn't be loaded, in addition to false an + * E_WARNING message is emitted. + * + * @jms-builtin + */ +function dl ($library) {} + + +/** + * The full path and filename of the file. If used inside an include, + * the name of the included file is returned. + * Since PHP 4.0.2, __FILE__ always contains an + * absolute path with symlinks resolved whereas in older versions it contained relative path + * under some circumstances. + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__FILE__', null); + +/** + * The current line number of the file. + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__LINE__', null); + +/** + * The class name. (Added in PHP 4.3.0) As of PHP 5 this constant + * returns the class name as it was declared (case-sensitive). In PHP + * 4 its value is always lowercased. + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__CLASS__', null); + +/** + * The function name. (Added in PHP 4.3.0) As of PHP 5 this constant + * returns the function name as it was declared (case-sensitive). In + * PHP 4 its value is always lowercased. + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__FUNCTION__', null); + +/** + * The class method name. (Added in PHP 5.0.0) The method name is + * returned as it was declared (case-sensitive). + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__METHOD__', null); + +/** + * The directory of the file. If used inside an include, + * the directory of the included file is returned. This is equivalent + * to dirname(__FILE__). This directory name + * does not have a trailing slash unless it is the root directory. + * (Added in PHP 5.3.0.) + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__DIR__', null); + +/** + * The name of the current namespace (case-sensitive). This constant + * is defined in compile-time (Added in PHP 5.3.0). + * @link http://www.php.net/manual/en/language.constants.php + */ +define ('__NAMESPACE__', null); +?> diff --git a/res/php-5.3-core-api/bcmath.php b/res/php-5.3-core-api/bcmath.php new file mode 100644 index 0000000..9b5861e --- /dev/null +++ b/res/php-5.3-core-api/bcmath.php @@ -0,0 +1,171 @@ + + * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional] + * @return string The sum of the two operands, as a string. + * + * @jms-builtin + */ +function bcadd ($left_operand, $right_operand, $scale = null) {} + +/** + * Subtract one arbitrary precision number from another + * @link http://www.php.net/manual/en/function.bcsub.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional] + * @return string The result of the subtraction, as a string. + * + * @jms-builtin + */ +function bcsub ($left_operand, $right_operand, $scale = null) {} + +/** + * Multiply two arbitrary precision number + * @link http://www.php.net/manual/en/function.bcmul.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional] + * @return string the result as a string. + * + * @jms-builtin + */ +function bcmul ($left_operand, $right_operand, $scale = null) {} + +/** + * Divide two arbitrary precision numbers + * @link http://www.php.net/manual/en/function.bcdiv.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional] + * @return string the result of the division as a string, or &null; if + * right_operand is 0. + * + * @jms-builtin + */ +function bcdiv ($left_operand, $right_operand, $scale = null) {} + +/** + * Get modulus of an arbitrary precision number + * @link http://www.php.net/manual/en/function.bcmod.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param modulus string

+ * The modulus, as a string. + *

+ * @return string the modulus as a string, or &null; if + * modulus is 0. + * + * @jms-builtin + */ +function bcmod ($left_operand, $modulus) {} + +/** + * Raise an arbitrary precision number to another + * @link http://www.php.net/manual/en/function.bcpow.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional] + * @return string the result as a string. + * + * @jms-builtin + */ +function bcpow ($left_operand, $right_operand, $scale = null) {} + +/** + * Get the square root of an arbitrary precision number + * @link http://www.php.net/manual/en/function.bcsqrt.php + * @param operand string

+ * The operand, as a string. + *

+ * @param scale int[optional] + * @return string the square root as a string, or &null; if + * operand is negative. + * + * @jms-builtin + */ +function bcsqrt ($operand, $scale = null) {} + +/** + * Set default scale parameter for all bc math functions + * @link http://www.php.net/manual/en/function.bcscale.php + * @param scale int

+ * The scale factor. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function bcscale ($scale) {} + +/** + * Compare two arbitrary precision numbers + * @link http://www.php.net/manual/en/function.bccomp.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param scale int[optional]

+ * The optional scale parameter is used to set the + * number of digits after the decimal place which will be used in the + * comparison. + *

+ * @return int 0 if the two operands are equal, 1 if the + * left_operand is larger than the + * right_operand, -1 otherwise. + * + * @jms-builtin + */ +function bccomp ($left_operand, $right_operand, $scale = null) {} + +/** + * Raise an arbitrary precision number to another, reduced by a specified modulus + * @link http://www.php.net/manual/en/function.bcpowmod.php + * @param left_operand string

+ * The left operand, as a string. + *

+ * @param right_operand string

+ * The right operand, as a string. + *

+ * @param modulus string

+ * The modulus, as a string. + *

+ * @param scale int[optional] + * @return string the result as a string, or &null; if modulus + * is 0. + * + * @jms-builtin + */ +function bcpowmod ($left_operand, $right_operand, $modulus, $scale = null) {} + +// End of bcmath v. +?> diff --git a/res/php-5.3-core-api/bz2.php b/res/php-5.3-core-api/bz2.php new file mode 100644 index 0000000..e1c0e44 --- /dev/null +++ b/res/php-5.3-core-api/bz2.php @@ -0,0 +1,176 @@ + + * The name of the file to open. + *

+ * @param mode string

+ * Similar to the fopen function, only 'r' (read) + * and 'w' (write) are supported. Everything else will cause bzopen + * to return false. + *

+ * @return resource If the open fails, bzopen returns false, otherwise + * it returns a pointer to the newly opened file. + * + * @jms-builtin + */ +function bzopen ($filename, $mode) {} + +/** + * Binary safe bzip2 file read + * @link http://www.php.net/manual/en/function.bzread.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @param length int[optional]

+ * If not specified, bzread will read 1024 + * (uncompressed) bytes at a time. + *

+ * @return string the uncompressed data, or false on error. + * + * @jms-builtin + */ +function bzread ($bz, $length = null) {} + +/** + * Binary safe bzip2 file write + * @link http://www.php.net/manual/en/function.bzwrite.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @param data string

+ * The written data. + *

+ * @param length int[optional]

+ * If supplied, writing will stop after length + * (uncompressed) bytes have been written or the end of + * data is reached, whichever comes first. + *

+ * @return int the number of bytes written, or false on error. + * + * @jms-builtin + */ +function bzwrite ($bz, $data, $length = null) {} + +/** + * Force a write of all buffered data + * @link http://www.php.net/manual/en/function.bzflush.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return int Returns true on success or false on failure. + * + * @jms-builtin + */ +function bzflush ($bz) {} + +/** + * Close a bzip2 file + * @link http://www.php.net/manual/en/function.bzclose.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return int Returns true on success or false on failure. + * + * @jms-builtin + */ +function bzclose ($bz) {} + +/** + * Returns a bzip2 error number + * @link http://www.php.net/manual/en/function.bzerrno.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return int the error number as an integer. + * + * @jms-builtin + */ +function bzerrno ($bz) {} + +/** + * Returns a bzip2 error string + * @link http://www.php.net/manual/en/function.bzerrstr.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return string a string containing the error message. + * + * @jms-builtin + */ +function bzerrstr ($bz) {} + +/** + * Returns the bzip2 error number and error string in an array + * @link http://www.php.net/manual/en/function.bzerror.php + * @param bz resource

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return array an associative array, with the error code in the + * errno entry, and the error message in the + * errstr entry. + * + * @jms-builtin + */ +function bzerror ($bz) {} + +/** + * Compress a string into bzip2 encoded data + * @link http://www.php.net/manual/en/function.bzcompress.php + * @param source string

+ * The string to compress. + *

+ * @param blocksize int[optional]

+ * Specifies the blocksize used during compression and should be a number + * from 1 to 9 with 9 giving the best compression, but using more + * resources to do so. + *

+ * @param workfactor int[optional]

+ * Controls how the compression phase behaves when presented with worst + * case, highly repetitive, input data. The value can be between 0 and + * 250 with 0 being a special case. + *

+ *

+ * Regardless of the workfactor, the generated + * output is the same. + *

+ * @return mixed The compressed string or number of error in case of error. + * + * @jms-builtin + */ +function bzcompress ($source, $blocksize = null, $workfactor = null) {} + +/** + * Decompresses bzip2 encoded data + * @link http://www.php.net/manual/en/function.bzdecompress.php + * @param source string

+ * The string to decompress. + *

+ * @param small int[optional]

+ * If true, an alternative decompression algorithm will be used which + * uses less memory (the maximum memory requirement drops to around 2300K) + * but works at roughly half the speed. + *

+ *

+ * See the bzip2 documentation for more + * information about this feature. + *

+ * @return mixed The decompressed string or number of error in case of error. + * + * @jms-builtin + */ +function bzdecompress ($source, $small = null) {} + +// End of bz2 v. +?> diff --git a/res/php-5.3-core-api/calendar.php b/res/php-5.3-core-api/calendar.php new file mode 100644 index 0000000..8950c73 --- /dev/null +++ b/res/php-5.3-core-api/calendar.php @@ -0,0 +1,336 @@ + + * A julian day number as integer + *

+ * @return string The gregorian date as a string in the form "month/day/year" + * + * @jms-builtin + */ +function jdtogregorian ($julianday) {} + +/** + * Converts a Gregorian date to Julian Day Count + * @link http://www.php.net/manual/en/function.gregoriantojd.php + * @param month int

+ * The month as a number from 1 (for January) to 12 (for December) + *

+ * @param day int

+ * The day as a number from 1 to 31 + *

+ * @param year int

+ * The year as a number between -4714 and 9999 + *

+ * @return int The julian day for the given gregorian date as an integer. + * + * @jms-builtin + */ +function gregoriantojd ($month, $day, $year) {} + +/** + * Converts a Julian Day Count to a Julian Calendar Date + * @link http://www.php.net/manual/en/function.jdtojulian.php + * @param julianday int

+ * A julian day number as integer + *

+ * @return string The julian date as a string in the form "month/day/year" + * + * @jms-builtin + */ +function jdtojulian ($julianday) {} + +/** + * Converts a Julian Calendar date to Julian Day Count + * @link http://www.php.net/manual/en/function.juliantojd.php + * @param month int

+ * The month as a number from 1 (for January) to 12 (for December) + *

+ * @param day int

+ * The day as a number from 1 to 31 + *

+ * @param year int

+ * The year as a number between -4713 and 9999 + *

+ * @return int The julian day for the given julian date as an integer. + * + * @jms-builtin + */ +function juliantojd ($month, $day, $year) {} + +/** + * Converts a Julian day count to a Jewish calendar date + * @link http://www.php.net/manual/en/function.jdtojewish.php + * @param juliandaycount int + * @param hebrew bool[optional]

+ * If the hebrew parameter is set to true, the + * fl parameter is used for Hebrew, string based, + * output format. + *

+ * @param fl int[optional]

+ * The available formats are: + * CAL_JEWISH_ADD_ALAFIM_GERESH, + * CAL_JEWISH_ADD_ALAFIM, + * CAL_JEWISH_ADD_GERESHAYIM. + *

+ * @return string The jewish date as a string in the form "month/day/year" + * + * @jms-builtin + */ +function jdtojewish ($juliandaycount, $hebrew = null, $fl = null) {} + +/** + * Converts a date in the Jewish Calendar to Julian Day Count + * @link http://www.php.net/manual/en/function.jewishtojd.php + * @param month int

+ * The month as a number from 1 to 13 + *

+ * @param day int

+ * The day as a number from 1 to 30 + *

+ * @param year int

+ * The year as a number between 1 and 9999 + *

+ * @return int The julian day for the given jewish date as an integer. + * + * @jms-builtin + */ +function jewishtojd ($month, $day, $year) {} + +/** + * Converts a Julian Day Count to the French Republican Calendar + * @link http://www.php.net/manual/en/function.jdtofrench.php + * @param juliandaycount int + * @return string The french revolution date as a string in the form "month/day/year" + * + * @jms-builtin + */ +function jdtofrench ($juliandaycount) {} + +/** + * Converts a date from the French Republican Calendar to a Julian Day Count + * @link http://www.php.net/manual/en/function.frenchtojd.php + * @param month int

+ * The month as a number from 1 (for Vendémiaire) to 13 (for the period of 5-6 days at the end of each year) + *

+ * @param day int

+ * The day as a number from 1 to 30 + *

+ * @param year int

+ * The year as a number between 1 and 14 + *

+ * @return int The julian day for the given french revolution date as an integer. + * + * @jms-builtin + */ +function frenchtojd ($month, $day, $year) {} + +/** + * Returns the day of the week + * @link http://www.php.net/manual/en/function.jddayofweek.php + * @param julianday int

+ * A julian day number as integer + *

+ * @param mode int[optional] + * Calendar week modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ModeMeaning
0 (Default) + * Return the day number as an int (0=Sunday, 1=Monday, etc) + *
1 + * Returns string containing the day of week + * (English-Gregorian) + *
2 + * Return a string containing the abbreviated day of week + * (English-Gregorian) + *
+ * @return mixed The gregorian weekday as either an integer or string. + * + * @jms-builtin + */ +function jddayofweek ($julianday, $mode = null) {} + +/** + * Returns a month name + * @link http://www.php.net/manual/en/function.jdmonthname.php + * @param julianday int + * @param mode int + * @return string The month name for the given Julian Day and calendar. + * + * @jms-builtin + */ +function jdmonthname ($julianday, $mode) {} + +/** + * Get Unix timestamp for midnight on Easter of a given year + * @link http://www.php.net/manual/en/function.easter-date.php + * @param year int[optional]

+ * The year as a number between 1970 an 2037 + *

+ * @return int The easter date as a unix timestamp. + * + * @jms-builtin + */ +function easter_date ($year = null) {} + +/** + * Get number of days after March 21 on which Easter falls for a given year + * @link http://www.php.net/manual/en/function.easter-days.php + * @param year int[optional]

+ * The year as a positive number + *

+ * @param method int[optional]

+ * Allows to calculate easter dates based + * on the Gregorian calendar during the years 1582 - 1752 when set to + * CAL_EASTER_ROMAN. See the calendar constants for more valid + * constants. + *

+ * @return int The number of days after March 21st that the Easter Sunday + * is in the given year. + * + * @jms-builtin + */ +function easter_days ($year = null, $method = null) {} + +/** + * Convert Unix timestamp to Julian Day + * @link http://www.php.net/manual/en/function.unixtojd.php + * @param timestamp int[optional]

+ * A unix timestamp to convert. + *

+ * @return int A julian day number as integer. + * + * @jms-builtin + */ +function unixtojd ($timestamp = null) {} + +/** + * Convert Julian Day to Unix timestamp + * @link http://www.php.net/manual/en/function.jdtounix.php + * @param jday int

+ * A julian day number between 2440588 and 2465342. + *

+ * @return int The unix timestamp for the start of the given julian day. + * + * @jms-builtin + */ +function jdtounix ($jday) {} + +/** + * Converts from a supported calendar to Julian Day Count + * @link http://www.php.net/manual/en/function.cal-to-jd.php + * @param calendar int

+ * Calendar to convert from, one of + * CAL_GREGORIAN, + * CAL_JULIAN, + * CAL_JEWISH or + * CAL_FRENCH. + *

+ * @param month int

+ * The month as a number, the valid range depends + * on the calendar + *

+ * @param day int

+ * The day as a number, the valid range depends + * on the calendar + *

+ * @param year int

+ * The year as a number, the valid range depends + * on the calendar + *

+ * @return int A Julian Day number. + * + * @jms-builtin + */ +function cal_to_jd ($calendar, $month, $day, $year) {} + +/** + * Converts from Julian Day Count to a supported calendar + * @link http://www.php.net/manual/en/function.cal-from-jd.php + * @param jd int

+ * Julian day as integer + *

+ * @param calendar int

+ * Calendar to convert to + *

+ * @return array an array containing calendar information like month, day, year, + * day of week, abbreviated and full names of weekday and month and the + * date in string form "month/day/year". + * + * @jms-builtin + */ +function cal_from_jd ($jd, $calendar) {} + +/** + * Return the number of days in a month for a given year and calendar + * @link http://www.php.net/manual/en/function.cal-days-in-month.php + * @param calendar int

+ * Calendar to use for calculation + *

+ * @param month int

+ * Month in the selected calendar + *

+ * @param year int

+ * Year in the selected calendar + *

+ * @return int The length in days of the selected month in the given calendar + * + * @jms-builtin + */ +function cal_days_in_month ($calendar, $month, $year) {} + +/** + * Returns information about a particular calendar + * @link http://www.php.net/manual/en/function.cal-info.php + * @param calendar int[optional]

+ * Calendar to return information for. If no calendar is specified + * information about all calendars is returned. + *

+ * @return array + * + * @jms-builtin + */ +function cal_info ($calendar = null) {} + +define ('CAL_GREGORIAN', 0); +define ('CAL_JULIAN', 1); +define ('CAL_JEWISH', 2); +define ('CAL_FRENCH', 3); +define ('CAL_NUM_CALS', 4); +define ('CAL_DOW_DAYNO', 0); +define ('CAL_DOW_SHORT', 1); +define ('CAL_DOW_LONG', 2); +define ('CAL_MONTH_GREGORIAN_SHORT', 0); +define ('CAL_MONTH_GREGORIAN_LONG', 1); +define ('CAL_MONTH_JULIAN_SHORT', 2); +define ('CAL_MONTH_JULIAN_LONG', 3); +define ('CAL_MONTH_JEWISH', 4); +define ('CAL_MONTH_FRENCH', 5); +define ('CAL_EASTER_DEFAULT', 0); +define ('CAL_EASTER_ROMAN', 1); +define ('CAL_EASTER_ALWAYS_GREGORIAN', 2); +define ('CAL_EASTER_ALWAYS_JULIAN', 3); +define ('CAL_JEWISH_ADD_ALAFIM_GERESH', 2); +define ('CAL_JEWISH_ADD_ALAFIM', 4); +define ('CAL_JEWISH_ADD_GERESHAYIM', 8); + +// End of calendar v. +?> diff --git a/res/php-5.3-core-api/com_dotnet.php b/res/php-5.3-core-api/com_dotnet.php new file mode 100644 index 0000000..234b564 --- /dev/null +++ b/res/php-5.3-core-api/com_dotnet.php @@ -0,0 +1,898 @@ + + * The variant. + *

+ * @param value mixed

+ *

+ * @return void + * + * @jms-builtin + */ +function variant_set (variant $variant, $value) {} + +/** + * "Adds" two variant values together and returns the result + * @link http://www.php.net/manual/en/function.variant-add.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed the result. + * + * @jms-builtin + */ +function variant_add ($left, $right) {} + +/** + * concatenates two variant values together and returns the result + * @link http://www.php.net/manual/en/function.variant-cat.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed the result of the concatenation. + * + * @jms-builtin + */ +function variant_cat ($left, $right) {} + +/** + * Subtracts the value of the right variant from the left variant value + * @link http://www.php.net/manual/en/function.variant-sub.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant Subtraction Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IfThen
Both expressions are of the string typeSubtraction
One expression is a string type and the other a + * characterSubtraction
One expression is numeric and the other is a stringSubtraction.
Both expressions are numericSubtraction
Either expression is NULLNULL is returned
Both expressions are emptyEmpty string is returned
+ * + * @jms-builtin + */ +function variant_sub ($left, $right) {} + +/** + * Multiplies the values of the two variants + * @link http://www.php.net/manual/en/function.variant-mul.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant Multiplication Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IfThen
Both expressions are of the string, date, character, boolean typeMultiplication
One expression is a string type and the other a + * characterMultiplication
One expression is numeric and the other is a stringMultiplication
Both expressions are numericMultiplication
Either expression is NULLNULL is returned
Both expressions are emptyEmpty string is returned
+ * + * @jms-builtin + */ +function variant_mul ($left, $right) {} + +/** + * Performs a bitwise AND operation between two variants + * @link http://www.php.net/manual/en/function.variant-and.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant AND Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
If left isIf right isthen the result is
truetruetrue
truefalsefalse
true&null;&null;
falsetruefalse
falsefalsefalse
false&null;false
&null;true&null;
&null;falsefalse
&null;&null;&null;
+ * + * @jms-builtin + */ +function variant_and ($left, $right) {} + +/** + * Returns the result from dividing two variants + * @link http://www.php.net/manual/en/function.variant-div.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant Division Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IfThen
Both expressions are of the string, date, character, boolean typeDouble is returned
One expression is a string type and the other a + * characterDivision and a double is returned
One expression is numeric and the other is a stringDivision and a double is returned.
Both expressions are numericDivision and a double is returned
Either expression is NULLNULL is returned
right is empty and + * left is anything but emptyA com_exception with code DISP_E_DIVBYZERO + * is thrown
left is empty and + * right is anything but empty.0 as type double is returned
Both expressions are emptyA com_exception with code DISP_E_OVERFLOW + * is thrown
+ * + * @jms-builtin + */ +function variant_div ($left, $right) {} + +/** + * Performs a bitwise equivalence on two variants + * @link http://www.php.net/manual/en/function.variant-eqv.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed If each bit in left is equal to the corresponding + * bit in right then true is returned, otherwise + * false is returned. + * + * @jms-builtin + */ +function variant_eqv ($left, $right) {} + +/** + * Converts variants to integers and then returns the result from dividing them + * @link http://www.php.net/manual/en/function.variant-idiv.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant Integer Division Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IfThen
Both expressions are of the string, date, character, boolean typeDivision and integer is returned
One expression is a string type and the other a + * characterDivision
One expression is numeric and the other is a stringDivision
Both expressions are numericDivision
Either expression is NULLNULL is returned
Both expressions are emptyA com_exception with code DISP_E_DIVBYZERO + * is thrown
+ * + * @jms-builtin + */ +function variant_idiv ($left, $right) {} + +/** + * Performs a bitwise implication on two variants + * @link http://www.php.net/manual/en/function.variant-imp.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant Implication Table + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
If left isIf right isthen the result is
truetruetrue
truefalsetrue
true&null;true
falsetruetrue
falsefalsetrue
false&null;true
&null;truetrue
&null;false&null;
&null;&null;&null;
+ * + * @jms-builtin + */ +function variant_imp ($left, $right) {} + +/** + * Divides two variants and returns only the remainder + * @link http://www.php.net/manual/en/function.variant-mod.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed the remainder of the division. + * + * @jms-builtin + */ +function variant_mod ($left, $right) {} + +/** + * Performs a logical disjunction on two variants + * @link http://www.php.net/manual/en/function.variant-or.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant OR Rules + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
If left isIf right isthen the result is
truetruetrue
truefalsetrue
true&null;true
falsetruetrue
falsefalsefalse
false&null;&null;
&null;truetrue
&null;false&null;
&null;&null;&null;
+ * + * @jms-builtin + */ +function variant_or ($left, $right) {} + +/** + * Returns the result of performing the power function with two variants + * @link http://www.php.net/manual/en/function.variant-pow.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed the result of left to the power of + * right. + * + * @jms-builtin + */ +function variant_pow ($left, $right) {} + +/** + * Performs a logical exclusion on two variants + * @link http://www.php.net/manual/en/function.variant-xor.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @return mixed + * Variant XOR Rules + * + * + * + * + * + * + * + * + * + * + *
If left isIf right isthen the result is
truetruefalse
truefalsetrue
falsetruetrue
falsefalsefalse
&null;&null;&null;
+ * + * @jms-builtin + */ +function variant_xor ($left, $right) {} + +/** + * Returns the absolute value of a variant + * @link http://www.php.net/manual/en/function.variant-abs.php + * @param val mixed

+ * The variant. + *

+ * @return mixed the absolute value of val. + * + * @jms-builtin + */ +function variant_abs ($val) {} + +/** + * Returns the integer portion of a variant + * @link http://www.php.net/manual/en/function.variant-fix.php + * @param variant mixed

+ * The variant. + *

+ * @return mixed If variant is negative, then the first negative + * integer greater than or equal to the variant is returned, otherwise + * returns the integer portion of the value of + * variant. + * + * @jms-builtin + */ +function variant_fix ($variant) {} + +/** + * Returns the integer portion of a variant + * @link http://www.php.net/manual/en/function.variant-int.php + * @param variant mixed

+ * The variant. + *

+ * @return mixed If variant is negative, then the first negative + * integer greater than or equal to the variant is returned, otherwise + * returns the integer portion of the value of + * variant. + * + * @jms-builtin + */ +function variant_int ($variant) {} + +/** + * Performs logical negation on a variant + * @link http://www.php.net/manual/en/function.variant-neg.php + * @param variant mixed

+ * The variant. + *

+ * @return mixed the result of the logical negation. + * + * @jms-builtin + */ +function variant_neg ($variant) {} + +/** + * Performs bitwise not negation on a variant + * @link http://www.php.net/manual/en/function.variant-not.php + * @param variant mixed

+ * The variant. + *

+ * @return mixed the bitwise not negation. If variant is + * &null;, the result will also be &null;. + * + * @jms-builtin + */ +function variant_not ($variant) {} + +/** + * Rounds a variant to the specified number of decimal places + * @link http://www.php.net/manual/en/function.variant-round.php + * @param variant mixed

+ * The variant. + *

+ * @param decimals int

+ * Number of decimal places. + *

+ * @return mixed the rounded value. + * + * @jms-builtin + */ +function variant_round ($variant, $decimals) {} + +/** + * Compares two variants + * @link http://www.php.net/manual/en/function.variant-cmp.php + * @param left mixed

+ * The left operand. + *

+ * @param right mixed

+ * The right operand. + *

+ * @param lcid int[optional]

+ * A valid Locale Identifier to use when comparing strings (this affects + * string collation). + *

+ * @param flags int[optional]

+ * flags can be one or more of the following values + * OR'd together, and affects string comparisons: + * + * Variant Comparision Flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
valuemeaning
NORM_IGNORECASECompare case insensitively
NORM_IGNORENONSPACEIgnore nonspacing characters
NORM_IGNORESYMBOLSIgnore symbols
NORM_IGNOREWIDTHIgnore string width
NORM_IGNOREKANATYPEIgnore Kana type
NORM_IGNOREKASHIDAIgnore Arabic kashida characters
+ *

+ * @return int one of the following: + * + * Variant Comparision Results + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
valuemeaning
VARCMP_LTleft is less than + * right + *
VARCMP_EQleft is equal to + * right + *
VARCMP_GTleft is greater than + * right + *
VARCMP_NULLEither left, + * right or both are &null; + *
+ * + * @jms-builtin + */ +function variant_cmp ($left, $right, $lcid = null, $flags = null) {} + +/** + * Converts a variant date/time value to Unix timestamp + * @link http://www.php.net/manual/en/function.variant-date-to-timestamp.php + * @param variant variant

+ * The variant. + *

+ * @return int a unix timestamp. + * + * @jms-builtin + */ +function variant_date_to_timestamp (variant $variant) {} + +/** + * Returns a variant date representation of a Unix timestamp + * @link http://www.php.net/manual/en/function.variant-date-from-timestamp.php + * @param timestamp int

+ * A unix timestamp. + *

+ * @return variant a VT_DATE variant. + * + * @jms-builtin + */ +function variant_date_from_timestamp ($timestamp) {} + +/** + * Returns the type of a variant object + * @link http://www.php.net/manual/en/function.variant-get-type.php + * @param variant variant

+ * The variant object. + *

+ * @return int This function returns an integer value that indicates the type of + * variant, which can be an instance of + * , or + * classes. The return value can be compared + * to one of the VT_XXX constants. + *

+ *

+ * The return value for COM and DOTNET objects will usually be + * VT_DISPATCH; the only reason this function works for + * those classes is because COM and DOTNET are descendants of VARIANT. + *

+ *

+ * In PHP versions prior to 5, you could obtain this information from + * instances of the VARIANT class ONLY, by reading a fake + * type property. See the class for more information on + * this. + * + * @jms-builtin + */ +function variant_get_type (variant $variant) {} + +/** + * Convert a variant into another type "in-place" + * @link http://www.php.net/manual/en/function.variant-set-type.php + * @param variant variant

+ * The variant. + *

+ * @param type int

+ *

+ * @return void + * + * @jms-builtin + */ +function variant_set_type (variant $variant, $type) {} + +/** + * Convert a variant into a new variant object of another type + * @link http://www.php.net/manual/en/function.variant-cast.php + * @param variant variant

+ * The variant. + *

+ * @param type int

+ * type should be one of the + * VT_XXX constants. + *

+ * @return variant a VT_DATE variant. + * + * @jms-builtin + */ +function variant_cast (variant $variant, $type) {} + +/** + * Generate a globally unique identifier (GUID) + * @link http://www.php.net/manual/en/function.com-create-guid.php + * @return string the GUID as a string. + * + * @jms-builtin + */ +function com_create_guid () {} + +/** + * Connect events from a COM object to a PHP object + * @link http://www.php.net/manual/en/function.com-event-sink.php + * @param comobject variant

+ *

+ * @param sinkobject object

+ * sinkobject should be an instance of a class with + * methods named after those of the desired dispinterface; you may use + * com_print_typeinfo to help generate a template class + * for this purpose. + *

+ * @param sinkinterface mixed[optional]

+ * PHP will attempt to use the default dispinterface type specified by + * the typelibrary associated with comobject, but + * you may override this choice by setting + * sinkinterface to the name of the dispinterface + * that you want to use. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function com_event_sink (variant $comobject, $sinkobject, $sinkinterface = null) {} + +/** + * Print out a PHP class definition for a dispatchable interface + * @link http://www.php.net/manual/en/function.com-print-typeinfo.php + * @param comobject object

+ * comobject should be either an instance of a COM + * object, or be the name of a typelibrary (which will be resolved according + * to the rules set out in com_load_typelib). + *

+ * @param dispinterface string[optional]

+ * The name of an IDispatch descendant interface that you want to display. + *

+ * @param wantsink bool[optional]

+ * If set to true, the corresponding sink interface will be displayed + * instead. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function com_print_typeinfo ($comobject, $dispinterface = null, $wantsink = null) {} + +/** + * Process COM messages, sleeping for up to timeoutms milliseconds + * @link http://www.php.net/manual/en/function.com-message-pump.php + * @param timeoutms int[optional]

+ * The timeout, in milliseconds. + *

+ *

+ * If you do not specify a value for timeoutms, + * then 0 will be assumed. A 0 value means that no waiting will be + * performed; if there are messages pending they will be dispatched as + * before; if there are no messages pending, the function will return + * false immediately without sleeping. + *

+ * @return bool If a message or messages arrives before the timeout, they will be + * dispatched, and the function will return true. If the timeout occurs and + * no messages were processed, the return value will be false. + * + * @jms-builtin + */ +function com_message_pump ($timeoutms = null) {} + +/** + * Loads a Typelib + * @link http://www.php.net/manual/en/function.com-load-typelib.php + * @param typelib_name string

+ * typelib_name can be one of the following: + *

+ * The filename of a .tlb file or the executable module + * that contains the type library. + *

+ * @param case_insensitive bool[optional]

+ * The case_insensitive behaves in the same way as + * the parameter with the same name in the define + * function. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function com_load_typelib ($typelib_name, $case_insensitive = null) {} + +/** + * Returns a handle to an already running instance of a COM object + * @link http://www.php.net/manual/en/function.com-get-active-object.php + * @param progid string

+ * progid must be either the ProgID or CLSID for + * the object that you want to access (for example + * Word.Application). + *

+ * @param code_page int[optional]

+ * Acts in precisely the same way that it does for the class. + *

+ * @return variant If the requested object is running, it will be returned to your script + * just like any other COM object. + * + * @jms-builtin + */ +function com_get_active_object ($progid, $code_page = null) {} + +define ('CLSCTX_INPROC_SERVER', 1); +define ('CLSCTX_INPROC_HANDLER', 2); +define ('CLSCTX_LOCAL_SERVER', 4); +define ('CLSCTX_REMOTE_SERVER', 16); +define ('CLSCTX_SERVER', 21); +define ('CLSCTX_ALL', 23); +define ('VT_NULL', 1); +define ('VT_EMPTY', 0); +define ('VT_UI1', 17); +define ('VT_I1', 16); +define ('VT_UI2', 18); +define ('VT_I2', 2); +define ('VT_UI4', 19); +define ('VT_I4', 3); +define ('VT_R4', 4); +define ('VT_R8', 5); +define ('VT_BOOL', 11); +define ('VT_ERROR', 10); +define ('VT_CY', 6); +define ('VT_DATE', 7); +define ('VT_BSTR', 8); +define ('VT_DECIMAL', 14); +define ('VT_UNKNOWN', 13); +define ('VT_DISPATCH', 9); +define ('VT_VARIANT', 12); +define ('VT_INT', 22); +define ('VT_UINT', 23); +define ('VT_ARRAY', 8192); +define ('VT_BYREF', 16384); +define ('CP_ACP', 0); +define ('CP_MACCP', 2); +define ('CP_OEMCP', 1); +define ('CP_UTF7', 65000); +define ('CP_UTF8', 65001); +define ('CP_SYMBOL', 42); +define ('CP_THREAD_ACP', 3); +define ('VARCMP_LT', 0); +define ('VARCMP_EQ', 1); +define ('VARCMP_GT', 2); +define ('VARCMP_NULL', 3); +define ('NORM_IGNORECASE', 1); +define ('NORM_IGNORENONSPACE', 2); +define ('NORM_IGNORESYMBOLS', 4); +define ('NORM_IGNOREWIDTH', 131072); +define ('NORM_IGNOREKANATYPE', 65536); +define ('DISP_E_DIVBYZERO', -2147352558); +define ('DISP_E_OVERFLOW', -2147352566); +define ('DISP_E_BADINDEX', -2147352565); +define ('MK_E_UNAVAILABLE', -2147221021); + +// End of com_dotnet v.0.1 +?> diff --git a/res/php-5.3-core-api/ctype.php b/res/php-5.3-core-api/ctype.php new file mode 100644 index 0000000..0e99752 --- /dev/null +++ b/res/php-5.3-core-api/ctype.php @@ -0,0 +1,156 @@ + + * The tested string. + *

+ * @return bool true if every character in text is either + * a letter or a digit, false otherwise. + * + * @jms-builtin + */ +function ctype_alnum ($text) {} + +/** + * Check for alphabetic character(s) + * @link http://www.php.net/manual/en/function.ctype-alpha.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * a letter from the current locale, false otherwise. + * + * @jms-builtin + */ +function ctype_alpha ($text) {} + +/** + * Check for control character(s) + * @link http://www.php.net/manual/en/function.ctype-cntrl.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * a control character from the current locale, false otherwise. + * + * @jms-builtin + */ +function ctype_cntrl ($text) {} + +/** + * Check for numeric character(s) + * @link http://www.php.net/manual/en/function.ctype-digit.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in the string + * text is a decimal digit, false otherwise. + * + * @jms-builtin + */ +function ctype_digit ($text) {} + +/** + * Check for lowercase character(s) + * @link http://www.php.net/manual/en/function.ctype-lower.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * a lowercase letter in the current locale. + * + * @jms-builtin + */ +function ctype_lower ($text) {} + +/** + * Check for any printable character(s) except space + * @link http://www.php.net/manual/en/function.ctype-graph.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * printable and actually creates visible output (no white space), false + * otherwise. + * + * @jms-builtin + */ +function ctype_graph ($text) {} + +/** + * Check for printable character(s) + * @link http://www.php.net/manual/en/function.ctype-print.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text + * will actually create output (including blanks). Returns false if + * text contains control characters or characters + * that do not have any output or control function at all. + * + * @jms-builtin + */ +function ctype_print ($text) {} + +/** + * Check for any printable character which is not whitespace or an + alphanumeric character + * @link http://www.php.net/manual/en/function.ctype-punct.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text + * is printable, but neither letter, digit or blank, false otherwise. + * + * @jms-builtin + */ +function ctype_punct ($text) {} + +/** + * Check for whitespace character(s) + * @link http://www.php.net/manual/en/function.ctype-space.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text + * creates some sort of white space, false otherwise. Besides the + * blank character this also includes tab, vertical tab, line feed, + * carriage return and form feed characters. + * + * @jms-builtin + */ +function ctype_space ($text) {} + +/** + * Check for uppercase character(s) + * @link http://www.php.net/manual/en/function.ctype-upper.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * an uppercase letter in the current locale. + * + * @jms-builtin + */ +function ctype_upper ($text) {} + +/** + * Check for character(s) representing a hexadecimal digit + * @link http://www.php.net/manual/en/function.ctype-xdigit.php + * @param text string

+ * The tested string. + *

+ * @return bool true if every character in text is + * a hexadecimal 'digit', that is a decimal digit or a character from + * [A-Fa-f] , false otherwise. + * + * @jms-builtin + */ +function ctype_xdigit ($text) {} + +// End of ctype v. +?> diff --git a/res/php-5.3-core-api/curl.php b/res/php-5.3-core-api/curl.php new file mode 100644 index 0000000..32b0563 --- /dev/null +++ b/res/php-5.3-core-api/curl.php @@ -0,0 +1,1584 @@ + + * If provided, the CURLOPT_URL option will be set + * to its value. You can manually set this using the + * curl_setopt function. + *

+ * @return resource a cURL handle on success, false on errors. + * + * @jms-builtin + */ +function curl_init ($url = null) {} + +/** + * Copy a cURL handle along with all of its preferences + * @link http://www.php.net/manual/en/function.curl-copy-handle.php + * @param ch resource + * @return resource a new cURL handle. + * + * @jms-builtin + */ +function curl_copy_handle ($ch) {} + +/** + * Gets cURL version information + * @link http://www.php.net/manual/en/function.curl-version.php + * @param age int[optional]

+ *

+ * @return array an associative array with the following elements: + * + * Indice + * Value description + * + * + * version_number + * cURL 24 bit version number + * + * + * version + * cURL version number, as a string + * + * + * ssl_version_number + * OpenSSL 24 bit version number + * + * + * ssl_version + * OpenSSL version number, as a string + * + * + * libz_version + * zlib version number, as a string + * + * + * host + * Information about the host where cURL was built + * + * + * age + * + * + * + * features + * A bitmask of the CURL_VERSION_XXX constants + * + * + * protocols + * An array of protocols names supported by cURL + * + * + * @jms-builtin + */ +function curl_version ($age = null) {} + +/** + * Set an option for a cURL transfer + * @link http://www.php.net/manual/en/function.curl-setopt.php + * @param ch resource + * @param option int

+ * The CURLOPT_XXX option to set. + *

+ * @param value mixed

+ * The value to be set on option. + *

+ *

+ * value should be a bool for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_AUTOREFERER + * true to automatically set the Referer: field in + * requests where it follows a Location: redirect. + * + * + * + * + * CURLOPT_BINARYTRANSFER + * true to return the raw output when + * CURLOPT_RETURNTRANSFER is used. + * + * + * + * + * CURLOPT_COOKIESESSION + * true to mark this as a new cookie "session". It will force libcurl + * to ignore all cookies it is about to load that are "session cookies" + * from the previous session. By default, libcurl always stores and + * loads all cookies, independent if they are session cookies or not. + * Session cookies are cookies without expiry date and they are meant + * to be alive and existing for this "session" only. + * + * + * + * + * CURLOPT_CRLF + * true to convert Unix newlines to CRLF newlines + * on transfers. + * + * + * + * + * CURLOPT_DNS_USE_GLOBAL_CACHE + * true to use a global DNS cache. This option is + * not thread-safe and is enabled by default. + * + * + * + * + * CURLOPT_FAILONERROR + * true to fail silently if the HTTP code returned + * is greater than or equal to 400. The default behavior is to return + * the page normally, ignoring the code. + * + * + * + * + * CURLOPT_FILETIME + * true to attempt to retrieve the modification + * date of the remote document. This value can be retrieved using + * the CURLINFO_FILETIME option with + * curl_getinfo. + * + * + * + * + * CURLOPT_FOLLOWLOCATION + * true to follow any + * "Location: " header that the server sends as + * part of the HTTP header (note this is recursive, PHP will follow as + * many "Location: " headers that it is sent, + * unless CURLOPT_MAXREDIRS is set). + * + * + * + * + * CURLOPT_FORBID_REUSE + * true to force the connection to explicitly + * close when it has finished processing, and not be pooled for reuse. + * + * + * + * + * CURLOPT_FRESH_CONNECT + * true to force the use of a new connection + * instead of a cached one. + * + * + * + * + * CURLOPT_FTP_USE_EPRT + * true to use EPRT (and LPRT) when doing active + * FTP downloads. Use false to disable EPRT and LPRT and use PORT + * only. + * + * + * + * + * CURLOPT_FTP_USE_EPSV + * true to first try an EPSV command for FTP + * transfers before reverting back to PASV. Set to false + * to disable EPSV. + * + * + * + * + * CURLOPT_FTPAPPEND + * true to append to the remote file instead of + * overwriting it. + * + * + * + * + * CURLOPT_FTPASCII + * An alias of + * CURLOPT_TRANSFERTEXT. Use that instead. + * + * + * + * + * CURLOPT_FTPLISTONLY + * true to only list the names of an FTP + * directory. + * + * + * + * + * CURLOPT_HEADER + * true to include the header in the output. + * + * + * + * + * CURLINFO_HEADER_OUT + * true to track the handle's request string. + * + * Available since PHP 5.1.3. The CURLINFO_ + * prefix is intentional. + * + * + * + * CURLOPT_HTTPGET + * true to reset the HTTP request method to GET. + * Since GET is the default, this is only necessary if the request + * method has been changed. + * + * + * + * + * CURLOPT_HTTPPROXYTUNNEL + * true to tunnel through a given HTTP proxy. + * + * + * + * + * CURLOPT_MUTE + * true to be completely silent with regards to + * the cURL functions. + * + * + * + * + * CURLOPT_NETRC + * true to scan the ~/.netrc + * file to find a username and password for the remote site that + * a connection is being established with. + * + * + * + * + * CURLOPT_NOBODY + * true to exclude the body from the output. + * Request method is then set to HEAD. Changing this to false does + * not change it to GET. + * + * + * + * + * CURLOPT_NOPROGRESS + *

+ * true to disable the progress meter for cURL transfers. + *

+ * PHP automatically sets this option to true, this should only be + * changed for debugging purposes. + *

+ *

+ * + * + * + * CURLOPT_NOSIGNAL + * true to ignore any cURL function that causes a + * signal to be sent to the PHP process. This is turned on by default + * in multi-threaded SAPIs so timeout options can still be used. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_POST + * true to do a regular HTTP POST. This POST is the + * normal application/x-www-form-urlencoded kind, + * most commonly used by HTML forms. + * + * + * + * + * CURLOPT_PUT + * true to HTTP PUT a file. The file to PUT must + * be set with CURLOPT_INFILE and + * CURLOPT_INFILESIZE. + * + * + * + * + * CURLOPT_RETURNTRANSFER + * true to return the transfer as a string of the + * return value of curl_exec instead of outputting + * it out directly. + * + * + * + * + * CURLOPT_SSL_VERIFYPEER + * false to stop cURL from verifying the peer's + * certificate. Alternate certificates to verify against can be + * specified with the CURLOPT_CAINFO option + * or a certificate directory can be specified with the + * CURLOPT_CAPATH option. + * CURLOPT_SSL_VERIFYHOST may also need to be + * true or false if + * CURLOPT_SSL_VERIFYPEER is disabled (it + * defaults to 2). + * + * true by default as of cURL 7.10. Default bundle installed as of + * cURL 7.10. + * + * + * + * CURLOPT_TRANSFERTEXT + * true to use ASCII mode for FTP transfers. + * For LDAP, it retrieves data in plain text instead of HTML. On + * Windows systems, it will not set STDOUT to binary + * mode. + * + * + * + * + * CURLOPT_UNRESTRICTED_AUTH + * true to keep sending the username and password + * when following locations (using + * CURLOPT_FOLLOWLOCATION), even when the + * hostname has changed. + * + * + * + * + * CURLOPT_UPLOAD + * true to prepare for an upload. + * + * + * + * + * CURLOPT_VERBOSE + * true to output verbose information. Writes + * output to STDERR, or the file specified using + * CURLOPT_STDERR. + * + * + * + *

+ *

+ * value should be an integer for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_BUFFERSIZE + * The size of the buffer to use for each read. There is no guarantee + * this request will be fulfilled, however. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_CLOSEPOLICY + * Either + * CURLCLOSEPOLICY_LEAST_RECENTLY_USED or + * CURLCLOSEPOLICY_OLDEST. + * There are three other CURLCLOSEPOLICY_ + * constants, but cURL does not support them yet. + * + * + * + * + * CURLOPT_CONNECTTIMEOUT + * The number of seconds to wait while trying to connect. Use 0 to + * wait indefinitely. + * + * + * + * + * CURLOPT_CONNECTTIMEOUT_MS + * The number of milliseconds to wait while trying to connect. Use 0 to + * wait indefinitely. + * + * Added in cURL 7.16.2. Available since PHP 5.2.3. + * + * + * + * CURLOPT_DNS_CACHE_TIMEOUT + * The number of seconds to keep DNS entries in memory. This + * option is set to 120 (2 minutes) by default. + * + * + * + * + * CURLOPT_FTPSSLAUTH + * The FTP authentication method (when is activated): + * CURLFTPAUTH_SSL (try SSL first), + * CURLFTPAUTH_TLS (try TLS first), or + * CURLFTPAUTH_DEFAULT (let cURL decide). + * + * Added in cURL 7.12.2. + * + * + * + * CURLOPT_HTTP_VERSION + * CURL_HTTP_VERSION_NONE (default, lets CURL + * decide which version to use), + * CURL_HTTP_VERSION_1_0 (forces HTTP/1.0), + * or CURL_HTTP_VERSION_1_1 (forces HTTP/1.1). + * + * + * + * + * CURLOPT_HTTPAUTH + *

+ * The HTTP authentication method(s) to use. The options are: + * CURLAUTH_BASIC, + * CURLAUTH_DIGEST, + * CURLAUTH_GSSNEGOTIATE, + * CURLAUTH_NTLM, + * CURLAUTH_ANY, and + * CURLAUTH_ANYSAFE. + *

+ *

+ * The bitwise | (or) operator can be used to combine + * more than one method. If this is done, cURL will poll the server to see + * what methods it supports and pick the best one. + *

+ *

+ * CURLAUTH_ANY is an alias for + * CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. + *

+ *

+ * CURLAUTH_ANYSAFE is an alias for + * CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. + *

+ * + * + * + * + * CURLOPT_INFILESIZE + * The expected size, in bytes, of the file when uploading a file to a + * remote site. + * + * + * + * + * CURLOPT_LOW_SPEED_LIMIT + * The transfer speed, in bytes per second, that the transfer should be + * below during the count of CURLOPT_LOW_SPEED_TIME + * seconds before PHP considers the transfer too slow and aborts. + * + * + * + * + * CURLOPT_LOW_SPEED_TIME + * The number of seconds the transfer speed should be below + * CURLOPT_LOW_SPEED_LIMIT before PHP considers + * the transfer too slow and aborts. + * + * + * + * + * CURLOPT_MAXCONNECTS + * The maximum amount of persistent connections that are allowed. + * When the limit is reached, + * CURLOPT_CLOSEPOLICY is used to determine + * which connection to close. + * + * + * + * + * CURLOPT_MAXREDIRS + * The maximum amount of HTTP redirections to follow. Use this option + * alongside CURLOPT_FOLLOWLOCATION. + * + * + * + * + * CURLOPT_PORT + * An alternative port number to connect to. + * + * + * + * + * CURLOPT_PROTOCOLS + *

+ * Bitmask of CURLPROTO_* values. If used, this bitmask + * limits what protocols libcurl may use in the transfer. This allows you to have + * a libcurl built to support a wide range of protocols but still limit specific + * transfers to only be allowed to use a subset of them. By default libcurl will + * accept all protocols it supports. + * See also CURLOPT_REDIR_PROTOCOLS. + *

+ *

+ * Valid protocol options are: + * CURLPROTO_HTTP, + * CURLPROTO_HTTPS, + * CURLPROTO_FTP, + * CURLPROTO_FTPS, + * CURLPROTO_SCP, + * CURLPROTO_SFTP, + * CURLPROTO_TELNET, + * CURLPROTO_LDAP, + * CURLPROTO_LDAPS, + * CURLPROTO_DICT, + * CURLPROTO_FILE, + * CURLPROTO_TFTP, + * CURLPROTO_ALL + *

+ * + * Added in cURL 7.19.4. + * + * + * + * CURLOPT_PROXYAUTH + * The HTTP authentication method(s) to use for the proxy connection. + * Use the same bitmasks as described in + * CURLOPT_HTTPAUTH. For proxy authentication, + * only CURLAUTH_BASIC and + * CURLAUTH_NTLM are currently supported. + * + * Added in cURL 7.10.7. + * + * + * + * CURLOPT_PROXYPORT + * The port number of the proxy to connect to. This port number can + * also be set in CURLOPT_PROXY. + * + * + * + * + * CURLOPT_PROXYTYPE + * Either CURLPROXY_HTTP (default) or + * CURLPROXY_SOCKS5. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_REDIR_PROTOCOLS + * Bitmask of CURLPROTO_* values. If used, this bitmask + * limits what protocols libcurl may use in a transfer that it follows to in + * a redirect when CURLOPT_FOLLOWLOCATION is enabled. + * This allows you to limit specific transfers to only be allowed to use a subset + * of protocols in redirections. By default libcurl will allow all protocols + * except for FILE and SCP. This is a difference compared to pre-7.19.4 versions + * which unconditionally would follow to all protocols supported. + * See also CURLOPT_PROTOCOLS for protocol constant values. + * + * Added in cURL 7.19.4. + * + * + * + * CURLOPT_RESUME_FROM + * The offset, in bytes, to resume a transfer from. + * + * + * + * + * CURLOPT_SSL_VERIFYHOST + * 1 to check the existence of a common name in the + * SSL peer certificate. 2 to check the existence of + * a common name and also verify that it matches the hostname + * provided. + * + * + * + * + * CURLOPT_SSLVERSION + * The SSL version (2 or 3) to use. By default PHP will try to determine + * this itself, although in some cases this must be set manually. + * + * + * + * + * CURLOPT_TIMECONDITION + * How CURLOPT_TIMEVALUE is treated. + * Use CURL_TIMECOND_IFMODSINCE to return the + * page only if it has been modified since the time specified in + * CURLOPT_TIMEVALUE. If it hasn't been modified, + * a "304 Not Modified" header will be returned + * assuming CURLOPT_HEADER is true. + * Use CURL_TIMECOND_IFUNMODSINCE for the reverse + * effect. CURL_TIMECOND_IFMODSINCE is the + * default. + * + * + * + * + * CURLOPT_TIMEOUT + * The maximum number of seconds to allow cURL functions to execute. + * + * + * + * + * CURLOPT_TIMEOUT_MS + * The maximum number of milliseconds to allow cURL functions to + * execute. + * + * Added in cURL 7.16.2. Available since PHP 5.2.3. + * + * + * + * CURLOPT_TIMEVALUE + * The time in seconds since January 1st, 1970. The time will be used + * by CURLOPT_TIMECONDITION. By default, + * CURL_TIMECOND_IFMODSINCE is used. + * + * + * + *

+ *

+ * value should be a string for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_CAINFO + * The name of a file holding one or more certificates to verify the + * peer with. This only makes sense when used in combination with + * CURLOPT_SSL_VERIFYPEER. + * + * + * + * + * CURLOPT_CAPATH + * A directory that holds multiple CA certificates. Use this option + * alongside CURLOPT_SSL_VERIFYPEER. + * + * + * + * + * CURLOPT_COOKIE + * The contents of the "Cookie: " header to be + * used in the HTTP request. + * Note that multiple cookies are separated with a semicolon followed + * by a space (e.g., "fruit=apple; colour=red") + * + * + * + * + * CURLOPT_COOKIEFILE + * The name of the file containing the cookie data. The cookie file can + * be in Netscape format, or just plain HTTP-style headers dumped into + * a file. + * + * + * + * + * CURLOPT_COOKIEJAR + * The name of a file to save all internal cookies to when the + * connection closes. + * + * + * + * + * CURLOPT_CUSTOMREQUEST + *

+ * A custom request method to use instead of + * "GET" or "HEAD" when doing + * a HTTP request. This is useful for doing + * "DELETE" or other, more obscure HTTP requests. + * Valid values are things like "GET", + * "POST", "CONNECT" and so on; + * i.e. Do not enter a whole HTTP request line here. For instance, + * entering "GET /index.html HTTP/1.0\r\n\r\n" + * would be incorrect. + *

+ * Don't do this without making sure the server supports the custom + * request method first. + *

+ *

+ * + * + * + * CURLOPT_EGDSOCKET + * Like CURLOPT_RANDOM_FILE, except a filename + * to an Entropy Gathering Daemon socket. + * + * + * + * + * CURLOPT_ENCODING + * The contents of the "Accept-Encoding: " header. + * This enables decoding of the response. Supported encodings are + * "identity", "deflate", and + * "gzip". If an empty string, "", + * is set, a header containing all supported encoding types is sent. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_FTPPORT + * The value which will be used to get the IP address to use + * for the FTP "POST" instruction. The "POST" instruction tells + * the remote server to connect to our specified IP address. The + * string may be a plain IP address, a hostname, a network + * interface name (under Unix), or just a plain '-' to use the + * systems default IP address. + * + * + * + * + * CURLOPT_INTERFACE + * The name of the outgoing network interface to use. This can be an + * interface name, an IP address or a host name. + * + * + * + * + * CURLOPT_KRB4LEVEL + * The KRB4 (Kerberos 4) security level. Any of the following values + * (in order from least to most powerful) are valid: + * "clear", + * "safe", + * "confidential", + * "private".. + * If the string does not match one of these, + * "private" is used. Setting this option to &null; + * will disable KRB4 security. Currently KRB4 security only works + * with FTP transactions. + * + * + * + * + * CURLOPT_POSTFIELDS + * The full data to post in a HTTP "POST" operation. + * To post a file, prepend a filename with @ and + * use the full path. This can either be passed as a urlencoded + * string like 'para1=val1&para2=val2&...' + * or as an array with the field name as key and field data as value. + * If value is an array, the + * Content-Type header will be set to + * multipart/form-data. + * + * + * + * + * CURLOPT_PROXY + * The HTTP proxy to tunnel requests through. + * + * + * + * + * CURLOPT_PROXYUSERPWD + * A username and password formatted as + * "[username]:[password]" to use for the + * connection to the proxy. + * + * + * + * + * CURLOPT_RANDOM_FILE + * A filename to be used to seed the random number generator for SSL. + * + * + * + * + * CURLOPT_RANGE + * Range(s) of data to retrieve in the format + * "X-Y" where X or Y are optional. HTTP transfers + * also support several intervals, separated with commas in the format + * "X-Y,N-M". + * + * + * + * + * CURLOPT_REFERER + * The contents of the "Referer: " header to be used + * in a HTTP request. + * + * + * + * + * CURLOPT_SSL_CIPHER_LIST + * A list of ciphers to use for SSL. For example, + * RC4-SHA and TLSv1 are valid + * cipher lists. + * + * + * + * + * CURLOPT_SSLCERT + * The name of a file containing a PEM formatted certificate. + * + * + * + * + * CURLOPT_SSLCERTPASSWD + * The password required to use the + * CURLOPT_SSLCERT certificate. + * + * + * + * + * CURLOPT_SSLCERTTYPE + * The format of the certificate. Supported formats are + * "PEM" (default), "DER", + * and "ENG". + * + * Added in cURL 7.9.3. + * + * + * + * CURLOPT_SSLENGINE + * The identifier for the crypto engine of the private SSL key + * specified in CURLOPT_SSLKEY. + * + * + * + * + * CURLOPT_SSLENGINE_DEFAULT + * The identifier for the crypto engine used for asymmetric crypto + * operations. + * + * + * + * + * CURLOPT_SSLKEY + * The name of a file containing a private SSL key. + * + * + * + * + * CURLOPT_SSLKEYPASSWD + *

+ * The secret password needed to use the private SSL key specified in + * CURLOPT_SSLKEY. + *

+ * Since this option contains a sensitive password, remember to keep + * the PHP script it is contained within safe. + *

+ *

+ * + * + * + * CURLOPT_SSLKEYTYPE + * The key type of the private SSL key specified in + * CURLOPT_SSLKEY. Supported key types are + * "PEM" (default), "DER", + * and "ENG". + * + * + * + * + * CURLOPT_URL + * The URL to fetch. This can also be set when initializing a + * session with curl_init. + * + * + * + * + * CURLOPT_USERAGENT + * The contents of the "User-Agent: " header to be + * used in a HTTP request. + * + * + * + * + * CURLOPT_USERPWD + * A username and password formatted as + * "[username]:[password]" to use for the + * connection. + * + * + * + *

+ *

+ * value should be an array for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_HTTP200ALIASES + * An array of HTTP 200 responses that will be treated as valid + * responses and not as errors. + * + * Added in cURL 7.10.3. + * + * + * + * CURLOPT_HTTPHEADER + * An array of HTTP header fields to set, in the format + * array('Content-type: text/plain', 'Content-length: 100') + * + * + * + * + * CURLOPT_POSTQUOTE + * An array of FTP commands to execute on the server after the FTP + * request has been performed. + * + * + * + * + * CURLOPT_QUOTE + * An array of FTP commands to execute on the server prior to the FTP + * request. + * + * + * + *

+ *

+ * value should be a stream resource (using + * fopen, for example) for the following values of the + * option parameter: + * + * Option + * Set value to + * + * + * CURLOPT_FILE + * The file that the transfer should be written to. The default + * is STDOUT (the browser window). + * + * + * + * CURLOPT_INFILE + * The file that the transfer should be read from when uploading. + * + * + * + * CURLOPT_STDERR + * An alternative location to output errors to instead of + * STDERR. + * + * + * + * CURLOPT_WRITEHEADER + * The file that the header part of the transfer is written to. + * + * + *

+ *

+ * value should be a string that is the name of a valid + * callback function for the following values of the + * option parameter: + * + * Option + * Set value to + * + * + * CURLOPT_HEADERFUNCTION + * The name of a callback function where the callback function takes + * two parameters. The first is the cURL resource, the second is a + * string with the header data to be written. The header data must + * be written when using this callback function. Return the number of + * bytes written. + * + * + * + * CURLOPT_PASSWDFUNCTION + * The name of a callback function where the callback function takes + * three parameters. The first is the cURL resource, the second is a + * string containing a password prompt, and the third is the maximum + * password length. Return the string containing the password. + * + * + * + * CURLOPT_PROGRESSFUNCTION + * The name of a callback function where the callback function takes + * three parameters. The first is the cURL resource, the second is a + * file-descriptor resource, and the third is length. Return the + * string containing the data. + * + * + * + * CURLOPT_READFUNCTION + * The name of a callback function where the callback function takes + * two parameters. The first is the cURL resource, and the second is a + * string with the data to be read. The data must be read by using this + * callback function. Return the number of bytes read. Return 0 to signal + * EOF. + * + * + * + * CURLOPT_WRITEFUNCTION + * The name of a callback function where the callback function takes + * two parameters. The first is the cURL resource, and the second is a + * string with the data to be written. The data must be written by using + * this callback function. Must return the exact number of bytes written + * or this will fail. + * + * + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function curl_setopt ($ch, $option, $value) {} + +/** + * Set multiple options for a cURL transfer + * @link http://www.php.net/manual/en/function.curl-setopt-array.php + * @param ch resource + * @param options array

+ * An array specifying which options to set and their values. + * The keys should be valid curl_setopt constants or + * their integer equivalents. + *

+ * @return bool true if all options were successfully set. If an option could + * not be successfully set, false is immediately returned, ignoring any + * future options in the options array. + * + * @jms-builtin + */ +function curl_setopt_array ($ch, array $options) {} + +/** + * Perform a cURL session + * @link http://www.php.net/manual/en/function.curl-exec.php + * @param ch resource + * @return mixed Returns true on success or false on failure. However, if the CURLOPT_RETURNTRANSFER + * option is set, it will return the result on success, false on failure. + * + * @jms-builtin + */ +function curl_exec ($ch) {} + +/** + * Get information regarding a specific transfer + * @link http://www.php.net/manual/en/function.curl-getinfo.php + * @param ch resource + * @param opt int[optional]

+ * This may be one of the following constants: + * CURLINFO_EFFECTIVE_URL - Last effective URL + * @return mixed If opt is given, returns its value as a string. + * Otherwise, returns an associative array with the following elements + * (which correspond to opt): + * "url" + * "content_type" + * "http_code" + * "header_size" + * "request_size" + * "filetime" + * "ssl_verify_result" + * "redirect_count" + * "total_time" + * "namelookup_time" + * "connect_time" + * "pretransfer_time" + * "size_upload" + * "size_download" + * "speed_download" + * "speed_upload" + * "download_content_length" + * "upload_content_length" + * "starttransfer_time" + * "redirect_time" + * + * @jms-builtin + */ +function curl_getinfo ($ch, $opt = null) {} + +/** + * Return a string containing the last error for the current session + * @link http://www.php.net/manual/en/function.curl-error.php + * @param ch resource + * @return string the error message or '' (the empty string) if no + * error occurred. + * + * @jms-builtin + */ +function curl_error ($ch) {} + +/** + * Return the last error number + * @link http://www.php.net/manual/en/function.curl-errno.php + * @param ch resource + * @return int the error number or 0 (zero) if no error + * occurred. + * + * @jms-builtin + */ +function curl_errno ($ch) {} + +/** + * Close a cURL session + * @link http://www.php.net/manual/en/function.curl-close.php + * @param ch resource + * @return void + * + * @jms-builtin + */ +function curl_close ($ch) {} + +/** + * Returns a new cURL multi handle + * @link http://www.php.net/manual/en/function.curl-multi-init.php + * @return resource a cURL multi handle resource on success, false on failure. + * + * @jms-builtin + */ +function curl_multi_init () {} + +/** + * Add a normal cURL handle to a cURL multi handle + * @link http://www.php.net/manual/en/function.curl-multi-add-handle.php + * @param mh resource + * @param ch resource + * @return int 0 on success, or one of the CURLM_XXX errors + * code. + * + * @jms-builtin + */ +function curl_multi_add_handle ($mh, $ch) {} + +/** + * Remove a multi handle from a set of cURL handles + * @link http://www.php.net/manual/en/function.curl-multi-remove-handle.php + * @param mh resource + * @param ch resource + * @return int On success, returns a cURL handle, false on failure. + * + * @jms-builtin + */ +function curl_multi_remove_handle ($mh, $ch) {} + +/** + * Wait for activity on any curl_multi connection + * @link http://www.php.net/manual/en/function.curl-multi-select.php + * @param mh resource + * @param timeout float[optional]

+ * Time, in seconds, to wait for a response. + *

+ * @return int On success, returns the number of descriptors contained in, + * the descriptor sets. On failure, this function will return -1 on a select failure or timeout (from the underlying select system call). + * + * @jms-builtin + */ +function curl_multi_select ($mh, $timeout = null) {} + +/** + * Run the sub-connections of the current cURL handle + * @link http://www.php.net/manual/en/function.curl-multi-exec.php + * @param mh resource + * @param still_running int

+ * A reference to a flag to tell whether the operations are still running. + *

+ * @return int A cURL code defined in the cURL Predefined Constants. + *

+ *

+ * This only returns errors regarding the whole multi stack. There might still have + * occurred problems on individual transfers even when this function returns + * CURLM_OK. + * + * @jms-builtin + */ +function curl_multi_exec ($mh, &$still_running) {} + +/** + * Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set + * @link http://www.php.net/manual/en/function.curl-multi-getcontent.php + * @param ch resource + * @return string Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set. + * + * @jms-builtin + */ +function curl_multi_getcontent ($ch) {} + +/** + * Get information about the current transfers + * @link http://www.php.net/manual/en/function.curl-multi-info-read.php + * @param mh resource + * @param msgs_in_queue int[optional]

+ * Number of messages that are still in the queue + *

+ * @return array On success, returns an associative array for the message, false on failure. + *

+ *

+ * + * Contents of the returned array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Key:Value:
msgThe CURLMSG_DONE constant. Other return values + * are currently not available.
resultOne of the CURLE_* constants. If everything is + * OK, the CURLE_OK will be the result.
handleResource of type curl indicates the handle which it concerns.
+ * + * @jms-builtin + */ +function curl_multi_info_read ($mh, &$msgs_in_queue = null) {} + +/** + * Close a set of cURL handles + * @link http://www.php.net/manual/en/function.curl-multi-close.php + * @param mh resource + * @return void + * + * @jms-builtin + */ +function curl_multi_close ($mh) {} + +define ('CURLOPT_IPRESOLVE', 113); +define ('CURL_IPRESOLVE_WHATEVER', 0); +define ('CURL_IPRESOLVE_V4', 1); +define ('CURL_IPRESOLVE_V6', 2); +define ('CURLOPT_DNS_USE_GLOBAL_CACHE', 91); +define ('CURLOPT_DNS_CACHE_TIMEOUT', 92); +define ('CURLOPT_PORT', 3); +define ('CURLOPT_FILE', 10001); +define ('CURLOPT_READDATA', 10009); +define ('CURLOPT_INFILE', 10009); +define ('CURLOPT_INFILESIZE', 14); +define ('CURLOPT_URL', 10002); +define ('CURLOPT_PROXY', 10004); +define ('CURLOPT_VERBOSE', 41); +define ('CURLOPT_HEADER', 42); +define ('CURLOPT_HTTPHEADER', 10023); +define ('CURLOPT_NOPROGRESS', 43); + +/** + * Available since PHP 5.3.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_PROGRESSFUNCTION', 20056); +define ('CURLOPT_NOBODY', 44); +define ('CURLOPT_FAILONERROR', 45); +define ('CURLOPT_UPLOAD', 46); +define ('CURLOPT_POST', 47); +define ('CURLOPT_FTPLISTONLY', 48); +define ('CURLOPT_FTPAPPEND', 50); +define ('CURLOPT_NETRC', 51); + +/** + * This constant is not available when open_basedir + * or safe_mode are enabled. + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_FOLLOWLOCATION', 52); +define ('CURLOPT_PUT', 54); +define ('CURLOPT_USERPWD', 10005); +define ('CURLOPT_PROXYUSERPWD', 10006); +define ('CURLOPT_RANGE', 10007); +define ('CURLOPT_TIMEOUT', 13); +define ('CURLOPT_TIMEOUT_MS', 155); +define ('CURLOPT_POSTFIELDS', 10015); +define ('CURLOPT_REFERER', 10016); +define ('CURLOPT_USERAGENT', 10018); +define ('CURLOPT_FTPPORT', 10017); +define ('CURLOPT_FTP_USE_EPSV', 85); +define ('CURLOPT_LOW_SPEED_LIMIT', 19); +define ('CURLOPT_LOW_SPEED_TIME', 20); +define ('CURLOPT_RESUME_FROM', 21); +define ('CURLOPT_COOKIE', 10022); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_COOKIESESSION', 96); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_AUTOREFERER', 58); +define ('CURLOPT_SSLCERT', 10025); +define ('CURLOPT_SSLCERTPASSWD', 10026); +define ('CURLOPT_WRITEHEADER', 10029); +define ('CURLOPT_SSL_VERIFYHOST', 81); +define ('CURLOPT_COOKIEFILE', 10031); +define ('CURLOPT_SSLVERSION', 32); +define ('CURLOPT_TIMECONDITION', 33); +define ('CURLOPT_TIMEVALUE', 34); +define ('CURLOPT_CUSTOMREQUEST', 10036); +define ('CURLOPT_STDERR', 10037); +define ('CURLOPT_TRANSFERTEXT', 53); +define ('CURLOPT_RETURNTRANSFER', 19913); +define ('CURLOPT_QUOTE', 10028); +define ('CURLOPT_POSTQUOTE', 10039); +define ('CURLOPT_INTERFACE', 10062); +define ('CURLOPT_KRB4LEVEL', 10063); +define ('CURLOPT_HTTPPROXYTUNNEL', 61); +define ('CURLOPT_FILETIME', 69); +define ('CURLOPT_WRITEFUNCTION', 20011); +define ('CURLOPT_READFUNCTION', 20012); +define ('CURLOPT_HEADERFUNCTION', 20079); +define ('CURLOPT_MAXREDIRS', 68); +define ('CURLOPT_MAXCONNECTS', 71); +define ('CURLOPT_CLOSEPOLICY', 72); +define ('CURLOPT_FRESH_CONNECT', 74); +define ('CURLOPT_FORBID_REUSE', 75); +define ('CURLOPT_RANDOM_FILE', 10076); +define ('CURLOPT_EGDSOCKET', 10077); +define ('CURLOPT_CONNECTTIMEOUT', 78); +define ('CURLOPT_CONNECTTIMEOUT_MS', 156); +define ('CURLOPT_SSL_VERIFYPEER', 64); +define ('CURLOPT_CAINFO', 10065); +define ('CURLOPT_CAPATH', 10097); +define ('CURLOPT_COOKIEJAR', 10082); +define ('CURLOPT_SSL_CIPHER_LIST', 10083); +define ('CURLOPT_BINARYTRANSFER', 19914); +define ('CURLOPT_NOSIGNAL', 99); +define ('CURLOPT_PROXYTYPE', 101); +define ('CURLOPT_BUFFERSIZE', 98); +define ('CURLOPT_HTTPGET', 80); +define ('CURLOPT_HTTP_VERSION', 84); +define ('CURLOPT_SSLKEY', 10087); +define ('CURLOPT_SSLKEYTYPE', 10088); +define ('CURLOPT_SSLKEYPASSWD', 10026); +define ('CURLOPT_SSLENGINE', 10089); +define ('CURLOPT_SSLENGINE_DEFAULT', 90); +define ('CURLOPT_SSLCERTTYPE', 10086); +define ('CURLOPT_CRLF', 27); +define ('CURLOPT_ENCODING', 10102); +define ('CURLOPT_PROXYPORT', 59); +define ('CURLOPT_UNRESTRICTED_AUTH', 105); +define ('CURLOPT_FTP_USE_EPRT', 106); + +/** + * Available since PHP 5.2.1 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_TCP_NODELAY', 121); +define ('CURLOPT_HTTP200ALIASES', 10104); +define ('CURL_TIMECOND_IFMODSINCE', 1); +define ('CURL_TIMECOND_IFUNMODSINCE', 2); +define ('CURL_TIMECOND_LASTMOD', 3); +define ('CURLOPT_HTTPAUTH', 107); +define ('CURLAUTH_BASIC', 1); +define ('CURLAUTH_DIGEST', 2); +define ('CURLAUTH_GSSNEGOTIATE', 4); +define ('CURLAUTH_NTLM', 8); +define ('CURLAUTH_ANY', -17); +define ('CURLAUTH_ANYSAFE', -18); +define ('CURLOPT_PROXYAUTH', 111); +define ('CURLOPT_FTP_CREATE_MISSING_DIRS', 110); + +/** + * Available since PHP 5.2.4 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_PRIVATE', 10103); +define ('CURLCLOSEPOLICY_LEAST_RECENTLY_USED', 2); +define ('CURLCLOSEPOLICY_LEAST_TRAFFIC', 3); +define ('CURLCLOSEPOLICY_SLOWEST', 4); +define ('CURLCLOSEPOLICY_CALLBACK', 5); +define ('CURLCLOSEPOLICY_OLDEST', 1); +define ('CURLINFO_EFFECTIVE_URL', 1048577); +define ('CURLINFO_HTTP_CODE', 2097154); +define ('CURLINFO_HEADER_SIZE', 2097163); +define ('CURLINFO_REQUEST_SIZE', 2097164); +define ('CURLINFO_TOTAL_TIME', 3145731); +define ('CURLINFO_NAMELOOKUP_TIME', 3145732); +define ('CURLINFO_CONNECT_TIME', 3145733); +define ('CURLINFO_PRETRANSFER_TIME', 3145734); +define ('CURLINFO_SIZE_UPLOAD', 3145735); +define ('CURLINFO_SIZE_DOWNLOAD', 3145736); +define ('CURLINFO_SPEED_DOWNLOAD', 3145737); +define ('CURLINFO_SPEED_UPLOAD', 3145738); +define ('CURLINFO_FILETIME', 2097166); +define ('CURLINFO_SSL_VERIFYRESULT', 2097165); +define ('CURLINFO_CONTENT_LENGTH_DOWNLOAD', 3145743); +define ('CURLINFO_CONTENT_LENGTH_UPLOAD', 3145744); +define ('CURLINFO_STARTTRANSFER_TIME', 3145745); +define ('CURLINFO_CONTENT_TYPE', 1048594); +define ('CURLINFO_REDIRECT_TIME', 3145747); +define ('CURLINFO_REDIRECT_COUNT', 2097172); + +/** + * Available since PHP 5.1.3 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLINFO_HEADER_OUT', 2); + +/** + * Available since PHP 5.2.4 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLINFO_PRIVATE', 1048597); +define ('CURLINFO_CERTINFO', 4194338); +define ('CURL_VERSION_IPV6', 1); +define ('CURL_VERSION_KERBEROS4', 2); +define ('CURL_VERSION_SSL', 4); +define ('CURL_VERSION_LIBZ', 8); +define ('CURLVERSION_NOW', 3); +define ('CURLE_OK', 0); +define ('CURLE_UNSUPPORTED_PROTOCOL', 1); +define ('CURLE_FAILED_INIT', 2); +define ('CURLE_URL_MALFORMAT', 3); +define ('CURLE_URL_MALFORMAT_USER', 4); +define ('CURLE_COULDNT_RESOLVE_PROXY', 5); +define ('CURLE_COULDNT_RESOLVE_HOST', 6); +define ('CURLE_COULDNT_CONNECT', 7); +define ('CURLE_FTP_WEIRD_SERVER_REPLY', 8); +define ('CURLE_FTP_ACCESS_DENIED', 9); +define ('CURLE_FTP_USER_PASSWORD_INCORRECT', 10); +define ('CURLE_FTP_WEIRD_PASS_REPLY', 11); +define ('CURLE_FTP_WEIRD_USER_REPLY', 12); +define ('CURLE_FTP_WEIRD_PASV_REPLY', 13); +define ('CURLE_FTP_WEIRD_227_FORMAT', 14); +define ('CURLE_FTP_CANT_GET_HOST', 15); +define ('CURLE_FTP_CANT_RECONNECT', 16); +define ('CURLE_FTP_COULDNT_SET_BINARY', 17); +define ('CURLE_PARTIAL_FILE', 18); +define ('CURLE_FTP_COULDNT_RETR_FILE', 19); +define ('CURLE_FTP_WRITE_ERROR', 20); +define ('CURLE_FTP_QUOTE_ERROR', 21); +define ('CURLE_HTTP_NOT_FOUND', 22); +define ('CURLE_WRITE_ERROR', 23); +define ('CURLE_MALFORMAT_USER', 24); +define ('CURLE_FTP_COULDNT_STOR_FILE', 25); +define ('CURLE_READ_ERROR', 26); +define ('CURLE_OUT_OF_MEMORY', 27); +define ('CURLE_OPERATION_TIMEOUTED', 28); +define ('CURLE_FTP_COULDNT_SET_ASCII', 29); +define ('CURLE_FTP_PORT_FAILED', 30); +define ('CURLE_FTP_COULDNT_USE_REST', 31); +define ('CURLE_FTP_COULDNT_GET_SIZE', 32); +define ('CURLE_HTTP_RANGE_ERROR', 33); +define ('CURLE_HTTP_POST_ERROR', 34); +define ('CURLE_SSL_CONNECT_ERROR', 35); +define ('CURLE_FTP_BAD_DOWNLOAD_RESUME', 36); +define ('CURLE_FILE_COULDNT_READ_FILE', 37); +define ('CURLE_LDAP_CANNOT_BIND', 38); +define ('CURLE_LDAP_SEARCH_FAILED', 39); +define ('CURLE_LIBRARY_NOT_FOUND', 40); +define ('CURLE_FUNCTION_NOT_FOUND', 41); +define ('CURLE_ABORTED_BY_CALLBACK', 42); +define ('CURLE_BAD_FUNCTION_ARGUMENT', 43); +define ('CURLE_BAD_CALLING_ORDER', 44); +define ('CURLE_HTTP_PORT_FAILED', 45); +define ('CURLE_BAD_PASSWORD_ENTERED', 46); +define ('CURLE_TOO_MANY_REDIRECTS', 47); +define ('CURLE_UNKNOWN_TELNET_OPTION', 48); +define ('CURLE_TELNET_OPTION_SYNTAX', 49); +define ('CURLE_OBSOLETE', 50); +define ('CURLE_SSL_PEER_CERTIFICATE', 51); +define ('CURLE_GOT_NOTHING', 52); +define ('CURLE_SSL_ENGINE_NOTFOUND', 53); +define ('CURLE_SSL_ENGINE_SETFAILED', 54); +define ('CURLE_SEND_ERROR', 55); +define ('CURLE_RECV_ERROR', 56); +define ('CURLE_SHARE_IN_USE', 57); +define ('CURLE_SSL_CERTPROBLEM', 58); +define ('CURLE_SSL_CIPHER', 59); +define ('CURLE_SSL_CACERT', 60); +define ('CURLE_BAD_CONTENT_ENCODING', 61); +define ('CURLE_LDAP_INVALID_URL', 62); +define ('CURLE_FILESIZE_EXCEEDED', 63); +define ('CURLE_FTP_SSL_FAILED', 64); +define ('CURLPROXY_HTTP', 0); +define ('CURLPROXY_SOCKS4', 4); +define ('CURLPROXY_SOCKS5', 5); +define ('CURL_NETRC_OPTIONAL', 1); +define ('CURL_NETRC_IGNORED', 0); +define ('CURL_NETRC_REQUIRED', 2); +define ('CURL_HTTP_VERSION_NONE', 0); +define ('CURL_HTTP_VERSION_1_0', 1); +define ('CURL_HTTP_VERSION_1_1', 2); +define ('CURLM_CALL_MULTI_PERFORM', -1); +define ('CURLM_OK', 0); +define ('CURLM_BAD_HANDLE', 1); +define ('CURLM_BAD_EASY_HANDLE', 2); +define ('CURLM_OUT_OF_MEMORY', 3); +define ('CURLM_INTERNAL_ERROR', 4); +define ('CURLMSG_DONE', 1); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_FTPSSLAUTH', 129); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPAUTH_DEFAULT', 0); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPAUTH_SSL', 1); + +/** + * Available since PHP 5.1.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPAUTH_TLS', 2); + +/** + * Available since PHP 5.2.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_FTP_SSL', 119); + +/** + * Available since PHP 5.2.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_NONE', 0); + +/** + * Available since PHP 5.2.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_TRY', 1); + +/** + * Available since PHP 5.2.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_CONTROL', 2); + +/** + * Available since PHP 5.2.0 + * @link http://www.php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_ALL', 3); +define ('CURLOPT_CERTINFO', 172); +define ('CURLOPT_POSTREDIR', 161); +define ('CURLSSH_AUTH_NONE', 0); +define ('CURLSSH_AUTH_PUBLICKEY', 1); +define ('CURLSSH_AUTH_PASSWORD', 2); +define ('CURLSSH_AUTH_HOST', 4); +define ('CURLSSH_AUTH_KEYBOARD', 8); +define ('CURLSSH_AUTH_DEFAULT', -1); +define ('CURLOPT_SSH_AUTH_TYPES', 151); +define ('CURLOPT_KEYPASSWD', 10026); +define ('CURLOPT_SSH_PUBLIC_KEYFILE', 10152); +define ('CURLOPT_SSH_PRIVATE_KEYFILE', 10153); +define ('CURLOPT_SSH_HOST_PUBLIC_KEY_MD5', 10162); +define ('CURLE_SSH', 79); +define ('CURLOPT_REDIR_PROTOCOLS', 182); +define ('CURLOPT_PROTOCOLS', 181); +define ('CURLPROTO_HTTP', 1); +define ('CURLPROTO_HTTPS', 2); +define ('CURLPROTO_FTP', 4); +define ('CURLPROTO_FTPS', 8); +define ('CURLPROTO_SCP', 16); +define ('CURLPROTO_SFTP', 32); +define ('CURLPROTO_TELNET', 64); +define ('CURLPROTO_LDAP', 128); +define ('CURLPROTO_LDAPS', 256); +define ('CURLPROTO_DICT', 512); +define ('CURLPROTO_FILE', 1024); +define ('CURLPROTO_TFTP', 2048); +define ('CURLPROTO_ALL', -1); +define ('CURLOPT_FTP_FILEMETHOD', 138); +define ('CURLOPT_FTP_SKIP_PASV_IP', 137); +define ('CURLFTPMETHOD_MULTICWD', 1); +define ('CURLFTPMETHOD_NOCWD', 2); +define ('CURLFTPMETHOD_SINGLECWD', 3); + +// End of curl v. +?> diff --git a/res/php-5.3-core-api/date.php b/res/php-5.3-core-api/date.php new file mode 100644 index 0000000..4bfd33a --- /dev/null +++ b/res/php-5.3-core-api/date.php @@ -0,0 +1,1920 @@ + + * String in a format accepted by strtotime. + *

+ *

+ * Enter &null; here to obtain the current time when using + * the $timezone parameter. + *

+ *

+ * To use a Unix timestamp, put a @ in + * front of the timestamp string. + *

+ * @param timezone DateTimeZone[optional]

+ * A DateTimeZone object representing the + * desired time zone. + *

+ *

+ * If $timezone is omitted, + * the current timezone will be used. + *

+ *

+ * The $timezone parameter + * and the current timezone are ignored when the + * $time parameter either + * is a UNIX timestamp (e.g. @946684800) + * or specifies a timezone + * (e.g. 2010-01-28T15:00:00+02:00). + *

+ * @return string a new DateTime instance. + * &return.falseforfailure.style.procedural; + */ + public function __construct ($time = null, DateTimeZone $timezone = null) {} + + /** + * The __wakeup handler + * @link http://www.php.net/manual/en/datetime.wakeup.php + * @return DateTime Initializes a DateTime object. + */ + public function __wakeup () {} + + /** + * The __set_state handler + * @link http://www.php.net/manual/en/datetime.set-state.php + * @param array array

+ * Initialization array. + *

+ * @return DateTime a new instance of a DateTime object. + */ + public static function __set_state (array $array) {} + + /** + * Returns new DateTime object formatted according to the specified format + * @link http://www.php.net/manual/en/datetime.createfromformat.php + * @param format string

+ * Format accepted by date. + *

+ *

+ * If format does not contain the character + * ! then portions of the date/time value + * specified in format but not specified + * in time will be set to the current + * system time. + *

+ *

+ * If format contains the + * character !, then portions of the generated + * time specified to the left-hand side of + * the ! in format will + * be set to corresponding values from the Unix epoch. + *

+ *

+ * If the first character of format + * is !, then all portions of the date/time + * value generated which are not specified in + * time will be initialized to corresponding + * values from the Unix epoch. + *

+ *

+ * The Unix epoch is 1970-01-01 00:00:00 UTC. + *

+ * @param time string

+ * String representing the time. + *

+ * @param timezone DateTimeZone[optional]

+ * A DateTimeZone object representing the + * desired time zone. + *

+ * @return DateTime a new DateTime instance&return.falseforfailure;. + */ + public static function createFromFormat ($format, $time, DateTimeZone $timezone = null) {} + + /** + * Returns the warnings and errors + * @link http://www.php.net/manual/en/datetime.getlasterrors.php + * @return array array containing info about warnings and errors. + */ + public static function getLastErrors () {} + + /** + * Returns date formatted according to given format + * @link http://www.php.net/manual/en/datetime.format.php + * @param format string

+ * Format accepted by date. + *

+ * @return string the formatted date string on success&return.falseforfailure;. + */ + public function format ($format) {} + + /** + * Alters the timestamp + * @link http://www.php.net/manual/en/datetime.modify.php + * @param modify string

+ * String in a relative format accepted by strtotime. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function modify ($modify) {} + + /** + * Adds an amount of days, months, years, hours, minutes and seconds to a + DateTime object + * @link http://www.php.net/manual/en/datetime.add.php + * @param interval DateInterval

+ * A DateInterval object + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function add (DateInterval $interval) {} + + /** + * Subtracts an amount of days, months, years, hours, minutes and seconds from + a DateTime object + * @link http://www.php.net/manual/en/datetime.sub.php + * @param interval DateInterval

+ * A DateInterval object + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function sub (DateInterval $interval) {} + + /** + * Return time zone relative to given DateTime + * @link http://www.php.net/manual/en/datetime.gettimezone.php + * @return DateTimeZone a DateTimeZone object on success + * &return.falseforfailure;. + */ + public function getTimezone () {} + + /** + * Sets the time zone for the DateTime object + * @link http://www.php.net/manual/en/datetime.settimezone.php + * @param timezone DateTimeZone

+ * A DateTimeZone object representing the + * desired time zone. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function setTimezone (DateTimeZone $timezone) {} + + /** + * Returns the timezone offset + * @link http://www.php.net/manual/en/datetime.getoffset.php + * @return int the timezone offset in seconds from UTC on success + * &return.falseforfailure;. + */ + public function getOffset () {} + + /** + * Sets the time + * @link http://www.php.net/manual/en/datetime.settime.php + * @param hour int

+ * Hour of the time. + *

+ * @param minute int

+ * Minute of the time. + *

+ * @param second int[optional]

+ * Second of the time. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function setTime ($hour, $minute, $second = null) {} + + /** + * Sets the date + * @link http://www.php.net/manual/en/datetime.setdate.php + * @param year int

+ * Year of the date. + *

+ * @param month int

+ * Month of the date. + *

+ * @param day int

+ * Day of the date. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function setDate ($year, $month, $day) {} + + /** + * Sets the ISO date + * @link http://www.php.net/manual/en/datetime.setisodate.php + * @param year int

+ * Year of the date. + *

+ * @param week int

+ * Week of the date. + *

+ * @param day int[optional]

+ * Offset from the first day of the week. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function setISODate ($year, $week, $day = null) {} + + /** + * Sets the date and time based on an Unix timestamp + * @link http://www.php.net/manual/en/datetime.settimestamp.php + * @param unixtimestamp int

+ * Unix timestamp representing the date. + *

+ * @return DateTime &date.datetime.return.modifiedobjectorfalseforfailure; + */ + public function setTimestamp ($unixtimestamp) {} + + /** + * Gets the Unix timestamp + * @link http://www.php.net/manual/en/datetime.gettimestamp.php + * @return int the Unix timestamp representing the date. + */ + public function getTimestamp () {} + + /** + * Returns the difference between two DateTime objects + * @link http://www.php.net/manual/en/datetime.diff.php + * @param datetime2 DateTime + * @param absolute bool[optional]

+ * Whether to return absolute difference. + *

+ * @return DateInterval The DateInterval object representing the + * difference between the two dates&return.falseforfailure;. + */ + public function diff (DateTime $datetime2, $absolute = null) {} + +} + +/** @jms-builtin */ +class DateTimeZone { + const AFRICA = 1; + const AMERICA = 2; + const ANTARCTICA = 4; + const ARCTIC = 8; + const ASIA = 16; + const ATLANTIC = 32; + const AUSTRALIA = 64; + const EUROPE = 128; + const INDIAN = 256; + const PACIFIC = 512; + const UTC = 1024; + const ALL = 2047; + const ALL_WITH_BC = 4095; + const PER_COUNTRY = 4096; + + + /** + * Creates new DateTimeZone object + * @link http://www.php.net/manual/en/datetimezone.construct.php + * @param timezone string

+ * One of timezones. + *

+ * @return string DateTimeZone on success. + * &return.falseforfailure.style.procedural; + */ + public function __construct ($timezone) {} + + /** + * Returns the name of the timezone + * @link http://www.php.net/manual/en/datetimezone.getname.php + * @return string One of timezones. + */ + public function getName () {} + + /** + * Returns the timezone offset from GMT + * @link http://www.php.net/manual/en/datetimezone.getoffset.php + * @param datetime DateTime

+ * DateTime that contains the date/time to compute the offset from. + *

+ * @return int time zone offset in seconds on success&return.falseforfailure;. + */ + public function getOffset (DateTime $datetime) {} + + /** + * Returns all transitions for the timezone + * @link http://www.php.net/manual/en/datetimezone.gettransitions.php + * @param timestamp_begin int[optional]

+ * Begin timestamp. + *

+ * @param timestamp_end int[optional]

+ * End timestamp. + *

+ * @return array numerically indexed array containing associative array with all + * transitions on success&return.falseforfailure;. + */ + public function getTransitions ($timestamp_begin = null, $timestamp_end = null) {} + + /** + * Returns location information for a timezone + * @link http://www.php.net/manual/en/datetimezone.getlocation.php + * @return array Array containing location information about timezone. + */ + public function getLocation () {} + + /** + * Returns associative array containing dst, offset and the timezone name + * @link http://www.php.net/manual/en/datetimezone.listabbreviations.php + * @return array array on success&return.falseforfailure;. + */ + public static function listAbbreviations () {} + + /** + * Returns numerically index array with all timezone identifiers + * @link http://www.php.net/manual/en/datetimezone.listidentifiers.php + * @param what int[optional]

+ * One of DateTimeZone class constants. + *

+ * @param country string[optional]

+ * A two-letter ISO 3166-1 compatible country code. + *

+ * This option is only used when what is set to + * DateTimeZone::PER_COUNTRY. + * @return array array on success&return.falseforfailure;. + */ + public static function listIdentifiers ($what = null, $country = null) {} + +} + +/** @jms-builtin */ +class DateInterval { + /** @var integer */ + public $y; + + /** @var integer */ + public $m; + + /** @var integer */ + public $d; + + /** @var integer */ + public $h; + + /** @var integer */ + public $i; + + /** @var integer */ + public $s; + + /** @var integer */ + public $invert; + + /** @var integer|false */ + public $days; + + /** + * Creates new DateInterval object + * @link http://www.php.net/manual/en/dateinterval.construct.php + * @param interval_spec[optional] + */ + public function __construct ($interval_spec) {} + + /** + * Formats the interval + * @link http://www.php.net/manual/en/dateinterval.format.php + * @param format string

+ * + * The following characters are recognized in the + * format parameter string. + * Each format character must be proceeded by a percent sign + * (%). + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
format characterDescriptionExample values
%Literal %%
YYears, numeric, at least 2 digits with leading 001, 03
yYears, numeric1, 3
MMonths, numeric, at least 2 digits with leading 001, 03, 12
mMonths, numeric1, 3, 12
DDays, numeric, at least 2 digits with leading 001, 03, 31
dDays, numeric1, 3, 31
aTotal amount of days4, 18, 8123
HHours, numeric, at least 2 digits with leading 001, 03, 23
hHours, numeric1, 3, 23
IMinutes, numeric, at least 2 digits with leading 001, 03, 59
iMinutes, numeric1, 3, 59
SSeconds, numeric, at least 2 digits with leading 001, 03, 57
sSeconds, numeric1, 3, 57
RSign "-" when negative, "+" when positive-, +
rSign "-" when negative, empty when positive-,
+ *

+ * @return string the formatted interval. + */ + public function format ($format) {} + + /** + * Sets up a DateInterval from the relative parts of the string + * @link http://www.php.net/manual/en/dateinterval.createfromdatestring.php + * @param time string

+ * Date with relative parts. + *

+ * @return DateInterval new DateInterval instance if success. + */ + public static function createFromDateString ($time) {} + +} + +/** @jms-builtin */ +class DatePeriod implements Traversable { + const EXCLUDE_START_DATE = 1; + + + /** + * Creates new DatePeriod object + * @link http://www.php.net/manual/en/dateperiod.construct.php + * @param start DateTime

+ * Start date. + *

+ * @param interval DateInterval

+ * Interval. + *

+ * @param end DateTime

+ * End date. + *

+ * @param options int[optional]

+ * Can be set to DatePeriod::EXCLUDE_START_DATE. + *

+ * @return DateTime + */ + public function __construct (DateTime $start, DateInterval $interval, DateTime $end, $options = null) {} + +} + +/** + * Parse about any English textual datetime description into a Unix timestamp + * @link http://www.php.net/manual/en/function.strtotime.php + * @param time string

+ * The string to parse. Before PHP 5.0.0, microseconds weren't allowed in + * the time, since PHP 5.0.0 they are allowed but ignored. + *

+ * @param now int[optional]

+ * The timestamp which is used as a base for the calculation of relative + * dates. + *

+ * @return int a timestamp on success, false otherwise. Previous to PHP 5.1.0, + * this function would return -1 on failure. + * + * @jms-builtin + */ +function strtotime ($time, $now = null) {} + +/** + * Format a local time/date + * @link http://www.php.net/manual/en/function.date.php + * @param format string

+ * The format of the outputted date string. See the formatting + * options below. There are also several + * predefined date constants + * that may be used instead, so for example DATE_RSS + * contains the format string 'D, d M Y H:i:s'. + *

+ *

+ * + * The following characters are recognized in the + * format parameter string + * + * + * + * + * + * + * Day + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Week + * + * + * + * + * + * + * + * + * + * Month + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Year + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Time + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Timezone + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Full Date/Time + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
format characterDescriptionExample returned values
------
dDay of the month, 2 digits with leading zeros01 to 31
DA textual representation of a day, three lettersMon through Sun
jDay of the month without leading zeros1 to 31
l (lowercase 'L')A full textual representation of the day of the weekSunday through Saturday
NISO-8601 numeric representation of the day of the week (added in + * PHP 5.1.0)1 (for Monday) through 7 (for Sunday)
SEnglish ordinal suffix for the day of the month, 2 characters + * st, nd, rd or + * th. Works well with j + *
wNumeric representation of the day of the week0 (for Sunday) through 6 (for Saturday)
zThe day of the year (starting from 0)0 through 365
------
WISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0)Example: 42 (the 42nd week in the year)
------
FA full textual representation of a month, such as January or MarchJanuary through December
mNumeric representation of a month, with leading zeros01 through 12
MA short textual representation of a month, three lettersJan through Dec
nNumeric representation of a month, without leading zeros1 through 12
tNumber of days in the given month28 through 31
------
LWhether it's a leap year1 if it is a leap year, 0 otherwise.
oISO-8601 year number. This has the same value as + * Y, except that if the ISO week number + * (W) belongs to the previous or next year, that year + * is used instead. (added in PHP 5.1.0)Examples: 1999 or 2003
YA full numeric representation of a year, 4 digitsExamples: 1999 or 2003
yA two digit representation of a yearExamples: 99 or 03
------
aLowercase Ante meridiem and Post meridiemam or pm
AUppercase Ante meridiem and Post meridiemAM or PM
BSwatch Internet time000 through 999
g12-hour format of an hour without leading zeros1 through 12
G24-hour format of an hour without leading zeros0 through 23
h12-hour format of an hour with leading zeros01 through 12
H24-hour format of an hour with leading zeros00 through 23
iMinutes with leading zeros00 to 59
sSeconds, with leading zeros00 through 59
uMicroseconds (added in PHP 5.2.2)Example: 654321
------
eTimezone identifier (added in PHP 5.1.0)Examples: UTC, GMT, Atlantic/Azores
I (capital i)Whether or not the date is in daylight saving time1 if Daylight Saving Time, 0 otherwise.
ODifference to Greenwich time (GMT) in hoursExample: +0200
PDifference to Greenwich time (GMT) with colon between hours and minutes (added in PHP 5.1.3)Example: +02:00
TTimezone abbreviationExamples: EST, MDT ...
ZTimezone offset in seconds. The offset for timezones west of UTC is always + * negative, and for those east of UTC is always positive.-43200 through 50400
------
cISO 8601 date (added in PHP 5)2004-02-12T15:19:21+00:00
rRFC 2822 formatted dateExample: Thu, 21 Dec 2000 16:01:07 +0200
USeconds since the Unix Epoch (January 1 1970 00:00:00 GMT)See also time
+ *

+ *

+ * Unrecognized characters in the format string will be printed + * as-is. The Z format will always return + * 0 when using gmdate. + *

+ *

+ * Since this function only accepts integer timestamps the + * u format character is only useful when using the + * date_format function with user based timestamps + * created with date_create. + *

+ * @param timestamp int[optional] + * @return string a formatted date string. If a non-numeric value is used for + * timestamp, false is returned and an + * E_WARNING level error is emitted. + * + * @jms-builtin + */ +function date ($format, $timestamp = null) {} + +/** + * Format a local time/date as integer + * @link http://www.php.net/manual/en/function.idate.php + * @param format string

+ * + * The following characters are recognized in the + * format parameter string + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
format characterDescription
BSwatch Beat/Internet Time
dDay of the month
hHour (12 hour format)
HHour (24 hour format)
iMinutes
I (uppercase i)returns 1 if DST is activated, + * 0 otherwise
L (uppercase l)returns 1 for leap year, + * 0 otherwise
mMonth number
sSeconds
tDays in current month
USeconds since the Unix Epoch - January 1 1970 00:00:00 UTC - + * this is the same as time
wDay of the week (0 on Sunday)
WISO-8601 week number of year, weeks starting on + * Monday
yYear (1 or 2 digits - check note below)
YYear (4 digits)
zDay of the year
ZTimezone offset in seconds
+ *

+ * @param timestamp int[optional] + * @return int an integer. + *

+ *

+ * As idate always returns an integer and + * as they can't start with a "0", idate may return + * fewer digits than you would expect. See the example below. + * + * @jms-builtin + */ +function idate ($format, $timestamp = null) {} + +/** + * Format a GMT/UTC date/time + * @link http://www.php.net/manual/en/function.gmdate.php + * @param format string

+ * The format of the outputted date string. See the formatting + * options for the date function. + *

+ * @param timestamp int[optional] + * @return string a formatted date string. If a non-numeric value is used for + * timestamp, false is returned and an + * E_WARNING level error is emitted. + * + * @jms-builtin + */ +function gmdate ($format, $timestamp = null) {} + +/** + * Get Unix timestamp for a date + * @link http://www.php.net/manual/en/function.mktime.php + * @param hour int[optional]

+ * The number of the hour. + *

+ * @param minute int[optional]

+ * The number of the minute. + *

+ * @param second int[optional]

+ * The number of seconds past the minute. + *

+ * @param month int[optional]

+ * The number of the month. + *

+ * @param day int[optional]

+ * The number of the day. + *

+ * @param year int[optional]

+ * The number of the year, may be a two or four digit value, + * with values between 0-69 mapping to 2000-2069 and 70-100 to + * 1970-2000. On systems where time_t is a 32bit signed integer, as + * most common today, the valid range for year + * is somewhere between 1901 and 2038. However, before PHP 5.1.0 this + * range was limited from 1970 to 2038 on some systems (e.g. Windows). + *

+ * @param is_dst int[optional]

+ * This parameter can be set to 1 if the time is during daylight savings time (DST), + * 0 if it is not, or -1 (the default) if it is unknown whether the time is within + * daylight savings time or not. If it's unknown, PHP tries to figure it out itself. + * This can cause unexpected (but not incorrect) results. + * Some times are invalid if DST is enabled on the system PHP is running on or + * is_dst is set to 1. If DST is enabled in e.g. 2:00, all times + * between 2:00 and 3:00 are invalid and mktime returns an undefined + * (usually negative) value. + * Some systems (e.g. Solaris 8) enable DST at midnight so time 0:30 of the day when DST + * is enabled is evaluated as 23:30 of the previous day. + *

+ *

+ * As of PHP 5.1.0, this parameter became deprecated. As a result, the + * new timezone handling features should be used instead. + *

+ * @return int mktime returns the Unix timestamp of the arguments + * given. + * If the arguments are invalid, the function returns false (before PHP 5.1 + * it returned -1). + * + * @jms-builtin + */ +function mktime ($hour = null, $minute = null, $second = null, $month = null, $day = null, $year = null, $is_dst = null) {} + +/** + * Get Unix timestamp for a GMT date + * @link http://www.php.net/manual/en/function.gmmktime.php + * @param hour int[optional]

+ * The hour + *

+ * @param minute int[optional]

+ * The minute + *

+ * @param second int[optional]

+ * The second + *

+ * @param month int[optional]

+ * The month + *

+ * @param day int[optional]

+ * The day + *

+ * @param year int[optional]

+ * The year + *

+ * @param is_dst int[optional]

+ * Parameters always represent a GMT date so is_dst + * doesn't influence the result. + *

+ * @return int a integer Unix timestamp. + * + * @jms-builtin + */ +function gmmktime ($hour = null, $minute = null, $second = null, $month = null, $day = null, $year = null, $is_dst = null) {} + +/** + * Validate a Gregorian date + * @link http://www.php.net/manual/en/function.checkdate.php + * @param month int

+ * The month is between 1 and 12 inclusive. + *

+ * @param day int

+ * The day is within the allowed number of days for the given + * month. Leap years + * are taken into consideration. + *

+ * @param year int

+ * The year is between 1 and 32767 inclusive. + *

+ * @return bool true if the date given is valid; otherwise returns false. + * + * @jms-builtin + */ +function checkdate ($month, $day, $year) {} + +/** + * Format a local time/date according to locale settings + * @link http://www.php.net/manual/en/function.strftime.php + * @param format string

+ * + * The following characters are recognized in the + * format parameter string + * + * + * + * + * + * + * Day + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Week + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Month + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Year + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Time + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Time and Date Stamps + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Miscellaneous + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
formatDescriptionExample returned values
------
%aAn abbreviated textual representation of the daySun through Sat
%AA full textual representation of the daySunday through Saturday
%dTwo-digit day of the month (with leading zeros)01 to 31
%eDay of the month, with a space preceding single digits 1 to 31
%jDay of the year, 3 digits with leading zeros001 to 366
%uISO-8601 numeric representation of the day of the week1 (for Monday) though 7 (for Sunday)
%wNumeric representation of the day of the week0 (for Sunday) through 6 (for Saturday)
------
%UWeek number of the given year, starting with the first + * Sunday as the first week13 (for the 13th full week of the year)
%VISO-8601:1988 week number of the given year, starting with + * the first week of the year with at least 4 weekdays, with Monday + * being the start of the week01 through 53 (where 53 + * accounts for an overlapping week)
%WA numeric representation of the week of the year, starting + * with the first Monday as the first week46 (for the 46th week of the year beginning + * with a Monday)
------
%bAbbreviated month name, based on the localeJan through Dec
%BFull month name, based on the localeJanuary through December
%hAbbreviated month name, based on the locale (an alias of %b)Jan through Dec
%mTwo digit representation of the month01 (for January) through 12 (for December)
------
%CTwo digit representation of the century (year divided by 100, truncated to an integer)19 for the 20th Century
%gTwo digit representation of the year going by ISO-8601:1988 standards (see %V)Example: 09 for the week of January 6, 2009
%GThe full four-digit version of %gExample: 2008 for the week of January 3, 2009
%yTwo digit representation of the yearExample: 09 for 2009, 79 for 1979
%YFour digit representation for the yearExample: 2038
------
%HTwo digit representation of the hour in 24-hour format00 through 23
%ITwo digit representation of the hour in 12-hour format01 through 12
%l (lower-case 'L')Hour in 12-hour format, with a space preceeding single digits 1 through 12
%MTwo digit representation of the minute00 through 59
%pUPPER-CASE 'AM' or 'PM' based on the given timeExample: AM for 00:31, PM for 22:23
%Plower-case 'am' or 'pm' based on the given timeExample: am for 00:31, pm for 22:23
%rSame as "%I:%M:%S %p"Example: 09:34:17 PM for 21:34:17
%RSame as "%H:%M"Example: 00:35 for 12:35 AM, 16:44 for 4:44 PM
%STwo digit representation of the second00 through 59
%TSame as "%H:%M:%S"Example: 21:34:17 for 09:34:17 PM
%XPreferred time representation based on locale, without the dateExample: 03:59:16 or 15:59:16
%zEither the time zone offset from UTC or the abbreviation (depends + * on operating system)Example: -0500 or EST for Eastern Time
%ZThe time zone offset/abbreviation option NOT given by %z (depends + * on operating system)Example: -0500 or EST for Eastern Time
------
%cPreferred date and time stamp based on localExample: Tue Feb 5 00:45:10 2009 for + * February 4, 2009 at 12:45:10 AM
%DSame as "%m/%d/%y"Example: 02/05/09 for February 5, 2009
%FSame as "%Y-%m-%d" (commonly used in database datestamps)Example: 2009-02-05 for February 5, 2009
%sUnix Epoch Time timestamp (same as the time + * function)Example: 305815200 for September 10, 1979 08:40:00 AM
%xPreferred date representation based on locale, without the timeExample: 02/05/09 for February 5, 2009
------
%nA newline character ("\n")---
%tA Tab character ("\t")---
%%A literal percentage character ("%")---
+ *

+ *

+ * Maximum length of this parameter is 1023 characters. + *

+ * Contrary to ISO-9899:1999, Sun Solaris starts with Sunday as 1. + * As a result, %u may not function as described in this manual. + * @param timestamp int[optional] + * @return string a string formatted according format + * using the given timestamp or the current + * local time if no timestamp is given. Month and weekday names and + * other language-dependent strings respect the current locale set + * with setlocale. + * + * @jms-builtin + */ +function strftime ($format, $timestamp = null) {} + +/** + * Format a GMT/UTC time/date according to locale settings + * @link http://www.php.net/manual/en/function.gmstrftime.php + * @param format string

+ * See description in strftime. + *

+ * @param timestamp int[optional] + * @return string a string formatted according to the given format string + * using the given timestamp or the current + * local time if no timestamp is given. Month and weekday names and + * other language dependent strings respect the current locale set + * with setlocale. + * + * @jms-builtin + */ +function gmstrftime ($format, $timestamp = null) {} + +/** + * Return current Unix timestamp + * @link http://www.php.net/manual/en/function.time.php + * @return int + * + * @jms-builtin + */ +function time () {} + +/** + * Get the local time + * @link http://www.php.net/manual/en/function.localtime.php + * @param timestamp int[optional] + * @param is_associative bool[optional]

+ * If set to false or not supplied then the array is returned as a regular, + * numerically indexed array. If the argument is set to true then + * localtime returns an associative array containing + * all the different elements of the structure returned by the C + * function call to localtime. The names of the different keys of + * the associative array are as follows: + *

+ *

+ * "tm_sec" - seconds + * @return array + * + * @jms-builtin + */ +function localtime ($timestamp = null, $is_associative = null) {} + +/** + * Get date/time information + * @link http://www.php.net/manual/en/function.getdate.php + * @param timestamp int[optional] + * @return array an associative array of information related to + * the timestamp. Elements from the returned + * associative array are as follows: + *

+ *

+ * + * Key elements of the returned associative array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
KeyDescriptionExample returned values
"seconds"Numeric representation of seconds0 to 59
"minutes"Numeric representation of minutes0 to 59
"hours"Numeric representation of hours0 to 23
"mday"Numeric representation of the day of the month1 to 31
"wday"Numeric representation of the day of the week0 (for Sunday) through 6 (for Saturday)
"mon"Numeric representation of a month1 through 12
"year"A full numeric representation of a year, 4 digitsExamples: 1999 or 2003
"yday"Numeric representation of the day of the year0 through 365
"weekday"A full textual representation of the day of the weekSunday through Saturday
"month"A full textual representation of a month, such as January or MarchJanuary through December
0 + * Seconds since the Unix Epoch, similar to the values returned by + * time and used by date. + * + * System Dependent, typically -2147483648 through + * 2147483647. + *
+ * + * @jms-builtin + */ +function getdate ($timestamp = null) {} + +/** + * &Alias; DateTime::__construct + * @link http://www.php.net/manual/en/function.date-create.php + * @param time[optional] + * @param object[optional] + * + * @jms-builtin + */ +function date_create ($time, $object) {} + +/** + * &Alias; DateTime::createFromFormat + * @link http://www.php.net/manual/en/function.date-create-from-format.php + * @param format + * @param time + * @param object[optional] + * + * @jms-builtin + */ +function date_create_from_format ($format, $time, $object) {} + +/** + * Returns associative array with detailed info about given date + * @link http://www.php.net/manual/en/function.date-parse.php + * @param date string

+ * Date in format accepted by strtotime. + *

+ * @return array array with information about the parsed date + * on success&return.falseforfailure;. + * + * @jms-builtin + */ +function date_parse ($date) {} + +/** + * Get info about given date + * @link http://www.php.net/manual/en/function.date-parse-from-format.php + * @param format string

+ * Format accepted by date with some extras. + *

+ * @param date string

+ * String representing the date. + *

+ * @return array associative array with detailed info about given date. + * + * @jms-builtin + */ +function date_parse_from_format ($format, $date) {} + +/** + * &Alias; DateTime::getLastErrors + * @link http://www.php.net/manual/en/function.date-get-last-errors.php + * + * @jms-builtin + */ +function date_get_last_errors () {} + +/** + * &Alias; DateTime::format + * @link http://www.php.net/manual/en/function.date-format.php + * @param object + * @param format + * + * @jms-builtin + */ +function date_format ($object, $format) {} + +/** + * &Alias; DateTime::modify + * @link http://www.php.net/manual/en/function.date-modify.php + * @param object + * @param modify + * + * @jms-builtin + */ +function date_modify ($object, $modify) {} + +/** + * &Alias; DateTime::add + * @link http://www.php.net/manual/en/function.date-add.php + * @param object + * @param interval + * + * @jms-builtin + */ +function date_add ($object, $interval) {} + +/** + * &Alias; DateTime::sub + * @link http://www.php.net/manual/en/function.date-sub.php + * @param object + * @param interval + * + * @jms-builtin + */ +function date_sub ($object, $interval) {} + +/** + * &Alias; DateTime::getTimezone + * @link http://www.php.net/manual/en/function.date-timezone-get.php + * @param object + * + * @jms-builtin + */ +function date_timezone_get ($object) {} + +/** + * &Alias; DateTime::setTimezone + * @link http://www.php.net/manual/en/function.date-timezone-set.php + * @param object + * @param timezone + * + * @jms-builtin + */ +function date_timezone_set ($object, $timezone) {} + +/** + * &Alias; DateTime::getOffset + * @link http://www.php.net/manual/en/function.date-offset-get.php + * @param object + * + * @jms-builtin + */ +function date_offset_get ($object) {} + +/** + * &Alias; DateTime::diff + * @link http://www.php.net/manual/en/function.date-diff.php + * @param object + * @param object2 + * @param absolute[optional] + * + * @jms-builtin + */ +function date_diff ($object, $object2, $absolute) {} + +/** + * &Alias; DateTime::setTime + * @link http://www.php.net/manual/en/function.date-time-set.php + * @param object + * @param hour + * @param minute + * @param second[optional] + * + * @jms-builtin + */ +function date_time_set ($object, $hour, $minute, $second) {} + +/** + * &Alias; DateTime::setDate + * @link http://www.php.net/manual/en/function.date-date-set.php + * @param object + * @param year + * @param month + * @param day + * + * @jms-builtin + */ +function date_date_set ($object, $year, $month, $day) {} + +/** + * &Alias; DateTime::setISODate + * @link http://www.php.net/manual/en/function.date-isodate-set.php + * @param object + * @param year + * @param week + * @param day[optional] + * + * @jms-builtin + */ +function date_isodate_set ($object, $year, $week, $day) {} + +/** + * &Alias; DateTime::setTimestamp + * @link http://www.php.net/manual/en/function.date-timestamp-set.php + * @param object + * @param unixtimestamp + * + * @jms-builtin + */ +function date_timestamp_set ($object, $unixtimestamp) {} + +/** + * &Alias; DateTime::getTimestamp + * @link http://www.php.net/manual/en/function.date-timestamp-get.php + * @param object + * + * @jms-builtin + */ +function date_timestamp_get ($object) {} + +/** + * &Alias; DateTimeZone::__construct + * @link http://www.php.net/manual/en/function.timezone-open.php + * @param timezone + * + * @jms-builtin + */ +function timezone_open ($timezone) {} + +/** + * &Alias; DateTimeZone::getName + * @link http://www.php.net/manual/en/function.timezone-name-get.php + * @param object + * + * @jms-builtin + */ +function timezone_name_get ($object) {} + +/** + * Returns the timezone name from abbreviation + * @link http://www.php.net/manual/en/function.timezone-name-from-abbr.php + * @param abbr string

+ * Time zone abbreviation. + *

+ * @param gmtOffset int[optional]

+ * Offset from GMT in seconds. Defaults to -1 which means that first found + * time zone corresponding to abbr is returned. + * Otherwise exact offset is searched and only if not found then the first + * time zone with any offset is returned. + *

+ * @param isdst int[optional]

+ * Daylight saving time indicator. If abbr doesn't + * exist then the time zone is searched solely by + * offset and isdst. + *

+ * @return string time zone name on success&return.falseforfailure;. + * + * @jms-builtin + */ +function timezone_name_from_abbr ($abbr, $gmtOffset = null, $isdst = null) {} + +/** + * &Alias; DateTimeZone::getOffset + * @link http://www.php.net/manual/en/function.timezone-offset-get.php + * @param object + * @param datetime + * + * @jms-builtin + */ +function timezone_offset_get ($object, $datetime) {} + +/** + * &Alias; DateTimeZone::getTransitions + * @link http://www.php.net/manual/en/function.timezone-transitions-get.php + * @param object + * @param timestamp_begin[optional] + * @param timestamp_end[optional] + * + * @jms-builtin + */ +function timezone_transitions_get ($object, $timestamp_begin, $timestamp_end) {} + +/** + * &Alias; DateTimeZone::getLocation + * @link http://www.php.net/manual/en/function.timezone-location-get.php + * @param object + * + * @jms-builtin + */ +function timezone_location_get ($object) {} + +/** + * &Alias; DateTimeZone::listIdentifiers + * @link http://www.php.net/manual/en/function.timezone-identifiers-list.php + * @param what[optional] + * @param country[optional] + * + * @jms-builtin + */ +function timezone_identifiers_list ($what, $country) {} + +/** + * &Alias; DateTimeZone::listAbbreviations + * @link http://www.php.net/manual/en/function.timezone-abbreviations-list.php + * + * @jms-builtin + */ +function timezone_abbreviations_list () {} + +/** + * Gets the version of the timezonedb + * @link http://www.php.net/manual/en/function.timezone-version-get.php + * @return string a string. + * + * @jms-builtin + */ +function timezone_version_get () {} + +/** + * &Alias; DateInterval::createFromDateString + * @link http://www.php.net/manual/en/function.date-interval-create-from-date-string.php + * @param time + * + * @jms-builtin + */ +function date_interval_create_from_date_string ($time) {} + +/** + * &Alias; DateInterval::format + * @link http://www.php.net/manual/en/function.date-interval-format.php + * @param object + * @param format + * + * @jms-builtin + */ +function date_interval_format ($object, $format) {} + +/** + * Sets the default timezone used by all date/time functions in a script + * @link http://www.php.net/manual/en/function.date-default-timezone-set.php + * @param timezone_identifier string

+ * The timezone identifier, like UTC or + * Europe/Lisbon. The list of valid identifiers is + * available in the . + *

+ * @return bool This function returns false if the + * timezone_identifier isn't valid, or true + * otherwise. + * + * @jms-builtin + */ +function date_default_timezone_set ($timezone_identifier) {} + +/** + * Gets the default timezone used by all date/time functions in a script + * @link http://www.php.net/manual/en/function.date-default-timezone-get.php + * @return string a string. + * + * @jms-builtin + */ +function date_default_timezone_get () {} + +/** + * Returns time of sunrise for a given day and location + * @link http://www.php.net/manual/en/function.date-sunrise.php + * @param timestamp int

+ * The timestamp of the day from which the sunrise + * time is taken. + *

+ * @param format int[optional]

+ * + * format constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
constantdescriptionexample
SUNFUNCS_RET_STRINGreturns the result as string16:46
SUNFUNCS_RET_DOUBLEreturns the result as float16.78243132
SUNFUNCS_RET_TIMESTAMPreturns the result as integer (timestamp)1095034606
+ *

+ * @param latitude float[optional]

+ * Defaults to North, pass in a negative value for South. + * See also: date.default_latitude + *

+ * @param longitude float[optional]

+ * Defaults to East, pass in a negative value for West. + * See also: date.default_longitude + *

+ * @param zenith float[optional]

+ * Default: date.sunrise_zenith + *

+ * @param gmt_offset float[optional] + * @return mixed the sunrise time in a specified format on + * success&return.falseforfailure;. + * + * @jms-builtin + */ +function date_sunrise ($timestamp, $format = null, $latitude = null, $longitude = null, $zenith = null, $gmt_offset = null) {} + +/** + * Returns time of sunset for a given day and location + * @link http://www.php.net/manual/en/function.date-sunset.php + * @param timestamp int

+ * The timestamp of the day from which the sunset + * time is taken. + *

+ * @param format int[optional]

+ * + * format constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
constantdescriptionexample
SUNFUNCS_RET_STRINGreturns the result as string16:46
SUNFUNCS_RET_DOUBLEreturns the result as float16.78243132
SUNFUNCS_RET_TIMESTAMPreturns the result as integer (timestamp)1095034606
+ *

+ * @param latitude float[optional]

+ * Defaults to North, pass in a negative value for South. + * See also: date.default_latitude + *

+ * @param longitude float[optional]

+ * Defaults to East, pass in a negative value for West. + * See also: date.default_longitude + *

+ * @param zenith float[optional]

+ * Default: date.sunset_zenith + *

+ * @param gmt_offset float[optional] + * @return mixed the sunset time in a specified format on + * success&return.falseforfailure;. + * + * @jms-builtin + */ +function date_sunset ($timestamp, $format = null, $latitude = null, $longitude = null, $zenith = null, $gmt_offset = null) {} + +/** + * Returns an array with information about sunset/sunrise and twilight begin/end + * @link http://www.php.net/manual/en/function.date-sun-info.php + * @param time int

+ * Timestamp. + *

+ * @param latitude float

+ * Latitude in degrees. + *

+ * @param longitude float

+ * Longitude in degrees. + *

+ * @return array array on success&return.falseforfailure;. + * + * @jms-builtin + */ +function date_sun_info ($time, $latitude, $longitude) {} + +define ('DATE_ATOM', "Y-m-d\TH:i:sP"); +define ('DATE_COOKIE', "l, d-M-y H:i:s T"); +define ('DATE_ISO8601', "Y-m-d\TH:i:sO"); +define ('DATE_RFC822', "D, d M y H:i:s O"); +define ('DATE_RFC850', "l, d-M-y H:i:s T"); +define ('DATE_RFC1036', "D, d M y H:i:s O"); +define ('DATE_RFC1123', "D, d M Y H:i:s O"); +define ('DATE_RFC2822', "D, d M Y H:i:s O"); +define ('DATE_RFC3339', "Y-m-d\TH:i:sP"); +define ('DATE_RSS', "D, d M Y H:i:s O"); +define ('DATE_W3C', "Y-m-d\TH:i:sP"); + +/** + * Timestamp + * @link http://www.php.net/manual/en/datetime.constants.php + */ +define ('SUNFUNCS_RET_TIMESTAMP', 0); + +/** + * Hours:minutes (example: 08:02) + * @link http://www.php.net/manual/en/datetime.constants.php + */ +define ('SUNFUNCS_RET_STRING', 1); + +/** + * Hours as floating point number (example 8.75) + * @link http://www.php.net/manual/en/datetime.constants.php + */ +define ('SUNFUNCS_RET_DOUBLE', 2); + +// End of date v.5.3.2 +?> diff --git a/res/php-5.3-core-api/dom.php b/res/php-5.3-core-api/dom.php new file mode 100644 index 0000000..41f1f59 --- /dev/null +++ b/res/php-5.3-core-api/dom.php @@ -0,0 +1,4732 @@ + + * The feature to test. + *

+ * @param version string

+ * The version number of the feature to test. In + * level 2, this can be either 2.0 or + * 1.0. + *

+ * @return bool Returns true on success or false on failure. + */ + public function hasFeature ($feature, $version) {} + + /** + * Creates an empty DOMDocumentType object + * @link http://www.php.net/manual/en/domimplementation.createdocumenttype.php + * @param qualifiedName string[optional]

+ * The qualified name of the document type to create. + *

+ * @param publicId string[optional]

+ * The external subset public identifier. + *

+ * @param systemId string[optional]

+ * The external subset system identifier. + *

+ * @return DOMDocumentType A new DOMDocumentType node with its + * ownerDocument set to &null;. + */ + public function createDocumentType ($qualifiedName = null, $publicId = null, $systemId = null) {} + + /** + * Creates a DOMDocument object of the specified type with its document element + * @link http://www.php.net/manual/en/domimplementation.createdocument.php + * @param namespaceURI string[optional]

+ * The namespace URI of the document element to create. + *

+ * @param qualifiedName string[optional]

+ * The qualified name of the document element to create. + *

+ * @param doctype DOMDocumentType[optional]

+ * The type of document to create or &null;. + *

+ * @return DOMDocument A new DOMDocument object. If + * namespaceURI, qualifiedName, + * and doctype are null, the returned + * DOMDocument is empty with no document element + */ + public function createDocument ($namespaceURI = null, $qualifiedName = null, DOMDocumentType $doctype = null) {} + +} + +/** + * @link http://www.php.net/manual/en/class.domnode.php + * + * @jms-builtin + */ +class DOMNode { + + /** + * Returns the most accurate name for the current node type + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.nodename + */ + public $nodeName; + + /** + * The value of this node, depending on its type + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.nodevalue + */ + public $nodeValue; + + /** + * Gets the type of the node. One of the predefined XML_xxx_NODE constants + * @var int + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.nodetype + */ + public $nodeType; + + /** + * The parent of this node + * @var DOMNode + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.parentnode + */ + public $parentNode; + + /** + * A DOMNodeList that contains all + * children of this node. If there are no children, this is an empty + * DOMNodeList. + * @var DOMNodeList + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.childnodes + */ + public $childNodes; + + /** + * The first child of this node. If there is no such node, this + * returns &null;. + * @var DOMNode + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.firstchild + */ + public $firstChild; + + /** + * The last child of this node. If there is no such node, this returns &null;. + * @var DOMNode + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.lastchild + */ + public $lastChild; + + /** + * The node immediately preceding this node. If there is no such + * node, this returns &null;. + * @var DOMNode + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.previoussibling + */ + public $previousSibling; + + /** + * The node immediately following this node. If there is no such + * node, this returns &null;. + * @var DOMNode + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.nextsibling + */ + public $nextSibling; + + /** + * A DOMNamedNodeMap containing the + * attributes of this node (if it is a DOMElement) + * or &null; otherwise. + * @var DOMNamedNodeMap + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.attributes + */ + public $attributes; + + /** + * The DOMDocument object associated with this node. + * @var DOMDocument + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.ownerdocument + */ + public $ownerDocument; + + /** + * The namespace URI of this node, or &null; if it is unspecified. + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.namespaceuri + */ + public $namespaceURI; + + /** + * The namespace prefix of this node, or &null; if it is unspecified. + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.prefix + */ + public $prefix; + + /** + * Returns the local part of the qualified name of this node. + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.localname + */ + public $localName; + + /** + * The absolute base URI of this node or &null; if the implementation + * wasn't able to obtain an absolute URI. + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.baseuri + */ + public $baseURI; + + /** + * This attribute returns the text content of this node and its descendants. + * @var string + * @link http://www.php.net/manual/en/class.domnode.php#domnode.props.textcontent + */ + public $textContent; + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** @jms-builtin */ +class DOMNameSpaceNode { +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domdocumentfragment.php + * + * @jms-builtin + */ +class DOMDocumentFragment extends DOMNode { + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domdocumentfragment.php#domdocumentfragment.props.name + */ + public $name; + + public function __construct () {} + + /** + * Append raw XML data + * @link http://www.php.net/manual/en/domdocumentfragment.appendxml.php + * @param data string

+ * XML to append. + *

+ * @return bool Returns true on success or false on failure. + */ + public function appendXML ($data) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domdocument.php + * + * @jms-builtin + */ +class DOMDocument extends DOMNode { + + /** + * Deprecated. Actual encoding of the document, + * is a readonly equivalent to + * encoding. + * @var string + * @deprecated + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.actualencoding + */ + public $actualEncoding; + + /** + * Deprecated. Configuration used when + * DOMDocument::normalizeDocument is + * invoked. + * @var DOMConfiguration + * @deprecated + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.config + */ + public $config; + + /** + * The Document Type Declaration associated with this document. + * @var DOMDocumentType + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.doctype + */ + public $doctype; + + /** + * This is a convenience attribute that allows direct access to the + * child node that is the document element of the document. + * @var DOMElement + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.documentelement + */ + public $documentElement; + + /** + * The location of the document or &null; if undefined. + * @var string + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.documenturi + */ + public $documentURI; + + /** + * Encoding of the document, as specified by the XML declaration. This + * attribute is not present in the final DOM Level 3 specification, but + * is the only way of manipulating XML document encoding in this + * implementation. + * @var string + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.encoding + */ + public $encoding; + + /** + * Nicely formats output with indentation and extra space. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.formatoutput + */ + public $formatOutput; + + /** + * The DOMImplementation object that handles + * this document. + * @var DOMImplementation + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.implementation + */ + public $implementation; + + /** + * Do not remove redundant white space. Default to true. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.preservewhitespace + */ + public $preserveWhiteSpace; + + /** + * Proprietary. Enables recovery mode, i.e. trying + * to parse non-well formed documents. This attribute is not part of + * the DOM specification and is specific to libxml. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.recover + */ + public $recover; + + /** + * Set it to true to load external entities from a doctype + * declaration. This is useful for including character entities in + * your XML document. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.resolveexternals + */ + public $resolveExternals; + + /** + * Deprecated. Whether or not the document is + * standalone, as specified by the XML declaration, corresponds to + * xmlStandalone. + * @var bool + * @deprecated + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.standalone + */ + public $standalone; + + /** + * Throws DOMException on errors. Default to true. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.stricterrorchecking + */ + public $strictErrorChecking; + + /** + * Proprietary. Whether or not to substitute + * entities. This attribute is not part of + * the DOM specification and is specific to libxml. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.substituteentities + */ + public $substituteEntities; + + /** + * Loads and validates against the DTD. Default to false. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.validateonparse + */ + public $validateOnParse; + + /** + * Deprecated. Version of XML, corresponds to + * xmlVersion + * @var string + * @deprecated + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.version + */ + public $version; + + /** + * An attribute specifying, as part of the XML declaration, the + * encoding of this document. This is &null; when unspecified or when it + * is not known, such as when the Document was created in memory. + * @var string + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.xmlencoding + */ + public $xmlEncoding; + + /** + * An attribute specifying, as part of the XML declaration, whether + * this document is standalone. This is false when unspecified. + * @var bool + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.xmlstandalone + */ + public $xmlStandalone; + + /** + * An attribute specifying, as part of the XML declaration, the + * version number of this document. If there is no declaration and if + * this document supports the "XML" feature, the value is "1.0". + * @var string + * @link http://www.php.net/manual/en/class.domdocument.php#domdocument.props.xmlversion + */ + public $xmlVersion; + + /** + * Create new element node + * @link http://www.php.net/manual/en/domdocument.createelement.php + * @param name string

+ * The tag name of the element. + *

+ * @param value string[optional]

+ * The value of the element. By default, an empty element will be created. + * The value can also be set later with DOMElement->nodeValue. + *

+ * @return DOMElement a new instance of class DOMElement or false + * if an error occured. + */ + public function createElement ($name, $value = null) {} + + /** + * Create new document fragment + * @link http://www.php.net/manual/en/domdocument.createdocumentfragment.php + * @return DOMDocumentFragment The new DOMDocumentFragment or false if an error occured. + */ + public function createDocumentFragment () {} + + /** + * Create new text node + * @link http://www.php.net/manual/en/domdocument.createtextnode.php + * @param content string

+ * The content of the text. + *

+ * @return DOMText The new DOMText or false if an error occured. + */ + public function createTextNode ($content) {} + + /** + * Create new comment node + * @link http://www.php.net/manual/en/domdocument.createcomment.php + * @param data string

+ * The content of the comment. + *

+ * @return DOMComment The new DOMComment or false if an error occured. + */ + public function createComment ($data) {} + + /** + * Create new cdata node + * @link http://www.php.net/manual/en/domdocument.createcdatasection.php + * @param data string

+ * The content of the cdata. + *

+ * @return DOMCDATASection The new DOMCDATASection or false if an error occured. + */ + public function createCDATASection ($data) {} + + /** + * Creates new PI node + * @link http://www.php.net/manual/en/domdocument.createprocessinginstruction.php + * @param target string

+ * The target of the processing instruction. + *

+ * @param data string[optional]

+ * The content of the processing instruction. + *

+ * @return DOMProcessingInstruction The new DOMProcessingInstruction or false if an error occured. + */ + public function createProcessingInstruction ($target, $data = null) {} + + /** + * Create new attribute + * @link http://www.php.net/manual/en/domdocument.createattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @return DOMAttr The new DOMAttr or false if an error occured. + */ + public function createAttribute ($name) {} + + /** + * Create new entity reference node + * @link http://www.php.net/manual/en/domdocument.createentityreference.php + * @param name string

+ * The content of the entity reference, e.g. the entity reference minus + * the leading & and the trailing + * ; characters. + *

+ * @return DOMEntityReference The new DOMEntityReference or false if an error + * occured. + */ + public function createEntityReference ($name) {} + + /** + * Searches for all elements with given tag name + * @link http://www.php.net/manual/en/domdocument.getelementsbytagname.php + * @param name string

+ * The name of the tag to match on. The special value * + * matches all tags. + *

+ * @return DOMNodeList A new DOMNodeList object containing all the matched + * elements. + */ + public function getElementsByTagName ($name) {} + + /** + * Import node into current document + * @link http://www.php.net/manual/en/domdocument.importnode.php + * @param importedNode DOMNode

+ * The node to import. + *

+ * @param deep bool[optional]

+ * If set to true, this method will recursively import the subtree under + * the importedNode. + *

+ *

+ * To copy the nodes attributes deep needs to be set to true + *

+ * @return DOMNode The copied node or false, if it cannot be copied. + */ + public function importNode (DOMNode $importedNode, $deep = null) {} + + /** + * Create new element node with an associated namespace + * @link http://www.php.net/manual/en/domdocument.createelementns.php + * @param namespaceURI string

+ * The URI of the namespace. + *

+ * @param qualifiedName string

+ * The qualified name of the element, as prefix:tagname. + *

+ * @param value string[optional]

+ * The value of the element. By default, an empty element will be created. + * You can also set the value later with DOMElement->nodeValue. + *

+ * @return DOMElement The new DOMElement or false if an error occured. + */ + public function createElementNS ($namespaceURI, $qualifiedName, $value = null) {} + + /** + * Create new attribute node with an associated namespace + * @link http://www.php.net/manual/en/domdocument.createattributens.php + * @param namespaceURI string

+ * The URI of the namespace. + *

+ * @param qualifiedName string

+ * The tag name and prefix of the attribute, as prefix:tagname. + *

+ * @return DOMAttr The new DOMAttr or false if an error occured. + */ + public function createAttributeNS ($namespaceURI, $qualifiedName) {} + + /** + * Searches for all elements with given tag name in specified namespace + * @link http://www.php.net/manual/en/domdocument.getelementsbytagnamens.php + * @param namespaceURI string

+ * The namespace URI of the elements to match on. + * The special value * matches all namespaces. + *

+ * @param localName string

+ * The local name of the elements to match on. + * The special value * matches all local names. + *

+ * @return DOMNodeList A new DOMNodeList object containing all the matched + * elements. + */ + public function getElementsByTagNameNS ($namespaceURI, $localName) {} + + /** + * Searches for an element with a certain id + * @link http://www.php.net/manual/en/domdocument.getelementbyid.php + * @param elementId string

+ * The unique id value for an element. + *

+ * @return DOMElement the DOMElement or &null; if the element is + * not found. + */ + public function getElementById ($elementId) {} + + /** + * @param source DOMNode + */ + public function adoptNode (DOMNode $source) {} + + /** + * Normalizes the document + * @link http://www.php.net/manual/en/domdocument.normalizedocument.php + * @return void + */ + public function normalizeDocument () {} + + /** + * @param node DOMNode + * @param namespaceURI + * @param qualifiedName + */ + public function renameNode (DOMNode $node, $namespaceURI, $qualifiedName) {} + + /** + * Load XML from a file + * @link http://www.php.net/manual/en/domdocument.load.php + * @param filename string

+ * The path to the XML document. + *

+ * @param options int[optional]

+ * Bitwise OR + * of the libxml option constants. + *

+ * @return mixed Returns true on success or false on failure. If called statically, returns a + * DOMDocument and issues E_STRICT + * warning. + */ + public function load ($filename, $options = null) {} + + /** + * Dumps the internal XML tree back into a file + * @link http://www.php.net/manual/en/domdocument.save.php + * @param filename string

+ * The path to the saved XML document. + *

+ * @param options int[optional]

+ * Additional Options. Currently only LIBXML_NOEMPTYTAG is supported. + *

+ * @return int the number of bytes written or false if an error occurred. + */ + public function save ($filename, $options = null) {} + + /** + * Load XML from a string + * @link http://www.php.net/manual/en/domdocument.loadxml.php + * @param source string

+ * The string containing the XML. + *

+ * @param options int[optional]

+ * Bitwise OR + * of the libxml option constants. + *

+ * @return mixed Returns true on success or false on failure. If called statically, returns a + * DOMDocument and issues E_STRICT + * warning. + */ + public function loadXML ($source, $options = null) {} + + /** + * Dumps the internal XML tree back into a string + * @link http://www.php.net/manual/en/domdocument.savexml.php + * @param node DOMNode[optional]

+ * Use this parameter to output only a specific node without XML declaration + * rather than the entire document. + *

+ * @param options int[optional]

+ * Additional Options. Currently only LIBXML_NOEMPTYTAG is supported. + *

+ * @return string the XML, or false if an error occurred. + */ + public function saveXML (DOMNode $node = null, $options = null) {} + + /** + * Creates a new DOMDocument object + * @link http://www.php.net/manual/en/domdocument.construct.php + * @param version[optional] + * @param encoding[optional] + */ + public function __construct ($version, $encoding) {} + + /** + * Validates the document based on its DTD + * @link http://www.php.net/manual/en/domdocument.validate.php + * @return bool Returns true on success or false on failure. + * If the document have no DTD attached, this method will return false. + */ + public function validate () {} + + /** + * Substitutes XIncludes in a DomDocument Object + * @link http://www.php.net/manual/en/function.domdocument-xinclude.php + * @param options int[optional]

+ * libxml parameters. Available + * since PHP 5.1.0 and Libxml 2.6.7. + *

+ * @return int the number of XIncludes in the document. + */ + public function xinclude ($options = null) {} + + /** + * Load HTML from a string + * @link http://www.php.net/manual/en/domdocument.loadhtml.php + * @param source string

+ * The HTML string. + *

+ * @return bool Returns true on success or false on failure. If called statically, returns a + * DOMDocument and issues E_STRICT + * warning. + */ + public function loadHTML ($source) {} + + /** + * Load HTML from a file + * @link http://www.php.net/manual/en/domdocument.loadhtmlfile.php + * @param filename string

+ * The path to the HTML file. + *

+ * @return bool Returns true on success or false on failure. If called statically, returns a + * DOMDocument and issues E_STRICT + * warning. + */ + public function loadHTMLFile ($filename) {} + + /** + * Dumps the internal document into a string using HTML formatting + * @link http://www.php.net/manual/en/domdocument.savehtml.php + * @return string the HTML, or false if an error occurred. + */ + public function saveHTML () {} + + /** + * Dumps the internal document into a file using HTML formatting + * @link http://www.php.net/manual/en/domdocument.savehtmlfile.php + * @param filename string

+ * The path to the saved HTML document. + *

+ * @return int the number of bytes written or false if an error occurred. + */ + public function saveHTMLFile ($filename) {} + + /** + * Validates a document based on a schema + * @link http://www.php.net/manual/en/domdocument.schemavalidate.php + * @param filename string

+ * The path to the schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function schemaValidate ($filename) {} + + /** + * Validates a document based on a schema + * @link http://www.php.net/manual/en/domdocument.schemavalidatesource.php + * @param source string

+ * A string containing the schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function schemaValidateSource ($source) {} + + /** + * Performs relaxNG validation on the document + * @link http://www.php.net/manual/en/domdocument.relaxngvalidate.php + * @param filename string

+ * The RNG file. + *

+ * @return bool Returns true on success or false on failure. + */ + public function relaxNGValidate ($filename) {} + + /** + * Performs relaxNG validation on the document + * @link http://www.php.net/manual/en/domdocument.relaxngvalidatesource.php + * @param source string

+ * A string containing the RNG schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function relaxNGValidateSource ($source) {} + + /** + * Register extended class used to create base node type + * @link http://www.php.net/manual/en/domdocument.registernodeclass.php + * @param baseclass string

+ * The DOM class that you want to extend. You can find a list of these + * classes in the chapter introduction. + *

+ * @param extendedclass string

+ * Your extended class name. If &null; is provided, any previously + * registered class extending baseclass will + * be removed. + *

+ * @return bool Returns true on success or false on failure. + */ + public function registerNodeClass ($baseclass, $extendedclass) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * @link http://www.php.net/manual/en/class.domnodelist.php + * + * @jms-builtin + */ +class DOMNodeList implements Traversable { + + /** + * The number of nodes in the list. The range of valid child node + * indices is 0 to length - 1 inclusive. + * @var int + * @link http://www.php.net/manual/en/class.domnodelist.php#domnodelist.props.length + */ + public $length; + + /** + * Retrieves a node specified by index + * @link http://www.php.net/manual/en/domnodelist.item.php + * @param index int

+ * Index of the node into the collection. + *

+ * @return DOMNode The node at the indexth position in the + * DOMNodeList, or &null; if that is not a valid + * index. + */ + public function item ($index) {} + +} + +/** + * @link http://www.php.net/manual/en/class.domnamednodemap.php + * + * @jms-builtin + */ +class DOMNamedNodeMap { + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domnamednodemap.php#domnamednodemap.props.name + */ + public $name; + + /** + * Retrieves a node specified by name + * @link http://www.php.net/manual/en/domnamednodemap.getnameditem.php + * @param name string

+ * The nodeName of the node to retrieve. + *

+ * @return DOMNode A node (of any type) with the specified nodeName, or + * &null; if no node is found. + */ + public function getNamedItem ($name) {} + + /** + * @param arg DOMNode + */ + public function setNamedItem (DOMNode $arg) {} + + /** + * @param name[optional] + */ + public function removeNamedItem ($name) {} + + /** + * Retrieves a node specified by index + * @link http://www.php.net/manual/en/domnamednodemap.item.php + * @param index int

+ * Index into this map. + *

+ * @return DOMNode The node at the indexth position in the map, or &null; + * if that is not a valid index (greater than or equal to the number of nodes + * in this map). + */ + public function item ($index) {} + + /** + * Retrieves a node specified by local name and namespace URI + * @link http://www.php.net/manual/en/domnamednodemap.getnameditemns.php + * @param namespaceURI string

+ * The namespace URI of the node to retrieve. + *

+ * @param localName string

+ * The local name of the node to retrieve. + *

+ * @return DOMNode A node (of any type) with the specified local name and namespace URI, or + * &null; if no node is found. + */ + public function getNamedItemNS ($namespaceURI, $localName) {} + + /** + * @param arg DOMNode[optional] + */ + public function setNamedItemNS (DOMNode $arg) {} + + /** + * @param namespaceURI[optional] + * @param localName[optional] + */ + public function removeNamedItemNS ($namespaceURI, $localName) {} + +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domcharacterdata.php + * + * @jms-builtin + */ +class DOMCharacterData extends DOMNode { + + /** + * The contents of the node. + * @var string + * @link http://www.php.net/manual/en/class.domcharacterdata.php#domcharacterdata.props.data + */ + public $data; + + /** + * The length of the contents. + * @var int + * @link http://www.php.net/manual/en/class.domcharacterdata.php#domcharacterdata.props.length + */ + public $length; + + /** + * Extracts a range of data from the node + * @link http://www.php.net/manual/en/domcharacterdata.substringdata.php + * @param offset int

+ * Start offset of substring to extract. + *

+ * @param count int

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * Append the string to the end of the character data of the node + * @link http://www.php.net/manual/en/domcharacterdata.appenddata.php + * @param data string

+ * The string to append. + *

+ * @return void + */ + public function appendData ($data) {} + + /** + * Insert a string at the specified 16-bit unit offset + * @link http://www.php.net/manual/en/domcharacterdata.insertdata.php + * @param offset int

+ * The character offset at which to insert. + *

+ * @param data string

+ * The string to insert. + *

+ * @return void + */ + public function insertData ($offset, $data) {} + + /** + * Remove a range of characters from the node + * @link http://www.php.net/manual/en/domcharacterdata.deletedata.php + * @param offset int

+ * The offset from which to start removing. + *

+ * @param count int

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void + */ + public function deleteData ($offset, $count) {} + + /** + * Replace a substring within the DOMCharacterData node + * @link http://www.php.net/manual/en/domcharacterdata.replacedata.php + * @param offset int

+ * The offset from which to start replacing. + *

+ * @param count int

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param data string

+ * The string with which the range must be replaced. + *

+ * @return void + */ + public function replaceData ($offset, $count, $data) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode. The DOMAttr + * interface represents an attribute in an DOMElement object. + * @link http://www.php.net/manual/en/class.domattr.php + * + * @jms-builtin + */ +class DOMAttr extends DOMNode { + + /** + * The name of the attribute + * @var string + * @link http://www.php.net/manual/en/class.domattr.php#domattr.props.name + */ + public $name; + + /** + * The element which contains the attribute + * @var DOMElement + * @link http://www.php.net/manual/en/class.domattr.php#domattr.props.ownerelement + */ + public $ownerElement; + + /** + * Not implemented yet, always is &null; + * @var bool + * @link http://www.php.net/manual/en/class.domattr.php#domattr.props.schematypeinfo + */ + public $schemaTypeInfo; + + /** + * Not implemented yet, always is &null; + * @var bool + * @link http://www.php.net/manual/en/class.domattr.php#domattr.props.specified + */ + public $specified; + + /** + * The value of the attribute + * @var string + * @link http://www.php.net/manual/en/class.domattr.php#domattr.props.value + */ + public $value; + + /** + * Checks if attribute is a defined ID + * @link http://www.php.net/manual/en/domattr.isid.php + * @return bool Returns true on success or false on failure. + */ + public function isId () {} + + /** + * Creates a new DOMAttr object + * @link http://www.php.net/manual/en/domattr.construct.php + * @param name + * @param value[optional] + */ + public function __construct ($name, $value) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domelement.php + * + * @jms-builtin + */ +class DOMElement extends DOMNode { + + /** + * Not implemented yet, always return &null; + * @var bool + * @link http://www.php.net/manual/en/class.domelement.php#domelement.props.schematypeinfo + */ + public $schemaTypeInfo; + + /** + * The element name + * @var string + * @link http://www.php.net/manual/en/class.domelement.php#domelement.props.tagname + */ + public $tagName; + + /** + * Returns value of attribute + * @link http://www.php.net/manual/en/domelement.getattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given name is found. + */ + public function getAttribute ($name) {} + + /** + * Adds new attribute + * @link http://www.php.net/manual/en/domelement.setattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @return DOMAttr The new DOMAttr or false if an error occured. + */ + public function setAttribute ($name, $value) {} + + /** + * Removes attribute + * @link http://www.php.net/manual/en/domelement.removeattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @return bool Returns true on success or false on failure. + */ + public function removeAttribute ($name) {} + + /** + * Returns attribute node + * @link http://www.php.net/manual/en/domelement.getattributenode.php + * @param name string

+ * The name of the attribute. + *

+ * @return DOMAttr The attribute node. + */ + public function getAttributeNode ($name) {} + + /** + * Adds new attribute node to element + * @link http://www.php.net/manual/en/domelement.setattributenode.php + * @param attr DOMAttr

+ * The attribute node. + *

+ * @return DOMAttr old node if the attribute has been replaced or &null;. + */ + public function setAttributeNode (DOMAttr $attr) {} + + /** + * Removes attribute + * @link http://www.php.net/manual/en/domelement.removeattributenode.php + * @param oldnode DOMAttr

+ * The attribute node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function removeAttributeNode (DOMAttr $oldnode) {} + + /** + * Gets elements by tagname + * @link http://www.php.net/manual/en/domelement.getelementsbytagname.php + * @param name string

+ * The tag name. Use * to return all elements within + * the element tree. + *

+ * @return DOMNodeList This function returns a new instance of the class + * DOMNodeList of all matched elements. + */ + public function getElementsByTagName ($name) {} + + /** + * Returns value of attribute + * @link http://www.php.net/manual/en/domelement.getattributens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param localName string

+ * The local name. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given localName and namespaceURI + * is found. + */ + public function getAttributeNS ($namespaceURI, $localName) {} + + /** + * Adds new attribute + * @link http://www.php.net/manual/en/domelement.setattributens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param qualifiedName string

+ * The qualified name of the attribute, as prefix:tagname. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @return void + */ + public function setAttributeNS ($namespaceURI, $qualifiedName, $value) {} + + /** + * Removes attribute + * @link http://www.php.net/manual/en/domelement.removeattributens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param localName string

+ * The local name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function removeAttributeNS ($namespaceURI, $localName) {} + + /** + * Returns attribute node + * @link http://www.php.net/manual/en/domelement.getattributenodens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param localName string

+ * The local name. + *

+ * @return DOMAttr The attribute node. + */ + public function getAttributeNodeNS ($namespaceURI, $localName) {} + + /** + * Adds new attribute node to element + * @link http://www.php.net/manual/en/domelement.setattributenodens.php + * @param attr DOMAttr

+ * The attribute node. + *

+ * @return DOMAttr the old node if the attribute has been replaced. + */ + public function setAttributeNodeNS (DOMAttr $attr) {} + + /** + * Get elements by namespaceURI and localName + * @link http://www.php.net/manual/en/domelement.getelementsbytagnamens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param localName string

+ * The local name. Use * to return all elements within + * the element tree. + *

+ * @return DOMNodeList This function returns a new instance of the class + * DOMNodeList of all matched elements in the order in + * which they are encountered in a preorder traversal of this element tree. + */ + public function getElementsByTagNameNS ($namespaceURI, $localName) {} + + /** + * Checks to see if attribute exists + * @link http://www.php.net/manual/en/domelement.hasattribute.php + * @param name string

+ * The attribute name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function hasAttribute ($name) {} + + /** + * Checks to see if attribute exists + * @link http://www.php.net/manual/en/domelement.hasattributens.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @param localName string

+ * The local name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function hasAttributeNS ($namespaceURI, $localName) {} + + /** + * Declares the attribute specified by name to be of type ID + * @link http://www.php.net/manual/en/domelement.setidattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @param isId bool

+ * Set it to true if you want name to be of type + * ID, false otherwise. + *

+ * @return void + */ + public function setIdAttribute ($name, $isId) {} + + /** + * Declares the attribute specified by local name and namespace URI to be of type ID + * @link http://www.php.net/manual/en/domelement.setidattributens.php + * @param namespaceURI string

+ * The namespace URI of the attribute. + *

+ * @param localName string

+ * The local name of the attribute, as prefix:tagname. + *

+ * @param isId bool

+ * Set it to true if you want name to be of type + * ID, false otherwise. + *

+ * @return void + */ + public function setIdAttributeNS ($namespaceURI, $localName, $isId) {} + + /** + * Declares the attribute specified by node to be of type ID + * @link http://www.php.net/manual/en/domelement.setidattributenode.php + * @param attr DOMAttr

+ * The attribute node. + *

+ * @param isId bool

+ * Set it to true if you want name to be of type + * ID, false otherwise. + *

+ * @return void + */ + public function setIdAttributeNode (DOMAttr $attr, $isId) {} + + /** + * Creates a new DOMElement object + * @link http://www.php.net/manual/en/domelement.construct.php + * @param name + * @param value[optional] + * @param uri[optional] + */ + public function __construct ($name, $value, $uri) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMCharacterData. + * @link http://www.php.net/manual/en/class.domtext.php + * + * @jms-builtin + */ +class DOMText extends DOMCharacterData { + + /** + * Holds all the text of logically-adjacent (not separated by Element, + * Comment or Processing Instruction) Text nodes. + * @var string + * @link http://www.php.net/manual/en/class.domtext.php#domtext.props.wholetext + */ + public $wholeText; + + /** + * Breaks this node into two nodes at the specified offset + * @link http://www.php.net/manual/en/domtext.splittext.php + * @param offset int

+ * The offset at which to split, starting from 0. + *

+ * @return DOMText The new node of the same type, which contains all the content at and after the + * offset. + */ + public function splitText ($offset) {} + + /** + * Indicates whether this text node contains whitespace + * @link http://www.php.net/manual/en/domtext.iswhitespaceinelementcontent.php + * @return bool Returns true on success or false on failure. + */ + public function isWhitespaceInElementContent () {} + + public function isElementContentWhitespace () {} + + /** + * @param content + */ + public function replaceWholeText ($content) {} + + /** + * Creates a new DOMText object + * @link http://www.php.net/manual/en/domtext.construct.php + * @param value[optional] + */ + public function __construct ($value) {} + + /** + * Extracts a range of data from the node + * @link http://www.php.net/manual/en/domcharacterdata.substringdata.php + * @param offset int

+ * Start offset of substring to extract. + *

+ * @param count int

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * Append the string to the end of the character data of the node + * @link http://www.php.net/manual/en/domcharacterdata.appenddata.php + * @param data string

+ * The string to append. + *

+ * @return void + */ + public function appendData ($data) {} + + /** + * Insert a string at the specified 16-bit unit offset + * @link http://www.php.net/manual/en/domcharacterdata.insertdata.php + * @param offset int

+ * The character offset at which to insert. + *

+ * @param data string

+ * The string to insert. + *

+ * @return void + */ + public function insertData ($offset, $data) {} + + /** + * Remove a range of characters from the node + * @link http://www.php.net/manual/en/domcharacterdata.deletedata.php + * @param offset int

+ * The offset from which to start removing. + *

+ * @param count int

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void + */ + public function deleteData ($offset, $count) {} + + /** + * Replace a substring within the DOMCharacterData node + * @link http://www.php.net/manual/en/domcharacterdata.replacedata.php + * @param offset int

+ * The offset from which to start replacing. + *

+ * @param count int

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param data string

+ * The string with which the range must be replaced. + *

+ * @return void + */ + public function replaceData ($offset, $count, $data) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMCharacterData. + * @link http://www.php.net/manual/en/class.domcomment.php + * + * @jms-builtin + */ +class DOMComment extends DOMCharacterData { + + /** + * Creates a new DOMComment object + * @link http://www.php.net/manual/en/domcomment.construct.php + * @param value[optional] + */ + public function __construct ($value) {} + + /** + * Extracts a range of data from the node + * @link http://www.php.net/manual/en/domcharacterdata.substringdata.php + * @param offset int

+ * Start offset of substring to extract. + *

+ * @param count int

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * Append the string to the end of the character data of the node + * @link http://www.php.net/manual/en/domcharacterdata.appenddata.php + * @param data string

+ * The string to append. + *

+ * @return void + */ + public function appendData ($data) {} + + /** + * Insert a string at the specified 16-bit unit offset + * @link http://www.php.net/manual/en/domcharacterdata.insertdata.php + * @param offset int

+ * The character offset at which to insert. + *

+ * @param data string

+ * The string to insert. + *

+ * @return void + */ + public function insertData ($offset, $data) {} + + /** + * Remove a range of characters from the node + * @link http://www.php.net/manual/en/domcharacterdata.deletedata.php + * @param offset int

+ * The offset from which to start removing. + *

+ * @param count int

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void + */ + public function deleteData ($offset, $count) {} + + /** + * Replace a substring within the DOMCharacterData node + * @link http://www.php.net/manual/en/domcharacterdata.replacedata.php + * @param offset int

+ * The offset from which to start replacing. + *

+ * @param count int

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param data string

+ * The string with which the range must be replaced. + *

+ * @return void + */ + public function replaceData ($offset, $count, $data) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** @jms-builtin */ +class DOMTypeinfo { +} + +/** @jms-builtin */ +class DOMUserDataHandler { + + public function handle () {} + +} + +/** @jms-builtin */ +class DOMDomError { +} + +/** @jms-builtin */ +class DOMErrorHandler { + + /** + * @param error DOMError + */ + public function handleError (DOMError $error) {} + +} + +/** @jms-builtin */ +class DOMLocator { +} + +/** @jms-builtin */ +class DOMConfiguration { + + /** + * @param name + * @param value + */ + public function setParameter ($name, $value) {} + + /** + * @param name[optional] + */ + public function getParameter ($name) {} + + /** + * @param name[optional] + * @param value[optional] + */ + public function canSetParameter ($name, $value) {} + +} + +/** @jms-builtin */ +class DOMCdataSection extends DOMText { + + /** + * @param value + */ + public function __construct ($value) {} + + /** + * Breaks this node into two nodes at the specified offset + * @link http://www.php.net/manual/en/domtext.splittext.php + * @param offset int

+ * The offset at which to split, starting from 0. + *

+ * @return DOMText The new node of the same type, which contains all the content at and after the + * offset. + */ + public function splitText ($offset) {} + + /** + * Indicates whether this text node contains whitespace + * @link http://www.php.net/manual/en/domtext.iswhitespaceinelementcontent.php + * @return bool Returns true on success or false on failure. + */ + public function isWhitespaceInElementContent () {} + + public function isElementContentWhitespace () {} + + /** + * @param content + */ + public function replaceWholeText ($content) {} + + /** + * Extracts a range of data from the node + * @link http://www.php.net/manual/en/domcharacterdata.substringdata.php + * @param offset int

+ * Start offset of substring to extract. + *

+ * @param count int

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * Append the string to the end of the character data of the node + * @link http://www.php.net/manual/en/domcharacterdata.appenddata.php + * @param data string

+ * The string to append. + *

+ * @return void + */ + public function appendData ($data) {} + + /** + * Insert a string at the specified 16-bit unit offset + * @link http://www.php.net/manual/en/domcharacterdata.insertdata.php + * @param offset int

+ * The character offset at which to insert. + *

+ * @param data string

+ * The string to insert. + *

+ * @return void + */ + public function insertData ($offset, $data) {} + + /** + * Remove a range of characters from the node + * @link http://www.php.net/manual/en/domcharacterdata.deletedata.php + * @param offset int

+ * The offset from which to start removing. + *

+ * @param count int

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void + */ + public function deleteData ($offset, $count) {} + + /** + * Replace a substring within the DOMCharacterData node + * @link http://www.php.net/manual/en/domcharacterdata.replacedata.php + * @param offset int

+ * The offset from which to start replacing. + *

+ * @param count int

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param data string

+ * The string with which the range must be replaced. + *

+ * @return void + */ + public function replaceData ($offset, $count, $data) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode + * @link http://www.php.net/manual/en/class.domdocumenttype.php + * + * @jms-builtin + */ +class DOMDocumentType extends DOMNode { + + /** + * The public identifier of the external subset. + * @var string + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.publicid + */ + public $publicId; + + /** + * The system identifier of the external subset. This may be an + * absolute URI or not. + * @var string + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.systemid + */ + public $systemId; + + /** + * The name of DTD; i.e., the name immediately following the + * DOCTYPE keyword. + * @var string + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.name + */ + public $name; + + /** + * A DOMNamedNodeMap containing the general + * entities, both external and internal, declared in the DTD. + * @var DOMNamedNodeMap + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.entities + */ + public $entities; + + /** + * A DOMNamedNodeMap containing the notations + * declared in the DTD. + * @var DOMNamedNodeMap + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.notations + */ + public $notations; + + /** + * The internal subset as a string, or null if there is none. This is + * does not contain the delimiting square brackets. + * @var string + * @link http://www.php.net/manual/en/class.domdocumenttype.php#domdocumenttype.props.internalsubset + */ + public $internalSubset; + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode + * @link http://www.php.net/manual/en/class.domnotation.php + * + * @jms-builtin + */ +class DOMNotation { + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domnotation.php#domnotation.props.publicid + */ + public $publicId; + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domnotation.php#domnotation.props.systemid + */ + public $systemId; +} + +/** + * Extends DOMNode + * @link http://www.php.net/manual/en/class.domentity.php + * + * @jms-builtin + */ +class DOMEntity extends DOMNode { + + /** + * The public identifier associated with the entity if specified, and + * &null; otherwise. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.publicid + */ + public $publicId; + + /** + * The system identifier associated with the entity if specified, and + * &null; otherwise. This may be an absolute URI or not. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.systemid + */ + public $systemId; + + /** + * For unparsed entities, the name of the notation for the entity. For + * parsed entities, this is &null;. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.notationname + */ + public $notationName; + + /** + * An attribute specifying the encoding used for this entity at the + * time of parsing, when it is an external parsed entity. This is + * &null; if it an entity from the internal subset or if it is not + * known. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.actualencoding + */ + public $actualEncoding; + + /** + * An attribute specifying, as part of the text declaration, the + * encoding of this entity, when it is an external parsed entity. This + * is &null; otherwise. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.encoding + */ + public $encoding; + + /** + * An attribute specifying, as part of the text declaration, the + * version number of this entity, when it is an external parsed + * entity. This is &null; otherwise. + * @var string + * @link http://www.php.net/manual/en/class.domentity.php#domentity.props.version + */ + public $version; + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domentityreference.php + * + * @jms-builtin + */ +class DOMEntityReference extends DOMNode { + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domentityreference.php#domentityreference.props.name + */ + public $name; + + /** + * Creates a new DOMEntityReference object + * @link http://www.php.net/manual/en/domentityreference.construct.php + * @param name + */ + public function __construct ($name) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** + * Extends DOMNode. + * @link http://www.php.net/manual/en/class.domprocessinginstruction.php + * + * @jms-builtin + */ +class DOMProcessingInstruction extends DOMNode { + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domprocessinginstruction.php#domprocessinginstruction.props.target + */ + public $target; + + /** + * Prop description + * @var string + * @link http://www.php.net/manual/en/class.domprocessinginstruction.php#domprocessinginstruction.props.data + */ + public $data; + + /** + * Creates a new DOMProcessingInstruction object + * @link http://www.php.net/manual/en/domprocessinginstruction.construct.php + * @param name + * @param value[optional] + */ + public function __construct ($name, $value) {} + + /** + * Adds a new child before a reference node + * @link http://www.php.net/manual/en/domnode.insertbefore.php + * @param newnode DOMNode

+ * The new node. + *

+ * @param refnode DOMNode[optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * Replaces a child + * @link http://www.php.net/manual/en/domnode.replacechild.php + * @param newnode DOMNode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param oldnode DOMNode

+ * The old node. + *

+ * @return DOMNode The old node or false if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * Removes child from list of children + * @link http://www.php.net/manual/en/domnode.removechild.php + * @param oldnode DOMNode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the functions returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * Adds new child at the end of the children + * @link http://www.php.net/manual/en/domnode.appendchild.php + * @param newnode DOMNode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * Checks if node has children + * @link http://www.php.net/manual/en/domnode.haschildnodes.php + * @return bool Returns true on success or false on failure. + */ + public function hasChildNodes () {} + + /** + * Clones a node + * @link http://www.php.net/manual/en/domnode.clonenode.php + * @param deep bool[optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to false. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * Normalizes the node + * @link http://www.php.net/manual/en/domnode.normalize.php + * @return void + */ + public function normalize () {} + + /** + * Checks if feature is supported for specified version + * @link http://www.php.net/manual/en/domnode.issupported.php + * @param feature string

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param version string

+ * The version number of the feature to test. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * Checks if node has attributes + * @link http://www.php.net/manual/en/domnode.hasattributes.php + * @return bool Returns true on success or false on failure. + */ + public function hasAttributes () {} + + /** + * @param other DOMNode + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * Indicates if two nodes are the same node + * @link http://www.php.net/manual/en/domnode.issamenode.php + * @param node DOMNode

+ * The compared node. + *

+ * @return bool Returns true on success or false on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * Gets the namespace prefix of the node based on the namespace URI + * @link http://www.php.net/manual/en/domnode.lookupprefix.php + * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * Checks if the specified namespaceURI is the default namespace or not + * @link http://www.php.net/manual/en/domnode.isdefaultnamespace.php + * @param namespaceURI string

+ * The namespace URI to look for. + *

+ * @return bool Return true if namespaceURI is the default + * namespace, false otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * Gets the namespace URI of the node based on the prefix + * @link http://www.php.net/manual/en/domnode.lookupnamespaceuri.php + * @param prefix string

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param arg DOMNode + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param feature + * @param version + */ + public function getFeature ($feature, $version) {} + + /** + * @param key + * @param data + * @param handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param key + */ + public function getUserData ($key) {} + + public function getNodePath () {} + + /** + * Get line number for a node + * @link http://www.php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14N ($exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + + /** + * @param uri + * @param exclusive[optional] + * @param with_comments[optional] + * @param xpath[optional] + * @param ns_prefixes[optional] + */ + public function C14NFile ($uri, $exclusive, $with_commentsarray , $xpath = nullarray , $ns_prefixes = null) {} + +} + +/** @jms-builtin */ +class DOMStringExtend { + + /** + * @param offset32 + */ + public function findOffset16 ($offset32) {} + + /** + * @param offset16 + */ + public function findOffset32 ($offset16) {} + +} + +/** + * @link http://www.php.net/manual/en/class.domxpath.php + * + * @jms-builtin + */ +class DOMXPath { + + /** + * Prop description + * @var DOMDocument + * @link http://www.php.net/manual/en/class.domxpath.php#domxpath.props.document + */ + public $document; + + /** + * Creates a new DOMXPath object + * @link http://www.php.net/manual/en/domxpath.construct.php + * @param doc DOMDocument + */ + public function __construct (DOMDocument $doc) {} + + /** + * Registers the namespace with the DOMXPath object + * @link http://www.php.net/manual/en/domxpath.registernamespace.php + * @param prefix string

+ * The prefix. + *

+ * @param namespaceURI string

+ * The URI of the namespace. + *

+ * @return bool Returns true on success or false on failure. + */ + public function registerNamespace ($prefix, $namespaceURI) {} + + /** + * Evaluates the given XPath expression + * @link http://www.php.net/manual/en/domxpath.query.php + * @param expression string

+ * The XPath expression to execute. + *

+ * @param contextnode DOMNode[optional]

+ * The optional contextnode can be specified for + * doing relative XPath queries. By default, the queries are relative to + * the root element. + *

+ * @return DOMNodeList a DOMNodeList containing all nodes matching + * the given XPath expression. Any expression which do + * not return nodes will return an empty DOMNodeList. + */ + public function query ($expression, DOMNode $contextnode = null) {} + + /** + * Evaluates the given XPath expression and returns a typed result if possible. + * @link http://www.php.net/manual/en/domxpath.evaluate.php + * @param expression string

+ * The XPath expression to execute. + *

+ * @param contextnode DOMNode[optional]

+ * The optional contextnode can be specified for + * doing relative XPath queries. By default, the queries are relative to + * the root element. + *

+ * @return mixed a typed result if possible or a DOMNodeList + * containing all nodes matching the given XPath expression. + */ + public function evaluate ($expression, DOMNode $contextnode = null) {} + + /** + * Register PHP functions as XPath functions + * @link http://www.php.net/manual/en/domxpath.registerphpfunctions.php + * @param restrict mixed[optional]

+ * Use this parameter to only allow certain functions to be called from XPath. + *

+ *

+ * This parameter can be either a string (a function name) or + * an array of function names. + *

+ * @return void + */ + public function registerPhpFunctions ($restrict = null) {} + +} + +/** + * Gets a DOMElement object from a + SimpleXMLElement object + * @link http://www.php.net/manual/en/function.dom-import-simplexml.php + * @param node SimpleXMLElement

+ * The SimpleXMLElement node. + *

+ * @return DOMElement The DOMElement node added or false if any errors occur. + * + * @jms-builtin + */ +function dom_import_simplexml (SimpleXMLElement $node) {} + + +/** + * Node is an element + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_ELEMENT_NODE', 1); + +/** + * Node is an attribute + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_ATTRIBUTE_NODE', 2); + +/** + * Node is a piece of text + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_TEXT_NODE', 3); +define ('XML_CDATA_SECTION_NODE', 4); +define ('XML_ENTITY_REF_NODE', 5); + +/** + * Node is an entity like &nbsp; + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_ENTITY_NODE', 6); + +/** + * Node is a processing instruction + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_PI_NODE', 7); + +/** + * Node is a comment + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_COMMENT_NODE', 8); + +/** + * Node is a document + * @link http://www.php.net/manual/en/domxml.constants.php + */ +define ('XML_DOCUMENT_NODE', 9); +define ('XML_DOCUMENT_TYPE_NODE', 10); +define ('XML_DOCUMENT_FRAG_NODE', 11); +define ('XML_NOTATION_NODE', 12); +define ('XML_HTML_DOCUMENT_NODE', 13); +define ('XML_DTD_NODE', 14); +define ('XML_ELEMENT_DECL_NODE', 15); +define ('XML_ATTRIBUTE_DECL_NODE', 16); +define ('XML_ENTITY_DECL_NODE', 17); +define ('XML_NAMESPACE_DECL_NODE', 18); +define ('XML_LOCAL_NAMESPACE', 18); +define ('XML_ATTRIBUTE_CDATA', 1); +define ('XML_ATTRIBUTE_ID', 2); +define ('XML_ATTRIBUTE_IDREF', 3); +define ('XML_ATTRIBUTE_IDREFS', 4); +define ('XML_ATTRIBUTE_ENTITY', 6); +define ('XML_ATTRIBUTE_NMTOKEN', 7); +define ('XML_ATTRIBUTE_NMTOKENS', 8); +define ('XML_ATTRIBUTE_ENUMERATION', 9); +define ('XML_ATTRIBUTE_NOTATION', 10); + +/** + * Error code not part of the DOM specification. Meant for PHP errors. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_PHP_ERR', 0); + +/** + * If index or size is negative, or greater than the allowed value. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INDEX_SIZE_ERR', 1); + +/** + * If the specified range of text does not fit into a + * DOMString. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOMSTRING_SIZE_ERR', 2); + +/** + * If any node is inserted somewhere it doesn't belong + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_HIERARCHY_REQUEST_ERR', 3); + +/** + * If a node is used in a different document than the one that created it. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_WRONG_DOCUMENT_ERR', 4); + +/** + * If an invalid or illegal character is specified, such as in a name. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_CHARACTER_ERR', 5); + +/** + * If data is specified for a node which does not support data. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_NO_DATA_ALLOWED_ERR', 6); + +/** + * If an attempt is made to modify an object where modifications are not allowed. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_NO_MODIFICATION_ALLOWED_ERR', 7); + +/** + * If an attempt is made to reference a node in a context where it does not exist. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_NOT_FOUND_ERR', 8); + +/** + * If the implementation does not support the requested type of object or operation. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_NOT_SUPPORTED_ERR', 9); + +/** + * If an attempt is made to add an attribute that is already in use elsewhere. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INUSE_ATTRIBUTE_ERR', 10); + +/** + * If an attempt is made to use an object that is not, or is no longer, usable. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_STATE_ERR', 11); + +/** + * If an invalid or illegal string is specified. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_SYNTAX_ERR', 12); + +/** + * If an attempt is made to modify the type of the underlying object. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_MODIFICATION_ERR', 13); + +/** + * If an attempt is made to create or change an object in a way which is + * incorrect with regard to namespaces. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_NAMESPACE_ERR', 14); + +/** + * If a parameter or an operation is not supported by the underlying object. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_ACCESS_ERR', 15); + +/** + * If a call to a method such as insertBefore or removeChild would make the Node + * invalid with respect to "partial validity", this exception would be raised and + * the operation would not be done. + * @link http://www.php.net/manual/en/dom.constants.php + */ +define ('DOM_VALIDATION_ERR', 16); + +// End of dom v.20031129 +?> diff --git a/res/php-5.3-core-api/ereg.php b/res/php-5.3-core-api/ereg.php new file mode 100644 index 0000000..aa3712c --- /dev/null +++ b/res/php-5.3-core-api/ereg.php @@ -0,0 +1,230 @@ + + * Case sensitive regular expression. + *

+ * @param string string

+ * The input string. + *

+ * @param regs array[optional]

+ * If matches are found for parenthesized substrings of + * pattern and the function is called with the + * third argument regs, the matches will be stored + * in the elements of the array regs. + *

+ *

+ * $regs[1] will contain the substring which starts at + * the first left parenthesis; $regs[2] will contain + * the substring starting at the second, and so on. + * $regs[0] will contain a copy of the complete string + * matched. + *

+ * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use preg_match() instead). + * @return int the length of the matched string if a match for + * pattern was found in string, + * or false if no matches were found or an error occurred. + *

+ *

+ * If the optional parameter regs was not passed or + * the length of the matched string is 0, this function returns 1. + * + * @jms-builtin + */ +function ereg ($pattern, $string, array &$regs = null) {} + +/** + * Replace regular expression + * @link http://www.php.net/manual/en/function.ereg-replace.php + * @param pattern string

+ * A POSIX extended regular expression. + *

+ * @param replacement string

+ * If pattern contains parenthesized substrings, + * replacement may contain substrings of the form + * \\digit, which will be + * replaced by the text matching the digit'th parenthesized substring; + * \\0 will produce the entire contents of string. + * Up to nine substrings may be used. Parentheses may be nested, in which + * case they are counted by the opening parenthesis. + *

+ * @param string string

+ * The input string. + *

+ * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use preg_replace() instead). + * @return string The modified string is returned. If no matches are found in + * string, then it will be returned unchanged. + * + * @jms-builtin + */ +function ereg_replace ($pattern, $replacement, $string) {} + +/** + * Case insensitive regular expression match + * @link http://www.php.net/manual/en/function.eregi.php + * @param pattern string

+ * Case insensitive regular expression. + *

+ * @param string string

+ * The input string. + *

+ * @param regs array[optional]

+ * If matches are found for parenthesized substrings of + * pattern and the function is called with the + * third argument regs, the matches will be stored + * in the elements of the array regs. + *

+ *

+ * $regs[1] will contain the substring which starts at the first left + * parenthesis; $regs[2] will contain the substring starting at the + * second, and so on. $regs[0] will contain a copy of the complete string + * matched. + *

+ * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use preg_match() with the 'i' modifier instead). + * @return int the length of the matched string if a match for + * pattern was found in string, + * or false if no matches were found or an error occurred. + *

+ *

+ * If the optional parameter regs was not passed or + * the length of the matched string is 0, this function returns 1. + * + * @jms-builtin + */ +function eregi ($pattern, $string, array &$regs = null) {} + +/** + * Replace regular expression case insensitive + * @link http://www.php.net/manual/en/function.eregi-replace.php + * @param pattern string

+ * A POSIX extended regular expression. + *

+ * @param replacement string

+ * If pattern contains parenthesized substrings, + * replacement may contain substrings of the form + * \\digit, which will be + * replaced by the text matching the digit'th parenthesized substring; + * \\0 will produce the entire contents of string. + * Up to nine substrings may be used. Parentheses may be nested, in which + * case they are counted by the opening parenthesis. + *

+ * @param string string

+ * The input string. + *

+ * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use preg_replace() with the 'i' modifier instead). + * @return string The modified string is returned. If no matches are found in + * string, then it will be returned unchanged. + * + * @jms-builtin + */ +function eregi_replace ($pattern, $replacement, $string) {} + +/** + * Split string into array by regular expression + * @link http://www.php.net/manual/en/function.split.php + * @param pattern string

+ * Case sensitive regular expression. + *

+ *

+ * If you want to split on any of the characters which are considered + * special by regular expressions, you'll need to escape them first. If + * you think split (or any other regex function, for + * that matter) is doing something weird, please read the file + * regex.7, included in the + * regex/ subdirectory of the PHP distribution. It's + * in manpage format, so you'll want to do something along the lines of + * man /usr/local/src/regex/regex.7 in order to read it. + *

+ * @param string string

+ * The input string. + *

+ * @param limit int[optional]

+ * If limit is set, the returned array will + * contain a maximum of limit elements with the + * last element containing the whole rest of + * string. + *

+ * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use preg_split() instead). + * @return array an array of strings, each of which is a substring of + * string formed by splitting it on boundaries formed + * by the case-sensitive regular expression pattern. + *

+ *

+ * If there are n occurrences of + * pattern, the returned array will contain + * n+1 items. For example, if + * there is no occurrence of pattern, an array with + * only one element will be returned. Of course, this is also true if + * string is empty. If an error occurs, + * split returns false. + * + * @jms-builtin + */ +function split ($pattern, $string, $limit = null) {} + +/** + * Split string into array by regular expression case insensitive + * @link http://www.php.net/manual/en/function.spliti.php + * @param pattern string

+ * Case insensitive regular expression. + *

+ *

+ * If you want to split on any of the characters which are considered + * special by regular expressions, you'll need to escape them first. If + * you think spliti (or any other regex function, for + * that matter) is doing something weird, please read the file + * regex.7, included in the + * regex/ subdirectory of the PHP distribution. It's + * in manpage format, so you'll want to do something along the lines of + * man /usr/local/src/regex/regex.7 in order to read it. + *

+ * @param string string

+ * The input string. + *

+ * @param limit int[optional]

+ * If limit is set, the returned array will + * contain a maximum of limit elements with the + * last element containing the whole rest of + * string. + *

+ * @deprecated Deprecated as of PHP 5.3.0 (use preg_split() with the 'i' modifier instead). + * @return array an array of strings, each of which is a substring of + * string formed by splitting it on boundaries formed + * by the case insensitive regular expression pattern. + *

+ *

+ * If there are n occurrences of + * pattern, the returned array will contain + * n+1 items. For example, if + * there is no occurrence of pattern, an array with + * only one element will be returned. Of course, this is also true if + * string is empty. If an error occurs, + * spliti returns false. + * + * @jms-builtin + */ +function spliti ($pattern, $string, $limit = null) {} + +/** + * Make regular expression for case insensitive match + * @link http://www.php.net/manual/en/function.sql-regcase.php + * @param string string

+ * The input string. + *

+ * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged. + * @return string a valid regular expression which will match + * string, ignoring case. This expression is + * string with each alphabetic character converted to + * a bracket expression; this bracket expression contains that character's + * uppercase and lowercase form. Other characters remain unchanged. + * + * @jms-builtin + */ +function sql_regcase ($string) {} + +// End of ereg v. +?> diff --git a/res/php-5.3-core-api/exif.php b/res/php-5.3-core-api/exif.php new file mode 100644 index 0000000..5b00822 --- /dev/null +++ b/res/php-5.3-core-api/exif.php @@ -0,0 +1,147 @@ +EXIF headers from JPEG or TIFF + * @link http://www.php.net/manual/en/function.exif-read-data.php + * @param filename string

+ * The name of the image file being read. This cannot be an + * URL. + *

+ * @param sections string[optional]

+ * Is a comma separated list of sections that need to be present in file + * to produce a result array. If none of the requested + * sections could be found the return value is false. + * + * FILE + * FileName, FileSize, FileDateTime, SectionsFound + * + * + * COMPUTED + * + * html, Width, Height, IsColor, and more if available. Height and + * Width are computed the same way getimagesize + * does so their values must not be part of any header returned. + * Also, html is a height/width text string to be used inside normal + * HTML. + * + * + * + * ANY_TAG + * Any information that has a Tag e.g. IFD0, EXIF, ... + * + * + * IFD0 + * + * All tagged data of IFD0. In normal imagefiles this contains + * image size and so forth. + * + * + * + * THUMBNAIL + * + * A file is supposed to contain a thumbnail if it has a second IFD. + * All tagged information about the embedded thumbnail is stored in + * this section. + * + * + * + * COMMENT + * Comment headers of JPEG images. + * + * + * EXIF + * + * The EXIF section is a sub section of IFD0. It contains + * more detailed information about an image. Most of these entries + * are digital camera related. + * + * + *

+ * @param arrays bool[optional]

+ * Specifies whether or not each section becomes an array. The + * sections COMPUTED, + * THUMBNAIL, and COMMENT + * always become arrays as they may contain values whose names conflict + * with other sections. + *

+ * @param thumbnail bool[optional]

+ * When set to true the thumbnail itself is read. Otherwise, only the + * tagged data is read. + *

+ * @return array It returns an associative array where the array indexes are + * the header names and the array values are the values associated with + * those headers. If no data can be returned, + * exif_read_data will return false. + * + * @jms-builtin + */ +function exif_read_data ($filename, $sections = null, $arrays = null, $thumbnail = null) {} + +/** + * &Alias; exif_read_data + * @link http://www.php.net/manual/en/function.read-exif-data.php + * @param filename + * @param sections_needed[optional] + * @param sub_arrays[optional] + * @param read_thumbnail[optional] + * + * @jms-builtin + */ +function read_exif_data ($filename, $sections_needed, $sub_arrays, $read_thumbnail) {} + +/** + * Get the header name for an index + * @link http://www.php.net/manual/en/function.exif-tagname.php + * @param index int

+ * The image index + *

+ * @return string the header name, or false if index is + * undefined. + * + * @jms-builtin + */ +function exif_tagname ($index) {} + +/** + * Retrieve the embedded thumbnail of a TIFF or JPEG image + * @link http://www.php.net/manual/en/function.exif-thumbnail.php + * @param filename string

+ * The name of the image file being read. This image contains an + * embedded thumbnail. + *

+ * @param width int[optional]

+ * The return width of the returned thumbnail. + *

+ * @param height int[optional]

+ * The returned height of the returned thumbnail. + *

+ * @param imagetype int[optional]

+ * The returned image type of the returned thumbnail. This is either + * TIFF or JPEG. + *

+ * @return string the embedded thumbnail, or false if the image contains no + * thumbnail. + * + * @jms-builtin + */ +function exif_thumbnail ($filename, &$width = null, &$height = null, &$imagetype = null) {} + +/** + * Determine the type of an image + * @link http://www.php.net/manual/en/function.exif-imagetype.php + * @param filename string The image being checked. + * @return int When a correct signature is found, the appropriate constant value will be + * returned otherwise the return value is false. The return value is the + * same value that getimagesize returns in index 2 but + * exif_imagetype is much faster. + * + * @jms-builtin + */ +function exif_imagetype ($filename) {} + +define ('EXIF_USE_MBSTRING', 0); + +// End of exif v.1.4 $Id: exif.php,v 1.4 2010/08/10 01:43:36 qiwang Exp $ +?> diff --git a/res/php-5.3-core-api/fileinfo.php b/res/php-5.3-core-api/fileinfo.php new file mode 100644 index 0000000..1f94e1a --- /dev/null +++ b/res/php-5.3-core-api/fileinfo.php @@ -0,0 +1,194 @@ + + * One or disjunction of more Fileinfo + * constants. + *

+ * @param magic_file string[optional]

+ * Name of a magic database file, usually something like + * /path/to/magic.mime. If not specified, + * the MAGIC environment variable is used. If this variable + * is not set either, /usr/share/misc/magic is used by default. + * A .mime and/or .mgc suffix is added if + * needed. + *

+ *

+ * Passing NULL or an empty string will be equivalent to the default value. + *

+ * + * @jms-builtin + */ +function finfo_open ($options = null, $magic_file = null) {} + +/** + * Close fileinfo resource + * @link http://www.php.net/manual/en/function.finfo-close.php + * @param finfo resource

+ * Fileinfo resource returned by finfo_open. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function finfo_close ($finfo) {} + +/** + * Set libmagic configuration options + * @link http://www.php.net/manual/en/function.finfo-set-flags.php + * @param options int

+ * One or disjunction of more Fileinfo + * constants. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function finfo_set_flags ($options) {} + +/** + * Return information about a file + * @link http://www.php.net/manual/en/function.finfo-file.php + * @param file_name string

+ * Name of a file to be checked. + *

+ * @param options int[optional]

+ * One or disjunction of more Fileinfo + * constants. + *

+ * @param context resource[optional]

+ * For a description of contexts, refer to . + *

+ * @return string a textual description of the contents of the + * filename argument, or false if an error occurred. + * + * @jms-builtin + */ +function finfo_file ($file_name, $options = null, $context = null) {} + +/** + * Return information about a string buffer + * @link http://www.php.net/manual/en/function.finfo-buffer.php + * @param string string

+ * Content of a file to be checked. + *

+ * @param options int[optional]

+ * One or disjunction of more Fileinfo + * constants. + *

+ * @param context resource[optional]

+ *

+ * @return string a textual description of the string + * argument, or false if an error occurred. + * + * @jms-builtin + */ +function finfo_buffer ($string, $options = null, $context = null) {} + +/** + * Detect MIME Content-type for a file (deprecated) + * @link http://www.php.net/manual/en/function.mime-content-type.php + * @param filename string

+ * Path to the tested file. + *

+ * @return string the content type in MIME format, like + * text/plain or application/octet-stream. + * + * @jms-builtin + */ +function mime_content_type ($filename) {} + + +/** + * No special handling. + * @link http://www.php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_NONE', 0); + +/** + * Follow symlinks. + * @link http://www.php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_SYMLINK', 2); + +/** + * Return the mime type and mime encoding as defined by RFC 2045. + * @link http://www.php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_MIME', 1040); + +/** + * Return the mime type. + * Available since PHP 5.3.0. + * @link http://www.php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_MIME_TYPE', 16); + +/** + * Return the mime encoding of the file. + * Available since PHP 5.3.0. + * @link http://www.php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_MIME_ENCODING', 1024); + +/** + * Look at the contents of blocks or character special devices. + * @link http://www.php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_DEVICES', 8); + +/** + * Return all matches, not just the first. + * @link http://www.php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_CONTINUE', 32); + +/** + * If possible preserve the original access time. + * @link http://www.php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_PRESERVE_ATIME', 128); + +/** + * Don't translate unprintable characters to a \ooo octal + * representation. + * @link http://www.php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_RAW', 256); + +// End of fileinfo v.1.0.5-dev +?> diff --git a/res/php-5.3-core-api/filter.php b/res/php-5.3-core-api/filter.php new file mode 100644 index 0000000..41832e6 --- /dev/null +++ b/res/php-5.3-core-api/filter.php @@ -0,0 +1,497 @@ + + * One of INPUT_GET, INPUT_POST, + * INPUT_COOKIE, INPUT_SERVER, + * INPUT_ENV, INPUT_SESSION (not + * implemented yet) or INPUT_REQUEST (not + * implemented yet). + *

+ * @param variable_name string

+ * Name of a variable to get. + *

+ * @param filter int[optional]

+ * Filter to apply. + *

+ * @param options mixed[optional]

+ * Associative array of options or bitwise disjunction of flags. If filter + * accepts options, flags can be provided in "flags" field of array. + *

+ * @return mixed Value of the requested variable on success, false if the filter fails, + * or &null; if the variable_name variable is not set. + * If the flag FILTER_NULL_ON_FAILURE is used, it + * returns false if the variable is not set and &null; if the filter fails. + * + * @jms-builtin + */ +function filter_input ($type, $variable_name, $filter = null, $options = null) {} + +/** + * Filters a variable with a specified filter + * @link http://www.php.net/manual/en/function.filter-var.php + * @param variable mixed

+ * Value to filter. + *

+ * @param filter int[optional]

+ * ID of a filter to use (see the manual page). + *

+ * @param options mixed[optional]

+ * Associative array of options or bitwise disjunction of flags. If filter + * accepts options, flags can be provided in "flags" field of array. For + * the "callback" filter, callback type should be passed. The + * callback must accept one argument, the value to be filtered, and return + * the value after filtering/sanitizing it. + *

+ *

+ * array( + * 'default' => 3, // value to return if the filter fails + * // other options here + * 'min_range' => 0 + * ), + * 'flags' => FILTER_FLAG_ALLOW_OCTAL, + * ); + * $var = filter_var('0755', FILTER_VALIDATE_INT, $options); + * // for filter that only accept flags, you can pass them directly + * $var = filter_var('oops', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + * // for filter that only accept flags, you can also pass as an array + * $var = filter_var('oops', FILTER_VALIDATE_BOOLEAN, + * array('flags' => FILTER_NULL_ON_FAILURE)); + * // callback filter + * function foo($value) + * { + * $ret = new stdClass; + * $ret->value = filter_var($value, FILTER_VALIDATE_BOOLEAN, + * array('flags' => FILTER_NULL_ON_FAILURE)); + * return $ret; + * } + * $var = filter_var('yes', FILTER_CALLBACK, array('options' => 'foo')); + * ?> + * ]]> + *

+ * @return mixed the filtered data, or false if the filter fails. + * + * @jms-builtin + */ +function filter_var ($variable, $filter = null, $options = null) {} + +/** + * Gets external variables and optionally filters them + * @link http://www.php.net/manual/en/function.filter-input-array.php + * @param type int

+ * One of INPUT_GET, INPUT_POST, + * INPUT_COOKIE, INPUT_SERVER, + * INPUT_ENV, INPUT_SESSION (not implemented yet), or + * INPUT_REQUEST (not implemented yet). + *

+ * @param definition mixed[optional]

+ * An array defining the arguments. A valid key is a string + * containing a variable name and a valid value is either a filter type, + * or an array optionally specifying the filter, flags and + * options. If the value is an array, valid keys are + * filter which specifies the filter type, + * flags which specifies any flags that apply to the + * filter, and options which specifies any options + * that apply to the filter. See the example below for a better + * understanding. + *

+ *

+ * This parameter can be also an integer holding a filter constant. Then all values in the + * input array are filtered by this filter. + *

+ * @return mixed An array containing the values of the requested variables on success, or false + * on failure. An array value will be false if the filter fails, or &null; if + * the variable is not set. Or if the flag FILTER_NULL_ON_FAILURE + * is used, it returns false if the variable is not set and &null; if the filter + * fails. + * + * @jms-builtin + */ +function filter_input_array ($type, $definition = null) {} + +/** + * Gets multiple variables and optionally filters them + * @link http://www.php.net/manual/en/function.filter-var-array.php + * @param data array

+ * An array with string keys containing the data to filter. + *

+ * @param definition mixed[optional]

+ * An array defining the arguments. A valid key is a string + * containing a variable name and a valid value is either a filter type, + * or an array optionally specifying the filter, flags and + * options. If the value is an array, valid keys are + * filter which specifies the filter type, + * flags which specifies any flags that apply to the + * filter, and options which specifies any options + * that apply to the filter. See the example below for a better + * understanding. + *

+ *

+ * This parameter can be also an integer holding a filter constant. Then all values in the + * input array are filtered by this filter. + *

+ * @return mixed An array containing the values of the requested variables on success, or false + * on failure. An array value will be false if the filter fails, or &null; if + * the variable is not set. + * + * @jms-builtin + */ +function filter_var_array (array $data, $definition = null) {} + +/** + * Returns a list of all supported filters + * @link http://www.php.net/manual/en/function.filter-list.php + * @return array an array of names of all supported filters, empty array if there + * are no such filters. Indexes of this array are not filter IDs, they can be + * obtained with filter_id from a name instead. + * + * @jms-builtin + */ +function filter_list () {} + +/** + * Checks if variable of specified type exists + * @link http://www.php.net/manual/en/function.filter-has-var.php + * @param type int

+ * One of INPUT_GET, INPUT_POST, + * INPUT_COOKIE, INPUT_SERVER, + * INPUT_ENV. + *

+ * @param variable_name string

+ * Name of a variable to check. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function filter_has_var ($type, $variable_name) {} + +/** + * Returns the filter ID belonging to a named filter + * @link http://www.php.net/manual/en/function.filter-id.php + * @param filtername string

+ * Name of a filter to get. + *

+ * @return int ID of a filter on success or &null; if filter doesn't exist. + * + * @jms-builtin + */ +function filter_id ($filtername) {} + + +/** + * POST variables. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_POST', 0); + +/** + * GET variables. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_GET', 1); + +/** + * COOKIE variables. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_COOKIE', 2); + +/** + * ENV variables. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_ENV', 4); + +/** + * SERVER variables. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_SERVER', 5); + +/** + * SESSION variables. + * (not implemented yet) + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_SESSION', 6); + +/** + * REQUEST variables. + * (not implemented yet) + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('INPUT_REQUEST', 99); + +/** + * No flags. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NONE', 0); + +/** + * Flag used to require scalar as input + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_REQUIRE_SCALAR', 33554432); + +/** + * Require an array as input. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_REQUIRE_ARRAY', 16777216); + +/** + * Always returns an array. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FORCE_ARRAY', 67108864); + +/** + * Use NULL instead of FALSE on failure. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_NULL_ON_FAILURE', 134217728); + +/** + * ID of "int" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_INT', 257); + +/** + * ID of "boolean" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_BOOLEAN', 258); + +/** + * ID of "float" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_FLOAT', 259); + +/** + * ID of "validate_regexp" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_REGEXP', 272); + +/** + * ID of "validate_url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_URL', 273); + +/** + * ID of "validate_email" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_EMAIL', 274); + +/** + * ID of "validate_ip" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_IP', 275); + +/** + * ID of default ("string") filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_DEFAULT', 516); + +/** + * ID of "unsafe_raw" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_UNSAFE_RAW', 516); + +/** + * ID of "string" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_STRING', 513); + +/** + * ID of "stripped" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_STRIPPED', 513); + +/** + * ID of "encoded" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_ENCODED', 514); + +/** + * ID of "special_chars" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_SPECIAL_CHARS', 515); + +/** + * ID of "email" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_EMAIL', 517); + +/** + * ID of "url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_URL', 518); + +/** + * ID of "number_int" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_NUMBER_INT', 519); + +/** + * ID of "number_float" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_NUMBER_FLOAT', 520); + +/** + * ID of "magic_quotes" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_MAGIC_QUOTES', 521); + +/** + * ID of "callback" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_CALLBACK', 1024); + +/** + * Allow octal notation (0[0-7]+) in "int" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_OCTAL', 1); + +/** + * Allow hex notation (0x[0-9a-fA-F]+) in "int" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_HEX', 2); + +/** + * Strip characters with ASCII value less than 32. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_STRIP_LOW', 4); + +/** + * Strip characters with ASCII value greater than 127. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_STRIP_HIGH', 8); +define ('FILTER_FLAG_STRIP_BACKTICK', 512); + +/** + * Encode characters with ASCII value less than 32. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ENCODE_LOW', 16); + +/** + * Encode characters with ASCII value greater than 127. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ENCODE_HIGH', 32); + +/** + * Encode &. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ENCODE_AMP', 64); + +/** + * Don't encode ' and ". + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NO_ENCODE_QUOTES', 128); + +/** + * (No use for now.) + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_EMPTY_STRING_NULL', 256); + +/** + * Allow fractional part in "number_float" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_FRACTION', 4096); + +/** + * Allow thousand separator (,) in "number_float" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_THOUSAND', 8192); + +/** + * Allow scientific notation (e, E) in + * "number_float" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_SCIENTIFIC', 16384); + +/** + * Require scheme in "validate_url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_SCHEME_REQUIRED', 65536); + +/** + * Require host in "validate_url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_HOST_REQUIRED', 131072); + +/** + * Require path in "validate_url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_PATH_REQUIRED', 262144); + +/** + * Require query in "validate_url" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_QUERY_REQUIRED', 524288); + +/** + * Allow only IPv4 address in "validate_ip" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_IPV4', 1048576); + +/** + * Allow only IPv6 address in "validate_ip" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_IPV6', 2097152); + +/** + * Deny reserved addresses in "validate_ip" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NO_RES_RANGE', 4194304); + +/** + * Deny private addresses in "validate_ip" filter. + * @link http://www.php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NO_PRIV_RANGE', 8388608); + +// End of filter v.0.11.0 +?> diff --git a/res/php-5.3-core-api/ftp.php b/res/php-5.3-core-api/ftp.php new file mode 100644 index 0000000..91edef9 --- /dev/null +++ b/res/php-5.3-core-api/ftp.php @@ -0,0 +1,732 @@ + + * The FTP server address. This parameter shouldn't have any trailing + * slashes and shouldn't be prefixed with ftp://. + *

+ * @param port int[optional]

+ * This parameter specifies an alternate port to connect to. If it is + * omitted or set to zero, then the default FTP port, 21, will be used. + *

+ * @param timeout int[optional]

+ * This parameter specifies the timeout for all subsequent network operations. + * If omitted, the default value is 90 seconds. The timeout can be changed and + * queried at any time with ftp_set_option and + * ftp_get_option. + *

+ * @return resource a FTP stream on success or false on error. + * + * @jms-builtin + */ +function ftp_connect ($host, $port = null, $timeout = null) {} + +/** + * Opens an Secure SSL-FTP connection + * @link http://www.php.net/manual/en/function.ftp-ssl-connect.php + * @param host string

+ * The FTP server address. This parameter shouldn't have any trailing + * slashes and shouldn't be prefixed with ftp://. + *

+ * @param port int[optional]

+ * This parameter specifies an alternate port to connect to. If it is + * omitted or set to zero, then the default FTP port, 21, will be used. + *

+ * @param timeout int[optional]

+ * This parameter specifies the timeout for all subsequent network operations. + * If omitted, the default value is 90 seconds. The timeout can be changed and + * queried at any time with ftp_set_option and + * ftp_get_option. + *

+ * @return resource a SSL-FTP stream on success or false on error. + * + * @jms-builtin + */ +function ftp_ssl_connect ($host, $port = null, $timeout = null) {} + +/** + * Logs in to an FTP connection + * @link http://www.php.net/manual/en/function.ftp-login.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param username string

+ * The username (USER). + *

+ * @param password string

+ * The password (PASS). + *

+ * @return bool Returns true on success or false on failure. + * If login fails, PHP will also throw a warning. + * + * @jms-builtin + */ +function ftp_login ($ftp_stream, $username, $password) {} + +/** + * Returns the current directory name + * @link http://www.php.net/manual/en/function.ftp-pwd.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @return string the current directory name or false on error. + * + * @jms-builtin + */ +function ftp_pwd ($ftp_stream) {} + +/** + * Changes to the parent directory + * @link http://www.php.net/manual/en/function.ftp-cdup.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_cdup ($ftp_stream) {} + +/** + * Changes the current directory on a FTP server + * @link http://www.php.net/manual/en/function.ftp-chdir.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param directory string

+ * The target directory. + *

+ * @return bool Returns true on success or false on failure. + * If changing directory fails, PHP will also throw a warning. + * + * @jms-builtin + */ +function ftp_chdir ($ftp_stream, $directory) {} + +/** + * Requests execution of a command on the FTP server + * @link http://www.php.net/manual/en/function.ftp-exec.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param command string

+ * The command to execute. + *

+ * @return bool true if the command was successful (server sent response code: + * 200); otherwise returns false. + * + * @jms-builtin + */ +function ftp_exec ($ftp_stream, $command) {} + +/** + * Sends an arbitrary command to an FTP server + * @link http://www.php.net/manual/en/function.ftp-raw.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param command string

+ * The command to execute. + *

+ * @return array the server's response as an array of strings. + * No parsing is performed on the response string, nor does + * ftp_raw determine if the command succeeded. + * + * @jms-builtin + */ +function ftp_raw ($ftp_stream, $command) {} + +/** + * Creates a directory + * @link http://www.php.net/manual/en/function.ftp-mkdir.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param directory string

+ * The name of the directory that will be created. + *

+ * @return string the newly created directory name on success or false on error. + * + * @jms-builtin + */ +function ftp_mkdir ($ftp_stream, $directory) {} + +/** + * Removes a directory + * @link http://www.php.net/manual/en/function.ftp-rmdir.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param directory string

+ * The directory to delete. This must be either an absolute or relative + * path to an empty directory. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_rmdir ($ftp_stream, $directory) {} + +/** + * Set permissions on a file via FTP + * @link http://www.php.net/manual/en/function.ftp-chmod.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param mode int

+ * The new permissions, given as an octal value. + *

+ * @param filename string

+ * The remote file. + *

+ * @return int the new file permissions on success or false on error. + * + * @jms-builtin + */ +function ftp_chmod ($ftp_stream, $mode, $filename) {} + +/** + * Allocates space for a file to be uploaded + * @link http://www.php.net/manual/en/function.ftp-alloc.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param filesize int

+ * The number of bytes to allocate. + *

+ * @param result string[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_alloc ($ftp_stream, $filesize, &$result = null) {} + +/** + * Returns a list of files in the given directory + * @link http://www.php.net/manual/en/function.ftp-nlist.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param directory string

+ * The directory to be listed. This parameter can also include arguments, eg. + * ftp_nlist($conn_id, "-la /your/dir"); + * Note that this parameter isn't escaped so there may be some issues with + * filenames containing spaces and other characters. + *

+ * @return array an array of filenames from the specified directory on success or + * false on error. + * + * @jms-builtin + */ +function ftp_nlist ($ftp_stream, $directory) {} + +/** + * Returns a detailed list of files in the given directory + * @link http://www.php.net/manual/en/function.ftp-rawlist.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param directory string

+ * The directory path. + *

+ * @param recursive bool[optional]

+ * If set to true, the issued command will be LIST -R. + *

+ * @return array an array where each element corresponds to one line of text. + *

+ *

+ * The output is not parsed in any way. The system type identifier returned by + * ftp_systype can be used to determine how the results + * should be interpreted. + * + * @jms-builtin + */ +function ftp_rawlist ($ftp_stream, $directory, $recursive = null) {} + +/** + * Returns the system type identifier of the remote FTP server + * @link http://www.php.net/manual/en/function.ftp-systype.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @return string the remote system type, or false on error. + * + * @jms-builtin + */ +function ftp_systype ($ftp_stream) {} + +/** + * Turns passive mode on or off + * @link http://www.php.net/manual/en/function.ftp-pasv.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param pasv bool

+ * If true, the passive mode is turned on, else it's turned off. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_pasv ($ftp_stream, $pasv) {} + +/** + * Downloads a file from the FTP server + * @link http://www.php.net/manual/en/function.ftp-get.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param local_file string

+ * The local file path (will be overwritten if the file already exists). + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param resumepos int[optional]

+ * The position in the remote file to start downloading from. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_get ($ftp_stream, $local_file, $remote_file, $mode, $resumepos = null) {} + +/** + * Downloads a file from the FTP server and saves to an open file + * @link http://www.php.net/manual/en/function.ftp-fget.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param handle resource

+ * An open file pointer in which we store the data. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param resumepos int[optional]

+ * The position in the remote file to start downloading from. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_fget ($ftp_stream, $handle, $remote_file, $mode, $resumepos = null) {} + +/** + * Uploads a file to the FTP server + * @link http://www.php.net/manual/en/function.ftp-put.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param local_file string

+ * The local file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param startpos int[optional]

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_put ($ftp_stream, $remote_file, $local_file, $mode, $startpos = null) {} + +/** + * Uploads from an open file to the FTP server + * @link http://www.php.net/manual/en/function.ftp-fput.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param handle resource

+ * An open file pointer on the local file. Reading stops at end of file. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param startpos int[optional]

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_fput ($ftp_stream, $remote_file, $handle, $mode, $startpos = null) {} + +/** + * Returns the size of the given file + * @link http://www.php.net/manual/en/function.ftp-size.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The remote file. + *

+ * @return int the file size on success, or -1 on error. + * + * @jms-builtin + */ +function ftp_size ($ftp_stream, $remote_file) {} + +/** + * Returns the last modified time of the given file + * @link http://www.php.net/manual/en/function.ftp-mdtm.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The file from which to extract the last modification time. + *

+ * @return int the last modified time as a Unix timestamp on success, or -1 on + * error. + * + * @jms-builtin + */ +function ftp_mdtm ($ftp_stream, $remote_file) {} + +/** + * Renames a file or a directory on the FTP server + * @link http://www.php.net/manual/en/function.ftp-rename.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param oldname string

+ * The old file/directory name. + *

+ * @param newname string

+ * The new name. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_rename ($ftp_stream, $oldname, $newname) {} + +/** + * Deletes a file on the FTP server + * @link http://www.php.net/manual/en/function.ftp-delete.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param path string

+ * The file to delete. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_delete ($ftp_stream, $path) {} + +/** + * Sends a SITE command to the server + * @link http://www.php.net/manual/en/function.ftp-site.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param command string

+ * The SITE command. Note that this parameter isn't escaped so there may + * be some issues with filenames containing spaces and other characters. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_site ($ftp_stream, $command) {} + +/** + * Closes an FTP connection + * @link http://www.php.net/manual/en/function.ftp-close.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftp_close ($ftp_stream) {} + +/** + * Set miscellaneous runtime FTP options + * @link http://www.php.net/manual/en/function.ftp-set-option.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param option int

+ * Currently, the following options are supported: + * + * Supported runtime FTP options + * + * + * + * + * + * + * + * + *
FTP_TIMEOUT_SEC + * Changes the timeout in seconds used for all network related + * functions. value must be an integer that + * is greater than 0. The default timeout is 90 seconds. + *
FTP_AUTOSEEK + * When enabled, GET or PUT requests with a + * resumepos or startpos + * parameter will first seek to the requested position within the file. + * This is enabled by default. + *
+ *

+ * @param value mixed

+ * This parameter depends on which option is chosen + * to be altered. + *

+ * @return bool true if the option could be set; false if not. A warning + * message will be thrown if the option is not + * supported or the passed value doesn't match the + * expected value for the given option. + * + * @jms-builtin + */ +function ftp_set_option ($ftp_stream, $option, $value) {} + +/** + * Retrieves various runtime behaviours of the current FTP stream + * @link http://www.php.net/manual/en/function.ftp-get-option.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param option int

+ * Currently, the following options are supported: + * + * Supported runtime FTP options + * + * + * + * + * + * + * + * + *
FTP_TIMEOUT_SEC + * Returns the current timeout used for network related operations. + *
FTP_AUTOSEEK + * Returns true if this option is on, false otherwise. + *
+ *

+ * @return mixed the value on success or false if the given + * option is not supported. In the latter case, a + * warning message is also thrown. + * + * @jms-builtin + */ +function ftp_get_option ($ftp_stream, $option) {} + +/** + * Retrieves a file from the FTP server and writes it to an open file (non-blocking) + * @link http://www.php.net/manual/en/function.ftp-nb-fget.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param handle resource

+ * An open file pointer in which we store the data. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param resumepos int[optional]

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * + * @jms-builtin + */ +function ftp_nb_fget ($ftp_stream, $handle, $remote_file, $mode, $resumepos = null) {} + +/** + * Retrieves a file from the FTP server and writes it to a local file (non-blocking) + * @link http://www.php.net/manual/en/function.ftp-nb-get.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param local_file string

+ * The local file path (will be overwritten if the file already exists). + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param resumepos int[optional]

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * + * @jms-builtin + */ +function ftp_nb_get ($ftp_stream, $local_file, $remote_file, $mode, $resumepos = null) {} + +/** + * Continues retrieving/sending a file (non-blocking) + * @link http://www.php.net/manual/en/function.ftp-nb-continue.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * + * @jms-builtin + */ +function ftp_nb_continue ($ftp_stream) {} + +/** + * Stores a file on the FTP server (non-blocking) + * @link http://www.php.net/manual/en/function.ftp-nb-put.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param local_file string

+ * The local file path. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param startpos int[optional]

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * + * @jms-builtin + */ +function ftp_nb_put ($ftp_stream, $remote_file, $local_file, $mode, $startpos = null) {} + +/** + * Stores a file from an open file to the FTP server (non-blocking) + * @link http://www.php.net/manual/en/function.ftp-nb-fput.php + * @param ftp_stream resource

+ * The link identifier of the FTP connection. + *

+ * @param remote_file string

+ * The remote file path. + *

+ * @param handle resource

+ * An open file pointer on the local file. Reading stops at end of file. + *

+ * @param mode int

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param startpos int[optional]

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * + * @jms-builtin + */ +function ftp_nb_fput ($ftp_stream, $remote_file, $handle, $mode, $startpos = null) {} + +/** + * &Alias; ftp_close + * @link http://www.php.net/manual/en/function.ftp-quit.php + * @param ftp + * + * @jms-builtin + */ +function ftp_quit ($ftp) {} + + +/** + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_ASCII', 1); + +/** + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_TEXT', 1); + +/** + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_BINARY', 2); + +/** + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_IMAGE', 2); + +/** + *

+ * Automatically determine resume position and start position for GET and PUT requests + * (only works if FTP_AUTOSEEK is enabled) + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_AUTORESUME', -1); + +/** + *

+ * See ftp_set_option for information. + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_TIMEOUT_SEC', 0); + +/** + *

+ * See ftp_set_option for information. + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_AUTOSEEK', 1); + +/** + *

+ * Asynchronous transfer has failed + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_FAILED', 0); + +/** + *

+ * Asynchronous transfer has finished + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_FINISHED', 1); + +/** + *

+ * Asynchronous transfer is still active + *

+ * @link http://www.php.net/manual/en/ftp.constants.php + */ +define ('FTP_MOREDATA', 2); + +// End of ftp v. +?> diff --git a/res/php-5.3-core-api/gd.php b/res/php-5.3-core-api/gd.php new file mode 100644 index 0000000..fd2a20e --- /dev/null +++ b/res/php-5.3-core-api/gd.php @@ -0,0 +1,2378 @@ + + *

+ * + * Elements of array returned by gd_info + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
AttributeMeaning
GD Versionstring value describing the installed + * libgd version.
Freetype Supportboolean value. true + * if Freetype Support is installed.
Freetype Linkagestring value describing the way in which + * Freetype was linked. Expected values are: 'with freetype', + * 'with TTF library', and 'with unknown library'. This element will + * only be defined if Freetype Support evaluated to + * true.
T1Lib Supportboolean value. true + * if T1Lib support is included.
GIF Read Supportboolean value. true + * if support for reading GIF + * images is included.
GIF Create Supportboolean value. true + * if support for creating GIF + * images is included.
JPEG Supportboolean value. true + * if JPEG support is included.
PNG Supportboolean value. true + * if PNG support is included.
WBMP Supportboolean value. true + * if WBMP support is included.
XBM Supportboolean value. true + * if XBM support is included.
+ *

+ *

+ * Previous to PHP 5.3.0, the JPEG Support attribute was named + * JPG Support. + * + * @jms-builtin + */ +function gd_info () {} + +/** + * Draws an arc + * @link http://www.php.net/manual/en/function.imagearc.php + * @param image resource + * @param cx int

+ * x-coordinate of the center. + *

+ * @param cy int

+ * y-coordinate of the center. + *

+ * @param width int

+ * The arc width. + *

+ * @param height int

+ * The arc height. + *

+ * @param start int

+ * The arc start angle, in degrees. + *

+ * @param end int

+ * The arc end angle, in degrees. + * 0° is located at the three-o'clock position, and the arc is drawn + * clockwise. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagearc ($image, $cx, $cy, $width, $height, $start, $end, $color) {} + +/** + * Draw an ellipse + * @link http://www.php.net/manual/en/function.imageellipse.php + * @param image resource + * @param cx int

+ * x-coordinate of the center. + *

+ * @param cy int

+ * y-coordinate of the center. + *

+ * @param width int

+ * The ellipse width. + *

+ * @param height int

+ * The ellipse height. + *

+ * @param color int

+ * The color of the ellipse. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imageellipse ($image, $cx, $cy, $width, $height, $color) {} + +/** + * Draw a character horizontally + * @link http://www.php.net/manual/en/function.imagechar.php + * @param image resource + * @param font int + * @param x int

+ * x-coordinate of the start. + *

+ * @param y int

+ * y-coordinate of the start. + *

+ * @param c string

+ * The character to draw. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagechar ($image, $font, $x, $y, $c, $color) {} + +/** + * Draw a character vertically + * @link http://www.php.net/manual/en/function.imagecharup.php + * @param image resource + * @param font int + * @param x int

+ * x-coordinate of the start. + *

+ * @param y int

+ * y-coordinate of the start. + *

+ * @param c string

+ * The character to draw. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecharup ($image, $font, $x, $y, $c, $color) {} + +/** + * Get the index of the color of a pixel + * @link http://www.php.net/manual/en/function.imagecolorat.php + * @param image resource + * @param x int

+ * x-coordinate of the point. + *

+ * @param y int

+ * y-coordinate of the point. + *

+ * @return int the index of the color. + * + * @jms-builtin + */ +function imagecolorat ($image, $x, $y) {} + +/** + * Allocate a color for an image + * @link http://www.php.net/manual/en/function.imagecolorallocate.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return int A color identifier or false if the allocation failed. + * + * @jms-builtin + */ +function imagecolorallocate ($image, $red, $green, $blue) {} + +/** + * Copy the palette from one image to another + * @link http://www.php.net/manual/en/function.imagepalettecopy.php + * @param destination resource

+ * The destination image resource. + *

+ * @param source resource

+ * The source image resource. + *

+ * @return void + * + * @jms-builtin + */ +function imagepalettecopy ($destination, $source) {} + +/** + * Create a new image from the image stream in the string + * @link http://www.php.net/manual/en/function.imagecreatefromstring.php + * @param data string + * @return resource An image resource will be returned on success. false is returned if + * the image type is unsupported, the data is not in a recognised format, + * or the image is corrupt and cannot be loaded. + * + * @jms-builtin + */ +function imagecreatefromstring ($data) {} + +/** + * Get the index of the closest color to the specified color + * @link http://www.php.net/manual/en/function.imagecolorclosest.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return int the index of the closest color, in the palette of the image, to + * the specified one + * + * @jms-builtin + */ +function imagecolorclosest ($image, $red, $green, $blue) {} + +/** + * Get the index of the color which has the hue, white and blackness + * @link http://www.php.net/manual/en/function.imagecolorclosesthwb.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return int an integer with the index of the color which has + * the hue, white and blackness nearest the given color. + * + * @jms-builtin + */ +function imagecolorclosesthwb ($image, $red, $green, $blue) {} + +/** + * De-allocate a color for an image + * @link http://www.php.net/manual/en/function.imagecolordeallocate.php + * @param image resource + * @param color int

+ * The color identifier. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecolordeallocate ($image, $color) {} + +/** + * Get the index of the specified color or its closest possible alternative + * @link http://www.php.net/manual/en/function.imagecolorresolve.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return int a color index. + * + * @jms-builtin + */ +function imagecolorresolve ($image, $red, $green, $blue) {} + +/** + * Get the index of the specified color + * @link http://www.php.net/manual/en/function.imagecolorexact.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return int the index of the specified color in the palette, or -1 if the + * color does not exist. + * + * @jms-builtin + */ +function imagecolorexact ($image, $red, $green, $blue) {} + +/** + * Set the color for the specified palette index + * @link http://www.php.net/manual/en/function.imagecolorset.php + * @param image resource + * @param index int

+ * An index in the palette. + *

+ * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @return void + * + * @jms-builtin + */ +function imagecolorset ($image, $index, $red, $green, $blue) {} + +/** + * Define a color as transparent + * @link http://www.php.net/manual/en/function.imagecolortransparent.php + * @param image resource + * @param color int[optional]

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return int The identifier of the new (or current, if none is specified) + * transparent color is returned. + * + * @jms-builtin + */ +function imagecolortransparent ($image, $color = null) {} + +/** + * Find out the number of colors in an image's palette + * @link http://www.php.net/manual/en/function.imagecolorstotal.php + * @param image resource

+ * An image resource, returned by one of the image creation functions, such + * as imagecreatefromgif. + *

+ * @return int the number of colors in the specified image's palette or 0 for + * truecolor images. + * + * @jms-builtin + */ +function imagecolorstotal ($image) {} + +/** + * Get the colors for an index + * @link http://www.php.net/manual/en/function.imagecolorsforindex.php + * @param image resource + * @param index int

+ * The color index. + *

+ * @return array an associative array with red, green, blue and alpha keys that + * contain the appropriate values for the specified color index. + * + * @jms-builtin + */ +function imagecolorsforindex ($image, $index) {} + +/** + * Copy part of an image + * @link http://www.php.net/manual/en/function.imagecopy.php + * @param dst_im resource

+ * Destination image link resource. + *

+ * @param src_im resource

+ * Source image link resource. + *

+ * @param dst_x int

+ * x-coordinate of destination point. + *

+ * @param dst_y int

+ * y-coordinate of destination point. + *

+ * @param src_x int

+ * x-coordinate of source point. + *

+ * @param src_y int

+ * y-coordinate of source point. + *

+ * @param src_w int

+ * Source width. + *

+ * @param src_h int

+ * Source height. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecopy ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h) {} + +/** + * Copy and merge part of an image + * @link http://www.php.net/manual/en/function.imagecopymerge.php + * @param dst_im resource

+ * Destination image link resource. + *

+ * @param src_im resource

+ * Source image link resource. + *

+ * @param dst_x int

+ * x-coordinate of destination point. + *

+ * @param dst_y int

+ * y-coordinate of destination point. + *

+ * @param src_x int

+ * x-coordinate of source point. + *

+ * @param src_y int

+ * y-coordinate of source point. + *

+ * @param src_w int

+ * Source width. + *

+ * @param src_h int

+ * Source height. + *

+ * @param pct int

+ * The two images will be merged according to pct + * which can range from 0 to 100. When pct = 0, + * no action is taken, when 100 this function behaves identically + * to imagecopy for pallete images, while it + * implements alpha transparency for true colour images. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecopymerge ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) {} + +/** + * Copy and merge part of an image with gray scale + * @link http://www.php.net/manual/en/function.imagecopymergegray.php + * @param dst_im resource

+ * Destination image link resource. + *

+ * @param src_im resource

+ * Source image link resource. + *

+ * @param dst_x int

+ * x-coordinate of destination point. + *

+ * @param dst_y int

+ * y-coordinate of destination point. + *

+ * @param src_x int

+ * x-coordinate of source point. + *

+ * @param src_y int

+ * y-coordinate of source point. + *

+ * @param src_w int

+ * Source width. + *

+ * @param src_h int

+ * Source height. + *

+ * @param pct int

+ * The src_im will be changed to grayscale according + * to pct where 0 is fully grayscale and 100 is + * unchanged. When pct = 100 this function behaves + * identically to imagecopy for pallete images, while + * it implements alpha transparency for true colour images. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecopymergegray ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) {} + +/** + * Copy and resize part of an image + * @link http://www.php.net/manual/en/function.imagecopyresized.php + * @param dst_image resource + * @param src_image resource + * @param dst_x int

+ * x-coordinate of destination point. + *

+ * @param dst_y int

+ * y-coordinate of destination point. + *

+ * @param src_x int

+ * x-coordinate of source point. + *

+ * @param src_y int

+ * y-coordinate of source point. + *

+ * @param dst_w int

+ * Destination width. + *

+ * @param dst_h int

+ * Destination height. + *

+ * @param src_w int

+ * Source width. + *

+ * @param src_h int

+ * Source height. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecopyresized ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) {} + +/** + * Create a new palette based image + * @link http://www.php.net/manual/en/function.imagecreate.php + * @param width int

+ * The image width. + *

+ * @param height int

+ * The image height. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreate ($width, $height) {} + +/** + * Create a new true color image + * @link http://www.php.net/manual/en/function.imagecreatetruecolor.php + * @param width int

+ * Image width. + *

+ * @param height int

+ * Image height. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatetruecolor ($width, $height) {} + +/** + * Finds whether an image is a truecolor image + * @link http://www.php.net/manual/en/function.imageistruecolor.php + * @param image resource + * @return bool true if the image is truecolor, false + * otherwise. + * + * @jms-builtin + */ +function imageistruecolor ($image) {} + +/** + * Convert a true color image to a palette image + * @link http://www.php.net/manual/en/function.imagetruecolortopalette.php + * @param image resource + * @param dither bool

+ * Indicates if the image should be dithered - if it is true then + * dithering will be used which will result in a more speckled image but + * with better color approximation. + *

+ * @param ncolors int

+ * Sets the maximum number of colors that should be retained in the palette. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagetruecolortopalette ($image, $dither, $ncolors) {} + +/** + * Set the thickness for line drawing + * @link http://www.php.net/manual/en/function.imagesetthickness.php + * @param image resource + * @param thickness int

+ * Thickness, in pixels. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesetthickness ($image, $thickness) {} + +/** + * Draw a partial arc and fill it + * @link http://www.php.net/manual/en/function.imagefilledarc.php + * @param image resource + * @param cx int

+ * x-coordinate of the center. + *

+ * @param cy int

+ * y-coordinate of the center. + *

+ * @param width int

+ * The arc width. + *

+ * @param height int

+ * The arc height. + *

+ * @param start int

+ * The arc start angle, in degrees. + *

+ * @param end int

+ * The arc end angle, in degrees. + * 0° is located at the three-o'clock position, and the arc is drawn + * clockwise. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @param style int

+ * A bitwise OR of the following possibilities: + * IMG_ARC_PIE + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilledarc ($image, $cx, $cy, $width, $height, $start, $end, $color, $style) {} + +/** + * Draw a filled ellipse + * @link http://www.php.net/manual/en/function.imagefilledellipse.php + * @param image resource + * @param cx int

+ * x-coordinate of the center. + *

+ * @param cy int

+ * y-coordinate of the center. + *

+ * @param width int

+ * The ellipse width. + *

+ * @param height int

+ * The ellipse height. + *

+ * @param color int

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilledellipse ($image, $cx, $cy, $width, $height, $color) {} + +/** + * Set the blending mode for an image + * @link http://www.php.net/manual/en/function.imagealphablending.php + * @param image resource + * @param blendmode bool

+ * Whether to enable the blending mode or not. On true color images + * the default value is true otherwise the default value is false + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagealphablending ($image, $blendmode) {} + +/** + * Set the flag to save full alpha channel information (as opposed to single-color transparency) when saving PNG images + * @link http://www.php.net/manual/en/function.imagesavealpha.php + * @param image resource + * @param saveflag bool

+ * Whether to save the alpha channel or not. Default to false. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesavealpha ($image, $saveflag) {} + +/** + * Allocate a color for an image + * @link http://www.php.net/manual/en/function.imagecolorallocatealpha.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @param alpha int

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int A color identifier or false if the allocation failed. + * + * @jms-builtin + */ +function imagecolorallocatealpha ($image, $red, $green, $blue, $alpha) {} + +/** + * Get the index of the specified color + alpha or its closest possible alternative + * @link http://www.php.net/manual/en/function.imagecolorresolvealpha.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @param alpha int

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int a color index. + * + * @jms-builtin + */ +function imagecolorresolvealpha ($image, $red, $green, $blue, $alpha) {} + +/** + * Get the index of the closest color to the specified color + alpha + * @link http://www.php.net/manual/en/function.imagecolorclosestalpha.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @param alpha int

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int the index of the closest color in the palette. + * + * @jms-builtin + */ +function imagecolorclosestalpha ($image, $red, $green, $blue, $alpha) {} + +/** + * Get the index of the specified color + alpha + * @link http://www.php.net/manual/en/function.imagecolorexactalpha.php + * @param image resource + * @param red int

+ * Value of red component. + *

+ * @param green int

+ * Value of green component. + *

+ * @param blue int

+ * Value of blue component. + *

+ * @param alpha int

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int the index of the specified color+alpha in the palette of the + * image, or -1 if the color does not exist in the image's palette. + * + * @jms-builtin + */ +function imagecolorexactalpha ($image, $red, $green, $blue, $alpha) {} + +/** + * Copy and resize part of an image with resampling + * @link http://www.php.net/manual/en/function.imagecopyresampled.php + * @param dst_image resource + * @param src_image resource + * @param dst_x int

+ * x-coordinate of destination point. + *

+ * @param dst_y int

+ * y-coordinate of destination point. + *

+ * @param src_x int

+ * x-coordinate of source point. + *

+ * @param src_y int

+ * y-coordinate of source point. + *

+ * @param dst_w int

+ * Destination width. + *

+ * @param dst_h int

+ * Destination height. + *

+ * @param src_w int

+ * Source width. + *

+ * @param src_h int

+ * Source height. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecopyresampled ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) {} + +/** + * Rotate an image with a given angle + * @link http://www.php.net/manual/en/function.imagerotate.php + * @param image resource + * @param angle float

+ * Rotation angle, in degrees. + *

+ * @param bgd_color int

+ * Specifies the color of the uncovered zone after the rotation + *

+ * @param ignore_transparent int[optional]

+ * If set and non-zero, transparent colors are ignored (otherwise kept). + *

+ * @return resource an image resource for the rotated image, &return.falseforfailure;. + * + * @jms-builtin + */ +function imagerotate ($image, $angle, $bgd_color, $ignore_transparent = null) {} + +/** + * Should antialias functions be used or not + * @link http://www.php.net/manual/en/function.imageantialias.php + * @param image resource + * @param enabled bool

+ * Whether to enable antialiasing or not. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imageantialias ($image, $enabled) {} + +/** + * Set the tile image for filling + * @link http://www.php.net/manual/en/function.imagesettile.php + * @param image resource + * @param tile resource

+ * The image resource to be used as a tile. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesettile ($image, $tile) {} + +/** + * Set the brush image for line drawing + * @link http://www.php.net/manual/en/function.imagesetbrush.php + * @param image resource + * @param brush resource

+ * An image resource. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesetbrush ($image, $brush) {} + +/** + * Set the style for line drawing + * @link http://www.php.net/manual/en/function.imagesetstyle.php + * @param image resource + * @param style array

+ * An array of pixel colors. You can use the + * IMG_COLOR_TRANSPARENT constant to add a + * transparent pixel. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesetstyle ($image, array $style) {} + +/** + * Create a new image from file or URL + * @link http://www.php.net/manual/en/function.imagecreatefrompng.php + * @param filename string

+ * Path to the PNG image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefrompng ($filename) {} + +/** + * Create a new image from file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromgif.php + * @param filename string

+ * Path to the GIF image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromgif ($filename) {} + +/** + * Create a new image from file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromjpeg.php + * @param filename string

+ * Path to the JPEG image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromjpeg ($filename) {} + +/** + * Create a new image from file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromwbmp.php + * @param filename string

+ * Path to the WBMP image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromwbmp ($filename) {} + +/** + * Create a new image from file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromxbm.php + * @param filename string

+ * Path to the XBM image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromxbm ($filename) {} + +/** + * Create a new image from GD file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromgd.php + * @param filename string

+ * Path to the GD file. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromgd ($filename) {} + +/** + * Create a new image from GD2 file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromgd2.php + * @param filename string

+ * Path to the GD2 image. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromgd2 ($filename) {} + +/** + * Create a new image from a given part of GD2 file or URL + * @link http://www.php.net/manual/en/function.imagecreatefromgd2part.php + * @param filename string

+ * Path to the GD2 image. + *

+ * @param srcX int

+ * x-coordinate of source point. + *

+ * @param srcY int

+ * y-coordinate of source point. + *

+ * @param width int

+ * Source width. + *

+ * @param height int

+ * Source height. + *

+ * @return resource an image resource identifier on success, false on errors. + * + * @jms-builtin + */ +function imagecreatefromgd2part ($filename, $srcX, $srcY, $width, $height) {} + +/** + * Output a PNG image to either the browser or a file + * @link http://www.php.net/manual/en/function.imagepng.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ *

+ * &null; is invalid if the quality and + * filters arguments are not used. + *

+ * @param quality int[optional]

+ * Compression level: from 0 (no compression) to 9. + *

+ * @param filters int[optional]

+ * Allows reducing the PNG file size. It is a bitmask field which may be + * set to any combination of the PNG_FILTER_XXX + * constants. PNG_NO_FILTER or + * PNG_ALL_FILTERS may also be used to respectively + * disable or activate all filters. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagepng ($image, $filename = null, $quality = null, $filters = null) {} + +/** + * Output image to browser or file + * @link http://www.php.net/manual/en/function.imagegif.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagegif ($image, $filename = null) {} + +/** + * Output image to browser or file + * @link http://www.php.net/manual/en/function.imagejpeg.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ *

+ * To skip this argument in order to provide the + * quality parameter, use &null;. + *

+ * @param quality int[optional]

+ * quality is optional, and ranges from 0 (worst + * quality, smaller file) to 100 (best quality, biggest file). The + * default is the default IJG quality value (about 75). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagejpeg ($image, $filename = null, $quality = null) {} + +/** + * Output image to browser or file + * @link http://www.php.net/manual/en/function.imagewbmp.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ * @param foreground int[optional]

+ * You can set the foreground color with this parameter by setting an + * identifier obtained from imagecolorallocate. + * The default foreground color is black. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagewbmp ($image, $filename = null, $foreground = null) {} + +/** + * Output GD image to browser or file + * @link http://www.php.net/manual/en/function.imagegd.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagegd ($image, $filename = null) {} + +/** + * Output GD2 image to browser or file + * @link http://www.php.net/manual/en/function.imagegd2.php + * @param image resource + * @param filename string[optional]

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ * @param chunk_size int[optional]

+ * Chunk size. + *

+ * @param type int[optional]

+ * Either IMG_GD2_RAW or + * IMG_GD2_COMPRESSED. Default is + * IMG_GD2_RAW. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagegd2 ($image, $filename = null, $chunk_size = null, $type = null) {} + +/** + * Destroy an image + * @link http://www.php.net/manual/en/function.imagedestroy.php + * @param image resource + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagedestroy ($image) {} + +/** + * Apply a gamma correction to a GD image + * @link http://www.php.net/manual/en/function.imagegammacorrect.php + * @param image resource + * @param inputgamma float

+ * The input gamma. + *

+ * @param outputgamma float

+ * The output gamma. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagegammacorrect ($image, $inputgamma, $outputgamma) {} + +/** + * Flood fill + * @link http://www.php.net/manual/en/function.imagefill.php + * @param image resource + * @param x int

+ * x-coordinate of start point. + *

+ * @param y int

+ * y-coordinate of start point. + *

+ * @param color int

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefill ($image, $x, $y, $color) {} + +/** + * Draw a filled polygon + * @link http://www.php.net/manual/en/function.imagefilledpolygon.php + * @param image resource + * @param points array

+ * An array containing the x and y + * coordinates of the polygons vertices consecutively. + *

+ * @param num_points int

+ * Total number of vertices, which must be at least 3. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilledpolygon ($image, array $points, $num_points, $color) {} + +/** + * Draw a filled rectangle + * @link http://www.php.net/manual/en/function.imagefilledrectangle.php + * @param image resource + * @param x1 int

+ * x-coordinate for point 1. + *

+ * @param y1 int

+ * y-coordinate for point 1. + *

+ * @param x2 int

+ * x-coordinate for point 2. + *

+ * @param y2 int

+ * y-coordinate for point 2. + *

+ * @param color int

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilledrectangle ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * Flood fill to specific color + * @link http://www.php.net/manual/en/function.imagefilltoborder.php + * @param image resource + * @param x int

+ * x-coordinate of start. + *

+ * @param y int

+ * y-coordinate of start. + *

+ * @param border int

+ * The border color. A color identifier created with + * imagecolorallocate. + *

+ * @param color int

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilltoborder ($image, $x, $y, $border, $color) {} + +/** + * Get font width + * @link http://www.php.net/manual/en/function.imagefontwidth.php + * @param font int + * @return int the width of the pixel + * + * @jms-builtin + */ +function imagefontwidth ($font) {} + +/** + * Get font height + * @link http://www.php.net/manual/en/function.imagefontheight.php + * @param font int + * @return int the height of the pixel. + * + * @jms-builtin + */ +function imagefontheight ($font) {} + +/** + * Enable or disable interlace + * @link http://www.php.net/manual/en/function.imageinterlace.php + * @param image resource + * @param interlace int[optional]

+ * If non-zero, the image will be interlaced, else the interlace bit is + * turned off. + *

+ * @return int 1 if the interlace bit is set for the image, 0 otherwise. + * + * @jms-builtin + */ +function imageinterlace ($image, $interlace = null) {} + +/** + * Draw a line + * @link http://www.php.net/manual/en/function.imageline.php + * @param image resource + * @param x1 int

+ * x-coordinate for first point. + *

+ * @param y1 int

+ * y-coordinate for first point. + *

+ * @param x2 int

+ * x-coordinate for second point. + *

+ * @param y2 int

+ * y-coordinate for second point. + *

+ * @param color int

+ * The line color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imageline ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * Load a new font + * @link http://www.php.net/manual/en/function.imageloadfont.php + * @param file string

+ * The font file format is currently binary and architecture + * dependent. This means you should generate the font files on the + * same type of CPU as the machine you are running PHP on. + *

+ *

+ * + * Font file format + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
byte positionC data typedescription
byte 0-3intnumber of characters in the font
byte 4-7int + * value of first character in the font (often 32 for space) + *
byte 8-11intpixel width of each character
byte 12-15intpixel height of each character
byte 16-char + * array with character data, one byte per pixel in each + * character, for a total of (nchars*width*height) bytes. + *
+ *

+ * @return int The font identifier which is always bigger than 5 to avoid conflicts with + * built-in fonts or false on errors. + * + * @jms-builtin + */ +function imageloadfont ($file) {} + +/** + * Draws a polygon + * @link http://www.php.net/manual/en/function.imagepolygon.php + * @param image resource + * @param points array

+ * An array containing the polygon's vertices, e.g.: + * + * points[0] + * = x0 + * + * + * points[1] + * = y0 + * + * + * points[2] + * = x1 + * + * + * points[3] + * = y1 + * + *

+ * @param num_points int

+ * Total number of points (vertices). + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagepolygon ($image, array $points, $num_points, $color) {} + +/** + * Draw a rectangle + * @link http://www.php.net/manual/en/function.imagerectangle.php + * @param image resource + * @param x1 int

+ * Upper left x coordinate. + *

+ * @param y1 int

+ * Upper left y coordinate + * 0, 0 is the top left corner of the image. + *

+ * @param x2 int

+ * Bottom right x coordinate. + *

+ * @param y2 int

+ * Bottom right y coordinate. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagerectangle ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * Set a single pixel + * @link http://www.php.net/manual/en/function.imagesetpixel.php + * @param image resource + * @param x int

+ * x-coordinate. + *

+ * @param y int

+ * y-coordinate. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagesetpixel ($image, $x, $y, $color) {} + +/** + * Draw a string horizontally + * @link http://www.php.net/manual/en/function.imagestring.php + * @param image resource + * @param font int + * @param x int

+ * x-coordinate of the upper left corner. + *

+ * @param y int

+ * y-coordinate of the upper left corner. + *

+ * @param string string

+ * The string to be written. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagestring ($image, $font, $x, $y, $string, $color) {} + +/** + * Draw a string vertically + * @link http://www.php.net/manual/en/function.imagestringup.php + * @param image resource + * @param font int + * @param x int

+ * x-coordinate of the upper left corner. + *

+ * @param y int

+ * y-coordinate of the upper left corner. + *

+ * @param string string

+ * The string to be written. + *

+ * @param color int

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagestringup ($image, $font, $x, $y, $string, $color) {} + +/** + * Get image width + * @link http://www.php.net/manual/en/function.imagesx.php + * @param image resource + * @return int Return the width of the image or false on + * errors. + * + * @jms-builtin + */ +function imagesx ($image) {} + +/** + * Get image height + * @link http://www.php.net/manual/en/function.imagesy.php + * @param image resource + * @return int Return the height of the image or false on + * errors. + * + * @jms-builtin + */ +function imagesy ($image) {} + +/** + * Draw a dashed line + * @link http://www.php.net/manual/en/function.imagedashedline.php + * @param image resource + * @param x1 int

+ * Upper left x coordinate. + *

+ * @param y1 int

+ * Upper left y coordinate 0, 0 is the top left corner of the image. + *

+ * @param x2 int

+ * Bottom right x coordinate. + *

+ * @param y2 int

+ * Bottom right y coordinate. + *

+ * @param color int

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Always returns true + * + * @jms-builtin + */ +function imagedashedline ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * Give the bounding box of a text using TrueType fonts + * @link http://www.php.net/manual/en/function.imagettfbbox.php + * @param size float

+ * The font size. Depending on your version of GD, this should be + * specified as the pixel size (GD1) or point size (GD2). + *

+ * @param angle float

+ * Angle in degrees in which text will be measured. + *

+ * @param fontfile string

+ * The name of the TrueType font file (can be a URL). Depending on + * which version of the GD library that PHP is using, it may attempt to + * search for files that do not begin with a leading '/' by appending + * '.ttf' to the filename and searching along a library-defined font path. + *

+ * @param text string

+ * The string to be measured. + *

+ * @return array imagettfbbox returns an array with 8 + * elements representing four points making the bounding box of the + * text on success and false on error. + * + * key + * contents + * + * + * 0 + * lower left corner, X position + * + * + * 1 + * lower left corner, Y position + * + * + * 2 + * lower right corner, X position + * + * + * 3 + * lower right corner, Y position + * + * + * 4 + * upper right corner, X position + * + * + * 5 + * upper right corner, Y position + * + * + * 6 + * upper left corner, X position + * + * + * 7 + * upper left corner, Y position + * + *

+ *

+ * The points are relative to the text regardless of the + * angle, so "upper left" means in the top left-hand + * corner seeing the text horizontally. + * + * @jms-builtin + */ +function imagettfbbox ($size, $angle, $fontfile, $text) {} + +/** + * Write text to the image using TrueType fonts + * @link http://www.php.net/manual/en/function.imagettftext.php + * @param image resource + * @param size float

+ * The font size. Depending on your version of GD, this should be + * specified as the pixel size (GD1) or point size (GD2). + *

+ * @param angle float

+ * The angle in degrees, with 0 degrees being left-to-right reading text. + * Higher values represent a counter-clockwise rotation. For example, a + * value of 90 would result in bottom-to-top reading text. + *

+ * @param x int

+ * The coordinates given by x and + * y will define the basepoint of the first + * character (roughly the lower-left corner of the character). This + * is different from the imagestring, where + * x and y define the + * upper-left corner of the first character. For example, "top left" + * is 0, 0. + *

+ * @param y int

+ * The y-ordinate. This sets the position of the fonts baseline, not the + * very bottom of the character. + *

+ * @param color int

+ * The color index. Using the negative of a color index has the effect of + * turning off antialiasing. See imagecolorallocate. + *

+ * @param fontfile string

+ * The path to the TrueType font you wish to use. + *

+ *

+ * Depending on which version of the GD library PHP is using, when + * fontfile does not begin with a leading + * / then .ttf will be appended + * to the filename and the library will attempt to search for that + * filename along a library-defined font path. + *

+ *

+ * When using versions of the GD library lower than 2.0.18, a space character, + * rather than a semicolon, was used as the 'path separator' for different font files. + * Unintentional use of this feature will result in the warning message: + * Warning: Could not find/open font. For these affected versions, the + * only solution is moving the font to a path which does not contain spaces. + *

+ *

+ * In many cases where a font resides in the same directory as the script using it + * the following trick will alleviate any include problems. + * ]]> + *

+ * @param text string

+ * The text string in UTF-8 encoding. + *

+ *

+ * May include decimal numeric character references (of the form: + * &#8364;) to access characters in a font beyond position 127. + * The hexadecimal format (like &#xA9;) is supported. + * Strings in UTF-8 encoding can be passed directly. + *

+ *

+ * Named entities, such as &copy;, are not supported. Consider using + * html_entity_decode + * to decode these named entities into UTF-8 strings (html_entity_decode() + * supports this as of PHP 5.0.0). + *

+ *

+ * If a character is used in the string which is not supported by the + * font, a hollow rectangle will replace the character. + *

+ * @return array an array with 8 elements representing four points making the + * bounding box of the text. The order of the points is lower left, lower + * right, upper right, upper left. The points are relative to the text + * regardless of the angle, so "upper left" means in the top left-hand + * corner when you see the text horizontally. + * Returns false on error. + * + * @jms-builtin + */ +function imagettftext ($image, $size, $angle, $x, $y, $color, $fontfile, $text) {} + +/** + * Give the bounding box of a text using fonts via freetype2 + * @link http://www.php.net/manual/en/function.imageftbbox.php + * @param size float

+ * The font size. Depending on your version of GD, this should be + * specified as the pixel size (GD1) or point size (GD2). + *

+ * @param angle float

+ * Angle in degrees in which text will be + * measured. + *

+ * @param fontfile string

+ * The name of the TrueType font file (can be a URL). Depending on + * which version of the GD library that PHP is using, it may attempt to + * search for files that do not begin with a leading '/' by appending + * '.ttf' to the filename and searching along a library-defined font path. + *

+ * @param text string

+ * The string to be measured. + *

+ * @param extrainfo array[optional]

+ * + * Possible array indexes for extrainfo + * + * + * + * + * + * + * + * + * + * + *
KeyTypeMeaning
linespacingfloatDefines drawing linespacing
+ *

+ * @return array imageftbbox returns an array with 8 + * elements representing four points making the bounding box of the + * text: + * + * 0 + * lower left corner, X position + * + * + * 1 + * lower left corner, Y position + * + * + * 2 + * lower right corner, X position + * + * + * 3 + * lower right corner, Y position + * + * + * 4 + * upper right corner, X position + * + * + * 5 + * upper right corner, Y position + * + * + * 6 + * upper left corner, X position + * + * + * 7 + * upper left corner, Y position + * + *

+ *

+ * The points are relative to the text regardless of the + * angle, so "upper left" means in the top left-hand + * corner seeing the text horizontally. + * + * @jms-builtin + */ +function imageftbbox ($size, $angle, $fontfile, $text, array $extrainfo = null) {} + +/** + * Write text to the image using fonts using FreeType 2 + * @link http://www.php.net/manual/en/function.imagefttext.php + * @param image resource + * @param size float

+ * The font size to use in points. + *

+ * @param angle float

+ * The angle in degrees, with 0 degrees being left-to-right reading text. + * Higher values represent a counter-clockwise rotation. For example, a + * value of 90 would result in bottom-to-top reading text. + *

+ * @param x int

+ * The coordinates given by x and + * y will define the basepoint of the first + * character (roughly the lower-left corner of the character). This + * is different from the imagestring, where + * x and y define the + * upper-left corner of the first character. For example, "top left" + * is 0, 0. + *

+ * @param y int

+ * The y-ordinate. This sets the position of the fonts baseline, not the + * very bottom of the character. + *

+ * @param color int

+ * The index of the desired color for the text, see + * imagecolorexact. + *

+ * @param fontfile string

+ * The path to the TrueType font you wish to use. + *

+ *

+ * Depending on which version of the GD library PHP is using, when + * fontfile does not begin with a leading + * / then .ttf will be appended + * to the filename and the library will attempt to search for that + * filename along a library-defined font path. + *

+ *

+ * When using versions of the GD library lower than 2.0.18, a space character, + * rather than a semicolon, was used as the 'path separator' for different font files. + * Unintentional use of this feature will result in the warning message: + * Warning: Could not find/open font. For these affected versions, the + * only solution is moving the font to a path which does not contain spaces. + *

+ *

+ * In many cases where a font resides in the same directory as the script using it + * the following trick will alleviate any include problems. + * ]]> + *

+ * @param text string

+ * Text to be inserted into image. + *

+ * @param extrainfo array[optional]

+ * + * Possible array indexes for extrainfo + * + * + * + * + * + * + * + * + * + * + *
KeyTypeMeaning
linespacingfloatDefines drawing linespacing
+ *

+ * @return array This function returns an array defining the four points of the box, starting in the lower left and moving counter-clockwise: + * + * 0 + * lower left x-coordinate + * + * + * 1 + * lower left y-coordinate + * + * + * 2 + * lower right x-coordinate + * + * + * 3 + * lower right y-coordinate + * + * + * 4 + * upper right x-coordinate + * + * + * 5 + * upper right y-coordinate + * + * + * 6 + * upper left x-coordinate + * + * + * 7 + * upper left y-coordinate + * + * + * @jms-builtin + */ +function imagefttext ($image, $size, $angle, $x, $y, $color, $fontfile, $text, array $extrainfo = null) {} + +/** + * Return the image types supported by this PHP build + * @link http://www.php.net/manual/en/function.imagetypes.php + * @return int a bit-field corresponding to the image formats supported by the + * version of GD linked into PHP. The following bits are returned, + * IMG_GIF | IMG_JPG | + * IMG_PNG | IMG_WBMP | + * IMG_XPM. + * + * @jms-builtin + */ +function imagetypes () {} + +/** + * Convert JPEG image file to WBMP image file + * @link http://www.php.net/manual/en/function.jpeg2wbmp.php + * @param jpegname string

+ * Path to JPEG file. + *

+ * @param wbmpname string

+ * Path to destination WBMP file. + *

+ * @param dest_height int

+ * Destination image height. + *

+ * @param dest_width int

+ * Destination image width. + *

+ * @param threshold int

+ * Threshold value, between 0 and 8 (inclusive). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function jpeg2wbmp ($jpegname, $wbmpname, $dest_height, $dest_width, $threshold) {} + +/** + * Convert PNG image file to WBMP image file + * @link http://www.php.net/manual/en/function.png2wbmp.php + * @param pngname string

+ * Path to PNG file. + *

+ * @param wbmpname string

+ * Path to destination WBMP file. + *

+ * @param dest_height int

+ * Destination image height. + *

+ * @param dest_width int

+ * Destination image width. + *

+ * @param threshold int

+ * Threshold value, between 0 and 8 (inclusive). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function png2wbmp ($pngname, $wbmpname, $dest_height, $dest_width, $threshold) {} + +/** + * Output image to browser or file + * @link http://www.php.net/manual/en/function.image2wbmp.php + * @param image resource + * @param filename string[optional]

+ * Path to the saved file. If not given, the raw image stream will be + * outputted directly. + *

+ * @param threshold int[optional]

+ * Threshold value, between 0 and 255 (inclusive). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function image2wbmp ($image, $filename = null, $threshold = null) {} + +/** + * Set the alpha blending flag to use the bundled libgd layering effects + * @link http://www.php.net/manual/en/function.imagelayereffect.php + * @param image resource + * @param effect int

+ * One of the following constants: + * IMG_EFFECT_REPLACE + * Use pixel replacement (equivalent of passing true to + * imagealphablending) + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagelayereffect ($image, $effect) {} + +/** + * Output XBM image to browser or file + * @link http://www.php.net/manual/en/function.imagexbm.php + * @param image resource + * @param filename string

+ * The path to save the file to. If not set or &null;, the raw image stream + * will be outputted directly. + *

+ * @param foreground int[optional]

+ * You can set the foreground color with this parameter by setting an + * identifier obtained from imagecolorallocate. + * The default foreground color is black. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagexbm ($image, $filename, $foreground = null) {} + +/** + * Makes the colors of the palette version of an image more closely match the true color version + * @link http://www.php.net/manual/en/function.imagecolormatch.php + * @param image1 resource

+ * A truecolor image link resource. + *

+ * @param image2 resource

+ * A palette image link resource pointing to an image that has the same + * size as image1. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagecolormatch ($image1, $image2) {} + +/** + * Applies a filter to an image + * @link http://www.php.net/manual/en/function.imagefilter.php + * @param image resource + * @param filtertype int

+ * filtertype can be one of the following: + * IMG_FILTER_NEGATE: Reverses all colors of + * the image. + * @param arg1 int[optional]

+ * IMG_FILTER_BRIGHTNESS: Brightness level. + * @param arg2 int[optional]

+ * IMG_FILTER_COLORIZE: Value of green component. + * @param arg3 int[optional]

+ * IMG_FILTER_COLORIZE: Value of blue component. + * @param arg4 int[optional]

+ * IMG_FILTER_COLORIZE: Alpha channel, A value + * between 0 and 127. 0 indicates completely opaque while 127 indicates + * completely transparent. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imagefilter ($image, $filtertype, $arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null) {} + +/** + * Apply a 3x3 convolution matrix, using coefficient and offset + * @link http://www.php.net/manual/en/function.imageconvolution.php + * @param image resource + * @param matrix array

+ * A 3x3 matrix: an array of three arrays of three floats. + *

+ * @param div float

+ * The divisor of the result of the convolution, used for normalization. + *

+ * @param offset float

+ * Color offset. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imageconvolution ($image, array $matrix, $div, $offset) {} + + +/** + * Used as a return value by imagetypes + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_GIF', 1); + +/** + * Used as a return value by imagetypes + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_JPG', 2); + +/** + * Used as a return value by imagetypes + *

+ * This constant has the same value as IMG_JPG + *

+ * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_JPEG', 2); + +/** + * Used as a return value by imagetypes + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_PNG', 4); + +/** + * Used as a return value by imagetypes + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_WBMP', 8); + +/** + * Used as a return value by imagetypes + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_XPM', 16); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_TILED', -5); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_STYLED', -2); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_BRUSHED', -3); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_STYLEDBRUSHED', -4); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_TRANSPARENT', -6); + +/** + * A style constant used by the imagefilledarc function. + *

+ * This constant has the same value as IMG_ARC_PIE + *

+ * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_ROUNDED', 0); + +/** + * A style constant used by the imagefilledarc function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_PIE', 0); + +/** + * A style constant used by the imagefilledarc function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_CHORD', 1); + +/** + * A style constant used by the imagefilledarc function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_NOFILL', 2); + +/** + * A style constant used by the imagefilledarc function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_EDGED', 4); + +/** + * A type constant used by the imagegd2 function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_GD2_RAW', 1); + +/** + * A type constant used by the imagegd2 function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_GD2_COMPRESSED', 2); + +/** + * Alpha blending effect used by the imagelayereffect function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_EFFECT_REPLACE', 0); + +/** + * Alpha blending effect used by the imagelayereffect function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_EFFECT_ALPHABLEND', 1); + +/** + * Alpha blending effect used by the imagelayereffect function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_EFFECT_NORMAL', 2); + +/** + * Alpha blending effect used by the imagelayereffect function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_EFFECT_OVERLAY', 3); + +/** + * When the bundled version of GD is used this is 1 otherwise + * its set to 0. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_BUNDLED', 1); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_NEGATE', 0); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_GRAYSCALE', 1); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_BRIGHTNESS', 2); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_CONTRAST', 3); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_COLORIZE', 4); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_EDGEDETECT', 5); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_GAUSSIAN_BLUR', 7); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_SELECTIVE_BLUR', 8); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_EMBOSS', 6); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_MEAN_REMOVAL', 9); + +/** + * Special GD filter used by the imagefilter function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_SMOOTH', 10); + +/** + * Special GD filter used by the imagefilter function. + * (Available as of PHP 5.3.0) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_PIXELATE', 11); + +/** + * The GD version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_VERSION', "2.0.35"); + +/** + * The GD major version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_MAJOR_VERSION', 2); + +/** + * The GD minor version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_MINOR_VERSION', 0); + +/** + * The GD release version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_RELEASE_VERSION', 35); + +/** + * The GD "extra" version (beta/rc..) PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('GD_EXTRA_VERSION', ""); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_NO_FILTER', 0); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_NONE', 8); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_SUB', 16); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_UP', 32); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_AVG', 64); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_PAETH', 128); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('PNG_ALL_FILTERS', 248); + +// End of gd v. +?> diff --git a/res/php-5.3-core-api/gettext.php b/res/php-5.3-core-api/gettext.php new file mode 100644 index 0000000..ee6db94 --- /dev/null +++ b/res/php-5.3-core-api/gettext.php @@ -0,0 +1,158 @@ + + * The new message domain, or &null; to get the current setting without + * changing it + *

+ * @return string If successful, this function returns the current message + * domain, after possibly changing it. + * + * @jms-builtin + */ +function textdomain ($text_domain) {} + +/** + * Lookup a message in the current domain + * @link http://www.php.net/manual/en/function.gettext.php + * @param message string

+ * The message being translated. + *

+ * @return string a translated string if one is found in the + * translation table, or the submitted message if not found. + * + * @jms-builtin + */ +function gettext ($message) {} + +/** + * @param msgid + * + * @jms-builtin + */ +function _ ($msgid) {} + +/** + * Override the current domain + * @link http://www.php.net/manual/en/function.dgettext.php + * @param domain string

+ * The domain + *

+ * @param message string

+ * The message + *

+ * @return string A string on success. + * + * @jms-builtin + */ +function dgettext ($domain, $message) {} + +/** + * Overrides the domain for a single lookup + * @link http://www.php.net/manual/en/function.dcgettext.php + * @param domain string

+ * The domain + *

+ * @param message string

+ * The message + *

+ * @param category int

+ * The category + *

+ * @return string A string on success. + * + * @jms-builtin + */ +function dcgettext ($domain, $message, $category) {} + +/** + * Sets the path for a domain + * @link http://www.php.net/manual/en/function.bindtextdomain.php + * @param domain string

+ * The domain + *

+ * @param directory string

+ * The directory path + *

+ * @return string The full pathname for the domain currently being set. + * + * @jms-builtin + */ +function bindtextdomain ($domain, $directory) {} + +/** + * Plural version of gettext + * @link http://www.php.net/manual/en/function.ngettext.php + * @param msgid1 string

+ *

+ * @param msgid2 string

+ *

+ * @param n int

+ *

+ * @return string correct plural form of message identified by + * msgid1 and msgid2 + * for count n. + * + * @jms-builtin + */ +function ngettext ($msgid1, $msgid2, $n) {} + +/** + * Plural version of dgettext + * @link http://www.php.net/manual/en/function.dngettext.php + * @param domain string

+ * The domain + *

+ * @param msgid1 string

+ *

+ * @param msgid2 string

+ *

+ * @param n int

+ *

+ * @return string A string on success. + * + * @jms-builtin + */ +function dngettext ($domain, $msgid1, $msgid2, $n) {} + +/** + * Plural version of dcgettext + * @link http://www.php.net/manual/en/function.dcngettext.php + * @param domain string

+ * The domain + *

+ * @param msgid1 string

+ *

+ * @param msgid2 string

+ *

+ * @param n int

+ *

+ * @param category int

+ *

+ * @return string A string on success. + * + * @jms-builtin + */ +function dcngettext ($domain, $msgid1, $msgid2, $n, $category) {} + +/** + * Specify the character encoding in which the messages from the DOMAIN message catalog will be returned + * @link http://www.php.net/manual/en/function.bind-textdomain-codeset.php + * @param domain string

+ * The domain + *

+ * @param codeset string

+ * The code set + *

+ * @return string A string on success. + * + * @jms-builtin + */ +function bind_textdomain_codeset ($domain, $codeset) {} + +// End of gettext v. +?> diff --git a/res/php-5.3-core-api/hash.php b/res/php-5.3-core-api/hash.php new file mode 100644 index 0000000..6fc6b0b --- /dev/null +++ b/res/php-5.3-core-api/hash.php @@ -0,0 +1,219 @@ + + * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) + *

+ * @param data string

+ * Message to be hashed. + *

+ * @param raw_output bool[optional]

+ * When set to true, outputs raw binary data. + * false outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * + * @jms-builtin + */ +function hash ($algo, $data, $raw_output = null) {} + +/** + * Generate a hash value using the contents of a given file + * @link http://www.php.net/manual/en/function.hash-file.php + * @param algo string

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) + *

+ * @param filename string

+ * URL describing location of file to be hashed; Supports fopen wrappers. + *

+ * @param raw_output bool[optional]

+ * When set to true, outputs raw binary data. + * false outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * + * @jms-builtin + */ +function hash_file ($algo, $filename, $raw_output = null) {} + +/** + * Generate a keyed hash value using the HMAC method + * @link http://www.php.net/manual/en/function.hash-hmac.php + * @param algo string

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) See hash_algos for a list of supported algorithms. + *

+ * @param data string

+ * Message to be hashed. + *

+ * @param key string

+ * Shared secret key used for generating the HMAC variant of the message digest. + *

+ * @param raw_output bool[optional]

+ * When set to true, outputs raw binary data. + * false outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * + * @jms-builtin + */ +function hash_hmac ($algo, $data, $key, $raw_output = null) {} + +/** + * Generate a keyed hash value using the HMAC method and the contents of a given file + * @link http://www.php.net/manual/en/function.hash-hmac-file.php + * @param algo string

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) See hash_algos for a list of supported algorithms. + *

+ * @param filename string

+ * URL describing location of file to be hashed; Supports fopen wrappers. + *

+ * @param key string

+ * Shared secret key used for generating the HMAC variant of the message digest. + *

+ * @param raw_output bool[optional]

+ * When set to true, outputs raw binary data. + * false outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * + * @jms-builtin + */ +function hash_hmac_file ($algo, $filename, $key, $raw_output = null) {} + +/** + * Initialize an incremental hashing context + * @link http://www.php.net/manual/en/function.hash-init.php + * @param algo string

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) + *

+ * @param options int[optional]

+ * Optional settings for hash generation, currently supports only one option: + * HASH_HMAC. When specified, the key + * must be specified. + *

+ * @param key string[optional]

+ * When HASH_HMAC is specified for options, + * a shared secret key to be used with the HMAC hashing method must be supplied in this + * parameter. + *

+ * @return resource a Hashing Context resource for use with hash_update, + * hash_update_stream, hash_update_file, + * and hash_final. + * + * @jms-builtin + */ +function hash_init ($algo, $options = null, $key = null) {} + +/** + * Pump data into an active hashing context + * @link http://www.php.net/manual/en/function.hash-update.php + * @param context resource

+ * Hashing context returned by hash_init. + *

+ * @param data string

+ * Message to be included in the hash digest. + *

+ * @return bool true. + * + * @jms-builtin + */ +function hash_update ($context, $data) {} + +/** + * Pump data into an active hashing context from an open stream + * @link http://www.php.net/manual/en/function.hash-update-stream.php + * @param context resource

+ * Hashing context returned by hash_init. + *

+ * @param handle resource

+ * Open file handle as returned by any stream creation function. + *

+ * @param length int[optional]

+ * Maximum number of characters to copy from handle + * into the hashing context. + *

+ * @return int Actual number of bytes added to the hashing context from handle. + * + * @jms-builtin + */ +function hash_update_stream ($context, $handle, $length = null) {} + +/** + * Pump data into an active hashing context from a file + * @link http://www.php.net/manual/en/function.hash-update-file.php + * @param resource resource

+ * Stream context as returned by stream_context_create. + *

+ * @param filename string

+ * URL describing location of file to be hashed; Supports fopen wrappers. + *

+ * @param context resource[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function hash_update_file ($resource, $filename, $context = null) {} + +/** + * Finalize an incremental hash and return resulting digest + * @link http://www.php.net/manual/en/function.hash-final.php + * @param context resource

+ * Hashing context returned by hash_init. + *

+ * @param raw_output bool[optional]

+ * When set to true, outputs raw binary data. + * false outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * + * @jms-builtin + */ +function hash_final ($context, $raw_output = null) {} + +/** + * Copy hashing context + * @link http://www.php.net/manual/en/function.hash-copy.php + * @param context resource

+ * Hashing context returned by hash_init. + *

+ * @return resource a copy of Hashing Context resource. + * + * @jms-builtin + */ +function hash_copy ($context) {} + +/** + * Return a list of registered hashing algorithms + * @link http://www.php.net/manual/en/function.hash-algos.php + * @return array a numerically indexed array containing the list of supported + * hashing algorithms. + * + * @jms-builtin + */ +function hash_algos () {} + + +/** + * Optional flag for hash_init. + * Indicates that the HMAC digest-keying algorithm should be + * applied to the current hashing context. + * @link http://www.php.net/manual/en/hash.constants.php + */ +define ('HASH_HMAC', 1); + +// End of hash v.1.0 +?> diff --git a/res/php-5.3-core-api/ibm_db2.php b/res/php-5.3-core-api/ibm_db2.php new file mode 100644 index 0000000..c634581 --- /dev/null +++ b/res/php-5.3-core-api/ibm_db2.php @@ -0,0 +1,1844 @@ + + * For a cataloged connection to a database, database + * represents the database alias in the DB2 client catalog. + *

+ *

+ * For an uncataloged connection to a database, + * database represents a complete connection + * string in the following format: + * DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password; + * where the parameters represent the following values: + * database + *

+ * The name of the database. + *

+ * @param username string

+ * The username with which you are connecting to the database. + *

+ *

+ * For uncataloged connections, you must pass a &null; value or empty + * string. + *

+ * @param password string

+ * The password with which you are connecting to the database. + *

+ *

+ * For uncataloged connections, you must pass a &null; value or empty + * string. + *

+ * @param options array[optional]

+ * An associative array of connection options that affect the behavior + * of the connection, where valid array keys include: + * autocommit + *

+ * Passing the DB2_AUTOCOMMIT_ON value turns + * autocommit on for this connection handle. + *

+ *

+ * Passing the DB2_AUTOCOMMIT_OFF value turns + * autocommit off for this connection handle. + *

+ * @return resource a connection handle resource if the connection attempt is + * successful. If the connection attempt fails, db2_connect + * returns false. + */ +function db2_connect ($database, $username, $password, array $options = null) {} + +/** + * Commits a transaction + * @link http://php.net/manual/en/function.db2-commit.php + * @param connection resource

+ * A valid database connection resource variable as returned from + * db2_connect or db2_pconnect. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_commit ($connection) {} + +/** + * Returns a persistent connection to a database + * @link http://php.net/manual/en/function.db2-pconnect.php + * @param database string

+ * The database alias in the DB2 client catalog. + *

+ * @param username string

+ * The username with which you are connecting to the database. + *

+ * @param password string

+ * The password with which you are connecting to the database. + *

+ * @param options array[optional]

+ * An associative array of connection options that affect the behavior + * of the connection, where valid array keys include: + * autocommit + *

+ * Passing the DB2_AUTOCOMMIT_ON value turns + * autocommit on for this connection handle. + *

+ *

+ * Passing the DB2_AUTOCOMMIT_OFF value turns + * autocommit off for this connection handle. + *

+ * @return resource a connection handle resource if the connection attempt is + * successful. db2_pconnect tries to reuse an existing + * connection resource that exactly matches the + * database, username, and + * password parameters. If the connection attempt fails, + * db2_pconnect returns false. + */ +function db2_pconnect ($database, $username, $password, array $options = null) {} + +/** + * Returns or sets the AUTOCOMMIT state for a database connection + * @link http://php.net/manual/en/function.db2-autocommit.php + * @param connection resource

+ * A valid database connection resource variable as returned from + * db2_connect or db2_pconnect. + *

+ * @param value bool[optional]

+ * One of the following constants: + * DB2_AUTOCOMMIT_OFF + *

+ * Turns AUTOCOMMIT off. + *

+ * @return mixed When db2_autocommit receives only the + * connection parameter, it returns the current state + * of AUTOCOMMIT for the requested connection as an integer value. A value of + * 0 indicates that AUTOCOMMIT is off, while a value of 1 indicates that + * AUTOCOMMIT is on. + *

+ *

+ * When db2_autocommit receives both the + * connection parameter and + * autocommit parameter, it attempts to set the + * AUTOCOMMIT state of the requested connection to the corresponding state. + * Returns true on success or false on failure. + */ +function db2_autocommit ($connection, $value = null) {} + +/** + * Binds a PHP variable to an SQL statement parameter + * @link http://php.net/manual/en/function.db2-bind-param.php + * @param stmt resource

+ * A prepared statement returned from db2_prepare. + *

+ * @param parameter_number int + * @param variable_name string + * @param parameter_type int[optional] + * @param data_type int[optional] + * @param precision int[optional]

+ * Specifies the precision with which the variable should be bound to the + * database. This parameter can also be used for retrieving XML output values + * from stored procedures. A non-negative value specifies the maximum size of + * the XML data that will be retrieved from the database. If this parameter + * is not used, a default of 1MB will be assumed for retrieving the XML + * output value from the stored procedure.� + *

+ * @param scale int[optional]

+ * Specifies the scale with which the variable should be bound to the + * database. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_bind_param ($stmt, $parameter_number, $variable_name, $parameter_type = null, $data_type = null, $precision = null, $scale = null) {} + +/** + * Closes a database connection + * @link http://php.net/manual/en/function.db2-close.php + * @param connection resource

+ * Specifies an active DB2 client connection. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_close ($connection) {} + +/** + * Returns a result set listing the columns and associated privileges for a table + * @link http://php.net/manual/en/function.db2-column-privileges.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string[optional]

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string[optional]

+ * The schema which contains the tables. To match all schemas, pass &null; + * or an empty string. + *

+ * @param table_name string[optional] + * @param column_name string[optional] + * @return resource a statement resource with a result set containing rows describing + * the column privileges for columns matching the specified parameters. The + * rows are composed of the following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * Name of the catalog. The value is NULL if this table does not + * have catalogs. + * + * + * TABLE_SCHEM + * Name of the schema. + * + * + * TABLE_NAME + * Name of the table or view. + * + * + * COLUMN_NAME + * Name of the column. + * + * + * GRANTOR + * Authorization ID of the user who granted the privilege. + * + * + * GRANTEE + * Authorization ID of the user to whom the privilege was + * granted. + * + * + * PRIVILEGE + * The privilege for the column. + * + * + * IS_GRANTABLE + * Whether the GRANTEE is permitted to grant this privilege to + * other users. + * + */ +function db2_column_privileges ($connection, $qualifier = null, $schema = null, $table_name = null, $column_name = null) {} + +function db2_columnprivileges () {} + +/** + * Returns a result set listing the columns and associated metadata for a table + * @link http://php.net/manual/en/function.db2-columns.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string[optional]

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string[optional]

+ * The schema which contains the tables. To match all schemas, pass + * '%'. + *

+ * @param table_name string[optional] + * @param column_name string[optional] + * @return resource a statement resource with a result set containing rows describing + * the columns matching the specified parameters. The rows are composed of + * the following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * Name of the catalog. The value is NULL if this table does not + * have catalogs. + * + * + * TABLE_SCHEM + * Name of the schema. + * + * + * TABLE_NAME + * Name of the table or view. + * + * + * COLUMN_NAME + * Name of the column. + * + * + * DATA_TYPE + * The SQL data type for the column represented as an integer value. + * + * + * TYPE_NAME + * A string representing the data type for the column. + * + * + * COLUMN_SIZE + * An integer value representing the size of the column. + * + * + * BUFFER_LENGTH + * + * Maximum number of bytes necessary to store data from this column. + * + * + * + * DECIMAL_DIGITS + * + * The scale of the column, or &null; where scale is not applicable. + * + * + * + * NUM_PREC_RADIX + * + * An integer value of either 10 (representing + * an exact numeric data type), 2 (representing an + * approximate numeric data type), or &null; (representing a data type for + * which radix is not applicable). + * + * + * + * NULLABLE + * An integer value representing whether the column is nullable or + * not. + * + * + * REMARKS + * Description of the column. + * + * + * COLUMN_DEF + * Default value for the column. + * + * + * SQL_DATA_TYPE + * An integer value representing the size of the column. + * + * + * SQL_DATETIME_SUB + * + * Returns an integer value representing a datetime subtype code, + * or &null; for SQL data types to which this does not apply. + * + * + * + * CHAR_OCTET_LENGTH + * + * Maximum length in octets for a character data type column, which + * matches COLUMN_SIZE for single-byte character set data, or &null; for + * non-character data types. + * + * + * + * ORDINAL_POSITION + * The 1-indexed position of the column in the table. + * + * + * IS_NULLABLE + * + * A string value where 'YES' means that the column is nullable and + * 'NO' means that the column is not nullable. + * + * + */ +function db2_columns ($connection, $qualifier = null, $schema = null, $table_name = null, $column_name = null) {} + +/** + * Returns a result set listing the foreign keys for a table + * @link http://php.net/manual/en/function.db2-foreign-keys.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema which contains the tables. If schema + * is &null;, db2_foreign_keys matches the schema for + * the current connection. + *

+ * @param table_name string + * @return resource a statement resource with a result set containing rows describing + * the foreign keys for the specified table. The result set is composed of the + * following columns: + * + * Column name + * Description + * + * + * PKTABLE_CAT + * + * Name of the catalog for the table containing the primary key. The + * value is NULL if this table does not have catalogs. + * + * + * + * PKTABLE_SCHEM + * + * Name of the schema for the table containing the primary key. + * + * + * + * PKTABLE_NAME + * Name of the table containing the primary key. + * + * + * PKCOLUMN_NAME + * Name of the column containing the primary key. + * + * + * FKTABLE_CAT + * + * Name of the catalog for the table containing the foreign key. The + * value is NULL if this table does not have catalogs. + * + * + * + * FKTABLE_SCHEM + * + * Name of the schema for the table containing the foreign key. + * + * + * + * FKTABLE_NAME + * Name of the table containing the foreign key. + * + * + * FKCOLUMN_NAME + * Name of the column containing the foreign key. + * + * + * KEY_SEQ + * 1-indexed position of the column in the key. + * + * + * UPDATE_RULE + * + * Integer value representing the action applied to the foreign key + * when the SQL operation is UPDATE. + * + * + * + * DELETE_RULE + * + * Integer value representing the action applied to the foreign key + * when the SQL operation is DELETE. + * + * + * + * FK_NAME + * The name of the foreign key. + * + * + * PK_NAME + * The name of the primary key. + * + * + * DEFERRABILITY + * + * An integer value representing whether the foreign key deferrability is + * SQL_INITIALLY_DEFERRED, SQL_INITIALLY_IMMEDIATE, or + * SQL_NOT_DEFERRABLE. + * + * + */ +function db2_foreign_keys ($connection, $qualifier, $schema, $table_name) {} + +function db2_foreignkeys () {} + +/** + * Returns a result set listing primary keys for a table + * @link http://php.net/manual/en/function.db2-primary-keys.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema which contains the tables. If schema + * is &null;, db2_primary_keys matches the schema for + * the current connection. + *

+ * @param table_name string + * @return resource a statement resource with a result set containing rows describing + * the primary keys for the specified table. The result set is composed of the + * following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * + * Name of the catalog for the table containing the primary key. The + * value is NULL if this table does not have catalogs. + * + * + * + * TABLE_SCHEM + * + * Name of the schema for the table containing the primary key. + * + * + * + * TABLE_NAME + * Name of the table containing the primary key. + * + * + * COLUMN_NAME + * Name of the column containing the primary key. + * + * + * KEY_SEQ + * 1-indexed position of the column in the key. + * + * + * PK_NAME + * The name of the primary key. + * + */ +function db2_primary_keys ($connection, $qualifier, $schema, $table_name) {} + +function db2_primarykeys () {} + +/** + * Returns a result set listing stored procedure parameters + * @link http://php.net/manual/en/function.db2-procedure-columns.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema which contains the procedures. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @param procedure string

+ * The name of the procedure. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @param parameter string

+ * The name of the parameter. This parameter accepts a search pattern + * containing _ and % as wildcards. + * If this parameter is &null;, all parameters for the specified stored + * procedures are returned. + *

+ * @return resource a statement resource with a result set containing rows describing + * the parameters for the stored procedures matching the specified parameters. + * The rows are composed of the following columns: + * + * Column name + * Description + * + * + * PROCEDURE_CAT + * The catalog that contains the procedure. The value is &null; if + * this table does not have catalogs. + * + * + * PROCEDURE_SCHEM + * Name of the schema that contains the stored procedure. + * + * + * PROCEDURE_NAME + * Name of the procedure. + * + * + * COLUMN_NAME + * Name of the parameter. + * + * + * COLUMN_TYPE + * + *

+ * An integer value representing the type of the parameter: + * + * Return value + * Parameter type + * + * + * 1 (SQL_PARAM_INPUT) + * Input (IN) parameter. + * + * + * 2 (SQL_PARAM_INPUT_OUTPUT) + * Input/output (INOUT) parameter. + * + * + * 3 (SQL_PARAM_OUTPUT) + * Output (OUT) parameter. + * + *

+ * + * + * + * DATA_TYPE + * The SQL data type for the parameter represented as an integer + * value. + * + * + * TYPE_NAME + * A string representing the data type for the parameter. + * + * + * COLUMN_SIZE + * An integer value representing the size of the parameter. + * + * + * BUFFER_LENGTH + * + * Maximum number of bytes necessary to store data for this parameter. + * + * + * + * DECIMAL_DIGITS + * + * The scale of the parameter, or &null; where scale is not applicable. + * + * + * + * NUM_PREC_RADIX + * + * An integer value of either 10 (representing + * an exact numeric data type), 2 (representing an + * approximate numeric data type), or &null; (representing a data type for + * which radix is not applicable). + * + * + * + * NULLABLE + * An integer value representing whether the parameter is nullable + * or not. + * + * + * REMARKS + * Description of the parameter. + * + * + * COLUMN_DEF + * Default value for the parameter. + * + * + * SQL_DATA_TYPE + * An integer value representing the size of the parameter. + * + * + * SQL_DATETIME_SUB + * + * Returns an integer value representing a datetime subtype code, + * or &null; for SQL data types to which this does not apply. + * + * + * + * CHAR_OCTET_LENGTH + * + * Maximum length in octets for a character data type parameter, which + * matches COLUMN_SIZE for single-byte character set data, or &null; for + * non-character data types. + * + * + * + * ORDINAL_POSITION + * The 1-indexed position of the parameter in the CALL + * statement. + * + * + * IS_NULLABLE + * + * A string value where 'YES' means that the parameter accepts or + * returns &null; values and 'NO' means that the parameter does not + * accept or return &null; values. + * + * + */ +function db2_procedure_columns ($connection, $qualifier, $schema, $procedure, $parameter) {} + +function db2_procedurecolumns () {} + +/** + * Returns a result set listing the stored procedures registered in a database + * @link http://php.net/manual/en/function.db2-procedures.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema which contains the procedures. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @param procedure string

+ * The name of the procedure. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @return resource a statement resource with a result set containing rows describing + * the stored procedures matching the specified parameters. The rows are + * composed of the following columns: + * + * Column name + * Description + * + * + * PROCEDURE_CAT + * The catalog that contains the procedure. The value is &null; if + * this table does not have catalogs. + * + * + * PROCEDURE_SCHEM + * Name of the schema that contains the stored procedure. + * + * + * PROCEDURE_NAME + * Name of the procedure. + * + * + * NUM_INPUT_PARAMS + * Number of input (IN) parameters for the stored procedure. + * + * + * NUM_OUTPUT_PARAMS + * Number of output (OUT) parameters for the stored procedure. + * + * + * NUM_RESULT_SETS + * Number of result sets returned by the stored procedure. + * + * + * REMARKS + * Any comments about the stored procedure. + * + * + * PROCEDURE_TYPE + * Always returns 1, indicating that the stored + * procedure does not return a return value. + * + */ +function db2_procedures ($connection, $qualifier, $schema, $procedure) {} + +/** + * Returns a result set listing the unique row identifier columns for a table + * @link http://php.net/manual/en/function.db2-special-columns.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema which contains the tables. + *

+ * @param table_name string

+ * The name of the table. + *

+ * @param scope int

+ * Integer value representing the minimum duration for which the + * unique row identifier is valid. This can be one of the following + * values: + * + * Integer value + * SQL constant + * Description + * + * + * 0 + * SQL_SCOPE_CURROW + * Row identifier is valid only while the cursor is positioned + * on the row. + * + * + * 1 + * SQL_SCOPE_TRANSACTION + * Row identifier is valid for the duration of the + * transaction. + * + * + * 2 + * SQL_SCOPE_SESSION + * Row identifier is valid for the duration of the + * connection. + * + *

+ * @return resource a statement resource with a result set containing rows with unique + * row identifier information for a table. The rows are composed of the + * following columns: + * + * Column name + * Description + * + * + * SCOPE + * + *

+ * + * Integer value + * SQL constant + * Description + * + * + * 0 + * SQL_SCOPE_CURROW + * Row identifier is valid only while the cursor is positioned + * on the row. + * + * + * 1 + * SQL_SCOPE_TRANSACTION + * Row identifier is valid for the duration of the + * transaction. + * + * + * 2 + * SQL_SCOPE_SESSION + * Row identifier is valid for the duration of the + * connection. + * + *

+ * + * + * + * COLUMN_NAME + * Name of the unique column. + * + * + * DATA_TYPE + * SQL data type for the column. + * + * + * TYPE_NAME + * Character string representation of the SQL data type for the + * column. + * + * + * COLUMN_SIZE + * An integer value representing the size of the column. + * + * + * BUFFER_LENGTH + * + * Maximum number of bytes necessary to store data from this column. + * + * + * + * DECIMAL_DIGITS + * + * The scale of the column, or &null; where scale is not applicable. + * + * + * + * NUM_PREC_RADIX + * + * An integer value of either 10 (representing + * an exact numeric data type), 2 (representing an + * approximate numeric data type), or &null; (representing a data type for + * which radix is not applicable). + * + * + * + * PSEUDO_COLUMN + * Always returns 1. + * + */ +function db2_special_columns ($connection, $qualifier, $schema, $table_name, $scope) {} + +function db2_specialcolumns () {} + +/** + * Returns a result set listing the index and statistics for a table + * @link http://php.net/manual/en/function.db2-statistics.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string

+ * The schema that contains the targeted table. If this parameter is + * &null;, the statistics and indexes are returned for the schema of the + * current user. + *

+ * @param table_name string

+ * The name of the table. + *

+ * @param unique bool

+ * An integer value representing the type of index information to return. + * 0 + *

+ * Return only the information for unique indexes on the table. + *

+ * @return resource a statement resource with a result set containing rows describing + * the statistics and indexes for the base tables matching the specified + * parameters. The rows are composed of the following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * The catalog that contains the table. The value is &null; if + * this table does not have catalogs. + * + * + * TABLE_SCHEM + * Name of the schema that contains the table. + * + * + * TABLE_NAME + * Name of the table. + * + * + * NON_UNIQUE + * + *

+ * An integer value representing whether the index prohibits unique + * values, or whether the row represents statistics on the table itself: + * + * Return value + * Parameter type + * + * + * 0 (SQL_FALSE) + * The index allows duplicate values. + * + * + * 1 (SQL_TRUE) + * The index values must be unique. + * + * + * &null; + * This row is statistics information for the table itself. + * + *

+ * + * + * + * INDEX_QUALIFIER + * A string value representing the qualifier that would have to be + * prepended to INDEX_NAME to fully qualify the index. + * + * + * INDEX_NAME + * A string representing the name of the index. + * + * + * TYPE + * + *

+ * An integer value representing the type of information contained in + * this row of the result set: + * + * Return value + * Parameter type + * + * + * 0 (SQL_TABLE_STAT) + * The row contains statistics about the table itself. + * + * + * 1 (SQL_INDEX_CLUSTERED) + * The row contains information about a clustered index. + * + * + * 2 (SQL_INDEX_HASH) + * The row contains information about a hashed index. + * + * + * 3 (SQL_INDEX_OTHER) + * The row contains information about a type of index that + * is neither clustered nor hashed. + * + *

+ * + * + * + * ORDINAL_POSITION + * The 1-indexed position of the column in the index. &null; if + * the row contains statistics information about the table itself. + * + * + * COLUMN_NAME + * The name of the column in the index. &null; if the row + * contains statistics information about the table itself. + * + * + * ASC_OR_DESC + * + * A if the column is sorted in ascending order, + * D if the column is sorted in descending order, + * &null; if the row contains statistics information about the table + * itself. + * + * + * + * CARDINALITY + * + *

+ * If the row contains information about an index, this column contains + * an integer value representing the number of unique values in the + * index. + *

+ *

+ * If the row contains information about the table itself, this column + * contains an integer value representing the number of rows in the + * table. + *

+ * + * + * + * PAGES + * + *

+ * If the row contains information about an index, this column contains + * an integer value representing the number of pages used to store the + * index. + *

+ *

+ * If the row contains information about the table itself, this column + * contains an integer value representing the number of pages used to + * store the table. + *

+ * + * + * + * FILTER_CONDITION + * Always returns &null;. + * + */ +function db2_statistics ($connection, $qualifier, $schema, $table_name, $unique) {} + +/** + * Returns a result set listing the tables and associated privileges in a database + * @link http://php.net/manual/en/function.db2-table-privileges.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string[optional]

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string[optional]

+ * The schema which contains the tables. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @param table_name string[optional]

+ * The name of the table. This parameter accepts a search pattern + * containing _ and % as wildcards. + *

+ * @return resource a statement resource with a result set containing rows describing + * the privileges for the tables that match the specified parameters. The rows + * are composed of the following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * The catalog that contains the table. The value is &null; if + * this table does not have catalogs. + * + * + * TABLE_SCHEM + * Name of the schema that contains the table. + * + * + * TABLE_NAME + * Name of the table. + * + * + * GRANTOR + * Authorization ID of the user who granted the privilege. + * + * + * GRANTEE + * Authorization ID of the user to whom the privilege was + * granted. + * + * + * PRIVILEGE + * + * The privilege that has been granted. This can be one of ALTER, + * CONTROL, DELETE, INDEX, INSERT, REFERENCES, SELECT, or UPDATE. + * + * + * + * IS_GRANTABLE + * + * A string value of "YES" or "NO" indicating whether the grantee + * can grant the privilege to other users. + * + * + */ +function db2_table_privileges ($connection, $qualifier = null, $schema = null, $table_name = null) {} + +function db2_tableprivileges () {} + +/** + * Returns a result set listing the tables and associated metadata in a database + * @link http://php.net/manual/en/function.db2-tables.php + * @param connection resource

+ * A valid connection to an IBM DB2, Cloudscape, or Apache Derby database. + *

+ * @param qualifier string[optional]

+ * A qualifier for DB2 databases running on OS/390 or z/OS servers. For + * other databases, pass &null; or an empty string. + *

+ * @param schema string[optional]

+ * The schema which contains the tables. This parameter accepts a + * search pattern containing _ and % + * as wildcards. + *

+ * @param table_name string[optional] + * @param table_type string[optional] + * @return resource a statement resource with a result set containing rows describing + * the tables that match the specified parameters. The rows are composed of + * the following columns: + * + * Column name + * Description + * + * + * TABLE_CAT + * The catalog that contains the table. The value is &null; if + * this table does not have catalogs. + * + * + * TABLE_SCHEM + * Name of the schema that contains the table. + * + * + * TABLE_NAME + * Name of the table. + * + * + * TABLE_TYPE + * Table type identifier for the table. + * + * + * REMARKS + * Description of the table. + * + */ +function db2_tables ($connection, $qualifier = null, $schema = null, $table_name = null, $table_type = null) {} + +/** + * Executes an SQL statement directly + * @link http://php.net/manual/en/function.db2-exec.php + * @param connection resource

+ * A valid database connection resource variable as returned from + * db2_connect or db2_pconnect. + *

+ * @param statement string

+ * An SQL statement. The statement cannot contain any parameter markers. + *

+ * @param options array[optional]

+ * An associative array containing statement options. You can use this + * parameter to request a scrollable cursor on database servers that + * support this functionality. + * cursor + *

+ * Passing the DB2_FORWARD_ONLY value requests a + * forward-only cursor for this SQL statement. This is the default + * type of cursor, and it is supported by all database servers. It is + * also much faster than a scrollable cursor. + *

+ *

+ * Passing the DB2_SCROLLABLE value requests a + * scrollable cursor for this SQL statement. This type of cursor + * enables you to fetch rows non-sequentially from the database + * server. However, it is only supported by DB2 servers, and is much + * slower than forward-only cursors. + *

+ * @return resource a statement resource if the SQL statement was issued successfully, + * or false if the database failed to execute the SQL statement. + */ +function db2_exec ($connection, $statement, array $options = null) {} + +/** + * Prepares an SQL statement to be executed + * @link http://php.net/manual/en/function.db2-prepare.php + * @param connection resource

+ * A valid database connection resource variable as returned from + * db2_connect or db2_pconnect. + *

+ * @param statement string

+ * An SQL statement, optionally containing one or more parameter markers.. + *

+ * @param options array[optional]

+ * An associative array containing statement options. You can use this + * parameter to request a scrollable cursor on database servers that + * support this functionality. + * cursor + *

+ * Passing the DB2_FORWARD_ONLY value requests a + * forward-only cursor for this SQL statement. This is the default + * type of cursor, and it is supported by all database servers. It is + * also much faster than a scrollable cursor. + *

+ *

+ * Passing the DB2_SCROLLABLE value requests a + * scrollable cursor for this SQL statement. This type of cursor + * enables you to fetch rows non-sequentially from the database + * server. However, it is only supported by DB2 servers, and is much + * slower than forward-only cursors. + *

+ * @return resource a statement resource if the SQL statement was successfully parsed and + * prepared by the database server. Returns false if the database server + * returned an error. You can determine which error was returned by calling + * db2_stmt_error or db2_stmt_errormsg. + */ +function db2_prepare ($connection, $statement, array $options = null) {} + +/** + * Executes a prepared SQL statement + * @link http://php.net/manual/en/function.db2-execute.php + * @param stmt resource

+ * A prepared statement returned from db2_prepare. + *

+ * @param parameters array[optional]

+ * An array of input parameters matching any parameter markers contained + * in the prepared statement. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_execute ($stmt, array $parameters = null) {} + +/** + * Returns a string containing the last SQL statement error message + * @link http://php.net/manual/en/function.db2-stmt-errormsg.php + * @param stmt resource[optional]

+ * A valid statement resource. + *

+ * @return string a string containing the error message and SQLCODE value for the + * last error that occurred issuing an SQL statement. + */ +function db2_stmt_errormsg ($stmt = null) {} + +/** + * Returns the last connection error message and SQLCODE value + * @link http://php.net/manual/en/function.db2-conn-errormsg.php + * @param connection resource[optional]

+ * A connection resource associated with a connection that initially + * succeeded, but which over time became invalid. + *

+ * @return string a string containing the error message and SQLCODE value resulting + * from a failed connection attempt. If there is no error associated with the last + * connection attempt, db2_conn_errormsg returns an empty + * string. + */ +function db2_conn_errormsg ($connection = null) {} + +/** + * Returns a string containing the SQLSTATE returned by the last connection attempt + * @link http://php.net/manual/en/function.db2-conn-error.php + * @param connection resource[optional]

+ * A connection resource associated with a connection that initially + * succeeded, but which over time became invalid. + *

+ * @return string the SQLSTATE value resulting from a failed connection attempt. + * Returns an empty string if there is no error associated with the last + * connection attempt. + */ +function db2_conn_error ($connection = null) {} + +/** + * Returns a string containing the SQLSTATE returned by an SQL statement + * @link http://php.net/manual/en/function.db2-stmt-error.php + * @param stmt resource[optional]

+ * A valid statement resource. + *

+ * @return string a string containing an SQLSTATE value. + */ +function db2_stmt_error ($stmt = null) {} + +/** + * Requests the next result set from a stored procedure + * @link http://php.net/manual/en/function.db2-next-result.php + * @param stmt resource

+ * A prepared statement returned from db2_exec or + * db2_execute. + *

+ * @return resource a new statement resource containing the next result set if the + * stored procedure returned another result set. Returns false if the stored + * procedure did not return another result set. + */ +function db2_next_result ($stmt) {} + +/** + * Returns the number of fields contained in a result set + * @link http://php.net/manual/en/function.db2-num-fields.php + * @param stmt resource

+ * A valid statement resource containing a result set. + *

+ * @return int an integer value representing the number of fields in the result + * set associated with the specified statement resource. Returns false if + * the statement resource is not a valid input value. + */ +function db2_num_fields ($stmt) {} + +/** + * Returns the number of rows affected by an SQL statement + * @link http://php.net/manual/en/function.db2-num-rows.php + * @param stmt resource

+ * A valid stmt resource containing a result set. + *

+ * @return int the number of rows affected by the last SQL statement issued by + * the specified statement handle. + */ +function db2_num_rows ($stmt) {} + +/** + * Returns the name of the column in the result set + * @link http://php.net/manual/en/function.db2-field-name.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return string a string containing the name of the specified column. If the + * specified column does not exist in the result + * set, db2_field_name returns false. + */ +function db2_field_name ($stmt, $column) {} + +/** + * Returns the maximum number of bytes required to display a column + * @link http://php.net/manual/en/function.db2-field-display-size.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return int an integer value with the maximum number of bytes required to + * display the specified column. If the column does not exist in the result + * set, db2_field_display_size returns false. + */ +function db2_field_display_size ($stmt, $column) {} + +/** + * Returns the position of the named column in a result set + * @link http://php.net/manual/en/function.db2-field-num.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return int an integer containing the 0-indexed position of the named column in + * the result set. If the specified column does not exist in the result set, + * db2_field_num returns false. + */ +function db2_field_num ($stmt, $column) {} + +/** + * Returns the precision of the indicated column in a result set + * @link http://php.net/manual/en/function.db2-field-precision.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return int an integer containing the precision of the specified column. If the + * specified column does not exist in the result set, + * db2_field_precision returns false. + */ +function db2_field_precision ($stmt, $column) {} + +/** + * Returns the scale of the indicated column in a result set + * @link http://php.net/manual/en/function.db2-field-scale.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return int an integer containing the scale of the specified column. If the + * specified column does not exist in the result set, + * db2_field_scale returns false. + */ +function db2_field_scale ($stmt, $column) {} + +/** + * Returns the data type of the indicated column in a result set + * @link http://php.net/manual/en/function.db2-field-type.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return string a string containing the defined data type of the specified column. + * If the specified column does not exist in the result set, + * db2_field_type returns false. + */ +function db2_field_type ($stmt, $column) {} + +/** + * Returns the width of the current value of the indicated column in a result set + * @link http://php.net/manual/en/function.db2-field-width.php + * @param stmt resource

+ * Specifies a statement resource containing a result set. + *

+ * @param column mixed

+ * Specifies the column in the result set. This can either be an integer + * representing the 0-indexed position of the column, or a string + * containing the name of the column. + *

+ * @return int an integer containing the width of the specified character or + * binary data type column in a result set. If the specified column does not + * exist in the result set, db2_field_width returns + * false. + */ +function db2_field_width ($stmt, $column) {} + +/** + * Returns the cursor type used by a statement resource + * @link http://php.net/manual/en/function.db2-cursor-type.php + * @param stmt resource

+ * A valid statement resource. + *

+ * @return int either DB2_FORWARD_ONLY if the statement + * resource uses a forward-only cursor or DB2_SCROLLABLE if + * the statement resource uses a scrollable cursor. + */ +function db2_cursor_type ($stmt) {} + +/** + * Rolls back a transaction + * @link http://php.net/manual/en/function.db2-rollback.php + * @param connection resource

+ * A valid database connection resource variable as returned from + * db2_connect or db2_pconnect. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_rollback ($connection) {} + +/** + * Frees resources associated with the indicated statement resource + * @link http://php.net/manual/en/function.db2-free-stmt.php + * @param stmt resource

+ * A valid statement resource. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_free_stmt ($stmt) {} + +/** + * Returns a single column from a row in the result set + * @link http://php.net/manual/en/function.db2-result.php + * @param stmt resource

+ * A valid stmt resource. + *

+ * @param column mixed

+ * Either an integer mapping to the 0-indexed field in the result set, or + * a string matching the name of the column. + *

+ * @return mixed the value of the requested field if the field exists in the result + * set. Returns NULL if the field does not exist, and issues a warning. + */ +function db2_result ($stmt, $column) {} + +/** + * Sets the result set pointer to the next row or requested row + * @link http://php.net/manual/en/function.db2-fetch-row.php + * @param stmt resource

+ * A valid stmt resource. + *

+ * @param row_number int[optional]

+ * With scrollable cursors, you can request a specific row number in the + * result set. Row numbering is 1-indexed. + *

+ * @return bool true if the requested row exists in the result set. Returns + * false if the requested row does not exist in the result set. + */ +function db2_fetch_row ($stmt, $row_number = null) {} + +/** + * Returns an array, indexed by column name, representing a row in a result set + * @link http://php.net/manual/en/function.db2-fetch-assoc.php + * @param stmt resource

+ * A valid stmt resource containing a result set. + *

+ * @param row_number int[optional]

+ * Requests a specific 1-indexed row from the result set. Passing this + * parameter results in a PHP warning if the result set uses a + * forward-only cursor. + *

+ * @return array an associative array with column values indexed by the column name + * representing the next or requested row in the result set. Returns false if + * there are no rows left in the result set, or if the row requested by + * row_number does not exist in the result set. + */ +function db2_fetch_assoc ($stmt, $row_number = null) {} + +/** + * Returns an array, indexed by column position, representing a row in a result set + * @link http://php.net/manual/en/function.db2-fetch-array.php + * @param stmt resource

+ * A valid stmt resource containing a result set. + *

+ * @param row_number int[optional]

+ * Requests a specific 1-indexed row from the result set. Passing this + * parameter results in a PHP warning if the result set uses a + * forward-only cursor. + *

+ * @return array a 0-indexed array with column values indexed by the column position + * representing the next or requested row in the result set. Returns false if + * there are no rows left in the result set, or if the row requested by + * row_number does not exist in the result set. + */ +function db2_fetch_array ($stmt, $row_number = null) {} + +/** + * Returns an array, indexed by both column name and position, representing a row in a result set + * @link http://php.net/manual/en/function.db2-fetch-both.php + * @param stmt resource

+ * A valid stmt resource containing a result set. + *

+ * @param row_number int[optional]

+ * Requests a specific 1-indexed row from the result set. Passing this + * parameter results in a PHP warning if the result set uses a + * forward-only cursor. + *

+ * @return array an associative array with column values indexed by both the column + * name and 0-indexed column number. The array represents the next or + * requested row in the result set. Returns false if there are no rows left + * in the result set, or if the row requested by + * row_number does not exist in the result set. + */ +function db2_fetch_both ($stmt, $row_number = null) {} + +/** + * Frees resources associated with a result set + * @link http://php.net/manual/en/function.db2-free-result.php + * @param stmt resource

+ * A valid statement resource. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_free_result ($stmt) {} + +/** + * Set options for connection or statement resources + * @link http://php.net/manual/en/function.db2-set-option.php + * @param resource resource

+ * A valid statement resource as returned from + * db2_prepare or a valid connection resource as + * returned from db2_connect or + * db2_pconnect. + *

+ * @param options array

+ * An associative array containing valid statement or connection + * options. This parameter can be used to change autocommit values, + * cursor types (scrollable or forward), and to specify the case of + * the column names (lower, upper, or natural) that will appear in a + * result set. + * autocommit + *

+ * Passing DB2_AUTOCOMMIT_ON turns + * autocommit on for the specified connection resource. + *

+ *

+ * Passing DB2_AUTOCOMMIT_OFF turns + * autocommit off for the specified connection resource. + *

+ * @param type int

+ * An integer value that specifies the type of resource that was + * passed into the function. The type of resource and this value + * must correspond. + *

+ * Passing 1 as the value specifies that + * a connection resource has been passed into the function. + *

+ *

+ * Passing any integer not equal to 1 as + * the value specifies that a statement resource has been + * passed into the function. + *

+ * @return bool Returns true on success or false on failure. + */ +function db2_set_option ($resource, array $options, $type) {} + +function db2_setoption () {} + +/** + * Returns an object with properties representing columns in the fetched row + * @link http://php.net/manual/en/function.db2-fetch-object.php + * @param stmt resource

+ * A valid stmt resource containing a result set. + *

+ * @param row_number int[optional]

+ * Requests a specific 1-indexed row from the result set. Passing this + * parameter results in a PHP warning if the result set uses a + * forward-only cursor. + *

+ * @return object an object representing a single row in the result set. The + * properties of the object map to the names of the columns in the result set. + *

+ *

+ * The IBM DB2, Cloudscape, and Apache Derby database servers typically fold + * column names to upper-case, so the object properties will reflect that case. + *

+ *

+ * If your SELECT statement calls a scalar function to modify the value + * of a column, the database servers return the column number as the name of + * the column in the result set. If you prefer a more descriptive column name + * and object property, you can use the AS clause to assign a name to the + * column in the result set. + *

+ *

+ * Returns false if no row was retrieved. + */ +function db2_fetch_object ($stmt, $row_number = null) {} + +/** + * Returns an object with properties that describe the DB2 database server + * @link http://php.net/manual/en/function.db2-server-info.php + * @param connection resource

+ * Specifies an active DB2 client connection. + *

+ * @return object an object on a successful call. Returns false on failure. + */ +function db2_server_info ($connection) {} + +/** + * Returns an object with properties that describe the DB2 database client + * @link http://php.net/manual/en/function.db2-client-info.php + * @param connection resource

+ * Specifies an active DB2 client connection. + *

+ * @return object an object on a successful call. Returns false on failure. + */ +function db2_client_info ($connection) {} + +/** + * Used to escape certain characters + * @link http://php.net/manual/en/function.db2-escape-string.php + * @param string_literal string

+ * The string that contains special characters that need to be modified. + * Characters that are prepended with a backslash are \x00, + * \n, \r, \, + * ', " and \x1a. + *

+ * @return string string_literal with the special characters + * noted above prepended with backslashes. + */ +function db2_escape_string ($string_literal) {} + +/** + * Gets a user defined size of LOB files with each invocation + * @link http://php.net/manual/en/function.db2-lob-read.php + * @param stmt resource

+ * A valid stmt resource containing LOB data. + *

+ * @param colnum int

+ * A valid column number in the result set of the stmt resource. + *

+ * @param length int

+ * The size of the LOB data to be retrieved from the stmt resource. + *

+ * @return string the amount of data the user specifies. Returns + * false if the data cannot be retrieved. + */ +function db2_lob_read ($stmt, $colnum, $length) {} + +/** + * Retrieves an option value for a statement resource or a connection resource + * @link http://php.net/manual/en/function.db2-get-option.php + * @param resource resource

+ * A valid statement resource as returned from + * db2_prepare or a valid connection resource as + * returned from db2_connect or + * db2_pconnect. + *

+ * @param option string

+ * A valid statement or connection options. The following new options are available + * as of ibm_db2 version 1.6.0. They provide useful tracking information + * that can be set during execution with db2_get_option. + * Note + *

+ * Prior versions of ibm_db2 do not support these new options. + *

+ *

+ * When the value in each option is being set, some servers might not handle + * the entire length provided and might truncate the value. + *

+ *

+ * To ensure that the data specified in each option is converted correctly + * when transmitted to a host system, use only the characters A through Z, + * 0 through 9, and the underscore (_) or period (.). + *

+ * userid + *

+ * SQL_ATTR_INFO_USERID - A pointer to a null-terminated + * character string used to identify the client user ID sent to the host + * database server when using DB2 Connect. + * Note + *

+ * DB2 for z/OS and OS/390 servers support up to a length of 16 characters. + * This user-id is not to be confused with the authentication user-id, it is for + * identification purposes only and is not used for any authorization. + *

+ *

+ * @return string the current setting of the connection attribute provided on success + * or false on failure. + */ +function db2_get_option ($resource, $option) {} + +function db2_getoption () {} + + +/** + * Specifies that binary data shall be returned as is. This is the default + * mode. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_BINARY', 1); + +/** + * Specifies that binary data shall be converted to a hexadecimal encoding + * and returned as an ASCII string. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_CONVERT', 2); + +/** + * Specifies that binary data shall be converted to a &null; value. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_PASSTHRU', 3); + +/** + * Specifies a scrollable cursor for a statement resource. This mode enables + * random access to rows in a result set, but currently is supported only by + * IBM DB2 Universal Database. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_SCROLLABLE', 1); + +/** + * Specifies a forward-only cursor for a statement resource. This is the + * default cursor type and is supported on all database servers. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_FORWARD_ONLY', 0); + +/** + * Specifies the PHP variable should be bound as an IN parameter for a + * stored procedure. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_PARAM_IN', 1); + +/** + * Specifies the PHP variable should be bound as an OUT parameter for a + * stored procedure. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_PARAM_OUT', 4); + +/** + * Specifies the PHP variable should be bound as an INOUT parameter for a + * stored procedure. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_PARAM_INOUT', 2); + +/** + * Specifies that the column should be bound directly to a file for input. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_PARAM_FILE', 11); + +/** + * Specifies that autocommit should be turned on. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_AUTOCOMMIT_ON', 1); + +/** + * Specifies that autocommit should be turned off. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_AUTOCOMMIT_OFF', 0); + +/** + * Specifies that deferred prepare should be turned on for the specified statement resource. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_DEFERRED_PREPARE_ON', 1); + +/** + * Specifies that deferred prepare should be turned off for the specified statement resource. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_DEFERRED_PREPARE_OFF', 0); + +/** + * Specifies that the variable should be bound as a DOUBLE, FLOAT, or REAL + * data type. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_DOUBLE', 8); + +/** + * Specifies that the variable should be bound as a SMALLINT, INTEGER, or + * BIGINT data type. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_LONG', 4); + +/** + * Specifies that the variable should be bound as a CHAR or VARCHAR data type. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_CHAR', 1); +define ('DB2_XML', -370); + +/** + * Specifies that column names will be returned in their natural case. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_CASE_NATURAL', 0); + +/** + * Specifies that column names will be returned in lower case. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_CASE_LOWER', 1); + +/** + * Specifies that column names will be returned in upper case. + * @link http://php.net/manual/en/ibm-db2.constants.php + */ +define ('DB2_CASE_UPPER', 2); + +// End of ibm_db2 v.1.6.0 +?> diff --git a/res/php-5.3-core-api/iconv.php b/res/php-5.3-core-api/iconv.php new file mode 100644 index 0000000..53722ab --- /dev/null +++ b/res/php-5.3-core-api/iconv.php @@ -0,0 +1,458 @@ + + * The input charset. + *

+ * @param out_charset string

+ * The output charset. + *

+ *

+ * If you append the string //TRANSLIT to + * out_charset transliteration is activated. This + * means that when a character can't be represented in the target charset, + * it can be approximated through one or several similarly looking + * characters. If you append the string //IGNORE, + * characters that cannot be represented in the target charset are silently + * discarded. Otherwise, str is cut from the first + * illegal character and an E_NOTICE is generated. + *

+ * @param str string

+ * The string to be converted. + *

+ * @return string the converted string&return.falseforfailure;. + * + * @jms-builtin + */ +function iconv ($in_charset, $out_charset, $str) {} + +/** + * Convert character encoding as output buffer handler + * @link http://www.php.net/manual/en/function.ob-iconv-handler.php + * @param contents string + * @param status int + * @return string See ob_start for information about this handler + * return values. + * + * @jms-builtin + */ +function ob_iconv_handler ($contents, $status) {} + +/** + * Retrieve internal configuration variables of iconv extension + * @link http://www.php.net/manual/en/function.iconv-get-encoding.php + * @param type string[optional]

+ * The value of the optional type can be: + * all + * input_encoding + * output_encoding + * internal_encoding + *

+ * @return mixed the current value of the internal configuration variable if + * successful&return.falseforfailure;. + *

+ *

+ * If type is omitted or set to "all", + * iconv_get_encoding returns an array that + * stores all these variables. + * + * @jms-builtin + */ +function iconv_get_encoding ($type = null) {} + +/** + * Set current setting for character encoding conversion + * @link http://www.php.net/manual/en/function.iconv-set-encoding.php + * @param type string

+ * The value of type can be any one of those: + * input_encoding + * output_encoding + * internal_encoding + *

+ * @param charset string

+ * The character set. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function iconv_set_encoding ($type, $charset) {} + +/** + * Returns the character count of string + * @link http://www.php.net/manual/en/function.iconv-strlen.php + * @param str string

+ * The string. + *

+ * @param charset string[optional]

+ * If charset parameter is omitted, + * str is assumed to be encoded in + * iconv.internal_encoding. + *

+ * @return int the character count of str, as an integer. + * + * @jms-builtin + */ +function iconv_strlen ($str, $charset = null) {} + +/** + * Cut out part of a string + * @link http://www.php.net/manual/en/function.iconv-substr.php + * @param str string

+ * The original string. + *

+ * @param offset int

+ * If offset is non-negative, + * iconv_substr cuts the portion out of + * str beginning at offset'th + * character, counting from zero. + *

+ *

+ * If offset is negative, + * iconv_substr cuts out the portion beginning + * at the position, offset characters + * away from the end of str. + *

+ * @param length int[optional]

+ * If length is given and is positive, the return + * value will contain at most length characters + * of the portion that begins at offset + * (depending on the length of string). + *

+ *

+ * If negative length is passed, + * iconv_substr cuts the portion out of + * str from the offset'th + * character up to the character that is + * length characters away from the end of the string. + * In case offset is also negative, the start position + * is calculated beforehand according to the rule explained above. + *

+ * @param charset string[optional]

+ * If charset parameter is omitted, + * string are assumed to be encoded in + * iconv.internal_encoding. + *

+ *

+ * Note that offset and length + * parameters are always deemed to represent offsets that are + * calculated on the basis of the character set determined by + * charset, whilst the counterpart + * substr always takes these for byte offsets. + *

+ * @return string the portion of str specified by the + * offset and length parameters. + *

+ *

+ * If str is shorter than offset + * characters long, false will be returned. + * + * @jms-builtin + */ +function iconv_substr ($str, $offset, $length = null, $charset = null) {} + +/** + * Finds position of first occurrence of a needle within a haystack + * @link http://www.php.net/manual/en/function.iconv-strpos.php + * @param haystack string

+ * The entire string. + *

+ * @param needle string

+ * The searched substring. + *

+ * @param offset int[optional]

+ * The optional offset parameter specifies + * the position from which the search should be performed. + *

+ * @param charset string[optional]

+ * If charset parameter is omitted, + * string are assumed to be encoded in + * iconv.internal_encoding. + *

+ * @return int the numeric position of the first occurrence of + * needle in haystack. + *

+ *

+ * If needle is not found, + * iconv_strpos will return false. + * + * @jms-builtin + */ +function iconv_strpos ($haystack, $needle, $offset = null, $charset = null) {} + +/** + * Finds the last occurrence of a needle within a haystack + * @link http://www.php.net/manual/en/function.iconv-strrpos.php + * @param haystack string

+ * The entire string. + *

+ * @param needle string

+ * The searched substring. + *

+ * @param charset string[optional]

+ * If charset parameter is omitted, + * string are assumed to be encoded in + * iconv.internal_encoding. + *

+ * @return int the numeric position of the last occurrence of + * needle in haystack. + * The characters are counted + * on the basis of the specified character set charset. + *

+ *

+ * If needle is not found, + * iconv_strrpos will return false. + * + * @jms-builtin + */ +function iconv_strrpos ($haystack, $needle, $charset = null) {} + +/** + * Composes a MIME header field + * @link http://www.php.net/manual/en/function.iconv-mime-encode.php + * @param field_name string

+ * The field name. + *

+ * @param field_value string

+ * The field value. + *

+ * @param preferences array[optional]

+ * You can control the behaviour of iconv_mime_encode + * by specifying an associative array that contains configuration items + * to the optional third parameter preferences. + * The items supported by iconv_mime_encode are + * listed below. Note that item names are treated case-sensitive. + * + * Configuration items supported by iconv_mime_encode + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ItemTypeDescriptionDefault valueExample
schemestring + * Specifies the method to encode a field value by. The value of + * this item may be either "B" or "Q", where "B" stands for + * base64 encoding scheme and "Q" stands for + * quoted-printable encoding scheme. + * BB
input-charsetstring + * Specifies the character set in which the first parameter + * field_name and the second parameter + * field_value are presented. If not given, + * iconv_mime_encode assumes those parameters + * are presented to it in the + * iconv.internal_encoding + * ini setting. + * + * iconv.internal_encoding + * ISO-8859-1
output-charsetstring + * Specifies the character set to use to compose the + * MIME header. If not given, the same value as + * input-charset will be used. + * + * iconv.internal_encoding + * UTF-8
line-lengthinteger + * Specifies the maximum length of the header lines. The resulting + * header is "folded" to a set of multiple lines in case + * the resulting header field would be longer than the value of this + * parameter, according to + * RFC2822 - Internet Message Format. + * If not given, the length will be limited to 76 characters. + * 76996
line-break-charsstring + * Specifies the sequence of characters to append to each line + * as an end-of-line sign when "folding" is performed on a long header + * field. If not given, this defaults to "\r\n" + * (CR LF). Note that + * this parameter is always treated as an ASCII string regardless + * of the value of input-charset. + * \r\n\n
+ *

+ * @return string an encoded MIME field on success, + * or false if an error occurs during the encoding. + * + * @jms-builtin + */ +function iconv_mime_encode ($field_name, $field_value, array $preferences = null) {} + +/** + * Decodes a MIME header field + * @link http://www.php.net/manual/en/function.iconv-mime-decode.php + * @param encoded_header string

+ * The encoded header, as a string. + *

+ * @param mode int[optional]

+ * mode determines the behaviour in the event + * iconv_mime_decode encounters a malformed + * MIME header field. You can specify any combination + * of the following bitmasks. + * + * Bitmasks acceptable to iconv_mime_decode + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueConstantDescription
1ICONV_MIME_DECODE_STRICT + * If set, the given header is decoded in full conformance with the + * standards defined in RFC2047. + * This option is disabled by default because there are a lot of + * broken mail user agents that don't follow the specification and don't + * produce correct MIME headers. + *
2ICONV_MIME_DECODE_CONTINUE_ON_ERROR + * If set, iconv_mime_decode_headers + * attempts to ignore any grammatical errors and continue to process + * a given header. + *
+ *

+ * @param charset string[optional]

+ * The optional charset parameter specifies the + * character set to represent the result by. If omitted, + * iconv.internal_encoding + * will be used. + *

+ * @return string a decoded MIME field on success, + * or false if an error occurs during the decoding. + * + * @jms-builtin + */ +function iconv_mime_decode ($encoded_header, $mode = null, $charset = null) {} + +/** + * Decodes multiple MIME header fields at once + * @link http://www.php.net/manual/en/function.iconv-mime-decode-headers.php + * @param encoded_headers string

+ * The encoded headers, as a string. + *

+ * @param mode int[optional]

+ * mode determines the behaviour in the event + * iconv_mime_decode_headers encounters a malformed + * MIME header field. You can specify any combination + * of the following bitmasks. + * + * Bitmasks acceptable to iconv_mime_decode_headers + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueConstantDescription
1ICONV_MIME_DECODE_STRICT + * If set, the given header is decoded in full conformance with the + * standards defined in RFC2047. + * This option is disabled by default because there are a lot of + * broken mail user agents that don't follow the specification and don't + * produce correct MIME headers. + *
2ICONV_MIME_DECODE_CONTINUE_ON_ERROR + * If set, iconv_mime_decode_headers + * attempts to ignore any grammatical errors and continue to process + * a given header. + *
+ *

+ * @param charset string[optional]

+ * The optional charset parameter specifies the + * character set to represent the result by. If omitted, + * iconv.internal_encoding + * will be used. + *

+ * @return array an associative array that holds a whole set of + * MIME header fields specified by + * encoded_headers on success, or false + * if an error occurs during the decoding. + *

+ *

+ * Each key of the return value represents an individual + * field name and the corresponding element represents a field value. + * If more than one field of the same name are present, + * iconv_mime_decode_headers automatically incorporates + * them into a numerically indexed array in the order of occurrence. + * + * @jms-builtin + */ +function iconv_mime_decode_headers ($encoded_headers, $mode = null, $charset = null) {} + + +/** + * string + * @link http://www.php.net/manual/en/iconv.constants.php + */ +define ('ICONV_IMPL', "glibc"); + +/** + * string + * @link http://www.php.net/manual/en/iconv.constants.php + */ +define ('ICONV_VERSION', "2.11.1"); + +/** + * integer + * @link http://www.php.net/manual/en/iconv.constants.php + */ +define ('ICONV_MIME_DECODE_STRICT', 1); + +/** + * integer + * @link http://www.php.net/manual/en/iconv.constants.php + */ +define ('ICONV_MIME_DECODE_CONTINUE_ON_ERROR', 2); + +// End of iconv v. +?> diff --git a/res/php-5.3-core-api/imagick.php b/res/php-5.3-core-api/imagick.php new file mode 100644 index 0000000..8df5358 --- /dev/null +++ b/res/php-5.3-core-api/imagick.php @@ -0,0 +1,5356 @@ + + * One of the layer method constants. + *

+ * @return Imagick &imagick.return.success; + */ + public function compareimagelayers ($method) {} + + /** + * Quickly fetch attributes + * @link http://www.php.net/manual/en/function.imagick-pingimageblob.php + * @param image string

+ * A string containing the image. + *

+ * @return bool &imagick.return.success; + */ + public function pingimageblob ($image) {} + + /** + * Get basic image attributes in a lightweight manner + * @link http://www.php.net/manual/en/function.imagick-pingimagefile.php + * @param filehandle resource

+ * An open filehandle to the image. + *

+ * @param fileName string[optional]

+ * Optional filename for this image. + *

+ * @return bool &imagick.return.success; + */ + public function pingimagefile ($filehandle, $fileName = null) {} + + /** + * Creates a vertical mirror image + * @link http://www.php.net/manual/en/function.imagick-transposeimage.php + * @return bool &imagick.return.success; + */ + public function transposeimage () {} + + /** + * Creates a horizontal mirror image + * @link http://www.php.net/manual/en/function.imagick-transverseimage.php + * @return bool &imagick.return.success; + */ + public function transverseimage () {} + + /** + * Remove edges from the image + * @link http://www.php.net/manual/en/function.imagick-trimimage.php + * @param fuzz float

+ * By default target must match a particular pixel color exactly. + * However, in many cases two colors may differ by a small amount. + * The fuzz member of image defines how much tolerance is acceptable + * to consider two colors as the same. This parameter represents the variation + * on the quantum range. + *

+ * @return bool &imagick.return.success; + */ + public function trimimage ($fuzz) {} + + /** + * Applies wave filter to the image + * @link http://www.php.net/manual/en/function.imagick-waveimage.php + * @param amplitude float

+ * The amplitude of the wave. + *

+ * @param length float

+ * The length of the wave. + *

+ * @return bool &imagick.return.success; + */ + public function waveimage ($amplitude, $length) {} + + /** + * Adds vignette filter to the image + * @link http://www.php.net/manual/en/function.imagick-vignetteimage.php + * @param blackPoint float

+ * The black point. + *

+ * @param whitePoint float

+ * The white point + *

+ * @param x int

+ * X offset of the ellipse + *

+ * @param y int

+ * Y offset of the ellipse + *

+ * @return bool &imagick.return.success; + */ + public function vignetteimage ($blackPoint, $whitePoint, $x, $y) {} + + /** + * Discards all but one of any pixel color + * @link http://www.php.net/manual/en/function.imagick-uniqueimagecolors.php + * @return bool &imagick.return.success; + */ + public function uniqueimagecolors () {} + + /** + * Return if the image has a matte channel + * @link http://www.php.net/manual/en/function.imagick-getimagematte.php + * @return int Returns true on success or false on failure. + */ + public function getimagematte () {} + + /** + * Sets the image matte channel + * @link http://www.php.net/manual/en/function.imagick-setimagematte.php + * @param matte bool

+ * True activates the matte channel and false disables it. + *

+ * @return bool &imagick.return.success; + */ + public function setimagematte ($matte) {} + + /** + * Adaptively resize image with data dependent triangulation + * @link http://www.php.net/manual/en/function.imagick-adaptiveresizeimage.php + * @param columns int

+ * The number of columns in the scaled image. + *

+ * @param rows int

+ * The number of rows in the scaled image. + *

+ * @param bestfit bool[optional]

+ * Whether to fit the image inside a bounding box. + *

+ * @return bool &imagick.return.success; + */ + public function adaptiveresizeimage ($columns, $rows, $bestfit = null) {} + + /** + * Simulates a pencil sketch + * @link http://www.php.net/manual/en/function.imagick-sketchimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param angle float

+ * Apply the effect along this angle. + *

+ * @return bool &imagick.return.success; + */ + public function sketchimage ($radius, $sigma, $angle) {} + + /** + * Creates a 3D effect + * @link http://www.php.net/manual/en/function.imagick-shadeimage.php + * @param gray bool

+ * A value other than zero shades the intensity of each pixel. + *

+ * @param azimuth float

+ * Defines the light source direction. + *

+ * @param elevation float

+ * Defines the light source direction. + *

+ * @return bool &imagick.return.success; + */ + public function shadeimage ($gray, $azimuth, $elevation) {} + + /** + * Returns the size offset + * @link http://www.php.net/manual/en/function.imagick-getsizeoffset.php + * @return int the size offset associated with the Imagick object. + * &imagick.imagickexception.throw; + */ + public function getsizeoffset () {} + + /** + * Sets the size and offset of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-setsizeoffset.php + * @param columns int

+ * The width in pixels. + *

+ * @param rows int

+ * The height in pixels. + *

+ * @param offset int

+ * The image offset. + *

+ * @return bool &imagick.return.success; + */ + public function setsizeoffset ($columns, $rows, $offset) {} + + /** + * Adds adaptive blur filter to image + * @link http://www.php.net/manual/en/function.imagick-adaptiveblurimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel. + * Provide a value of 0 and the radius will be chosen automagically. + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param channel int[optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function adaptiveblurimage ($radius, $sigma, $channel = null) {} + + /** + * Enhances the contrast of a color image + * @link http://www.php.net/manual/en/function.imagick-contraststretchimage.php + * @param black_point float

+ * The black point. + *

+ * @param white_point float

+ * The white point. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Imagick::CHANNEL_ALL. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function contraststretchimage ($black_point, $white_point, $channel = null) {} + + /** + * Adaptively sharpen the image + * @link http://www.php.net/manual/en/function.imagick-adaptivesharpenimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel. Use 0 for auto-select. + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param channel int[optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function adaptivesharpenimage ($radius, $sigma, $channel = null) {} + + /** + * Creates a high-contrast, two-color image + * @link http://www.php.net/manual/en/function.imagick-randomthresholdimage.php + * @param low float

+ * The low point + *

+ * @param high float

+ * The high point + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function randomthresholdimage ($low, $high, $channel = null) {} + + /** + * Rounds image corners + * @link http://www.php.net/manual/en/function.imagick-roundcorners.php + * @param x_rounding float

+ * x rounding + *

+ * @param y_rounding float

+ * y rounding + *

+ * @param stroke_width float[optional]

+ * stroke width + *

+ * @param displace float[optional]

+ * image displace + *

+ * @param size_correction float[optional]

+ * size correction + *

+ * @return bool &imagick.return.success; + */ + public function roundcorners ($x_rounding, $y_rounding, $stroke_width = null, $displace = null, $size_correction = null) {} + + /** + * Set the iterator position + * @link http://www.php.net/manual/en/function.imagick-setiteratorindex.php + * @param index int

+ * The position to set the iterator to + *

+ * @return bool &imagick.return.success; + */ + public function setiteratorindex ($index) {} + + /** + * Gets the index of the current active image + * @link http://www.php.net/manual/en/function.imagick-getiteratorindex.php + * @return int an integer containing the index of the image in the stack. + * &imagick.imagickexception.throw; + */ + public function getiteratorindex () {} + + /** + * Convenience method for setting crop size and the image geometry + * @link http://www.php.net/manual/en/function.imagick-transformimage.php + * @param crop string

+ * A crop geometry string. This geometry defines a subregion of the image to crop. + *

+ * @param geometry string

+ * An image geometry string. This geometry defines the final size of the image. + *

+ * @return Imagick &imagick.return.success; + */ + public function transformimage ($crop, $geometry) {} + + /** + * Sets the image opacity level + * @link http://www.php.net/manual/en/function.imagick-setimageopacity.php + * @param opacity float

+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully + * transparent. + *

+ * @return bool &imagick.return.success; + */ + public function setimageopacity ($opacity) {} + + /** + * Performs an ordered dither + * @link http://www.php.net/manual/en/function.imagick-orderedposterizeimage.php + * @param threshold_map string

+ * A string containing the name of the threshold dither map to use + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function orderedposterizeimage ($threshold_map, $channel = null) {} + + /** + * Simulates a Polaroid picture + * @link http://www.php.net/manual/en/function.imagick-polaroidimage.php + * @param properties ImagickDraw

+ * The polaroid properties + *

+ * @param angle float

+ * The polaroid angle + *

+ * @return bool &imagick.return.success; + */ + public function polaroidimage (ImagickDraw $properties, $angle) {} + + /** + * Returns the named image property + * @link http://www.php.net/manual/en/function.imagick-getimageproperty.php + * @param name string

+ * name of the property (for example Exif:DateTime) + *

+ * @return string a string containing the image property, false if a + * property with the given name does not exist. + */ + public function getimageproperty ($name) {} + + /** + * Sets an image property + * @link http://www.php.net/manual/en/function.imagick-setimageproperty.php + * @param name string

+ *

+ * @param value string

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageproperty ($name, $value) {} + + /** + * Sets the image interpolate pixel method + * @link http://www.php.net/manual/en/function.imagick-setimageinterpolatemethod.php + * @param method int

+ * The method is one of the Imagick::INTERPOLATE_* constants + *

+ * @return bool &imagick.return.success; + */ + public function setimageinterpolatemethod ($method) {} + + /** + * Returns the interpolation method + * @link http://www.php.net/manual/en/function.imagick-getimageinterpolatemethod.php + * @return int the interpolate method on success. + * &imagick.imagickexception.throw; + */ + public function getimageinterpolatemethod () {} + + /** + * Stretches with saturation the image intensity + * @link http://www.php.net/manual/en/function.imagick-linearstretchimage.php + * @param blackPoint float

+ * The image black point + *

+ * @param whitePoint float

+ * The image white point + *

+ * @return bool &imagick.return.success; + */ + public function linearstretchimage ($blackPoint, $whitePoint) {} + + /** + * Returns the image length in bytes + * @link http://www.php.net/manual/en/function.imagick-getimagelength.php + * @return int an int containing the current image size. + */ + public function getimagelength () {} + + /** + * Set image size + * @link http://www.php.net/manual/en/function.imagick-extentimage.php + * @param width int

+ * The new width + *

+ * @param height int

+ * The new height + *

+ * @param x int

+ * X position for the new size + *

+ * @param y int

+ * Y position for the new size + *

+ * @return bool &imagick.return.success; + */ + public function extentimage ($width, $height, $x, $y) {} + + /** + * Gets the image orientation + * @link http://www.php.net/manual/en/function.imagick-getimageorientation.php + * @return int an int on success. + * &imagick.imagickexception.throw; + */ + public function getimageorientation () {} + + /** + * Sets the image orientation + * @link http://www.php.net/manual/en/function.imagick-setimageorientation.php + * @param orientation int

+ * One of the orientation constants + *

+ * @return bool &imagick.return.success; + */ + public function setimageorientation ($orientation) {} + + /** + * Changes the color value of any pixel that matches target + * @link http://www.php.net/manual/en/function.imagick-paintfloodfillimage.php + * @param fill mixed

+ * ImagickPixel object or a string containing the fill color + *

+ * @param fuzz float

+ * The amount of fuzz. For example, set fuzz to 10 and the color red at + * intensities of 100 and 102 respectively are now interpreted as the + * same color for the purposes of the floodfill. + *

+ * @param bordercolor mixed

+ * ImagickPixel object or a string containing the border color + *

+ * @param x int

+ * X start position of the floodfill + *

+ * @param y int

+ * Y start position of the floodfill + *

+ * @param channel int[optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function paintfloodfillimage ($fill, $fuzz, $bordercolor, $x, $y, $channel = null) {} + + /** + * Replaces colors in the image + * @link http://www.php.net/manual/en/function.imagick-clutimage.php + * @param lookup_table Imagick

+ * Imagick object containing the color lookup table + *

+ * @param channel float[optional]

+ * The Channeltype + * constant. When not supplied, default channels are replaced. + *

+ * @return bool &imagick.return.success; + */ + public function clutimage (Imagick $lookup_table, $channel = null) {} + + /** + * Returns the image properties + * @link http://www.php.net/manual/en/function.imagick-getimageproperties.php + * @param pattern string[optional]

+ * The pattern for property names. + *

+ * @param only_names bool[optional]

+ * Whether to return only property names. If false then also the values are returned + *

+ * @return array an array containing the image properties or property names. + */ + public function getimageproperties ($pattern = null, $only_names = null) {} + + /** + * Returns the image profiles + * @link http://www.php.net/manual/en/function.imagick-getimageprofiles.php + * @param pattern string[optional]

+ * The pattern for profile names. + *

+ * @param only_names bool[optional]

+ * Whether to return only profile names. If false then values are returned as well + *

+ * @return array an array containing the image profiles or profile names. + */ + public function getimageprofiles ($pattern = null, $only_names = null) {} + + /** + * Distorts an image using various distortion methods + * @link http://www.php.net/manual/en/function.imagick-distortimage.php + * @param method int

+ * The method of image distortion. See distortion constants + *

+ * @param arguments array

+ * The arguments for this distortion method + *

+ * @param bestfit bool

+ * Attempt to resize destination to fit distorted source + *

+ * @return bool &imagick.return.success; + */ + public function distortimage ($method, array $arguments, $bestfit) {} + + /** + * Writes an image to a filehandle + * @link http://www.php.net/manual/en/function.imagick-writeimagefile.php + * @param filehandle resource

+ * Filehandle where to write the image + *

+ * @return bool &imagick.return.success; + */ + public function writeimagefile ($filehandle) {} + + /** + * Writes frames to a filehandle + * @link http://www.php.net/manual/en/function.imagick-writeimagesfile.php + * @param filehandle resource

+ * Filehandle where to write the images + *

+ * @return bool &imagick.return.success; + */ + public function writeimagesfile ($filehandle) {} + + /** + * Reset image page + * @link http://www.php.net/manual/en/function.imagick-resetimagepage.php + * @param page string

+ * The page definition. For example 7168x5147+0+0 + *

+ * @return bool &imagick.return.success; + */ + public function resetimagepage ($page) {} + + /** + * Sets image clip mask + * @link http://www.php.net/manual/en/function.imagick-setimageclipmask.php + * @param clip_mask Imagick

+ * The Imagick object containing the clip mask + *

+ * @return bool &imagick.return.success; + */ + public function setimageclipmask (Imagick $clip_mask) {} + + /** + * Gets image clip mask + * @link http://www.php.net/manual/en/function.imagick-getimageclipmask.php + * @return Imagick an Imagick object containing the clip mask. + * &imagick.imagickexception.throw; + */ + public function getimageclipmask () {} + + /** + * Animates an image or images + * @link http://www.php.net/manual/en/function.imagick-animateimages.php + * @param x_server string

+ * X server address + *

+ * @return bool &imagick.return.success; + */ + public function animateimages ($x_server) {} + + /** + * Recolors image + * @link http://www.php.net/manual/en/function.imagick-recolorimage.php + * @param matrix array

+ * The matrix containing the color values + *

+ * @return bool &imagick.return.success; + */ + public function recolorimage (array $matrix) {} + + /** + * Sets font + * @link http://www.php.net/manual/en/function.imagick-setfont.php + * @param font string

+ * Font name or a filename + *

+ * @return bool &imagick.return.success; + */ + public function setfont ($font) {} + + /** + * Gets font + * @link http://www.php.net/manual/en/function.imagick-getfont.php + * @return string the string containing the font name or false if not font is set. + */ + public function getfont () {} + + /** + * Sets point size + * @link http://www.php.net/manual/en/function.imagick-setpointsize.php + * @param point_size float

+ * Point size + *

+ * @return bool &imagick.return.success; + */ + public function setpointsize ($point_size) {} + + /** + * Gets point size + * @link http://www.php.net/manual/en/function.imagick-getpointsize.php + * @return string a &float; containing the point size. + */ + public function getpointsize () {} + + /** + * Merges image layers + * @link http://www.php.net/manual/en/function.imagick-mergeimagelayers.php + * @param layer_method int

+ * One of the Imagick::LAYERMETHOD_* constants + *

+ * @return bool &imagick.return.success; + */ + public function mergeimagelayers ($layer_method) {} + + /** + * The Imagick constructor + * @link http://www.php.net/manual/en/function.imagick-construct.php + * @param files mixed[optional]

+ * The path to an image to load or array of paths + *

+ * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function __construct ($files = null) {} + + public function __tostring () {} + + /** + * Returns a MagickPixelIterator + * @link http://www.php.net/manual/en/function.imagick-getpixeliterator.php + * @return ImagickPixelIterator an ImagickPixelIterator on success. + * &imagick.imagickexception.throw; + */ + public function getpixeliterator () {} + + /** + * Get an ImagickPixelIterator for an image section + * @link http://www.php.net/manual/en/function.imagick-getpixelregioniterator.php + * @param x int

+ * The x-coordinate of the region. + *

+ * @param y int

+ * The y-coordinate of the region. + *

+ * @param columns int

+ * The width of the region. + *

+ * @param rows int

+ * The height of the region. + *

+ * @return ImagickPixelIterator an ImagickPixelIterator for an image section. + * &imagick.imagickexception.throw; + */ + public function getpixelregioniterator ($x, $y, $columns, $rows) {} + + /** + * Reads image from filename + * @link http://www.php.net/manual/en/function.imagick-readimage.php + * @param filename string

+ *

+ * @return bool &imagick.return.success; + */ + public function readimage ($filename) {} + + /** + * @param filenames + */ + public function readimages ($filenames) {} + + /** + * Reads image from a binary string + * @link http://www.php.net/manual/en/function.imagick-readimageblob.php + * @param image string

+ *

+ * @param filename string[optional] + * @return bool &imagick.return.success; + */ + public function readimageblob ($image, $filename = null) {} + + /** + * Sets the format of a particular image + * @link http://www.php.net/manual/en/function.imagick-setimageformat.php + * @param format string

+ * String presentation of the image format. Format support + * depends on the ImageMagick installation. + *

+ * @return bool &imagick.return.success; + */ + public function setimageformat ($format) {} + + /** + * Scales the size of an image + * @link http://www.php.net/manual/en/function.imagick-scaleimage.php + * @param cols int

+ *

+ * @param rows int

+ *

+ * @param bestfit bool[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function scaleimage ($cols, $rows, $bestfit = null) {} + + /** + * Writes an image to the specified filename + * @link http://www.php.net/manual/en/function.imagick-writeimage.php + * @param filename string[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function writeimage ($filename = null) {} + + /** + * Writes an image or image sequence + * @link http://www.php.net/manual/en/function.imagick-writeimages.php + * @param filename string

+ *

+ * @param adjoin bool

+ *

+ * @return bool &imagick.return.success; + */ + public function writeimages ($filename, $adjoin) {} + + /** + * Adds blur filter to image + * @link http://www.php.net/manual/en/function.imagick-blurimage.php + * @param radius float

+ * Blur radius + *

+ * @param sigma float

+ * Standard deviation + *

+ * @param channel int[optional]

+ * The Channeltype + * constant. When not supplied, all channels are blurred. + *

+ * @return bool &imagick.return.success; + */ + public function blurimage ($radius, $sigma, $channel = null) {} + + /** + * Changes the size of an image + * @link http://www.php.net/manual/en/function.imagick-thumbnailimage.php + * @param columns int

+ * Image width + *

+ * @param rows int

+ * Image height + *

+ * @param bestfit bool[optional]

+ * Whether to force maximum values + *

+ * @return bool &imagick.return.success; + */ + public function thumbnailimage ($columns, $rows, $bestfit = null) {} + + /** + * Creates a crop thumbnail + * @link http://www.php.net/manual/en/function.imagick-cropthumbnailimage.php + * @param width int

+ * The width of the thumbnail + *

+ * @param height int

+ * The Height of the thumbnail + *

+ * @return bool &imagick.return.success; + */ + public function cropthumbnailimage ($width, $height) {} + + /** + * Returns the filename of a particular image in a sequence + * @link http://www.php.net/manual/en/function.imagick-getimagefilename.php + * @return string a string with the filename of the image. + * &imagick.imagickexception.throw; + */ + public function getimagefilename () {} + + /** + * Sets the filename of a particular image + * @link http://www.php.net/manual/en/function.imagick-setimagefilename.php + * @param filename string

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagefilename ($filename) {} + + /** + * Returns the format of a particular image in a sequence + * @link http://www.php.net/manual/en/function.imagick-getimageformat.php + * @return string a string containing the image format on success. + * &imagick.imagickexception.throw; + */ + public function getimageformat () {} + + public function getimagemimetype () {} + + /** + * Removes an image from the image list + * @link http://www.php.net/manual/en/function.imagick-removeimage.php + * @return bool &imagick.return.success; + */ + public function removeimage () {} + + /** + * Destroys the Imagick object + * @link http://www.php.net/manual/en/function.imagick-destroy.php + * @return bool &imagick.return.success; + */ + public function destroy () {} + + /** + * Clears all resources associated to Imagick object + * @link http://www.php.net/manual/en/function.imagick-clear.php + * @return bool &imagick.return.success; + */ + public function clear () {} + + /** + * Makes an exact copy of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-clone.php + * @return Imagick + */ + public function clone () {} + + /** + * Returns the image length in bytes + * @link http://www.php.net/manual/en/function.imagick-getimagesize.php + * @return int an int containing the current image size. + */ + public function getimagesize () {} + + /** + * Returns the image sequence as a blob + * @link http://www.php.net/manual/en/function.imagick-getimageblob.php + * @return string a string containing the image. + * &imagick.imagickexception.throw; + */ + public function getimageblob () {} + + /** + * Returns all image sequences as a blob + * @link http://www.php.net/manual/en/function.imagick-getimagesblob.php + * @return string a string containing the images. On failure, throws + * ImagickException. + */ + public function getimagesblob () {} + + /** + * Sets the Imagick iterator to the first image + * @link http://www.php.net/manual/en/function.imagick-setfirstiterator.php + * @return bool &imagick.return.success; + */ + public function setfirstiterator () {} + + /** + * Sets the Imagick iterator to the last image + * @link http://www.php.net/manual/en/function.imagick-setlastiterator.php + * @return bool &imagick.return.success; + */ + public function setlastiterator () {} + + public function resetiterator () {} + + /** + * Move to the previous image in the object + * @link http://www.php.net/manual/en/function.imagick-previousimage.php + * @return bool &imagick.return.success; + */ + public function previousimage () {} + + /** + * Moves to the next image + * @link http://www.php.net/manual/en/function.imagick-nextimage.php + * @return bool &imagick.return.success; + */ + public function nextimage () {} + + /** + * Checks if the object has a previous image + * @link http://www.php.net/manual/en/function.imagick-haspreviousimage.php + * @return bool true if the object has more images when traversing the list in the + * reverse direction, returns false if there are none. + */ + public function haspreviousimage () {} + + /** + * Checks if the object has more images + * @link http://www.php.net/manual/en/function.imagick-hasnextimage.php + * @return bool true if the object has more images when traversing the list in the + * forward direction, returns false if there are none. + */ + public function hasnextimage () {} + + /** + * Set the iterator position + * @link http://www.php.net/manual/en/function.imagick-setimageindex.php + * @param index int

+ * The position to set the iterator to + *

+ * @return bool &imagick.return.success; + */ + public function setimageindex ($index) {} + + /** + * Gets the index of the current active image + * @link http://www.php.net/manual/en/function.imagick-getimageindex.php + * @return int an integer containing the index of the image in the stack. + * &imagick.imagickexception.throw; + */ + public function getimageindex () {} + + /** + * Adds a comment to your image + * @link http://www.php.net/manual/en/function.imagick-commentimage.php + * @param comment string

+ * The comment to add + *

+ * @return bool &imagick.return.success; + */ + public function commentimage ($comment) {} + + /** + * Extracts a region of the image + * @link http://www.php.net/manual/en/function.imagick-cropimage.php + * @param width int

+ * The width of the crop + *

+ * @param height int

+ * The height of the crop + *

+ * @param x int

+ * The X coordinate of the cropped region's top left corner + *

+ * @param y int

+ * The Y coordinate of the cropped region's top left corner + *

+ * @return bool &imagick.return.success; + */ + public function cropimage ($width, $height, $x, $y) {} + + /** + * Adds a label to an image + * @link http://www.php.net/manual/en/function.imagick-labelimage.php + * @param label string

+ * The label to add + *

+ * @return bool &imagick.return.success; + */ + public function labelimage ($label) {} + + /** + * Gets the width and height as an associative array + * @link http://www.php.net/manual/en/function.imagick-getimagegeometry.php + * @return array an array with the width/height of the image. + * &imagick.imagickexception.throw; + */ + public function getimagegeometry () {} + + /** + * Renders the ImagickDraw object on the current image + * @link http://www.php.net/manual/en/function.imagick-drawimage.php + * @param draw ImagickDraw

+ * The drawing operations to render on the image. + *

+ * @return bool &imagick.return.success; + */ + public function drawimage (ImagickDraw $draw) {} + + /** + * Sets the image compression quality + * @link http://www.php.net/manual/en/function.imagick-setimagecompressionquality.php + * @param quality int

+ * The image compression quality as an integer + *

+ * @return bool &imagick.return.success; + */ + public function setimagecompressionquality ($quality) {} + + /** + * Gets the current image's compression quality + * @link http://www.php.net/manual/en/function.imagick-getimagecompressionquality.php + * @return int integer describing the images compression quality + */ + public function getimagecompressionquality () {} + + /** + * Annotates an image with text + * @link http://www.php.net/manual/en/function.imagick-annotateimage.php + * @param draw_settings ImagickDraw

+ * The ImagickDraw object that contains settings for drawing the text + *

+ * @param x float

+ * Horizontal offset in pixels to the left of text + *

+ * @param y float

+ * Vertical offset in pixels to the baseline of text + *

+ * @param angle float

+ * The angle at which to write the text + *

+ * @param text string

+ * The string to draw + *

+ * @return bool &imagick.return.success; + */ + public function annotateimage (ImagickDraw $draw_settings, $x, $y, $angle, $text) {} + + /** + * Composite one image onto another + * @link http://www.php.net/manual/en/function.imagick-compositeimage.php + * @param composite_object Imagick

+ * Imagick object which holds the composite image + *

+ * @param composite int + * @param x int

+ * The column offset of the composited image + *

+ * @param y int

+ * The row offset of the composited image + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function compositeimage (Imagick $composite_object, $composite, $x, $y, $channel = null) {} + + /** + * Control the brightness, saturation, and hue + * @link http://www.php.net/manual/en/function.imagick-modulateimage.php + * @param brightness float

+ *

+ * @param saturation float

+ *

+ * @param hue float

+ *

+ * @return bool &imagick.return.success; + */ + public function modulateimage ($brightness, $saturation, $hue) {} + + /** + * Gets the number of unique colors in the image + * @link http://www.php.net/manual/en/function.imagick-getimagecolors.php + * @return int &imagick.return.success; + */ + public function getimagecolors () {} + + /** + * Creates a composite image + * @link http://www.php.net/manual/en/function.imagick-montageimage.php + * @param draw ImagickDraw

+ * The font name, size, and color are obtained from this object. + *

+ * @param tile_geometry string

+ * The number of tiles per row and page (e.g. 6x4+0+0). + *

+ * @param thumbnail_geometry string

+ * Preferred image size and border size of each thumbnail + * (e.g. 120x120+4+3>). + *

+ * @param mode int

+ * Thumbnail framing mode, see Montage Mode constants. + *

+ * @param frame string

+ * Surround the image with an ornamental border (e.g. 15x15+3+3). The + * frame color is that of the thumbnail's matte color. + *

+ * @return Imagick &imagick.return.success; + */ + public function montageimage (ImagickDraw $draw, $tile_geometry, $thumbnail_geometry, $mode, $frame) {} + + /** + * Identifies an image and fetches attributes + * @link http://www.php.net/manual/en/function.imagick-identifyimage.php + * @param appendRawOutput bool[optional]

+ *

+ * @return array Identifies an image and returns the attributes. Attributes include + * the image width, height, size, and others. + * &imagick.imagickexception.throw; + */ + public function identifyimage ($appendRawOutput = null) {} + + /** + * Changes the value of individual pixels based on a threshold + * @link http://www.php.net/manual/en/function.imagick-thresholdimage.php + * @param threshold float

+ *

+ * @param channel int[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function thresholdimage ($threshold, $channel = null) {} + + /** + * Selects a threshold for each pixel based on a range of intensity + * @link http://www.php.net/manual/en/function.imagick-adaptivethresholdimage.php + * @param width int

+ * Width of the local neighborhood. + *

+ * @param height int

+ * Height of the local neighborhood. + *

+ * @param offset int

+ * The mean offset + *

+ * @return bool &imagick.return.success; + */ + public function adaptivethresholdimage ($width, $height, $offset) {} + + /** + * Forces all pixels below the threshold into black + * @link http://www.php.net/manual/en/function.imagick-blackthresholdimage.php + * @param threshold mixed

+ * The threshold below which everything turns black + *

+ * @return bool &imagick.return.success; + */ + public function blackthresholdimage ($threshold) {} + + /** + * Force all pixels above the threshold into white + * @link http://www.php.net/manual/en/function.imagick-whitethresholdimage.php + * @param threshold mixed

+ *

+ * @return bool &imagick.return.success; + */ + public function whitethresholdimage ($threshold) {} + + /** + * Append a set of images + * @link http://www.php.net/manual/en/function.imagick-appendimages.php + * @param stack bool

+ * The direction of the stack (top to bottom or bottom to top) + *

+ * @return Imagick Imagick instance on success. + * &imagick.imagickexception.throw; + */ + public function appendimages ($stack) {} + + /** + * Simulates a charcoal drawing + * @link http://www.php.net/manual/en/function.imagick-charcoalimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels + *

+ * @return bool &imagick.return.success; + */ + public function charcoalimage ($radius, $sigma) {} + + /** + * Enhances the contrast of a color image + * @link http://www.php.net/manual/en/function.imagick-normalizeimage.php + * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function normalizeimage ($channel = null) {} + + /** + * Simulates an oil painting + * @link http://www.php.net/manual/en/function.imagick-oilpaintimage.php + * @param radius float

+ * The radius of the circular neighborhood. + *

+ * @return bool &imagick.return.success; + */ + public function oilpaintimage ($radius) {} + + /** + * Reduces the image to a limited number of color level + * @link http://www.php.net/manual/en/function.imagick-posterizeimage.php + * @param levels int

+ *

+ * @param dither bool

+ *

+ * @return bool &imagick.return.success; + */ + public function posterizeimage ($levels, $dither) {} + + /** + * Radial blurs an image + * @link http://www.php.net/manual/en/function.imagick-radialblurimage.php + * @param angle float

+ *

+ * @param channel int[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function radialblurimage ($angle, $channel = null) {} + + /** + * Creates a simulated 3d button-like effect + * @link http://www.php.net/manual/en/function.imagick-raiseimage.php + * @param width int

+ *

+ * @param height int

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @param raise bool

+ *

+ * @return bool &imagick.return.success; + */ + public function raiseimage ($width, $height, $x, $y, $raise) {} + + /** + * Resample image to desired resolution + * @link http://www.php.net/manual/en/function.imagick-resampleimage.php + * @param x_resolution float

+ *

+ * @param y_resolution float

+ *

+ * @param filter int

+ *

+ * @param blur float

+ *

+ * @return bool &imagick.return.success; + */ + public function resampleimage ($x_resolution, $y_resolution, $filter, $blur) {} + + /** + * Scales an image + * @link http://www.php.net/manual/en/function.imagick-resizeimage.php + * @param columns int

+ * Width of the image + *

+ * @param rows int

+ * Height of the image + *

+ * @param filter int

+ * Refer to the list of filter constants. + *

+ * @param blur float

+ * The blur factor where > 1 is blurry, < 1 is sharp. + *

+ * @param bestfit bool[optional]

+ * Optional fit parameter. + *

+ * @return bool &imagick.return.success; + */ + public function resizeimage ($columns, $rows, $filter, $blur, $bestfit = null) {} + + /** + * Offsets an image + * @link http://www.php.net/manual/en/function.imagick-rollimage.php + * @param x int

+ * The X offset. + *

+ * @param y int

+ * The Y offset. + *

+ * @return bool &imagick.return.success; + */ + public function rollimage ($x, $y) {} + + /** + * Rotates an image + * @link http://www.php.net/manual/en/function.imagick-rotateimage.php + * @param background mixed

+ * The background color + *

+ * @param degrees float

+ * The number of degrees to rotate the image + *

+ * @return bool &imagick.return.success; + */ + public function rotateimage ($background, $degrees) {} + + /** + * Scales an image with pixel sampling + * @link http://www.php.net/manual/en/function.imagick-sampleimage.php + * @param columns int

+ *

+ * @param rows int

+ *

+ * @return bool &imagick.return.success; + */ + public function sampleimage ($columns, $rows) {} + + /** + * Applies a solarizing effect to the image + * @link http://www.php.net/manual/en/function.imagick-solarizeimage.php + * @param threshold int

+ *

+ * @return bool &imagick.return.success; + */ + public function solarizeimage ($threshold) {} + + /** + * Simulates an image shadow + * @link http://www.php.net/manual/en/function.imagick-shadowimage.php + * @param opacity float

+ *

+ * @param sigma float

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @return bool &imagick.return.success; + */ + public function shadowimage ($opacity, $sigma, $x, $y) {} + + /** + * @param key + * @param value + */ + public function setimageattribute ($key, $value) {} + + /** + * Sets the image background color + * @link http://www.php.net/manual/en/function.imagick-setimagebackgroundcolor.php + * @param background mixed

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagebackgroundcolor ($background) {} + + /** + * Sets the image composite operator + * @link http://www.php.net/manual/en/function.imagick-setimagecompose.php + * @param compose int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagecompose ($compose) {} + + /** + * Sets the image compression + * @link http://www.php.net/manual/en/function.imagick-setimagecompression.php + * @param compression int

+ * One of the COMPRESSION constants + *

+ * @return bool &imagick.return.success; + */ + public function setimagecompression ($compression) {} + + /** + * Sets the image delay + * @link http://www.php.net/manual/en/function.imagick-setimagedelay.php + * @param delay int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagedelay ($delay) {} + + /** + * Sets the image depth + * @link http://www.php.net/manual/en/function.imagick-setimagedepth.php + * @param depth int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagedepth ($depth) {} + + /** + * Sets the image gamma + * @link http://www.php.net/manual/en/function.imagick-setimagegamma.php + * @param gamma float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagegamma ($gamma) {} + + /** + * Sets the image iterations + * @link http://www.php.net/manual/en/function.imagick-setimageiterations.php + * @param iterations int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageiterations ($iterations) {} + + /** + * Sets the image matte color + * @link http://www.php.net/manual/en/function.imagick-setimagemattecolor.php + * @param matte mixed

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagemattecolor ($matte) {} + + /** + * Sets the page geometry of the image + * @link http://www.php.net/manual/en/function.imagick-setimagepage.php + * @param width int

+ *

+ * @param height int

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagepage ($width, $height, $x, $y) {} + + /** + * @param filename + */ + public function setimageprogressmonitor ($filename) {} + + /** + * Sets the image resolution + * @link http://www.php.net/manual/en/function.imagick-setimageresolution.php + * @param x_resolution float

+ *

+ * @param y_resolution float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageresolution ($x_resolution, $y_resolution) {} + + /** + * Sets the image scene + * @link http://www.php.net/manual/en/function.imagick-setimagescene.php + * @param scene int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagescene ($scene) {} + + /** + * Sets the image ticks-per-second + * @link http://www.php.net/manual/en/function.imagick-setimagetickspersecond.php + * @param ticks_per_second int + * @return bool &imagick.return.success; + */ + public function setimagetickspersecond ($ticks_per_second) {} + + /** + * Sets the image type + * @link http://www.php.net/manual/en/function.imagick-setimagetype.php + * @param image_type int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagetype ($image_type) {} + + /** + * Sets the image units of resolution + * @link http://www.php.net/manual/en/function.imagick-setimageunits.php + * @param units int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageunits ($units) {} + + /** + * Sharpens an image + * @link http://www.php.net/manual/en/function.imagick-sharpenimage.php + * @param radius float

+ *

+ * @param sigma float

+ *

+ * @param channel int[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function sharpenimage ($radius, $sigma, $channel = null) {} + + /** + * Shaves pixels from the image edges + * @link http://www.php.net/manual/en/function.imagick-shaveimage.php + * @param columns int

+ *

+ * @param rows int

+ *

+ * @return bool &imagick.return.success; + */ + public function shaveimage ($columns, $rows) {} + + /** + * Creating a parallelogram + * @link http://www.php.net/manual/en/function.imagick-shearimage.php + * @param background mixed

+ * The background color + *

+ * @param x_shear float

+ * The number of degrees to shear on the x axis + *

+ * @param y_shear float

+ * The number of degrees to shear on the y axis + *

+ * @return bool &imagick.return.success; + */ + public function shearimage ($background, $x_shear, $y_shear) {} + + /** + * Splices a solid color into the image + * @link http://www.php.net/manual/en/function.imagick-spliceimage.php + * @param width int

+ *

+ * @param height int

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @return bool &imagick.return.success; + */ + public function spliceimage ($width, $height, $x, $y) {} + + /** + * Fetch basic attributes about the image + * @link http://www.php.net/manual/en/function.imagick-pingimage.php + * @param filename string

+ * The filename to read the information from. + *

+ * @return bool &imagick.return.success; + */ + public function pingimage ($filename) {} + + /** + * Reads image from open filehandle + * @link http://www.php.net/manual/en/function.imagick-readimagefile.php + * @param filehandle resource

+ *

+ * @param fileName string[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function readimagefile ($filehandle, $fileName = null) {} + + /** + * Displays an image + * @link http://www.php.net/manual/en/function.imagick-displayimage.php + * @param servername string

+ * The X server name + *

+ * @return bool &imagick.return.success; + */ + public function displayimage ($servername) {} + + /** + * Displays an image or image sequence + * @link http://www.php.net/manual/en/function.imagick-displayimages.php + * @param servername string

+ * The X server name + *

+ * @return bool &imagick.return.success; + */ + public function displayimages ($servername) {} + + /** + * Randomly displaces each pixel in a block + * @link http://www.php.net/manual/en/function.imagick-spreadimage.php + * @param radius float

+ *

+ * @return bool &imagick.return.success; + */ + public function spreadimage ($radius) {} + + /** + * Swirls the pixels about the center of the image + * @link http://www.php.net/manual/en/function.imagick-swirlimage.php + * @param degrees float

+ *

+ * @return bool &imagick.return.success; + */ + public function swirlimage ($degrees) {} + + /** + * Strips an image of all profiles and comments + * @link http://www.php.net/manual/en/function.imagick-stripimage.php + * @return bool &imagick.return.success; + */ + public function stripimage () {} + + /** + * Returns formats supported by Imagick + * @link http://www.php.net/manual/en/function.imagick-queryformats.php + * @param pattern string[optional]

+ *

+ * @return array an array containing the formats supported by Imagick. + * &imagick.imagickexception.throw; + */ + public function queryformats ($pattern = null) {} + + /** + * Returns the configured fonts + * @link http://www.php.net/manual/en/function.imagick-queryfonts.php + * @param pattern string[optional]

+ * The query pattern + *

+ * @return array an array containing the configured fonts. + * &imagick.imagickexception.throw; + */ + public function queryfonts ($pattern = null) {} + + /** + * Returns an array representing the font metrics + * @link http://www.php.net/manual/en/function.imagick-queryfontmetrics.php + * @param properties ImagickDraw

+ * ImagickDraw object containing font properties + *

+ * @param text string

+ * The text + *

+ * @param multiline bool[optional]

+ * Multiline parameter. If left empty it is autodetected + *

+ * @return array a multi-dimensional array representing the font metrics. + * &imagick.imagickexception.throw; + */ + public function queryfontmetrics (ImagickDraw $properties, $text, $multiline = null) {} + + /** + * Hides a digital watermark within the image + * @link http://www.php.net/manual/en/function.imagick-steganoimage.php + * @param watermark_wand Imagick

+ *

+ * @param offset int

+ *

+ * @return Imagick &imagick.return.success; + */ + public function steganoimage (Imagick $watermark_wand, $offset) {} + + /** + * Adds random noise to the image + * @link http://www.php.net/manual/en/function.imagick-addnoiseimage.php + * @param noise_type int

+ * The type of the noise. Refer to this list of + * noise constants. + *

+ * @param channel int[optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function addnoiseimage ($noise_type, $channel = null) {} + + /** + * Simulates motion blur + * @link http://www.php.net/manual/en/function.imagick-motionblurimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel. + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param angle float

+ * Apply the effect along this angle. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + * The channel argument affects only if Imagick is compiled against ImageMagick version + * 6.4.4 or greater. + *

+ * @return bool &imagick.return.success; + */ + public function motionblurimage ($radius, $sigma, $angle, $channel = null) {} + + /** + * Forms a mosaic from images + * @link http://www.php.net/manual/en/function.imagick-mosaicimages.php + * @return Imagick &imagick.return.success; + */ + public function mosaicimages () {} + + /** + * Method morphs a set of images + * @link http://www.php.net/manual/en/function.imagick-morphimages.php + * @param number_frames int

+ * The number of in-between images to generate. + *

+ * @return Imagick This method returns a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function morphimages ($number_frames) {} + + /** + * Scales an image proportionally to half its size + * @link http://www.php.net/manual/en/function.imagick-minifyimage.php + * @return bool &imagick.return.success; + */ + public function minifyimage () {} + + /** + * Transforms an image + * @link http://www.php.net/manual/en/function.imagick-affinetransformimage.php + * @param matrix ImagickDraw

+ * The affine matrix + *

+ * @return bool &imagick.return.success; + */ + public function affinetransformimage (ImagickDraw $matrix) {} + + /** + * Average a set of images + * @link http://www.php.net/manual/en/function.imagick-averageimages.php + * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function averageimages () {} + + /** + * Surrounds the image with a border + * @link http://www.php.net/manual/en/function.imagick-borderimage.php + * @param bordercolor mixed

+ * ImagickPixel object or a string containing the border color + *

+ * @param width int

+ * Border width + *

+ * @param height int

+ * Border height + *

+ * @return bool &imagick.return.success; + */ + public function borderimage ($bordercolor, $width, $height) {} + + /** + * Removes a region of an image and trims + * @link http://www.php.net/manual/en/function.imagick-chopimage.php + * @param width int

+ * Width of the chopped area + *

+ * @param height int

+ * Height of the chopped area + *

+ * @param x int

+ * X origo of the chopped area + *

+ * @param y int

+ * Y origo of the chopped area + *

+ * @return bool &imagick.return.success; + */ + public function chopimage ($width, $height, $x, $y) {} + + /** + * Clips along the first path from the 8BIM profile + * @link http://www.php.net/manual/en/function.imagick-clipimage.php + * @return bool &imagick.return.success; + */ + public function clipimage () {} + + /** + * Clips along the named paths from the 8BIM profile + * @link http://www.php.net/manual/en/function.imagick-clippathimage.php + * @param pathname string

+ * The name of the path + *

+ * @param inside bool

+ * If true later operations take effect inside clipping path. + * Otherwise later operations take effect outside clipping path. + *

+ * @return bool &imagick.return.success; + */ + public function clippathimage ($pathname, $inside) {} + + /** + * @param pathname + * @param inside + */ + public function clipimagepath ($pathname, $inside) {} + + /** + * Composites a set of images + * @link http://www.php.net/manual/en/function.imagick-coalesceimages.php + * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function coalesceimages () {} + + /** + * Changes the color value of any pixel that matches target + * @link http://www.php.net/manual/en/function.imagick-colorfloodfillimage.php + * @param fill mixed

+ * ImagickPixel object containing the fill color + *

+ * @param fuzz float

+ * The amount of fuzz. For example, set fuzz to 10 and the color red at + * intensities of 100 and 102 respectively are now interpreted as the + * same color for the purposes of the floodfill. + *

+ * @param bordercolor mixed

+ * ImagickPixel object containing the border color + *

+ * @param x int

+ * X start position of the floodfill + *

+ * @param y int

+ * Y start position of the floodfill + *

+ * @return bool &imagick.return.success; + */ + public function colorfloodfillimage ($fill, $fuzz, $bordercolor, $x, $y) {} + + /** + * Blends the fill color with the image + * @link http://www.php.net/manual/en/function.imagick-colorizeimage.php + * @param colorize mixed

+ * ImagickPixel object or a string containing the colorize color + *

+ * @param opacity mixed

+ * ImagickPixel object or an float containing the opacity value. + * 1.0 is fully opaque and 0.0 is fully transparent. + *

+ * @return bool &imagick.return.success; + */ + public function colorizeimage ($colorize, $opacity) {} + + /** + * Returns the difference in one or more images + * @link http://www.php.net/manual/en/function.imagick-compareimagechannels.php + * @param image Imagick

+ * Imagick object containing the image to compare. + *

+ * @param channelType int

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @param metricType int

+ * One of the metric type constants. + *

+ * @return array Array consisting of new_wand and + * distortion. + */ + public function compareimagechannels (Imagick $image, $channelType, $metricType) {} + + /** + * Compares an image to a reconstructed image + * @link http://www.php.net/manual/en/function.imagick-compareimages.php + * @param compare Imagick

+ * An image to compare to. + *

+ * @param metric int

+ * Provide a valid metric type constant. Refer to this + * list of metric constants. + *

+ * @return array &imagick.return.success; + */ + public function compareimages (Imagick $compare, $metric) {} + + /** + * Change the contrast of the image + * @link http://www.php.net/manual/en/function.imagick-contrastimage.php + * @param sharpen bool

+ * The sharpen value + *

+ * @return bool &imagick.return.success; + */ + public function contrastimage ($sharpen) {} + + /** + * Combines one or more images into a single image + * @link http://www.php.net/manual/en/function.imagick-combineimages.php + * @param channelType int

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return Imagick &imagick.return.success; + */ + public function combineimages ($channelType) {} + + /** + * Applies a custom convolution kernel to the image + * @link http://www.php.net/manual/en/function.imagick-convolveimage.php + * @param kernel array

+ * The convolution kernel + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function convolveimage (array $kernel, $channel = null) {} + + /** + * Displaces an image's colormap + * @link http://www.php.net/manual/en/function.imagick-cyclecolormapimage.php + * @param displace int

+ * The amount to displace the colormap. + *

+ * @return bool &imagick.return.success; + */ + public function cyclecolormapimage ($displace) {} + + /** + * Returns certain pixel differences between images + * @link http://www.php.net/manual/en/function.imagick-deconstructimages.php + * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function deconstructimages () {} + + /** + * Reduces the speckle noise in an image + * @link http://www.php.net/manual/en/function.imagick-despeckleimage.php + * @return bool &imagick.return.success; + */ + public function despeckleimage () {} + + /** + * Enhance edges within the image + * @link http://www.php.net/manual/en/function.imagick-edgeimage.php + * @param radius float

+ * The radius of the operation. + *

+ * @return bool &imagick.return.success; + */ + public function edgeimage ($radius) {} + + /** + * Returns a grayscale image with a three-dimensional effect + * @link http://www.php.net/manual/en/function.imagick-embossimage.php + * @param radius float

+ * The radius of the effect + *

+ * @param sigma float

+ * The sigma of the effect + *

+ * @return bool &imagick.return.success; + */ + public function embossimage ($radius, $sigma) {} + + /** + * Improves the quality of a noisy image + * @link http://www.php.net/manual/en/function.imagick-enhanceimage.php + * @return bool &imagick.return.success; + */ + public function enhanceimage () {} + + /** + * Equalizes the image histogram + * @link http://www.php.net/manual/en/function.imagick-equalizeimage.php + * @return bool &imagick.return.success; + */ + public function equalizeimage () {} + + /** + * Applies an expression to an image + * @link http://www.php.net/manual/en/function.imagick-evaluateimage.php + * @param op int

+ * The operator + *

+ * @param constant float

+ * The value of the operator + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function evaluateimage ($op, $constant, $channel = null) {} + + /** + * Merges a sequence of images + * @link http://www.php.net/manual/en/function.imagick-flattenimages.php + * @return Imagick &imagick.return.success; + */ + public function flattenimages () {} + + /** + * Creates a vertical mirror image + * @link http://www.php.net/manual/en/function.imagick-flipimage.php + * @return bool &imagick.return.success; + */ + public function flipimage () {} + + /** + * Creates a horizontal mirror image + * @link http://www.php.net/manual/en/function.imagick-flopimage.php + * @return bool &imagick.return.success; + */ + public function flopimage () {} + + /** + * Adds a simulated three-dimensional border + * @link http://www.php.net/manual/en/function.imagick-frameimage.php + * @param matte_color mixed

+ * ImagickPixel object or a string representing the matte color + *

+ * @param width int

+ * The width of the border + *

+ * @param height int

+ * The height of the border + *

+ * @param inner_bevel int

+ * The inner bevel width + *

+ * @param outer_bevel int

+ * The outer bevel width + *

+ * @return bool &imagick.return.success; + */ + public function frameimage ($matte_color, $width, $height, $inner_bevel, $outer_bevel) {} + + /** + * Evaluate expression for each pixel in the image + * @link http://www.php.net/manual/en/function.imagick-fximage.php + * @param expression string

+ * The expression. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return Imagick &imagick.return.success; + */ + public function fximage ($expression, $channel = null) {} + + /** + * Gamma-corrects an image + * @link http://www.php.net/manual/en/function.imagick-gammaimage.php + * @param gamma float

+ * The amount of gamma-correction. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function gammaimage ($gamma, $channel = null) {} + + /** + * Blurs an image + * @link http://www.php.net/manual/en/function.imagick-gaussianblurimage.php + * @param radius float

+ * The radius of the Gaussian, in pixels, not counting the center pixel. + *

+ * @param sigma float

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function gaussianblurimage ($radius, $sigma, $channel = null) {} + + /** + * @param key + */ + public function getimageattribute ($key) {} + + /** + * Returns the image background color + * @link http://www.php.net/manual/en/function.imagick-getimagebackgroundcolor.php + * @return ImagickPixel an ImagickPixel set to the background color of the image. + * &imagick.imagickexception.throw; + */ + public function getimagebackgroundcolor () {} + + /** + * Returns the chromaticy blue primary point + * @link http://www.php.net/manual/en/function.imagick-getimageblueprimary.php + * @param x float

+ * The chromaticity blue primary x-point. + *

+ * @param y float

+ * The chromaticity blue primary y-point. + *

+ * @return array Array consisting of "x" and "y" coordinates of point. + */ + public function getimageblueprimary ($x, $y) {} + + /** + * Returns the image border color + * @link http://www.php.net/manual/en/function.imagick-getimagebordercolor.php + * @return ImagickPixel &imagick.return.success; + */ + public function getimagebordercolor () {} + + /** + * Gets the depth for a particular image channel + * @link http://www.php.net/manual/en/function.imagick-getimagechanneldepth.php + * @param channel int

+ * &imagick.parameter.channel; + *

+ * @return int &imagick.return.success; + */ + public function getimagechanneldepth ($channel) {} + + /** + * Compares image channels of an image to a reconstructed image + * @link http://www.php.net/manual/en/function.imagick-getimagechanneldistortion.php + * @param reference Imagick

+ * Imagick object to compare to. + *

+ * @param channel int

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @param metric int

+ * One of the metric type constants. + *

+ * @return float &imagick.return.success; + */ + public function getimagechanneldistortion (Imagick $reference, $channel, $metric) {} + + /** + * Gets the extrema for one or more image channels + * @link http://www.php.net/manual/en/function.imagick-getimagechannelextrema.php + * @param channel int

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return array &imagick.return.success; + */ + public function getimagechannelextrema ($channel) {} + + /** + * Gets the mean and standard deviation + * @link http://www.php.net/manual/en/function.imagick-getimagechannelmean.php + * @param channel int

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return array &imagick.return.success; + */ + public function getimagechannelmean ($channel) {} + + /** + * Returns statistics for each channel in the image + * @link http://www.php.net/manual/en/function.imagick-getimagechannelstatistics.php + * @return array &imagick.return.success; + */ + public function getimagechannelstatistics () {} + + /** + * Returns the color of the specified colormap index + * @link http://www.php.net/manual/en/function.imagick-getimagecolormapcolor.php + * @param index int

+ * The offset into the image colormap. + *

+ * @return ImagickPixel &imagick.return.success; + */ + public function getimagecolormapcolor ($index) {} + + /** + * Gets the image colorspace + * @link http://www.php.net/manual/en/function.imagick-getimagecolorspace.php + * @return int &imagick.return.success; + */ + public function getimagecolorspace () {} + + /** + * Returns the composite operator associated with the image + * @link http://www.php.net/manual/en/function.imagick-getimagecompose.php + * @return int &imagick.return.success; + */ + public function getimagecompose () {} + + /** + * Gets the image delay + * @link http://www.php.net/manual/en/function.imagick-getimagedelay.php + * @return int the image delay. + * &imagick.imagickexception.throw; + */ + public function getimagedelay () {} + + /** + * Gets the image depth + * @link http://www.php.net/manual/en/function.imagick-getimagedepth.php + * @return int The image depth. + */ + public function getimagedepth () {} + + /** + * Compares an image to a reconstructed image + * @link http://www.php.net/manual/en/function.imagick-getimagedistortion.php + * @param reference MagickWand

+ * Imagick object to compare to. + *

+ * @param metric int

+ * One of the metric type constants. + *

+ * @return float the distortion metric used on the image (or the best guess + * thereof). + * &imagick.imagickexception.throw; + */ + public function getimagedistortion ($reference, $metric) {} + + /** + * Gets the extrema for the image + * @link http://www.php.net/manual/en/function.imagick-getimageextrema.php + * @return array an associative array with the keys "min" and "max". + * &imagick.imagickexception.throw; + */ + public function getimageextrema () {} + + /** + * Gets the image disposal method + * @link http://www.php.net/manual/en/function.imagick-getimagedispose.php + * @return int the dispose method on success. + * &imagick.imagickexception.throw; + */ + public function getimagedispose () {} + + /** + * Gets the image gamma + * @link http://www.php.net/manual/en/function.imagick-getimagegamma.php + * @return float the image gamma on success. + * &imagick.imagickexception.throw; + */ + public function getimagegamma () {} + + /** + * Returns the chromaticy green primary point + * @link http://www.php.net/manual/en/function.imagick-getimagegreenprimary.php + * @return array an array with the keys "x" and "y" on success, throws an + * ImagickException on failure. + */ + public function getimagegreenprimary () {} + + /** + * Returns the image height + * @link http://www.php.net/manual/en/function.imagick-getimageheight.php + * @return int the image height in pixels. + * &imagick.imagickexception.throw; + */ + public function getimageheight () {} + + /** + * Gets the image histogram + * @link http://www.php.net/manual/en/function.imagick-getimagehistogram.php + * @return array the image histogram as an array of ImagickPixel objects. + * &imagick.imagickexception.throw; + */ + public function getimagehistogram () {} + + /** + * Gets the image interlace scheme + * @link http://www.php.net/manual/en/function.imagick-getimageinterlacescheme.php + * @return int the interlace scheme as an integer on success. + * &imagick.imagickexception.throw; + */ + public function getimageinterlacescheme () {} + + /** + * Gets the image iterations + * @link http://www.php.net/manual/en/function.imagick-getimageiterations.php + * @return int the image iterations as an integer. + * &imagick.imagickexception.throw; + */ + public function getimageiterations () {} + + /** + * Returns the image matte color + * @link http://www.php.net/manual/en/function.imagick-getimagemattecolor.php + * @return ImagickPixel ImagickPixel object on success. + * &imagick.imagickexception.throw; + */ + public function getimagemattecolor () {} + + /** + * Returns the page geometry + * @link http://www.php.net/manual/en/function.imagick-getimagepage.php + * @return array the page geometry associated with the image in an array with the + * keys "width", "height", "x", and "y". + */ + public function getimagepage () {} + + /** + * Returns the color of the specified pixel + * @link http://www.php.net/manual/en/function.imagick-getimagepixelcolor.php + * @param x int

+ * The x-coordinate of the pixel + *

+ * @param y int

+ * The y-coordinate of the pixel + *

+ * @return ImagickPixel an ImagickPixel instance for the color at the coordinates given. + * &imagick.imagickexception.throw; + */ + public function getimagepixelcolor ($x, $y) {} + + /** + * Returns the named image profile + * @link http://www.php.net/manual/en/function.imagick-getimageprofile.php + * @param name string

+ * The name of the profile to return. + *

+ * @return string a string containing the image profile. + * &imagick.imagickexception.throw; + */ + public function getimageprofile ($name) {} + + /** + * Returns the chromaticity red primary point + * @link http://www.php.net/manual/en/function.imagick-getimageredprimary.php + * @return array the chromaticity red primary point as an array with the keys "x" + * and "y". + * &imagick.imagickexception.throw; + */ + public function getimageredprimary () {} + + /** + * Gets the image rendering intent + * @link http://www.php.net/manual/en/function.imagick-getimagerenderingintent.php + * @return int the image rendering intent. + * &imagick.imagickexception.throw; + */ + public function getimagerenderingintent () {} + + /** + * Gets the image X and Y resolution + * @link http://www.php.net/manual/en/function.imagick-getimageresolution.php + * @return array the resolution as an array. + * &imagick.imagickexception.throw; + */ + public function getimageresolution () {} + + /** + * Gets the image scene + * @link http://www.php.net/manual/en/function.imagick-getimagescene.php + * @return int the image scene. + * &imagick.imagickexception.throw; + */ + public function getimagescene () {} + + /** + * Generates an SHA-256 message digest + * @link http://www.php.net/manual/en/function.imagick-getimagesignature.php + * @return string a string containing the SHA-256 hash of the file. + * &imagick.imagickexception.throw; + */ + public function getimagesignature () {} + + /** + * Gets the image ticks-per-second + * @link http://www.php.net/manual/en/function.imagick-getimagetickspersecond.php + * @return int the image ticks-per-second. + * &imagick.imagickexception.throw; + */ + public function getimagetickspersecond () {} + + /** + * Gets the potential image type + * @link http://www.php.net/manual/en/function.imagick-getimagetype.php + * @return int the potential image type. + * &imagick.imagickexception.throw; + */ + public function getimagetype () {} + + /** + * Gets the image units of resolution + * @link http://www.php.net/manual/en/function.imagick-getimageunits.php + * @return int the image units of resolution. + * &imagick.imagickexception.throw; + */ + public function getimageunits () {} + + /** + * Returns the virtual pixel method + * @link http://www.php.net/manual/en/function.imagick-getimagevirtualpixelmethod.php + * @return int the virtual pixel method on success. + * &imagick.imagickexception.throw; + */ + public function getimagevirtualpixelmethod () {} + + /** + * Returns the chromaticity white point + * @link http://www.php.net/manual/en/function.imagick-getimagewhitepoint.php + * @return array the chromaticity white point as an associative array with the keys + * "x" and "y". + * &imagick.imagickexception.throw; + */ + public function getimagewhitepoint () {} + + /** + * Returns the image width + * @link http://www.php.net/manual/en/function.imagick-getimagewidth.php + * @return int the image width. + * &imagick.imagickexception.throw; + */ + public function getimagewidth () {} + + /** + * Returns the number of images in the object + * @link http://www.php.net/manual/en/function.imagick-getnumberimages.php + * @return int the number of images associated with Imagick object. + * &imagick.imagickexception.throw; + */ + public function getnumberimages () {} + + /** + * Gets the image total ink density + * @link http://www.php.net/manual/en/function.imagick-getimagetotalinkdensity.php + * @return float the image total ink density of the image. + * &imagick.imagickexception.throw; + */ + public function getimagetotalinkdensity () {} + + /** + * Extracts a region of the image + * @link http://www.php.net/manual/en/function.imagick-getimageregion.php + * @param width int

+ * The width of the extracted region. + *

+ * @param height int

+ * The height of the extracted region. + *

+ * @param x int

+ * X-coordinate of the top-left corner of the extracted region. + *

+ * @param y int

+ * Y-coordinate of the top-left corner of the extracted region. + *

+ * @return Imagick Extracts a region of the image and returns it as a new wand. + * &imagick.imagickexception.throw; + */ + public function getimageregion ($width, $height, $x, $y) {} + + /** + * Creates a new image as a copy + * @link http://www.php.net/manual/en/function.imagick-implodeimage.php + * @param radius float

+ * The radius of the implode + *

+ * @return bool &imagick.return.success; + */ + public function implodeimage ($radius) {} + + /** + * Adjusts the levels of an image + * @link http://www.php.net/manual/en/function.imagick-levelimage.php + * @param blackPoint float

+ * The image black point + *

+ * @param gamma float

+ * The gamma value + *

+ * @param whitePoint float

+ * The image white point + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function levelimage ($blackPoint, $gamma, $whitePoint, $channel = null) {} + + /** + * Scales an image proportionally 2x + * @link http://www.php.net/manual/en/function.imagick-magnifyimage.php + * @return bool &imagick.return.success; + */ + public function magnifyimage () {} + + /** + * Replaces the colors of an image with the closest color from a reference image. + * @link http://www.php.net/manual/en/function.imagick-mapimage.php + * @param map Imagick

+ *

+ * @param dither bool

+ *

+ * @return bool &imagick.return.success; + */ + public function mapimage (Imagick $map, $dither) {} + + /** + * Changes the transparency value of a color + * @link http://www.php.net/manual/en/function.imagick-mattefloodfillimage.php + * @param alpha float

+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully + * transparent. + *

+ * @param fuzz float

+ * The fuzz member of image defines how much tolerance is acceptable to + * consider two colors as the same. + *

+ * @param bordercolor mixed

+ * An ImagickPixel object or string representing the border color. + *

+ * @param x int

+ * The starting x coordinate of the operation. + *

+ * @param y int

+ * The starting y coordinate of the operation. + *

+ * @return bool &imagick.return.success; + */ + public function mattefloodfillimage ($alpha, $fuzz, $bordercolor, $x, $y) {} + + /** + * Applies a digital filter + * @link http://www.php.net/manual/en/function.imagick-medianfilterimage.php + * @param radius float

+ * The radius of the pixel neighborhood. + *

+ * @return bool &imagick.return.success; + */ + public function medianfilterimage ($radius) {} + + /** + * Negates the colors in the reference image + * @link http://www.php.net/manual/en/function.imagick-negateimage.php + * @param gray bool

+ * Whether to only negate grayscale pixels within the image. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function negateimage ($gray, $channel = null) {} + + /** + * Change any pixel that matches color + * @link http://www.php.net/manual/en/function.imagick-paintopaqueimage.php + * @param target mixed

+ * Change this target color to the fill color within the image. An + * ImagickPixel object or a string representing the target color. + *

+ * @param fill mixed

+ * An ImagickPixel object or a string representing the fill color. + *

+ * @param fuzz float

+ * The fuzz member of image defines how much tolerance is acceptable to + * consider two colors as the same. + *

+ * @param channel int[optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function paintopaqueimage ($target, $fill, $fuzz, $channel = null) {} + + /** + * Changes any pixel that matches color with the color defined by fill + * @link http://www.php.net/manual/en/function.imagick-painttransparentimage.php + * @param target mixed

+ * Change this target color to specified opacity value within the image. + *

+ * @param alpha float

+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully + * transparent. + *

+ * @param fuzz float

+ * The fuzz member of image defines how much tolerance is acceptable to + * consider two colors as the same. + *

+ * @return bool &imagick.return.success; + */ + public function painttransparentimage ($target, $alpha, $fuzz) {} + + /** + * Quickly pin-point appropriate parameters for image processing + * @link http://www.php.net/manual/en/function.imagick-previewimages.php + * @param preview int

+ * Preview type. See Preview type constants + *

+ * @return bool &imagick.return.success; + */ + public function previewimages ($preview) {} + + /** + * Adds or removes a profile from an image + * @link http://www.php.net/manual/en/function.imagick-profileimage.php + * @param name string

+ *

+ * @param profile string

+ *

+ * @return bool &imagick.return.success; + */ + public function profileimage ($name, $profile) {} + + /** + * Analyzes the colors within a reference image + * @link http://www.php.net/manual/en/function.imagick-quantizeimage.php + * @param numberColors int

+ *

+ * @param colorspace int

+ *

+ * @param treedepth int

+ *

+ * @param dither bool

+ *

+ * @param measureError bool

+ *

+ * @return bool &imagick.return.success; + */ + public function quantizeimage ($numberColors, $colorspace, $treedepth, $dither, $measureError) {} + + /** + * Analyzes the colors within a sequence of images + * @link http://www.php.net/manual/en/function.imagick-quantizeimages.php + * @param numberColors int

+ *

+ * @param colorspace int

+ *

+ * @param treedepth int

+ *

+ * @param dither bool

+ *

+ * @param measureError bool

+ *

+ * @return bool &imagick.return.success; + */ + public function quantizeimages ($numberColors, $colorspace, $treedepth, $dither, $measureError) {} + + /** + * Smooths the contours of an image + * @link http://www.php.net/manual/en/function.imagick-reducenoiseimage.php + * @param radius float

+ *

+ * @return bool &imagick.return.success; + */ + public function reducenoiseimage ($radius) {} + + /** + * Removes the named image profile and returns it + * @link http://www.php.net/manual/en/function.imagick-removeimageprofile.php + * @param name string

+ *

+ * @return string a string containing the profile of the image. + * &imagick.imagickexception.throw; + */ + public function removeimageprofile ($name) {} + + /** + * Separates a channel from the image + * @link http://www.php.net/manual/en/function.imagick-separateimagechannel.php + * @param channel int

+ *

+ * @return bool &imagick.return.success; + */ + public function separateimagechannel ($channel) {} + + /** + * Sepia tones an image + * @link http://www.php.net/manual/en/function.imagick-sepiatoneimage.php + * @param threshold float

+ *

+ * @return bool &imagick.return.success; + */ + public function sepiatoneimage ($threshold) {} + + /** + * Sets the image bias for any method that convolves an image + * @link http://www.php.net/manual/en/function.imagick-setimagebias.php + * @param bias float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagebias ($bias) {} + + /** + * Sets the image chromaticity blue primary point + * @link http://www.php.net/manual/en/function.imagick-setimageblueprimary.php + * @param x float

+ *

+ * @param y float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageblueprimary ($x, $y) {} + + /** + * Sets the image border color + * @link http://www.php.net/manual/en/function.imagick-setimagebordercolor.php + * @param border mixed

+ * The border color + *

+ * @return bool &imagick.return.success; + */ + public function setimagebordercolor ($border) {} + + /** + * Sets the depth of a particular image channel + * @link http://www.php.net/manual/en/function.imagick-setimagechanneldepth.php + * @param channel int

+ *

+ * @param depth int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagechanneldepth ($channel, $depth) {} + + /** + * Sets the color of the specified colormap index + * @link http://www.php.net/manual/en/function.imagick-setimagecolormapcolor.php + * @param index int

+ *

+ * @param color ImagickPixel

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagecolormapcolor ($index, ImagickPixel $color) {} + + /** + * Sets the image colorspace + * @link http://www.php.net/manual/en/function.imagick-setimagecolorspace.php + * @param colorspace int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagecolorspace ($colorspace) {} + + /** + * Sets the image disposal method + * @link http://www.php.net/manual/en/function.imagick-setimagedispose.php + * @param dispose int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagedispose ($dispose) {} + + /** + * Sets the image size + * @link http://www.php.net/manual/en/function.imagick-setimageextent.php + * @param columns int

+ *

+ * @param rows int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageextent ($columns, $rows) {} + + /** + * Sets the image chromaticity green primary point + * @link http://www.php.net/manual/en/function.imagick-setimagegreenprimary.php + * @param x float

+ *

+ * @param y float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagegreenprimary ($x, $y) {} + + /** + * Sets the image compression + * @link http://www.php.net/manual/en/function.imagick-setimageinterlacescheme.php + * @param interlace_scheme int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageinterlacescheme ($interlace_scheme) {} + + /** + * Adds a named profile to the Imagick object + * @link http://www.php.net/manual/en/function.imagick-setimageprofile.php + * @param name string

+ *

+ * @param profile string

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageprofile ($name, $profile) {} + + /** + * Sets the image chromaticity red primary point + * @link http://www.php.net/manual/en/function.imagick-setimageredprimary.php + * @param x float

+ *

+ * @param y float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimageredprimary ($x, $y) {} + + /** + * Sets the image rendering intent + * @link http://www.php.net/manual/en/function.imagick-setimagerenderingintent.php + * @param rendering_intent int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagerenderingintent ($rendering_intent) {} + + /** + * Sets the image virtual pixel method + * @link http://www.php.net/manual/en/function.imagick-setimagevirtualpixelmethod.php + * @param method int

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagevirtualpixelmethod ($method) {} + + /** + * Sets the image chromaticity white point + * @link http://www.php.net/manual/en/function.imagick-setimagewhitepoint.php + * @param x float

+ *

+ * @param y float

+ *

+ * @return bool &imagick.return.success; + */ + public function setimagewhitepoint ($x, $y) {} + + /** + * Adjusts the contrast of an image + * @link http://www.php.net/manual/en/function.imagick-sigmoidalcontrastimage.php + * @param sharpen bool

+ *

+ * @param alpha float

+ *

+ * @param beta float

+ *

+ * @param channel int[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function sigmoidalcontrastimage ($sharpen, $alpha, $beta, $channel = null) {} + + /** + * Composites two images + * @link http://www.php.net/manual/en/function.imagick-stereoimage.php + * @param offset_wand Imagick

+ *

+ * @return bool &imagick.return.success; + */ + public function stereoimage (Imagick $offset_wand) {} + + /** + * Repeatedly tiles the texture image + * @link http://www.php.net/manual/en/function.imagick-textureimage.php + * @param texture_wand Imagick

+ *

+ * @return bool &imagick.return.success; + */ + public function textureimage (Imagick $texture_wand) {} + + /** + * Applies a color vector to each pixel in the image + * @link http://www.php.net/manual/en/function.imagick-tintimage.php + * @param tint mixed

+ *

+ * @param opacity mixed

+ *

+ * @return bool &imagick.return.success; + */ + public function tintimage ($tint, $opacity) {} + + /** + * Sharpens an image + * @link http://www.php.net/manual/en/function.imagick-unsharpmaskimage.php + * @param radius float

+ *

+ * @param sigma float

+ *

+ * @param amount float

+ *

+ * @param threshold float

+ *

+ * @param channel int[optional]

+ *

+ * @return bool &imagick.return.success; + */ + public function unsharpmaskimage ($radius, $sigma, $amount, $threshold, $channel = null) {} + + /** + * Returns a new Imagick object + * @link http://www.php.net/manual/en/function.imagick-getimage.php + * @return Imagick a new Imagick object with the current image sequence. + * &imagick.imagickexception.throw; + */ + public function getimage () {} + + /** + * Adds new image to Imagick object image list + * @link http://www.php.net/manual/en/function.imagick-addimage.php + * @param source Imagick

+ * The source Imagick object + *

+ * @return bool &imagick.return.success; + */ + public function addimage (Imagick $source) {} + + /** + * Replaces image in the object + * @link http://www.php.net/manual/en/function.imagick-setimage.php + * @param replace Imagick

+ * The replace Imagick object + *

+ * @return bool &imagick.return.success; + */ + public function setimage (Imagick $replace) {} + + /** + * Creates a new image + * @link http://www.php.net/manual/en/function.imagick-newimage.php + * @param cols int

+ * Columns in the new image + *

+ * @param rows int

+ * Rows in the new image + *

+ * @param background mixed

+ * The background color used for this image + *

+ * @param format string[optional]

+ * Image format. This parameter was added in Imagick version 2.0.1. + *

+ * @return bool &imagick.return.success; + */ + public function newimage ($cols, $rows, $background, $format = null) {} + + /** + * Creates a new image + * @link http://www.php.net/manual/en/function.imagick-newpseudoimage.php + * @param columns int

+ * columns in the new image + *

+ * @param rows int

+ * rows in the new image + *

+ * @param pseudoString string

+ * string containing pseudo image definition. + *

+ * @return bool &imagick.return.success; + */ + public function newpseudoimage ($columns, $rows, $pseudoString) {} + + /** + * Gets the object compression type + * @link http://www.php.net/manual/en/function.imagick-getcompression.php + * @return int the compression constant + */ + public function getcompression () {} + + /** + * Gets the object compression quality + * @link http://www.php.net/manual/en/function.imagick-getcompressionquality.php + * @return int integer describing the compression quality + */ + public function getcompressionquality () {} + + /** + * Returns the ImageMagick API copyright as a string + * @link http://www.php.net/manual/en/function.imagick-getcopyright.php + * @return string a string containing the copyright notice of Imagemagick and + * Magickwand C API. + */ + public function getcopyright () {} + + /** + * The filename associated with an image sequence + * @link http://www.php.net/manual/en/function.imagick-getfilename.php + * @return string a string on success. + * &imagick.imagickexception.throw; + */ + public function getfilename () {} + + /** + * Returns the format of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-getformat.php + * @return string the format of the image. + * &imagick.imagickexception.throw; + */ + public function getformat () {} + + /** + * Returns the ImageMagick home URL + * @link http://www.php.net/manual/en/function.imagick-gethomeurl.php + * @return string a link to the imagemagick homepage. + */ + public function gethomeurl () {} + + /** + * Gets the object interlace scheme + * @link http://www.php.net/manual/en/function.imagick-getinterlacescheme.php + * @return int Gets the wand interlace + * scheme. + * &imagick.imagickexception.throw; + */ + public function getinterlacescheme () {} + + /** + * Returns a value associated with the specified key + * @link http://www.php.net/manual/en/function.imagick-getoption.php + * @param key string

+ * The name of the option + *

+ * @return string a value associated with a wand and the specified key. + * &imagick.imagickexception.throw; + */ + public function getoption ($key) {} + + /** + * Returns the ImageMagick package name + * @link http://www.php.net/manual/en/function.imagick-getpackagename.php + * @return string the ImageMagick package name as a string. + * &imagick.imagickexception.throw; + */ + public function getpackagename () {} + + /** + * Returns the page geometry + * @link http://www.php.net/manual/en/function.imagick-getpage.php + * @return array the page geometry associated with the Imagick object in + * an associative array with the keys "width", "height", "x", and "y", + * throwing ImagickException on error. + */ + public function getpage () {} + + /** + * Gets the quantum depth + * @link http://www.php.net/manual/en/function.imagick-getquantumdepth.php + * @return array the Imagick quantum depth as a string. + * &imagick.imagickexception.throw; + */ + public function getquantumdepth () {} + + /** + * Returns the Imagick quantum range + * @link http://www.php.net/manual/en/function.imagick-getquantumrange.php + * @return array the Imagick quantum range as a string. + * &imagick.imagickexception.throw; + */ + public function getquantumrange () {} + + /** + * Returns the ImageMagick release date + * @link http://www.php.net/manual/en/function.imagick-getreleasedate.php + * @return string the ImageMagick release date as a string. + * &imagick.imagickexception.throw; + */ + public function getreleasedate () {} + + /** + * Returns the specified resource's memory usage + * @link http://www.php.net/manual/en/function.imagick-getresource.php + * @param type int

+ * Refer to the list of resourcetype constants. + *

+ * @return int the specified resource's memory usage in megabytes. + * &imagick.imagickexception.throw; + */ + public function getresource ($type) {} + + /** + * Returns the specified resource limit + * @link http://www.php.net/manual/en/function.imagick-getresourcelimit.php + * @param type int

+ * Refer to the list of resourcetype constants. + *

+ * @return int the specified resource limit in megabytes. + * &imagick.imagickexception.throw; + */ + public function getresourcelimit ($type) {} + + /** + * Gets the horizontal and vertical sampling factor + * @link http://www.php.net/manual/en/function.imagick-getsamplingfactors.php + * @return array an associative array with the horizontal and vertical sampling + * factors of the image. + * &imagick.imagickexception.throw; + */ + public function getsamplingfactors () {} + + /** + * Returns the size associated with the Imagick object + * @link http://www.php.net/manual/en/function.imagick-getsize.php + * @return array the size associated with the Imagick object as an array with the + * keys "columns" and "rows". + */ + public function getsize () {} + + /** + * Returns the ImageMagick API version + * @link http://www.php.net/manual/en/function.imagick-getversion.php + * @return array the ImageMagick API version as a string and as a number. + * &imagick.imagickexception.throw; + */ + public function getversion () {} + + /** + * Sets the object's default background color + * @link http://www.php.net/manual/en/function.imagick-setbackgroundcolor.php + * @param background mixed

+ *

+ * @return bool &imagick.return.success; + */ + public function setbackgroundcolor ($background) {} + + /** + * Sets the object's default compression type + * @link http://www.php.net/manual/en/function.imagick-setcompression.php + * @param compression int

+ *

+ * @return bool &imagick.return.success; + */ + public function setcompression ($compression) {} + + /** + * Sets the object's default compression quality + * @link http://www.php.net/manual/en/function.imagick-setcompressionquality.php + * @param quality int

+ *

+ * @return bool &imagick.return.success; + */ + public function setcompressionquality ($quality) {} + + /** + * Sets the filename before you read or write the image + * @link http://www.php.net/manual/en/function.imagick-setfilename.php + * @param filename string

+ *

+ * @return bool &imagick.return.success; + */ + public function setfilename ($filename) {} + + /** + * Sets the format of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-setformat.php + * @param format string

+ *

+ * @return bool &imagick.return.success; + */ + public function setformat ($format) {} + + /** + * Sets the image compression + * @link http://www.php.net/manual/en/function.imagick-setinterlacescheme.php + * @param interlace_scheme int

+ *

+ * @return bool &imagick.return.success; + */ + public function setinterlacescheme ($interlace_scheme) {} + + /** + * Set an option + * @link http://www.php.net/manual/en/function.imagick-setoption.php + * @param key string

+ *

+ * @param value string

+ *

+ * @return bool &imagick.return.success; + */ + public function setoption ($key, $value) {} + + /** + * Sets the page geometry of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-setpage.php + * @param width int

+ *

+ * @param height int

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @return bool &imagick.return.success; + */ + public function setpage ($width, $height, $x, $y) {} + + /** + * Sets the limit for a particular resource in megabytes + * @link http://www.php.net/manual/en/function.imagick-setresourcelimit.php + * @param type int

+ *

+ * @param limit int

+ *

+ * @return bool &imagick.return.success; + */ + public function setresourcelimit ($type, $limit) {} + + /** + * Sets the image resolution + * @link http://www.php.net/manual/en/function.imagick-setresolution.php + * @param x_resolution float

+ *

+ * @param y_resolution float

+ *

+ * @return bool &imagick.return.success; + */ + public function setresolution ($x_resolution, $y_resolution) {} + + /** + * Sets the image sampling factors + * @link http://www.php.net/manual/en/function.imagick-setsamplingfactors.php + * @param factors array

+ *

+ * @return bool &imagick.return.success; + */ + public function setsamplingfactors (array $factors) {} + + /** + * Sets the size of the Imagick object + * @link http://www.php.net/manual/en/function.imagick-setsize.php + * @param columns int

+ *

+ * @param rows int

+ *

+ * @return bool &imagick.return.success; + */ + public function setsize ($columns, $rows) {} + + /** + * Sets the image type attribute + * @link http://www.php.net/manual/en/function.imagick-settype.php + * @param image_type int

+ *

+ * @return bool &imagick.return.success; + */ + public function settype ($image_type) {} + + public function key () {} + + public function next () {} + + public function rewind () {} + + /** + * Checks if the current item is valid + * @link http://www.php.net/manual/en/function.imagick-valid.php + * @return bool &imagick.return.success; + */ + public function valid () {} + + /** + * Returns a reference to the current Imagick object + * @link http://www.php.net/manual/en/function.imagick-current.php + * @return Imagick self on success. + * &imagick.imagickexception.throw; + */ + public function current () {} + +} + +/** @jms-builtin */ +class ImagickDraw { + + public function resetvectorgraphics () {} + + /** + * The ImagickDraw constructor + * @link http://www.php.net/manual/en/function.imagickdraw-construct.php + * @return ImagickDraw + */ + public function __construct () {} + + /** + * Sets the fill color to be used for drawing filled objects + * @link http://www.php.net/manual/en/function.imagickdraw-setfillcolor.php + * @param fill_pixel ImagickPixel

+ * ImagickPixel to use to set the color + *

+ * @return bool + */ + public function setfillcolor (ImagickPixel $fill_pixel) {} + + /** + * Sets the opacity to use when drawing using the fill color or fill texture + * @link http://www.php.net/manual/en/function.imagickdraw-setfillalpha.php + * @param opacity float

+ * fill alpha + *

+ * @return bool + */ + public function setfillalpha ($opacity) {} + + /** + * Sets the color used for stroking object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokecolor.php + * @param stroke_pixel ImagickPixel

+ * the stroke color + *

+ * @return bool + */ + public function setstrokecolor (ImagickPixel $stroke_pixel) {} + + /** + * Specifies the opacity of stroked object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokealpha.php + * @param opacity float

+ * opacity + *

+ * @return bool + */ + public function setstrokealpha ($opacity) {} + + /** + * Sets the width of the stroke used to draw object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokewidth.php + * @param stroke_width float

+ * stroke width + *

+ * @return bool + */ + public function setstrokewidth ($stroke_width) {} + + /** + * Clears the ImagickDraw + * @link http://www.php.net/manual/en/function.imagickdraw-clear.php + * @return bool an ImagickDraw object. + */ + public function clear () {} + + /** + * Draws a circle + * @link http://www.php.net/manual/en/function.imagickdraw-circle.php + * @param ox float

+ * origin x coordinate + *

+ * @param oy float

+ * origin y coordinate + *

+ * @param px float

+ * perimeter x coordinate + *

+ * @param py float

+ * perimeter y coordinate + *

+ * @return bool + */ + public function circle ($ox, $oy, $px, $py) {} + + /** + * Draws text on the image + * @link http://www.php.net/manual/en/function.imagickdraw-annotation.php + * @param x float

+ * The x coordinate where text is drawn + *

+ * @param y float

+ * The y coordinate where text is drawn + *

+ * @param text string

+ * The text to draw on the image + *

+ * @return bool + */ + public function annotation ($x, $y, $text) {} + + /** + * Controls whether text is antialiased + * @link http://www.php.net/manual/en/function.imagickdraw-settextantialias.php + * @param antiAlias bool

+ *

+ * @return bool + */ + public function settextantialias ($antiAlias) {} + + /** + * Specifies specifies the text code set + * @link http://www.php.net/manual/en/function.imagickdraw-settextencoding.php + * @param encoding string

+ * the encoding name + *

+ * @return bool + */ + public function settextencoding ($encoding) {} + + /** + * Sets the fully-specified font to use when annotating with text + * @link http://www.php.net/manual/en/function.imagickdraw-setfont.php + * @param font_name string

+ *

+ * @return bool &imagick.return.success; + */ + public function setfont ($font_name) {} + + /** + * Sets the font family to use when annotating with text + * @link http://www.php.net/manual/en/function.imagickdraw-setfontfamily.php + * @param font_family string

+ * the font family + *

+ * @return bool &imagick.return.success; + */ + public function setfontfamily ($font_family) {} + + /** + * Sets the font pointsize to use when annotating with text + * @link http://www.php.net/manual/en/function.imagickdraw-setfontsize.php + * @param pointsize float

+ * the point size + *

+ * @return bool + */ + public function setfontsize ($pointsize) {} + + /** + * Sets the font style to use when annotating with text + * @link http://www.php.net/manual/en/function.imagickdraw-setfontstyle.php + * @param style int

+ * STYLETYPE_ constant + *

+ * @return bool + */ + public function setfontstyle ($style) {} + + /** + * Sets the font weight + * @link http://www.php.net/manual/en/function.imagickdraw-setfontweight.php + * @param font_weight int

+ *

+ * @return bool + */ + public function setfontweight ($font_weight) {} + + /** + * Returns the font + * @link http://www.php.net/manual/en/function.imagickdraw-getfont.php + * @return string a string on success and false if no font is set. + */ + public function getfont () {} + + /** + * Returns the font family + * @link http://www.php.net/manual/en/function.imagickdraw-getfontfamily.php + * @return string the font family currently selected or false if font family is not set. + */ + public function getfontfamily () {} + + /** + * Returns the font pointsize + * @link http://www.php.net/manual/en/function.imagickdraw-getfontsize.php + * @return float the font size associated with the current ImagickDraw object. + */ + public function getfontsize () {} + + /** + * Returns the font style + * @link http://www.php.net/manual/en/function.imagickdraw-getfontstyle.php + * @return int the font style constant (STYLE_) associated with the ImagickDraw object + * or 0 if no style is set. + */ + public function getfontstyle () {} + + /** + * Returns the font weight + * @link http://www.php.net/manual/en/function.imagickdraw-getfontweight.php + * @return int an int on success and 0 if no weight is set. + */ + public function getfontweight () {} + + /** + * Frees all associated resources + * @link http://www.php.net/manual/en/function.imagickdraw-destroy.php + * @return bool + */ + public function destroy () {} + + /** + * Draws a rectangle + * @link http://www.php.net/manual/en/function.imagickdraw-rectangle.php + * @param x1 float

+ * x coordinate of the top left corner + *

+ * @param y1 float

+ * y coordinate of the top left corner + *

+ * @param x2 float

+ * x coordinate of the bottom right corner + *

+ * @param y2 float

+ * y coordinate of the bottom right corner + *

+ * @return bool + */ + public function rectangle ($x1, $y1, $x2, $y2) {} + + /** + * Draws a rounded rectangle + * @link http://www.php.net/manual/en/function.imagickdraw-roundrectangle.php + * @param x1 float

+ * x coordinate of the top left corner + *

+ * @param y1 float

+ * y coordinate of the top left corner + *

+ * @param x2 float

+ * x coordinate of the bottom right + *

+ * @param y2 float

+ * y coordinate of the bottom right + *

+ * @param rx float

+ * x rounding + *

+ * @param ry float

+ * y rounding + *

+ * @return bool + */ + public function roundrectangle ($x1, $y1, $x2, $y2, $rx, $ry) {} + + /** + * Draws an ellipse on the image + * @link http://www.php.net/manual/en/function.imagickdraw-ellipse.php + * @param ox float

+ *

+ * @param oy float

+ *

+ * @param rx float

+ *

+ * @param ry float

+ *

+ * @param start float

+ *

+ * @param end float

+ *

+ * @return bool + */ + public function ellipse ($ox, $oy, $rx, $ry, $start, $end) {} + + /** + * Skews the current coordinate system in the horizontal direction + * @link http://www.php.net/manual/en/function.imagickdraw-skewx.php + * @param degrees float

+ * degrees to skew + *

+ * @return bool + */ + public function skewx ($degrees) {} + + /** + * Skews the current coordinate system in the vertical direction + * @link http://www.php.net/manual/en/function.imagickdraw-skewy.php + * @param degrees float

+ * degrees to skew + *

+ * @return bool + */ + public function skewy ($degrees) {} + + /** + * Applies a translation to the current coordinate system + * @link http://www.php.net/manual/en/function.imagickdraw-translate.php + * @param x float

+ * horizontal translation + *

+ * @param y float

+ * vertical translation + *

+ * @return bool + */ + public function translate ($x, $y) {} + + /** + * Draws a line + * @link http://www.php.net/manual/en/function.imagickdraw-line.php + * @param sx float

+ * starting x coordinate + *

+ * @param sy float

+ * starting y coordinate + *

+ * @param ex float

+ * ending x coordinate + *

+ * @param ey float

+ * ending y coordinate + *

+ * @return bool + */ + public function line ($sx, $sy, $ex, $ey) {} + + /** + * Draws an arc + * @link http://www.php.net/manual/en/function.imagickdraw-arc.php + * @param sx float

+ * Starting x ordinate of bounding rectangle + *

+ * @param sy float

+ * starting y ordinate of bounding rectangle + *

+ * @param ex float

+ * ending x ordinate of bounding rectangle + *

+ * @param ey float

+ * ending y ordinate of bounding rectangle + *

+ * @param sd float

+ * starting degrees of rotation + *

+ * @param ed float

+ * ending degrees of rotation + *

+ * @return bool + */ + public function arc ($sx, $sy, $ex, $ey, $sd, $ed) {} + + /** + * Paints on the image's opacity channel + * @link http://www.php.net/manual/en/function.imagickdraw-matte.php + * @param x float

+ * x coordinate of the matte + *

+ * @param y float

+ * y coordinate of the matte + *

+ * @param paintMethod int

+ * PAINT_ constant + *

+ * @return bool Returns true on success or false on failure. + */ + public function matte ($x, $y, $paintMethod) {} + + /** + * Draws a polygon + * @link http://www.php.net/manual/en/function.imagickdraw-polygon.php + * @param coordinates array

+ * multidimensional array like array( array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 ) ); + *

+ * @return bool &imagick.return.success; + */ + public function polygon (array $coordinates) {} + + /** + * Draws a point + * @link http://www.php.net/manual/en/function.imagickdraw-point.php + * @param x float

+ * point's x coordinate + *

+ * @param y float

+ * point's y coordinate + *

+ * @return bool + */ + public function point ($x, $y) {} + + /** + * Returns the text decoration + * @link http://www.php.net/manual/en/function.imagickdraw-gettextdecoration.php + * @return int one of the DECORATION_ constants + * and 0 if no decoration is set. + */ + public function gettextdecoration () {} + + /** + * Returns the code set used for text annotations + * @link http://www.php.net/manual/en/function.imagickdraw-gettextencoding.php + * @return string a string specifying the code set + * or false if text encoding is not set. + */ + public function gettextencoding () {} + + public function getfontstretch () {} + + /** + * Sets the font stretch to use when annotating with text + * @link http://www.php.net/manual/en/function.imagickdraw-setfontstretch.php + * @param fontStretch int

+ * STRETCH_ constant + *

+ * @return bool + */ + public function setfontstretch ($fontStretch) {} + + /** + * Controls whether stroked outlines are antialiased + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokeantialias.php + * @param stroke_antialias bool

+ * the antialias setting + *

+ * @return bool + */ + public function setstrokeantialias ($stroke_antialias) {} + + /** + * Specifies a text alignment + * @link http://www.php.net/manual/en/function.imagickdraw-settextalignment.php + * @param alignment int

+ * ALIGN_ constant + *

+ * @return bool + */ + public function settextalignment ($alignment) {} + + /** + * Specifies a decoration + * @link http://www.php.net/manual/en/function.imagickdraw-settextdecoration.php + * @param decoration int

+ * DECORATION_ constant + *

+ * @return bool + */ + public function settextdecoration ($decoration) {} + + /** + * Specifies the color of a background rectangle + * @link http://www.php.net/manual/en/function.imagickdraw-settextundercolor.php + * @param under_color ImagickPixel

+ * the under color + *

+ * @return bool + */ + public function settextundercolor (ImagickPixel $under_color) {} + + /** + * Sets the overall canvas size + * @link http://www.php.net/manual/en/function.imagickdraw-setviewbox.php + * @param x1 int

+ * left x coordinate + *

+ * @param y1 int

+ * left y coordinate + *

+ * @param x2 int

+ * right x coordinate + *

+ * @param y2 int

+ * right y coordinate + *

+ * @return bool + */ + public function setviewbox ($x1, $y1, $x2, $y2) {} + + /** + * Makes an exact copy of the specified ImagickDraw object + * @link http://www.php.net/manual/en/function.imagickdraw-clone.php + * @return ImagickDraw What the function returns, first on success, then on failure. See + * also the &return.success; entity + */ + public function clone () {} + + /** + * Adjusts the current affine transformation matrix + * @link http://www.php.net/manual/en/function.imagickdraw-affine.php + * @param affine array

+ * Affine matrix parameters + *

+ * @return bool + */ + public function affine (array $affine) {} + + /** + * Draws a bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-bezier.php + * @param coordinates array

+ * Multidimensional array like array( array( 'x' => 1, 'y' => 2 ), + * array( 'x' => 3, 'y' => 4 ) ) + *

+ * @return bool + */ + public function bezier (array $coordinates) {} + + /** + * Composites an image onto the current image + * @link http://www.php.net/manual/en/function.imagickdraw-composite.php + * @param compose int

+ * composition operator. One of COMPOSITE_ constants + *

+ * @param x float

+ * x coordinate of the top left corner + *

+ * @param y float

+ * y coordinate of the top left corner + *

+ * @param width float

+ * width of the composition image + *

+ * @param height float

+ * height of the composition image + *

+ * @param compositeWand Imagick

+ * the Imagick object where composition image is taken from + *

+ * @return bool &imagick.return.success; + */ + public function composite ($compose, $x, $y, $width, $height, Imagick $compositeWand) {} + + /** + * Draws color on image + * @link http://www.php.net/manual/en/function.imagickdraw-color.php + * @param x float

+ * x coordinate of the paint + *

+ * @param y float

+ * y coordinate of the paint + *

+ * @param paintMethod int

+ * one of the PAINT_ constants + *

+ * @return bool + */ + public function color ($x, $y, $paintMethod) {} + + /** + * Adds a comment + * @link http://www.php.net/manual/en/function.imagickdraw-comment.php + * @param comment string

+ * The comment string to add to vector output stream + *

+ * @return bool + */ + public function comment ($comment) {} + + /** + * Obtains the current clipping path ID + * @link http://www.php.net/manual/en/function.imagickdraw-getclippath.php + * @return string a string containing the clip path ID or false if no clip path exists. + */ + public function getclippath () {} + + /** + * Returns the current polygon fill rule + * @link http://www.php.net/manual/en/function.imagickdraw-getcliprule.php + * @return int one of the FILLRULE_ constants. + */ + public function getcliprule () {} + + /** + * Returns the interpretation of clip path units + * @link http://www.php.net/manual/en/function.imagickdraw-getclipunits.php + * @return int an int on success. + */ + public function getclipunits () {} + + /** + * Returns the fill color + * @link http://www.php.net/manual/en/function.imagickdraw-getfillcolor.php + * @return ImagickPixel an ImagickPixel object. + */ + public function getfillcolor () {} + + /** + * Returns the opacity used when drawing + * @link http://www.php.net/manual/en/function.imagickdraw-getfillopacity.php + * @return float The opacity. + */ + public function getfillopacity () {} + + /** + * Returns the fill rule + * @link http://www.php.net/manual/en/function.imagickdraw-getfillrule.php + * @return int a FILLRULE_ constant + */ + public function getfillrule () {} + + /** + * Returns the text placement gravity + * @link http://www.php.net/manual/en/function.imagickdraw-getgravity.php + * @return int a GRAVITY_ constant on success and 0 if no gravity is set. + */ + public function getgravity () {} + + /** + * Returns the current stroke antialias setting + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokeantialias.php + * @return bool true if antialiasing is on and false if it is off. + */ + public function getstrokeantialias () {} + + /** + * Returns the color used for stroking object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokecolor.php + * @param stroke_color ImagickPixel

+ *

+ * @return ImagickPixel an ImagickPixel object which describes the color. + */ + public function getstrokecolor (ImagickPixel $stroke_color) {} + + /** + * Returns an array representing the pattern of dashes and gaps used to stroke paths + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokedasharray.php + * @return array an array on success and empty array if not set. + */ + public function getstrokedasharray () {} + + /** + * Returns the offset into the dash pattern to start the dash + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokedashoffset.php + * @return float a float representing the offset and 0 if it's not set. + */ + public function getstrokedashoffset () {} + + /** + * Returns the shape to be used at the end of open subpaths when they are stroked + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokelinecap.php + * @return int one of the LINECAP_ constants or 0 if stroke linecap is not set. + */ + public function getstrokelinecap () {} + + /** + * Returns the shape to be used at the corners of paths when they are stroked + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokelinejoin.php + * @return int one of the LINEJOIN_ constants or 0 if stroke line join is not set. + */ + public function getstrokelinejoin () {} + + /** + * Returns the stroke miter limit + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokemiterlimit.php + * @return int an int describing the miter limit + * and 0 if no miter limit is set. + */ + public function getstrokemiterlimit () {} + + /** + * Returns the opacity of stroked object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokeopacity.php + * @return float a double describing the opacity. + */ + public function getstrokeopacity () {} + + /** + * Returns the width of the stroke used to draw object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-getstrokewidth.php + * @return float a double describing the stroke width. + */ + public function getstrokewidth () {} + + /** + * Returns the text alignment + * @link http://www.php.net/manual/en/function.imagickdraw-gettextalignment.php + * @return int one of the ALIGN_ constants and 0 if no align is set. + */ + public function gettextalignment () {} + + /** + * Returns the current text antialias setting + * @link http://www.php.net/manual/en/function.imagickdraw-gettextantialias.php + * @return bool true if text is antialiased and false if not. + */ + public function gettextantialias () {} + + /** + * Returns a string containing vector graphics + * @link http://www.php.net/manual/en/function.imagickdraw-getvectorgraphics.php + * @return string a string containing the vector graphics. + */ + public function getvectorgraphics () {} + + /** + * Returns the text under color + * @link http://www.php.net/manual/en/function.imagickdraw-gettextundercolor.php + * @return ImagickPixel an ImagickPixel object describing the color. + */ + public function gettextundercolor () {} + + /** + * Adds a path element to the current path + * @link http://www.php.net/manual/en/function.imagickdraw-pathclose.php + * @return bool + */ + public function pathclose () {} + + /** + * Draws a cubic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetoabsolute.php + * @param x1 float

+ * x coordinate of the first control point + *

+ * @param y1 float

+ * y coordinate of the first control point + *

+ * @param x2 float

+ * x coordinate of the second control point + *

+ * @param y2 float

+ * y coordinate of the first control point + *

+ * @param x float

+ * x coordinate of the curve end + *

+ * @param y float

+ * y coordinate of the curve end + *

+ * @return bool + */ + public function pathcurvetoabsolute ($x1, $y1, $x2, $y2, $x, $y) {} + + /** + * Draws a cubic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetorelative.php + * @param x1 float

+ * x coordinate of starting control point + *

+ * @param y1 float

+ * y coordinate of starting control point + *

+ * @param x2 float

+ * x coordinate of ending control point + *

+ * @param y2 float

+ * y coordinate of ending control point + *

+ * @param x float

+ * ending x coordinate + *

+ * @param y float

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetorelative ($x1, $y1, $x2, $y2, $x, $y) {} + + /** + * Draws a quadratic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbezierabsolute.php + * @param x1 float

+ * x coordinate of the control point + *

+ * @param y1 float

+ * y coordinate of the control point + *

+ * @param x float

+ * x coordinate of the end point + *

+ * @param y float

+ * y coordinate of the end point + *

+ * @return bool + */ + public function pathcurvetoquadraticbezierabsolute ($x1, $y1, $x, $y) {} + + /** + * Draws a quadratic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbezierrelative.php + * @param x1 float

+ * starting x coordinate + *

+ * @param y1 float

+ * starting y coordinate + *

+ * @param x float

+ * ending x coordinate + *

+ * @param y float

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetoquadraticbezierrelative ($x1, $y1, $x, $y) {} + + /** + * Draws a quadratic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbeziersmoothabsolute.php + * @param x float

+ * ending x coordinate + *

+ * @param y float

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetoquadraticbeziersmoothabsolute ($x, $y) {} + + /** + * Draws a quadratic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbeziersmoothrelative.php + * @param x float

+ * ending x coordinate + *

+ * @param y float

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetoquadraticbeziersmoothrelative ($x, $y) {} + + /** + * Draws a cubic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetosmoothabsolute.php + * @param x2 float

+ * x coordinate of the second control point + *

+ * @param y2 float

+ * y coordinate of the second control point + *

+ * @param x float

+ * x coordinate of the ending point + *

+ * @param y float

+ * y coordinate of the ending point + *

+ * @return bool + */ + public function pathcurvetosmoothabsolute ($x2, $y2, $x, $y) {} + + /** + * Draws a cubic Bezier curve + * @link http://www.php.net/manual/en/function.imagickdraw-pathcurvetosmoothrelative.php + * @param x2 float

+ * x coordinate of the second control point + *

+ * @param y2 float

+ * y coordinate of the second control point + *

+ * @param x float

+ * x coordinate of the ending point + *

+ * @param y float

+ * y coordinate of the ending point + *

+ * @return bool + */ + public function pathcurvetosmoothrelative ($x2, $y2, $x, $y) {} + + /** + * Draws an elliptical arc + * @link http://www.php.net/manual/en/function.imagickdraw-pathellipticarcabsolute.php + * @param rx float

+ * x radius + *

+ * @param ry float

+ * y radius + *

+ * @param x_axis_rotation float

+ * x axis rotation + *

+ * @param large_arc_flag bool

+ * large arc flag + *

+ * @param sweep_flag bool

+ * sweep flag + *

+ * @param x float

+ * x coordinate + *

+ * @param y float

+ * y coordinate + *

+ * @return bool + */ + public function pathellipticarcabsolute ($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {} + + /** + * Draws an elliptical arc + * @link http://www.php.net/manual/en/function.imagickdraw-pathellipticarcrelative.php + * @param rx float

+ * x radius + *

+ * @param ry float

+ * y radius + *

+ * @param x_axis_rotation float

+ * x axis rotation + *

+ * @param large_arc_flag bool

+ * large arc flag + *

+ * @param sweep_flag bool

+ * sweep flag + *

+ * @param x float

+ * x coordinate + *

+ * @param y float

+ * y coordinate + *

+ * @return bool + */ + public function pathellipticarcrelative ($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {} + + /** + * Terminates the current path + * @link http://www.php.net/manual/en/function.imagickdraw-pathfinish.php + * @return bool + */ + public function pathfinish () {} + + /** + * Draws a line path + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetoabsolute.php + * @param x float

+ * starting x coordinate + *

+ * @param y float

+ * ending x coordinate + *

+ * @return bool + */ + public function pathlinetoabsolute ($x, $y) {} + + /** + * Draws a line path + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetorelative.php + * @param x float

+ * starting x coordinate + *

+ * @param y float

+ * starting y coordinate + *

+ * @return bool + */ + public function pathlinetorelative ($x, $y) {} + + /** + * Draws a horizontal line path + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetohorizontalabsolute.php + * @param x float

+ * x coordinate + *

+ * @return bool + */ + public function pathlinetohorizontalabsolute ($x) {} + + /** + * Draws a horizontal line + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetohorizontalrelative.php + * @param x float

+ * x coordinate + *

+ * @return bool + */ + public function pathlinetohorizontalrelative ($x) {} + + /** + * Draws a vertical line + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetoverticalabsolute.php + * @param y float

+ * y coordinate + *

+ * @return bool + */ + public function pathlinetoverticalabsolute ($y) {} + + /** + * Draws a vertical line path + * @link http://www.php.net/manual/en/function.imagickdraw-pathlinetoverticalrelative.php + * @param y float

+ * y coordinate + *

+ * @return bool + */ + public function pathlinetoverticalrelative ($y) {} + + /** + * Starts a new sub-path + * @link http://www.php.net/manual/en/function.imagickdraw-pathmovetoabsolute.php + * @param x float

+ * x coordinate of the starting point + *

+ * @param y float

+ * y coordinate of the starting point + *

+ * @return bool + */ + public function pathmovetoabsolute ($x, $y) {} + + /** + * Starts a new sub-path + * @link http://www.php.net/manual/en/function.imagickdraw-pathmovetorelative.php + * @param x float

+ * target x coordinate + *

+ * @param y float

+ * target y coordinate + *

+ * @return bool + */ + public function pathmovetorelative ($x, $y) {} + + /** + * Declares the start of a path drawing list + * @link http://www.php.net/manual/en/function.imagickdraw-pathstart.php + * @return bool + */ + public function pathstart () {} + + /** + * Draws a polyline + * @link http://www.php.net/manual/en/function.imagickdraw-polyline.php + * @param coordinates array

+ * array of x and y coordinates: array( array( 'x' => 4, 'y' => 6 ), array( 'x' => 8, 'y' => 10 ) ) + *

+ * @return bool &imagick.return.success; + */ + public function polyline (array $coordinates) {} + + /** + * Terminates a clip path definition + * @link http://www.php.net/manual/en/function.imagickdraw-popclippath.php + * @return bool + */ + public function popclippath () {} + + /** + * Terminates a definition list + * @link http://www.php.net/manual/en/function.imagickdraw-popdefs.php + * @return bool + */ + public function popdefs () {} + + /** + * Terminates a pattern definition + * @link http://www.php.net/manual/en/function.imagickdraw-poppattern.php + * @return bool Returns true on success or false on failure. + */ + public function poppattern () {} + + /** + * Starts a clip path definition + * @link http://www.php.net/manual/en/function.imagickdraw-pushclippath.php + * @param clip_mask_id string

+ * Clip mask Id + *

+ * @return bool + */ + public function pushclippath ($clip_mask_id) {} + + /** + * Indicates that following commands create named elements for early processing + * @link http://www.php.net/manual/en/function.imagickdraw-pushdefs.php + * @return bool + */ + public function pushdefs () {} + + /** + * Indicates that subsequent commands up to a ImagickDraw::opPattern() command comprise the definition of a named pattern + * @link http://www.php.net/manual/en/function.imagickdraw-pushpattern.php + * @param pattern_id string

+ * the pattern Id + *

+ * @param x float

+ * x coordinate of the top-left corner + *

+ * @param y float

+ * y coordinate of the top-left corner + *

+ * @param width float

+ * width of the pattern + *

+ * @param height float

+ * height of the pattern + *

+ * @return bool Returns true on success or false on failure. + */ + public function pushpattern ($pattern_id, $x, $y, $width, $height) {} + + /** + * Renders all preceding drawing commands onto the image + * @link http://www.php.net/manual/en/function.imagickdraw-render.php + * @return bool Returns true on success or false on failure. + */ + public function render () {} + + /** + * Applies the specified rotation to the current coordinate space + * @link http://www.php.net/manual/en/function.imagickdraw-rotate.php + * @param degrees float

+ * degrees to rotate + *

+ * @return bool + */ + public function rotate ($degrees) {} + + /** + * Adjusts the scaling factor + * @link http://www.php.net/manual/en/function.imagickdraw-scale.php + * @param x float

+ * horizontal factor + *

+ * @param y float

+ * vertical factor + *

+ * @return bool + */ + public function scale ($x, $y) {} + + /** + * Associates a named clipping path with the image + * @link http://www.php.net/manual/en/function.imagickdraw-setclippath.php + * @param clip_mask string

+ * the clipping path name + *

+ * @return bool + */ + public function setclippath ($clip_mask) {} + + /** + * Set the polygon fill rule to be used by the clipping path + * @link http://www.php.net/manual/en/function.imagickdraw-setcliprule.php + * @param fill_rule int

+ * FILLRULE_ constant + *

+ * @return bool + */ + public function setcliprule ($fill_rule) {} + + /** + * Sets the interpretation of clip path units + * @link http://www.php.net/manual/en/function.imagickdraw-setclipunits.php + * @param clip_units int

+ * the number of clip units + *

+ * @return bool + */ + public function setclipunits ($clip_units) {} + + /** + * Sets the opacity to use when drawing using the fill color or fill texture + * @link http://www.php.net/manual/en/function.imagickdraw-setfillopacity.php + * @param fillOpacity float

+ * the fill opacity + *

+ * @return bool + */ + public function setfillopacity ($fillOpacity) {} + + /** + * Sets the URL to use as a fill pattern for filling objects + * @link http://www.php.net/manual/en/function.imagickdraw-setfillpatternurl.php + * @param fill_url string

+ * URL to use to obtain fill pattern. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setfillpatternurl ($fill_url) {} + + /** + * Sets the fill rule to use while drawing polygons + * @link http://www.php.net/manual/en/function.imagickdraw-setfillrule.php + * @param fill_rule int

+ * FILLRULE_ constant + *

+ * @return bool + */ + public function setfillrule ($fill_rule) {} + + /** + * Sets the text placement gravity + * @link http://www.php.net/manual/en/function.imagickdraw-setgravity.php + * @param gravity int

+ * GRAVITY_ constant + *

+ * @return bool + */ + public function setgravity ($gravity) {} + + /** + * Sets the pattern used for stroking object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokepatternurl.php + * @param stroke_url string

+ * stroke URL + *

+ * @return bool imagick.imagickdraw.return.success; + */ + public function setstrokepatternurl ($stroke_url) {} + + /** + * Specifies the offset into the dash pattern to start the dash + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokedashoffset.php + * @param dash_offset float

+ * dash offset + *

+ * @return bool + */ + public function setstrokedashoffset ($dash_offset) {} + + /** + * Specifies the shape to be used at the end of open subpaths when they are stroked + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokelinecap.php + * @param linecap int

+ * LINECAP_ constant + *

+ * @return bool + */ + public function setstrokelinecap ($linecap) {} + + /** + * Specifies the shape to be used at the corners of paths when they are stroked + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokelinejoin.php + * @param linejoin int

+ * LINEJOIN_ constant + *

+ * @return bool + */ + public function setstrokelinejoin ($linejoin) {} + + /** + * Specifies the miter limit + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokemiterlimit.php + * @param miterlimit int

+ * the miter limit + *

+ * @return bool + */ + public function setstrokemiterlimit ($miterlimit) {} + + /** + * Specifies the opacity of stroked object outlines + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokeopacity.php + * @param stroke_opacity float

+ * stroke opacity. 1.0 is fully opaque + *

+ * @return bool + */ + public function setstrokeopacity ($stroke_opacity) {} + + /** + * Sets the vector graphics + * @link http://www.php.net/manual/en/function.imagickdraw-setvectorgraphics.php + * @param xml string

+ * xml containing the vector graphics + *

+ * @return bool Returns true on success or false on failure. + */ + public function setvectorgraphics ($xml) {} + + /** + * Destroys the current ImagickDraw in the stack, and returns to the previously pushed ImagickDraw + * @link http://www.php.net/manual/en/function.imagickdraw-pop.php + * @return bool true on success and false on failure. + */ + public function pop () {} + + /** + * Clones the current ImagickDraw and pushes it to the stack + * @link http://www.php.net/manual/en/function.imagickdraw-push.php + * @return bool Returns true on success or false on failure. + */ + public function push () {} + + /** + * Specifies the pattern of dashes and gaps used to stroke paths + * @link http://www.php.net/manual/en/function.imagickdraw-setstrokedasharray.php + * @param dashArray array

+ * array of floats + *

+ * @return bool &imagick.return.success; + */ + public function setstrokedasharray (array $dashArray) {} + +} + +/** @jms-builtin */ +class ImagickPixelIterator implements Iterator, Traversable { + + /** + * The ImagickPixelIterator constructor + * @link http://www.php.net/manual/en/function.imagickpixeliterator-construct.php + * @param wand Imagick + * @return ImagickPixelIterator &imagick.return.success; + */ + public function __construct (Imagick $wand) {} + + /** + * Returns a new pixel iterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-newpixeliterator.php + * @param wand Imagick + * @return bool &imagick.return.success; Throwing ImagickPixelIteratorException. + */ + public function newpixeliterator (Imagick $wand) {} + + /** + * Returns a new pixel iterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-newpixelregioniterator.php + * @param wand Imagick

+ *

+ * @param x int

+ *

+ * @param y int

+ *

+ * @param columns int

+ *

+ * @param rows int

+ *

+ * @return bool a new ImagickPixelIterator on success; on failure, throws + * ImagickPixelIteratorException. + */ + public function newpixelregioniterator (Imagick $wand, $x, $y, $columns, $rows) {} + + /** + * Returns the current pixel iterator row + * @link http://www.php.net/manual/en/function.imagickpixeliterator-getiteratorrow.php + * @return int the integer offset of the row, throwing + * ImagickPixelIteratorException on error. + */ + public function getiteratorrow () {} + + /** + * Set the pixel iterator row + * @link http://www.php.net/manual/en/function.imagickpixeliterator-setiteratorrow.php + * @param row int

+ *

+ * @return bool &imagick.return.success; + */ + public function setiteratorrow ($row) {} + + /** + * Sets the pixel iterator to the first pixel row + * @link http://www.php.net/manual/en/function.imagickpixeliterator-setiteratorfirstrow.php + * @return bool &imagick.return.success; + */ + public function setiteratorfirstrow () {} + + /** + * Sets the pixel iterator to the last pixel row + * @link http://www.php.net/manual/en/function.imagickpixeliterator-setiteratorlastrow.php + * @return bool &imagick.return.success; + */ + public function setiteratorlastrow () {} + + /** + * Returns the previous row + * @link http://www.php.net/manual/en/function.imagickpixeliterator-getpreviousiteratorrow.php + * @return array the previous row as an array of ImagickPixelWand objects from the + * ImagickPixelIterator, throwing ImagickPixelIteratorException on error. + */ + public function getpreviousiteratorrow () {} + + /** + * Returns the current row of ImagickPixel objects + * @link http://www.php.net/manual/en/function.imagickpixeliterator-getcurrentiteratorrow.php + * @return array a row as an array of ImagickPixel objects that can themselves be iterated. + */ + public function getcurrentiteratorrow () {} + + /** + * Returns the next row of the pixel iterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-getnextiteratorrow.php + * @return array the next row as an array of ImagickPixel objects, throwing + * ImagickPixelIteratorException on error. + */ + public function getnextiteratorrow () {} + + /** + * Resets the pixel iterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-resetiterator.php + * @return bool &imagick.return.success; + */ + public function resetiterator () {} + + /** + * Syncs the pixel iterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-synciterator.php + * @return bool &imagick.return.success; + */ + public function synciterator () {} + + /** + * Deallocates resources associated with a PixelIterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-destroy.php + * @return bool &imagick.return.success; + */ + public function destroy () {} + + /** + * Clear resources associated with a PixelIterator + * @link http://www.php.net/manual/en/function.imagickpixeliterator-clear.php + * @return bool &imagick.return.success; + */ + public function clear () {} + + public function key () {} + + public function next () {} + + public function rewind () {} + + public function current () {} + + public function valid () {} + +} + +/** @jms-builtin */ +class ImagickPixel { + + /** + * Returns the normalized HSL color of the ImagickPixel object + * @link http://www.php.net/manual/en/function.imagickpixel-gethsl.php + * @return array the HSL value in an array with the keys "hue", + * "saturation", and "luminosity". Throws ImagickPixelException on failure. + */ + public function gethsl () {} + + /** + * Sets the normalized HSL color + * @link http://www.php.net/manual/en/function.imagickpixel-sethsl.php + * @param hue float

+ * The normalized value for hue, described as a fractional arc + * (between 0 and 1) of the hue circle, where the zero value is + * red. + *

+ * @param saturation float

+ * The normalized value for saturation, with 1 as full saturation. + *

+ * @param luminosity float

+ * The normalized value for luminosity, on a scale from black at + * 0 to white at 1, with the full HS value at 0.5 luminosity. + *

+ * @return bool &imagick.return.success; + */ + public function sethsl ($hue, $saturation, $luminosity) {} + + public function getcolorvaluequantum () {} + + /** + * @param color_value + */ + public function setcolorvaluequantum ($color_value) {} + + public function getindex () {} + + /** + * @param index + */ + public function setindex ($index) {} + + /** + * The ImagickPixel constructor + * @link http://www.php.net/manual/en/function.imagickpixel-construct.php + * @param color string[optional]

+ * The optional color string to use as the initial value of this object. + *

+ * @return ImagickPixel an ImagickPixel object on success, throwing ImagickPixelException on + * failure. + */ + public function __construct ($color = null) {} + + /** + * Sets the color + * @link http://www.php.net/manual/en/function.imagickpixel-setcolor.php + * @param color string

+ * The color definition to use in order to initialise the + * ImagickPixel object. + *

+ * @return bool true if the specified color was set, false otherwise. + */ + public function setcolor ($color) {} + + /** + * Sets the normalized value of one of the channels + * @link http://www.php.net/manual/en/function.imagickpixel-setcolorvalue.php + * @param color int

+ * One of the Imagick channel color constants. + *

+ * @param value float

+ * The value to set this channel to, ranging from 0 to 1. + *

+ * @return bool &imagick.return.success; + */ + public function setcolorvalue ($color, $value) {} + + /** + * Gets the normalized value of the provided color channel + * @link http://www.php.net/manual/en/function.imagickpixel-getcolorvalue.php + * @param color int

+ * The channel to check, specified as one of the Imagick channel constants. + *

+ * @return float The value of the channel, as a normalized floating-point number, throwing + * ImagickPixelException on error. + */ + public function getcolorvalue ($color) {} + + /** + * Clears resources associated with this object + * @link http://www.php.net/manual/en/function.imagickpixel-clear.php + * @return bool &imagick.return.success; + */ + public function clear () {} + + /** + * Deallocates resources associated with this object + * @link http://www.php.net/manual/en/function.imagickpixel-destroy.php + * @return bool &imagick.return.success; + */ + public function destroy () {} + + /** + * Check the distance between this color and another + * @link http://www.php.net/manual/en/function.imagickpixel-issimilar.php + * @param color ImagickPixel

+ * The ImagickPixel object to compare this object against. + *

+ * @param fuzz float

+ * The maximum distance within which to consider these colors as similar. + * The theoretical maximum for this value is the square root of three + * (1.732). + *

+ * @return bool &imagick.return.success; + */ + public function issimilar (ImagickPixel $color, $fuzz) {} + + /** + * Returns the color + * @link http://www.php.net/manual/en/function.imagickpixel-getcolor.php + * @param normalized bool[optional]

+ * Normalize the color values + *

+ * @return array An array of channel values, each normalized if true is given as param. Throws + * ImagickPixelException on error. + */ + public function getcolor ($normalized = null) {} + + /** + * Returns the color as a string + * @link http://www.php.net/manual/en/function.imagickpixel-getcolorasstring.php + * @return string the color of the ImagickPixel object as a string. + */ + public function getcolorasstring () {} + + /** + * Returns the color count associated with this color + * @link http://www.php.net/manual/en/function.imagickpixel-getcolorcount.php + * @return int the color count as an integer on success, throws + * ImagickPixelException on failure. + */ + public function getcolorcount () {} + + /** + * @param colorCount + */ + public function setcolorcount ($colorCount) {} + + public function clone () {} + +} +// End of imagick v.2.3.0 +?> diff --git a/res/php-5.3-core-api/imap.php b/res/php-5.3-core-api/imap.php new file mode 100644 index 0000000..77ba887 --- /dev/null +++ b/res/php-5.3-core-api/imap.php @@ -0,0 +1,1560 @@ +IMAP stream to a mailbox + * @link http://www.php.net/manual/en/function.imap-open.php + * @param mailbox string

+ * A mailbox name consists of a server and a mailbox path on this server. + * The special name INBOX stands for the current users + * personal mailbox. Mailbox names that contain international characters + * besides those in the printable ASCII space have to be encoded width + * imap_utf7_encode. + *

+ *

+ * The server part, which is enclosed in '{' and '}', consists of the servers + * name or ip address, an optional port (prefixed by ':'), and an optional + * protocol specification (prefixed by '/'). + *

+ *

+ * The server part is mandatory in all mailbox + * parameters. + *

+ *

+ * All names which start with { are remote names, and are + * in the form "{" remote_system_name [":" port] [flags] "}" + * [mailbox_name] where: + * remote_system_name - Internet domain name or + * bracketed IP address of server. + * @param username string

+ * The user name + *

+ * @param password string

+ * The password associated with the username + *

+ * @param options int[optional]

+ * The options are a bit mask with one or more of + * the following: + * OP_READONLY - Open mailbox read-only + * @param n_retries int[optional]

+ * Number of maximum connect attempts + *

+ * @return resource an IMAP stream on success or false on error. + * + * @jms-builtin + */ +function imap_open ($mailbox, $username, $password, $options = null, $n_retries = null) {} + +/** + * Reopen IMAP stream to new mailbox + * @link http://www.php.net/manual/en/function.imap-reopen.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param options int[optional]

+ * The options are a bit mask with one or more of + * the following: + * OP_READONLY - Open mailbox read-only + * @param n_retries int[optional]

+ * Number of maximum connect attempts + *

+ * @return bool true if the stream is reopened, false otherwise. + * + * @jms-builtin + */ +function imap_reopen ($imap_stream, $mailbox, $options = null, $n_retries = null) {} + +/** + * Close an IMAP stream + * @link http://www.php.net/manual/en/function.imap-close.php + * @param imap_stream resource + * @param flag int[optional]

+ * If set to CL_EXPUNGE, the function will silently + * expunge the mailbox before closing, removing all messages marked for + * deletion. You can achieve the same thing by using + * imap_expunge + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_close ($imap_stream, $flag = null) {} + +/** + * Gets the number of messages in the current mailbox + * @link http://www.php.net/manual/en/function.imap-num-msg.php + * @param imap_stream resource + * @return int Return the number of messages in the current mailbox, as an integer. + * + * @jms-builtin + */ +function imap_num_msg ($imap_stream) {} + +/** + * Gets the number of recent messages in current mailbox + * @link http://www.php.net/manual/en/function.imap-num-recent.php + * @param imap_stream resource + * @return int the number of recent messages in the current mailbox, as an + * integer. + * + * @jms-builtin + */ +function imap_num_recent ($imap_stream) {} + +/** + * Returns headers for all messages in a mailbox + * @link http://www.php.net/manual/en/function.imap-headers.php + * @param imap_stream resource + * @return array an array of string formatted with header info. One + * element per mail message. + * + * @jms-builtin + */ +function imap_headers ($imap_stream) {} + +/** + * Read the header of the message + * @link http://www.php.net/manual/en/function.imap-headerinfo.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param fromlength int[optional]

+ * Number of characters for the fetchfrom property. + * Must be greater than or equal to zero. + *

+ * @param subjectlength int[optional]

+ * Number of characters for the fetchsubject property + * Must be greater than or equal to zero. + *

+ * @param defaulthost string[optional]

+ *

+ * @return object the information in an object with following properties: + * toaddress - full to: line, up to 1024 characters + * to - an array of objects from the To: line, with the following + * properties: personal, adl, + * mailbox, and host + * fromaddress - full from: line, up to 1024 characters + * from - an array of objects from the From: line, with the following + * properties: personal, adl, + * mailbox, and host + * ccaddress - full cc: line, up to 1024 characters + * cc - an array of objects from the Cc: line, with the following + * properties: personal, adl, + * mailbox, and host + * bccaddress - full bcc: line, up to 1024 characters + * bcc - an array of objects from the Bcc: line, with the following + * properties: personal, adl, + * mailbox, and host + * reply_toaddress - full Reply-To: line, up to 1024 characters + * reply_to - an array of objects from the Reply-To: line, with the following + * properties: personal, adl, + * mailbox, and host + * senderaddress - full sender: line, up to 1024 characters + * sender - an array of objects from the Sender: line, with the following + * properties: personal, adl, + * mailbox, and host + * return_pathaddress - full Return-Path: line, up to 1024 characters + * return_path - an array of objects from the Return-Path: line, with the + * following properties: personal, + * adl, mailbox, and + * host + * remail - + * date - The message date as found in its headers + * Date - Same as date + * subject - The message subject + * Subject - Same a subject + * in_reply_to - + * message_id - + * newsgroups - + * followup_to - + * references - + * Recent - R if recent and seen, N + * if recent and not seen, ' ' if not recent. + * Unseen - U if not seen AND not recent, ' ' if seen + * OR not seen and recent + * Flagged - F if flagged, ' ' if not flagged + * Answered - A if answered, ' ' if unanswered + * Deleted - D if deleted, ' ' if not deleted + * Draft - X if draft, ' ' if not draft + * Msgno - The message number + * MailDate - + * Size - The message size + * udate - mail message date in Unix time + * fetchfrom - from line formatted to fit fromlength + * characters + * fetchsubject - subject line formatted to fit + * subjectlength characters + * + * @jms-builtin + */ +function imap_headerinfo ($imap_stream, $msg_number, $fromlength = null, $subjectlength = null, $defaulthost = null) {} + +/** + * Parse mail headers from a string + * @link http://www.php.net/manual/en/function.imap-rfc822-parse-headers.php + * @param headers string

+ * The parsed headers data + *

+ * @param defaulthost string[optional]

+ * The default host name + *

+ * @return object an object similar to the one returned by + * imap_header, except for the flags and other + * properties that come from the IMAP server. + * + * @jms-builtin + */ +function imap_rfc822_parse_headers ($headers, $defaulthost = null) {} + +/** + * Returns a properly formatted email address given the mailbox, host, and personal info + * @link http://www.php.net/manual/en/function.imap-rfc822-write-address.php + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param host string

+ * The email host part + *

+ * @param personal string

+ * The name of the account owner + *

+ * @return string a string properly formatted email address as defined in RFC2822. + * + * @jms-builtin + */ +function imap_rfc822_write_address ($mailbox, $host, $personal) {} + +/** + * Parses an address string + * @link http://www.php.net/manual/en/function.imap-rfc822-parse-adrlist.php + * @param address string

+ * A string containing addresses + *

+ * @param default_host string

+ * The default host name + *

+ * @return array an array of objects. The objects properties are: + *

+ *

+ * mailbox - the mailbox name (username) + * host - the host name + * personal - the personal name + * adl - at domain source route + * + * @jms-builtin + */ +function imap_rfc822_parse_adrlist ($address, $default_host) {} + +/** + * Read the message body + * @link http://www.php.net/manual/en/function.imap-body.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param options int[optional]

+ * The optional options are a bit mask + * with one or more of the following: + * FT_UID - The msg_number is a UID + * @return string the body of the specified message, as a string. + * + * @jms-builtin + */ +function imap_body ($imap_stream, $msg_number, $options = null) {} + +/** + * Read the structure of a specified body section of a specific message + * @link http://www.php.net/manual/en/function.imap-bodystruct.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param section string

+ * The body section to read + *

+ * @return object the information in an object, for a detailed description + * of the object structure and properties see + * imap_fetchstructure. + * + * @jms-builtin + */ +function imap_bodystruct ($imap_stream, $msg_number, $section) {} + +/** + * Fetch a particular section of the body of the message + * @link http://www.php.net/manual/en/function.imap-fetchbody.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param section string

+ * The part number. It is a string of integers delimited by period which + * index into a body part list as per the IMAP4 specification + *

+ * @param options int[optional]

+ * A bitmask with one or more of the following: + * FT_UID - The msg_number is a UID + * @return string a particular section of the body of the specified messages as a + * text string. + * + * @jms-builtin + */ +function imap_fetchbody ($imap_stream, $msg_number, $section, $options = null) {} + +/** + * Save a specific body section to a file + * @link http://www.php.net/manual/en/function.imap-savebody.php + * @param imap_stream resource + * @param file mixed

+ * The path to the saved file as a string, or a valid file descriptor + * returned by fopen. + *

+ * @param msg_number int

+ * The message number + *

+ * @param part_number string[optional]

+ * The part number. It is a string of integers delimited by period which + * index into a body part list as per the IMAP4 specification + *

+ * @param options int[optional]

+ * A bitmask with one or more of the following: + * FT_UID - The msg_number is a UID + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_savebody ($imap_stream, $file, $msg_number, $part_number = null, $options = null) {} + +/** + * Returns header for a message + * @link http://www.php.net/manual/en/function.imap-fetchheader.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param options int[optional]

+ * The possible options are: + * FT_UID - The msgno + * argument is a UID + * @return string the header of the specified message as a text string. + * + * @jms-builtin + */ +function imap_fetchheader ($imap_stream, $msg_number, $options = null) {} + +/** + * Read the structure of a particular message + * @link http://www.php.net/manual/en/function.imap-fetchstructure.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param options int[optional]

+ * This optional parameter only has a single option, + * FT_UID, which tells the function to treat the + * msg_number argument as a + * UID. + *

+ * @return object an object includes the envelope, internal date, size, flags and + * body structure along with a similar object for each mime attachment. The + * structure of the returned objects is as follows: + *

+ *

+ * + * Returned Objects for imap_fetchstructure + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
typePrimary body type
encodingBody transfer encoding
ifsubtypetrue if there is a subtype string
subtypeMIME subtype
ifdescriptiontrue if there is a description string
descriptionContent description string
ifidtrue if there is an identification string
idIdentification string
linesNumber of lines
bytesNumber of bytes
ifdispositiontrue if there is a disposition string
dispositionDisposition string
ifdparameterstrue if the dparameters array exists
dparametersAn array of objects where each object has an + * "attribute" and a "value" + * property corresponding to the parameters on the + * Content-disposition MIME + * header.
ifparameterstrue if the parameters array exists
parametersAn array of objects where each object has an + * "attribute" and a "value" + * property.
partsAn array of objects identical in structure to the top-level + * object, each of which corresponds to a MIME body + * part.
+ *

+ *

+ * + * Primary body type (may vary with used library) + * + * + * + * + * + * + * + * + *
0text
1multipart
2message
3application
4audio
5image
6video
7other
+ *

+ *

+ * + * Transfer encodings (may vary with used library) + * + * + * + * + * + * + *
07BIT
18BIT
2BINARY
3BASE64
4QUOTED-PRINTABLE
5OTHER
+ * + * @jms-builtin + */ +function imap_fetchstructure ($imap_stream, $msg_number, $options = null) {} + +/** + * Clears IMAP cache + * @link http://www.php.net/manual/en/function.imap-gc.php + * @param imap_stream resource + * @param caches int

+ * Specifies the cache to purge. It may one or a combination + * of the following constants: + * IMAP_GC_ELT (message cache elements), + * IMAP_GC_ENV (enveloppe and bodies), + * IMAP_GC_TEXTS (texts). + *

+ * @return string true. + * + * @jms-builtin + */ +function imap_gc ($imap_stream, $caches) {} + +/** + * Delete all messages marked for deletion + * @link http://www.php.net/manual/en/function.imap-expunge.php + * @param imap_stream resource + * @return bool true. + * + * @jms-builtin + */ +function imap_expunge ($imap_stream) {} + +/** + * Mark a message for deletion from current mailbox + * @link http://www.php.net/manual/en/function.imap-delete.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param options int[optional]

+ * You can set the FT_UID which tells the function + * to treat the msg_number argument as an + * UID. + *

+ * @return bool true. + * + * @jms-builtin + */ +function imap_delete ($imap_stream, $msg_number, $options = null) {} + +/** + * Unmark the message which is marked deleted + * @link http://www.php.net/manual/en/function.imap-undelete.php + * @param imap_stream resource + * @param msg_number int

+ * The message number + *

+ * @param flags int[optional]

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_undelete ($imap_stream, $msg_number, $flags = null) {} + +/** + * Check current mailbox + * @link http://www.php.net/manual/en/function.imap-check.php + * @param imap_stream resource + * @return object the information in an object with following properties: + * Date - current system time formatted according to RFC2822 + * Driver - protocol used to access this mailbox: + * POP3, IMAP, NNTP + * Mailbox - the mailbox name + * Nmsgs - number of messages in the mailbox + * Recent - number of recent messages in the mailbox + *

+ *

+ * Returns false on failure. + * + * @jms-builtin + */ +function imap_check ($imap_stream) {} + +/** + * Copy specified messages to a mailbox + * @link http://www.php.net/manual/en/function.imap-mail-copy.php + * @param imap_stream resource + * @param msglist string

+ * msglist is a range not just message + * numbers (as described in RFC2060). + *

+ * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param options int[optional]

+ * options is a bitmask of one or more of + * CP_UID - the sequence numbers contain UIDS + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_mail_copy ($imap_stream, $msglist, $mailbox, $options = null) {} + +/** + * Move specified messages to a mailbox + * @link http://www.php.net/manual/en/function.imap-mail-move.php + * @param imap_stream resource + * @param msglist string

+ * msglist is a range not just message numbers + * (as described in RFC2060). + *

+ * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param options int[optional]

+ * options is a bitmask and may contain the single option: + * CP_UID - the sequence numbers contain UIDS + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_mail_move ($imap_stream, $msglist, $mailbox, $options = null) {} + +/** + * Create a MIME message based on given envelope and body sections + * @link http://www.php.net/manual/en/function.imap-mail-compose.php + * @param envelope array

+ * An associative array of headers fields + *

+ * @param body array

+ * An indexed array of bodies + *

+ *

+ * A body is an associative array which can consist of the following + * keys: "type", "encoding", "subtype", "description" and "contents.data" + *

+ * @return string the MIME message. + * + * @jms-builtin + */ +function imap_mail_compose (array $envelope, array $body) {} + +/** + * Create a new mailbox + * @link http://www.php.net/manual/en/function.imap-createmailbox.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information. Names containing international characters should be + * encoded by imap_utf7_encode + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_createmailbox ($imap_stream, $mailbox) {} + +/** + * Rename an old mailbox to new mailbox + * @link http://www.php.net/manual/en/function.imap-renamemailbox.php + * @param imap_stream resource + * @param old_mbox string

+ * The old mailbox name, see imap_open for more + * information + *

+ * @param new_mbox string

+ * The new mailbox name, see imap_open for more + * information + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_renamemailbox ($imap_stream, $old_mbox, $new_mbox) {} + +/** + * Delete a mailbox + * @link http://www.php.net/manual/en/function.imap-deletemailbox.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_deletemailbox ($imap_stream, $mailbox) {} + +/** + * Subscribe to a mailbox + * @link http://www.php.net/manual/en/function.imap-subscribe.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_subscribe ($imap_stream, $mailbox) {} + +/** + * Unsubscribe from a mailbox + * @link http://www.php.net/manual/en/function.imap-unsubscribe.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_unsubscribe ($imap_stream, $mailbox) {} + +/** + * Append a string message to a specified mailbox + * @link http://www.php.net/manual/en/function.imap-append.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param message string

+ * The message to be append, as a string + *

+ *

+ * When talking to the Cyrus IMAP server, you must use "\r\n" as + * your end-of-line terminator instead of "\n" or the operation will + * fail + *

+ * @param options string[optional]

+ * If provided, the options will also be written + * to the mailbox + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_append ($imap_stream, $mailbox, $message, $options = null) {} + +/** + * Check if the IMAP stream is still active + * @link http://www.php.net/manual/en/function.imap-ping.php + * @param imap_stream resource + * @return bool true if the stream is still alive, false otherwise. + * + * @jms-builtin + */ +function imap_ping ($imap_stream) {} + +/** + * Decode BASE64 encoded text + * @link http://www.php.net/manual/en/function.imap-base64.php + * @param text string

+ * The encoded text + *

+ * @return string the decoded message as a string. + * + * @jms-builtin + */ +function imap_base64 ($text) {} + +/** + * Convert a quoted-printable string to an 8 bit string + * @link http://www.php.net/manual/en/function.imap-qprint.php + * @param string string

+ * A quoted-printable string + *

+ * @return string an 8 bits string. + * + * @jms-builtin + */ +function imap_qprint ($string) {} + +/** + * Convert an 8bit string to a quoted-printable string + * @link http://www.php.net/manual/en/function.imap-8bit.php + * @param string string

+ * The 8bit string to convert + *

+ * @return string a quoted-printable string. + * + * @jms-builtin + */ +function imap_8bit ($string) {} + +/** + * Convert an 8bit string to a base64 string + * @link http://www.php.net/manual/en/function.imap-binary.php + * @param string string

+ * The 8bit string + *

+ * @return string a base64 encoded string. + * + * @jms-builtin + */ +function imap_binary ($string) {} + +/** + * Converts MIME-encoded text to UTF-8 + * @link http://www.php.net/manual/en/function.imap-utf8.php + * @param mime_encoded_text string

+ * A MIME encoded string. MIME encoding method and the UTF-8 + * specification are described in RFC2047 and RFC2044 respectively. + *

+ * @return string an UTF-8 encoded string. + * + * @jms-builtin + */ +function imap_utf8 ($mime_encoded_text) {} + +/** + * Returns status information on a mailbox + * @link http://www.php.net/manual/en/function.imap-status.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param options int

+ * Valid flags are: + * SA_MESSAGES - set $status->messages to the + * number of messages in the mailbox + * @return object This function returns an object containing status information. + * The object has the following properties: messages, + * recent, unseen, + * uidnext, and uidvalidity. + *

+ *

+ * flags is also set, which contains a bitmask which can + * be checked against any of the above constants. + * + * @jms-builtin + */ +function imap_status ($imap_stream, $mailbox, $options) {} + +/** + * Get information about the current mailbox + * @link http://www.php.net/manual/en/function.imap-mailboxmsginfo.php + * @param imap_stream resource + * @return object the information in an object with following properties: + * + * Mailbox properties + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Datedate of last change (current datetime)
Driverdriver
Mailboxname of the mailbox
Nmsgsnumber of messages
Recentnumber of recent messages
Unreadnumber of unread messages
Deletednumber of deleted messages
Sizemailbox size
+ *

+ *

+ * Returns false on failure. + * + * @jms-builtin + */ +function imap_mailboxmsginfo ($imap_stream) {} + +/** + * Sets flags on messages + * @link http://www.php.net/manual/en/function.imap-setflag-full.php + * @param imap_stream resource + * @param sequence string

+ * A sequence of message numbers. You can enumerate desired messages + * with the X,Y syntax, or retrieve all messages + * within an interval with the X:Y syntax + *

+ * @param flag string

+ * The flags which you can set are \Seen, + * \Answered, \Flagged, + * \Deleted, and \Draft as + * defined by RFC2060. + *

+ * @param options int[optional]

+ * A bit mask that may contain the single option: + * ST_UID - The sequence argument contains UIDs + * instead of sequence numbers + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_setflag_full ($imap_stream, $sequence, $flag, $options = null) {} + +/** + * Clears flags on messages + * @link http://www.php.net/manual/en/function.imap-clearflag-full.php + * @param imap_stream resource + * @param sequence string

+ * A sequence of message numbers. You can enumerate desired messages + * with the X,Y syntax, or retrieve all messages + * within an interval with the X:Y syntax + *

+ * @param flag string

+ * The flags which you can unset are "\\Seen", "\\Answered", "\\Flagged", + * "\\Deleted", and "\\Draft" (as defined by RFC2060) + *

+ * @param options int[optional]

+ * options are a bit mask and may contain + * the single option: + * ST_UID - The sequence argument contains UIDs + * instead of sequence numbers + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_clearflag_full ($imap_stream, $sequence, $flag, $options = null) {} + +/** + * Gets and sort messages + * @link http://www.php.net/manual/en/function.imap-sort.php + * @param imap_stream resource + * @param criteria int

+ * Criteria can be one (and only one) of the following: + * SORTDATE - message Date + * @param reverse int

+ * Set this to 1 for reverse sorting + *

+ * @param options int[optional]

+ * The options are a bitmask of one or more of the + * following: + * SE_UID - Return UIDs instead of sequence numbers + * @param search_criteria string[optional]

+ *

+ * @param charset string[optional]

+ *

+ * @return array an array of message numbers sorted by the given + * parameters. + * + * @jms-builtin + */ +function imap_sort ($imap_stream, $criteria, $reverse, $options = null, $search_criteria = null, $charset = null) {} + +/** + * This function returns the UID for the given message sequence number + * @link http://www.php.net/manual/en/function.imap-uid.php + * @param imap_stream resource + * @param msg_number int

+ * The message number. + *

+ * @return int The UID of the given message. + * + * @jms-builtin + */ +function imap_uid ($imap_stream, $msg_number) {} + +/** + * Gets the message sequence number for the given UID + * @link http://www.php.net/manual/en/function.imap-msgno.php + * @param imap_stream resource + * @param uid int

+ * The message UID + *

+ * @return int the message sequence number for the given + * uid. + * + * @jms-builtin + */ +function imap_msgno ($imap_stream, $uid) {} + +/** + * Read the list of mailboxes + * @link http://www.php.net/manual/en/function.imap-list.php + * @param imap_stream resource + * @param ref string

+ * ref should normally be just the server + * specification as described in imap_open. + *

+ * @param pattern string &imap.pattern; + * @return array an array containing the names of the mailboxes. + * + * @jms-builtin + */ +function imap_list ($imap_stream, $ref, $pattern) {} + +/** + * List all the subscribed mailboxes + * @link http://www.php.net/manual/en/function.imap-lsub.php + * @param imap_stream resource + * @param ref string

+ * ref should normally be just the server + * specification as described in imap_open + *

+ * @param pattern string &imap.pattern; + * @return array an array of all the subscribed mailboxes. + * + * @jms-builtin + */ +function imap_lsub ($imap_stream, $ref, $pattern) {} + +/** + * Read an overview of the information in the headers of the given message + * @link http://www.php.net/manual/en/function.imap-fetch-overview.php + * @param imap_stream resource + * @param sequence string

+ * A message sequence description. You can enumerate desired messages + * with the X,Y syntax, or retrieve all messages + * within an interval with the X:Y syntax + *

+ * @param options int[optional]

+ * sequence will contain a sequence of message + * indices or UIDs, if this parameter is set to + * FT_UID. + *

+ * @return array an array of objects describing one message header each. + * The object will only define a property if it exists. The possible + * properties are: + * subject - the messages subject + * from - who sent it + * to - recipient + * date - when was it sent + * message_id - Message-ID + * references - is a reference to this message id + * in_reply_to - is a reply to this message id + * size - size in bytes + * uid - UID the message has in the mailbox + * msgno - message sequence number in the mailbox + * recent - this message is flagged as recent + * flagged - this message is flagged + * answered - this message is flagged as answered + * deleted - this message is flagged for deletion + * seen - this message is flagged as already read + * draft - this message is flagged as being a draft + * + * @jms-builtin + */ +function imap_fetch_overview ($imap_stream, $sequence, $options = null) {} + +/** + * Returns all IMAP alert messages that have occurred + * @link http://www.php.net/manual/en/function.imap-alerts.php + * @return array an array of all of the IMAP alert messages generated or false if + * no alert messages are available. + * + * @jms-builtin + */ +function imap_alerts () {} + +/** + * Returns all of the IMAP errors that have occured + * @link http://www.php.net/manual/en/function.imap-errors.php + * @return array This function returns an array of all of the IMAP error messages + * generated since the last imap_errors call, + * or the beginning of the page. Returns false if no error messages are + * available. + * + * @jms-builtin + */ +function imap_errors () {} + +/** + * Gets the last IMAP error that occurred during this page request + * @link http://www.php.net/manual/en/function.imap-last-error.php + * @return string the full text of the last IMAP error message that occurred on the + * current page. Returns false if no error messages are available. + * + * @jms-builtin + */ +function imap_last_error () {} + +/** + * This function returns an array of messages matching the given search criteria + * @link http://www.php.net/manual/en/function.imap-search.php + * @param imap_stream resource + * @param criteria string

+ * A string, delimited by spaces, in which the following keywords are + * allowed. Any multi-word arguments (e.g. + * FROM "joey smith") must be quoted. + * ALL - return all messages matching the rest of the criteria + * @param options int[optional]

+ * Valid values for options are + * SE_UID, which causes the returned array to + * contain UIDs instead of messages sequence numbers. + *

+ * @param charset string[optional]

+ *

+ * @return array an array of message numbers or UIDs. + *

+ *

+ * Return false if it does not understand the search + * criteria or no messages have been found. + * + * @jms-builtin + */ +function imap_search ($imap_stream, $criteria, $options = null, $charset = null) {} + +/** + * Decodes a modified UTF-7 encoded string + * @link http://www.php.net/manual/en/function.imap-utf7-decode.php + * @param text string

+ * A modified UTF-7 encoding string, as defined in RFC 2060, section 5.1.3 (original UTF-7 + * was defined in RFC1642). + *

+ * @return string a string that is encoded in ISO-8859-1 and consists of the same + * sequence of characters in text, or false + * if text contains invalid modified UTF-7 sequence + * or text contains a character that is not part of + * ISO-8859-1 character set. + * + * @jms-builtin + */ +function imap_utf7_decode ($text) {} + +/** + * Converts ISO-8859-1 string to modified UTF-7 text + * @link http://www.php.net/manual/en/function.imap-utf7-encode.php + * @param data string

+ * An ISO-8859-1 string. + *

+ * @return string data encoded with the modified UTF-7 + * encoding as defined in RFC 2060, + * section 5.1.3 (original UTF-7 was defined in RFC1642). + * + * @jms-builtin + */ +function imap_utf7_encode ($data) {} + +/** + * @param in + * + * @jms-builtin + */ +function imap_utf8_to_mutf7 ($in) {} + +/** + * @param in + * + * @jms-builtin + */ +function imap_mutf7_to_utf8 ($in) {} + +/** + * Decode MIME header elements + * @link http://www.php.net/manual/en/function.imap-mime-header-decode.php + * @param text string

+ * The MIME text + *

+ * @return array The decoded elements are returned in an array of objects, where each + * object has two properties, charset and + * text. + *

+ *

+ * If the element hasn't been encoded, and in other words is in + * plain US-ASCII, the charset property of that element is + * set to default. + * + * @jms-builtin + */ +function imap_mime_header_decode ($text) {} + +/** + * Returns a tree of threaded message + * @link http://www.php.net/manual/en/function.imap-thread.php + * @param imap_stream resource + * @param options int[optional]

+ *

+ * @return array imap_thread returns an associative array containing + * a tree of messages threaded by REFERENCES, or false + * on error. + *

+ *

+ * Every message in the current mailbox will be represented by three entries + * in the resulting array: + *

+ * $thread["XX.num"] - current message number + *

+ *

+ * $thread["XX.next"] + *

+ *

+ * $thread["XX.branch"] + *

+ * + * @jms-builtin + */ +function imap_thread ($imap_stream, $options = null) {} + +/** + * Set or fetch imap timeout + * @link http://www.php.net/manual/en/function.imap-timeout.php + * @param timeout_type int

+ * One of the following: + * IMAP_OPENTIMEOUT, + * IMAP_READTIMEOUT, + * IMAP_WRITETIMEOUT, or + * IMAP_CLOSETIMEOUT. + *

+ * @param timeout int[optional]

+ * The timeout, in seconds. + *

+ * @return mixed If the timeout parameter is set, this function + * returns true on success and false on failure. + *

+ *

+ * If timeout is not provided or evaluates to -1, + * the current timeout value of timeout_type is + * returned as an integer. + * + * @jms-builtin + */ +function imap_timeout ($timeout_type, $timeout = null) {} + +/** + * Retrieve the quota level settings, and usage statics per mailbox + * @link http://www.php.net/manual/en/function.imap-get-quota.php + * @param imap_stream resource + * @param quota_root string

+ * quota_root should normally be in the form of + * user.name where name is the mailbox you wish to + * retrieve information about. + *

+ * @return array an array with integer values limit and usage for the given + * mailbox. The value of limit represents the total amount of space + * allowed for this mailbox. The usage value represents the mailboxes + * current level of capacity. Will return false in the case of failure. + *

+ *

+ * As of PHP 4.3, the function more properly reflects the + * functionality as dictated by the RFC2087. + * The array return value has changed to support an unlimited number of returned + * resources (i.e. messages, or sub-folders) with each named resource receiving + * an individual array key. Each key value then contains an another array with + * the usage and limit values within it. + *

+ *

+ * For backwards compatibility reasons, the original access methods are + * still available for use, although it is suggested to update. + * + * @jms-builtin + */ +function imap_get_quota ($imap_stream, $quota_root) {} + +/** + * Retrieve the quota settings per user + * @link http://www.php.net/manual/en/function.imap-get-quotaroot.php + * @param imap_stream resource + * @param quota_root string

+ * quota_root should normally be in the form of + * which mailbox (i.e. INBOX). + *

+ * @return array an array of integer values pertaining to the specified user + * mailbox. All values contain a key based upon the resource name, and a + * corresponding array with the usage and limit values within. + *

+ *

+ * This function will return false in the case of call failure, and an + * array of information about the connection upon an un-parsable response + * from the server. + * + * @jms-builtin + */ +function imap_get_quotaroot ($imap_stream, $quota_root) {} + +/** + * Sets a quota for a given mailbox + * @link http://www.php.net/manual/en/function.imap-set-quota.php + * @param imap_stream resource + * @param quota_root string

+ * The mailbox to have a quota set. This should follow the IMAP standard + * format for a mailbox: user.name. + *

+ * @param quota_limit int

+ * The maximum size (in KB) for the quota_root + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_set_quota ($imap_stream, $quota_root, $quota_limit) {} + +/** + * Sets the ACL for a giving mailbox + * @link http://www.php.net/manual/en/function.imap-setacl.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @param id string

+ * The user to give the rights to. + *

+ * @param rights string

+ * The rights to give to the user. Passing an empty string will delete + * acl. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_setacl ($imap_stream, $mailbox, $id, $rights) {} + +/** + * Gets the ACL for a given mailbox + * @link http://www.php.net/manual/en/function.imap-getacl.php + * @param imap_stream resource + * @param mailbox string

+ * The mailbox name, see imap_open for more + * information + *

+ * @return array an associative array of "folder" => "acl" pairs. + * + * @jms-builtin + */ +function imap_getacl ($imap_stream, $mailbox) {} + +/** + * Send an email message + * @link http://www.php.net/manual/en/function.imap-mail.php + * @param to string

+ * The receiver + *

+ * @param subject string

+ * The mail subject + *

+ * @param message string

+ * The mail body + *

+ * @param additional_headers string[optional]

+ * As string with additional headers to be set on the mail + *

+ * @param cc string[optional]

+ *

+ * @param bcc string[optional]

+ * The receivers specified in bcc will get the + * mail, but are excluded from the headers. + *

+ * @param rpath string[optional]

+ * Use this parameter to specify return path upon mail delivery failure. + * This is useful when using PHP as a mail client for multiple users. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function imap_mail ($to, $subject, $message, $additional_headers = null, $cc = null, $bcc = null, $rpath = null) {} + +/** + * &Alias; imap_headerinfo + * @link http://www.php.net/manual/en/function.imap-header.php + * @param stream_id + * @param msg_no + * @param from_length[optional] + * @param subject_length[optional] + * @param default_host[optional] + * + * @jms-builtin + */ +function imap_header ($stream_id, $msg_no, $from_length, $subject_length, $default_host) {} + +/** + * &Alias; imap_list + * @link http://www.php.net/manual/en/function.imap-listmailbox.php + * @param stream_id + * @param ref + * @param pattern + * + * @jms-builtin + */ +function imap_listmailbox ($stream_id, $ref, $pattern) {} + +/** + * Read the list of mailboxes, returning detailed information on each one + * @link http://www.php.net/manual/en/function.imap-getmailboxes.php + * @param imap_stream resource + * @param ref string

+ * ref should normally be just the server + * specification as described in imap_open + *

+ * @param pattern string &imap.pattern; + * @return array an array of objects containing mailbox information. Each + * object has the attributes name, specifying + * the full name of the mailbox; delimiter, + * which is the hierarchy delimiter for the part of the hierarchy + * this mailbox is in; and + * attributes. Attributes + * is a bitmask that can be tested against: + *

+ * LATT_NOINFERIORS - This mailbox contains, and may not contain any + * "children" (there are no mailboxes below this one). Calling + * imap_createmailbox will not work on this mailbox. + *

+ *

+ * LATT_NOSELECT - This is only a container, + * not a mailbox - you cannot open it. + *

+ *

+ * LATT_MARKED - This mailbox is marked. This means that it may + * contain new messages since the last time it was checked. Not provided by all IMAP + * servers. + *

+ *

+ * LATT_UNMARKED - This mailbox is not marked, does not contain new + * messages. If either MARKED or UNMARKED is + * provided, you can assume the IMAP server supports this feature for this mailbox. + *

+ * + * @jms-builtin + */ +function imap_getmailboxes ($imap_stream, $ref, $pattern) {} + +/** + * &Alias; imap_listscan + * @link http://www.php.net/manual/en/function.imap-scanmailbox.php + * @param stream_id + * @param ref + * @param pattern + * @param content + * + * @jms-builtin + */ +function imap_scanmailbox ($stream_id, $ref, $pattern, $content) {} + +/** + * &Alias; imap_lsub + * @link http://www.php.net/manual/en/function.imap-listsubscribed.php + * @param stream_id + * @param ref + * @param pattern + * + * @jms-builtin + */ +function imap_listsubscribed ($stream_id, $ref, $pattern) {} + +/** + * List all the subscribed mailboxes + * @link http://www.php.net/manual/en/function.imap-getsubscribed.php + * @param imap_stream resource + * @param ref string

+ * ref should normally be just the server + * specification as described in imap_open + *

+ * @param pattern string &imap.pattern; + * @return array an array of objects containing mailbox information. Each + * object has the attributes name, specifying + * the full name of the mailbox; delimiter, + * which is the hierarchy delimiter for the part of the hierarchy + * this mailbox is in; and + * attributes. Attributes + * is a bitmask that can be tested against: + * LATT_NOINFERIORS - This mailbox has no + * "children" (there are no mailboxes below this one). + * LATT_NOSELECT - This is only a container, + * not a mailbox - you cannot open it. + * LATT_MARKED - This mailbox is marked. + * Only used by UW-IMAPD. + * LATT_UNMARKED - This mailbox is not marked. + * Only used by UW-IMAPD. + * + * @jms-builtin + */ +function imap_getsubscribed ($imap_stream, $ref, $pattern) {} + +/** + * @param stream_id + * @param msg_no + * @param options[optional] + * + * @jms-builtin + */ +function imap_fetchtext ($stream_id, $msg_no, $options) {} + +/** + * @param stream_id + * @param ref + * @param pattern + * @param content + * + * @jms-builtin + */ +function imap_scan ($stream_id, $ref, $pattern, $content) {} + +/** + * @param stream_id + * @param mailbox + * + * @jms-builtin + */ +function imap_create ($stream_id, $mailbox) {} + +/** + * @param stream_id + * @param old_name + * @param new_name + * + * @jms-builtin + */ +function imap_rename ($stream_id, $old_name, $new_name) {} + +define ('NIL', 0); +define ('IMAP_OPENTIMEOUT', 1); +define ('IMAP_READTIMEOUT', 2); +define ('IMAP_WRITETIMEOUT', 3); +define ('IMAP_CLOSETIMEOUT', 4); +define ('OP_DEBUG', 1); +define ('OP_READONLY', 2); +define ('OP_ANONYMOUS', 4); +define ('OP_SHORTCACHE', 8); +define ('OP_SILENT', 16); +define ('OP_PROTOTYPE', 32); +define ('OP_HALFOPEN', 64); +define ('OP_EXPUNGE', 128); +define ('OP_SECURE', 256); +define ('CL_EXPUNGE', 32768); +define ('FT_UID', 1); +define ('FT_PEEK', 2); +define ('FT_NOT', 4); +define ('FT_INTERNAL', 8); +define ('FT_PREFETCHTEXT', 32); +define ('ST_UID', 1); +define ('ST_SILENT', 2); +define ('ST_SET', 4); +define ('CP_UID', 1); +define ('CP_MOVE', 2); +define ('SE_UID', 1); +define ('SE_FREE', 2); +define ('SE_NOPREFETCH', 4); +define ('SO_FREE', 8); +define ('SO_NOSERVER', 16); +define ('SA_MESSAGES', 1); +define ('SA_RECENT', 2); +define ('SA_UNSEEN', 4); +define ('SA_UIDNEXT', 8); +define ('SA_UIDVALIDITY', 16); +define ('SA_ALL', 31); +define ('LATT_NOINFERIORS', 1); +define ('LATT_NOSELECT', 2); +define ('LATT_MARKED', 4); +define ('LATT_UNMARKED', 8); +define ('LATT_REFERRAL', 16); +define ('LATT_HASCHILDREN', 32); +define ('LATT_HASNOCHILDREN', 64); +define ('SORTDATE', 0); +define ('SORTARRIVAL', 1); +define ('SORTFROM', 2); +define ('SORTSUBJECT', 3); +define ('SORTTO', 4); +define ('SORTCC', 5); +define ('SORTSIZE', 6); +define ('TYPETEXT', 0); +define ('TYPEMULTIPART', 1); +define ('TYPEMESSAGE', 2); +define ('TYPEAPPLICATION', 3); +define ('TYPEAUDIO', 4); +define ('TYPEIMAGE', 5); +define ('TYPEVIDEO', 6); +define ('TYPEMODEL', 7); +define ('TYPEOTHER', 8); +define ('ENC7BIT', 0); +define ('ENC8BIT', 1); +define ('ENCBINARY', 2); +define ('ENCBASE64', 3); +define ('ENCQUOTEDPRINTABLE', 4); +define ('ENCOTHER', 5); +define ('IMAP_GC_ELT', 1); +define ('IMAP_GC_ENV', 2); +define ('IMAP_GC_TEXTS', 4); + +// End of imap v. +?> diff --git a/res/php-5.3-core-api/json.php b/res/php-5.3-core-api/json.php new file mode 100644 index 0000000..72d8ac4 --- /dev/null +++ b/res/php-5.3-core-api/json.php @@ -0,0 +1,121 @@ + + * The value being encoded. Can be any type except + * a resource. + *

+ *

+ * This function only works with UTF-8 encoded data. + *

+ * @param options int[optional]

+ * Bitmask consisting of JSON_HEX_QUOT, + * JSON_HEX_TAG, + * JSON_HEX_AMP, + * JSON_HEX_APOS, + * JSON_FORCE_OBJECT. + *

+ * @return string a JSON encoded string on success. + * + * @jms-builtin + */ +function json_encode ($value, $options = null) {} + +/** + * Decodes a JSON string + * @link http://www.php.net/manual/en/function.json-decode.php + * @param json string

+ * The json string being decoded. + *

+ * @param assoc bool[optional]

+ * When true, returned objects will be converted into + * associative arrays. + *

+ * @param depth int[optional]

+ * User specified recursion depth. + *

+ * @return mixed the value encoded in json in appropriate + * PHP type. Values true, false and + * null (case-insensitive) are returned as true, false + * and &null; respectively. &null; is returned if the + * json cannot be decoded or if the encoded + * data is deeper than the recursion limit. + * + * @jms-builtin + */ +function json_decode ($json, $assoc = null, $depth = null) {} + +/** + * Returns the last error occurred + * @link http://www.php.net/manual/en/function.json-last-error.php + * @return int an integer, the value can be one of the following + * constants: + * + * @jms-builtin + */ +function json_last_error () {} + + +/** + * All < and > are converted to \u003C and \u003E. + * @link http://www.php.net/manual/en/json.constants.php + */ +define ('JSON_HEX_TAG', 1); + +/** + * All &s are converted to \u0026. + * @link http://www.php.net/manual/en/json.constants.php + */ +define ('JSON_HEX_AMP', 2); + +/** + * All ' are converted to \u0027. + * @link http://www.php.net/manual/en/json.constants.php + */ +define ('JSON_HEX_APOS', 4); + +/** + * All " are converted to \u0022. + * @link http://www.php.net/manual/en/json.constants.php + */ +define ('JSON_HEX_QUOT', 8); + +/** + * Outputs an object rather than an array when a non-associative array is + * used. Especially useful when the recipient of the output is expecting + * an object and the array is empty. + * @link http://www.php.net/manual/en/json.constants.php + */ +define ('JSON_FORCE_OBJECT', 16); + +/** + * No error has occurred. + * @link http://www.php.net/manual/en/json.constants.php + */ +define ('JSON_ERROR_NONE', 0); + +/** + * The maximum stack depth has been exceeded. + * @link http://www.php.net/manual/en/json.constants.php + */ +define ('JSON_ERROR_DEPTH', 1); +define ('JSON_ERROR_STATE_MISMATCH', 2); + +/** + * Control character error, possibly incorrectly encoded. + * @link http://www.php.net/manual/en/json.constants.php + */ +define ('JSON_ERROR_CTRL_CHAR', 3); + +/** + * Syntax error. + * @link http://www.php.net/manual/en/json.constants.php + */ +define ('JSON_ERROR_SYNTAX', 4); + +// End of json v.1.2.1 +?> diff --git a/res/php-5.3-core-api/ldap.php b/res/php-5.3-core-api/ldap.php new file mode 100644 index 0000000..8f4242a --- /dev/null +++ b/res/php-5.3-core-api/ldap.php @@ -0,0 +1,947 @@ + + * If you are using OpenLDAP 2.x.x you can specify a URL instead of the + * hostname. To use LDAP with SSL, compile OpenLDAP 2.x.x with SSL + * support, configure PHP with SSL, and set this parameter as + * ldaps://hostname/. + *

+ * @param port int[optional]

+ * The port to connect to. Not used when using URLs. + *

+ * @return resource a positive LDAP link identifier on success, or false on error. + * When OpenLDAP 2.x.x is used, ldap_connect will always + * return a resource as it does not actually connect but just + * initializes the connecting parameters. The actual connect happens with + * the next calls to ldap_* funcs, usually with + * ldap_bind. + *

+ *

+ * If no arguments are specified then the link identifier of the already + * opened link will be returned. + * + * @jms-builtin + */ +function ldap_connect ($hostname = null, $port = null) {} + +/** + * &Alias; ldap_unbind + * @link http://www.php.net/manual/en/function.ldap-close.php + * @param link_identifier + * + * @jms-builtin + */ +function ldap_close ($link_identifier) {} + +/** + * Bind to LDAP directory + * @link http://www.php.net/manual/en/function.ldap-bind.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param bind_rdn string[optional]

+ *

+ * @param bind_password string[optional]

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_bind ($link_identifier, $bind_rdn = null, $bind_password = null) {} + +/** + * Unbind from LDAP directory + * @link http://www.php.net/manual/en/function.ldap-unbind.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_unbind ($link_identifier) {} + +/** + * Read an entry + * @link http://www.php.net/manual/en/function.ldap-read.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param base_dn string

+ * The base DN for the directory. + *

+ * @param filter string

+ * An empty filter is not allowed. If you want to retrieve absolutely all + * information for this entry, use a filter of + * objectClass=*. If you know which entry types are + * used on the directory server, you might use an appropriate filter such + * as objectClass=inetOrgPerson. + *

+ * @param attributes array[optional]

+ * An array of the required attributes, e.g. array("mail", "sn", "cn"). + * Note that the "dn" is always returned irrespective of which attributes + * types are requested. + *

+ *

+ * Using this parameter is much more efficient than the default action + * (which is to return all attributes and their associated values). + * The use of this parameter should therefore be considered good + * practice. + *

+ * @param attrsonly int[optional]

+ * Should be set to 1 if only attribute types are wanted. If set to 0 + * both attributes types and attribute values are fetched which is the + * default behaviour. + *

+ * @param sizelimit int[optional]

+ * Enables you to limit the count of entries fetched. Setting this to 0 + * means no limit. + *

+ *

+ * This parameter can NOT override server-side preset sizelimit. You can + * set it lower though. + *

+ *

+ * Some directory server hosts will be configured to return no more than + * a preset number of entries. If this occurs, the server will indicate + * that it has only returned a partial results set. This also occurs if + * you use this parameter to limit the count of fetched entries. + *

+ * @param timelimit int[optional]

+ * Sets the number of seconds how long is spend on the search. Setting + * this to 0 means no limit. + *

+ *

+ * This parameter can NOT override server-side preset timelimit. You can + * set it lower though. + *

+ * @param deref int[optional]

+ * Specifies how aliases should be handled during the search. It can be + * one of the following: + * LDAP_DEREF_NEVER - (default) aliases are never + * dereferenced. + * @return resource a search result identifier or false on error. + * + * @jms-builtin + */ +function ldap_read ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) {} + +/** + * Single-level search + * @link http://www.php.net/manual/en/function.ldap-list.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param base_dn string

+ * The base DN for the directory. + *

+ * @param filter string

+ *

+ * @param attributes array[optional]

+ * An array of the required attributes, e.g. array("mail", "sn", "cn"). + * Note that the "dn" is always returned irrespective of which attributes + * types are requested. + *

+ *

+ * Using this parameter is much more efficient than the default action + * (which is to return all attributes and their associated values). + * The use of this parameter should therefore be considered good + * practice. + *

+ * @param attrsonly int[optional]

+ * Should be set to 1 if only attribute types are wanted. If set to 0 + * both attributes types and attribute values are fetched which is the + * default behaviour. + *

+ * @param sizelimit int[optional]

+ * Enables you to limit the count of entries fetched. Setting this to 0 + * means no limit. + *

+ *

+ * This parameter can NOT override server-side preset sizelimit. You can + * set it lower though. + *

+ *

+ * Some directory server hosts will be configured to return no more than + * a preset number of entries. If this occurs, the server will indicate + * that it has only returned a partial results set. This also occurs if + * you use this parameter to limit the count of fetched entries. + *

+ * @param timelimit int[optional]

+ * Sets the number of seconds how long is spend on the search. Setting + * this to 0 means no limit. + *

+ *

+ * This parameter can NOT override server-side preset timelimit. You can + * set it lower though. + *

+ * @param deref int[optional]

+ * Specifies how aliases should be handled during the search. It can be + * one of the following: + * LDAP_DEREF_NEVER - (default) aliases are never + * dereferenced. + * @return resource a search result identifier or false on error. + * + * @jms-builtin + */ +function ldap_list ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) {} + +/** + * Search LDAP tree + * @link http://www.php.net/manual/en/function.ldap-search.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param base_dn string

+ * The base DN for the directory. + *

+ * @param filter string

+ * The search filter can be simple or advanced, using boolean operators in + * the format described in the LDAP documentation (see the Netscape Directory SDK for full + * information on filters). + *

+ * @param attributes array[optional]

+ * An array of the required attributes, e.g. array("mail", "sn", "cn"). + * Note that the "dn" is always returned irrespective of which attributes + * types are requested. + *

+ *

+ * Using this parameter is much more efficient than the default action + * (which is to return all attributes and their associated values). + * The use of this parameter should therefore be considered good + * practice. + *

+ * @param attrsonly int[optional]

+ * Should be set to 1 if only attribute types are wanted. If set to 0 + * both attributes types and attribute values are fetched which is the + * default behaviour. + *

+ * @param sizelimit int[optional]

+ * Enables you to limit the count of entries fetched. Setting this to 0 + * means no limit. + *

+ *

+ * This parameter can NOT override server-side preset sizelimit. You can + * set it lower though. + *

+ *

+ * Some directory server hosts will be configured to return no more than + * a preset number of entries. If this occurs, the server will indicate + * that it has only returned a partial results set. This also occurs if + * you use this parameter to limit the count of fetched entries. + *

+ * @param timelimit int[optional]

+ * Sets the number of seconds how long is spend on the search. Setting + * this to 0 means no limit. + *

+ *

+ * This parameter can NOT override server-side preset timelimit. You can + * set it lower though. + *

+ * @param deref int[optional]

+ * Specifies how aliases should be handled during the search. It can be + * one of the following: + * LDAP_DEREF_NEVER - (default) aliases are never + * dereferenced. + * @return resource a search result identifier or false on error. + * + * @jms-builtin + */ +function ldap_search ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) {} + +/** + * Free result memory + * @link http://www.php.net/manual/en/function.ldap-free-result.php + * @param result_identifier resource

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_free_result ($result_identifier) {} + +/** + * Count the number of entries in a search + * @link http://www.php.net/manual/en/function.ldap-count-entries.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_identifier resource

+ * The internal LDAP result. + *

+ * @return int number of entries in the result or false on error. + * + * @jms-builtin + */ +function ldap_count_entries ($link_identifier, $result_identifier) {} + +/** + * Return first result id + * @link http://www.php.net/manual/en/function.ldap-first-entry.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_identifier resource

+ *

+ * @return resource the result entry identifier for the first entry on success and + * false on error. + * + * @jms-builtin + */ +function ldap_first_entry ($link_identifier, $result_identifier) {} + +/** + * Get next result entry + * @link http://www.php.net/manual/en/function.ldap-next-entry.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @return resource entry identifier for the next entry in the result whose entries + * are being read starting with ldap_first_entry. If + * there are no more entries in the result then it returns false. + * + * @jms-builtin + */ +function ldap_next_entry ($link_identifier, $result_entry_identifier) {} + +/** + * Get all result entries + * @link http://www.php.net/manual/en/function.ldap-get-entries.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_identifier resource

+ *

+ * @return array a complete result information in a multi-dimensional array on + * success and false on error. + *

+ *

+ * The structure of the array is as follows. + * The attribute index is converted to lowercase. (Attributes are + * case-insensitive for directory servers, but not when used as + * array indices.) + * + * @jms-builtin + */ +function ldap_get_entries ($link_identifier, $result_identifier) {} + +/** + * Return first attribute + * @link http://www.php.net/manual/en/function.ldap-first-attribute.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @return string the first attribute in the entry on success and false on + * error. + * + * @jms-builtin + */ +function ldap_first_attribute ($link_identifier, $result_entry_identifier) {} + +/** + * Get the next attribute in result + * @link http://www.php.net/manual/en/function.ldap-next-attribute.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @return string the next attribute in an entry on success and false on + * error. + * + * @jms-builtin + */ +function ldap_next_attribute ($link_identifier, $result_entry_identifier) {} + +/** + * Get attributes from a search result entry + * @link http://www.php.net/manual/en/function.ldap-get-attributes.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @return array a complete entry information in a multi-dimensional array + * on success and false on error. + * + * @jms-builtin + */ +function ldap_get_attributes ($link_identifier, $result_entry_identifier) {} + +/** + * Get all values from a result entry + * @link http://www.php.net/manual/en/function.ldap-get-values.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @param attribute string

+ *

+ * @return array an array of values for the attribute on success and false on + * error. The number of values can be found by indexing "count" in the + * resultant array. Individual values are accessed by integer index in the + * array. The first index is 0. + *

+ *

+ * LDAP allows more than one entry for an attribute, so it can, for example, + * store a number of email addresses for one person's directory entry all + * labeled with the attribute "mail" + * return_value["count"] = number of values for attribute + * return_value[0] = first value of attribute + * return_value[i] = ith value of attribute + * + * @jms-builtin + */ +function ldap_get_values ($link_identifier, $result_entry_identifier, $attribute) {} + +/** + * Get all binary values from a result entry + * @link http://www.php.net/manual/en/function.ldap-get-values-len.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @param attribute string

+ *

+ * @return array an array of values for the attribute on success and false on + * error. Individual values are accessed by integer index in the array. The + * first index is 0. The number of values can be found by indexing "count" + * in the resultant array. + * + * @jms-builtin + */ +function ldap_get_values_len ($link_identifier, $result_entry_identifier, $attribute) {} + +/** + * Get the DN of a result entry + * @link http://www.php.net/manual/en/function.ldap-get-dn.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param result_entry_identifier resource

+ *

+ * @return string the DN of the result entry and false on error. + * + * @jms-builtin + */ +function ldap_get_dn ($link_identifier, $result_entry_identifier) {} + +/** + * Splits DN into its component parts + * @link http://www.php.net/manual/en/function.ldap-explode-dn.php + * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param with_attrib int

+ * Used to request if the RDNs are returned with only values or their + * attributes as well. To get RDNs with the attributes (i.e. in + * attribute=value format) set with_attrib to 0 + * and to get only values set it to 1. + *

+ * @return array an array of all DN components. + * The first element in this array has count key and + * represents the number of returned values, next elements are numerically + * indexed DN components. + * + * @jms-builtin + */ +function ldap_explode_dn ($dn, $with_attrib) {} + +/** + * Convert DN to User Friendly Naming format + * @link http://www.php.net/manual/en/function.ldap-dn2ufn.php + * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @return string the user friendly name. + * + * @jms-builtin + */ +function ldap_dn2ufn ($dn) {} + +/** + * Add entries to LDAP directory + * @link http://www.php.net/manual/en/function.ldap-add.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param entry array

+ * An array that specifies the information about the entry. The values in + * the entries are indexed by individual attributes. + * In case of multiple values for an attribute, they are indexed using + * integers starting with 0. + * ]]> + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_add ($link_identifier, $dn, array $entry) {} + +/** + * Delete an entry from a directory + * @link http://www.php.net/manual/en/function.ldap-delete.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_delete ($link_identifier, $dn) {} + +/** + * Modify an LDAP entry + * @link http://www.php.net/manual/en/function.ldap-modify.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param entry array

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_modify ($link_identifier, $dn, array $entry) {} + +/** + * Add attribute values to current attributes + * @link http://www.php.net/manual/en/function.ldap-mod-add.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param entry array

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_mod_add ($link_identifier, $dn, array $entry) {} + +/** + * Replace attribute values with new ones + * @link http://www.php.net/manual/en/function.ldap-mod-replace.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param entry array

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_mod_replace ($link_identifier, $dn, array $entry) {} + +/** + * Delete attribute values from current attributes + * @link http://www.php.net/manual/en/function.ldap-mod-del.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param entry array

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_mod_del ($link_identifier, $dn, array $entry) {} + +/** + * Return the LDAP error number of the last LDAP command + * @link http://www.php.net/manual/en/function.ldap-errno.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @return int Return the LDAP error number of the last LDAP command for this + * link. + * + * @jms-builtin + */ +function ldap_errno ($link_identifier) {} + +/** + * Convert LDAP error number into string error message + * @link http://www.php.net/manual/en/function.ldap-err2str.php + * @param errno int

+ * The error number. + *

+ * @return string the error message, as a string. + * + * @jms-builtin + */ +function ldap_err2str ($errno) {} + +/** + * Return the LDAP error message of the last LDAP command + * @link http://www.php.net/manual/en/function.ldap-error.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @return string string error message. + * + * @jms-builtin + */ +function ldap_error ($link_identifier) {} + +/** + * Compare value of attribute found in entry specified with DN + * @link http://www.php.net/manual/en/function.ldap-compare.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param attribute string

+ * The attribute name. + *

+ * @param value string

+ * The compared value. + *

+ * @return mixed true if value matches otherwise returns + * false. Returns -1 on error. + * + * @jms-builtin + */ +function ldap_compare ($link_identifier, $dn, $attribute, $value) {} + +/** + * Sort LDAP result entries + * @link http://www.php.net/manual/en/function.ldap-sort.php + * @param link resource + * @param result resource + * @param sortfilter string + * @return bool + * + * @jms-builtin + */ +function ldap_sort ($link, $result, $sortfilter) {} + +/** + * Modify the name of an entry + * @link http://www.php.net/manual/en/function.ldap-rename.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param dn string

+ * The distinguished name of an LDAP entity. + *

+ * @param newrdn string

+ * The new RDN. + *

+ * @param newparent string

+ * The new parent/superior entry. + *

+ * @param deleteoldrdn bool

+ * If true the old RDN value(s) is removed, else the old RDN value(s) + * is retained as non-distinguished values of the entry. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_rename ($link_identifier, $dn, $newrdn, $newparent, $deleteoldrdn) {} + +/** + * Get the current value for given option + * @link http://www.php.net/manual/en/function.ldap-get-option.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param option int

+ * The parameter option can be one of: + * + * Option + * Type + * + * + * LDAP_OPT_DEREF + * integer + * + * + * LDAP_OPT_SIZELIMIT + * integer + * + * + * LDAP_OPT_TIMELIMIT + * integer + * + * + * LDAP_OPT_NETWORK_TIMEOUT + * integer + * + * + * LDAP_OPT_PROTOCOL_VERSION + * integer + * + * + * LDAP_OPT_ERROR_NUMBER + * integer + * + * + * LDAP_OPT_REFERRALS + * bool + * + * + * LDAP_OPT_RESTART + * bool + * + * + * LDAP_OPT_HOST_NAME + * string + * + * + * LDAP_OPT_ERROR_STRING + * string + * + * + * LDAP_OPT_MATCHED_DN + * string + * + * + * LDAP_OPT_SERVER_CONTROLS + * array + * + * + * LDAP_OPT_CLIENT_CONTROLS + * array + * + *

+ * @param retval mixed

+ * This will be set to the option value. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_get_option ($link_identifier, $option, &$retval) {} + +/** + * Set the value of the given option + * @link http://www.php.net/manual/en/function.ldap-set-option.php + * @param link_identifier resource

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param option int

+ * The parameter option can be one of: + * + * Option + * Type + * Available since + * + * + * LDAP_OPT_DEREF + * integer + * + * + * + * LDAP_OPT_SIZELIMIT + * integer + * + * + * + * LDAP_OPT_TIMELIMIT + * integer + * + * + * + * LDAP_OPT_NETWORK_TIMEOUT + * integer + * PHP 5.3.0 + * + * + * LDAP_OPT_PROTOCOL_VERSION + * integer + * + * + * + * LDAP_OPT_ERROR_NUMBER + * integer + * + * + * + * LDAP_OPT_REFERRALS + * bool + * + * + * + * LDAP_OPT_RESTART + * bool + * + * + * + * LDAP_OPT_HOST_NAME + * string + * + * + * + * LDAP_OPT_ERROR_STRING + * string + * + * + * + * LDAP_OPT_MATCHED_DN + * string + * + * + * + * LDAP_OPT_SERVER_CONTROLS + * array + * + * + * + * LDAP_OPT_CLIENT_CONTROLS + * array + * + * + *

+ *

+ * LDAP_OPT_SERVER_CONTROLS and + * LDAP_OPT_CLIENT_CONTROLS require a list of + * controls, this means that the value must be an array of controls. A + * control consists of an oid identifying the control, + * an optional value, and an optional flag for + * criticality. In PHP a control is given by an + * array containing an element with the key oid + * and string value, and two optional elements. The optional + * elements are key value with string value + * and key iscritical with boolean value. + * iscritical defaults to false + * if not supplied. See draft-ietf-ldapext-ldap-c-api-xx.txt + * for details. See also the second example below. + *

+ * @param newval mixed

+ * The new value for the specified option. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ldap_set_option ($link_identifier, $option, $newval) {} + +/** + * Return first reference + * @link http://www.php.net/manual/en/function.ldap-first-reference.php + * @param link resource + * @param result resource + * @return resource + * + * @jms-builtin + */ +function ldap_first_reference ($link, $result) {} + +/** + * Get next reference + * @link http://www.php.net/manual/en/function.ldap-next-reference.php + * @param link resource + * @param entry resource + * @return resource + * + * @jms-builtin + */ +function ldap_next_reference ($link, $entry) {} + +/** + * Extract information from reference entry + * @link http://www.php.net/manual/en/function.ldap-parse-reference.php + * @param link resource + * @param entry resource + * @param referrals array + * @return bool + * + * @jms-builtin + */ +function ldap_parse_reference ($link, $entry, array &$referrals) {} + +/** + * Extract information from result + * @link http://www.php.net/manual/en/function.ldap-parse-result.php + * @param link resource + * @param result resource + * @param errcode int + * @param matcheddn string[optional] + * @param errmsg string[optional] + * @param referrals array[optional] + * @return bool + * + * @jms-builtin + */ +function ldap_parse_result ($link, $result, &$errcode, &$matcheddn = null, &$errmsg = null, array &$referrals = null) {} + +/** + * Start TLS + * @link http://www.php.net/manual/en/function.ldap-start-tls.php + * @param link resource + * @return bool + * + * @jms-builtin + */ +function ldap_start_tls ($link) {} + +/** + * Set a callback function to do re-binds on referral chasing + * @link http://www.php.net/manual/en/function.ldap-set-rebind-proc.php + * @param link resource + * @param callback callback + * @return bool + * + * @jms-builtin + */ +function ldap_set_rebind_proc ($link, $callback) {} + +define ('LDAP_DEREF_NEVER', 0); +define ('LDAP_DEREF_SEARCHING', 1); +define ('LDAP_DEREF_FINDING', 2); +define ('LDAP_DEREF_ALWAYS', 3); +define ('LDAP_OPT_DEREF', 2); +define ('LDAP_OPT_SIZELIMIT', 3); +define ('LDAP_OPT_TIMELIMIT', 4); + +/** + * Option for ldap_set_option to allow setting network timeout. + * (Available as of PHP 5.3.0) + * @link http://www.php.net/manual/en/ldap.constants.php + */ +define ('LDAP_OPT_NETWORK_TIMEOUT', 20485); +define ('LDAP_OPT_PROTOCOL_VERSION', 17); +define ('LDAP_OPT_ERROR_NUMBER', 49); +define ('LDAP_OPT_REFERRALS', 8); +define ('LDAP_OPT_RESTART', 9); +define ('LDAP_OPT_HOST_NAME', 48); +define ('LDAP_OPT_ERROR_STRING', 50); +define ('LDAP_OPT_MATCHED_DN', 51); +define ('LDAP_OPT_SERVER_CONTROLS', 18); +define ('LDAP_OPT_CLIENT_CONTROLS', 19); +define ('LDAP_OPT_DEBUG_LEVEL', 20481); + +// End of ldap v. +?> diff --git a/res/php-5.3-core-api/libxml.php b/res/php-5.3-core-api/libxml.php new file mode 100644 index 0000000..dec4660 --- /dev/null +++ b/res/php-5.3-core-api/libxml.php @@ -0,0 +1,231 @@ + + * The stream context resource (created with + * stream_context_create) + *

+ * @return void + * + * @jms-builtin + */ +function libxml_set_streams_context ($streams_context) {} + +/** + * Disable libxml errors and allow user to fetch error information as needed + * @link http://www.php.net/manual/en/function.libxml-use-internal-errors.php + * @param use_errors bool[optional]

+ * Whether to enable user error handling. + *

+ * @return bool This function returns the previous value of + * use_errors. + * + * @jms-builtin + */ +function libxml_use_internal_errors ($use_errors = null) {} + +/** + * Retrieve last error from libxml + * @link http://www.php.net/manual/en/function.libxml-get-last-error.php + * @return LibXMLError a LibXMLError object if there is any error in the + * buffer, false otherwise. + * + * @jms-builtin + */ +function libxml_get_last_error () {} + +/** + * Clear libxml error buffer + * @link http://www.php.net/manual/en/function.libxml-clear-errors.php + * @return void + * + * @jms-builtin + */ +function libxml_clear_errors () {} + +/** + * Retrieve array of errors + * @link http://www.php.net/manual/en/function.libxml-get-errors.php + * @return array an array with LibXMLError objects if there are any + * errors in the buffer, or an empty array otherwise. + * + * @jms-builtin + */ +function libxml_get_errors () {} + +/** + * Disable the ability to load external entities + * @link http://www.php.net/manual/en/function.libxml-disable-entity-loader.php + * @param disable bool[optional]

+ * Disable (true) or enable (false) libxml extensions (such as + * , + * and ) to load external entities. + *

+ * @return ReturnType the previous value. + * + * @jms-builtin + */ +function libxml_disable_entity_loader ($disable = null) {} + + +/** + * libxml version like 20605 or 20617 + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_VERSION', 20632); + +/** + * libxml version like 2.6.5 or 2.6.17 + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DOTTED_VERSION', "2.6.32"); +define ('LIBXML_LOADED_VERSION', 20632); + +/** + * Substitute entities + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOENT', 2); + +/** + * Load the external subset + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DTDLOAD', 4); + +/** + * Default DTD attributes + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DTDATTR', 8); + +/** + * Validate with the DTD + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DTDVALID', 16); + +/** + * Suppress error reports + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOERROR', 32); + +/** + * Suppress warning reports + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOWARNING', 64); + +/** + * Remove blank nodes + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOBLANKS', 256); + +/** + * Implement XInclude substitution + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_XINCLUDE', 1024); + +/** + * Remove redundant namespaces declarations + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NSCLEAN', 8192); + +/** + * Merge CDATA as text nodes + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOCDATA', 16384); + +/** + * Disable network access when loading documents + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NONET', 2048); + +/** + * Activate small nodes allocation optimization. This may speed up your + * application without needing to change the code. + *

+ * Only available in Libxml >= 2.6.21 + *

+ * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_COMPACT', 65536); + +/** + * Drop the XML declaration when saving a document + *

+ * Only available in Libxml >= 2.6.21 + *

+ * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOXMLDECL', 2); + +/** + * Expand empty tags (e.g. <br/> to + * <br></br>) + *

+ * This option is currently just available in the + * and + * functions. + *

+ * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOEMPTYTAG', 4); + +/** + * No errors + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_NONE', 0); + +/** + * A simple warning + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_WARNING', 1); + +/** + * A recoverable error + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_ERROR', 2); + +/** + * A fatal error + * @link http://www.php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_FATAL', 3); + +// End of libxml v. +?> diff --git a/res/php-5.3-core-api/mbstring.php b/res/php-5.3-core-api/mbstring.php new file mode 100644 index 0000000..fe7ca88 --- /dev/null +++ b/res/php-5.3-core-api/mbstring.php @@ -0,0 +1,1363 @@ + + * The string being converted. + *

+ * @param mode int

+ * The mode of the conversion. It can be one of + * MB_CASE_UPPER, + * MB_CASE_LOWER, or + * MB_CASE_TITLE. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string A case folded version of string converted in the + * way specified by mode. + * + * @jms-builtin + */ +function mb_convert_case ($str, $mode, $encoding = null) {} + +/** + * Make a string uppercase + * @link http://www.php.net/manual/en/function.mb-strtoupper.php + * @param str string

+ * The string being uppercased. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string str with all alphabetic characters converted to uppercase. + * + * @jms-builtin + */ +function mb_strtoupper ($str, $encoding = null) {} + +/** + * Make a string lowercase + * @link http://www.php.net/manual/en/function.mb-strtolower.php + * @param str string

+ * The string being lowercased. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string str with all alphabetic characters converted to lowercase. + * + * @jms-builtin + */ +function mb_strtolower ($str, $encoding = null) {} + +/** + * Set/Get current language + * @link http://www.php.net/manual/en/function.mb-language.php + * @param language string[optional]

+ * Used for encoding + * e-mail messages. Valid languages are "Japanese", + * "ja","English","en" and "uni" + * (UTF-8). mb_send_mail uses this setting to + * encode e-mail. + *

+ *

+ * Language and its setting is ISO-2022-JP/Base64 for + * Japanese, UTF-8/Base64 for uni, ISO-8859-1/quoted printable for + * English. + *

+ * @return mixed If language is set and + * language is valid, it returns + * true. Otherwise, it returns false. + * When language is omitted, it returns the language + * name as a string. If no language is set previously, it then returns + * false. + * + * @jms-builtin + */ +function mb_language ($language = null) {} + +/** + * Set/Get internal character encoding + * @link http://www.php.net/manual/en/function.mb-internal-encoding.php + * @param encoding string[optional]

+ * encoding is the character encoding name + * used for the HTTP input character encoding conversion, HTTP output + * character encoding conversion, and the default character encoding + * for string functions defined by the mbstring module. + *

+ * @return mixed If encoding is set, then + * Returns true on success or false on failure. + * If encoding is omitted, then + * the current character encoding name is returned. + * + * @jms-builtin + */ +function mb_internal_encoding ($encoding = null) {} + +/** + * Detect HTTP input character encoding + * @link http://www.php.net/manual/en/function.mb-http-input.php + * @param type string[optional]

+ * Input string specifies the input type. + * "G" for GET, "P" for POST, "C" for COOKIE, "S" for string, "L" for list, and + * "I" for the whole list (will return array). + * If type is omitted, it returns the last input type processed. + *

+ * @return mixed The character encoding name, as per the type. + * If mb_http_input does not process specified + * HTTP input, it returns false. + * + * @jms-builtin + */ +function mb_http_input ($type = null) {} + +/** + * Set/Get HTTP output character encoding + * @link http://www.php.net/manual/en/function.mb-http-output.php + * @param encoding string[optional]

+ * If encoding is set, + * mb_http_output sets the HTTP output character + * encoding to encoding. + *

+ *

+ * If encoding is omitted, + * mb_http_output returns the current HTTP output + * character encoding. + *

+ * @return mixed If encoding is omitted, + * mb_http_output returns the current HTTP output + * character encoding. Otherwise, + * Returns true on success or false on failure. + * + * @jms-builtin + */ +function mb_http_output ($encoding = null) {} + +/** + * Set/Get character encoding detection order + * @link http://www.php.net/manual/en/function.mb-detect-order.php + * @param encoding_list mixed[optional]

+ * encoding_list is an array or + * comma separated list of character encoding. ("auto" is expanded to + * "ASCII, JIS, UTF-8, EUC-JP, SJIS") + *

+ *

+ * If encoding_list is omitted, it returns + * the current character encoding detection order as array. + *

+ *

+ * This setting affects mb_detect_encoding and + * mb_send_mail. + *

+ *

+ * mbstring currently implements the following + * encoding detection filters. If there is an invalid byte sequence + * for the following encodings, encoding detection will fail. + *

+ * UTF-8, UTF-7, + * ASCII, + * EUC-JP,SJIS, + * eucJP-win, SJIS-win, + * JIS, ISO-2022-JP + *

+ * For ISO-8859-*, mbstring + * always detects as ISO-8859-*. + *

+ *

+ * For UTF-16, UTF-32, + * UCS2 and UCS4, encoding + * detection will fail always. + *

+ *

+ * Useless detect order example + *

+ * @return mixed Returns true on success or false on failure. + * + * @jms-builtin + */ +function mb_detect_order ($encoding_list = null) {} + +/** + * Set/Get substitution character + * @link http://www.php.net/manual/en/function.mb-substitute-character.php + * @param substrchar mixed[optional]

+ * Specify the Unicode value as an integer, + * or as one of the following strings: + * "none" : no output + * @return mixed If substchar is set, it returns true for success, + * otherwise returns false. + * If substchar is not set, it returns the Unicode value, + * or "none" or "long". + * + * @jms-builtin + */ +function mb_substitute_character ($substrchar = null) {} + +/** + * Parse GET/POST/COOKIE data and set global variable + * @link http://www.php.net/manual/en/function.mb-parse-str.php + * @param encoded_string string

+ * The URL encoded data. + *

+ * @param result array[optional]

+ * An array containing decoded and character encoded converted values. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mb_parse_str ($encoded_string, array &$result = null) {} + +/** + * Callback function converts character encoding in output buffer + * @link http://www.php.net/manual/en/function.mb-output-handler.php + * @param contents string

+ * The contents of the output buffer. + *

+ * @param status int

+ * The status of the output buffer. + *

+ * @return string The converted string. + * + * @jms-builtin + */ +function mb_output_handler ($contents, $status) {} + +/** + * Get MIME charset string + * @link http://www.php.net/manual/en/function.mb-preferred-mime-name.php + * @param encoding string

+ * The encoding being checked. + *

+ * @return string The MIME charset string for character encoding + * encoding. + * + * @jms-builtin + */ +function mb_preferred_mime_name ($encoding) {} + +/** + * Get string length + * @link http://www.php.net/manual/en/function.mb-strlen.php + * @param str string

+ * The string being checked for length. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return int the number of characters in + * string str having character encoding + * encoding. A multi-byte character is + * counted as 1. + * + * @jms-builtin + */ +function mb_strlen ($str, $encoding = null) {} + +/** + * Find position of first occurrence of string in a string + * @link http://www.php.net/manual/en/function.mb-strpos.php + * @param haystack string

+ * The string being checked. + *

+ * @param needle string

+ * The position counted from the beginning of haystack. + *

+ * @param offset int[optional]

+ * The search offset. If it is not specified, 0 is used. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return int the numeric position of + * the first occurrence of needle in the + * haystack string. If + * needle is not found, it returns false. + * + * @jms-builtin + */ +function mb_strpos ($haystack, $needle, $offset = null, $encoding = null) {} + +/** + * Find position of last occurrence of a string in a string + * @link http://www.php.net/manual/en/function.mb-strrpos.php + * @param haystack string

+ * The string being checked, for the last occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack. + *

+ * @param offset int[optional] May be specified to begin searching an arbitrary number of characters into + * the string. Negative values will stop searching at an arbitrary point + * prior to the end of the string. + * @param encoding string[optional] &mbstring.encoding.parameter; + * @return int the numeric position of + * the last occurrence of needle in the + * haystack string. If + * needle is not found, it returns false. + * + * @jms-builtin + */ +function mb_strrpos ($haystack, $needle, $offset = null, $encoding = null) {} + +/** + * Finds position of first occurrence of a string within another, case insensitive + * @link http://www.php.net/manual/en/function.mb-stripos.php + * @param haystack string

+ * The string from which to get the position of the first occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param offset int[optional]

+ * The position in haystack + * to start searching + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return int Return the numeric position of the first occurrence of + * needle in the haystack + * string, or false if needle is not found. + * + * @jms-builtin + */ +function mb_stripos ($haystack, $needle, $offset = null, $encoding = null) {} + +/** + * Finds position of last occurrence of a string within another, case insensitive + * @link http://www.php.net/manual/en/function.mb-strripos.php + * @param haystack string

+ * The string from which to get the position of the last occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param offset int[optional]

+ * The position in haystack + * to start searching + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return int Return the numeric position of + * the last occurrence of needle in the + * haystack string, or false + * if needle is not found. + * + * @jms-builtin + */ +function mb_strripos ($haystack, $needle, $offset = null, $encoding = null) {} + +/** + * Finds first occurrence of a string within another + * @link http://www.php.net/manual/en/function.mb-strstr.php + * @param haystack string

+ * The string from which to get the first occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param part bool[optional]

+ * Determines which portion of haystack + * this function returns. + * If set to true, it returns all of haystack + * from the beginning to the first occurrence of needle. + * If set to false, it returns all of haystack + * from the first occurrence of needle to the end, + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack, + * or false if needle is not found. + * + * @jms-builtin + */ +function mb_strstr ($haystack, $needle, $part = null, $encoding = null) {} + +/** + * Finds the last occurrence of a character in a string within another + * @link http://www.php.net/manual/en/function.mb-strrchr.php + * @param haystack string

+ * The string from which to get the last occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param part bool[optional]

+ * Determines which portion of haystack + * this function returns. + * If set to true, it returns all of haystack + * from the beginning to the last occurrence of needle. + * If set to false, it returns all of haystack + * from the last occurrence of needle to the end, + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack. + * or false if needle is not found. + * + * @jms-builtin + */ +function mb_strrchr ($haystack, $needle, $part = null, $encoding = null) {} + +/** + * Finds first occurrence of a string within another, case insensitive + * @link http://www.php.net/manual/en/function.mb-stristr.php + * @param haystack string

+ * The string from which to get the first occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param part bool[optional]

+ * Determines which portion of haystack + * this function returns. + * If set to true, it returns all of haystack + * from the beginning to the first occurrence of needle. + * If set to false, it returns all of haystack + * from the first occurrence of needle to the end, + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack, + * or false if needle is not found. + * + * @jms-builtin + */ +function mb_stristr ($haystack, $needle, $part = null, $encoding = null) {} + +/** + * Finds the last occurrence of a character in a string within another, case insensitive + * @link http://www.php.net/manual/en/function.mb-strrichr.php + * @param haystack string

+ * The string from which to get the last occurrence + * of needle + *

+ * @param needle string

+ * The string to find in haystack + *

+ * @param part bool[optional]

+ * Determines which portion of haystack + * this function returns. + * If set to true, it returns all of haystack + * from the beginning to the last occurrence of needle. + * If set to false, it returns all of haystack + * from the last occurrence of needle to the end, + *

+ * @param encoding string[optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack. + * or false if needle is not found. + * + * @jms-builtin + */ +function mb_strrichr ($haystack, $needle, $part = null, $encoding = null) {} + +/** + * Count the number of substring occurrences + * @link http://www.php.net/manual/en/function.mb-substr-count.php + * @param haystack string

+ * The string being checked. + *

+ * @param needle string

+ * The string being found. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return int The number of times the + * needle substring occurs in the + * haystack string. + * + * @jms-builtin + */ +function mb_substr_count ($haystack, $needle, $encoding = null) {} + +/** + * Get part of string + * @link http://www.php.net/manual/en/function.mb-substr.php + * @param str string

+ * The string being checked. + *

+ * @param start int

+ * The first position used in str. + *

+ * @param length int[optional]

+ * The maximum length of the returned string. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string mb_substr returns the portion of + * str specified by the + * start and + * length parameters. + * + * @jms-builtin + */ +function mb_substr ($str, $start, $length = null, $encoding = null) {} + +/** + * Get part of string + * @link http://www.php.net/manual/en/function.mb-strcut.php + * @param str string

+ * The string being cut. + *

+ * @param start int

+ * The position that begins the cut. + *

+ * @param length int[optional]

+ * The string being decoded. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string mb_strcut returns the portion of + * str specified by the + * start and + * length parameters. + * + * @jms-builtin + */ +function mb_strcut ($str, $start, $length = null, $encoding = null) {} + +/** + * Return width of string + * @link http://www.php.net/manual/en/function.mb-strwidth.php + * @param str string

+ * The string being decoded. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return int The width of string str. + * + * @jms-builtin + */ +function mb_strwidth ($str, $encoding = null) {} + +/** + * Get truncated string with specified width + * @link http://www.php.net/manual/en/function.mb-strimwidth.php + * @param str string

+ * The string being decoded. + *

+ * @param start int

+ * The start position offset. Number of + * characters from the beginning of string. (First character is 0) + *

+ * @param width int

+ * The width of the desired trim. + *

+ * @param trimmarker string[optional]

+ * A string that is added to the end of string + * when string is truncated. + *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string The truncated string. If trimmarker is set, + * trimmarker is appended to the return value. + * + * @jms-builtin + */ +function mb_strimwidth ($str, $start, $width, $trimmarker = null, $encoding = null) {} + +/** + * Convert character encoding + * @link http://www.php.net/manual/en/function.mb-convert-encoding.php + * @param str string

+ * The string being encoded. + *

+ * @param to_encoding string

+ * The type of encoding that str is being converted to. + *

+ * @param from_encoding mixed[optional]

+ * Is specified by character code names before conversion. It is either + * an array, or a comma separated enumerated list. + * If from_encoding is not specified, the internal + * encoding will be used. + *

+ *

+ * "auto" may be used, which expands to + * "ASCII,JIS,UTF-8,EUC-JP,SJIS". + *

+ * @return string The encoded string. + * + * @jms-builtin + */ +function mb_convert_encoding ($str, $to_encoding, $from_encoding = null) {} + +/** + * Detect character encoding + * @link http://www.php.net/manual/en/function.mb-detect-encoding.php + * @param str string

+ * The string being detected. + *

+ * @param encoding_list mixed[optional]

+ * encoding_list is list of character + * encoding. Encoding order may be specified by array or comma + * separated list string. + *

+ *

+ * If encoding_list is omitted, + * detect_order is used. + *

+ * @param strict bool[optional]

+ * strict specifies whether to use + * the strict encoding detection or not. + * Default is false. + *

+ * @return string The detected character encoding or false if the encoding cannot be + * detected from the given string. + * + * @jms-builtin + */ +function mb_detect_encoding ($str, $encoding_list = null, $strict = null) {} + +/** + * Returns an array of all supported encodings + * @link http://www.php.net/manual/en/function.mb-list-encodings.php + * @return array a numerically indexed array. + * + * @jms-builtin + */ +function mb_list_encodings () {} + +/** + * @param encoding + * + * @jms-builtin + */ +function mb_encoding_aliases ($encoding) {} + +/** + * Convert "kana" one from another ("zen-kaku", "han-kaku" and more) + * @link http://www.php.net/manual/en/function.mb-convert-kana.php + * @param str string

+ * The string being converted. + *

+ * @param option string[optional]

+ * The conversion option. + *

+ *

+ * Specify with a combination of following options. + * + * Applicable Conversion Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionMeaning
r + * Convert "zen-kaku" alphabets to "han-kaku" + *
R + * Convert "han-kaku" alphabets to "zen-kaku" + *
n + * Convert "zen-kaku" numbers to "han-kaku" + *
N + * Convert "han-kaku" numbers to "zen-kaku" + *
a + * Convert "zen-kaku" alphabets and numbers to "han-kaku" + *
A + * Convert "han-kaku" alphabets and numbers to "zen-kaku" + * (Characters included in "a", "A" options are + * U+0021 - U+007E excluding U+0022, U+0027, U+005C, U+007E) + *
s + * Convert "zen-kaku" space to "han-kaku" (U+3000 -> U+0020) + *
S + * Convert "han-kaku" space to "zen-kaku" (U+0020 -> U+3000) + *
k + * Convert "zen-kaku kata-kana" to "han-kaku kata-kana" + *
K + * Convert "han-kaku kata-kana" to "zen-kaku kata-kana" + *
h + * Convert "zen-kaku hira-gana" to "han-kaku kata-kana" + *
H + * Convert "han-kaku kata-kana" to "zen-kaku hira-gana" + *
c + * Convert "zen-kaku kata-kana" to "zen-kaku hira-gana" + *
C + * Convert "zen-kaku hira-gana" to "zen-kaku kata-kana" + *
V + * Collapse voiced sound notation and convert them into a character. Use with "K","H" + *
+ *

+ * @param encoding string[optional] &mbstring.encoding.parameter; + * @return string The converted string. + * + * @jms-builtin + */ +function mb_convert_kana ($str, $option = null, $encoding = null) {} + +/** + * Encode string for MIME header + * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php + * @param str string

+ * The string being encoded. + *

+ * @param charset string[optional]

+ * charset specifies the name of the character set + * in which str is represented in. The default value + * is determined by the current NLS setting (mbstring.language). + * mb_internal_encoding should be set to same encoding. + *

+ * @param transfer_encoding string[optional]

+ * transfer_encoding specifies the scheme of MIME + * encoding. It should be either "B" (Base64) or + * "Q" (Quoted-Printable). Falls back to + * "B" if not given. + *

+ * @param linefeed string[optional]

+ * linefeed specifies the EOL (end-of-line) marker + * with which mb_encode_mimeheader performs + * line-folding (a RFC term, + * the act of breaking a line longer than a certain length into multiple + * lines. The length is currently hard-coded to 74 characters). + * Falls back to "\r\n" (CRLF) if not given. + *

+ * @param indent int[optional]

+ * Indentation of the first line (number of characters in the header + * before str). + *

+ * @return string A converted version of the string represented in ASCII. + * + * @jms-builtin + */ +function mb_encode_mimeheader ($str, $charset = null, $transfer_encoding = null, $linefeed = null, $indent = null) {} + +/** + * Decode string in MIME header field + * @link http://www.php.net/manual/en/function.mb-decode-mimeheader.php + * @param str string

+ * The string being decoded. + *

+ * @return string The decoded string in internal character encoding. + * + * @jms-builtin + */ +function mb_decode_mimeheader ($str) {} + +/** + * Convert character code in variable(s) + * @link http://www.php.net/manual/en/function.mb-convert-variables.php + * @param to_encoding string

+ * The encoding that the string is being converted to. + *

+ * @param from_encoding mixed

+ * from_encoding is specified as an array + * or comma separated string, it tries to detect encoding from + * from-coding. When from_encoding + * is omitted, detect_order is used. + *

+ * @param vars mixed

+ * vars is the reference to the + * variable being converted. String, Array and Object are accepted. + * mb_convert_variables assumes all parameters + * have the same encoding. + *

+ * @param _ mixed[optional] + * @return string The character encoding before conversion for success, + * or false for failure. + * + * @jms-builtin + */ +function mb_convert_variables ($to_encoding, $from_encoding, &$vars, &$_ = null) {} + +/** + * Encode character to HTML numeric string reference + * @link http://www.php.net/manual/en/function.mb-encode-numericentity.php + * @param str string

+ * The string being encoded. + *

+ * @param convmap array

+ * convmap is array specifies code area to + * convert. + *

+ * @param encoding string &mbstring.encoding.parameter; + * @return string The converted string. + * + * @jms-builtin + */ +function mb_encode_numericentity ($str, array $convmap, $encoding) {} + +/** + * Decode HTML numeric string reference to character + * @link http://www.php.net/manual/en/function.mb-decode-numericentity.php + * @param str string

+ * The string being decoded. + *

+ * @param convmap array

+ * convmap is an array that specifies + * the code area to convert. + *

+ * @param encoding string &mbstring.encoding.parameter; + * @return string The converted string. + * + * @jms-builtin + */ +function mb_decode_numericentity ($str, array $convmap, $encoding) {} + +/** + * Send encoded mail + * @link http://www.php.net/manual/en/function.mb-send-mail.php + * @param to string

+ * The mail addresses being sent to. Multiple + * recipients may be specified by putting a comma between each + * address in to. + * This parameter is not automatically encoded. + *

+ * @param subject string

+ * The subject of the mail. + *

+ * @param message string

+ * The message of the mail. + *

+ * @param additional_headers string[optional]

+ * additional_headers is inserted at + * the end of the header. This is typically used to add extra + * headers. Multiple extra headers are separated with a + * newline ("\n"). + *

+ * @param additional_parameter string[optional]

+ * additional_parameter is a MTA command line + * parameter. It is useful when setting the correct Return-Path + * header when using sendmail. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mb_send_mail ($to, $subject, $message, $additional_headers = null, $additional_parameter = null) {} + +/** + * Get internal settings of mbstring + * @link http://www.php.net/manual/en/function.mb-get-info.php + * @param type string[optional]

+ * If type isn't specified or is specified to + * "all", an array having the elements "internal_encoding", + * "http_output", "http_input", "func_overload", "mail_charset", + * "mail_header_encoding", "mail_body_encoding" will be returned. + *

+ *

+ * If type is specified as "http_output", + * "http_input", "internal_encoding", "func_overload", + * the specified setting parameter will be returned. + *

+ * @return mixed An array of type information if type + * is not specified, otherwise a specific type. + * + * @jms-builtin + */ +function mb_get_info ($type = null) {} + +/** + * Check if the string is valid for the specified encoding + * @link http://www.php.net/manual/en/function.mb-check-encoding.php + * @param var string[optional]

+ * The byte stream to check. If it is omitted, this function checks + * all the input from the beginning of the request. + *

+ * @param encoding string[optional]

+ * The expected encoding. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mb_check_encoding ($var = null, $encoding = null) {} + +/** + * Returns current encoding for multibyte regex as string + * @link http://www.php.net/manual/en/function.mb-regex-encoding.php + * @param encoding string[optional] &mbstring.encoding.parameter; + * @return mixed + * + * @jms-builtin + */ +function mb_regex_encoding ($encoding = null) {} + +/** + * Set/Get the default options for mbregex functions + * @link http://www.php.net/manual/en/function.mb-regex-set-options.php + * @param options string[optional]

+ * The options to set. This is a a string where each + * character is an option. To set a mode, the mode + * character must be the last one set, however there + * can only be set one mode but multiple options. + *

+ * + * Regex options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionMeaning
iAmbiguity match on
xEnables extended pattern form
m'.' matches with newlines
s'^' -> '\A', '$' -> '\Z'
pSame as both the m and s options
lFinds longest matches
nIgnores empty matches
eeval resulting code
+ * + * Regex syntax modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ModeMeaning
jJava (Sun java.util.regex)
uGNU regex
ggrep
cEmacs
rRuby
zPerl
bPOSIX Basic regex
dPOSIX Extended regex
+ * @return string The previous options. If options is omitted, + * it returns the string that describes the current options. + * + * @jms-builtin + */ +function mb_regex_set_options ($options = null) {} + +/** + * Regular expression match with multibyte support + * @link http://www.php.net/manual/en/function.mb-ereg.php + * @param pattern string

+ * The search pattern. + *

+ * @param string string

+ * The search string. + *

+ * @param regs array[optional]

+ * Contains a substring of the matched string. + *

+ * @return int + * + * @jms-builtin + */ +function mb_ereg ($pattern, $string, array $regs = null) {} + +/** + * Regular expression match ignoring case with multibyte support + * @link http://www.php.net/manual/en/function.mb-eregi.php + * @param pattern string

+ * The regular expression pattern. + *

+ * @param string string

+ * The string being searched. + *

+ * @param regs array[optional]

+ * Contains a substring of the matched string. + *

+ * @return int + * + * @jms-builtin + */ +function mb_eregi ($pattern, $string, array $regs = null) {} + +/** + * Replace regular expression with multibyte support + * @link http://www.php.net/manual/en/function.mb-ereg-replace.php + * @param pattern string

+ * The regular expression pattern. + *

+ *

+ * Multibyte characters may be used in pattern. + *

+ * @param replacement string

+ * The replacement text. + *

+ * @param string string

+ * The string being checked. + *

+ * @param option string[optional] Matching condition can be set by option + * parameter. If i is specified for this + * parameter, the case will be ignored. If x is + * specified, white space will be ignored. If m + * is specified, match will be executed in multiline mode and line + * break will be included in '.'. If p is + * specified, match will be executed in POSIX mode, line break + * will be considered as normal character. If e + * is specified, replacement string will be + * evaluated as PHP expression. + * @return string The resultant string on success, or false on error. + * + * @jms-builtin + */ +function mb_ereg_replace ($pattern, $replacement, $string, $option = null) {} + +/** + * Replace regular expression with multibyte support ignoring case + * @link http://www.php.net/manual/en/function.mb-eregi-replace.php + * @param pattern string

+ * The regular expression pattern. Multibyte characters may be used. The case will be ignored. + *

+ * @param replace string

+ * The replacement text. + *

+ * @param string string

+ * The searched string. + *

+ * @param option string[optional] option has the same meaning as in + * mb_ereg_replace. + * @return string The resultant string or false on error. + * + * @jms-builtin + */ +function mb_eregi_replace ($pattern, $replace, $string, $option = null) {} + +/** + * Split multibyte string using regular expression + * @link http://www.php.net/manual/en/function.mb-split.php + * @param pattern string

+ * The regular expression pattern. + *

+ * @param string string

+ * The string being split. + *

+ * @param limit int[optional] If optional parameter limit is specified, + * it will be split in limit elements as + * maximum. + * @return array The result as an array. + * + * @jms-builtin + */ +function mb_split ($pattern, $string, $limit = null) {} + +/** + * Regular expression match for multibyte string + * @link http://www.php.net/manual/en/function.mb-ereg-match.php + * @param pattern string

+ * The regular expression pattern. + *

+ * @param string string

+ * The string being evaluated. + *

+ * @param option string[optional]

+ *

+ * @return bool + * + * @jms-builtin + */ +function mb_ereg_match ($pattern, $string, $option = null) {} + +/** + * Multibyte regular expression match for predefined multibyte string + * @link http://www.php.net/manual/en/function.mb-ereg-search.php + * @param pattern string[optional]

+ * The search pattern. + *

+ * @param option string[optional]

+ * The search option. + *

+ * @return bool + * + * @jms-builtin + */ +function mb_ereg_search ($pattern = null, $option = null) {} + +/** + * Returns position and length of a matched part of the multibyte regular expression for a predefined multibyte string + * @link http://www.php.net/manual/en/function.mb-ereg-search-pos.php + * @param pattern string[optional]

+ * The search pattern. + *

+ * @param option string[optional]

+ * The search option. + *

+ * @return array + * + * @jms-builtin + */ +function mb_ereg_search_pos ($pattern = null, $option = null) {} + +/** + * Returns the matched part of a multibyte regular expression + * @link http://www.php.net/manual/en/function.mb-ereg-search-regs.php + * @param pattern string[optional]

+ * The search pattern. + *

+ * @param option string[optional]

+ * The search option. + *

+ * @return array + * + * @jms-builtin + */ +function mb_ereg_search_regs ($pattern = null, $option = null) {} + +/** + * Setup string and regular expression for a multibyte regular expression match + * @link http://www.php.net/manual/en/function.mb-ereg-search-init.php + * @param string string

+ * The search string. + *

+ * @param pattern string[optional]

+ * The search pattern. + *

+ * @param option string[optional]

+ * The search option. + *

+ * @return bool + * + * @jms-builtin + */ +function mb_ereg_search_init ($string, $pattern = null, $option = null) {} + +/** + * Retrieve the result from the last multibyte regular expression match + * @link http://www.php.net/manual/en/function.mb-ereg-search-getregs.php + * @return array + * + * @jms-builtin + */ +function mb_ereg_search_getregs () {} + +/** + * Returns start point for next regular expression match + * @link http://www.php.net/manual/en/function.mb-ereg-search-getpos.php + * @return int + * + * @jms-builtin + */ +function mb_ereg_search_getpos () {} + +/** + * Set start point of next regular expression match + * @link http://www.php.net/manual/en/function.mb-ereg-search-setpos.php + * @param position int

+ * The position to set. + *

+ * @return bool + * + * @jms-builtin + */ +function mb_ereg_search_setpos ($position) {} + +/** + * @param encoding[optional] + * + * @jms-builtin + */ +function mbregex_encoding ($encoding) {} + +/** + * @param pattern + * @param string + * @param registers[optional] + * + * @jms-builtin + */ +function mbereg ($pattern, $string, &$registers) {} + +/** + * @param pattern + * @param string + * @param registers[optional] + * + * @jms-builtin + */ +function mberegi ($pattern, $string, &$registers) {} + +/** + * @param pattern + * @param replacement + * @param string + * @param option[optional] + * + * @jms-builtin + */ +function mbereg_replace ($pattern, $replacement, $string, $option) {} + +/** + * @param pattern + * @param replacement + * @param string + * + * @jms-builtin + */ +function mberegi_replace ($pattern, $replacement, $string) {} + +/** + * @param pattern + * @param string + * @param limit[optional] + * + * @jms-builtin + */ +function mbsplit ($pattern, $string, $limit) {} + +/** + * @param pattern + * @param string + * @param option[optional] + * + * @jms-builtin + */ +function mbereg_match ($pattern, $string, $option) {} + +/** + * @param pattern[optional] + * @param option[optional] + * + * @jms-builtin + */ +function mbereg_search ($pattern, $option) {} + +/** + * @param pattern[optional] + * @param option[optional] + * + * @jms-builtin + */ +function mbereg_search_pos ($pattern, $option) {} + +/** + * @param pattern[optional] + * @param option[optional] + * + * @jms-builtin + */ +function mbereg_search_regs ($pattern, $option) {} + +/** + * @param string + * @param pattern[optional] + * @param option[optional] + * + * @jms-builtin + */ +function mbereg_search_init ($string, $pattern, $option) {} + +function mbereg_search_getregs () {} + +function mbereg_search_getpos () {} + +/** + * @param position + * + * @jms-builtin + */ +function mbereg_search_setpos ($position) {} + +define ('MB_OVERLOAD_MAIL', 1); +define ('MB_OVERLOAD_STRING', 2); +define ('MB_OVERLOAD_REGEX', 4); +define ('MB_CASE_UPPER', 0); +define ('MB_CASE_LOWER', 1); +define ('MB_CASE_TITLE', 2); + +// End of mbstring v. +?> diff --git a/res/php-5.3-core-api/mcrypt.php b/res/php-5.3-core-api/mcrypt.php new file mode 100644 index 0000000..d0d8cdf --- /dev/null +++ b/res/php-5.3-core-api/mcrypt.php @@ -0,0 +1,666 @@ + + * One of the MCRYPT_ciphername constants or the name + * of the algorithm as string. + *

+ * @return int Gets the block size, as an integer. + * + * @jms-builtin + */ +function mcrypt_get_block_size ($cipher) {} + +/** + * Get the name of the specified cipher + * @link http://www.php.net/manual/en/function.mcrypt-get-cipher-name.php + * @param cipher int

+ * One of the MCRYPT_ciphername constants or the name + * of the algorithm as string. + *

+ * @return string This function returns the name of the cipher or false, if the cipher does + * not exist. + * + * @jms-builtin + */ +function mcrypt_get_cipher_name ($cipher) {} + +/** + * Create an initialization vector (IV) from a random source + * @link http://www.php.net/manual/en/function.mcrypt-create-iv.php + * @param size int

+ * Determines the size of the IV, parameter source + * (defaults to random value) specifies the source of the IV. + *

+ * @param source int[optional]

+ * The source can be MCRYPT_RAND (system random + * number generator), MCRYPT_DEV_RANDOM (read + * data from /dev/random) and + * MCRYPT_DEV_URANDOM (read data from + * /dev/urandom). Prior to 5.3.0, + * MCRYPT_RAND was the only one supported on Windows. + *

+ * @return string the initialization vector, or false on error. + * + * @jms-builtin + */ +function mcrypt_create_iv ($size, $source = null) {} + +/** + * Get an array of all supported ciphers + * @link http://www.php.net/manual/en/function.mcrypt-list-algorithms.php + * @param lib_dir string[optional]

+ * Specifies the directory where all algorithms are located. If not + * specifies, the value of the mcrypt.algorithms_dir &php.ini; directive + * is used. + *

+ * @return array an array with all the supported algorithms. + * + * @jms-builtin + */ +function mcrypt_list_algorithms ($lib_dir = null) {} + +/** + * Get an array of all supported modes + * @link http://www.php.net/manual/en/function.mcrypt-list-modes.php + * @param lib_dir string[optional]

+ * Specifies the directory where all modes are located. If not + * specifies, the value of the mcrypt.modes_dir + * &php.ini; directive is used. + *

+ * @return array an array with all the supported modes. + * + * @jms-builtin + */ +function mcrypt_list_modes ($lib_dir = null) {} + +/** + * Returns the size of the IV belonging to a specific cipher/mode combination + * @link http://www.php.net/manual/en/function.mcrypt-get-iv-size.php + * @param cipher string

+ * One of the MCRYPT_ciphername constants of the name + * of the algorithm as string. + *

+ * @param mode string

+ * mode is one of the MCRYPT_MODE_modename constants + * or one of "ecb", "cbc", "cfb", "ofb", "nofb" or "stream". The IV is + * ignored in ECB mode as this mode does not require it. You will need to + * have the same IV (think: starting point) both at encryption and + * decryption stages, otherwise your encryption will fail. + *

+ * @return int the size of the Initialisation Vector (IV) in bytes. On error the + * function returns false. If the IV is ignored in the specified cipher/mode + * combination zero is returned. + * + * @jms-builtin + */ +function mcrypt_get_iv_size ($cipher, $mode) {} + +/** + * Encrypts plaintext with given parameters + * @link http://www.php.net/manual/en/function.mcrypt-encrypt.php + * @param cipher string

+ * One of the MCRYPT_ciphername + * constants of the name of the algorithm as string. + *

+ * @param key string

+ * The key with which the data will be encrypted. If it's smaller that + * the required keysize, it is padded with '\0'. It is + * better not to use ASCII strings for keys. + *

+ *

+ * It is recommended to use the mhash functions to create a key from a + * string. + *

+ * @param data string

+ * The data that will be encrypted with the given cipher and mode. If the + * size of the data is not n * blocksize, the data will be padded with + * '\0'. + *

+ *

+ * The returned crypttext can be larger that the size of the data that is + * given by data. + *

+ * @param mode string

+ * One of the MCRYPT_MODE_modename + * constants of one of "ecb", "cbc", "cfb", "ofb", "nofb" or + * "stream". + *

+ * @param iv string[optional]

+ * Used for the initialisation in CBC, CFB, OFB modes, and in some + * algorithms in STREAM mode. If you do not supply an IV, while it is + * needed for an algorithm, the function issues a warning and uses an + * IV with all bytes set to '\0'. + *

+ * @return string the encrypted data, as a string. + * + * @jms-builtin + */ +function mcrypt_encrypt ($cipher, $key, $data, $mode, $iv = null) {} + +/** + * Decrypts crypttext with given parameters + * @link http://www.php.net/manual/en/function.mcrypt-decrypt.php + * @param cipher string

+ * cipher is one of the MCRYPT_ciphername constants + * of the name of the algorithm as string. + *

+ * @param key string

+ * key is the key with which the data is encrypted. + * If it's smaller that the required keysize, it is padded with + * '\0'. + *

+ * @param data string

+ * data is the data that will be decrypted with + * the given cipher and mode. If the size of the data is not n * blocksize, + * the data will be padded with '\0'. + *

+ * @param mode string

+ * mode is one of the MCRYPT_MODE_modename + * constants of one of "ecb", "cbc", "cfb", "ofb", "nofb" or "stream". + *

+ * @param iv string[optional]

+ * The iv parameter is used for the initialisation + * in CBC, CFB, OFB modes, and in some algorithms in STREAM mode. If you + * do not supply an IV, while it is needed for an algorithm, the function + * issues a warning and uses an IV with all bytes set to + * '\0'. + *

+ * @return string the decrypted data as a string. + * + * @jms-builtin + */ +function mcrypt_decrypt ($cipher, $key, $data, $mode, $iv = null) {} + +/** + * Opens the module of the algorithm and the mode to be used + * @link http://www.php.net/manual/en/function.mcrypt-module-open.php + * @param algorithm string

+ * The algorithm to be used. + *

+ * @param algorithm_directory string

+ * The algorithm_directory and + * mode_directory are used to locate the encryption + * modules. When you supply a directory name, it is used. When you set one + * of these to the empty string (""), the value set by + * the mcrypt.algorithms_dir or + * mcrypt.modes_dir ini-directive is used. When + * these are not set, the default directories that are used are the ones + * that were compiled in into libmcrypt (usually + * /usr/local/lib/libmcrypt). + *

+ * @param mode string

+ * The mode to be used. + *

+ * @param mode_directory string

+ *

+ * @return resource Normally it returns an encryption descriptor, or false on error. + * + * @jms-builtin + */ +function mcrypt_module_open ($algorithm, $algorithm_directory, $mode, $mode_directory) {} + +/** + * This function initializes all buffers needed for encryption + * @link http://www.php.net/manual/en/function.mcrypt-generic-init.php + * @param td resource

+ * The encryption descriptor. + *

+ * @param key string

+ * The maximum length of the key should be the one obtained by calling + * mcrypt_enc_get_key_size and every value smaller + * than this is legal. + *

+ * @param iv string

+ * The IV should normally have the size of the algorithms block size, but + * you must obtain the size by calling + * mcrypt_enc_get_iv_size. IV is ignored in ECB. IV + * MUST exist in CFB, CBC, STREAM, nOFB and OFB modes. It needs to be + * random and unique (but not secret). The same IV must be used for + * encryption/decryption. If you do not want to use it you should set it + * to zeros, but this is not recommended. + *

+ * @return int The function returns a negative value on error, -3 when the key length + * was incorrect, -4 when there was a memory allocation problem and any + * other return value is an unknown error. If an error occurs a warning will + * be displayed accordingly. false is returned if incorrect parameters + * were passed. + * + * @jms-builtin + */ +function mcrypt_generic_init ($td, $key, $iv) {} + +/** + * This function encrypts data + * @link http://www.php.net/manual/en/function.mcrypt-generic.php + * @param td resource

+ * The encryption descriptor. + *

+ *

+ * The encryption handle should always be initialized with + * mcrypt_generic_init with a key and an IV before + * calling this function. Where the encryption is done, you should free the + * encryption buffers by calling mcrypt_generic_deinit. + * See mcrypt_module_open for an example. + *

+ * @param data string

+ * The data to encrypt. + *

+ * @return string the encrypted data. + * + * @jms-builtin + */ +function mcrypt_generic ($td, $data) {} + +/** + * Decrypt data + * @link http://www.php.net/manual/en/function.mdecrypt-generic.php + * @param td resource

+ * An encryption descriptor returned by + * mcrypt_module_open + *

+ * @param data string

+ * Encrypted data. + *

+ * @return string + * + * @jms-builtin + */ +function mdecrypt_generic ($td, $data) {} + +/** + * This function terminates encryption + * @link http://www.php.net/manual/en/function.mcrypt-generic-end.php + * @param td resource + * @return bool + * + * @jms-builtin + */ +function mcrypt_generic_end ($td) {} + +/** + * This function deinitializes an encryption module + * @link http://www.php.net/manual/en/function.mcrypt-generic-deinit.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mcrypt_generic_deinit ($td) {} + +/** + * Runs a self test on the opened module + * @link http://www.php.net/manual/en/function.mcrypt-enc-self-test.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return int If the self test succeeds it returns false. In case of an error, it + * returns true. + * + * @jms-builtin + */ +function mcrypt_enc_self_test ($td) {} + +/** + * Checks whether the encryption of the opened mode works on blocks + * @link http://www.php.net/manual/en/function.mcrypt-enc-is-block-algorithm-mode.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return bool true if the mode is for use with block algorithms, otherwise it + * returns false. + * + * @jms-builtin + */ +function mcrypt_enc_is_block_algorithm_mode ($td) {} + +/** + * Checks whether the algorithm of the opened mode is a block algorithm + * @link http://www.php.net/manual/en/function.mcrypt-enc-is-block-algorithm.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return bool true if the algorithm is a block algorithm or false if it is + * a stream one. + * + * @jms-builtin + */ +function mcrypt_enc_is_block_algorithm ($td) {} + +/** + * Checks whether the opened mode outputs blocks + * @link http://www.php.net/manual/en/function.mcrypt-enc-is-block-mode.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return bool true if the mode outputs blocks of bytes or false if it outputs bytes. + * + * @jms-builtin + */ +function mcrypt_enc_is_block_mode ($td) {} + +/** + * Returns the blocksize of the opened algorithm + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-block-size.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return int the block size of the specified algorithm in bytes. + * + * @jms-builtin + */ +function mcrypt_enc_get_block_size ($td) {} + +/** + * Returns the maximum supported keysize of the opened mode + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-key-size.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return int the maximum supported key size of the algorithm in bytes. + * + * @jms-builtin + */ +function mcrypt_enc_get_key_size ($td) {} + +/** + * Returns an array with the supported keysizes of the opened algorithm + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-supported-key-sizes.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return array an array with the key sizes supported by the algorithm + * specified by the encryption descriptor. If it returns an empty + * array then all key sizes between 1 and + * mcrypt_enc_get_key_size are supported by the + * algorithm. + * + * @jms-builtin + */ +function mcrypt_enc_get_supported_key_sizes ($td) {} + +/** + * Returns the size of the IV of the opened algorithm + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-iv-size.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return int the size of the IV, or 0 if the IV is ignored in the algorithm. + * + * @jms-builtin + */ +function mcrypt_enc_get_iv_size ($td) {} + +/** + * Returns the name of the opened algorithm + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-algorithms-name.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return string the name of the opened algorithm as a string. + * + * @jms-builtin + */ +function mcrypt_enc_get_algorithms_name ($td) {} + +/** + * Returns the name of the opened mode + * @link http://www.php.net/manual/en/function.mcrypt-enc-get-modes-name.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return string the name as a string. + * + * @jms-builtin + */ +function mcrypt_enc_get_modes_name ($td) {} + +/** + * This function runs a self test on the specified module + * @link http://www.php.net/manual/en/function.mcrypt-module-self-test.php + * @param algorithm string

+ * The algorithm to test. + *

+ * @param lib_dir string[optional]

+ * The optional lib_dir parameter can contain the + * location of where the algorithm module is on the system. + *

+ * @return bool The function returns true if the self test succeeds, or false when if + * fails. + * + * @jms-builtin + */ +function mcrypt_module_self_test ($algorithm, $lib_dir = null) {} + +/** + * Returns if the specified module is a block algorithm or not + * @link http://www.php.net/manual/en/function.mcrypt-module-is-block-algorithm-mode.php + * @param mode string

+ * The mode to check. + *

+ * @param lib_dir string[optional]

+ * The optional lib_dir parameter can contain the + * location of where the algorithm module is on the system. + *

+ * @return bool This function returns true if the mode is for use with block + * algorithms, otherwise it returns false. (e.g. false for stream, and + * true for cbc, cfb, ofb). + * + * @jms-builtin + */ +function mcrypt_module_is_block_algorithm_mode ($mode, $lib_dir = null) {} + +/** + * This function checks whether the specified algorithm is a block algorithm + * @link http://www.php.net/manual/en/function.mcrypt-module-is-block-algorithm.php + * @param algorithm string

+ * The algorithm to check. + *

+ * @param lib_dir string[optional]

+ * The optional lib_dir parameter can contain the + * location of where the algorithm module is on the system. + *

+ * @return bool This function returns true if the specified algorithm is a block + * algorithm, or false is it is a stream algorithm. + * + * @jms-builtin + */ +function mcrypt_module_is_block_algorithm ($algorithm, $lib_dir = null) {} + +/** + * Returns if the specified mode outputs blocks or not + * @link http://www.php.net/manual/en/function.mcrypt-module-is-block-mode.php + * @param mode string

+ * The mode to check. + *

+ * @param lib_dir string[optional]

+ * The optional lib_dir parameter can contain the + * location of where the algorithm module is on the system. + *

+ * @return bool This function returns true if the mode outputs blocks of bytes or + * false if it outputs just bytes. (e.g. true for cbc and ecb, and + * false for cfb and stream). + * + * @jms-builtin + */ +function mcrypt_module_is_block_mode ($mode, $lib_dir = null) {} + +/** + * Returns the blocksize of the specified algorithm + * @link http://www.php.net/manual/en/function.mcrypt-module-get-algo-block-size.php + * @param algorithm string

+ * The algorithm name. + *

+ * @param lib_dir string[optional]

+ * This optional parameter can contain the location where the mode module + * is on the system. + *

+ * @return int the block size of the algorithm specified in bytes. + * + * @jms-builtin + */ +function mcrypt_module_get_algo_block_size ($algorithm, $lib_dir = null) {} + +/** + * Returns the maximum supported keysize of the opened mode + * @link http://www.php.net/manual/en/function.mcrypt-module-get-algo-key-size.php + * @param algorithm string

+ * The algorithm name. + *

+ * @param lib_dir string[optional]

+ * This optional parameter can contain the location where the mode module + * is on the system. + *

+ * @return int This function returns the maximum supported key size of the + * algorithm specified in bytes. + * + * @jms-builtin + */ +function mcrypt_module_get_algo_key_size ($algorithm, $lib_dir = null) {} + +/** + * Returns an array with the supported keysizes of the opened algorithm + * @link http://www.php.net/manual/en/function.mcrypt-module-get-supported-key-sizes.php + * @param algorithm string

+ * The algorithm to used. + *

+ * @param lib_dir string[optional]

+ * The optional lib_dir parameter can contain the + * location of where the algorithm module is on the system. + *

+ * @return array an array with the key sizes supported by the specified algorithm. + * If it returns an empty array then all key sizes between 1 and + * mcrypt_module_get_algo_key_size are supported by the + * algorithm. + * + * @jms-builtin + */ +function mcrypt_module_get_supported_key_sizes ($algorithm, $lib_dir = null) {} + +/** + * Close the mcrypt module + * @link http://www.php.net/manual/en/function.mcrypt-module-close.php + * @param td resource

+ * The encryption descriptor. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mcrypt_module_close ($td) {} + +define ('MCRYPT_ENCRYPT', 0); +define ('MCRYPT_DECRYPT', 1); +define ('MCRYPT_DEV_RANDOM', 0); +define ('MCRYPT_DEV_URANDOM', 1); +define ('MCRYPT_RAND', 2); +define ('MCRYPT_3DES', "tripledes"); +define ('MCRYPT_ARCFOUR_IV', "arcfour-iv"); +define ('MCRYPT_ARCFOUR', "arcfour"); +define ('MCRYPT_BLOWFISH', "blowfish"); +define ('MCRYPT_BLOWFISH_COMPAT', "blowfish-compat"); +define ('MCRYPT_CAST_128', "cast-128"); +define ('MCRYPT_CAST_256', "cast-256"); +define ('MCRYPT_CRYPT', "crypt"); +define ('MCRYPT_DES', "des"); +define ('MCRYPT_ENIGNA', "crypt"); +define ('MCRYPT_GOST', "gost"); +define ('MCRYPT_LOKI97', "loki97"); +define ('MCRYPT_PANAMA', "panama"); +define ('MCRYPT_RC2', "rc2"); +define ('MCRYPT_RIJNDAEL_128', "rijndael-128"); +define ('MCRYPT_RIJNDAEL_192', "rijndael-192"); +define ('MCRYPT_RIJNDAEL_256', "rijndael-256"); +define ('MCRYPT_SAFER64', "safer-sk64"); +define ('MCRYPT_SAFER128', "safer-sk128"); +define ('MCRYPT_SAFERPLUS', "saferplus"); +define ('MCRYPT_SERPENT', "serpent"); +define ('MCRYPT_THREEWAY', "threeway"); +define ('MCRYPT_TRIPLEDES', "tripledes"); +define ('MCRYPT_TWOFISH', "twofish"); +define ('MCRYPT_WAKE', "wake"); +define ('MCRYPT_XTEA', "xtea"); +define ('MCRYPT_IDEA', "idea"); +define ('MCRYPT_MARS', "mars"); +define ('MCRYPT_RC6', "rc6"); +define ('MCRYPT_SKIPJACK', "skipjack"); +define ('MCRYPT_MODE_CBC', "cbc"); +define ('MCRYPT_MODE_CFB', "cfb"); +define ('MCRYPT_MODE_ECB', "ecb"); +define ('MCRYPT_MODE_NOFB', "nofb"); +define ('MCRYPT_MODE_OFB', "ofb"); +define ('MCRYPT_MODE_STREAM', "stream"); + +// End of mcrypt v. +?> diff --git a/res/php-5.3-core-api/mssql.php b/res/php-5.3-core-api/mssql.php new file mode 100644 index 0000000..1ca5e1a --- /dev/null +++ b/res/php-5.3-core-api/mssql.php @@ -0,0 +1,637 @@ + + * The MS SQL server. It can also include a port number. e.g. + * hostname,port. + *

+ * @param username string[optional]

+ * The username. + *

+ * @param password string[optional]

+ * The password. + *

+ * @param new_link bool[optional]

+ * If a second call is made to mssql_connect with the + * same arguments, no new link will be established, but instead, the link + * identifier of the already opened link will be returned. This parameter + * modifies this behavior and makes mssql_connect + * always open a new link, even if mssql_connect was + * called before with the same parameters. + *

+ * @return resource a MS SQL link identifier on success, or false on error. + * + * @jms-builtin + */ +function mssql_connect ($servername = null, $username = null, $password = null, $new_link = null) {} + +/** + * Open persistent MS SQL connection + * @link http://www.php.net/manual/en/function.mssql-pconnect.php + * @param servername string[optional]

+ * The MS SQL server. It can also include a port number. e.g. + * hostname:port. + *

+ * @param username string[optional]

+ * The username. + *

+ * @param password string[optional]

+ * The password. + *

+ * @param new_link bool[optional]

+ * If a second call is made to mssql_pconnect with + * the same arguments, no new link will be established, but instead, the + * link identifier of the already opened link will be returned. This + * parameter modifies this behavior and makes + * mssql_pconnect always open a new link, even if + * mssql_pconnect was called before with the same + * parameters. + *

+ * @return resource a positive MS SQL persistent link identifier on success, or + * false on error. + * + * @jms-builtin + */ +function mssql_pconnect ($servername = null, $username = null, $password = null, $new_link = null) {} + +/** + * Close MS SQL Server connection + * @link http://www.php.net/manual/en/function.mssql-close.php + * @param link_identifier resource[optional]

+ * A MS SQL link identifier, returned by + * mssql_connect. + *

+ *

+ * This function will not close persistent links generated by + * mssql_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_close ($link_identifier = null) {} + +/** + * Select MS SQL database + * @link http://www.php.net/manual/en/function.mssql-select-db.php + * @param database_name string

+ * The database name. + *

+ *

+ * To escape the name of a database that contains spaces, hyphens ("-"), + * or any other exceptional characters, the database name must be + * enclosed in brackets, as is shown in the example, below. This + * technique must also be applied when selecting a database name that is + * also a reserved word (such as primary). + *

+ * @param link_identifier resource[optional]

+ * A MS SQL link identifier, returned by + * mssql_connect or + * mssql_pconnect. + *

+ *

+ * If no link identifier is specified, the last opened link is assumed. + * If no link is open, the function will try to establish a link as if + * mssql_connect was called, and use it. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_select_db ($database_name, $link_identifier = null) {} + +/** + * Send MS SQL query + * @link http://www.php.net/manual/en/function.mssql-query.php + * @param query string

+ * A SQL query. + *

+ * @param link_identifier resource[optional]

+ * A MS SQL link identifier, returned by + * mssql_connect or + * mssql_pconnect. + *

+ *

+ * If the link identifier isn't specified, the last opened link is + * assumed. If no link is open, the function tries to establish a link + * as if mssql_connect was called, and use it. + *

+ * @param batch_size int[optional]

+ * The number of records to batch in the buffer. + *

+ * @return mixed a MS SQL result resource on success, true if no rows were + * returned, or false on error. + * + * @jms-builtin + */ +function mssql_query ($query, $link_identifier = null, $batch_size = null) {} + +/** + * Returns the next batch of records + * @link http://www.php.net/manual/en/function.mssql-fetch-batch.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return int the batch number as an integer. + * + * @jms-builtin + */ +function mssql_fetch_batch ($result) {} + +/** + * Returns the number of records affected by the query + * @link http://www.php.net/manual/en/function.mssql-rows-affected.php + * @param link_identifier resource

+ * A MS SQL link identifier, returned by + * mssql_connect or + * mssql_pconnect. + *

+ * @return int the number of records affected by last operation. + * + * @jms-builtin + */ +function mssql_rows_affected ($link_identifier) {} + +/** + * Free result memory + * @link http://www.php.net/manual/en/function.mssql-free-result.php + * @param result resource

+ * The result resource that is being freed. This result comes from a + * call to mssql_query. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_free_result ($result) {} + +/** + * Returns the last message from the server + * @link http://www.php.net/manual/en/function.mssql-get-last-message.php + * @return string last error message from server, or an empty string if + * no error messages are returned from MSSQL. + * + * @jms-builtin + */ +function mssql_get_last_message () {} + +/** + * Gets the number of rows in result + * @link http://www.php.net/manual/en/function.mssql-num-rows.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return int the number of rows, as an integer. + * + * @jms-builtin + */ +function mssql_num_rows ($result) {} + +/** + * Gets the number of fields in result + * @link http://www.php.net/manual/en/function.mssql-num-fields.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return int the number of fields, as an integer. + * + * @jms-builtin + */ +function mssql_num_fields ($result) {} + +/** + * Get field information + * @link http://www.php.net/manual/en/function.mssql-fetch-field.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param field_offset int[optional]

+ * The numerical field offset. If the field offset is not specified, the + * next field that was not yet retrieved by this function is retrieved. The + * field_offset starts at 0. + *

+ * @return object an object containing field information. + *

+ *

+ * The properties of the object are: + * + * @jms-builtin + */ +function mssql_fetch_field ($result, $field_offset = null) {} + +/** + * Get row as enumerated array + * @link http://www.php.net/manual/en/function.mssql-fetch-row.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. + * + * @jms-builtin + */ +function mssql_fetch_row ($result) {} + +/** + * Fetch a result row as an associative array, a numeric array, or both + * @link http://www.php.net/manual/en/function.mssql-fetch-array.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param result_type int[optional]

+ * The type of array that is to be fetched. It's a constant and can take + * the following values: MSSQL_ASSOC, + * MSSQL_NUM, and + * MSSQL_BOTH. + *

+ * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. + * + * @jms-builtin + */ +function mssql_fetch_array ($result, $result_type = null) {} + +/** + * Returns an associative array of the current row in the result + * @link http://www.php.net/manual/en/function.mssql-fetch-assoc.php + * @param result_id resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return array an associative array that corresponds to the fetched row, or + * false if there are no more rows. + * + * @jms-builtin + */ +function mssql_fetch_assoc ($result_id) {} + +/** + * Fetch row as object + * @link http://www.php.net/manual/en/function.mssql-fetch-object.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return object an object with properties that correspond to the fetched row, or + * false if there are no more rows. + * + * @jms-builtin + */ +function mssql_fetch_object ($result) {} + +/** + * Get the length of a field + * @link http://www.php.net/manual/en/function.mssql-field-length.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param offset int[optional]

+ * The field offset, starts at 0. If omitted, the current field is used. + *

+ * @return int The length of the specified field index on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mssql_field_length ($result, $offset = null) {} + +/** + * Get the name of a field + * @link http://www.php.net/manual/en/function.mssql-field-name.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param offset int[optional]

+ * The field offset, starts at 0. If omitted, the current field is used. + *

+ * @return string The name of the specified field index on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mssql_field_name ($result, $offset = null) {} + +/** + * Gets the type of a field + * @link http://www.php.net/manual/en/function.mssql-field-type.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param offset int[optional]

+ * The field offset, starts at 0. If omitted, the current field is used. + *

+ * @return string The type of the specified field index on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mssql_field_type ($result, $offset = null) {} + +/** + * Moves internal row pointer + * @link http://www.php.net/manual/en/function.mssql-data-seek.php + * @param result_identifier resource

+ * The result resource that is being evaluated. + *

+ * @param row_number int

+ * The desired row number of the new result pointer. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_data_seek ($result_identifier, $row_number) {} + +/** + * Seeks to the specified field offset + * @link http://www.php.net/manual/en/function.mssql-field-seek.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param field_offset int

+ * The field offset, starts at 0. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_field_seek ($result, $field_offset) {} + +/** + * Get result data + * @link http://www.php.net/manual/en/function.mssql-result.php + * @param result resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param row int

+ * The row number. + *

+ * @param field mixed

+ * Can be the field's offset, the field's name or the field's table dot + * field's name (tablename.fieldname). If the column name has been + * aliased ('select foo as bar from...'), it uses the alias instead of + * the column name. + *

+ *

+ * Specifying a numeric offset for the field + * argument is much quicker than specifying a + * fieldname or + * tablename.fieldname argument. + *

+ * @return string the contents of the specified cell. + * + * @jms-builtin + */ +function mssql_result ($result, $row, $field) {} + +/** + * Move the internal result pointer to the next result + * @link http://www.php.net/manual/en/function.mssql-next-result.php + * @param result_id resource

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return bool true if an additional result set was available or false + * otherwise. + * + * @jms-builtin + */ +function mssql_next_result ($result_id) {} + +/** + * Sets the minimum error severity + * @link http://www.php.net/manual/en/function.mssql-min-error-severity.php + * @param severity int

+ * The new error severity. + *

+ * @return void + * + * @jms-builtin + */ +function mssql_min_error_severity ($severity) {} + +/** + * Sets the minimum message severity + * @link http://www.php.net/manual/en/function.mssql-min-message-severity.php + * @param severity int

+ * The new message severity. + *

+ * @return void + * + * @jms-builtin + */ +function mssql_min_message_severity ($severity) {} + +/** + * Initializes a stored procedure or a remote stored procedure + * @link http://www.php.net/manual/en/function.mssql-init.php + * @param sp_name string

+ * Stored procedure name, like ownew.sp_name or + * otherdb.owner.sp_name. + *

+ * @param link_identifier resource[optional]

+ * A MS SQL link identifier, returned by + * mssql_connect. + *

+ * @return resource a resource identifier "statement", used in subsequent calls to + * mssql_bind and mssql_execute, + * or false on errors. + * + * @jms-builtin + */ +function mssql_init ($sp_name, $link_identifier = null) {} + +/** + * Adds a parameter to a stored procedure or a remote stored procedure + * @link http://www.php.net/manual/en/function.mssql-bind.php + * @param stmt resource

+ * Statement resource, obtained with mssql_init. + *

+ * @param param_name string

+ * The parameter name, as a string. + *

+ *

+ * You have to include the @ character, like in the + * T-SQL syntax. See the explanation included in + * mssql_execute. + *

+ * @param var mixed

+ * The PHP variable you'll bind the MSSQL parameter to. It is passed by + * reference, to retrieve OUTPUT and RETVAL values after + * the procedure execution. + *

+ * @param type int

+ * One of: SQLTEXT, + * SQLVARCHAR, SQLCHAR, + * SQLINT1, SQLINT2, + * SQLINT4, SQLBIT, + * SQLFLT4, SQLFLT8, + * SQLFLTN. + *

+ * @param is_output bool[optional]

+ * Whether the value is an OUTPUT parameter or not. If it's an OUTPUT + * parameter and you don't mention it, it will be treated as a normal + * input parameter and no error will be thrown. + *

+ * @param is_null bool[optional]

+ * Whether the parameter is &null; or not. Passing the &null; value as + * var will not do the job. + *

+ * @param maxlen int[optional]

+ * Used with char/varchar values. You have to indicate the length of the + * data so if the parameter is a varchar(50), the type must be + * SQLVARCHAR and this value 50. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_bind ($stmt, $param_name, &$var, $type, $is_output = null, $is_null = null, $maxlen = null) {} + +/** + * Executes a stored procedure on a MS SQL server database + * @link http://www.php.net/manual/en/function.mssql-execute.php + * @param stmt resource

+ * Statement handle obtained with mssql_init. + *

+ * @param skip_results bool[optional]

+ * Whenever to skip the results or not. + *

+ * @return mixed + * + * @jms-builtin + */ +function mssql_execute ($stmt, $skip_results = null) {} + +/** + * Free statement memory + * @link http://www.php.net/manual/en/function.mssql-free-statement.php + * @param stmt resource

+ * Statement resource, obtained with mssql_init. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mssql_free_statement ($stmt) {} + +/** + * Converts a 16 byte binary GUID to a string + * @link http://www.php.net/manual/en/function.mssql-guid-string.php + * @param binary string

+ * A 16 byte binary GUID. + *

+ * @param short_format bool[optional]

+ * Whenever to use short format. + *

+ * @return string the converted string on success. + * + * @jms-builtin + */ +function mssql_guid_string ($binary, $short_format = null) {} + + +/** + * Return an associative array. Used on + * mssql_fetch_array's + * result_type parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('MSSQL_ASSOC', 1); + +/** + * Return an array with numeric keys. Used on + * mssql_fetch_array's + * result_type parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('MSSQL_NUM', 2); + +/** + * Return an array with both numeric keys and + * keys with their field name. This is the + * default value for mssql_fetch_array's + * result_type parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('MSSQL_BOTH', 3); + +/** + * Indicates the 'TEXT' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLTEXT', 35); + +/** + * Indicates the 'VARCHAR' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLVARCHAR', 39); + +/** + * Indicates the 'CHAR' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLCHAR', 47); + +/** + * Represents one byte, with a range of -128 to 127. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLINT1', 48); + +/** + * Represents two bytes, with a range of -32768 + * to 32767. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLINT2', 52); + +/** + * Represents four bytes, with a range of -2147483648 + * to 2147483647. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLINT4', 56); + +/** + * Indicates the 'BIT' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLBIT', 50); + +/** + * Represents an four byte float. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLFLT4', 59); + +/** + * Represents an eight byte float. + * @link http://www.php.net/manual/en/mssql.constants.php + */ +define ('SQLFLT8', 62); +define ('SQLFLTN', 109); + +// End of mssql v. +?> diff --git a/res/php-5.3-core-api/mysql.php b/res/php-5.3-core-api/mysql.php new file mode 100644 index 0000000..3fef80f --- /dev/null +++ b/res/php-5.3-core-api/mysql.php @@ -0,0 +1,867 @@ + + * The MySQL server. It can also include a port number. e.g. + * "hostname:port" or a path to a local socket e.g. ":/path/to/socket" for + * the localhost. + *

+ *

+ * If the PHP directive + * mysql.default_host is undefined (default), then the default + * value is 'localhost:3306'. In &sqlsafemode;, this parameter is ignored + * and value 'localhost:3306' is always used. + *

+ * @param username string[optional]

+ * The username. Default value is defined by mysql.default_user. In + * &sqlsafemode;, this parameter is ignored and the name of the user that + * owns the server process is used. + *

+ * @param password string[optional]

+ * The password. Default value is defined by mysql.default_password. In + * &sqlsafemode;, this parameter is ignored and empty password is used. + *

+ * @param new_link bool[optional]

+ * If a second call is made to mysql_connect + * with the same arguments, no new link will be established, but + * instead, the link identifier of the already opened link will be + * returned. The new_link parameter modifies this + * behavior and makes mysql_connect always open + * a new link, even if mysql_connect was called + * before with the same parameters. + * In &sqlsafemode;, this parameter is ignored. + *

+ * @param client_flags int[optional]

+ * The client_flags parameter can be a combination + * of the following constants: + * 128 (enable LOAD DATA LOCAL handling), + * MYSQL_CLIENT_SSL, + * MYSQL_CLIENT_COMPRESS, + * MYSQL_CLIENT_IGNORE_SPACE or + * MYSQL_CLIENT_INTERACTIVE. + * Read the section about for further information. + * In &sqlsafemode;, this parameter is ignored. + *

+ * @return resource a MySQL link identifier on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_connect ($server = null, $username = null, $password = null, $new_link = null, $client_flags = null) {} + +/** + * Open a persistent connection to a MySQL server + * @link http://www.php.net/manual/en/function.mysql-pconnect.php + * @param server string[optional]

+ * The MySQL server. It can also include a port number. e.g. + * "hostname:port" or a path to a local socket e.g. ":/path/to/socket" for + * the localhost. + *

+ *

+ * If the PHP directive + * mysql.default_host is undefined (default), then the default + * value is 'localhost:3306' + *

+ * @param username string[optional]

+ * The username. Default value is the name of the user that owns the + * server process. + *

+ * @param password string[optional]

+ * The password. Default value is an empty password. + *

+ * @param client_flags int[optional]

+ * The client_flags parameter can be a combination + * of the following constants: + * 128 (enable LOAD DATA LOCAL handling), + * MYSQL_CLIENT_SSL, + * MYSQL_CLIENT_COMPRESS, + * MYSQL_CLIENT_IGNORE_SPACE or + * MYSQL_CLIENT_INTERACTIVE. + *

+ * @return resource a MySQL persistent link identifier on success, or false on + * failure. + * + * @jms-builtin + */ +function mysql_pconnect ($server = null, $username = null, $password = null, $client_flags = null) {} + +/** + * Close MySQL connection + * @link http://www.php.net/manual/en/function.mysql-close.php + * @param link_identifier resource[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysql_close ($link_identifier = null) {} + +/** + * Select a MySQL database + * @link http://www.php.net/manual/en/function.mysql-select-db.php + * @param database_name string

+ * The name of the database that is to be selected. + *

+ * @param link_identifier resource[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysql_select_db ($database_name, $link_identifier = null) {} + +/** + * Send a MySQL query + * @link http://www.php.net/manual/en/function.mysql-query.php + * @param query string

+ * A SQL query + *

+ *

+ * The query string should not end with a semicolon. + * Data inside the query should be properly escaped. + *

+ * @param link_identifier resource[optional] + * @return resource For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, + * mysql_query + * returns a resource on success, or false on + * error. + *

+ *

+ * For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, + * mysql_query returns true on success + * or false on error. + *

+ *

+ * The returned result resource should be passed to + * mysql_fetch_array, and other + * functions for dealing with result tables, to access the returned data. + *

+ *

+ * Use mysql_num_rows to find out how many rows + * were returned for a SELECT statement or + * mysql_affected_rows to find out how many + * rows were affected by a DELETE, INSERT, REPLACE, or UPDATE + * statement. + *

+ *

+ * mysql_query will also fail and return false + * if the user does not have permission to access the table(s) referenced by + * the query. + * + * @jms-builtin + */ +function mysql_query ($query, $link_identifier = null) {} + +/** + * Send an SQL query to MySQL without fetching and buffering the result rows. + * @link http://www.php.net/manual/en/function.mysql-unbuffered-query.php + * @param query string

+ * The SQL query to execute. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param link_identifier resource[optional] + * @return resource For SELECT, SHOW, DESCRIBE or EXPLAIN statements, + * mysql_unbuffered_query + * returns a resource on success, or false on + * error. + *

+ *

+ * For other type of SQL statements, UPDATE, DELETE, DROP, etc, + * mysql_unbuffered_query returns true on success + * or false on error. + * + * @jms-builtin + */ +function mysql_unbuffered_query ($query, $link_identifier = null) {} + +/** + * Send a MySQL query + * @link http://www.php.net/manual/en/function.mysql-db-query.php + * @param database string

+ * The name of the database that will be selected. + *

+ * @param query string

+ * The MySQL query. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param link_identifier resource[optional] + * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use mysql_select_db() and mysql_query() instead). + * @return resource a positive MySQL result resource to the query result, + * or false on error. The function also returns true/false for + * INSERT/UPDATE/DELETE + * queries to indicate success/failure. + * + * @jms-builtin + */ +function mysql_db_query ($database, $query, $link_identifier = null) {} + +/** + * List databases available on a MySQL server + * @link http://www.php.net/manual/en/function.mysql-list-dbs.php + * @param link_identifier resource[optional] + * @return resource a result pointer resource on success, or false on + * failure. Use the mysql_tablename function to traverse + * this result pointer, or any function for result tables, such as + * mysql_fetch_array. + * + * @jms-builtin + */ +function mysql_list_dbs ($link_identifier = null) {} + +/** + * List tables in a MySQL database + * @link http://www.php.net/manual/en/function.mysql-list-tables.php + * @param database string

+ * The name of the database + *

+ * @param link_identifier resource[optional] + * @return resource A result pointer resource on success&return.falseforfailure;. + *

+ *

+ * Use the mysql_tablename function to + * traverse this result pointer, or any function for result tables, + * such as mysql_fetch_array. + * + * @jms-builtin + */ +function mysql_list_tables ($database, $link_identifier = null) {} + +/** + * List MySQL table fields + * @link http://www.php.net/manual/en/function.mysql-list-fields.php + * @param database_name string

+ * The name of the database that's being queried. + *

+ * @param table_name string

+ * The name of the table that's being queried. + *

+ * @param link_identifier resource[optional] + * @return resource A result pointer resource on success, or false on + * failure. + *

+ *

+ * The returned result can be used with mysql_field_flags, + * mysql_field_len, + * mysql_field_name&listendand; + * mysql_field_type. + * + * @jms-builtin + */ +function mysql_list_fields ($database_name, $table_name, $link_identifier = null) {} + +/** + * List MySQL processes + * @link http://www.php.net/manual/en/function.mysql-list-processes.php + * @param link_identifier resource[optional] + * @return resource A result pointer resource on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_list_processes ($link_identifier = null) {} + +/** + * Returns the text of the error message from previous MySQL operation + * @link http://www.php.net/manual/en/function.mysql-error.php + * @param link_identifier resource[optional] + * @return string the error text from the last MySQL function, or + * '' (empty string) if no error occurred. + * + * @jms-builtin + */ +function mysql_error ($link_identifier = null) {} + +/** + * Returns the numerical value of the error message from previous MySQL operation + * @link http://www.php.net/manual/en/function.mysql-errno.php + * @param link_identifier resource[optional] + * @return int the error number from the last MySQL function, or + * 0 (zero) if no error occurred. + * + * @jms-builtin + */ +function mysql_errno ($link_identifier = null) {} + +/** + * Get number of affected rows in previous MySQL operation + * @link http://www.php.net/manual/en/function.mysql-affected-rows.php + * @param link_identifier resource[optional] + * @return int the number of affected rows on success, and -1 if the last query + * failed. + *

+ *

+ * If the last query was a DELETE query with no WHERE clause, all + * of the records will have been deleted from the table but this + * function will return zero with MySQL versions prior to 4.1.2. + *

+ *

+ * When using UPDATE, MySQL will not update columns where the new value is the + * same as the old value. This creates the possibility that + * mysql_affected_rows may not actually equal the number + * of rows matched, only the number of rows that were literally affected by + * the query. + *

+ *

+ * The REPLACE statement first deletes the record with the same primary key + * and then inserts the new record. This function returns the number of + * deleted records plus the number of inserted records. + * + * @jms-builtin + */ +function mysql_affected_rows ($link_identifier = null) {} + +/** + * Get the ID generated in the last query + * @link http://www.php.net/manual/en/function.mysql-insert-id.php + * @param link_identifier resource[optional] + * @return int The ID generated for an AUTO_INCREMENT column by the previous + * query on success, 0 if the previous + * query does not generate an AUTO_INCREMENT value, or false if + * no MySQL connection was established. + * + * @jms-builtin + */ +function mysql_insert_id ($link_identifier = null) {} + +/** + * Get result data + * @link http://www.php.net/manual/en/function.mysql-result.php + * @param result resource + * @param row int

+ * The row number from the result that's being retrieved. Row numbers + * start at 0. + *

+ * @param field mixed[optional]

+ * The name or offset of the field being retrieved. + *

+ *

+ * It can be the field's offset, the field's name, or the field's table + * dot field name (tablename.fieldname). If the column name has been + * aliased ('select foo as bar from...'), use the alias instead of the + * column name. If undefined, the first field is retrieved. + *

+ * @return string The contents of one cell from a MySQL result set on success, or + * false on failure. + * + * @jms-builtin + */ +function mysql_result ($result, $row, $field = null) {} + +/** + * Get number of rows in result + * @link http://www.php.net/manual/en/function.mysql-num-rows.php + * @param result resource + * @return int The number of rows in a result set on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_num_rows ($result) {} + +/** + * Get number of fields in result + * @link http://www.php.net/manual/en/function.mysql-num-fields.php + * @param result resource + * @return int the number of fields in the result set resource on + * success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_num_fields ($result) {} + +/** + * Get a result row as an enumerated array + * @link http://www.php.net/manual/en/function.mysql-fetch-row.php + * @param result resource + * @return array an numerical array of strings that corresponds to the fetched row, or + * false if there are no more rows. + *

+ *

+ * mysql_fetch_row fetches one row of data from + * the result associated with the specified result identifier. The + * row is returned as an array. Each result column is stored in an + * array offset, starting at offset 0. + * + * @jms-builtin + */ +function mysql_fetch_row ($result) {} + +/** + * Fetch a result row as an associative array, a numeric array, or both + * @link http://www.php.net/manual/en/function.mysql-fetch-array.php + * @param result resource + * @param result_type int[optional]

+ * The type of array that is to be fetched. It's a constant and can + * take the following values: MYSQL_ASSOC, + * MYSQL_NUM, and + * MYSQL_BOTH. + *

+ * @return array an array of strings that corresponds to the fetched row, or false + * if there are no more rows. The type of returned array depends on + * how result_type is defined. By using + * MYSQL_BOTH (default), you'll get an array with both + * associative and number indices. Using MYSQL_ASSOC, you + * only get associative indices (as mysql_fetch_assoc + * works), using MYSQL_NUM, you only get number indices + * (as mysql_fetch_row works). + *

+ *

+ * If two or more columns of the result have the same field names, + * the last column will take precedence. To access the other column(s) + * of the same name, you must use the numeric index of the column or + * make an alias for the column. For aliased columns, you cannot + * access the contents with the original column name. + * + * @jms-builtin + */ +function mysql_fetch_array ($result, $result_type = null) {} + +/** + * Fetch a result row as an associative array + * @link http://www.php.net/manual/en/function.mysql-fetch-assoc.php + * @param result resource + * @return array an associative array of strings that corresponds to the fetched row, or + * false if there are no more rows. + *

+ *

+ * If two or more columns of the result have the same field names, + * the last column will take precedence. To access the other + * column(s) of the same name, you either need to access the + * result with numeric indices by using + * mysql_fetch_row or add alias names. + * See the example at the mysql_fetch_array + * description about aliases. + * + * @jms-builtin + */ +function mysql_fetch_assoc ($result) {} + +/** + * Fetch a result row as an object + * @link http://www.php.net/manual/en/function.mysql-fetch-object.php + * @param result resource + * @param class_name string[optional]

+ * The name of the class to instantiate, set the properties of and return. + * If not specified, a stdClass object is returned. + *

+ * @param params array[optional]

+ * An optional array of parameters to pass to the constructor + * for class_name objects. + *

+ * @return object an object with string properties that correspond to the + * fetched row, or false if there are no more rows. + * + * @jms-builtin + */ +function mysql_fetch_object ($result, $class_name = null, array $params = null) {} + +/** + * Move internal result pointer + * @link http://www.php.net/manual/en/function.mysql-data-seek.php + * @param result resource + * @param row_number int

+ * The desired row number of the new result pointer. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysql_data_seek ($result, $row_number) {} + +/** + * Get the length of each output in a result + * @link http://www.php.net/manual/en/function.mysql-fetch-lengths.php + * @param result resource + * @return array An array of lengths on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_fetch_lengths ($result) {} + +/** + * Get column information from a result and return as an object + * @link http://www.php.net/manual/en/function.mysql-fetch-field.php + * @param result resource + * @param field_offset int[optional]

+ * The numerical field offset. If the field offset is not specified, the + * next field that was not yet retrieved by this function is retrieved. + * The field_offset starts at 0. + *

+ * @return object an object containing field information. The properties + * of the object are: + *

+ *

+ * name - column name + * table - name of the table the column belongs to + * def - default value of the column + * max_length - maximum length of the column + * not_null - 1 if the column cannot be &null; + * primary_key - 1 if the column is a primary key + * unique_key - 1 if the column is a unique key + * multiple_key - 1 if the column is a non-unique key + * numeric - 1 if the column is numeric + * blob - 1 if the column is a BLOB + * type - the type of the column + * unsigned - 1 if the column is unsigned + * zerofill - 1 if the column is zero-filled + * + * @jms-builtin + */ +function mysql_fetch_field ($result, $field_offset = null) {} + +/** + * Set result pointer to a specified field offset + * @link http://www.php.net/manual/en/function.mysql-field-seek.php + * @param result resource + * @param field_offset int + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysql_field_seek ($result, $field_offset) {} + +/** + * Free result memory + * @link http://www.php.net/manual/en/function.mysql-free-result.php + * @param result resource + * @return bool Returns true on success or false on failure. + *

+ *

+ * If a non-resource is used for the result, an + * error of level E_WARNING will be emitted. It's worth noting that + * mysql_query only returns a resource + * for SELECT, SHOW, EXPLAIN, and DESCRIBE queries. + * + * @jms-builtin + */ +function mysql_free_result ($result) {} + +/** + * Get the name of the specified field in a result + * @link http://www.php.net/manual/en/function.mysql-field-name.php + * @param result resource + * @param field_offset int + * @return string The name of the specified field index on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_field_name ($result, $field_offset) {} + +/** + * Get name of the table the specified field is in + * @link http://www.php.net/manual/en/function.mysql-field-table.php + * @param result resource + * @param field_offset int + * @return string The name of the table on success. + * + * @jms-builtin + */ +function mysql_field_table ($result, $field_offset) {} + +/** + * Returns the length of the specified field + * @link http://www.php.net/manual/en/function.mysql-field-len.php + * @param result resource + * @param field_offset int + * @return int The length of the specified field index on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_field_len ($result, $field_offset) {} + +/** + * Get the type of the specified field in a result + * @link http://www.php.net/manual/en/function.mysql-field-type.php + * @param result resource + * @param field_offset int + * @return string The returned field type + * will be one of "int", "real", + * "string", "blob", and others as + * detailed in the MySQL + * documentation. + * + * @jms-builtin + */ +function mysql_field_type ($result, $field_offset) {} + +/** + * Get the flags associated with the specified field in a result + * @link http://www.php.net/manual/en/function.mysql-field-flags.php + * @param result resource + * @param field_offset int + * @return string a string of flags associated with the result&return.falseforfailure;. + *

+ *

+ * The following flags are reported, if your version of MySQL + * is current enough to support them: "not_null", + * "primary_key", "unique_key", + * "multiple_key", "blob", + * "unsigned", "zerofill", + * "binary", "enum", + * "auto_increment" and "timestamp". + * + * @jms-builtin + */ +function mysql_field_flags ($result, $field_offset) {} + +/** + * Escapes a string for use in a mysql_query + * @link http://www.php.net/manual/en/function.mysql-escape-string.php + * @param unescaped_string string

+ * The string that is to be escaped. + *

+ * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use mysql_real_escape_string() instead). + * @return string the escaped string. + * + * @jms-builtin + */ +function mysql_escape_string ($unescaped_string) {} + +/** + * Escapes special characters in a string for use in a SQL statement + * @link http://www.php.net/manual/en/function.mysql-real-escape-string.php + * @param unescaped_string string

+ * The string that is to be escaped. + *

+ * @param link_identifier resource[optional] + * @return string the escaped string, or false on error. + * + * @jms-builtin + */ +function mysql_real_escape_string ($unescaped_string, $link_identifier = null) {} + +/** + * Get current system status + * @link http://www.php.net/manual/en/function.mysql-stat.php + * @param link_identifier resource[optional] + * @return string a string with the status for uptime, threads, queries, open tables, + * flush tables and queries per second. For a complete list of other status + * variables, you have to use the SHOW STATUS SQL command. + * If link_identifier is invalid, &null; is returned. + * + * @jms-builtin + */ +function mysql_stat ($link_identifier = null) {} + +/** + * Return the current thread ID + * @link http://www.php.net/manual/en/function.mysql-thread-id.php + * @param link_identifier resource[optional] + * @return int The thread ID on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_thread_id ($link_identifier = null) {} + +/** + * Returns the name of the character set + * @link http://www.php.net/manual/en/function.mysql-client-encoding.php + * @param link_identifier resource[optional] + * @return string the default character set name for the current connection. + * + * @jms-builtin + */ +function mysql_client_encoding ($link_identifier = null) {} + +/** + * Ping a server connection or reconnect if there is no connection + * @link http://www.php.net/manual/en/function.mysql-ping.php + * @param link_identifier resource[optional] + * @return bool true if the connection to the server MySQL server is working, + * otherwise false. + * + * @jms-builtin + */ +function mysql_ping ($link_identifier = null) {} + +/** + * Get MySQL client info + * @link http://www.php.net/manual/en/function.mysql-get-client-info.php + * @return string The MySQL client version. + * + * @jms-builtin + */ +function mysql_get_client_info () {} + +/** + * Get MySQL host info + * @link http://www.php.net/manual/en/function.mysql-get-host-info.php + * @param link_identifier resource[optional] + * @return string a string describing the type of MySQL connection in use for the + * connection&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_get_host_info ($link_identifier = null) {} + +/** + * Get MySQL protocol info + * @link http://www.php.net/manual/en/function.mysql-get-proto-info.php + * @param link_identifier resource[optional] + * @return int the MySQL protocol on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_get_proto_info ($link_identifier = null) {} + +/** + * Get MySQL server info + * @link http://www.php.net/manual/en/function.mysql-get-server-info.php + * @param link_identifier resource[optional] + * @return string the MySQL server version on success&return.falseforfailure;. + * + * @jms-builtin + */ +function mysql_get_server_info ($link_identifier = null) {} + +/** + * Get information about the most recent query + * @link http://www.php.net/manual/en/function.mysql-info.php + * @param link_identifier resource[optional] + * @return string information about the statement on success, or false on + * failure. See the example below for which statements provide information, + * and what the returned value may look like. Statements that are not listed + * will return false. + * + * @jms-builtin + */ +function mysql_info ($link_identifier = null) {} + +/** + * Sets the client character set + * @link http://www.php.net/manual/en/function.mysql-set-charset.php + * @param charset string

+ * A valid character set name. + *

+ * @param link_identifier resource[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysql_set_charset ($charset, $link_identifier = null) {} + +function mysql () {} + +function mysql_fieldname () {} + +function mysql_fieldtable () {} + +function mysql_fieldlen () {} + +function mysql_fieldtype () {} + +function mysql_fieldflags () {} + +function mysql_selectdb () {} + +function mysql_freeresult () {} + +function mysql_numfields () {} + +function mysql_numrows () {} + +function mysql_listdbs () {} + +function mysql_listtables () {} + +function mysql_listfields () {} + +/** + * Get result data + * @link http://www.php.net/manual/en/function.mysql-db-name.php + * @param result resource

+ * The result pointer from a call to mysql_list_dbs. + *

+ * @param row int

+ * The index into the result set. + *

+ * @param field mixed[optional]

+ * The field name. + *

+ * @return string the database name on success, and false on failure. If false + * is returned, use mysql_error to determine the nature + * of the error. + * + * @jms-builtin + */ +function mysql_db_name ($result, $row, $field = null) {} + +function mysql_dbname () {} + +/** + * Get table name of field + * @link http://www.php.net/manual/en/function.mysql-tablename.php + * @param result resource

+ * A result pointer resource that's returned from + * mysql_list_tables. + *

+ * @param i int

+ * The integer index (row/table number) + *

+ * @return string The name of the table on success&return.falseforfailure;. + *

+ *

+ * Use the mysql_tablename function to + * traverse this result pointer, or any function for result tables, + * such as mysql_fetch_array. + * + * @jms-builtin + */ +function mysql_tablename ($result, $i) {} + +function mysql_table_name () {} + + +/** + * Columns are returned into the array having the fieldname as the array + * index. + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_ASSOC', 1); + +/** + * Columns are returned into the array having a numerical index to the + * fields. This index starts with 0, the first field in the result. + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_NUM', 2); + +/** + * Columns are returned into the array having both a numerical index + * and the fieldname as the array index. + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_BOTH', 3); + +/** + * Use compression protocol + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_COMPRESS', 32); + +/** + * Use SSL encryption. This flag is only available with version 4.x + * of the MySQL client library or newer. Version 3.23.x is bundled both + * with PHP 4 and Windows binaries of PHP 5. + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_SSL', 2048); + +/** + * Allow interactive_timeout seconds (instead of wait_timeout) of + * inactivity before closing the connection. + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_INTERACTIVE', 1024); + +/** + * Allow space after function names + * @link http://www.php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_IGNORE_SPACE', 256); + +// End of mysql v.1.0 +?> diff --git a/res/php-5.3-core-api/mysqli.php b/res/php-5.3-core-api/mysqli.php new file mode 100644 index 0000000..6985f5e --- /dev/null +++ b/res/php-5.3-core-api/mysqli.php @@ -0,0 +1,2029 @@ + + * Whether to turn on auto-commit or not. + *

+ * @return bool Returns true on success or false on failure. + */ + public function autocommit ($mode) {} + + /** + * Changes the user of the specified database connection + * @link http://www.php.net/manual/en/mysqli.change-user.php + * @param user string

+ * The MySQL user name. + *

+ * @param password string

+ * The MySQL password. + *

+ * @param database string

+ * The database to change to. + *

+ *

+ * If desired, the &null; value may be passed resulting in only changing + * the user and not selecting a database. To select a database in this + * case use the mysqli_select_db function. + *

+ * @return bool Returns true on success or false on failure. + */ + public function change_user ($user, $password, $database) {} + + /** + * Returns the default character set for the database connection + * @link http://www.php.net/manual/en/mysqli.character-set-name.php + * @return string The default character set for the current connection + */ + public function character_set_name () {} + + public function client_encoding () {} + + /** + * Closes a previously opened database connection + * @link http://www.php.net/manual/en/mysqli.close.php + * @return bool Returns true on success or false on failure. + */ + public function close () {} + + /** + * Commits the current transaction + * @link http://www.php.net/manual/en/mysqli.commit.php + * @return bool Returns true on success or false on failure. + */ + public function commit () {} + + public function connect () {} + + /** + * Dump debugging information into the log + * @link http://www.php.net/manual/en/mysqli.dump-debug-info.php + * @return bool Returns true on success or false on failure. + */ + public function dump_debug_info () {} + + /** + * Performs debugging operations + * @link http://www.php.net/manual/en/mysqli.debug.php + * @param message string

+ * A string representing the debugging operation to perform + *

+ * @return bool true. + */ + public function debug ($message) {} + + /** + * Returns a character set object + * @link http://www.php.net/manual/en/mysqli.get-charset.php + * @return object The function returns a character set object with the following properties: + * charset + *

Character set name

+ * collation + *

Collation name

+ * dir + *

Directory the charset description was fetched from (?) or "" for built-in character sets

+ * min_length + *

Minimum character length in bytes

+ * max_length + *

Maximum character length in bytes

+ * number + *

Internal character set number

+ * state + *

Character set status (?)

+ */ + public function get_charset () {} + + /** + * Returns the MySQL client version as a string + * @link http://www.php.net/manual/en/mysqli.get-client-info.php + * @return string A string that represents the MySQL client library version + */ + public function get_client_info () {} + + public function get_server_info () {} + + /** + * Get result of SHOW WARNINGS + * @link http://www.php.net/manual/en/mysqli.get-warnings.php + * @return mysqli_warnings + */ + public function get_warnings () {} + + /** + * Initializes MySQLi and returns a resource for use with mysqli_real_connect() + * @link http://www.php.net/manual/en/mysqli.init.php + * @return mysqli an object. + */ + public function init () {} + + /** + * Asks the server to kill a MySQL thread + * @link http://www.php.net/manual/en/mysqli.kill.php + * @param processid int + * @return bool Returns true on success or false on failure. + */ + public function kill ($processid) {} + + /** + * Unsets user defined handler for load local infile command + * @link http://www.php.net/manual/en/mysqli.set-local-infile-default.php + * @param link mysqli + * @return void + */ + public function set_local_infile_default (mysqli $link) {} + + /** + * Set callback function for LOAD DATA LOCAL INFILE command + * @link http://www.php.net/manual/en/mysqli.set-local-infile-handler.php + * @param link mysqli + * @param read_func callback

+ * A callback function or object method taking the following parameters: + *

+ * stream + *

A PHP stream associated with the SQL commands INFILE

+ * @return bool Returns true on success or false on failure. + */ + public function set_local_infile_handler (mysqli $link, $read_func) {} + + /** + * Performs a query on the database + * @link http://www.php.net/manual/en/mysqli.multi-query.php + * @param query string

+ * The query, as a string. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return bool false if the first statement failed. + * To retrieve subsequent errors from other statements you have to call + * mysqli_next_result first. + */ + public function multi_query ($query) {} + + public function mysqli () {} + + /** + * Check if there are any more query results from a multi query + * @link http://www.php.net/manual/en/mysqli.more-results.php + * @return bool Returns true on success or false on failure. + */ + public function more_results () {} + + /** + * Prepare next result from multi_query + * @link http://www.php.net/manual/en/mysqli.next-result.php + * @return bool Returns true on success or false on failure. + */ + public function next_result () {} + + /** + * Set options + * @link http://www.php.net/manual/en/mysqli.options.php + * @param option int

+ * The option that you want to set. It can be one of the following values: + * + * Valid options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
MYSQLI_OPT_CONNECT_TIMEOUTconnection timeout in seconds (supported on Windows with TCP/IP since PHP 5.3.1)
MYSQLI_OPT_LOCAL_INFILEenable/disable use of LOAD LOCAL INFILE
MYSQLI_INIT_COMMANDcommand to execute after when connecting to MySQL server
MYSQLI_READ_DEFAULT_FILE + * Read options from named option file instead of my.cnf + *
MYSQLI_READ_DEFAULT_GROUP + * Read options from the named group from my.cnf + * or the file specified with MYSQL_READ_DEFAULT_FILE. + *
+ *

+ * @param value mixed

+ * The value for the option. + *

+ * @return bool Returns true on success or false on failure. + */ + public function options ($option, $value) {} + + /** + * Pings a server connection, or tries to reconnect if the connection has gone down + * @link http://www.php.net/manual/en/mysqli.ping.php + * @return bool Returns true on success or false on failure. + */ + public function ping () {} + + /** + * Prepare a SQL statement for execution + * @link http://www.php.net/manual/en/mysqli.prepare.php + * @param query string

+ * The query, as a string. + *

+ *

+ * You should not add a terminating semicolon or \g + * to the statement. + *

+ *

+ * This parameter can include one or more parameter markers in the SQL + * statement by embedding question mark (?) characters + * at the appropriate positions. + *

+ *

+ * The markers are legal only in certain places in SQL statements. + * For example, they are allowed in the VALUES() + * list of an INSERT statement (to specify column + * values for a row), or in a comparison with a column in a + * WHERE clause to specify a comparison value. + *

+ *

+ * However, they are not allowed for identifiers (such as table or + * column names), in the select list that names the columns to be + * returned by a SELECT statement, or to specify both + * operands of a binary operator such as the = equal + * sign. The latter restriction is necessary because it would be + * impossible to determine the parameter type. It's not allowed to + * compare marker with NULL by + * ? IS NULL too. In general, parameters are legal + * only in Data Manipulation Language (DML) statements, and not in Data + * Definition Language (DDL) statements. + *

+ * @return mysqli_stmt mysqli_prepare returns a statement object or false if an error occurred. + */ + public function prepare ($query) {} + + /** + * Performs a query on the database + * @link http://www.php.net/manual/en/mysqli.query.php + * @param query string

+ * The query string. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param resultmode int[optional]

+ * Either the constant MYSQLI_USE_RESULT or + * MYSQLI_STORE_RESULT depending on the desired + * behavior. By default, MYSQLI_STORE_RESULT is used. + *

+ *

+ * If you use MYSQLI_USE_RESULT all subsequent calls + * will return error Commands out of sync unless you + * call mysqli_free_result + *

+ *

+ * With MYSQLI_ASYNC (available with mysqlnd), it is + * possible to perform query asynchronously. + * mysqli_poll is then used to get results from such + * queries. + *

+ * @return mixed false on failure. For successful SELECT, SHOW, DESCRIBE or + * EXPLAIN queries mysqli_query will return + * a result object. For other successful queries mysqli_query will + * return true. + */ + public function query ($query, $resultmode = null) {} + + /** + * Opens a connection to a mysql server + * @link http://www.php.net/manual/en/mysqli.real-connect.php + * @param host string[optional]

+ * Can be either a host name or an IP address. Passing the &null; value + * or the string "localhost" to this parameter, the local host is + * assumed. When possible, pipes will be used instead of the TCP/IP + * protocol. + *

+ * @param username string[optional]

+ * The MySQL user name. + *

+ * @param passwd string[optional]

+ * If provided or &null;, the MySQL server will attempt to authenticate + * the user against those user records which have no password only. This + * allows one username to be used with different permissions (depending + * on if a password as provided or not). + *

+ * @param dbname string[optional]

+ * If provided will specify the default database to be used when + * performing queries. + *

+ * @param port int[optional]

+ * Specifies the port number to attempt to connect to the MySQL server. + *

+ * @param socket string[optional]

+ * Specifies the socket or named pipe that should be used. + *

+ *

+ * Specifying the socket parameter will not + * explicitly determine the type of connection to be used when + * connecting to the MySQL server. How the connection is made to the + * MySQL database is determined by the host + * parameter. + *

+ * @param flags int[optional]

+ * With the parameter flags you can set different + * connection options: + *

+ * + * Supported flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
MYSQLI_CLIENT_COMPRESSUse compression protocol
MYSQLI_CLIENT_FOUND_ROWSreturn number of matched rows, not the number of affected rows
MYSQLI_CLIENT_IGNORE_SPACEAllow spaces after function names. Makes all function names reserved words.
MYSQLI_CLIENT_INTERACTIVE + * Allow interactive_timeout seconds (instead of + * wait_timeout seconds) of inactivity before closing the connection + *
MYSQLI_CLIENT_SSLUse SSL (encryption)
+ *

+ * For security reasons the MULTI_STATEMENT flag is + * not supported in PHP. If you want to execute multiple queries use the + * mysqli_multi_query function. + *

+ * @return bool Returns true on success or false on failure. + */ + public function real_connect ($host = null, $username = null, $passwd = null, $dbname = null, $port = null, $socket = null, $flags = null) {} + + /** + * Escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection + * @link http://www.php.net/manual/en/mysqli.real-escape-string.php + * @param escapestr string

+ * The string to be escaped. + *

+ *

+ * Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and + * Control-Z. + *

+ * @return string an escaped string. + */ + public function real_escape_string ($escapestr) {} + + public function escape_string () {} + + /** + * Execute an SQL query + * @link http://www.php.net/manual/en/mysqli.real-query.php + * @param query string

+ * The query, as a string. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return bool Returns true on success or false on failure. + */ + public function real_query ($query) {} + + /** + * Rolls back current transaction + * @link http://www.php.net/manual/en/mysqli.rollback.php + * @return bool Returns true on success or false on failure. + */ + public function rollback () {} + + /** + * Selects the default database for database queries + * @link http://www.php.net/manual/en/mysqli.select-db.php + * @param dbname string

+ * The database name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function select_db ($dbname) {} + + /** + * Sets the default client character set + * @link http://www.php.net/manual/en/mysqli.set-charset.php + * @param charset string

+ * The charset to be set as default. + *

+ * @return bool Returns true on success or false on failure. + */ + public function set_charset ($charset) {} + + public function set_opt () {} + + /** + * Used for establishing secure connections using SSL + * @link http://www.php.net/manual/en/mysqli.ssl-set.php + * @param key string

+ * The path name to the key file. + *

+ * @param cert string

+ * The path name to the certificate file. + *

+ * @param ca string

+ * The path name to the certificate authority file. + *

+ * @param capath string

+ * The pathname to a directory that contains trusted SSL CA certificates + * in PEM format. + *

+ * @param cipher string

+ * A list of allowable ciphers to use for SSL encryption. + *

+ * @return bool This function always returns true value. If SSL setup is + * incorrect mysqli_real_connect will return an error + * when you attempt to connect. + */ + public function ssl_set ($key, $cert, $ca, $capath, $cipher) {} + + /** + * Gets the current system status + * @link http://www.php.net/manual/en/mysqli.stat.php + * @return string A string describing the server status. false if an error occurred. + */ + public function stat () {} + + /** + * Initializes a statement and returns an object for use with mysqli_stmt_prepare + * @link http://www.php.net/manual/en/mysqli.stmt-init.php + * @return mysqli_stmt an object. + */ + public function stmt_init () {} + + /** + * Transfers a result set from the last query + * @link http://www.php.net/manual/en/mysqli.store-result.php + * @return mysqli_result a buffered result object or false if an error occurred. + *

+ *

+ * mysqli_store_result returns false in case the query + * didn't return a result set (if the query was, for example an INSERT + * statement). This function also returns false if the reading of the + * result set failed. You can check if you have got an error by checking + * if mysqli_error doesn't return an empty string, if + * mysqli_errno returns a non zero value, or if + * mysqli_field_count returns a non zero value. + * Also possible reason for this function returning false after + * successful call to mysqli_query can be too large + * result set (memory for it cannot be allocated). If + * mysqli_field_count returns a non-zero value, the + * statement should have produced a non-empty result set. + */ + public function store_result () {} + + /** + * Returns whether thread safety is given or not + * @link http://www.php.net/manual/en/mysqli.thread-safe.php + * @return bool true if the client library is thread-safe, otherwise false. + */ + public function thread_safe () {} + + /** + * Initiate a result set retrieval + * @link http://www.php.net/manual/en/mysqli.use-result.php + * @return mysqli_result an unbuffered result object or false if an error occurred. + */ + public function use_result () {} + + public function refresh () {} + +} + +/** @jms-builtin */ +final class mysqli_warning { + public $message; + public $sqlstate; + public $errno; + + + /** + * The __construct purpose + * @link http://www.php.net/manual/en/mysqli-warning.construct.php + */ + protected function __construct () {} + + /** + * The next purpose + * @link http://www.php.net/manual/en/mysqli-warning.next.php + * @return void + */ + public function next () {} + +} + +/** @jms-builtin */ +class mysqli_result { + public $current_field; + public $field_count; + public $lengths; + public $num_rows; + public $type; + + + public function __construct () {} + + public function close () {} + + /** + * Frees the memory associated with a result + * @link http://www.php.net/manual/en/mysqli-result.free.php + * @return void + */ + public function free () {} + + /** + * Adjusts the result pointer to an arbitary row in the result + * @link http://www.php.net/manual/en/mysqli-result.data-seek.php + * @param offset int

+ * The field offset. Must be between zero and the total number of rows + * minus one (0..mysqli_num_rows - 1). + *

+ * @return bool Returns true on success or false on failure. + */ + public function data_seek ($offset) {} + + /** + * Returns the next field in the result set + * @link http://www.php.net/manual/en/mysqli-result.fetch-field.php + * @return object an object which contains field definition information or false + * if no field information is available. + *

+ *

+ * + * Object properties + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
PropertyDescription
nameThe name of the column
orgnameOriginal column name if an alias was specified
tableThe name of the table this field belongs to (if not calculated)
orgtableOriginal table name if an alias was specified
defThe default value for this field, represented as a string
max_lengthThe maximum width of the field for the result set.
lengthThe width of the field, as specified in the table definition.
charsetnrThe character set number for the field.
flagsAn integer representing the bit-flags for the field.
typeThe data type used for this field
decimalsThe number of decimals used (for integer fields)
+ */ + public function fetch_field () {} + + /** + * Returns an array of objects representing the fields in a result set + * @link http://www.php.net/manual/en/mysqli-result.fetch-fields.php + * @return array an array of objects which contains field definition information or + * false if no field information is available. + *

+ *

+ * + * Object properties + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
PropertyDescription
nameThe name of the column
orgnameOriginal column name if an alias was specified
tableThe name of the table this field belongs to (if not calculated)
orgtableOriginal table name if an alias was specified
defThe default value for this field, represented as a string
max_lengthThe maximum width of the field for the result set.
lengthThe width of the field, as specified in the table definition.
charsetnrThe character set number for the field.
flagsAn integer representing the bit-flags for the field.
typeThe data type used for this field
decimalsThe number of decimals used (for integer fields)
+ */ + public function fetch_fields () {} + + /** + * Fetch meta-data for a single field + * @link http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php + * @param fieldnr int

+ * The field number. This value must be in the range from + * 0 to number of fields - 1. + *

+ * @return object an object which contains field definition information or false + * if no field information for specified fieldnr is + * available. + *

+ *

+ * + * Object attributes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
AttributeDescription
nameThe name of the column
orgnameOriginal column name if an alias was specified
tableThe name of the table this field belongs to (if not calculated)
orgtableOriginal table name if an alias was specified
defThe default value for this field, represented as a string
max_lengthThe maximum width of the field for the result set.
lengthThe width of the field, as specified in the table definition.
charsetnrThe character set number for the field.
flagsAn integer representing the bit-flags for the field.
typeThe data type used for this field
decimalsThe number of decimals used (for integer fields)
+ */ + public function fetch_field_direct ($fieldnr) {} + + /** + * Fetch a result row as an associative, a numeric array, or both + * @link http://www.php.net/manual/en/mysqli-result.fetch-array.php + * @param resulttype int[optional]

+ * This optional parameter is a constant indicating what type of array + * should be produced from the current row data. The possible values for + * this parameter are the constants MYSQLI_ASSOC, + * MYSQLI_NUM, or MYSQLI_BOTH. + *

+ *

+ * By using the MYSQLI_ASSOC constant this function + * will behave identically to the mysqli_fetch_assoc, + * while MYSQLI_NUM will behave identically to the + * mysqli_fetch_row function. The final option + * MYSQLI_BOTH will create a single array with the + * attributes of both. + *

+ * @return mixed an array of strings that corresponds to the fetched row or &null; if there + * are no more rows in resultset. + */ + public function fetch_array ($resulttype = null) {} + + /** + * Fetch a result row as an associative array + * @link http://www.php.net/manual/en/mysqli-result.fetch-assoc.php + * @return array an associative array of strings representing the fetched row in the result + * set, where each key in the array represents the name of one of the result + * set's columns or &null; if there are no more rows in resultset. + *

+ *

+ * If two or more columns of the result have the same field names, the last + * column will take precedence. To access the other column(s) of the same + * name, you either need to access the result with numeric indices by using + * mysqli_fetch_row or add alias names. + */ + public function fetch_assoc () {} + + /** + * Returns the current row of a result set as an object + * @link http://www.php.net/manual/en/mysqli-result.fetch-object.php + * @param class_name string[optional]

+ * The name of the class to instantiate, set the properties of and return. + * If not specified, a stdClass object is returned. + *

+ * @param params array[optional]

+ * An optional array of parameters to pass to the constructor + * for class_name objects. + *

+ * @return object an object with string properties that corresponds to the fetched + * row or &null; if there are no more rows in resultset. + */ + public function fetch_object ($class_name = null, array $params = null) {} + + /** + * Get a result row as an enumerated array + * @link http://www.php.net/manual/en/mysqli-result.fetch-row.php + * @return mixed mysqli_fetch_row returns an array of strings that corresponds to the fetched row + * or &null; if there are no more rows in result set. + */ + public function fetch_row () {} + + /** + * Set result pointer to a specified field offset + * @link http://www.php.net/manual/en/mysqli-result.field-seek.php + * @param fieldnr int

+ * The field number. This value must be in the range from + * 0 to number of fields - 1. + *

+ * @return bool Returns true on success or false on failure. + */ + public function field_seek ($fieldnr) {} + + public function free_result () {} + +} + +/** @jms-builtin */ +class mysqli_stmt { + public $affected_rows; + public $insert_id; + public $num_rows; + public $param_count; + public $field_count; + public $errno; + public $error; + public $sqlstate; + public $id; + + + public function __construct () {} + + /** + * Used to get the current value of a statement attribute + * @link http://www.php.net/manual/en/mysqli-stmt.attr-get.php + * @param attr int

+ * The attribute that you want to get. + *

+ * @return int false if the attribute is not found, otherwise returns the value of the attribute. + */ + public function attr_get ($attr) {} + + /** + * Used to modify the behavior of a prepared statement + * @link http://www.php.net/manual/en/mysqli-stmt.attr-set.php + * @param attr int

+ * The attribute that you want to set. It can have one of the following values: + * + * Attribute values + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CharacterDescription
MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH + * If set to 1, causes mysqli_stmt_store_result to + * update the metadata MYSQL_FIELD->max_length value. + *
MYSQLI_STMT_ATTR_CURSOR_TYPE + * Type of cursor to open for statement when mysqli_stmt_execute + * is invoked. mode can be MYSQLI_CURSOR_TYPE_NO_CURSOR + * (the default) or MYSQLI_CURSOR_TYPE_READ_ONLY. + *
MYSQLI_STMT_ATTR_PREFETCH_ROWS + * Number of rows to fetch from server at a time when using a cursor. + * mode can be in the range from 1 to the maximum + * value of unsigned long. The default is 1. + *
+ *

+ *

+ * If you use the MYSQLI_STMT_ATTR_CURSOR_TYPE option with + * MYSQLI_CURSOR_TYPE_READ_ONLY, a cursor is opened for the + * statement when you invoke mysqli_stmt_execute. If there + * is already an open cursor from a previous mysqli_stmt_execute call, + * it closes the cursor before opening a new one. mysqli_stmt_reset + * also closes any open cursor before preparing the statement for re-execution. + * mysqli_stmt_free_result closes any open cursor. + *

+ *

+ * If you open a cursor for a prepared statement, mysqli_stmt_store_result + * is unnecessary. + *

+ * @param mode int

The value to assign to the attribute.

+ * @return bool + */ + public function attr_set ($attr, $mode) {} + + /** + * Binds variables to a prepared statement as parameters + * @link http://www.php.net/manual/en/mysqli-stmt.bind-param.php + * @param types string

+ * A string that contains one or more characters which specify the types + * for the corresponding bind variables: + * + * Type specification chars + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CharacterDescription
icorresponding variable has type integer
dcorresponding variable has type double
scorresponding variable has type string
bcorresponding variable is a blob and will be sent in packets
+ *

+ * @param var1 mixed

+ * The number of variables and length of string + * types must match the parameters in the statement. + *

+ * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + */ + public function bind_param ($types, &$var1, &$_ = null) {} + + /** + * Binds variables to a prepared statement for result storage + * @link http://www.php.net/manual/en/mysqli-stmt.bind-result.php + * @param var1 mixed

+ * The variable to be bound. + *

+ * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + */ + public function bind_result (&$var1, &$_ = null) {} + + /** + * Closes a prepared statement + * @link http://www.php.net/manual/en/mysqli-stmt.close.php + * @return bool Returns true on success or false on failure. + */ + public function close () {} + + /** + * Seeks to an arbitrary row in statement result set + * @link http://www.php.net/manual/en/mysqli-stmt.data-seek.php + * @param offset int

+ * Must be between zero and the total number of rows minus one (0.. + * mysqli_stmt_num_rows - 1). + *

+ * @return void + */ + public function data_seek ($offset) {} + + /** + * Executes a prepared Query + * @link http://www.php.net/manual/en/mysqli-stmt.execute.php + * @return bool Returns true on success or false on failure. + */ + public function execute () {} + + /** + * Fetch results from a prepared statement into the bound variables + * @link http://www.php.net/manual/en/mysqli-stmt.fetch.php + * @return bool + */ + public function fetch () {} + + /** + * Get result of SHOW WARNINGS + * @link http://www.php.net/manual/en/mysqli-stmt.get-warnings.php + * @param stmt mysqli_stmt + * @return object + */ + public function get_warnings (mysqli_stmt $stmt) {} + + /** + * Returns result set metadata from a prepared statement + * @link http://www.php.net/manual/en/mysqli-stmt.result-metadata.php + * @return mysqli_result a result object or false if an error occurred. + */ + public function result_metadata () {} + + /** + * Return the number of rows in statements result set + * @link http://www.php.net/manual/en/mysqli-stmt.num-rows.php + * @param stmt mysqli_stmt + * @return int An integer representing the number of rows in result set. + */ + public function num_rows (mysqli_stmt $stmt) {} + + /** + * Send data in blocks + * @link http://www.php.net/manual/en/mysqli-stmt.send-long-data.php + * @param param_nr int

+ * Indicates which parameter to associate the data with. Parameters are + * numbered beginning with 0. + *

+ * @param data string

+ * A string containing data to be sent. + *

+ * @return bool Returns true on success or false on failure. + */ + public function send_long_data ($param_nr, $data) {} + + public function stmt () {} + + /** + * Frees stored result memory for the given statement handle + * @link http://www.php.net/manual/en/mysqli-stmt.free-result.php + * @return void + */ + public function free_result () {} + + /** + * Resets a prepared statement + * @link http://www.php.net/manual/en/mysqli-stmt.reset.php + * @return bool Returns true on success or false on failure. + */ + public function reset () {} + + /** + * Prepare a SQL statement for execution + * @link http://www.php.net/manual/en/mysqli-stmt.prepare.php + * @param query string

+ * The query, as a string. It must consist of a single SQL statement. + *

+ *

+ * You can include one or more parameter markers in the SQL statement by + * embedding question mark (?) characters at the + * appropriate positions. + *

+ *

+ * You should not add a terminating semicolon or \g + * to the statement. + *

+ *

+ * The markers are legal only in certain places in SQL statements. + * For example, they are allowed in the VALUES() list of an INSERT statement + * (to specify column values for a row), or in a comparison with a column in + * a WHERE clause to specify a comparison value. + *

+ *

+ * However, they are not allowed for identifiers (such as table or column names), + * in the select list that names the columns to be returned by a SELECT statement), + * or to specify both operands of a binary operator such as the = + * equal sign. The latter restriction is necessary because it would be impossible + * to determine the parameter type. In general, parameters are legal only in Data + * Manipulation Language (DML) statements, and not in Data Definition Language + * (DDL) statements. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function prepare ($query) {} + + /** + * Transfers a result set from a prepared statement + * @link http://www.php.net/manual/en/mysqli-stmt.store-result.php + * @return bool Returns true on success or false on failure. + */ + public function store_result () {} + +} + +function mysqli_affected_rows () {} + +function mysqli_autocommit () {} + +function mysqli_change_user () {} + +function mysqli_character_set_name () {} + +function mysqli_close () {} + +function mysqli_commit () {} + +/** + * &Alias; mysqli::__construct + * @link http://www.php.net/manual/en/function.mysqli-connect.php + * + * @jms-builtin + */ +function mysqli_connect () {} + +function mysqli_connect_errno () {} + +function mysqli_connect_error () {} + +function mysqli_data_seek () {} + +function mysqli_dump_debug_info () {} + +function mysqli_debug () {} + +function mysqli_errno () {} + +function mysqli_error () {} + +function mysqli_stmt_execute () {} + +/** + * Alias for mysqli_stmt_execute + * @link http://www.php.net/manual/en/function.mysqli-execute.php + * + * @jms-builtin + */ +function mysqli_execute () {} + +function mysqli_fetch_field () {} + +function mysqli_fetch_fields () {} + +function mysqli_fetch_field_direct () {} + +function mysqli_fetch_lengths () {} + +function mysqli_fetch_array () {} + +function mysqli_fetch_assoc () {} + +function mysqli_fetch_object () {} + +function mysqli_fetch_row () {} + +function mysqli_field_count () {} + +function mysqli_field_seek () {} + +function mysqli_field_tell () {} + +function mysqli_free_result () {} + +function mysqli_get_charset () {} + +function mysqli_get_client_info () {} + +function mysqli_get_client_version () {} + +function mysqli_get_host_info () {} + +function mysqli_get_proto_info () {} + +function mysqli_get_server_info () {} + +function mysqli_get_server_version () {} + +function mysqli_get_warnings () {} + +function mysqli_init () {} + +function mysqli_info () {} + +function mysqli_insert_id () {} + +function mysqli_kill () {} + +function mysqli_set_local_infile_default () {} + +function mysqli_set_local_infile_handler () {} + +function mysqli_more_results () {} + +function mysqli_multi_query () {} + +function mysqli_next_result () {} + +function mysqli_num_fields () {} + +function mysqli_num_rows () {} + +function mysqli_options () {} + +function mysqli_ping () {} + +function mysqli_prepare () {} + +/** + * Enables or disables internal report functions + * @link http://www.php.net/manual/en/function.mysqli-report.php + * @param flags int

+ * + * Supported flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
MYSQLI_REPORT_OFFTurns reporting off
MYSQLI_REPORT_ERRORReport errors from mysqli function calls
MYSQLI_REPORT_STRICTReport warnings from mysqli function calls
MYSQLI_REPORT_INDEXReport if no index or bad index was used in a query
MYSQLI_REPORT_ALLSet all options (report all)
+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mysqli_report ($flags) {} + +function mysqli_query () {} + +function mysqli_real_connect () {} + +function mysqli_real_escape_string () {} + +function mysqli_real_query () {} + +function mysqli_rollback () {} + +function mysqli_select_db () {} + +function mysqli_set_charset () {} + +function mysqli_stmt_attr_get () {} + +function mysqli_stmt_attr_set () {} + +function mysqli_stmt_field_count () {} + +function mysqli_stmt_init () {} + +function mysqli_stmt_prepare () {} + +function mysqli_stmt_result_metadata () {} + +function mysqli_stmt_send_long_data () {} + +/** + * @param var1 + * @param var2 + * + * @jms-builtin + */ +function mysqli_stmt_bind_param ($var1, $var2) {} + +/** + * @param var1 + * + * @jms-builtin + */ +function mysqli_stmt_bind_result ($var1) {} + +function mysqli_stmt_fetch () {} + +function mysqli_stmt_free_result () {} + +function mysqli_stmt_get_warnings () {} + +function mysqli_stmt_insert_id () {} + +function mysqli_stmt_reset () {} + +function mysqli_stmt_param_count () {} + +function mysqli_sqlstate () {} + +function mysqli_ssl_set () {} + +function mysqli_stat () {} + +function mysqli_stmt_affected_rows () {} + +function mysqli_stmt_close () {} + +function mysqli_stmt_data_seek () {} + +function mysqli_stmt_errno () {} + +function mysqli_stmt_error () {} + +function mysqli_stmt_num_rows () {} + +function mysqli_stmt_sqlstate () {} + +function mysqli_stmt_store_result () {} + +function mysqli_store_result () {} + +function mysqli_thread_id () {} + +function mysqli_thread_safe () {} + +function mysqli_use_result () {} + +function mysqli_warning_count () {} + +function mysqli_refresh () {} + +/** + * Alias for mysqli_stmt_bind_param + * @link http://www.php.net/manual/en/function.mysqli-bind-param.php + * @param var1 + * @param var2 + * + * @jms-builtin + */ +function mysqli_bind_param ($var1, $var2) {} + +/** + * Alias for mysqli_stmt_bind_result + * @link http://www.php.net/manual/en/function.mysqli-bind-result.php + * @param var1 + * + * @jms-builtin + */ +function mysqli_bind_result ($var1) {} + +/** + * Alias of mysqli_character_set_name + * @link http://www.php.net/manual/en/function.mysqli-client-encoding.php + * + * @jms-builtin + */ +function mysqli_client_encoding () {} + +/** + * Alias of mysqli_real_escape_string + * @link http://www.php.net/manual/en/function.mysqli-escape-string.php + * + * @jms-builtin + */ +function mysqli_escape_string () {} + +/** + * Alias for mysqli_stmt_fetch + * @link http://www.php.net/manual/en/function.mysqli-fetch.php + * + * @jms-builtin + */ +function mysqli_fetch () {} + +/** + * Alias for mysqli_stmt_param_count + * @link http://www.php.net/manual/en/function.mysqli-param-count.php + * + * @jms-builtin + */ +function mysqli_param_count () {} + +/** + * Alias for mysqli_stmt_result_metadata + * @link http://www.php.net/manual/en/function.mysqli-get-metadata.php + * + * @jms-builtin + */ +function mysqli_get_metadata () {} + +/** + * Alias for mysqli_stmt_send_long_data + * @link http://www.php.net/manual/en/function.mysqli-send-long-data.php + * + * @jms-builtin + */ +function mysqli_send_long_data () {} + +/** + * Alias of mysqli_options + * @link http://www.php.net/manual/en/function.mysqli-set-opt.php + * + * @jms-builtin + */ +function mysqli_set_opt () {} + + +/** + *

+ * Read options from the named group from my.cnf + * or the file specified with MYSQLI_READ_DEFAULT_FILE + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_READ_DEFAULT_GROUP', 5); + +/** + *

+ * Read options from the named option file instead of from my.cnf + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_READ_DEFAULT_FILE', 4); + +/** + *

+ * Connect timeout in seconds + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_OPT_CONNECT_TIMEOUT', 0); + +/** + *

+ * Enables command LOAD LOCAL INFILE + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_OPT_LOCAL_INFILE', 8); + +/** + *

+ * Command to execute when connecting to MySQL server. Will automatically be re-executed when reconnecting. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_INIT_COMMAND', 3); + +/** + *

+ * Use SSL (encrypted protocol). This option should not be set by application programs; + * it is set internally in the MySQL client library + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_SSL', 2048); + +/** + *

+ * Use compression protocol + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_COMPRESS', 32); + +/** + *

+ * Allow interactive_timeout seconds + * (instead of wait_timeout seconds) of inactivity before + * closing the connection. The client's session + * wait_timeout variable will be set to + * the value of the session interactive_timeout variable. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_INTERACTIVE', 1024); + +/** + *

+ * Allow spaces after function names. Makes all functions names reserved words. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_IGNORE_SPACE', 256); + +/** + *

+ * Don't allow the db_name.tbl_name.col_name syntax. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_NO_SCHEMA', 16); +define ('MYSQLI_CLIENT_FOUND_ROWS', 2); + +/** + *

+ * For using buffered resultsets + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STORE_RESULT', 0); + +/** + *

+ * For using unbuffered resultsets + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_USE_RESULT', 1); + +/** + *

+ * Columns are returned into the array having the fieldname as the array index. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_ASSOC', 1); + +/** + *

+ * Columns are returned into the array having an enumerated index. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NUM', 2); + +/** + *

+ * Columns are returned into the array having both a numerical index and the fieldname as the associative index. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_BOTH', 3); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH', 0); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STMT_ATTR_CURSOR_TYPE', 1); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_NO_CURSOR', 0); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_READ_ONLY', 1); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_FOR_UPDATE', 2); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_SCROLLABLE', 4); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STMT_ATTR_PREFETCH_ROWS', 2); + +/** + *

+ * Indicates that a field is defined as NOT NULL + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NOT_NULL_FLAG', 1); + +/** + *

+ * Field is part of a primary index + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_PRI_KEY_FLAG', 2); + +/** + *

+ * Field is part of a unique index. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_UNIQUE_KEY_FLAG', 4); + +/** + *

+ * Field is part of an index. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_MULTIPLE_KEY_FLAG', 8); + +/** + *

+ * Field is defined as BLOB + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_BLOB_FLAG', 16); + +/** + *

+ * Field is defined as UNSIGNED + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_UNSIGNED_FLAG', 32); + +/** + *

+ * Field is defined as ZEROFILL + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_ZEROFILL_FLAG', 64); + +/** + *

+ * Field is defined as AUTO_INCREMENT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_AUTO_INCREMENT_FLAG', 512); + +/** + *

+ * Field is defined as TIMESTAMP + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TIMESTAMP_FLAG', 1024); + +/** + *

+ * Field is defined as SET + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_SET_FLAG', 2048); + +/** + *

+ * Field is defined as NUMERIC + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NUM_FLAG', 32768); + +/** + *

+ * Field is part of an multi-index + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_PART_KEY_FLAG', 16384); + +/** + *

+ * Field is part of GROUP BY + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_GROUP_FLAG', 32768); + +/** + *

+ * Field is defined as ENUM. Available since PHP 5.3.0. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_ENUM_FLAG', 256); +define ('MYSQLI_BINARY_FLAG', 128); +define ('MYSQLI_NO_DEFAULT_VALUE_FLAG', 4096); + +/** + *

+ * Field is defined as DECIMAL + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DECIMAL', 0); + +/** + *

+ * Field is defined as TINYINT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TINY', 1); + +/** + *

+ * Field is defined as SMALLINT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_SHORT', 2); + +/** + *

+ * Field is defined as INT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_LONG', 3); + +/** + *

+ * Field is defined as FLOAT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_FLOAT', 4); + +/** + *

+ * Field is defined as DOUBLE + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DOUBLE', 5); + +/** + *

+ * Field is defined as DEFAULT NULL + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_NULL', 6); + +/** + *

+ * Field is defined as TIMESTAMP + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TIMESTAMP', 7); + +/** + *

+ * Field is defined as BIGINT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_LONGLONG', 8); + +/** + *

+ * Field is defined as MEDIUMINT + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_INT24', 9); + +/** + *

+ * Field is defined as DATE + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DATE', 10); + +/** + *

+ * Field is defined as TIME + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TIME', 11); + +/** + *

+ * Field is defined as DATETIME + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DATETIME', 12); + +/** + *

+ * Field is defined as YEAR + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_YEAR', 13); + +/** + *

+ * Field is defined as DATE + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_NEWDATE', 14); + +/** + *

+ * Field is defined as ENUM + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_ENUM', 247); + +/** + *

+ * Field is defined as SET + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_SET', 248); + +/** + *

+ * Field is defined as TINYBLOB + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TINY_BLOB', 249); + +/** + *

+ * Field is defined as MEDIUMBLOB + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_MEDIUM_BLOB', 250); + +/** + *

+ * Field is defined as LONGBLOB + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_LONG_BLOB', 251); + +/** + *

+ * Field is defined as BLOB + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_BLOB', 252); + +/** + *

+ * Field is defined as VARCHAR + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_VAR_STRING', 253); + +/** + *

+ * Field is defined as STRING + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_STRING', 254); + +/** + *

+ * Field is defined as CHAR + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_CHAR', 1); + +/** + *

+ * Field is defined as INTERVAL + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_INTERVAL', 247); + +/** + *

+ * Field is defined as GEOMETRY + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_GEOMETRY', 255); + +/** + *

+ * Precision math DECIMAL or NUMERIC field (MySQL 5.0.3 and up) + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_NEWDECIMAL', 246); + +/** + *

+ * Field is defined as BIT (MySQL 5.0.3 and up) + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_BIT', 16); + +/** + *

+ *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_SET_CHARSET_NAME', 7); + +/** + *

+ * No more data available for bind variable + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NO_DATA', 100); + +/** + *

+ * Data truncation occurred. Available since PHP 5.1.0 and MySQL 5.0.5. + *

+ * @link http://www.php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_DATA_TRUNCATED', 101); +define ('MYSQLI_REPORT_INDEX', 4); +define ('MYSQLI_REPORT_ERROR', 1); +define ('MYSQLI_REPORT_STRICT', 2); +define ('MYSQLI_REPORT_ALL', 255); +define ('MYSQLI_REPORT_OFF', 0); +define ('MYSQLI_DEBUG_TRACE_ENABLED', 0); +define ('MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED', 16); +define ('MYSQLI_SERVER_QUERY_NO_INDEX_USED', 32); +define ('MYSQLI_REFRESH_GRANT', 1); +define ('MYSQLI_REFRESH_LOG', 2); +define ('MYSQLI_REFRESH_TABLES', 4); +define ('MYSQLI_REFRESH_HOSTS', 8); +define ('MYSQLI_REFRESH_STATUS', 16); +define ('MYSQLI_REFRESH_THREADS', 32); +define ('MYSQLI_REFRESH_SLAVE', 64); +define ('MYSQLI_REFRESH_MASTER', 128); + +// End of mysqli v.0.1 +?> diff --git a/res/php-5.3-core-api/mysqlnd.php b/res/php-5.3-core-api/mysqlnd.php new file mode 100644 index 0000000..f446532 --- /dev/null +++ b/res/php-5.3-core-api/mysqlnd.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.3-core-api/oci8.php b/res/php-5.3-core-api/oci8.php new file mode 100644 index 0000000..b94d991 --- /dev/null +++ b/res/php-5.3-core-api/oci8.php @@ -0,0 +1,1901 @@ + + * If provided, this method will truncate the LOB to + * length bytes. Otherwise, it will completrely + * purge the LOB. + *

+ * @return bool Returns true on success or false on failure. + */ + public function truncate ($length = null) {} + + /** + * Erases a specified portion of the internal LOB data + * @link http://php.net/manual/en/function.oci-lob-erase.php + * @param offset int[optional]

+ *

+ * @param length int[optional]

+ *

+ * @return int the actual number of characters/bytes erased or false in case of + * error. + */ + public function erase ($offset = null, $length = null) {} + + /** + * Flushes/writes buffer of the LOB to the server + * @link http://php.net/manual/en/function.oci-lob-flush.php + * @param flag int[optional]

+ * By default, resources are not freed, but using flag + * OCI_LOB_BUFFER_FREE you can do it explicitly. + * Be sure you know what you're doing - next read/write operation to the + * same part of LOB will involve a round-trip to the server and initialize + * new buffer resources. It is recommended to use + * OCI_LOB_BUFFER_FREE flag only when you are not + * going to work with the LOB anymore. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * Returns false if buffering was not enabled or an error occurred. + */ + public function flush ($flag = null) {} + + /** + * Changes current state of buffering for the large object + * @link http://php.net/manual/en/function.oci-lob-setbuffering.php + * @param on_off bool

+ * true for on and false for off. + *

+ * @return bool Returns true on success or false on failure. Repeated calls to this method with the same flag will + * return true. + */ + public function setbuffering ($on_off) {} + + /** + * Returns current state of buffering for the large object + * @link http://php.net/manual/en/function.oci-lob-getbuffering.php + * @return bool false if buffering for the large object is off and true if + * buffering is used. + */ + public function getbuffering () {} + + /** + * Moves the internal pointer to the beginning of the large object + * @link http://php.net/manual/en/function.oci-lob-rewind.php + * @return bool Returns true on success or false on failure. + */ + public function rewind () {} + + /** + * Reads part of the large object + * @link http://php.net/manual/en/function.oci-lob-read.php + * @param length int

+ * The length of data to read, in bytes. + *

+ * @return string the contents as a string, or false in case of error. + */ + public function read ($length) {} + + /** + * Tests for end-of-file on a large object's descriptor + * @link http://php.net/manual/en/function.oci-lob-eof.php + * @return bool true if internal pointer of large object is at the end of LOB. + * Otherwise returns false. + */ + public function eof () {} + + /** + * Sets the internal pointer of the large object + * @link http://php.net/manual/en/function.oci-lob-seek.php + * @param offset int

+ * Indicates the amount of bytes, on which internal pointer should be + * moved from the position, pointed by whence. + *

+ * @param whence int[optional]

+ * May be one of: + * OCI_SEEK_SET - sets the position equal to + * offset + * OCI_SEEK_CUR - adds offset + * bytes to the current position + * OCI_SEEK_END - adds offset + * bytes to the end of large object (use negative value to move to a position + * before the end of large object) + *

+ * @return bool Returns true on success or false on failure. + */ + public function seek ($offset, $whence = null) {} + + /** + * Writes data to the large object + * @link http://php.net/manual/en/function.oci-lob-write.php + * @param data string

+ * The data to write in the LOB. + *

+ * @param length int[optional]

+ * If this parameter is given, writing will stop after + * length bytes have been written or the end of + * data is reached, whichever comes first. + *

+ * @return int the number of bytes written or false in case of error. + */ + public function write ($data, $length = null) {} + + /** + * Appends data from the large object to another large object + * @link http://php.net/manual/en/function.oci-lob-append.php + * @param lob_from OCI_Lob

+ * The copied LOB. + *

+ * @return bool Returns true on success or false on failure. + */ + public function append (OCI_Lob $lob_from) {} + + /** + * Returns size of large object + * @link http://php.net/manual/en/function.oci-lob-size.php + * @return int length of large object value or false in case of error. + * Empty objects have zero length. + */ + public function size () {} + + /** + * &Alias; oci_lob_export + * @link http://php.net/manual/en/function.oci-lob-writetofile.php + * @param filename + * @param start[optional] + * @param length[optional] + */ + public function writetofile ($filename, $start, $length) {} + + /** + * Exports LOB's contents to a file + * @link http://php.net/manual/en/function.oci-lob-export.php + * @param filename string

+ * Path to the file. + *

+ * @param start int[optional]

+ * Indicates from where to start exporting. + *

+ * @param length int[optional]

+ * Indicates the length of data to be exported. + *

+ * @return bool Returns true on success or false on failure. + */ + public function export ($filename, $start = null, $length = null) {} + + /** + * Imports file data to the LOB + * @link http://php.net/manual/en/function.oci-lob-import.php + * @param filename string

+ * Path to the file. + *

+ * @return bool Returns true on success or false on failure. + */ + public function import ($filename) {} + + /** + * Writes temporary large object + * @link http://php.net/manual/en/function.oci-lob-writetemporary.php + * @param data string

+ * The data to write. + *

+ * @param lob_type int[optional]

+ * Can be one of the following: + * OCI_TEMP_BLOB is used to create temporary BLOBs + * OCI_TEMP_CLOB (default value) is used to create + * temporary CLOBs + *

+ * @return bool Returns true on success or false on failure. + */ + public function writetemporary ($data, $lob_type = null) {} + + /** + * Closes LOB descriptor + * @link http://php.net/manual/en/function.oci-lob-close.php + * @return bool Returns true on success or false on failure. + */ + public function close () {} + + /** + * Saves data to the large object + * @link http://php.net/manual/en/function.oci-lob-save.php + * @param data string

+ * The data to be saved. + *

+ * @param offset int[optional]

+ * Can be used to indicate offset from the beginning of the large object. + *

+ * @return bool Returns true on success or false on failure. + */ + public function save ($data, $offset = null) {} + + /** + * &Alias; oci_lob_import + * @link http://php.net/manual/en/function.oci-lob-savefile.php + * @param filename + */ + public function savefile ($filename) {} + + /** + * Frees resources associated with the LOB descriptor + * @link http://php.net/manual/en/function.oci-lob-free.php + * @return bool Returns true on success or false on failure. + */ + public function free () {} + +} + +class OCI_Collection { + + /** + * Appends element to the collection + * @link http://php.net/manual/en/function.oci-collection-append.php + * @param value mixed

+ * The value to be added to the collection. Can be a string or a number. + *

+ * @return bool Returns true on success or false on failure. + */ + public function append ($value) {} + + /** + * Returns value of the element + * @link http://php.net/manual/en/function.oci-collection-element-get.php + * @param index int

+ * The element index. First index is 1. + *

+ * @return mixed false if such element doesn't exist; &null; if element is &null;; + * string if element is column of a string datatype or number if element is + * numeric field. + */ + public function getelem ($index) {} + + /** + * Assigns a value to the element of the collection + * @link http://php.net/manual/en/function.oci-collection-element-assign.php + * @param index int

+ * The element index. First index is 1. + *

+ * @param value mixed

+ * Can be a string or a number. + *

+ * @return bool Returns true on success or false on failure. + */ + public function assignelem ($index, $value) {} + + /** + * Assigns a value to the collection from another existing collection + * @link http://php.net/manual/en/function.oci-collection-assign.php + * @param from OCI-Collection

+ * An instance of OCI-Collection. + *

+ * @return bool Returns true on success or false on failure. + */ + public function assign (OCI_Collection $from) {} + + /** + * Returns size of the collection + * @link http://php.net/manual/en/function.oci-collection-size.php + * @return int the number of elements in the collection or false on error. + */ + public function size () {} + + /** + * Returns the maximum number of elements in the collection + * @link http://php.net/manual/en/function.oci-collection-max.php + * @return int the maximum number as an integer, or false on errors. + *

+ *

+ * If the returned value is 0, then the number of elements is not limited. + */ + public function max () {} + + /** + * Trims elements from the end of the collection + * @link http://php.net/manual/en/function.oci-collection-trim.php + * @param num int

+ * The number of elements to be trimmed. + *

+ * @return bool Returns true on success or false on failure. + */ + public function trim ($num) {} + + /** + * Frees the resources associated with the collection object + * @link http://php.net/manual/en/function.oci-collection-free.php + * @return bool Returns true on success or false on failure. + */ + public function free () {} + +} + +/** + * Uses a PHP variable for the define-step during a SELECT + * @link http://php.net/manual/en/function.oci-define-by-name.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param column_name string

+ * The column name. Must be uppercased. + *

+ *

+ * Take into consideration that Oracle uses ALL-UPPERCASE column names, + * whereby in your select you can also use lowercase. + * If you define a variable that doesn't exists in your select statement, + * no error will be issued. + *

+ * @param variable mixed

+ * The PHP variable. + *

+ * @param type int[optional]

+ *

+ *

+ * If you need to define an abstract datatype (LOB/ROWID/BFILE) you must + * allocate it first using oci_new_descriptor. See + * also the oci_bind_by_name function. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_define_by_name ($statement, $column_name, &$variable, $type = null) {} + +/** + * Binds the PHP variable to the Oracle placeholder + * @link http://php.net/manual/en/function.oci-bind-by-name.php + * @param statement resource

+ * An OCI statement. + *

+ * @param ph_name string

+ * The placeholder. + *

+ * @param variable mixed

+ * The PHP variable. + *

+ * @param maxlength int[optional]

+ * Sets the maximum length for the bind. If you set it to -1, this + * function will use the current length of variable + * to set the maximum length. + *

+ * @param type int[optional]

+ * If you need to bind an abstract datatype (LOB/ROWID/BFILE) you + * need to allocate it first using the + * oci_new_descriptor function. The + * length is not used for abstract datatypes + * and should be set to -1. The type parameter + * tells Oracle which descriptor is used. Default to SQLT_CHR. + * Possible values are: + *

+ * SQLT_FILE - for BFILEs; + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_bind_by_name ($statement, $ph_name, &$variable, $maxlength = null, $type = null) {} + +/** + * Binds PHP array to Oracle PL/SQL array by name + * @link http://php.net/manual/en/function.oci-bind-array-by-name.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param name string

+ * The Oracle placeholder. + *

+ * @param var_array array

+ * An array. + *

+ * @param max_table_length int

+ * Sets the maximum length both for incoming and result arrays. + *

+ * @param max_item_length int[optional]

+ * Sets maximum length for array items. If not specified or equals to -1, + * oci_bind_array_by_name will use find the longest + * element in the incoming array and will use it as maximum length for + * array items. + *

+ * @param type int[optional]

+ * Should be used to set the type of PL/SQL array items. See list of + * available types below: + *

+ *

+ *

+ * SQLT_NUM - for arrays of NUMBER. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_bind_array_by_name ($statement, $name, array &$var_array, $max_table_length, $max_item_length = null, $type = null) {} + +/** + * Checks if the field is &null; + * @link http://php.net/manual/en/function.oci-field-is-null.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field mixed

+ * Can be a field's index or a field's name (uppercased). + *

+ * @return bool true if field is &null;, false otherwise. + */ +function oci_field_is_null ($statement, $field) {} + +/** + * Returns the name of a field from the statement + * @link http://php.net/manual/en/function.oci-field-name.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field int

+ * Can be the field's index (1-based) or name. + *

+ * @return string the name as a string, or false on errors. + */ +function oci_field_name ($statement, $field) {} + +/** + * Returns field's size + * @link http://php.net/manual/en/function.oci-field-size.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field mixed

+ * Can be the field's index (1-based) or name. + *

+ * @return int the size of a field in bytes, or false on + * errors. + */ +function oci_field_size ($statement, $field) {} + +/** + * Tell the scale of the field + * @link http://php.net/manual/en/function.oci-field-scale.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field int

+ * Can be the field's index (1-based) or name. + *

+ * @return int the scale as an integer, or false on errors. + */ +function oci_field_scale ($statement, $field) {} + +/** + * Tell the precision of a field + * @link http://php.net/manual/en/function.oci-field-precision.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field int

+ * Can be the field's index (1-based) or name. + *

+ * @return int the precision as an integer, or false on errors. + */ +function oci_field_precision ($statement, $field) {} + +/** + * Returns field's data type + * @link http://php.net/manual/en/function.oci-field-type.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field int

+ * Can be the field's index (1-based) or name. + *

+ * @return mixed the field data type as a string, or false on errors. + */ +function oci_field_type ($statement, $field) {} + +/** + * Tell the raw Oracle data type of the field + * @link http://php.net/manual/en/function.oci-field-type-raw.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param field int

+ * Can be the field's index (1-based) or name. + *

+ * @return int Oracle's raw data type as a string, or false on errors. + */ +function oci_field_type_raw ($statement, $field) {} + +/** + * Executes a statement + * @link http://php.net/manual/en/function.oci-execute.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param mode int[optional]

+ * Allows you to specify the execution mode (default is + * OCI_COMMIT_ON_SUCCESS). + *

+ *

+ * If you don't want statements to be committed automatically, you should + * specify OCI_DEFAULT as your + * mode. + *

+ *

+ * When using OCI_DEFAULT mode, you're creating a + * transaction. Transactions are automatically rolled back when you close + * the connection, or when the script ends, whichever is soonest. You + * need to explicitly call oci_commit to commit + * the transaction, or oci_rollback to abort it. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_execute ($statement, $mode = null) {} + +/** + * Cancels reading from cursor + * @link http://php.net/manual/en/function.oci-cancel.php + * @param statement resource

+ * An OCI statement. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_cancel ($statement) {} + +/** + * Fetches the next row into result-buffer + * @link http://php.net/manual/en/function.oci-fetch.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_fetch ($statement) {} + +/** + * Returns the next row from the result data as an object + * @link http://php.net/manual/en/function.oci-fetch-object.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return object an object, which attributes correspond to fields in statement, or + * false if there are no more rows in the statement. + */ +function oci_fetch_object ($statement) {} + +/** + * Returns the next row from the result data as a numeric array + * @link http://php.net/manual/en/function.oci-fetch-row.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return array an indexed array with the field information, or false if there + * are no more rows in the statement. + */ +function oci_fetch_row ($statement) {} + +/** + * Returns the next row from the result data as an associative array + * @link http://php.net/manual/en/function.oci-fetch-assoc.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return array an associative array, or false if there are no more rows in the + * statement. + */ +function oci_fetch_assoc ($statement) {} + +/** + * Returns the next row from the result data as an associative or + numeric array, or both + * @link http://php.net/manual/en/function.oci-fetch-array.php + * @param statement resource

+ * An optional second parameter can be any combination of the following + * constants: + * OCI_BOTH - return an array with both associative + * and numeric indices (the same as OCI_ASSOC + * + OCI_NUM). This is the default behavior. + * OCI_ASSOC - return an associative array + * (as oci_fetch_assoc works). + * OCI_NUM - return a numeric array, + * (as oci_fetch_row works). + * OCI_RETURN_NULLS - create empty elements + * for the &null; fields. + * OCI_RETURN_LOBS - return the value of a LOB + * of the descriptor. + * Default mode is OCI_BOTH. + *

+ * @param mode int[optional] + * @return array an array with both associative and numeric indices, or false if + * there are no more rows in the statement. + */ +function oci_fetch_array ($statement, $mode = null) {} + +/** + * Fetches the next row into an array (deprecated) + * @link http://php.net/manual/en/function.ocifetchinto.php + * @param statement resource + * @param result array + * @param mode int[optional] + * @return int + */ +function ocifetchinto ($statement, array &$result, $mode = null) {} + +/** + * Fetches all rows of result data into an array + * @link http://php.net/manual/en/function.oci-fetch-all.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @param output array &database.fetch-null; + * @param skip int[optional]

+ * The number of initial rows to ignore when fetching the result (default + * value of 0, to start at the first line). + *

+ * @param maxrows int[optional]

+ * The number of rows to read, starting at the skipth + * row (default to -1, meaning all the rows). + *

+ * @param flags int[optional]

+ * Parameter flags can be any combination of + * the following: + * OCI_FETCHSTATEMENT_BY_ROW + * OCI_FETCHSTATEMENT_BY_COLUMN (default value) + * OCI_NUM + * OCI_ASSOC + *

+ * @return int the number of rows fetched or false in case of an error. + */ +function oci_fetch_all ($statement, array &$output, $skip = null, $maxrows = null, $flags = null) {} + +/** + * Frees all resources associated with statement or cursor + * @link http://php.net/manual/en/function.oci-free-statement.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_free_statement ($statement) {} + +/** + * Enables or disables internal debug output + * @link http://php.net/manual/en/function.oci-internal-debug.php + * @param onoff bool

+ * Set this to false to turn debug output off or true to turn it on. + *

+ * @return void + */ +function oci_internal_debug ($onoff) {} + +/** + * Returns the number of result columns in a statement + * @link http://php.net/manual/en/function.oci-num-fields.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return int the number of columns as an integer, or false on errors. + */ +function oci_num_fields ($statement) {} + +/** + * Prepares Oracle statement for execution + * @link http://php.net/manual/en/function.oci-parse.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param query string

+ * The SQL query. + *

+ * @return resource a statement handler on success, or false on error. + */ +function oci_parse ($connection, $query) {} + +/** + * Allocates and returns a new cursor (statement handle) + * @link http://php.net/manual/en/function.oci-new-cursor.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @return resource a new statement handle, or false on error. + */ +function oci_new_cursor ($connection) {} + +/** + * Returns field's value from the fetched row + * @link http://php.net/manual/en/function.oci-result.php + * @param statement resource

+ *

+ * @param field mixed

+ * Can be either use the column number (1-based) or the column name (in + * uppercase). + *

+ * @return mixed everything as strings except for abstract types (ROWIDs, LOBs and + * FILEs). Returns false on error. + */ +function oci_result ($statement, $field) {} + +/** + * Returns server version + * @link http://php.net/manual/en/function.oci-server-version.php + * @param connection resource

+ *

+ * @return string the version information as a string or false on error. + */ +function oci_server_version ($connection) {} + +/** + * Returns the type of an OCI statement + * @link http://php.net/manual/en/function.oci-statement-type.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return string the query type ofstatement as one of the + * following values: + * SELECT + * UPDATE + * DELETE + * INSERT + * CREATE + * DROP + * ALTER + * BEGIN + * DECLARE + * CALL (since PHP 5.2.1 and OCI8 + * 1.2.3) + * UNKNOWN + * Returns false on error. + */ +function oci_statement_type ($statement) {} + +/** + * Returns number of rows affected during statement execution + * @link http://php.net/manual/en/function.oci-num-rows.php + * @param statement resource

+ * A valid OCI statement identifier. + *

+ * @return int the number of rows affected as an integer, or false on errors. + */ +function oci_num_rows ($statement) {} + +/** + * Closes Oracle connection + * @link http://php.net/manual/en/function.oci-close.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_close ($connection) {} + +/** + * Establishes a connection to the Oracle server + * @link http://php.net/manual/en/function.oci-connect.php + * @param username string

+ * The Oracle user name. + *

+ * @param password string

+ * The password for username. + *

+ * @param db string[optional]

+ * This optional parameter can either contain the name of the local + * Oracle instance or the name of the entry in + * tnsnames.ora. + *

+ *

+ * If the not specified, PHP uses environment variables + * ORACLE_SID and TWO_TASK to + * determine the name of local Oracle instance and location of + * tnsnames.ora accordingly. + *

+ * @param charset string[optional] &oci.charset; + * @param session_mode int[optional]

+ * This parameter is available since version 1.1 and accepts the + * following values: OCI_DEFAULT, + * OCI_SYSOPER and OCI_SYSDBA. + * If either OCI_SYSOPER or + * OCI_SYSDBA were specified, this function will try + * to establish privileged connection using external credentials. + * Privileged connections are disabled by default. To enable them you + * need to set oci8.privileged_connect + * to On. + *

+ * @return resource a connection identifier or false on error. + */ +function oci_connect ($username, $password, $db = null, $charset = null, $session_mode = null) {} + +/** + * Establishes a new connection to the Oracle server + * @link http://php.net/manual/en/function.oci-new-connect.php + * @param username string

+ * The Oracle user name. + *

+ * @param password string

+ * The password for username. + *

+ * @param db string[optional]

+ * This optional parameter can either contain the name of the local + * Oracle instance or the name of the entry in + * tnsnames.ora. + *

+ *

+ * If the not specified, PHP uses environment variables + * ORACLE_SID and TWO_TASK to + * determine the name of local Oracle instance and location of + * tnsnames.ora accordingly. + *

+ * @param charset string[optional] &oci.charset; + * @param session_mode int[optional]

+ * This parameter is available since version 1.1 and accepts the + * following values: OCI_DEFAULT, + * OCI_SYSOPER and OCI_SYSDBA. + * If either OCI_SYSOPER or + * OCI_SYSDBA were specified, this function will try + * to establish privileged connection using external credentials. + * Privileged connections are disabled by default. To enable them you + * need to set oci8.privileged_connect + * to On. + *

+ * @return resource a connection identifier or false on error. + */ +function oci_new_connect ($username, $password, $db = null, $charset = null, $session_mode = null) {} + +/** + * Connect to an Oracle database using a persistent connection + * @link http://php.net/manual/en/function.oci-pconnect.php + * @param username string

+ * The Oracle user name. + *

+ * @param password string

+ * The password for username. + *

+ * @param db string[optional]

+ * This optional parameter can either contain the name of the local + * Oracle instance or the name of the entry in + * tnsnames.ora. + *

+ *

+ * If the not specified, PHP uses environment variables + * ORACLE_SID and TWO_TASK to + * determine the name of local Oracle instance and location of + * tnsnames.ora accordingly. + *

+ * @param charset string[optional] &oci.charset; + * @param session_mode int[optional]

+ * This parameter is available since version 1.1 and accepts the + * following values: OCI_DEFAULT, + * OCI_SYSOPER and OCI_SYSDBA. + * If either OCI_SYSOPER or + * OCI_SYSDBA were specified, this function will try + * to establish privileged connection using external credentials. + * Privileged connections are disabled by default. To enable them you + * need to set oci8.privileged_connect + * to On. + *

+ * @return resource a connection identifier or false on error. + */ +function oci_pconnect ($username, $password, $db = null, $charset = null, $session_mode = null) {} + +/** + * Returns the last error found + * @link http://php.net/manual/en/function.oci-error.php + * @param source resource[optional]

+ * For most errors, the parameter is the most appropriate resource + * handle. For connection errors with oci_connect, + * oci_new_connect or + * oci_pconnect do not pass a parameter. + *

+ * @return array If no error is found, oci_error + * returns false. oci_error returns the error as an + * associative array. In this array, code + * consists the oracle error code and message + * the oracle error string. + */ +function oci_error ($source = null) {} + +/** + * @param lob_descriptor + */ +function oci_free_descriptor ($lob_descriptor) {} + +/** + * @param lob_descriptor + * @param data + * @param offset[optional] + */ +function oci_lob_save ($lob_descriptor, $data, $offset) {} + +/** + * @param lob_descriptor + * @param filename + */ +function oci_lob_import ($lob_descriptor, $filename) {} + +/** + * @param lob_descriptor + */ +function oci_lob_size ($lob_descriptor) {} + +/** + * @param lob_descriptor + */ +function oci_lob_load ($lob_descriptor) {} + +/** + * @param lob_descriptor + * @param length + */ +function oci_lob_read ($lob_descriptor, $length) {} + +/** + * @param lob_descriptor + */ +function oci_lob_eof ($lob_descriptor) {} + +/** + * @param lob_descriptor + */ +function oci_lob_tell ($lob_descriptor) {} + +/** + * @param lob_descriptor + * @param length[optional] + */ +function oci_lob_truncate ($lob_descriptor, $length) {} + +/** + * @param lob_descriptor + * @param offset[optional] + * @param length[optional] + */ +function oci_lob_erase ($lob_descriptor, $offset, $length) {} + +/** + * @param lob_descriptor + * @param flag[optional] + */ +function oci_lob_flush ($lob_descriptor, $flag) {} + +/** + * @param lob_descriptor + * @param mode + */ +function ocisetbufferinglob ($lob_descriptor, $mode) {} + +/** + * @param lob_descriptor + */ +function ocigetbufferinglob ($lob_descriptor) {} + +/** + * Compares two LOB/FILE locators for equality + * @link http://php.net/manual/en/function.oci-lob-is-equal.php + * @param lob1 OCI_Lob

+ * A LOB identifier. + *

+ * @param lob2 OCI_Lob

+ * A LOB identifier. + *

+ * @return bool true if these objects are equal, false otherwise. + */ +function oci_lob_is_equal (OCI_Lob $lob1, OCI_Lob $lob2) {} + +/** + * @param lob_descriptor + */ +function oci_lob_rewind ($lob_descriptor) {} + +/** + * @param lob_descriptor + * @param string + * @param length[optional] + */ +function oci_lob_write ($lob_descriptor, $string, $length) {} + +/** + * @param lob_descriptor_to + * @param lob_descriptor_from + */ +function oci_lob_append ($lob_descriptor_to, $lob_descriptor_from) {} + +/** + * Copies large object + * @link http://php.net/manual/en/function.oci-lob-copy.php + * @param lob_to OCI-Lob

+ * The destination LOB. + *

+ * @param lob_from OCI_Lob

+ * The copied LOB. + *

+ * @param length int[optional]

+ * Indicates the length of data to be copied. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_lob_copy (OCI_Lob $lob_to, OCI_Lob $lob_from, $length = null) {} + +/** + * @param lob_descriptor + * @param filename + * @param start[optional] + * @param length[optional] + */ +function oci_lob_export ($lob_descriptor, $filename, $start, $length) {} + +/** + * @param lob_descriptor + * @param offset + * @param whence[optional] + */ +function oci_lob_seek ($lob_descriptor, $offset, $whence) {} + +/** + * Commits outstanding statements + * @link http://php.net/manual/en/function.oci-commit.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_commit ($connection) {} + +/** + * Rolls back outstanding transaction + * @link http://php.net/manual/en/function.oci-rollback.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_rollback ($connection) {} + +/** + * Initializes a new empty LOB or FILE descriptor + * @link http://php.net/manual/en/function.oci-new-descriptor.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param type int[optional]

+ * Valid values for type are: + * OCI_D_FILE, OCI_D_LOB and + * OCI_D_ROWID. + *

+ * @return OCI-Lob a new LOB or FILE descriptor on success, false on error. + */ +function oci_new_descriptor ($connection, $type = null) {} + +/** + * Sets number of rows to be prefetched + * @link http://php.net/manual/en/function.oci-set-prefetch.php + * @param statement resource

+ *

+ * @param rows int

+ *

+ * @return bool Returns true on success or false on failure. + */ +function oci_set_prefetch ($statement, $rows) {} + +/** + * Changes password of Oracle's user + * @link http://php.net/manual/en/function.oci-password-change.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param username string

+ * The Oracle user name. + *

+ * @param old_password string

+ * The old password. + *

+ * @param new_password string

+ * The new password to be set. + *

+ * @return bool Returns true on success or false on failure. + */ +function oci_password_change ($connection, $username, $old_password, $new_password) {} + +/** + * @param collection + */ +function oci_free_collection ($collection) {} + +/** + * @param collection + * @param value + */ +function oci_collection_append ($collection, $value) {} + +/** + * @param collection + * @param index + */ +function oci_collection_element_get ($collection, $index) {} + +/** + * @param collection + * @param index + * @param value + */ +function oci_collection_element_assign ($collection, $index, $value) {} + +/** + * @param collection_to + * @param collection_from + */ +function oci_collection_assign ($collection_to, $collection_from) {} + +/** + * @param collection + */ +function oci_collection_size ($collection) {} + +/** + * @param collection + */ +function oci_collection_max ($collection) {} + +/** + * @param collection + * @param number + */ +function oci_collection_trim ($collection, $number) {} + +/** + * Allocates new collection object + * @link http://php.net/manual/en/function.oci-new-collection.php + * @param connection resource

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param tdo string

+ * Should be a valid named type (uppercase). + *

+ * @param schema string[optional]

+ * Should point to the scheme, where the named type was created. The name + * of the current user is the default value. + *

+ * @return OCI-Collection a new OCICollection object or false on + * error. + */ +function oci_new_collection ($connection, $tdo, $schema = null) {} + +/** + * @param statement_resource + */ +function oci_free_cursor ($statement_resource) {} + +/** + * &Alias; oci_free_statement + * @link http://php.net/manual/en/function.ocifreecursor.php + * @param statement_resource + */ +function ocifreecursor ($statement_resource) {} + +/** + * &Alias; oci_bind_by_name + * @link http://php.net/manual/en/function.ocibindbyname.php + * @param statement_resource + * @param column_name + * @param variable + * @param maximum_length[optional] + * @param type[optional] + */ +function ocibindbyname ($statement_resource, $column_name, &$variable, $maximum_length, $type) {} + +/** + * &Alias; oci_define_by_name + * @link http://php.net/manual/en/function.ocidefinebyname.php + * @param statement_resource + * @param column_name + * @param variable + * @param type[optional] + */ +function ocidefinebyname ($statement_resource, $column_name, &$variable, $type) {} + +/** + * &Alias; oci_field_is_null + * @link http://php.net/manual/en/function.ocicolumnisnull.php + * @param statement_resource + * @param column_number_or_name + */ +function ocicolumnisnull ($statement_resource, $column_number_or_name) {} + +/** + * &Alias; oci_field_name + * @link http://php.net/manual/en/function.ocicolumnname.php + * @param statement_resource + * @param column_number + */ +function ocicolumnname ($statement_resource, $column_number) {} + +/** + * &Alias; oci_field_size + * @link http://php.net/manual/en/function.ocicolumnsize.php + * @param statement_resource + * @param column_number_or_name + */ +function ocicolumnsize ($statement_resource, $column_number_or_name) {} + +/** + * &Alias; oci_field_scale + * @link http://php.net/manual/en/function.ocicolumnscale.php + * @param statement_resource + * @param column_number + */ +function ocicolumnscale ($statement_resource, $column_number) {} + +/** + * &Alias; oci_field_precision + * @link http://php.net/manual/en/function.ocicolumnprecision.php + * @param statement_resource + * @param column_number + */ +function ocicolumnprecision ($statement_resource, $column_number) {} + +/** + * &Alias; oci_field_type + * @link http://php.net/manual/en/function.ocicolumntype.php + * @param statement_resource + * @param column_number + */ +function ocicolumntype ($statement_resource, $column_number) {} + +/** + * &Alias; oci_field_type_raw + * @link http://php.net/manual/en/function.ocicolumntyperaw.php + * @param statement_resource + * @param column_number + */ +function ocicolumntyperaw ($statement_resource, $column_number) {} + +/** + * &Alias; oci_execute + * @link http://php.net/manual/en/function.ociexecute.php + * @param statement_resource + * @param mode[optional] + */ +function ociexecute ($statement_resource, $mode) {} + +/** + * &Alias; oci_cancel + * @link http://php.net/manual/en/function.ocicancel.php + * @param statement_resource + */ +function ocicancel ($statement_resource) {} + +/** + * &Alias; oci_fetch + * @link http://php.net/manual/en/function.ocifetch.php + * @param statement_resource + */ +function ocifetch ($statement_resource) {} + +/** + * &Alias; oci_fetch_all + * @link http://php.net/manual/en/function.ocifetchstatement.php + * @param statement_resource + * @param output + * @param skip[optional] + * @param maximum_rows[optional] + * @param flags[optional] + */ +function ocifetchstatement ($statement_resource, &$output, $skip, $maximum_rows, $flags) {} + +/** + * &Alias; oci_free_statement + * @link http://php.net/manual/en/function.ocifreestatement.php + * @param statement_resource + */ +function ocifreestatement ($statement_resource) {} + +/** + * &Alias; oci_internal_debug + * @link http://php.net/manual/en/function.ociinternaldebug.php + * @param mode + */ +function ociinternaldebug ($mode) {} + +/** + * &Alias; oci_num_fields + * @link http://php.net/manual/en/function.ocinumcols.php + * @param statement_resource + */ +function ocinumcols ($statement_resource) {} + +/** + * &Alias; oci_parse + * @link http://php.net/manual/en/function.ociparse.php + * @param connection_resource + * @param sql_text + */ +function ociparse ($connection_resource, $sql_text) {} + +/** + * &Alias; oci_new_cursor + * @link http://php.net/manual/en/function.ocinewcursor.php + * @param connection_resource + */ +function ocinewcursor ($connection_resource) {} + +/** + * &Alias; oci_result + * @link http://php.net/manual/en/function.ociresult.php + * @param statement_resource + * @param column_number_or_name + */ +function ociresult ($statement_resource, $column_number_or_name) {} + +/** + * &Alias; oci_server_version + * @link http://php.net/manual/en/function.ociserverversion.php + * @param connection_resource + */ +function ociserverversion ($connection_resource) {} + +/** + * &Alias; oci_statement_type + * @link http://php.net/manual/en/function.ocistatementtype.php + * @param statement_resource + */ +function ocistatementtype ($statement_resource) {} + +/** + * &Alias; oci_num_rows + * @link http://php.net/manual/en/function.ocirowcount.php + * @param statement_resource + */ +function ocirowcount ($statement_resource) {} + +/** + * &Alias; oci_close + * @link http://php.net/manual/en/function.ocilogoff.php + * @param connection_resource + */ +function ocilogoff ($connection_resource) {} + +/** + * &Alias; oci_connect + * @link http://php.net/manual/en/function.ocilogon.php + * @param username + * @param password + * @param connection_string[optional] + * @param character_set[optional] + * @param session_mode[optional] + */ +function ocilogon ($username, $password, $connection_string, $character_set, $session_mode) {} + +/** + * &Alias; oci_new_connect + * @link http://php.net/manual/en/function.ocinlogon.php + * @param username + * @param password + * @param connection_string[optional] + * @param character_set[optional] + * @param session_mode[optional] + */ +function ocinlogon ($username, $password, $connection_string, $character_set, $session_mode) {} + +/** + * &Alias; oci_pconnect + * @link http://php.net/manual/en/function.ociplogon.php + * @param username + * @param password + * @param connection_string[optional] + * @param character_set[optional] + * @param session_mode[optional] + */ +function ociplogon ($username, $password, $connection_string, $character_set, $session_mode) {} + +/** + * &Alias; oci_error + * @link http://php.net/manual/en/function.ocierror.php + * @param connection_or_statement_resource[optional] + */ +function ocierror ($connection_or_statement_resource) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocifreedesc.php + * @param lob_descriptor + */ +function ocifreedesc ($lob_descriptor) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocisavelob.php + * @param lob_descriptor + * @param data + * @param offset[optional] + */ +function ocisavelob ($lob_descriptor, $data, $offset) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocisavelobfile.php + * @param lob_descriptor + * @param filename + */ +function ocisavelobfile ($lob_descriptor, $filename) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ociwritelobtofile.php + * @param lob_descriptor + * @param filename + * @param start[optional] + * @param length[optional] + */ +function ociwritelobtofile ($lob_descriptor, $filename, $start, $length) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ociloadlob.php + * @param lob_descriptor + */ +function ociloadlob ($lob_descriptor) {} + +/** + * &Alias; oci_commit + * @link http://php.net/manual/en/function.ocicommit.php + * @param connection_resource + */ +function ocicommit ($connection_resource) {} + +/** + * &Alias; oci_rollback + * @link http://php.net/manual/en/function.ocirollback.php + * @param connection_resource + */ +function ocirollback ($connection_resource) {} + +/** + * &Alias; oci_new_descriptor + * @link http://php.net/manual/en/function.ocinewdescriptor.php + * @param connection_resource + * @param type[optional] + */ +function ocinewdescriptor ($connection_resource, $type) {} + +/** + * &Alias; oci_set_prefetch + * @link http://php.net/manual/en/function.ocisetprefetch.php + * @param statement_resource + * @param number_of_rows + */ +function ocisetprefetch ($statement_resource, $number_of_rows) {} + +/** + * @param connection_resource_or_connection_string + * @param username + * @param old_password + * @param new_password + */ +function ocipasswordchange ($connection_resource_or_connection_string, $username, $old_password, $new_password) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocifreecollection.php + * @param collection + */ +function ocifreecollection ($collection) {} + +/** + * &Alias; oci_new_collection + * @link http://php.net/manual/en/function.ocinewcollection.php + * @param connection_resource + * @param type_name + * @param schema_name[optional] + */ +function ocinewcollection ($connection_resource, $type_name, $schema_name) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicollappend.php + * @param collection + * @param value + */ +function ocicollappend ($collection, $value) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicollgetelem.php + * @param collection + * @param index + */ +function ocicollgetelem ($collection, $index) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicollassignelem.php + * @param collection + * @param index + * @param value + */ +function ocicollassignelem ($collection, $index, $value) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicollsize.php + * @param collection + */ +function ocicollsize ($collection) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicollmax.php + * @param collection + */ +function ocicollmax ($collection) {} + +/** + * &Alias; + * @link http://php.net/manual/en/function.ocicolltrim.php + * @param collection + * @param number + */ +function ocicolltrim ($collection, $number) {} + + +/** + * Statement execution mode. Statement is not committed + * automatically when using this mode. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DEFAULT', 0); + +/** + * Used with oci_connect to connect as SYSOPER + * using external credentials (oci8.privileged_connect + * should be enabled for this). + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_SYSOPER', 4); + +/** + * Used with oci_connect to connect as SYSDBA + * using external credentials (oci8.privileged_connect + * should be enabled for this). + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_SYSDBA', 2); +define ('OCI_CRED_EXT', -2147483648); + +/** + * Statement execution mode. Use this mode if you don't want + * to execute the query, but get the select-list's description. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DESCRIBE_ONLY', 16); + +/** + * Statement execution mode. Statement is automatically committed after + * oci_execute call. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_COMMIT_ON_SUCCESS', 32); + +/** + * Statement fetch mode. Used when the application knows + * in advance exactly how many rows it will be fetching. + * This mode turns prefetching off for Oracle release 8 + * or later mode. Cursor is cancelled after the desired + * rows are fetched and may result in reduced server-side + * resource usage. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_EXACT_FETCH', 2); +define ('OCI_SEEK_SET', 0); +define ('OCI_SEEK_CUR', 1); +define ('OCI_SEEK_END', 2); + +/** + * Used with to free buffers used. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_LOB_BUFFER_FREE', 1); + +/** + * The same as OCI_B_BFILE. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BFILEE', 114); + +/** + * The same as OCI_B_CFILEE. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_CFILEE', 115); + +/** + * The same as OCI_B_CLOB. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_CLOB', 112); + +/** + * The same as OCI_B_BLOB. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BLOB', 113); + +/** + * The same as OCI_B_ROWID. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_RDD', 104); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * INTEGER. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_INT', 3); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * NUMBER. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_NUM', 2); +define ('SQLT_RSET', 116); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * CHAR. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_AFC', 96); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * VARCHAR2. + * Also used with oci_bind_by_name. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_CHR', 1); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * VARCHAR. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_VCS', 9); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * CHARZ. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_AVC', 97); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * STRING. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_STR', 5); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * LONG VARCHAR. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_LVC', 94); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * FLOAT. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_FLT', 4); +define ('SQLT_UIN', 68); + +/** + * Used with oci_bind_by_name to bind LONG values. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_LNG', 8); + +/** + * Used with oci_bind_by_name to bind LONG RAW values. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_LBI', 24); + +/** + * Used with oci_bind_by_name to bind RAW values. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BIN', 23); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * LONG. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_ODT', 156); +define ('SQLT_BDOUBLE', 22); +define ('SQLT_BFLOAT', 21); + +/** + * Used with oci_bind_by_name when + * binding named data types. Note: in PHP < 5.0 it was called + * OCI_B_SQLT_NTY. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_NTY', 108); + +/** + * The same as OCI_B_NTY. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_NTY', 108); +define ('OCI_SYSDATE', "SYSDATE"); + +/** + * Used with oci_bind_by_name when + * binding BFILEs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_BFILE', 114); + +/** + * Used with oci_bind_by_name when + * binding CFILEs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_CFILEE', 115); + +/** + * Used with oci_bind_by_name when + * binding CLOBs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_CLOB', 112); + +/** + * Used with oci_bind_by_name when + * binding BLOBs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_BLOB', 113); + +/** + * Used with oci_bind_by_name when + * binding ROWIDs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_ROWID', 104); + +/** + * Used with oci_bind_by_name when + * binding cursors, previously allocated with oci_new_descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_CURSOR', 116); +define ('OCI_B_BIN', 23); +define ('OCI_B_INT', 3); +define ('OCI_B_NUM', 2); + +/** + * Default mode of oci_fetch_all. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_FETCHSTATEMENT_BY_COLUMN', 16); + +/** + * Alternative mode of oci_fetch_all. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_FETCHSTATEMENT_BY_ROW', 32); + +/** + * Used with oci_fetch_all and + * oci_fetch_array to get an associative + * array as a result. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_ASSOC', 1); + +/** + * Used with oci_fetch_all and + * oci_fetch_array to get an enumerated + * array as a result. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_NUM', 2); + +/** + * Used with oci_fetch_all and + * oci_fetch_array to get an array with + * both associative and number indices. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_BOTH', 3); + +/** + * Used with oci_fetch_array to get + * empty array elements if field's value is &null;. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_RETURN_NULLS', 4); + +/** + * Used with oci_fetch_array to get + * value of LOB instead of the descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_RETURN_LOBS', 8); + +/** + * This flag tells oci_new_descriptor to + * initialize new FILE descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DTYPE_FILE', 56); + +/** + * This flag tells oci_new_descriptor to + * initialize new LOB descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DTYPE_LOB', 50); + +/** + * This flag tells oci_new_descriptor to + * initialize new ROWID descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DTYPE_ROWID', 54); + +/** + * The same as OCI_DTYPE_FILE. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_D_FILE', 56); + +/** + * The same as OCI_DTYPE_LOB. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_D_LOB', 50); + +/** + * The same as OCI_DTYPE_ROWID. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_D_ROWID', 54); + +/** + * Used with to indicate + * explicilty that temporary CLOB should be created. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_TEMP_CLOB', 2); + +/** + * Used with to indicate + * explicilty that temporary BLOB should be created. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_TEMP_BLOB', 1); + +// End of oci8 v.1.3.4 +?> diff --git a/res/php-5.3-core-api/odbc.php b/res/php-5.3-core-api/odbc.php new file mode 100644 index 0000000..cf0a64f --- /dev/null +++ b/res/php-5.3-core-api/odbc.php @@ -0,0 +1,996 @@ + + * If OnOff is true, auto-commit is enabled, if + * it is false auto-commit is disabled. + *

+ * @return mixed Without the OnOff parameter, this function returns + * auto-commit status for connection_id. Non-zero is + * returned if auto-commit is on, 0 if it is off, or false if an error + * occurs. + *

+ *

+ * If OnOff is set, this function returns true on + * success and false on failure. + * + * @jms-builtin + */ +function odbc_autocommit ($connection_id, $OnOff = null) {} + +/** + * Handling of binary column data + * @link http://www.php.net/manual/en/function.odbc-binmode.php + * @param result_id resource

+ * The result identifier. + *

+ *

+ * If result_id is 0, the + * settings apply as default for new results. + * Default for longreadlen is 4096 and + * mode defaults to + * ODBC_BINMODE_RETURN. Handling of binary long + * columns is also affected by odbc_longreadlen. + *

+ * @param mode int

+ * Possible values for mode are: + * ODBC_BINMODE_PASSTHRU: Passthru BINARY data + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_binmode ($result_id, $mode) {} + +/** + * Close an ODBC connection + * @link http://www.php.net/manual/en/function.odbc-close.php + * @param connection_id resource &odbc.connection.id; + * @return void + * + * @jms-builtin + */ +function odbc_close ($connection_id) {} + +/** + * Close all ODBC connections + * @link http://www.php.net/manual/en/function.odbc-close-all.php + * @return void + * + * @jms-builtin + */ +function odbc_close_all () {} + +/** + * Lists the column names in specified tables + * @link http://www.php.net/manual/en/function.odbc-columns.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string[optional]

+ * The qualifier. + *

+ * @param schema string[optional]

+ * The owner. + *

+ * @param table_name string[optional]

+ * The table name. + *

+ * @param column_name string[optional]

+ * The column name. + *

+ * @return resource an ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_SCHEM + * TABLE_NAME + * COLUMN_NAME + * DATA_TYPE + * TYPE_NAME + * PRECISION + * LENGTH + * SCALE + * RADIX + * NULLABLE + * REMARKS + *

+ *

+ * The result set is ordered by TABLE_QUALIFIER, TABLE_SCHEM and + * TABLE_NAME. + * + * @jms-builtin + */ +function odbc_columns ($connection_id, $qualifier = null, $schema = null, $table_name = null, $column_name = null) {} + +/** + * Commit an ODBC transaction + * @link http://www.php.net/manual/en/function.odbc-commit.php + * @param connection_id resource &odbc.connection.id; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_commit ($connection_id) {} + +/** + * Connect to a datasource + * @link http://www.php.net/manual/en/function.odbc-connect.php + * @param dsn string

+ * The database source name for the connection. Alternatively, a + * DNS-less connection string can be used. + *

+ * @param user string

+ * The username. + *

+ * @param password string

+ * The password. + *

+ * @param cursor_type int[optional]

+ * This sets the type of cursor to be used + * for this connection. This parameter is not normally needed, but + * can be useful for working around problems with some ODBC drivers. + *

+ * The following constants are defined for cursortype: + *

+ * SQL_CUR_USE_IF_NEEDED + * @return resource an ODBC connection id or 0 (false) on + * error. + * + * @jms-builtin + */ +function odbc_connect ($dsn, $user, $password, $cursor_type = null) {} + +/** + * Get cursorname + * @link http://www.php.net/manual/en/function.odbc-cursor.php + * @param result_id resource

+ * The result identifier. + *

+ * @return string the cursor name, as a string. + * + * @jms-builtin + */ +function odbc_cursor ($result_id) {} + +/** + * Returns information about a current connection + * @link http://www.php.net/manual/en/function.odbc-data-source.php + * @param connection_id resource &odbc.connection.id; + * @param fetch_type int

+ * The fetch_type can be one of two constant types: + * SQL_FETCH_FIRST, SQL_FETCH_NEXT. + * Use SQL_FETCH_FIRST the first time this function is + * called, thereafter use the SQL_FETCH_NEXT. + *

+ * @return array false on error, and an array upon success. + * + * @jms-builtin + */ +function odbc_data_source ($connection_id, $fetch_type) {} + +/** + * Execute a prepared statement + * @link http://www.php.net/manual/en/function.odbc-execute.php + * @param result_id resource

+ * The result id resource, from odbc_prepare. + *

+ * @param parameters_array array[optional]

+ * Parameters in parameter_array will be + * substituted for placeholders in the prepared statement in order. + * Elements of this array will be converted to strings by calling this + * function. + *

+ *

+ * Any parameters in parameter_array which + * start and end with single quotes will be taken as the name of a + * file to read and send to the database server as the data for the + * appropriate placeholder. + *

+ * If you wish to store a string which actually begins and ends with + * single quotes, you must add a space or other non-single-quote character + * to the beginning or end of the parameter, which will prevent the + * parameter from being taken as a file name. If this is not an option, + * then you must use another mechanism to store the string, such as + * executing the query directly with odbc_exec). + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_execute ($result_id, array $parameters_array = null) {} + +/** + * Get the last error code + * @link http://www.php.net/manual/en/function.odbc-error.php + * @param connection_id resource[optional] &odbc.connection.id; + * @return string If connection_id is specified, the last state + * of that connection is returned, else the last state of any connection + * is returned. + *

+ *

+ * This function returns meaningful value only if last odbc query failed + * (i.e. odbc_exec returned false). + * + * @jms-builtin + */ +function odbc_error ($connection_id = null) {} + +/** + * Get the last error message + * @link http://www.php.net/manual/en/function.odbc-errormsg.php + * @param connection_id resource[optional] &odbc.connection.id; + * @return string If connection_id is specified, the last state + * of that connection is returned, else the last state of any connection + * is returned. + *

+ *

+ * This function returns meaningful value only if last odbc query failed + * (i.e. odbc_exec returned false). + * + * @jms-builtin + */ +function odbc_errormsg ($connection_id = null) {} + +/** + * Prepare and execute a SQL statement + * @link http://www.php.net/manual/en/function.odbc-exec.php + * @param connection_id resource &odbc.connection.id; + * @param query_string string

+ * The SQL statement. + *

+ * @param flags int[optional]

+ * This parameter is currently not used. + *

+ * @return resource an ODBC result identifier if the SQL command was executed + * successfully, or false on error. + * + * @jms-builtin + */ +function odbc_exec ($connection_id, $query_string, $flags = null) {} + +/** + * Fetch a result row as an associative array + * @link http://www.php.net/manual/en/function.odbc-fetch-array.php + * @param result resource

+ * The result resource from odbc_exec. + *

+ * @param rownumber int[optional]

+ * Optionally choose which row number to retrieve. + *

+ * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. + * + * @jms-builtin + */ +function odbc_fetch_array ($result, $rownumber = null) {} + +/** + * Fetch a result row as an object + * @link http://www.php.net/manual/en/function.odbc-fetch-object.php + * @param result resource

+ * The result resource from odbc_exec. + *

+ * @param rownumber int[optional]

+ * Optionally choose which row number to retrieve. + *

+ * @return object an object that corresponds to the fetched row, or false if there + * are no more rows. + * + * @jms-builtin + */ +function odbc_fetch_object ($result, $rownumber = null) {} + +/** + * Fetch a row + * @link http://www.php.net/manual/en/function.odbc-fetch-row.php + * @param result_id resource

+ * The result identifier. + *

+ * @param row_number int[optional]

+ * If row_number is not specified, + * odbc_fetch_row will try to fetch the next row in + * the result set. Calls to odbc_fetch_row with and + * without row_number can be mixed. + *

+ *

+ * To step through the result more than once, you can call + * odbc_fetch_row with + * row_number 1, and then continue doing + * odbc_fetch_row without + * row_number to review the result. If a driver + * doesn't support fetching rows by number, the + * row_number parameter is ignored. + *

+ * @return bool true if there was a row, false otherwise. + * + * @jms-builtin + */ +function odbc_fetch_row ($result_id, $row_number = null) {} + +/** + * Fetch one result row into array + * @link http://www.php.net/manual/en/function.odbc-fetch-into.php + * @param result_id resource

+ * The result resource. + *

+ * @param result_array array

+ * The result array + * that can be of any type since it will be converted to type + * array. The array will contain the column values starting at array + * index 0. + *

+ * @param rownumber int[optional]

+ * The row number. + *

+ * @return int the number of columns in the result; + * false on error. + * + * @jms-builtin + */ +function odbc_fetch_into ($result_id, array &$result_array, $rownumber = null) {} + +/** + * Get the length (precision) of a field + * @link http://www.php.net/manual/en/function.odbc-field-len.php + * @param result_id resource

+ * The result identifier. + *

+ * @param field_number int

+ * The field number. Field numbering starts at 1. + *

+ * @return int the field name as a string, or false on error. + * + * @jms-builtin + */ +function odbc_field_len ($result_id, $field_number) {} + +/** + * Get the scale of a field + * @link http://www.php.net/manual/en/function.odbc-field-scale.php + * @param result_id resource

+ * The result identifier. + *

+ * @param field_number int

+ * The field number. Field numbering starts at 1. + *

+ * @return int the field scale as a integer, or false on error. + * + * @jms-builtin + */ +function odbc_field_scale ($result_id, $field_number) {} + +/** + * Get the columnname + * @link http://www.php.net/manual/en/function.odbc-field-name.php + * @param result_id resource

+ * The result identifier. + *

+ * @param field_number int

+ * The field number. Field numbering starts at 1. + *

+ * @return string the field name as a string, or false on error. + * + * @jms-builtin + */ +function odbc_field_name ($result_id, $field_number) {} + +/** + * Datatype of a field + * @link http://www.php.net/manual/en/function.odbc-field-type.php + * @param result_id resource

+ * The result identifier. + *

+ * @param field_number int

+ * The field number. Field numbering starts at 1. + *

+ * @return string the field type as a string, or false on error. + * + * @jms-builtin + */ +function odbc_field_type ($result_id, $field_number) {} + +/** + * Return column number + * @link http://www.php.net/manual/en/function.odbc-field-num.php + * @param result_id resource

+ * The result identifier. + *

+ * @param field_name string

+ * The field name. + *

+ * @return int the field number as a integer, or false on error. + * Field numbering starts at 1. + * + * @jms-builtin + */ +function odbc_field_num ($result_id, $field_name) {} + +/** + * Free resources associated with a result + * @link http://www.php.net/manual/en/function.odbc-free-result.php + * @param result_id resource

+ * The result identifier. + *

+ * @return bool Always returns true. + * + * @jms-builtin + */ +function odbc_free_result ($result_id) {} + +/** + * Retrieves information about data types supported by the data source + * @link http://www.php.net/manual/en/function.odbc-gettypeinfo.php + * @param connection_id resource &odbc.connection.id; + * @param data_type int[optional]

+ * The data type, which can be used to restrict the information to a + * single data type. + *

+ * @return resource an ODBC result identifier or + * false on failure. + *

+ *

+ * The result set has the following columns: + * TYPE_NAME + * DATA_TYPE + * PRECISION + * LITERAL_PREFIX + * LITERAL_SUFFIX + * CREATE_PARAMS + * NULLABLE + * CASE_SENSITIVE + * SEARCHABLE + * UNSIGNED_ATTRIBUTE + * MONEY + * AUTO_INCREMENT + * LOCAL_TYPE_NAME + * MINIMUM_SCALE + * MAXIMUM_SCALE + *

+ *

+ * The result set is ordered by DATA_TYPE and TYPE_NAME. + * + * @jms-builtin + */ +function odbc_gettypeinfo ($connection_id, $data_type = null) {} + +/** + * Handling of LONG columns + * @link http://www.php.net/manual/en/function.odbc-longreadlen.php + * @param result_id resource

+ * The result identifier. + *

+ * @param length int

+ * The number of bytes returned to PHP is controlled by the parameter + * length. If it is set to 0, Long column data is passed through to the + * client. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_longreadlen ($result_id, $length) {} + +/** + * Checks if multiple results are available + * @link http://www.php.net/manual/en/function.odbc-next-result.php + * @param result_id resource

+ * The result identifier. + *

+ * @return bool true if there are more result sets, false otherwise. + * + * @jms-builtin + */ +function odbc_next_result ($result_id) {} + +/** + * Number of columns in a result + * @link http://www.php.net/manual/en/function.odbc-num-fields.php + * @param result_id resource

+ * The result identifier returned by odbc_exec. + *

+ * @return int the number of fields, or -1 on error. + * + * @jms-builtin + */ +function odbc_num_fields ($result_id) {} + +/** + * Number of rows in a result + * @link http://www.php.net/manual/en/function.odbc-num-rows.php + * @param result_id resource

+ * The result identifier returned by odbc_exec. + *

+ * @return int the number of rows in an ODBC result. + * This function will return -1 on error. + * + * @jms-builtin + */ +function odbc_num_rows ($result_id) {} + +/** + * Open a persistent database connection + * @link http://www.php.net/manual/en/function.odbc-pconnect.php + * @param dsn string + * @param user string + * @param password string + * @param cursor_type int[optional] + * @return resource an ODBC connection id or 0 (false) on + * error. + * + * @jms-builtin + */ +function odbc_pconnect ($dsn, $user, $password, $cursor_type = null) {} + +/** + * Prepares a statement for execution + * @link http://www.php.net/manual/en/function.odbc-prepare.php + * @param connection_id resource &odbc.connection.id; + * @param query_string string

+ * The query string statement being prepared. + *

+ * @return resource an ODBC result identifier if the SQL command was prepared + * successfully. Returns false on error. + * + * @jms-builtin + */ +function odbc_prepare ($connection_id, $query_string) {} + +/** + * Get result data + * @link http://www.php.net/manual/en/function.odbc-result.php + * @param result_id resource

+ * The ODBC resource. + *

+ * @param field mixed

+ * The field name being retrieved. It can either be an integer containing + * the column number of the field you want; or it can be a string + * containing the name of the field. + *

+ * @return mixed the string contents of the field, false on error, &null; for + * NULL data, or true for binary data. + * + * @jms-builtin + */ +function odbc_result ($result_id, $field) {} + +/** + * Print result as HTML table + * @link http://www.php.net/manual/en/function.odbc-result-all.php + * @param result_id resource

+ * The result identifier. + *

+ * @param format string[optional]

+ * Additional overall table formatting. + *

+ * @return int the number of rows in the result or false on error. + * + * @jms-builtin + */ +function odbc_result_all ($result_id, $format = null) {} + +/** + * Rollback a transaction + * @link http://www.php.net/manual/en/function.odbc-rollback.php + * @param connection_id resource &odbc.connection.id; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_rollback ($connection_id) {} + +/** + * Adjust ODBC settings + * @link http://www.php.net/manual/en/function.odbc-setoption.php + * @param id resource

+ * Is a connection id or result id on which to change the settings. + * For SQLSetConnectOption(), this is a connection id. + * For SQLSetStmtOption(), this is a result id. + *

+ * @param function int

+ * Is the ODBC function to use. The value should be + * 1 for SQLSetConnectOption() and + * 2 for SQLSetStmtOption(). + *

+ * @param option int

+ * The option to set. + *

+ * @param param int

+ * The value for the given option. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function odbc_setoption ($id, $function, $option, $param) {} + +/** + * Retrieves special columns + * @link http://www.php.net/manual/en/function.odbc-specialcolumns.php + * @param connection_id resource &odbc.connection.id; + * @param type int When the type argument is SQL_BEST_ROWID, + * odbc_specialcolumns returns the + * column or columns that uniquely identify each row in the table. + * When the type argument is SQL_ROWVER, + * odbc_specialcolumns returns the column or columns in the + * specified table, if any, that are automatically updated by the data source + * when any value in the row is updated by any transaction. + * @param qualifier string

+ * The qualifier. + *

+ * @param owner string

+ * The owner. + *

+ * @param table string

+ * The table. + *

+ * @param scope int

+ * The scope, which orders the result set. + *

+ * @param nullable int

+ * The nullable option. + *

+ * @return resource an ODBC result identifier or false on + * failure. + *

+ *

+ * The result set has the following columns: + * SCOPE + * COLUMN_NAME + * DATA_TYPE + * TYPE_NAME + * PRECISION + * LENGTH + * SCALE + * PSEUDO_COLUMN + * + * @jms-builtin + */ +function odbc_specialcolumns ($connection_id, $type, $qualifier, $owner, $table, $scope, $nullable) {} + +/** + * Retrieve statistics about a table + * @link http://www.php.net/manual/en/function.odbc-statistics.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string

+ * The qualifier. + *

+ * @param owner string

+ * The owner. + *

+ * @param table_name string

+ * The table name. + *

+ * @param unique int

+ * The unique attribute. + *

+ * @param accuracy int

+ * The accuracy. + *

+ * @return resource an ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * NON_UNIQUE + * INDEX_QUALIFIER + * INDEX_NAME + * TYPE + * SEQ_IN_INDEX + * COLUMN_NAME + * COLLATION + * CARDINALITY + * PAGES + * FILTER_CONDITION + * + * @jms-builtin + */ +function odbc_statistics ($connection_id, $qualifier, $owner, $table_name, $unique, $accuracy) {} + +/** + * Get the list of table names stored in a specific data source + * @link http://www.php.net/manual/en/function.odbc-tables.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string[optional]

+ * The qualifier. + *

+ * @param owner string[optional]

+ * The owner. Accepts search patterns ('%' to match zero or more + * characters and '_' to match a single character). + *

+ * @param name string[optional]

+ * The name. Accepts search patterns ('%' to match zero or more + * characters and '_' to match a single character). + *

+ * @param types string[optional]

+ * If table_type is not an empty string, it + * must contain a list of comma-separated values for the types of + * interest; each value may be enclosed in single quotes (') or + * unquoted. For example, "'TABLE','VIEW'" or "TABLE, VIEW". If the + * data source does not support a specified table type, + * odbc_tables does not return any results for + * that type. + *

+ * @return resource an ODBC result identifier containing the information + * &return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * TABLE_TYPE + * REMARKS + * + * @jms-builtin + */ +function odbc_tables ($connection_id, $qualifier = null, $owner = null, $name = null, $types = null) {} + +/** + * Gets the primary keys for a table + * @link http://www.php.net/manual/en/function.odbc-primarykeys.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string

+ *

+ * @param owner string

+ *

+ * @param table string

+ *

+ * @return resource an ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * COLUMN_NAME + * KEY_SEQ + * PK_NAME + * + * @jms-builtin + */ +function odbc_primarykeys ($connection_id, $qualifier, $owner, $table) {} + +/** + * Lists columns and associated privileges for the given table + * @link http://www.php.net/manual/en/function.odbc-columnprivileges.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string

+ * The qualifier. + *

+ * @param owner string

+ * The owner. + *

+ * @param table_name string

+ * The table name. + *

+ * @param column_name string

+ * The column_name argument accepts search + * patterns ('%' to match zero or more characters and '_' to match a + * single character). + *

+ * @return resource an ODBC result identifier&return.falseforfailure;. + * This result identifier can be used to fetch a list of columns and + * associated privileges. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * GRANTOR + * GRANTEE + * PRIVILEGE + * IS_GRANTABLE + *

+ *

+ * The result set is ordered by TABLE_QUALIFIER, TABLE_OWNER and + * TABLE_NAME. + * + * @jms-builtin + */ +function odbc_columnprivileges ($connection_id, $qualifier, $owner, $table_name, $column_name) {} + +/** + * Lists tables and the privileges associated with each table + * @link http://www.php.net/manual/en/function.odbc-tableprivileges.php + * @param connection_id resource &odbc.connection.id; + * @param qualifier string

+ * The qualifier. + *

+ * @param owner string

+ * The owner. Accepts the following search patterns: + * ('%' to match zero or more characters and '_' to match a single character) + *

+ * @param name string

+ * The name. Accepts the following search patterns: + * ('%' to match zero or more characters and '_' to match a single character) + *

+ * @return resource An ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * GRANTOR + * GRANTEE + * PRIVILEGE + * IS_GRANTABLE + * + * @jms-builtin + */ +function odbc_tableprivileges ($connection_id, $qualifier, $owner, $name) {} + +/** + * Retrieves a list of foreign keys + * @link http://www.php.net/manual/en/function.odbc-foreignkeys.php + * @param connection_id resource &odbc.connection.id; + * @param pk_qualifier string

+ * The primary key qualifier. + *

+ * @param pk_owner string

+ * The primary key owner. + *

+ * @param pk_table string

+ * The primary key table. + *

+ * @param fk_qualifier string

+ * The foreign key qualifier. + *

+ * @param fk_owner string

+ * The foreign key owner. + *

+ * @param fk_table string

+ * The foreign key table. + *

+ * @return resource an ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * PKTABLE_QUALIFIER + * PKTABLE_OWNER + * PKTABLE_NAME + * PKCOLUMN_NAME + * FKTABLE_QUALIFIER + * FKTABLE_OWNER + * FKTABLE_NAME + * FKCOLUMN_NAME + * KEY_SEQ + * UPDATE_RULE + * DELETE_RULE + * FK_NAME + * PK_NAME + *

+ * If pk_table contains a table name, + * odbc_foreignkeys returns a result set + * containing the primary key of the specified table and all of the + * foreign keys that refer to it. + * If fk_table contains a table name, + * odbc_foreignkeys returns a result set + * containing all of the foreign keys in the specified table and the + * primary keys (in other tables) to which they refer. + * If both pk_table and + * fk_table contain table names, + * odbc_foreignkeys returns the foreign keys in + * the table specified in fk_table that refer + * to the primary key of the table specified in + * pk_table + * + * @jms-builtin + */ +function odbc_foreignkeys ($connection_id, $pk_qualifier, $pk_owner, $pk_table, $fk_qualifier, $fk_owner, $fk_table) {} + +/** + * Get the list of procedures stored in a specific data source + * @link http://www.php.net/manual/en/function.odbc-procedures.php + * @param connection_id resource &odbc.connection.id; + * @return resource an ODBC + * result identifier containing the information&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * PROCEDURE_QUALIFIER + * PROCEDURE_OWNER + * PROCEDURE_NAME + * NUM_INPUT_PARAMS + * NUM_OUTPUT_PARAMS + * NUM_RESULT_SETS + * REMARKS + * PROCEDURE_TYPE + * + * @jms-builtin + */ +function odbc_procedures ($connection_id) {} + +/** + * Retrieve information about parameters to procedures + * @link http://www.php.net/manual/en/function.odbc-procedurecolumns.php + * @param connection_id resource &odbc.connection.id; + * @return resource the list of input and output parameters, as well as the + * columns that make up the result set for the specified procedures. + * Returns an ODBC result identifier&return.falseforfailure;. + *

+ *

+ * The result set has the following columns: + * PROCEDURE_QUALIFIER + * PROCEDURE_OWNER + * PROCEDURE_NAME + * COLUMN_NAME + * COLUMN_TYPE + * DATA_TYPE + * TYPE_NAME + * PRECISION + * LENGTH + * SCALE + * RADIX + * NULLABLE + * REMARKS + * + * @jms-builtin + */ +function odbc_procedurecolumns ($connection_id) {} + +/** + * &Alias; odbc_exec + * @link http://www.php.net/manual/en/function.odbc-do.php + * + * @jms-builtin + */ +function odbc_do () {} + +/** + * &Alias; odbc_field_len + * @link http://www.php.net/manual/en/function.odbc-field-precision.php + * + * @jms-builtin + */ +function odbc_field_precision () {} + +define ('ODBC_TYPE', "Win32"); +define ('ODBC_BINMODE_PASSTHRU', 0); +define ('ODBC_BINMODE_RETURN', 1); +define ('ODBC_BINMODE_CONVERT', 2); +define ('SQL_ODBC_CURSORS', 110); +define ('SQL_CUR_USE_DRIVER', 2); +define ('SQL_CUR_USE_IF_NEEDED', 0); +define ('SQL_CUR_USE_ODBC', 1); +define ('SQL_CONCURRENCY', 7); +define ('SQL_CONCUR_READ_ONLY', 1); +define ('SQL_CONCUR_LOCK', 2); +define ('SQL_CONCUR_ROWVER', 3); +define ('SQL_CONCUR_VALUES', 4); +define ('SQL_CURSOR_TYPE', 6); +define ('SQL_CURSOR_FORWARD_ONLY', 0); +define ('SQL_CURSOR_KEYSET_DRIVEN', 1); +define ('SQL_CURSOR_DYNAMIC', 2); +define ('SQL_CURSOR_STATIC', 3); +define ('SQL_KEYSET_SIZE', 8); +define ('SQL_FETCH_FIRST', 2); +define ('SQL_FETCH_NEXT', 1); +define ('SQL_CHAR', 1); +define ('SQL_VARCHAR', 12); +define ('SQL_LONGVARCHAR', -1); +define ('SQL_DECIMAL', 3); +define ('SQL_NUMERIC', 2); +define ('SQL_BIT', -7); +define ('SQL_TINYINT', -6); +define ('SQL_SMALLINT', 5); +define ('SQL_INTEGER', 4); +define ('SQL_BIGINT', -5); +define ('SQL_REAL', 7); +define ('SQL_FLOAT', 6); +define ('SQL_DOUBLE', 8); +define ('SQL_BINARY', -2); +define ('SQL_VARBINARY', -3); +define ('SQL_LONGVARBINARY', -4); +define ('SQL_DATE', 9); +define ('SQL_TIME', 10); +define ('SQL_TIMESTAMP', 11); + +// End of odbc v.1.0 +?> diff --git a/res/php-5.3-core-api/openssl.php b/res/php-5.3-core-api/openssl.php new file mode 100644 index 0000000..c57fd20 --- /dev/null +++ b/res/php-5.3-core-api/openssl.php @@ -0,0 +1,1085 @@ + + * Resource holding the key. + *

+ * @return void + * + * @jms-builtin + */ +function openssl_pkey_free ($key) {} + +/** + * Generates a new private key + * @link http://www.php.net/manual/en/function.openssl-pkey-new.php + * @param configargs array[optional]

+ * You can finetune the key generation (such as specifying the number of + * bits) using configargs. See + * openssl_csr_new for more information about + * configargs. + *

+ * @return resource a resource identifier for the pkey on success, or false on + * error. + * + * @jms-builtin + */ +function openssl_pkey_new (array $configargs = null) {} + +/** + * Gets an exportable representation of a key into a string + * @link http://www.php.net/manual/en/function.openssl-pkey-export.php + * @param key mixed

+ *

+ * @param out string

+ *

+ * @param passphrase string[optional]

+ * The key is optionally protected by passphrase. + *

+ * @param configargs array[optional]

+ * configargs can be used to fine-tune the export + * process by specifying and/or overriding options for the openssl + * configuration file. See openssl_csr_new for more + * information about configargs. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkey_export ($key, &$out, $passphrase = null, array $configargs = null) {} + +/** + * Gets an exportable representation of a key into a file + * @link http://www.php.net/manual/en/function.openssl-pkey-export-to-file.php + * @param key mixed

+ *

+ * @param outfilename string

+ * Path to the output file. + *

+ * @param passphrase string[optional]

+ * The key can be optionally protected by a + * passphrase. + *

+ * @param configargs array[optional]

+ * configargs can be used to fine-tune the export + * process by specifying and/or overriding options for the openssl + * configuration file. See openssl_csr_new for more + * information about configargs. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkey_export_to_file ($key, $outfilename, $passphrase = null, array $configargs = null) {} + +/** + * Get a private key + * @link http://www.php.net/manual/en/function.openssl-pkey-get-private.php + * @param key mixed

+ * key can be one of the following: + * a string having the format + * file://path/to/file.pem. The named file must + * contain a PEM encoded certificate/private key (it may contain both). + * @param passphrase string[optional]

+ * The optional parameter passphrase must be used + * if the specified key is encrypted (protected by a passphrase). + *

+ * @return resource a positive key resource identifier on success, or false on error. + * + * @jms-builtin + */ +function openssl_pkey_get_private ($key, $passphrase = null) {} + +/** + * Extract public key from certificate and prepare it for use + * @link http://www.php.net/manual/en/function.openssl-pkey-get-public.php + * @param certificate mixed

+ * certificate can be one of the following: + * an X.509 certificate resource + * @return resource a positive key resource identifier on success, or false on error. + * + * @jms-builtin + */ +function openssl_pkey_get_public ($certificate) {} + +/** + * Returns an array with the key details + * @link http://www.php.net/manual/en/function.openssl-pkey-get-details.php + * @param key resource

+ * Resource holding the key. + *

+ * @return array an array with the key details in success or false in failure. + * Returned array has indexes bits (number of bits), + * key (string representation of the public key) and + * type (type of the key which is one of + * OPENSSL_KEYTYPE_RSA, + * OPENSSL_KEYTYPE_DSA, + * OPENSSL_KEYTYPE_DH, + * OPENSSL_KEYTYPE_EC or -1 meaning unknown). + * + * @jms-builtin + */ +function openssl_pkey_get_details ($key) {} + +/** + * Free key resource + * @link http://www.php.net/manual/en/function.openssl-free-key.php + * @param key_identifier resource

+ *

+ * @return void + * + * @jms-builtin + */ +function openssl_free_key ($key_identifier) {} + +/** + * &Alias; openssl_pkey_get_private + * @link http://www.php.net/manual/en/function.openssl-get-privatekey.php + * + * @jms-builtin + */ +function openssl_get_privatekey () {} + +/** + * &Alias; openssl_pkey_get_public + * @link http://www.php.net/manual/en/function.openssl-get-publickey.php + * + * @jms-builtin + */ +function openssl_get_publickey () {} + +/** + * Parse an X.509 certificate and return a resource identifier for + it + * @link http://www.php.net/manual/en/function.openssl-x509-read.php + * @param x509certdata mixed

+ *

+ * @return resource a resource identifier on success&return.falseforfailure;. + * + * @jms-builtin + */ +function openssl_x509_read ($x509certdata) {} + +/** + * Free certificate resource + * @link http://www.php.net/manual/en/function.openssl-x509-free.php + * @param x509cert resource

+ *

+ * @return void + * + * @jms-builtin + */ +function openssl_x509_free ($x509cert) {} + +/** + * Parse an X509 certificate and return the information as an array + * @link http://www.php.net/manual/en/function.openssl-x509-parse.php + * @param x509cert mixed

+ *

+ * @param shortnames bool[optional]

+ * shortnames controls how the data is indexed in the + * array - if shortnames is true (the default) then + * fields will be indexed with the short name form, otherwise, the long name + * form will be used - e.g.: CN is the shortname form of commonName. + *

+ * @return array The structure of the returned data is (deliberately) not + * yet documented, as it is still subject to change. + * + * @jms-builtin + */ +function openssl_x509_parse ($x509cert, $shortnames = null) {} + +/** + * Verifies if a certificate can be used for a particular purpose + * @link http://www.php.net/manual/en/function.openssl-x509-checkpurpose.php + * @param x509cert mixed

+ * The examined certificate. + *

+ * @param purpose int

+ * + * openssl_x509_checkpurpose purposes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
X509_PURPOSE_SSL_CLIENTCan the certificate be used for the client side of an SSL + * connection?
X509_PURPOSE_SSL_SERVERCan the certificate be used for the server side of an SSL + * connection?
X509_PURPOSE_NS_SSL_SERVERCan the cert be used for Netscape SSL server?
X509_PURPOSE_SMIME_SIGNCan the cert be used to sign S/MIME email?
X509_PURPOSE_SMIME_ENCRYPTCan the cert be used to encrypt S/MIME email?
X509_PURPOSE_CRL_SIGNCan the cert be used to sign a certificate revocation list + * (CRL)?
X509_PURPOSE_ANYCan the cert be used for Any/All purposes?
+ * These options are not bitfields - you may specify one only! + *

+ * @param cainfo array[optional]

+ * cainfo should be an array of trusted CA files/dirs + * as described in Certificate + * Verification. + *

+ * @param untrustedfile string[optional]

+ * If specified, this should be the name of a PEM encoded file holding + * certificates that can be used to help verify the certificate, although + * no trust is placed in the certificates that come from that file. + *

+ * @return int true if the certificate can be used for the intended purpose, + * false if it cannot, or -1 on error. + * + * @jms-builtin + */ +function openssl_x509_checkpurpose ($x509cert, $purpose, array $cainfo = null, $untrustedfile = null) {} + +/** + * Checks if a private key corresponds to a certificate + * @link http://www.php.net/manual/en/function.openssl-x509-check-private-key.php + * @param cert mixed

+ * The certificate. + *

+ * @param key mixed

+ * The private key. + *

+ * @return bool true if key is the private key that + * corresponds to cert, or false otherwise. + * + * @jms-builtin + */ +function openssl_x509_check_private_key ($cert, $key) {} + +/** + * Exports a certificate as a string + * @link http://www.php.net/manual/en/function.openssl-x509-export.php + * @param x509 mixed + * @param output string

+ * On success, this will hold the PEM. + *

+ * @param notext bool[optional] ¬e.openssl.param-notext; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_x509_export ($x509, &$output, $notext = null) {} + +/** + * Exports a certificate to file + * @link http://www.php.net/manual/en/function.openssl-x509-export-to-file.php + * @param x509 mixed + * @param outfilename string

+ * Path to the output file. + *

+ * @param notext bool[optional] ¬e.openssl.param-notext; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_x509_export_to_file ($x509, $outfilename, $notext = null) {} + +/** + * Exports a PKCS#12 Compatible Certificate Store File to variable. + * @link http://www.php.net/manual/en/function.openssl-pkcs12-export.php + * @param x509 mixed + * @param out string

+ * On success, this will hold the PKCS#12. + *

+ * @param priv_key mixed

+ * Private key component of PKCS#12 file. + *

+ * @param pass string

+ * Encryption password for unlocking the PKCS#12 file. + *

+ * @param args array[optional]

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs12_export ($x509, &$out, $priv_key, $pass, array $args = null) {} + +/** + * Exports a PKCS#12 Compatible Certificate Store File + * @link http://www.php.net/manual/en/function.openssl-pkcs12-export-to-file.php + * @param x509 mixed + * @param filename string

+ * Path to the output file. + *

+ * @param priv_key mixed

+ * Private key component of PKCS#12 file. + *

+ * @param pass string

+ * Encryption password for unlocking the PKCS#12 file. + *

+ * @param args array[optional]

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs12_export_to_file ($x509, $filename, $priv_key, $pass, array $args = null) {} + +/** + * Parse a PKCS#12 Certificate Store into an array + * @link http://www.php.net/manual/en/function.openssl-pkcs12-read.php + * @param pkcs12 string

+ *

+ * @param certs array

+ * On success, this will hold the Certificate Store Data. + *

+ * @param pass string

+ * Encryption password for unlocking the PKCS#12 file. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs12_read ($pkcs12, array &$certs, $pass) {} + +/** + * Generates a CSR + * @link http://www.php.net/manual/en/function.openssl-csr-new.php + * @param dn array

+ * The Distinguished Name to be used in the certificate. + *

+ * @param privkey resource

+ * privkey should be set to a private key that was + * previously generated by openssl_pkey_new (or + * otherwise obtained from the other openssl_pkey family of functions). + * The corresponding public portion of the key will be used to sign the + * CSR. + *

+ * @param configargs array[optional]

+ * By default, the information in your system openssl.conf + * is used to initialize the request; you can specify a configuration file + * section by setting the config_section_section key of + * configargs. You can also specify an alternative + * openssl configuration file by setting the value of the + * config key to the path of the file you want to use. + * The following keys, if present in configargs + * behave as their equivalents in the openssl.conf, as + * listed in the table below. + * + * Configuration overrides + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
configargs keytypeopenssl.conf equivalentdescription
digest_algstringdefault_mdSelects which digest method to use
x509_extensionsstringx509_extensionsSelects which extensions should be used when creating an x509 + * certificate
req_extensionsstringreq_extensionsSelects which extensions should be used when creating a CSR
private_key_bitsintegerdefault_bitsSpecifies how many bits should be used to generate a private + * key
private_key_typeintegernoneSpecifies the type of private key to create. This can be one + * of OPENSSL_KEYTYPE_DSA, + * OPENSSL_KEYTYPE_DH or + * OPENSSL_KEYTYPE_RSA. + * The default value is OPENSSL_KEYTYPE_RSA which + * is currently the only supported key type. + *
encrypt_keybooleanencrypt_keyShould an exported key (with passphrase) be encrypted?
+ *

+ * @param extraattribs array[optional]

+ * extraattribs is used to specify additional + * configuration options for the CSR. Both dn and + * extraattribs are associative arrays whose keys are + * converted to OIDs and applied to the relevant part of the request. + *

+ * @return mixed the CSR. + * + * @jms-builtin + */ +function openssl_csr_new (array $dn, &$privkey, array $configargs = null, array $extraattribs = null) {} + +/** + * Exports a CSR as a string + * @link http://www.php.net/manual/en/function.openssl-csr-export.php + * @param csr resource

+ *

+ * @param out string

+ *

+ * @param notext bool[optional] ¬e.openssl.param-notext; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_csr_export ($csr, &$out, $notext = null) {} + +/** + * Exports a CSR to a file + * @link http://www.php.net/manual/en/function.openssl-csr-export-to-file.php + * @param csr resource

+ *

+ * @param outfilename string

+ * Path to the output file. + *

+ * @param notext bool[optional] ¬e.openssl.param-notext; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_csr_export_to_file ($csr, $outfilename, $notext = null) {} + +/** + * Sign a CSR with another certificate (or itself) and generate a certificate + * @link http://www.php.net/manual/en/function.openssl-csr-sign.php + * @param csr mixed

+ * A CSR previously generated by openssl_csr_new. + * It can also be the path to a PEM encoded CSR when specified as + * file://path/to/csr or an exported string generated + * by openssl_csr_export. + *

+ * @param cacert mixed

+ * The generated certificate will be signed by cacert. + * If cacert is &null;, the generated certificate + * will be a self-signed certificate. + *

+ * @param priv_key mixed

+ * priv_key is the private key that corresponds to + * cacert. + *

+ * @param days int

+ * days specifies the length of time for which the + * generated certificate will be valid, in days. + *

+ * @param configargs array[optional]

+ * You can finetune the CSR signing by configargs. + * See openssl_csr_new for more information about + * configargs. + *

+ * @param serial int[optional]

+ * An optional the serial number of issued certificate. If not specified + * it will default to 0. + *

+ * @return resource an x509 certificate resource on success, false on failure. + * + * @jms-builtin + */ +function openssl_csr_sign ($csr, $cacert, $priv_key, $days, array $configargs = null, $serial = null) {} + +/** + * Returns the subject of a CERT + * @link http://www.php.net/manual/en/function.openssl-csr-get-subject.php + * @param csr mixed + * @param use_shortnames bool[optional] + * @return array + * + * @jms-builtin + */ +function openssl_csr_get_subject ($csr, $use_shortnames = null) {} + +/** + * Returns the public key of a CERT + * @link http://www.php.net/manual/en/function.openssl-csr-get-public-key.php + * @param csr mixed + * @param use_shortnames bool[optional] + * @return resource + * + * @jms-builtin + */ +function openssl_csr_get_public_key ($csr, $use_shortnames = null) {} + +/** + * Computes a digest + * @link http://www.php.net/manual/en/function.openssl-digest.php + * @param data string

+ * The data. + *

+ * @param method string

+ * The digest method. + *

+ * @param raw_output bool[optional]

+ * Setting to true will return as raw output data, otherwise the return + * value is binhex encoded. + *

+ * @return string the digested hash value on success&return.falseforfailure;. + * + * @jms-builtin + */ +function openssl_digest ($data, $method, $raw_output = null) {} + +/** + * Encrypts data + * @link http://www.php.net/manual/en/function.openssl-encrypt.php + * @param data string

+ * The data. + *

+ * @param method string

+ * The cipher method. + *

+ * @param password string

+ * The password. + *

+ * @param raw_output bool[optional]

+ * Setting to true will return as raw output data, otherwise the return + * value is base64 encoded. + *

+ * @return string the encrypted string on success&return.falseforfailure;. + * + * @jms-builtin + */ +function openssl_encrypt ($data, $method, $password, $raw_output = null) {} + +/** + * Decrypts data + * @link http://www.php.net/manual/en/function.openssl-decrypt.php + * @param data string

+ * The data. + *

+ * @param method string

+ * The cipher method. + *

+ * @param password string

+ * The password. + *

+ * @param raw_input string[optional]

+ * Setting to true will take a raw encoded string, + * otherwise a base64 string is assumed for the + * data parameter. + *

+ * @return string The decrypted string on success&return.falseforfailure;. + * + * @jms-builtin + */ +function openssl_decrypt ($data, $method, $password, $raw_input = null) {} + +/** + * Generate signature + * @link http://www.php.net/manual/en/function.openssl-sign.php + * @param data string

+ *

+ * @param signature string

+ * If the call was successful the signature is returned in + * signature. + *

+ * @param priv_key_id mixed

+ *

+ * @param signature_alg int[optional]

+ * For more information see the list of Signature Algorithms. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_sign ($data, &$signature, $priv_key_id, $signature_alg = null) {} + +/** + * Verify signature + * @link http://www.php.net/manual/en/function.openssl-verify.php + * @param data string

+ *

+ * @param signature string

+ *

+ * @param pub_key_id mixed

+ *

+ * @param signature_alg int[optional]

+ * For more information see the list of Signature Algorithms. + *

+ * @return int 1 if the signature is correct, 0 if it is incorrect, and + * -1 on error. + * + * @jms-builtin + */ +function openssl_verify ($data, $signature, $pub_key_id, $signature_alg = null) {} + +/** + * Seal (encrypt) data + * @link http://www.php.net/manual/en/function.openssl-seal.php + * @param data string

+ *

+ * @param sealed_data string

+ *

+ * @param env_keys array

+ *

+ * @param pub_key_ids array

+ *

+ * @return int the length of the sealed data on success, or false on error. + * If successful the sealed data is returned in + * sealed_data, and the envelope keys in + * env_keys. + * + * @jms-builtin + */ +function openssl_seal ($data, &$sealed_data, array &$env_keys, array $pub_key_ids) {} + +/** + * Open sealed data + * @link http://www.php.net/manual/en/function.openssl-open.php + * @param sealed_data string

+ *

+ * @param open_data string

+ * If the call is successful the opened data is returned in this + * parameter. + *

+ * @param env_key string

+ *

+ * @param priv_key_id mixed

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_open ($sealed_data, &$open_data, $env_key, $priv_key_id) {} + +/** + * Verifies the signature of an S/MIME signed message + * @link http://www.php.net/manual/en/function.openssl-pkcs7-verify.php + * @param filename string

+ * Path to the message. + *

+ * @param flags int

+ * flags can be used to affect how the signature is + * verified - see PKCS7 constants + * for more information. + *

+ * @param outfilename string[optional]

+ * If the outfilename is specified, it should be a + * string holding the name of a file into which the certificates of the + * persons that signed the messages will be stored in PEM format. + *

+ * @param cainfo array[optional]

+ * If the cainfo is specified, it should hold + * information about the trusted CA certificates to use in the verification + * process - see certificate + * verification for more information about this parameter. + *

+ * @param extracerts string[optional]

+ * If the extracerts is specified, it is the filename + * of a file containing a bunch of certificates to use as untrusted CAs. + *

+ * @param content string[optional]

+ * You can specify a filename with content that will + * be filled with the verified data, but with the signature information + * stripped. + *

+ * @return mixed true if the signature is verified, false if it is not correct + * (the message has been tampered with, or the signing certificate is invalid), + * or -1 on error. + * + * @jms-builtin + */ +function openssl_pkcs7_verify ($filename, $flags, $outfilename = null, array $cainfo = null, $extracerts = null, $content = null) {} + +/** + * Decrypts an S/MIME encrypted message + * @link http://www.php.net/manual/en/function.openssl-pkcs7-decrypt.php + * @param infilename string

+ *

+ * @param outfilename string

+ * The decrypted message is written to the file specified by + * outfilename. + *

+ * @param recipcert mixed

+ *

+ * @param recipkey mixed[optional]

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs7_decrypt ($infilename, $outfilename, $recipcert, $recipkey = null) {} + +/** + * Sign an S/MIME message + * @link http://www.php.net/manual/en/function.openssl-pkcs7-sign.php + * @param infilename string

+ *

+ * @param outfilename string

+ *

+ * @param signcert mixed

+ *

+ * @param privkey mixed

+ *

+ * @param headers array

+ * headers is an array of headers that + * will be prepended to the data after it has been signed (see + * openssl_pkcs7_encrypt for more information about + * the format of this parameter). + *

+ * @param flags int[optional]

+ * flags can be used to alter the output - see PKCS7 constants. + *

+ * @param extracerts string[optional]

+ * extracerts specifies the name of a file containing + * a bunch of extra certificates to include in the signature which can for + * example be used to help the recipient to verify the certificate that you used. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs7_sign ($infilename, $outfilename, $signcert, $privkey, array $headers, $flags = null, $extracerts = null) {} + +/** + * Encrypt an S/MIME message + * @link http://www.php.net/manual/en/function.openssl-pkcs7-encrypt.php + * @param infile string

+ *

+ * @param outfile string

+ *

+ * @param recipcerts mixed

+ * Either a lone X.509 certificate, or an array of X.509 certificates. + *

+ * @param headers array

+ * headers is an array of headers that + * will be prepended to the data after it has been encrypted. + *

+ *

+ * headers can be either an associative array + * keyed by header name, or an indexed array, where each element contains + * a single header line. + *

+ * @param flags int[optional]

+ * flags can be used to specify options that affect + * the encoding process - see PKCS7 + * constants. + *

+ * @param cipherid int[optional]

+ * Cipher can be selected with cipherid. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_pkcs7_encrypt ($infile, $outfile, $recipcerts, array $headers, $flags = null, $cipherid = null) {} + +/** + * Encrypts data with private key + * @link http://www.php.net/manual/en/function.openssl-private-encrypt.php + * @param data string

+ *

+ * @param crypted string

+ *

+ * @param key mixed

+ *

+ * @param padding int[optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_private_encrypt ($data, &$crypted, $key, $padding = null) {} + +/** + * Decrypts data with private key + * @link http://www.php.net/manual/en/function.openssl-private-decrypt.php + * @param data string

+ *

+ * @param decrypted string

+ *

+ * @param key mixed

+ * key must be the private key corresponding that + * was used to encrypt the data. + *

+ * @param padding int[optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_SSLV23_PADDING, + * OPENSSL_PKCS1_OAEP_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_private_decrypt ($data, &$decrypted, $key, $padding = null) {} + +/** + * Encrypts data with public key + * @link http://www.php.net/manual/en/function.openssl-public-encrypt.php + * @param data string

+ *

+ * @param crypted string

+ * This will hold the result of the encryption. + *

+ * @param key mixed

+ * The public key. + *

+ * @param padding int[optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_SSLV23_PADDING, + * OPENSSL_PKCS1_OAEP_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_public_encrypt ($data, &$crypted, $key, $padding = null) {} + +/** + * Decrypts data with public key + * @link http://www.php.net/manual/en/function.openssl-public-decrypt.php + * @param data string

+ *

+ * @param decrypted string

+ *

+ * @param key mixed

+ * key must be the public key corresponding that + * was used to encrypt the data. + *

+ * @param padding int[optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openssl_public_decrypt ($data, &$decrypted, $key, $padding = null) {} + +/** + * Gets available digest methods + * @link http://www.php.net/manual/en/function.openssl-get-md-methods.php + * @param aliases bool[optional]

+ * Set to true if digest aliases should be included within the + * returned array. + *

+ * @return array An array of available digest methods. + * + * @jms-builtin + */ +function openssl_get_md_methods ($aliases = null) {} + +/** + * Gets available cipher methods + * @link http://www.php.net/manual/en/function.openssl-get-cipher-methods.php + * @param aliases bool[optional]

+ * Set to true if cipher aliases should be included within the + * returned array. + *

+ * @return array An array of available cipher methods. + * + * @jms-builtin + */ +function openssl_get_cipher_methods ($aliases = null) {} + +/** + * Computes shared secret for public value of remote DH key and local DH key + * @link http://www.php.net/manual/en/function.openssl-dh-compute-key.php + * @param pub_key string

+ * Public key + *

+ * @param dh_key resource

+ * DH key + *

+ * @return string computed key on success&return.falseforfailure;. + * + * @jms-builtin + */ +function openssl_dh_compute_key ($pub_key, $dh_key) {} + +/** + * Generate a pseudo-random string of bytes + * @link http://www.php.net/manual/en/function.openssl-random-pseudo-bytes.php + * @param length string

+ * The length of the desired string of bytes. Must be a positive integer. PHP will + * try to cast this parameter to a non-null integer to use it. + *

+ * @param crypto_strong bool[optional]

+ * If passed into the function, this will hold a boolean value that determines + * if the algorithm used was "cryptographically strong", e.g., safe for usage with GPG, + * passwords, etc. true if it did, otherwise false + *

+ * @return string the generated &string; of bytes on success, &return.falseforfailure;. + * + * @jms-builtin + */ +function openssl_random_pseudo_bytes ($length, &$crypto_strong = null) {} + +/** + * Return openSSL error message + * @link http://www.php.net/manual/en/function.openssl-error-string.php + * @return string an error message string, or false if there are no more error + * messages to return. + * + * @jms-builtin + */ +function openssl_error_string () {} + +define ('OPENSSL_VERSION_TEXT', "OpenSSL 0.9.8l 5 Nov 2009"); +define ('OPENSSL_VERSION_NUMBER', 9470159); +define ('X509_PURPOSE_SSL_CLIENT', 1); +define ('X509_PURPOSE_SSL_SERVER', 2); +define ('X509_PURPOSE_NS_SSL_SERVER', 3); +define ('X509_PURPOSE_SMIME_SIGN', 4); +define ('X509_PURPOSE_SMIME_ENCRYPT', 5); +define ('X509_PURPOSE_CRL_SIGN', 6); +define ('X509_PURPOSE_ANY', 7); + +/** + * Used as default algorithm by openssl_sign and + * openssl_verify. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('OPENSSL_ALGO_SHA1', 1); +define ('OPENSSL_ALGO_MD5', 2); +define ('OPENSSL_ALGO_MD4', 3); +define ('OPENSSL_ALGO_DSS1', 5); + +/** + * When signing a message, use cleartext signing with the MIME + * type "multipart/signed". This is the default + * if you do not specify any flags to + * openssl_pkcs7_sign. + * If you turn this option off, the message will be signed using + * opaque signing, which is more resistant to translation by mail relays + * but cannot be read by mail agents that do not support S/MIME. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_DETACHED', 64); + +/** + * Adds text/plain content type headers to encrypted/signed + * message. If decrypting or verifying, it strips those headers from + * the output - if the decrypted or verified message is not of MIME type + * text/plain then an error will occur. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_TEXT', 1); + +/** + * When verifying a message, certificates (if + * any) included in the message are normally searched for the + * signing certificate. With this option only the + * certificates specified in the extracerts + * parameter of openssl_pkcs7_verify are + * used. The supplied certificates can still be used as + * untrusted CAs however. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOINTERN', 16); + +/** + * Do not verify the signers certificate of a signed + * message. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOVERIFY', 32); + +/** + * Do not chain verification of signers certificates: that is + * don't use the certificates in the signed message as untrusted CAs. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOCHAIN', 8); + +/** + * When signing a message the signer's certificate is normally + * included - with this option it is excluded. This will reduce the + * size of the signed message but the verifier must have a copy of the + * signers certificate available locally (passed using the + * extracerts to + * openssl_pkcs7_verify for example). + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOCERTS', 2); + +/** + * Normally when a message is signed, a set of attributes are + * included which include the signing time and the supported symmetric + * algorithms. With this option they are not included. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOATTR', 256); + +/** + * Normally the input message is converted to "canonical" format + * which is effectively using CR and LF + * as end of line: as required by the S/MIME specification. When this + * option is present, no translation occurs. This is useful when + * handling binary data which may not be in MIME format. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_BINARY', 128); + +/** + * Don't try and verify the signatures on a message + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOSIGS', 4); +define ('OPENSSL_PKCS1_PADDING', 1); +define ('OPENSSL_SSLV23_PADDING', 2); +define ('OPENSSL_NO_PADDING', 3); +define ('OPENSSL_PKCS1_OAEP_PADDING', 4); +define ('OPENSSL_CIPHER_RC2_40', 0); +define ('OPENSSL_CIPHER_RC2_128', 1); +define ('OPENSSL_CIPHER_RC2_64', 2); +define ('OPENSSL_CIPHER_DES', 3); +define ('OPENSSL_CIPHER_3DES', 4); +define ('OPENSSL_KEYTYPE_RSA', 0); +define ('OPENSSL_KEYTYPE_DSA', 1); +define ('OPENSSL_KEYTYPE_DH', 2); +define ('OPENSSL_KEYTYPE_EC', 3); + +/** + * Whether SNI support is available or not. + * @link http://www.php.net/manual/en/openssl.constants.php + */ +define ('OPENSSL_TLSEXT_SERVER_NAME', 1); + +// End of openssl v. +?> diff --git a/res/php-5.3-core-api/pcre.php b/res/php-5.3-core-api/pcre.php new file mode 100644 index 0000000..cfd46e2 --- /dev/null +++ b/res/php-5.3-core-api/pcre.php @@ -0,0 +1,479 @@ + + * The pattern to search for, as a string. + *

+ * @param subject string

+ * The input string. + *

+ * @param array $matches

+ * If matches is provided, then it is filled with + * the results of search. $matches[0] will contain the + * text that matched the full pattern, $matches[1] + * will have the text that matched the first captured parenthesized + * subpattern, and so on. + *

+ * @param flags int[optional]

+ * flags can be the following flag: + * PREG_OFFSET_CAPTURE + * If this flag is passed, for every occurring match the appendant string + * offset will also be returned. Note that this changes the value of + * matches into an array where every element is an + * array consisting of the matched string at offset 0 + * and its string offset into subject at offset + * 1. + * @param offset int[optional]

+ * Normally, the search starts from the beginning of the subject string. + * The optional parameter offset can be used to + * specify the alternate place from which to start the search (in bytes). + *

+ *

+ * Using offset is not equivalent to passing + * substr($subject, $offset) to + * preg_match in place of the subject string, + * because pattern can contain assertions such as + * ^, $ or + * (?<=x). Compare: + * ]]> + * &example.outputs; + *

+ * while this example + *

+ * ]]> + *

+ * will produce + *

+ * Array + * ( + * [0] => def + * [1] => 0 + * ) + * ) + * ]]> + *

+ * @return int preg_match returns the number of times + * pattern matches. That will be either 0 times + * (no match) or 1 time because preg_match will stop + * searching after the first match. preg_match_all + * on the contrary will continue until it reaches the end of + * subject. + * preg_match returns false if an error occurred. + * + * @jms-builtin + */ +function preg_match ($pattern, $subject, array &$matches = null, $flags = null, $offset = null) {} + +/** + * Perform a global regular expression match + * @link http://www.php.net/manual/en/function.preg-match-all.php + * @param pattern string

+ * The pattern to search for, as a string. + *

+ * @param subject string

+ * The input string. + *

+ * @param array> $matches

+ * Normally, the search starts from the beginning of the subject string. + * The optional parameter offset can be used to + * specify the alternate place from which to start the search (in bytes). + *

+ *

+ * Using offset is not equivalent to passing + * substr($subject, $offset) to + * preg_match_all in place of the subject string, + * because pattern can contain assertions such as + * ^, $ or + * (?<=x). See preg_match + * for examples. + *

+ * @param flags int[optional]

+ * Can be a combination of the following flags (note that it doesn't make + * sense to use PREG_PATTERN_ORDER together with + * PREG_SET_ORDER): + * PREG_PATTERN_ORDER + *

+ * Orders results so that $matches[0] is an array of full + * pattern matches, $matches[1] is an array of strings matched by + * the first parenthesized subpattern, and so on. + *

+ *

+ * ]]> + * &example.outputs; + * example: , this is a test + * example: , this is a test + * ]]> + *

+ * So, $out[0] contains array of strings that matched full pattern, + * and $out[1] contains array of strings enclosed by tags. + *

+ *

+ * @param offset int[optional] + * @return int the number of full pattern matches (which might be zero), + * or false if an error occurred. + * + * @jms-builtin + */ +function preg_match_all ($pattern, $subject, array &$matches, $flags = null, $offset = null) {} + +/** + * Perform a regular expression search and replace + * @link http://www.php.net/manual/en/function.preg-replace.php + * @param string|array $pattern

+ * The pattern to search for. It can be either a string or an array with + * strings. + *

+ *

+ * The e modifier makes preg_replace + * treat the replacement parameter as PHP code after + * the appropriate references substitution is done. Tip: make sure that + * replacement constitutes a valid PHP code string, + * otherwise PHP will complain about a parse error at the line containing + * preg_replace. + *

+ * @param string|array $replacement

+ * The string or an array with strings to replace. If this parameter is a + * string and the pattern parameter is an array, + * all patterns will be replaced by that string. If both + * pattern and replacement + * parameters are arrays, each pattern will be + * replaced by the replacement counterpart. If + * there are fewer elements in the replacement + * array than in the pattern array, any extra + * patterns will be replaced by an empty string. + *

+ *

+ * replacement may contain references of the form + * \\n or (since PHP 4.0.4) + * $n, with the latter form + * being the preferred one. Every such reference will be replaced by the text + * captured by the n'th parenthesized pattern. + * n can be from 0 to 99, and + * \\0 or $0 refers to the text matched + * by the whole pattern. Opening parentheses are counted from left to right + * (starting from 1) to obtain the number of the capturing subpattern. + * To use backslash in replacement, it must be doubled + * ("\\\\" PHP string). + *

+ *

+ * When working with a replacement pattern where a backreference is + * immediately followed by another number (i.e.: placing a literal number + * immediately after a matched pattern), you cannot use the familiar + * \\1 notation for your backreference. + * \\11, for example, would confuse + * preg_replace since it does not know whether you + * want the \\1 backreference followed by a literal + * 1, or the \\11 backreference + * followed by nothing. In this case the solution is to use + * \${1}1. This creates an isolated + * $1 backreference, leaving the 1 + * as a literal. + *

+ *

+ * When using the e modifier, this function escapes + * some characters (namely ', ", + * \ and NULL) in the strings that replace the + * backreferences. This is done to ensure that no syntax errors arise + * from backreference usage with either single or double quotes (e.g. + * 'strlen(\'$1\')+strlen("$2")'). Make sure you are + * aware of PHP's string + * syntax to know exactly how the interpreted string will look + * like. + *

+ * @param string|array $subject

+ * The string or an array with strings to search and replace. + *

+ *

+ * If subject is an array, then the search and + * replace is performed on every entry of subject, + * and the return value is an array as well. + *

+ * @param limit int[optional]

+ * The maximum possible replacements for each pattern in each + * subject string. Defaults to + * -1 (no limit). + *

+ * @param count int[optional]

+ * If specified, this variable will be filled with the number of + * replacements done. + *

+ * @return array|string preg_replace returns an array if the + * subject parameter is an array, or a string + * otherwise. + *

+ *

+ * If matches are found, the new subject will + * be returned, otherwise subject will be + * returned unchanged or &null; if an error occurred. + * + * @jms-builtin + */ +function preg_replace ($pattern, $replacement, $subject, $limit = null, &$count = null) {} + +/** + * Perform a regular expression search and replace using a callback + * @link http://www.php.net/manual/en/function.preg-replace-callback.php + * @param string|array $pattern

+ * The pattern to search for. It can be either a string or an array with + * strings. + *

+ * @param callback callback

+ * A callback that will be called and passed an array of matched elements + * in the subject string. The callback should + * return the replacement string. + *

+ *

+ * You'll often need the callback function + * for a preg_replace_callback in just one place. + * In this case you can use an + * anonymous function (since + * PHP 5.3.0) or create_function to + * declare an anonymous function as callback within the call to + * preg_replace_callback. By doing it this way + * you have all information for the call in one place and do not + * clutter the function namespace with a callback function's name + * not used anywhere else. + *

+ *

+ * preg_replace_callback and + * create_function + * ]]> + *

+ * @param string|array $subject

+ * The string or an array with strings to search and replace. + *

+ * @param limit int[optional]

+ * The maximum possible replacements for each pattern in each + * subject string. Defaults to + * -1 (no limit). + *

+ * @param count int[optional]

+ * If specified, this variable will be filled with the number of + * replacements done. + *

+ * @return string|array preg_replace_callback returns an array if the + * subject parameter is an array, or a string + * otherwise. On errors the return value is &null; + *

+ *

+ * If matches are found, the new subject will be returned, otherwise + * subject will be returned unchanged. + * + * @jms-builtin + */ +function preg_replace_callback ($pattern, $callback, $subject, $limit = null, &$count = null) {} + +/** + * Perform a regular expression search and replace + * @link http://www.php.net/manual/en/function.preg-filter.php + * @param string|array $pattern + * @param string|array $replacement + * @param string|array $subject + * @param limit int[optional] + * @param count int[optional] + * @return string|array an array if the subject + * parameter is an array, or a string otherwise. + *

+ *

+ * If no matches are found or an error occurred, an empty array + * is returned when subject is an array + * or &null; otherwise. + * + * @jms-builtin + */ +function preg_filter ($pattern, $replacement, $subject, $limit = null, &$count = null) {} + +/** + * Split string by a regular expression + * @link http://www.php.net/manual/en/function.preg-split.php + * @param pattern string

+ * The pattern to search for, as a string. + *

+ * @param subject string

+ * The input string. + *

+ * @param limit int[optional]

+ * If specified, then only substrings up to limit + * are returned with the rest of the string being placed in the last + * substring. A limit of -1, 0 or null means "no limit" + * and, as is standard across PHP, you can use null to skip to the + * flags parameter. + *

+ * @param flags int[optional]

+ * flags can be any combination of the following + * flags (combined with the | bitwise operator): + * PREG_SPLIT_NO_EMPTY + * If this flag is set, only non-empty pieces will be returned by + * preg_split. + * @return array an array containing substrings of subject + * split along boundaries matched by pattern. + * + * @jms-builtin + */ +function preg_split ($pattern, $subject, $limit = null, $flags = null) {} + +/** + * Quote regular expression characters + * @link http://www.php.net/manual/en/function.preg-quote.php + * @param str string

+ * The input string. + *

+ * @param delimiter string[optional]

+ * If the optional delimiter is specified, it + * will also be escaped. This is useful for escaping the delimiter + * that is required by the PCRE functions. The / is the most commonly + * used delimiter. + *

+ * @return string the quoted string. + * + * @jms-builtin + */ +function preg_quote ($str, $delimiter = null) {} + +/** + * Return array entries that match the pattern + * @link http://www.php.net/manual/en/function.preg-grep.php + * @param pattern string

+ * The pattern to search for, as a string. + *

+ * @param array $input

+ * The input array. + *

+ * @param flags int[optional]

+ * If set to PREG_GREP_INVERT, this function returns + * the elements of the input array that do not match + * the given pattern. + *

+ * @return array an array indexed using the keys from the + * input array. + * + * @jms-builtin + */ +function preg_grep ($pattern, array $input, $flags = null) {} + +/** + * Returns the error code of the last PCRE regex execution + * @link http://www.php.net/manual/en/function.preg-last-error.php + * @return int one of the following constants (explained on their own page): + * PREG_NO_ERROR + * PREG_INTERNAL_ERROR + * PREG_BACKTRACK_LIMIT_ERROR (see also pcre.backtrack_limit) + * PREG_RECURSION_LIMIT_ERROR (see also pcre.recursion_limit) + * PREG_BAD_UTF8_ERROR + * PREG_BAD_UTF8_OFFSET_ERROR (since PHP 5.3.0) + * + * @jms-builtin + */ +function preg_last_error () {} + + +/** + * Orders results so that $matches[0] is an array of full pattern + * matches, $matches[1] is an array of strings matched by the first + * parenthesized subpattern, and so on. This flag is only used with + * preg_match_all. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_PATTERN_ORDER', 1); + +/** + * Orders results so that $matches[0] is an array of first set of + * matches, $matches[1] is an array of second set of matches, and so + * on. This flag is only used with preg_match_all. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_SET_ORDER', 2); + +/** + * See the description of + * PREG_SPLIT_OFFSET_CAPTURE. This flag is + * available since PHP 4.3.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_OFFSET_CAPTURE', 256); + +/** + * This flag tells preg_split to return only non-empty + * pieces. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_SPLIT_NO_EMPTY', 1); + +/** + * This flag tells preg_split to capture + * parenthesized expression in the delimiter pattern as well. This flag + * is available since PHP 4.0.5. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_SPLIT_DELIM_CAPTURE', 2); + +/** + * If this flag is set, for every occurring match the appendant string + * offset will also be returned. Note that this changes the return + * values in an array where every element is an array consisting of the + * matched string at offset 0 and its string offset within subject at + * offset 1. This flag is available since PHP 4.3.0 + * and is only used for preg_split. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_SPLIT_OFFSET_CAPTURE', 4); +define ('PREG_GREP_INVERT', 1); + +/** + * Returned by preg_last_error if there were no + * errors. Available since PHP 5.2.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_NO_ERROR', 0); + +/** + * Returned by preg_last_error if there was an + * internal PCRE error. Available since PHP 5.2.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_INTERNAL_ERROR', 1); + +/** + * Returned by preg_last_error if backtrack limit was exhausted. + * Available since PHP 5.2.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_BACKTRACK_LIMIT_ERROR', 2); + +/** + * Returned by preg_last_error if recursion limit was exhausted. + * Available since PHP 5.2.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_RECURSION_LIMIT_ERROR', 3); + +/** + * Returned by preg_last_error if the last error was + * caused by malformed UTF-8 data (only when running a regex in UTF-8 mode). Available + * since PHP 5.2.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_BAD_UTF8_ERROR', 4); + +/** + * Returned by preg_last_error if the offset didn't + * correspond to the begin of a valid UTF-8 code point (only when running + * a regex in UTF-8 + * mode). Available since PHP 5.3.0. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PREG_BAD_UTF8_OFFSET_ERROR', 5); + +/** + * PCRE version and release date (e.g. "7.0 18-Dec-2006"). + * Available since PHP 5.2.4. + * @link http://www.php.net/manual/en/pcre.constants.php + */ +define ('PCRE_VERSION', "8.00 2009-10-19"); + +// End of pcre v. +?> diff --git a/res/php-5.3-core-api/pdo_mysql.php b/res/php-5.3-core-api/pdo_mysql.php new file mode 100644 index 0000000..b6fdd63 --- /dev/null +++ b/res/php-5.3-core-api/pdo_mysql.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.3-core-api/pdo_pgsql.php b/res/php-5.3-core-api/pdo_pgsql.php new file mode 100644 index 0000000..e551b7a --- /dev/null +++ b/res/php-5.3-core-api/pdo_pgsql.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.3-core-api/pdo_sqlite.php b/res/php-5.3-core-api/pdo_sqlite.php new file mode 100644 index 0000000..d33f2d2 --- /dev/null +++ b/res/php-5.3-core-api/pdo_sqlite.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.3-core-api/pgsql.php b/res/php-5.3-core-api/pgsql.php new file mode 100644 index 0000000..a99c860 --- /dev/null +++ b/res/php-5.3-core-api/pgsql.php @@ -0,0 +1,2164 @@ + + * The connection_string can be empty to use all default parameters, or it + * can contain one or more parameter settings separated by whitespace. + * Each parameter setting is in the form keyword = value. Spaces around + * the equal sign are optional. To write an empty value or a value + * containing spaces, surround it with single quotes, e.g., keyword = + * 'a value'. Single quotes and backslashes within the value must be + * escaped with a backslash, i.e., \' and \\. + *

+ *

+ * The currently recognized parameter keywords are: + * host, hostaddr, port, + * dbname, user, + * password, connect_timeout, + * options, tty (ignored), sslmode, + * requiressl (deprecated in favor of sslmode), and + * service. Which of these arguments exist depends + * on your PostgreSQL version. + *

+ * @param connect_type int[optional]

+ * If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection + * is created, even if the connection_string is identical to + * an existing connection. + *

+ * @return resource PostgreSQL connection resource on success, false on failure. + * + * @jms-builtin + */ +function pg_connect ($connection_string, $connect_type = null) {} + +/** + * Open a persistent PostgreSQL connection + * @link http://www.php.net/manual/en/function.pg-pconnect.php + * @param connection_string string

+ * The connection_string can be empty to use all default parameters, or it + * can contain one or more parameter settings separated by whitespace. + * Each parameter setting is in the form keyword = value. Spaces around + * the equal sign are optional. To write an empty value or a value + * containing spaces, surround it with single quotes, e.g., keyword = + * 'a value'. Single quotes and backslashes within the value must be + * escaped with a backslash, i.e., \' and \\. + *

+ *

+ * The currently recognized parameter keywords are: + * host, hostaddr, port, + * dbname, user, + * password, connect_timeout, + * options, tty (ignored), sslmode, + * requiressl (deprecated in favor of sslmode), and + * service. Which of these arguments exist depends + * on your PostgreSQL version. + *

+ * @param connect_type int[optional]

+ * If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection + * is created, even if the connection_string is identical to + * an existing connection. + *

+ * @return resource PostgreSQL connection resource on success, false on failure. + * + * @jms-builtin + */ +function pg_pconnect ($connection_string, $connect_type = null) {} + +/** + * Closes a PostgreSQL connection + * @link http://www.php.net/manual/en/function.pg-close.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_close ($connection = null) {} + +/** + * Get connection status + * @link http://www.php.net/manual/en/function.pg-connection-status.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return int PGSQL_CONNECTION_OK or + * PGSQL_CONNECTION_BAD. + * + * @jms-builtin + */ +function pg_connection_status ($connection) {} + +/** + * Get connection is busy or not + * @link http://www.php.net/manual/en/function.pg-connection-busy.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return bool true if the connection is busy, false otherwise. + * + * @jms-builtin + */ +function pg_connection_busy ($connection) {} + +/** + * Reset connection (reconnect) + * @link http://www.php.net/manual/en/function.pg-connection-reset.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_connection_reset ($connection) {} + +/** + * Returns the host name associated with the connection + * @link http://www.php.net/manual/en/function.pg-host.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the name of the host the + * connection is to, or false on error. + * + * @jms-builtin + */ +function pg_host ($connection = null) {} + +/** + * Get the database name + * @link http://www.php.net/manual/en/function.pg-dbname.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the name of the database the + * connection is to, or false on error. + * + * @jms-builtin + */ +function pg_dbname ($connection = null) {} + +/** + * Return the port number associated with the connection + * @link http://www.php.net/manual/en/function.pg-port.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return int An int containing the port number of the database + * server the connection is to, + * or false on error. + * + * @jms-builtin + */ +function pg_port ($connection = null) {} + +/** + * Return the TTY name associated with the connection + * @link http://www.php.net/manual/en/function.pg-tty.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the debug TTY of + * the connection, or false on error. + * + * @jms-builtin + */ +function pg_tty ($connection = null) {} + +/** + * Get the options associated with the connection + * @link http://www.php.net/manual/en/function.pg-options.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the connection + * options, or false on error. + * + * @jms-builtin + */ +function pg_options ($connection = null) {} + +/** + * Returns an array with client, protocol and server version (when available) + * @link http://www.php.net/manual/en/function.pg-version.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return array an array with client, protocol + * and server keys and values (if available). Returns + * false on error or invalid connection. + * + * @jms-builtin + */ +function pg_version ($connection = null) {} + +/** + * Ping database connection + * @link http://www.php.net/manual/en/function.pg-ping.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_ping ($connection = null) {} + +/** + * Looks up a current parameter setting of the server. + * @link http://www.php.net/manual/en/function.pg-parameter-status.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param param_name string

+ * Possible param_name values include server_version, + * server_encoding, client_encoding, + * is_superuser, session_authorization, + * DateStyle, TimeZone, and + * integer_datetimes. + *

+ * @return string A string containing the value of the parameter, false on failure or invalid + * param_name. + * + * @jms-builtin + */ +function pg_parameter_status ($connection = null, $param_name) {} + +/** + * Returns the current in-transaction status of the server. + * @link http://www.php.net/manual/en/function.pg-transaction-status.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return int The status can be PGSQL_TRANSACTION_IDLE (currently idle), + * PGSQL_TRANSACTION_ACTIVE (a command is in progress), + * PGSQL_TRANSACTION_INTRANS (idle, in a valid transaction block), + * or PGSQL_TRANSACTION_INERROR (idle, in a failed transaction block). + * PGSQL_TRANSACTION_UNKNOWN is reported if the connection is bad. + * PGSQL_TRANSACTION_ACTIVE is reported only when a query + * has been sent to the server and not yet completed. + * + * @jms-builtin + */ +function pg_transaction_status ($connection) {} + +/** + * Execute a query + * @link http://www.php.net/manual/en/function.pg-query.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param query string

+ * The SQL statement or statements to be executed. When multiple statements are passed to the function, + * they are automatically executed as one transaction, unless there are explicit BEGIN/COMMIT commands + * included in the query string. However, using multiple transactions in one function call is not recommended. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return resource A query result resource on success&return.falseforfailure;. + * + * @jms-builtin + */ +function pg_query ($connection = null, $query) {} + +/** + * Submits a command to the server and waits for the result, with the ability to pass parameters separately from the SQL command text. + * @link http://www.php.net/manual/en/function.pg-query-params.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param query string

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @param params array

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ * @return resource A query result resource on success&return.falseforfailure;. + * + * @jms-builtin + */ +function pg_query_params ($connection = null, $query, array $params) {} + +/** + * Submits a request to create a prepared statement with the + given parameters, and waits for completion. + * @link http://www.php.net/manual/en/function.pg-prepare.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param stmtname string

+ * The name to give the prepared statement. Must be unique per-connection. If + * "" is specified, then an unnamed statement is created, overwriting any + * previously defined unnamed statement. + *

+ * @param query string

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @return resource A query result resource on success&return.falseforfailure;. + * + * @jms-builtin + */ +function pg_prepare ($connection = null, $stmtname, $query) {} + +/** + * Sends a request to execute a prepared statement with given parameters, and waits for the result. + * @link http://www.php.net/manual/en/function.pg-execute.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param stmtname string

+ * The name of the prepared statement to execute. if + * "" is specified, then the unnamed statement is executed. The name must have + * been previously prepared using pg_prepare, + * pg_send_prepare or a PREPARE SQL + * command. + *

+ * @param params array

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ *

+ * Elements are converted to strings by calling this function. + *

+ * @return resource A query result resource on success&return.falseforfailure;. + * + * @jms-builtin + */ +function pg_execute ($connection = null, $stmtname, array $params) {} + +/** + * Sends asynchronous query + * @link http://www.php.net/manual/en/function.pg-send-query.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param query string

+ * The SQL statement or statements to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return bool Returns true on success or false on failure.

+ *

+ * Use pg_get_result to determine the query result. + * + * @jms-builtin + */ +function pg_send_query ($connection, $query) {} + +/** + * Submits a command and separate parameters to the server without waiting for the result(s). + * @link http://www.php.net/manual/en/function.pg-send-query-params.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param query string

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @param params array

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ * @return bool Returns true on success or false on failure.

+ *

+ * Use pg_get_result to determine the query result. + * + * @jms-builtin + */ +function pg_send_query_params ($connection, $query, array $params) {} + +/** + * Sends a request to create a prepared statement with the given parameters, without waiting for completion. + * @link http://www.php.net/manual/en/function.pg-send-prepare.php + * @param connection resource

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param stmtname string

+ * The name to give the prepared statement. Must be unique per-connection. If + * "" is specified, then an unnamed statement is created, overwriting any + * previously defined unnamed statement. + *

+ * @param query string

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @return bool true on success, false on failure. Use pg_get_result + * to determine the query result. + * + * @jms-builtin + */ +function pg_send_prepare ($connection, $stmtname, $query) {} + +/** + * Sends a request to execute a prepared statement with given parameters, without waiting for the result(s). + * @link http://www.php.net/manual/en/function.pg-send-execute.php + * @param connection resource

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param stmtname string

+ * The name of the prepared statement to execute. if + * "" is specified, then the unnamed statement is executed. The name must have + * been previously prepared using pg_prepare, + * pg_send_prepare or a PREPARE SQL + * command. + *

+ * @param params array

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ * @return bool true on success, false on failure. Use pg_get_result + * to determine the query result. + * + * @jms-builtin + */ +function pg_send_execute ($connection, $stmtname, array $params) {} + +/** + * Cancel an asynchronous query + * @link http://www.php.net/manual/en/function.pg-cancel-query.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_cancel_query ($connection) {} + +/** + * Returns values from a result resource + * @link http://www.php.net/manual/en/function.pg-fetch-result.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @param field mixed

+ * A string representing the name of the field (column) to fetch, otherwise + * an int representing the field number to fetch. Fields are + * numbered from 0 upwards. + *

+ * @return string Boolean is returned as "t" or "f". All + * other types, including arrays are returned as strings formatted + * in the same default PostgreSQL manner that you would see in the + * psql program. Database NULL + * values are returned as &null;. + *

+ *

+ * false is returned if row exceeds the number + * of rows in the set, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_result ($result, $row, $field) {} + +/** + * Get a row as an enumerated array + * @link http://www.php.net/manual/en/function.pg-fetch-row.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int[optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @param result_type int[optional] + * @return array An array, indexed from 0 upwards, with each value + * represented as a string. Database NULL + * values are returned as &null;. + *

+ *

+ * false is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_row ($result, $row = null, $result_type = null) {} + +/** + * Fetch a row as an associative array + * @link http://www.php.net/manual/en/function.pg-fetch-assoc.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int[optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @return array An array indexed associatively (by field name). + * Each value in the array is represented as a + * string. Database NULL + * values are returned as &null;. + *

+ *

+ * false is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_assoc ($result, $row = null) {} + +/** + * Fetch a row as an array + * @link http://www.php.net/manual/en/function.pg-fetch-array.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int[optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @param result_type int[optional]

+ * An optional parameter that controls + * how the returned array is indexed. + * result_type is a constant and can take the + * following values: PGSQL_ASSOC, + * PGSQL_NUM and PGSQL_BOTH. + * Using PGSQL_NUM, pg_fetch_array + * will return an array with numerical indices, using + * PGSQL_ASSOC it will return only associative indices + * while PGSQL_BOTH, the default, will return both + * numerical and associative indices. + *

+ * @return array An array indexed numerically (beginning with 0) or + * associatively (indexed by field name), or both. + * Each value in the array is represented as a + * string. Database NULL + * values are returned as &null;. + *

+ *

+ * false is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_array ($result, $row = null, $result_type = null) {} + +/** + * Fetch a row as an object + * @link http://www.php.net/manual/en/function.pg-fetch-object.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int[optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @param result_type int[optional]

+ * Ignored and deprecated. + *

+ * @return object An object with one attribute for each field + * name in the result. Database NULL + * values are returned as &null;. + *

+ *

+ * false is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_object ($result, $row = null, $result_type = null) {} + +/** + * Fetches all rows from a result as an array + * @link http://www.php.net/manual/en/function.pg-fetch-all.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return array An array with all rows in the result. Each row is an array + * of field values indexed by field name. + *

+ *

+ * false is returned if there are no rows in the result, or on any + * other error. + * + * @jms-builtin + */ +function pg_fetch_all ($result) {} + +/** + * Fetches all rows in a particular result column as an array + * @link http://www.php.net/manual/en/function.pg-fetch-all-columns.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param column int[optional]

+ * Column number, zero-based, to be retrieved from the result resource. Defaults + * to the first column if not specified. + *

+ * @return array An array with all values in the result column. + *

+ *

+ * false is returned if column is larger than the number + * of columns in the result, or on any other error. + * + * @jms-builtin + */ +function pg_fetch_all_columns ($result, $column = null) {} + +/** + * Returns number of affected records (tuples) + * @link http://www.php.net/manual/en/function.pg-affected-rows.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return int The number of rows affected by the query. If no tuple is + * affected, it will return 0. + * + * @jms-builtin + */ +function pg_affected_rows ($result) {} + +/** + * Get asynchronous query result + * @link http://www.php.net/manual/en/function.pg-get-result.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. + *

+ * @return resource The result resource, or false if no more results are available. + * + * @jms-builtin + */ +function pg_get_result ($connection = null) {} + +/** + * Set internal row offset in result resource + * @link http://www.php.net/manual/en/function.pg-result-seek.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param offset int

+ * Row to move the internal offset to in the result resource. + * Rows are numbered starting from zero. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_result_seek ($result, $offset) {} + +/** + * Get status of query result + * @link http://www.php.net/manual/en/function.pg-result-status.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param type int[optional]

+ * Either PGSQL_STATUS_LONG to return the numeric status + * of the result, or PGSQL_STATUS_STRING + * to return the command tag of the result. + * If not specified, PGSQL_STATUS_LONG is the default. + *

+ * @return mixed Possible return values are PGSQL_EMPTY_QUERY, + * PGSQL_COMMAND_OK, PGSQL_TUPLES_OK, PGSQL_COPY_OUT, + * PGSQL_COPY_IN, PGSQL_BAD_RESPONSE, PGSQL_NONFATAL_ERROR and + * PGSQL_FATAL_ERROR if PGSQL_STATUS_LONG is + * specified. Otherwise, a string containing the PostgreSQL command tag is returned. + * + * @jms-builtin + */ +function pg_result_status ($result, $type = null) {} + +/** + * Free result memory + * @link http://www.php.net/manual/en/function.pg-free-result.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_free_result ($result) {} + +/** + * Returns the last row's OID + * @link http://www.php.net/manual/en/function.pg-last-oid.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return string A string containing the OID assigned to the most recently inserted + * row in the specified connection, or false on error or + * no available OID. + * + * @jms-builtin + */ +function pg_last_oid ($result) {} + +/** + * Returns the number of rows in a result + * @link http://www.php.net/manual/en/function.pg-num-rows.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return int The number of rows in the result. On error, -1 is returned. + * + * @jms-builtin + */ +function pg_num_rows ($result) {} + +/** + * Returns the number of fields in a result + * @link http://www.php.net/manual/en/function.pg-num-fields.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return int The number of fields (columns) in the result. On error, -1 is returned. + * + * @jms-builtin + */ +function pg_num_fields ($result) {} + +/** + * Returns the name of a field + * @link http://www.php.net/manual/en/function.pg-field-name.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_number int

+ * Field number, starting from 0. + *

+ * @return string The field name, or false on error. + * + * @jms-builtin + */ +function pg_field_name ($result, $field_number) {} + +/** + * Returns the field number of the named field + * @link http://www.php.net/manual/en/function.pg-field-num.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_name string

+ * The name of the field. + *

+ * @return int The field number (numbered from 0), or -1 on error. + * + * @jms-builtin + */ +function pg_field_num ($result, $field_name) {} + +/** + * Returns the internal storage size of the named field + * @link http://www.php.net/manual/en/function.pg-field-size.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_number int

+ * Field number, starting from 0. + *

+ * @return int The internal field storage size (in bytes). -1 indicates a variable + * length field. false is returned on error. + * + * @jms-builtin + */ +function pg_field_size ($result, $field_number) {} + +/** + * Returns the type name for the corresponding field number + * @link http://www.php.net/manual/en/function.pg-field-type.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_number int

+ * Field number, starting from 0. + *

+ * @return string A string containing the base name of the field's type, or false + * on error. + * + * @jms-builtin + */ +function pg_field_type ($result, $field_number) {} + +/** + * Returns the type ID (OID) for the corresponding field number + * @link http://www.php.net/manual/en/function.pg-field-type-oid.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_number int

+ * Field number, starting from 0. + *

+ * @return int The OID of the field's base type. false is returned on error. + * + * @jms-builtin + */ +function pg_field_type_oid ($result, $field_number) {} + +/** + * Returns the printed length + * @link http://www.php.net/manual/en/function.pg-field-prtlen.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row_number int + * @param field_name_or_number mixed + * @return int The field printed length, or false on error. + * + * @jms-builtin + */ +function pg_field_prtlen ($result, $row_number, $field_name_or_number) {} + +/** + * Test if a field is SQL NULL + * @link http://www.php.net/manual/en/function.pg-field-is-null.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param row int

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * current row is fetched. + *

+ * @param field mixed

+ * Field number (starting from 0) as an integer or + * the field name as a string. + *

+ * @return int 1 if the field in the given row is SQL NULL, 0 + * if not. false is returned if the row is out of range, or upon any other error. + * + * @jms-builtin + */ +function pg_field_is_null ($result, $row, $field) {} + +/** + * Returns the name or oid of the tables field + * @link http://www.php.net/manual/en/function.pg-field-table.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param field_number int

+ * Field number, starting from 0. + *

+ * @param oid_only bool[optional]

+ * By default the tables name that field belongs to is returned but + * if oid_only is set to true, then the + * oid will instead be returned. + *

+ * @return mixed On success either the fields table name or oid. Or, false on failure. + * + * @jms-builtin + */ +function pg_field_table ($result, $field_number, $oid_only = null) {} + +/** + * Gets SQL NOTIFY message + * @link http://www.php.net/manual/en/function.pg-get-notify.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param result_type int[optional]

+ * An optional parameter that controls + * how the returned array is indexed. + * result_type is a constant and can take the + * following values: PGSQL_ASSOC, + * PGSQL_NUM and PGSQL_BOTH. + * Using PGSQL_NUM, pg_get_notify + * will return an array with numerical indices, using + * PGSQL_ASSOC it will return only associative indices + * while PGSQL_BOTH, the default, will return both + * numerical and associative indices. + *

+ * @return array An array containing the NOTIFY message name and backend PID. + * Otherwise if no NOTIFY is waiting, then false is returned. + * + * @jms-builtin + */ +function pg_get_notify ($connection, $result_type = null) {} + +/** + * Gets the backend's process ID + * @link http://www.php.net/manual/en/function.pg-get-pid.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return int The backend database process ID. + * + * @jms-builtin + */ +function pg_get_pid ($connection) {} + +/** + * Get error message associated with result + * @link http://www.php.net/manual/en/function.pg-result-error.php + * @param result resource

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return string a string if there is an error associated with the + * result parameter, false otherwise. + * + * @jms-builtin + */ +function pg_result_error ($result) {} + +/** + * Returns an individual field of an error report. + * @link http://www.php.net/manual/en/function.pg-result-error-field.php + * @param result resource

+ * A PostgreSQL query result resource from a previously executed + * statement. + *

+ * @param fieldcode int

+ * Possible fieldcode values are: PGSQL_DIAG_SEVERITY, + * PGSQL_DIAG_SQLSTATE, PGSQL_DIAG_MESSAGE_PRIMARY, + * PGSQL_DIAG_MESSAGE_DETAIL, + * PGSQL_DIAG_MESSAGE_HINT, PGSQL_DIAG_STATEMENT_POSITION, + * PGSQL_DIAG_INTERNAL_POSITION (PostgreSQL 8.0+ only), + * PGSQL_DIAG_INTERNAL_QUERY (PostgreSQL 8.0+ only), + * PGSQL_DIAG_CONTEXT, PGSQL_DIAG_SOURCE_FILE, + * PGSQL_DIAG_SOURCE_LINE or + * PGSQL_DIAG_SOURCE_FUNCTION. + *

+ * @return string A string containing the contents of the error field, &null; if the field does not exist or false + * on failure. + * + * @jms-builtin + */ +function pg_result_error_field ($result, $fieldcode) {} + +/** + * Get the last error message string of a connection + * @link http://www.php.net/manual/en/function.pg-last-error.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the last error message on the + * given connection, or false on error. + * + * @jms-builtin + */ +function pg_last_error ($connection = null) {} + +/** + * Returns the last notice message from PostgreSQL server + * @link http://www.php.net/manual/en/function.pg-last-notice.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @return string A string containing the last notice on the + * given connection, or false on error. + * + * @jms-builtin + */ +function pg_last_notice ($connection) {} + +/** + * Send a NULL-terminated string to PostgreSQL backend + * @link http://www.php.net/manual/en/function.pg-put-line.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param data string

+ * A line of text to be sent directly to the PostgreSQL backend. A NULL + * terminator is added automatically. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_put_line ($connection = null, $data) {} + +/** + * Sync with PostgreSQL backend + * @link http://www.php.net/manual/en/function.pg-end-copy.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_end_copy ($connection = null) {} + +/** + * Copy a table to an array + * @link http://www.php.net/manual/en/function.pg-copy-to.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table from which to copy the data into rows. + *

+ * @param delimiter string[optional]

+ * The token that separates values for each field in each element of + * rows. Default is TAB. + *

+ * @param null_as string[optional]

+ * How SQL NULL values are represented in the + * rows. Default is \N ("\\N"). + *

+ * @return array An array with one element for each line of COPY data. + * It returns false on failure. + * + * @jms-builtin + */ +function pg_copy_to ($connection, $table_name, $delimiter = null, $null_as = null) {} + +/** + * Insert records into a table from an array + * @link http://www.php.net/manual/en/function.pg-copy-from.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table into which to copy the rows. + *

+ * @param rows array

+ * An array of data to be copied into table_name. + * Each value in rows becomes a row in table_name. + * Each value in rows should be a delimited string of the values + * to insert into each field. Values should be linefeed terminated. + *

+ * @param delimiter string[optional]

+ * The token that separates values for each field in each element of + * rows. Default is TAB. + *

+ * @param null_as string[optional]

+ * How SQL NULL values are represented in the + * rows. Default is \N ("\\N"). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_copy_from ($connection, $table_name, array $rows, $delimiter = null, $null_as = null) {} + +/** + * Enable tracing a PostgreSQL connection + * @link http://www.php.net/manual/en/function.pg-trace.php + * @param pathname string

+ * An optional file access mode, same as for fopen. + *

+ * @param mode string[optional] + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_trace ($pathname, $mode = null, $connection = null) {} + +/** + * Disable tracing of a PostgreSQL connection + * @link http://www.php.net/manual/en/function.pg-untrace.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Always returns true. + * + * @jms-builtin + */ +function pg_untrace ($connection = null) {} + +/** + * Create a large object + * @link http://www.php.net/manual/en/function.pg-lo-create.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param object_id mixed[optional]

+ * If an object_id is given the function + * will try to create a large object with this id, else a free + * object id is assigned by the server. The parameter + * was added in PHP 5.3 and relies on functionality that first + * appeared in PostgreSQL 8.1. + *

+ * @return int A large object OID or false on error. + * + * @jms-builtin + */ +function pg_lo_create ($connection = null, $object_id = null) {} + +/** + * Delete a large object + * @link http://www.php.net/manual/en/function.pg-lo-unlink.php + * @param connection resource

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param oid int

+ * The OID of the large object in the database. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_lo_unlink ($connection, $oid) {} + +/** + * Open a large object + * @link http://www.php.net/manual/en/function.pg-lo-open.php + * @param connection resource

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param oid int

+ * The OID of the large object in the database. + *

+ * @param mode string

+ * Can be either "r" for read-only, "w" for write only or "rw" for read and + * write. + *

+ * @return resource A large object resource or false on error. + * + * @jms-builtin + */ +function pg_lo_open ($connection, $oid, $mode) {} + +/** + * Close a large object + * @link http://www.php.net/manual/en/function.pg-lo-close.php + * @param large_object resource + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_lo_close ($large_object) {} + +/** + * Read a large object + * @link http://www.php.net/manual/en/function.pg-lo-read.php + * @param large_object resource

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @param len int[optional]

+ * An optional maximum number of bytes to return. + *

+ * @return string A string containing len bytes from the + * large object, or false on error. + * + * @jms-builtin + */ +function pg_lo_read ($large_object, $len = null) {} + +/** + * Write to a large object + * @link http://www.php.net/manual/en/function.pg-lo-write.php + * @param large_object resource

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @param data string

+ * The data to be written to the large object. If len is + * specified and is less than the length of data, only + * len bytes will be written. + *

+ * @param len int[optional]

+ * An optional maximum number of bytes to write. Must be greater than zero + * and no greater than the length of data. Defaults to + * the length of data. + *

+ * @return int The number of bytes written to the large object, or false on error. + * + * @jms-builtin + */ +function pg_lo_write ($large_object, $data, $len = null) {} + +/** + * Reads an entire large object and send straight to browser + * @link http://www.php.net/manual/en/function.pg-lo-read-all.php + * @param large_object resource

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @return int Number of bytes read or false on error. + * + * @jms-builtin + */ +function pg_lo_read_all ($large_object) {} + +/** + * Import a large object from file + * @link http://www.php.net/manual/en/function.pg-lo-import.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param pathname string

+ * The full path and file name of the file on the client + * filesystem from which to read the large object data. + *

+ * @param object_id mixed[optional]

+ * If an object_id is given the function + * will try to create a large object with this id, else a free + * object id is assigned by the server. The parameter + * was added in PHP 5.3 and relies on functionality that first + * appeared in PostgreSQL 8.1. + *

+ * @return int The OID of the newly created large object, or + * false on failure. + * + * @jms-builtin + */ +function pg_lo_import ($connection = null, $pathname, $object_id = null) {} + +/** + * Export a large object to file + * @link http://www.php.net/manual/en/function.pg-lo-export.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param oid int

+ * The OID of the large object in the database. + *

+ * @param pathname string

+ * The full path and file name of the file in which to write the + * large object on the client filesystem. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_lo_export ($connection = null, $oid, $pathname) {} + +/** + * Seeks position within a large object + * @link http://www.php.net/manual/en/function.pg-lo-seek.php + * @param large_object resource

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @param offset int

+ * The number of bytes to seek. + *

+ * @param whence int[optional]

+ * One of the constants PGSQL_SEEK_SET (seek from object start), + * PGSQL_SEEK_CUR (seek from current position) + * or PGSQL_SEEK_END (seek from object end) . + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function pg_lo_seek ($large_object, $offset, $whence = null) {} + +/** + * Returns current seek position a of large object + * @link http://www.php.net/manual/en/function.pg-lo-tell.php + * @param large_object resource

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @return int The current seek offset (in number of bytes) from the beginning of the large + * object. If there is an error, the return value is negative. + * + * @jms-builtin + */ +function pg_lo_tell ($large_object) {} + +/** + * Escape a string for insertion into a text field + * @link http://www.php.net/manual/en/function.pg-escape-string.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param data string

+ * A string containing text to be escaped. + *

+ * @return string A string containing the escaped data. + * + * @jms-builtin + */ +function pg_escape_string ($connection = null, $data) {} + +/** + * Escape a string for insertion into a bytea field + * @link http://www.php.net/manual/en/function.pg-escape-bytea.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param data string

+ * A string containing text or binary data to be inserted into a bytea + * column. + *

+ * @return string A string containing the escaped data. + * + * @jms-builtin + */ +function pg_escape_bytea ($connection = null, $data) {} + +/** + * Unescape binary for bytea type + * @link http://www.php.net/manual/en/function.pg-unescape-bytea.php + * @param data string

+ * A string containing PostgreSQL bytea data to be converted into + * a PHP binary string. + *

+ * @return string A string containing the unescaped data. + * + * @jms-builtin + */ +function pg_unescape_bytea ($data) {} + +/** + * Determines the verbosity of messages returned by pg_last_error + and pg_result_error. + * @link http://www.php.net/manual/en/function.pg-set-error-verbosity.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param verbosity int

+ * The required verbosity: PGSQL_ERRORS_TERSE, + * PGSQL_ERRORS_DEFAULT + * or PGSQL_ERRORS_VERBOSE. + *

+ * @return int The previous verbosity level: PGSQL_ERRORS_TERSE, + * PGSQL_ERRORS_DEFAULT + * or PGSQL_ERRORS_VERBOSE. + * + * @jms-builtin + */ +function pg_set_error_verbosity ($connection = null, $verbosity) {} + +/** + * Gets the client encoding + * @link http://www.php.net/manual/en/function.pg-client-encoding.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string The client encoding, or false on error. + * + * @jms-builtin + */ +function pg_client_encoding ($connection = null) {} + +/** + * Set the client encoding + * @link http://www.php.net/manual/en/function.pg-set-client-encoding.php + * @param connection resource[optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param encoding string

+ * The required client encoding. One of SQL_ASCII, EUC_JP, + * EUC_CN, EUC_KR, EUC_TW, + * UNICODE, MULE_INTERNAL, LATINX (X=1...9), + * KOI8, WIN, ALT, SJIS, + * BIG5 or WIN1250. + *

+ *

+ * The exact list of available encodings depends on your PostgreSQL version, so check your + * PostgreSQL manual for a more specific list. + *

+ * @return int 0 on success or -1 on error. + * + * @jms-builtin + */ +function pg_set_client_encoding ($connection = null, $encoding) {} + +/** + * Get meta data for table + * @link http://www.php.net/manual/en/function.pg-meta-data.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * The name of the table. + *

+ * @return array An array of the table definition, or false on error. + * + * @jms-builtin + */ +function pg_meta_data ($connection, $table_name) {} + +/** + * Convert associative array values into suitable for SQL statement + * @link http://www.php.net/manual/en/function.pg-convert.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table against which to convert types. + *

+ * @param assoc_array array

+ * Data to be converted. + *

+ * @param options int[optional]

+ * Any number of PGSQL_CONV_IGNORE_DEFAULT, + * PGSQL_CONV_FORCE_NULL or + * PGSQL_CONV_IGNORE_NOT_NULL, combined. + *

+ * @return array An array of converted values, or false on error. + * + * @jms-builtin + */ +function pg_convert ($connection, $table_name, array $assoc_array, $options = null) {} + +/** + * Insert array into table + * @link http://www.php.net/manual/en/function.pg-insert.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table into which to insert rows. The table table_name must at least + * have as many columns as assoc_array has elements. + *

+ * @param assoc_array array

+ * An array whose keys are field names in the table table_name, + * and whose values are the values of those fields that are to be inserted. + *

+ * @param options int[optional]

+ * Any number of PGSQL_CONV_OPTS, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC, + * PGSQL_DML_ASYNC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed Returns true on success or false on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * + * @jms-builtin + */ +function pg_insert ($connection, $table_name, array $assoc_array, $options = null) {} + +/** + * Update table + * @link http://www.php.net/manual/en/function.pg-update.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table into which to update rows. + *

+ * @param data array

+ * An array whose keys are field names in the table table_name, + * and whose values are what matched rows are to be updated to. + *

+ * @param condition array

+ * An array whose keys are field names in the table table_name, + * and whose values are the conditions that a row must meet to be updated. + *

+ * @param options int[optional]

+ * Any number of PGSQL_CONV_OPTS, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed Returns true on success or false on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * + * @jms-builtin + */ +function pg_update ($connection, $table_name, array $data, array $condition, $options = null) {} + +/** + * Deletes records + * @link http://www.php.net/manual/en/function.pg-delete.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table from which to delete rows. + *

+ * @param assoc_array array

+ * An array whose keys are field names in the table table_name, + * and whose values are the values of those fields that are to be deleted. + *

+ * @param options int[optional]

+ * Any number of PGSQL_CONV_FORCE_NULL, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed Returns true on success or false on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * + * @jms-builtin + */ +function pg_delete ($connection, $table_name, array $assoc_array, $options = null) {} + +/** + * Select records + * @link http://www.php.net/manual/en/function.pg-select.php + * @param connection resource

+ * PostgreSQL database connection resource. + *

+ * @param table_name string

+ * Name of the table from which to select rows. + *

+ * @param assoc_array array

+ * An array whose keys are field names in the table table_name, + * and whose values are the conditions that a row must meet to be retrieved. + *

+ * @param options int[optional]

+ * Any number of PGSQL_CONV_FORCE_NULL, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC, + * PGSQL_DML_ASYNC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed Returns true on success or false on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * + * @jms-builtin + */ +function pg_select ($connection, $table_name, array $assoc_array, $options = null) {} + +/** + * @param connection[optional] + * @param query[optional] + * + * @jms-builtin + */ +function pg_exec ($connection, $query) {} + +/** + * @param result + * + * @jms-builtin + */ +function pg_getlastoid ($result) {} + +/** + * @param result + * + * @jms-builtin + */ +function pg_cmdtuples ($result) {} + +/** + * @param connection[optional] + * + * @jms-builtin + */ +function pg_errormessage ($connection) {} + +/** + * @param result + * + * @jms-builtin + */ +function pg_numrows ($result) {} + +/** + * @param result + * + * @jms-builtin + */ +function pg_numfields ($result) {} + +/** + * @param result + * @param field_number + * + * @jms-builtin + */ +function pg_fieldname ($result, $field_number) {} + +/** + * @param result + * @param field_number + * + * @jms-builtin + */ +function pg_fieldsize ($result, $field_number) {} + +/** + * @param result + * @param field_number + * + * @jms-builtin + */ +function pg_fieldtype ($result, $field_number) {} + +/** + * @param result + * @param field_name + * + * @jms-builtin + */ +function pg_fieldnum ($result, $field_name) {} + +/** + * @param result + * @param row[optional] + * @param field_name_or_number[optional] + * + * @jms-builtin + */ +function pg_fieldprtlen ($result, $row, $field_name_or_number) {} + +/** + * @param result + * @param row[optional] + * @param field_name_or_number[optional] + * + * @jms-builtin + */ +function pg_fieldisnull ($result, $row, $field_name_or_number) {} + +/** + * @param result + * + * @jms-builtin + */ +function pg_freeresult ($result) {} + +/** + * @param connection + * + * @jms-builtin + */ +function pg_result ($connection) {} + +/** + * @param large_object + * + * @jms-builtin + */ +function pg_loreadall ($large_object) {} + +/** + * @param connection[optional] + * @param large_object_id[optional] + * + * @jms-builtin + */ +function pg_locreate ($connection, $large_object_id) {} + +/** + * @param connection[optional] + * @param large_object_oid[optional] + * + * @jms-builtin + */ +function pg_lounlink ($connection, $large_object_oid) {} + +/** + * @param connection[optional] + * @param large_object_oid[optional] + * @param mode[optional] + * + * @jms-builtin + */ +function pg_loopen ($connection, $large_object_oid, $mode) {} + +/** + * @param large_object + * + * @jms-builtin + */ +function pg_loclose ($large_object) {} + +/** + * @param large_object + * @param len[optional] + * + * @jms-builtin + */ +function pg_loread ($large_object, $len) {} + +/** + * @param large_object + * @param buf + * @param len[optional] + * + * @jms-builtin + */ +function pg_lowrite ($large_object, $buf, $len) {} + +/** + * @param connection[optional] + * @param filename[optional] + * @param large_object_oid[optional] + * + * @jms-builtin + */ +function pg_loimport ($connection, $filename, $large_object_oid) {} + +/** + * @param connection[optional] + * @param objoid[optional] + * @param filename[optional] + * + * @jms-builtin + */ +function pg_loexport ($connection, $objoid, $filename) {} + +/** + * @param connection[optional] + * + * @jms-builtin + */ +function pg_clientencoding ($connection) {} + +/** + * @param connection[optional] + * @param encoding[optional] + * + * @jms-builtin + */ +function pg_setclientencoding ($connection, $encoding) {} + + +/** + * Passed to pg_connect to force the creation of a new connection, + * rather then re-using an existing identical connection. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONNECT_FORCE_NEW', 2); + +/** + * Passed to pg_fetch_array. Return an associative array of field + * names and values. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ASSOC', 1); + +/** + * Passed to pg_fetch_array. Return a numerically indexed array of field + * numbers and values. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_NUM', 2); + +/** + * Passed to pg_fetch_array. Return an array of field values + * that is both numerically indexed (by field number) and associated (by field name). + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_BOTH', 3); + +/** + * Returned by pg_connection_status indicating that the database + * connection is in an invalid state. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONNECTION_BAD', 1); + +/** + * Returned by pg_connection_status indicating that the database + * connection is in a valid state. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONNECTION_OK', 0); + +/** + * Returned by pg_transaction_status. Connection is + * currently idle, not in a transaction. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_IDLE', 0); + +/** + * Returned by pg_transaction_status. A command + * is in progress on the connection. A query has been sent via the connection + * and not yet completed. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_ACTIVE', 1); + +/** + * Returned by pg_transaction_status. The connection + * is idle, in a transaction block. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_INTRANS', 2); + +/** + * Returned by pg_transaction_status. The connection + * is idle, in a failed transaction block. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_INERROR', 3); + +/** + * Returned by pg_transaction_status. The connection + * is bad. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_UNKNOWN', 4); + +/** + * Passed to pg_set_error_verbosity. + * Specified that returned messages include severity, primary text, + * and position only; this will normally fit on a single line. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ERRORS_TERSE', 0); + +/** + * Passed to pg_set_error_verbosity. + * The default mode produces messages that include the above + * plus any detail, hint, or context fields (these may span + * multiple lines). + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ERRORS_DEFAULT', 1); + +/** + * Passed to pg_set_error_verbosity. + * The verbose mode includes all available fields. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ERRORS_VERBOSE', 2); + +/** + * Passed to pg_lo_seek. Seek operation is to begin + * from the start of the object. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_SEEK_SET', 0); + +/** + * Passed to pg_lo_seek. Seek operation is to begin + * from the current position. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_SEEK_CUR', 1); + +/** + * Passed to pg_lo_seek. Seek operation is to begin + * from the end of the object. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_SEEK_END', 2); + +/** + * Passed to pg_result_status. Indicates that + * numerical result code is desired. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_STATUS_LONG', 1); + +/** + * Passed to pg_result_status. Indicates that + * textual result command tag is desired. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_STATUS_STRING', 2); + +/** + * Returned by pg_result_status. The string sent to the server + * was empty. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_EMPTY_QUERY', 0); + +/** + * Returned by pg_result_status. Successful completion of a + * command returning no data. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_COMMAND_OK', 1); + +/** + * Returned by pg_result_status. Successful completion of a command + * returning data (such as a SELECT or SHOW). + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TUPLES_OK', 2); + +/** + * Returned by pg_result_status. Copy Out (from server) data + * transfer started. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_COPY_OUT', 3); + +/** + * Returned by pg_result_status. Copy In (to server) data + * transfer started. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_COPY_IN', 4); + +/** + * Returned by pg_result_status. The server's response + * was not understood. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_BAD_RESPONSE', 5); + +/** + * Returned by pg_result_status. A nonfatal error + * (a notice or warning) occurred. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_NONFATAL_ERROR', 6); + +/** + * Returned by pg_result_status. A fatal error + * occurred. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_FATAL_ERROR', 7); + +/** + * Passed to pg_result_error_field. + * The severity; the field contents are ERROR, + * FATAL, or PANIC (in an error message), or + * WARNING, NOTICE, DEBUG, + * INFO, or LOG (in a notice message), or a localized + * translation of one of these. Always present. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SEVERITY', 83); + +/** + * Passed to pg_result_error_field. + * The SQLSTATE code for the error. The SQLSTATE code identifies the type of error + * that has occurred; it can be used by front-end applications to perform specific + * operations (such as error handling) in response to a particular database error. + * This field is not localizable, and is always present. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SQLSTATE', 67); + +/** + * Passed to pg_result_error_field. + * The primary human-readable error message (typically one line). Always present. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_MESSAGE_PRIMARY', 77); + +/** + * Passed to pg_result_error_field. + * Detail: an optional secondary error message carrying more detail about the problem. May run to multiple lines. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_MESSAGE_DETAIL', 68); + +/** + * Passed to pg_result_error_field. + * Hint: an optional suggestion what to do about the problem. This is intended to differ from detail in that it + * offers advice (potentially inappropriate) rather than hard facts. May run to multiple lines. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_MESSAGE_HINT', 72); + +/** + * Passed to pg_result_error_field. + * A string containing a decimal integer indicating an error cursor position as an index into the original + * statement string. The first character has index 1, and positions are measured in characters not bytes. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_STATEMENT_POSITION', 80); + +/** + * Passed to pg_result_error_field. + * This is defined the same as the PG_DIAG_STATEMENT_POSITION field, but + * it is used when the cursor position refers to an internally generated + * command rather than the one submitted by the client. The + * PG_DIAG_INTERNAL_QUERY field will always appear when this + * field appears. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_INTERNAL_POSITION', 112); + +/** + * Passed to pg_result_error_field. + * The text of a failed internally-generated command. This could be, for example, a + * SQL query issued by a PL/pgSQL function. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_INTERNAL_QUERY', 113); + +/** + * Passed to pg_result_error_field. + * An indication of the context in which the error occurred. Presently + * this includes a call stack traceback of active procedural language + * functions and internally-generated queries. The trace is one entry + * per line, most recent first. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_CONTEXT', 87); + +/** + * Passed to pg_result_error_field. + * The file name of the PostgreSQL source-code location where the error + * was reported. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SOURCE_FILE', 70); + +/** + * Passed to pg_result_error_field. + * The line number of the PostgreSQL source-code location where the + * error was reported. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SOURCE_LINE', 76); + +/** + * Passed to pg_result_error_field. + * The name of the PostgreSQL source-code function reporting the error. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SOURCE_FUNCTION', 82); + +/** + * Passed to pg_convert. + * Ignore conversion of &null; into SQL NOT NULL columns. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONV_IGNORE_DEFAULT', 2); + +/** + * Passed to pg_convert. + * Use SQL NULL in place of an empty string. + * @link http://www.php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONV_FORCE_NULL', 4); +define ('PGSQL_CONV_IGNORE_NOT_NULL', 8); +define ('PGSQL_DML_NO_CONV', 256); +define ('PGSQL_DML_EXEC', 512); +define ('PGSQL_DML_ASYNC', 1024); +define ('PGSQL_DML_STRING', 2048); + +// End of pgsql v. +?> diff --git a/res/php-5.3-core-api/posix.php b/res/php-5.3-core-api/posix.php new file mode 100644 index 0000000..7eaaa22 --- /dev/null +++ b/res/php-5.3-core-api/posix.php @@ -0,0 +1,798 @@ + + * The process identifier. + *

+ * @param sig int

+ * One of the PCNTL signals constants. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_kill ($pid, $sig) {} + +/** + * Return the current process identifier + * @link http://www.php.net/manual/en/function.posix-getpid.php + * @return int the identifier, as an integer. + * + * @jms-builtin + */ +function posix_getpid () {} + +/** + * Return the parent process identifier + * @link http://www.php.net/manual/en/function.posix-getppid.php + * @return int the identifier, as an integer. + * + * @jms-builtin + */ +function posix_getppid () {} + +/** + * Return the real user ID of the current process + * @link http://www.php.net/manual/en/function.posix-getuid.php + * @return int the user id, as an integer + * + * @jms-builtin + */ +function posix_getuid () {} + +/** + * Set the UID of the current process + * @link http://www.php.net/manual/en/function.posix-setuid.php + * @param uid int

+ * The user id. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_setuid ($uid) {} + +/** + * Return the effective user ID of the current process + * @link http://www.php.net/manual/en/function.posix-geteuid.php + * @return int the user id, as an integer + * + * @jms-builtin + */ +function posix_geteuid () {} + +/** + * Set the effective UID of the current process + * @link http://www.php.net/manual/en/function.posix-seteuid.php + * @param uid int

+ * The user id. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_seteuid ($uid) {} + +/** + * Return the real group ID of the current process + * @link http://www.php.net/manual/en/function.posix-getgid.php + * @return int the real group id, as an integer. + * + * @jms-builtin + */ +function posix_getgid () {} + +/** + * Set the GID of the current process + * @link http://www.php.net/manual/en/function.posix-setgid.php + * @param gid int

+ * The group id. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_setgid ($gid) {} + +/** + * Return the effective group ID of the current process + * @link http://www.php.net/manual/en/function.posix-getegid.php + * @return int an integer of the effective group ID. + * + * @jms-builtin + */ +function posix_getegid () {} + +/** + * Set the effective GID of the current process + * @link http://www.php.net/manual/en/function.posix-setegid.php + * @param gid int

+ * The group id. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_setegid ($gid) {} + +/** + * Return the group set of the current process + * @link http://www.php.net/manual/en/function.posix-getgroups.php + * @return array an array of integers containing the numeric group ids of the group + * set of the current process. + * + * @jms-builtin + */ +function posix_getgroups () {} + +/** + * Return login name + * @link http://www.php.net/manual/en/function.posix-getlogin.php + * @return string the login name of the user, as a string. + * + * @jms-builtin + */ +function posix_getlogin () {} + +/** + * Return the current process group identifier + * @link http://www.php.net/manual/en/function.posix-getpgrp.php + * @return int the identifier, as an integer. + * + * @jms-builtin + */ +function posix_getpgrp () {} + +/** + * Make the current process a session leader + * @link http://www.php.net/manual/en/function.posix-setsid.php + * @return int the session id, or -1 on errors. + * + * @jms-builtin + */ +function posix_setsid () {} + +/** + * Set process group id for job control + * @link http://www.php.net/manual/en/function.posix-setpgid.php + * @param pid int

+ * The process id. + *

+ * @param pgid int

+ * The process group id. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_setpgid ($pid, $pgid) {} + +/** + * Get process group id for job control + * @link http://www.php.net/manual/en/function.posix-getpgid.php + * @param pid int

+ * The process id. + *

+ * @return int the identifier, as an integer. + * + * @jms-builtin + */ +function posix_getpgid ($pid) {} + +/** + * Get the current sid of the process + * @link http://www.php.net/manual/en/function.posix-getsid.php + * @param pid int

+ * The process identifier. If set to 0, the current process is + * assumed. If an invalid pid is + * specified, then false is returned and an error is set which + * can be checked with posix_get_last_error. + *

+ * @return int the identifier, as an integer. + * + * @jms-builtin + */ +function posix_getsid ($pid) {} + +/** + * Get system name + * @link http://www.php.net/manual/en/function.posix-uname.php + * @return array a hash of strings with information about the + * system. The indices of the hash are + * sysname - operating system name (e.g. Linux) + * nodename - system name (e.g. valiant) + * release - operating system release (e.g. 2.2.10) + * version - operating system version (e.g. #4 Tue Jul 20 + * 17:01:36 MEST 1999) + * machine - system architecture (e.g. i586) + * domainname - DNS domainname (e.g. example.com) + *

+ *

+ * domainname is a GNU extension and not part of POSIX.1, so this + * field is only available on GNU systems or when using the GNU + * libc. + * + * @jms-builtin + */ +function posix_uname () {} + +/** + * Get process times + * @link http://www.php.net/manual/en/function.posix-times.php + * @return array a hash of strings with information about the current + * process CPU usage. The indices of the hash are: + * ticks - the number of clock ticks that have elapsed since + * reboot. + * utime - user time used by the current process. + * stime - system time used by the current process. + * cutime - user time used by current process and children. + * cstime - system time used by current process and children. + * + * @jms-builtin + */ +function posix_times () {} + +/** + * Get path name of controlling terminal + * @link http://www.php.net/manual/en/function.posix-ctermid.php + * @return string Upon successful completion, returns string of the pathname to + * the current controlling terminal. Otherwise false is returned and errno + * is set, which can be checked with posix_get_last_error. + * + * @jms-builtin + */ +function posix_ctermid () {} + +/** + * Determine terminal device name + * @link http://www.php.net/manual/en/function.posix-ttyname.php + * @param fd int

+ * The file descriptor. + *

+ * @return string On success, returns a string of the absolute path of the + * fd. On failure, returns false + * + * @jms-builtin + */ +function posix_ttyname ($fd) {} + +/** + * Determine if a file descriptor is an interactive terminal + * @link http://www.php.net/manual/en/function.posix-isatty.php + * @param fd int

+ * The file descriptor. + *

+ * @return bool true if fd is an open descriptor connected + * to a terminal and false otherwise. + * + * @jms-builtin + */ +function posix_isatty ($fd) {} + +/** + * Pathname of current directory + * @link http://www.php.net/manual/en/function.posix-getcwd.php + * @return string a string of the absolute pathname on success. + * On error, returns false and sets errno which can be checked with + * posix_get_last_error. + * + * @jms-builtin + */ +function posix_getcwd () {} + +/** + * Create a fifo special file (a named pipe) + * @link http://www.php.net/manual/en/function.posix-mkfifo.php + * @param pathname string

+ * Path to the FIFO file. + *

+ * @param mode int

+ * The second parameter mode has to be given in + * octal notation (e.g. 0644). The permission of the newly created + * FIFO also depends on the setting of the current + * umask. The permissions of the created file are + * (mode & ~umask). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_mkfifo ($pathname, $mode) {} + +/** + * Create a special or ordinary file (POSIX.1) + * @link http://www.php.net/manual/en/function.posix-mknod.php + * @param pathname string

+ * The file to create + *

+ * @param mode int

+ * This parameter is constructed by a bitwise OR between file type (one of + * the following constants: POSIX_S_IFREG, + * POSIX_S_IFCHR, POSIX_S_IFBLK, + * POSIX_S_IFIFO or + * POSIX_S_IFSOCK) and permissions. + *

+ * @param major int[optional]

+ * The major device kernel identifier (required to pass when using + * S_IFCHR or S_IFBLK). + *

+ * @param minor int[optional]

+ * The minor device kernel identifier. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_mknod ($pathname, $mode, $major = null, $minor = null) {} + +/** + * Determine accessibility of a file + * @link http://www.php.net/manual/en/function.posix-access.php + * @param file string

+ * The name of the file to be tested. + *

+ * @param mode int[optional]

+ * A mask consisting of one or more of POSIX_F_OK, + * POSIX_R_OK, POSIX_W_OK and + * POSIX_X_OK. + *

+ *

+ * POSIX_R_OK, POSIX_W_OK and + * POSIX_X_OK request checking whether the file + * exists and has read, write and execute permissions, respectively. + * POSIX_F_OK just requests checking for the + * existence of the file. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_access ($file, $mode = null) {} + +/** + * Return info about a group by name + * @link http://www.php.net/manual/en/function.posix-getgrnam.php + * @param name string

The name of the group

+ * @return array The array elements returned are: + * + * The group information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the name of the group. This is + * a short, usually less than 16 character "handle" of the + * group, not the real, full name. This should be the same as + * the name parameter used when + * calling the function, and hence redundant. + *
passwd + * The passwd element contains the group's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
gid + * Group ID of the group in numeric form. + *
members + * This consists of an array of + * string's for all the members in the group. + *
+ * + * @jms-builtin + */ +function posix_getgrnam ($name) {} + +/** + * Return info about a group by group id + * @link http://www.php.net/manual/en/function.posix-getgrgid.php + * @param gid int

+ * The group id. + *

+ * @return array The array elements returned are: + * + * The group information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the name of the group. This is + * a short, usually less than 16 character "handle" of the + * group, not the real, full name. + *
passwd + * The passwd element contains the group's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
gid + * Group ID, should be the same as the + * gid parameter used when calling the + * function, and hence redundant. + *
members + * This consists of an array of + * string's for all the members in the group. + *
+ * + * @jms-builtin + */ +function posix_getgrgid ($gid) {} + +/** + * Return info about a user by username + * @link http://www.php.net/manual/en/function.posix-getpwnam.php + * @param username string

+ * An alphanumeric username. + *

+ * @return array On success an array with the following elements is returned, else + * false is returned: + * + * The user information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the username of the user. This is + * a short, usually less than 16 character "handle" of the + * user, not the real, full name. This should be the same as + * the username parameter used when + * calling the function, and hence redundant. + *
passwd + * The passwd element contains the user's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
uid + * User ID of the user in numeric form. + *
gid + * The group ID of the user. Use the function + * posix_getgrgid to resolve the group + * name and a list of its members. + *
gecos + * GECOS is an obsolete term that refers to the finger + * information field on a Honeywell batch processing system. + * The field, however, lives on, and its contents have been + * formalized by POSIX. The field contains a comma separated + * list containing the user's full name, office phone, office + * number, and home phone number. On most systems, only the + * user's full name is available. + *
dir + * This element contains the absolute path to the home + * directory of the user. + *
shell + * The shell element contains the absolute path to the + * executable of the user's default shell. + *
+ * + * @jms-builtin + */ +function posix_getpwnam ($username) {} + +/** + * Return info about a user by user id + * @link http://www.php.net/manual/en/function.posix-getpwuid.php + * @param uid int

+ * The user identifier. + *

+ * @return array an associative array with the following elements: + * + * The user information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the username of the user. This is + * a short, usually less than 16 character "handle" of the + * user, not the real, full name. + *
passwd + * The passwd element contains the user's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
uid + * User ID, should be the same as the + * uid parameter used when calling the + * function, and hence redundant. + *
gid + * The group ID of the user. Use the function + * posix_getgrgid to resolve the group + * name and a list of its members. + *
gecos + * GECOS is an obsolete term that refers to the finger + * information field on a Honeywell batch processing system. + * The field, however, lives on, and its contents have been + * formalized by POSIX. The field contains a comma separated + * list containing the user's full name, office phone, office + * number, and home phone number. On most systems, only the + * user's full name is available. + *
dir + * This element contains the absolute path to the + * home directory of the user. + *
shell + * The shell element contains the absolute path to the + * executable of the user's default shell. + *
+ * + * @jms-builtin + */ +function posix_getpwuid ($uid) {} + +/** + * Return info about system resource limits + * @link http://www.php.net/manual/en/function.posix-getrlimit.php + * @return array an associative array of elements for each + * limit that is defined. Each limit has a soft and a hard limit. + * + * List of possible limits returned + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Limit nameLimit description
core + * The maximum size of the core file. When 0, not core files are + * created. When core files are larger than this size, they will + * be truncated at this size. + *
totalmem + * The maximum size of the memory of the process, in bytes. + *
virtualmem + * The maximum size of the virtual memory for the process, in bytes. + *
data + * The maximum size of the data segment for the process, in bytes. + *
stack + * The maximum size of the process stack, in bytes. + *
rss + * The maximum number of virtual pages resident in RAM + *
maxproc + * The maximum number of processes that can be created for the + * real user ID of the calling process. + *
memlock + * The maximum number of bytes of memory that may be locked into RAM. + *
cpu + * The amount of time the process is allowed to use the CPU. + *
filesize + * The maximum size of the data segment for the process, in bytes. + *
openfiles + * One more than the maximum number of open file descriptors. + *
+ * + * @jms-builtin + */ +function posix_getrlimit () {} + +/** + * Retrieve the error number set by the last posix function that failed + * @link http://www.php.net/manual/en/function.posix-get-last-error.php + * @return int the errno (error number) set by the last posix function that + * failed. If no errors exist, 0 is returned. + * + * @jms-builtin + */ +function posix_get_last_error () {} + +/** + * &Alias; posix_get_last_error + * @link http://www.php.net/manual/en/function.posix-errno.php + * + * @jms-builtin + */ +function posix_errno () {} + +/** + * Retrieve the system error message associated with the given errno + * @link http://www.php.net/manual/en/function.posix-strerror.php + * @param errno int

+ * A POSIX error number, returned by + * posix_get_last_error. If set to 0, then the + * string "Success" is returned. + *

+ * @return string the error message, as a string. + * + * @jms-builtin + */ +function posix_strerror ($errno) {} + +/** + * Calculate the group access list + * @link http://www.php.net/manual/en/function.posix-initgroups.php + * @param name string

+ * The user to calculate the list for. + *

+ * @param base_group_id int

+ * Typically the group number from the password file. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function posix_initgroups ($name, $base_group_id) {} + + +/** + * Check whether the file exists. + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_F_OK', 0); + +/** + * Check whether the file exists and has execute permissions. + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_X_OK', 1); + +/** + * Check whether the file exists and has write permissions. + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_W_OK', 2); + +/** + * Check whether the file exists and has read permissions. + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_R_OK', 4); + +/** + * Normal file + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFREG', 32768); + +/** + * Character special file + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFCHR', 8192); + +/** + * Block special file + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFBLK', 24576); + +/** + * FIFO (named pipe) special file + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFIFO', 4096); + +/** + * Socket + * @link http://www.php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFSOCK', 49152); + +// End of posix v. +?> diff --git a/res/php-5.3-core-api/session.php b/res/php-5.3-core-api/session.php new file mode 100644 index 0000000..037a5b0 --- /dev/null +++ b/res/php-5.3-core-api/session.php @@ -0,0 +1,360 @@ + + * The session name references the session id in cookies and URLs. It + * should contain only alphanumeric characters; it should be short and + * descriptive (i.e. for users with enabled cookie warnings). + * If name is specified, the name of the current + * session is changed to its value. + *

+ *

+ *

+ * The session name can't consist of digits only, at least one letter + * must be present. Otherwise a new session id is generated every time. + *

+ *

+ * @return string the name of the current session. + * + * @jms-builtin + */ +function session_name ($name = null) {} + +/** + * Get and/or set the current session module + * @link http://www.php.net/manual/en/function.session-module-name.php + * @param module string[optional]

+ * If module is specified, that module will be + * used instead. + *

+ * @return string the name of the current session module. + * + * @jms-builtin + */ +function session_module_name ($module = null) {} + +/** + * Get and/or set the current session save path + * @link http://www.php.net/manual/en/function.session-save-path.php + * @param path string[optional]

+ * Session data path. If specified, the path to which data is saved will + * be changed. session_save_path needs to be called + * before session_start for that purpose. + *

+ *

+ *

+ * On some operating systems, you may want to specify a path on a + * filesystem that handles lots of small files efficiently. For example, + * on Linux, reiserfs may provide better performance than ext2fs. + *

+ *

+ * @return string the path of the current directory used for data storage. + * + * @jms-builtin + */ +function session_save_path ($path = null) {} + +/** + * Get and/or set the current session id + * @link http://www.php.net/manual/en/function.session-id.php + * @param id string[optional]

+ * If id is specified, it will replace the current + * session id. session_id needs to be called before + * session_start for that purpose. Depending on the + * session handler, not all characters are allowed within the session id. + * For example, the file session handler only allows characters in the + * range a-z A-Z 0-9 , (comma) and - (minus)! + *

+ * When using session cookies, specifying an id + * for session_id will always send a new cookie + * when session_start is called, regardless if the + * current session id is identical to the one being set. + * @return string session_id returns the session id for the current + * session or the empty string ("") if there is no current + * session (no current session id exists). + * + * @jms-builtin + */ +function session_id ($id = null) {} + +/** + * Update the current session id with a newly generated one + * @link http://www.php.net/manual/en/function.session-regenerate-id.php + * @param delete_old_session bool[optional]

+ * Whether to delete the old associated session file or not. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_regenerate_id ($delete_old_session = null) {} + +/** + * Decodes session data from a string + * @link http://www.php.net/manual/en/function.session-decode.php + * @param data string

+ * The encoded data to be stored. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_decode ($data) {} + +/** + * Register one or more global variables with the current session + * @link http://www.php.net/manual/en/function.session-register.php + * @param name mixed

+ * A string holding the name of a variable or an array consisting of + * variable names or other arrays. + *

+ * @param _ mixed[optional] + * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use the $_SESSION superglobal instead). + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_register ($name, $_ = null) {} + +/** + * Unregister a global variable from the current session + * @link http://www.php.net/manual/en/function.session-unregister.php + * @param name string

+ * The variable name. + *

+ * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use the $_SESSION superglobal instead). + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_unregister ($name) {} + +/** + * Find out whether a global variable is registered in a session + * @link http://www.php.net/manual/en/function.session-is-registered.php + * @param name string

+ * The variable name. + *

+ * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use the $_SESSION superglobal instead). + * @return bool session_is_registered returns true if there is a + * global variable with the name name registered in + * the current session, false otherwise. + * + * @jms-builtin + */ +function session_is_registered ($name) {} + +/** + * Encodes the current session data as a string + * @link http://www.php.net/manual/en/function.session-encode.php + * @return string the contents of the current session encoded. + * + * @jms-builtin + */ +function session_encode () {} + +/** + * Initialize session data + * @link http://www.php.net/manual/en/function.session-start.php + * @return bool This function returns true if a session was successfully started, + * otherwise false. + * + * @jms-builtin + */ +function session_start () {} + +/** + * Destroys all data registered to a session + * @link http://www.php.net/manual/en/function.session-destroy.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_destroy () {} + +/** + * Free all session variables + * @link http://www.php.net/manual/en/function.session-unset.php + * @return void + * + * @jms-builtin + */ +function session_unset () {} + +/** + * Sets user-level session storage functions + * @link http://www.php.net/manual/en/function.session-set-save-handler.php + * @param open callback

+ * Open function, this works like a constructor in classes and is + * executed when the session is being opened. The open function + * expects two parameters, where the first is the save path and + * the second is the session name. + *

+ * @param close callback

+ * Close function, this works like a destructor in classes and is + * executed when the session operation is done. + *

+ * @param read callback

+ * Read function must return string value always to make save handler + * work as expected. Return empty string if there is no data to read. + * Return values from other handlers are converted to boolean expression. + * true for success, false for failure. + *

+ * @param write callback

+ *

+ * The "write" handler is not executed until after the output stream is + * closed. Thus, output from debugging statements in the "write" + * handler will never be seen in the browser. If debugging output is + * necessary, it is suggested that the debug output be written to a + * file instead. + *

+ *

+ * @param destroy callback

+ * The destroy handler, this is executed when a session is destroyed with + * session_destroy and takes the session id as its + * only parameter. + *

+ * @param gc callback

+ * The garbage collector, this is executed when the session garbage collector + * is executed and takes the max session lifetime as its only parameter. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function session_set_save_handler ($open, $close, $read, $write, $destroy, $gc) {} + +/** + * Get and/or set the current cache limiter + * @link http://www.php.net/manual/en/function.session-cache-limiter.php + * @param cache_limiter string[optional]

+ * If cache_limiter is specified, the name of the + * current cache limiter is changed to the new value. + *

+ * + * Possible values + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueHeaders sent
public + *
private_no_expire + *
private + *
nocache + *
+ * @return string the name of the current cache limiter. + * + * @jms-builtin + */ +function session_cache_limiter ($cache_limiter = null) {} + +/** + * Return current cache expire + * @link http://www.php.net/manual/en/function.session-cache-expire.php + * @param new_cache_expire string[optional]

+ * If new_cache_expire is given, the current cache + * expire is replaced with new_cache_expire. + *

+ *

+ * Setting new_cache_expire is of value only, if + * session.cache_limiter is set to a value + * different from nocache. + *

+ * @return int the current setting of session.cache_expire. + * The value returned should be read in minutes, defaults to 180. + * + * @jms-builtin + */ +function session_cache_expire ($new_cache_expire = null) {} + +/** + * Set the session cookie parameters + * @link http://www.php.net/manual/en/function.session-set-cookie-params.php + * @param lifetime int

+ * Lifetime of the + * session cookie, defined in seconds. + *

+ * @param path string[optional]

+ * Path on the domain where + * the cookie will work. Use a single slash ('/') for all paths on the + * domain. + *

+ * @param domain string[optional]

+ * Cookie domain, for + * example 'www.php.net'. To make cookies visible on all subdomains then + * the domain must be prefixed with a dot like '.php.net'. + *

+ * @param secure bool[optional]

+ * If true cookie will only be sent over + * secure connections. + *

+ * @param httponly bool[optional]

+ * If set to true then PHP will attempt to send the + * httponly + * flag when setting the session cookie. + *

+ * @return void + * + * @jms-builtin + */ +function session_set_cookie_params ($lifetime, $path = null, $domain = null, $secure = null, $httponly = null) {} + +/** + * Get the session cookie parameters + * @link http://www.php.net/manual/en/function.session-get-cookie-params.php + * @return array an array with the current session cookie information, the array + * contains the following items: + * "lifetime" - The + * lifetime of the cookie in seconds. + * "path" - The path where + * information is stored. + * "domain" - The domain + * of the cookie. + * "secure" - The cookie + * should only be sent over secure connections. + * "httponly" - The + * cookie can only be accessed through the HTTP protocol. + * + * @jms-builtin + */ +function session_get_cookie_params () {} + +/** + * Write session data and end session + * @link http://www.php.net/manual/en/function.session-write-close.php + * @return void + * + * @jms-builtin + */ +function session_write_close () {} + +/** + * &Alias; session_write_close + * @link http://www.php.net/manual/en/function.session-commit.php + * + * @jms-builtin + */ +function session_commit () {} + +// End of session v. +?> diff --git a/res/php-5.3-core-api/soap.php b/res/php-5.3-core-api/soap.php new file mode 100644 index 0000000..fb1f8a0 --- /dev/null +++ b/res/php-5.3-core-api/soap.php @@ -0,0 +1,494 @@ + + * The name of the SOAP function to call. + *

+ * @param arguments array

+ * An array of the arguments to pass to the function. This can be either + * an ordered or an associative array. + *

+ * @param options array[optional]

+ * An associative array of options to pass to the client. + *

+ *

+ * The location option is the URL of the remote Web service. + *

+ *

+ * The uri option is the target namespace of the SOAP service. + *

+ *

+ * The soapaction option is the action to call. + *

+ * @param input_headers mixed[optional]

+ * An array of headers to be sent along with the SOAP request. + *

+ * @param output_headers array[optional]

+ * If supplied, this array will be filled with the headers from the SOAP response. + *

+ * @return mixed SOAP functions may return one, or multiple values. If only one value is returned + * by the SOAP function, the return value of __soapCall will be + * a simple value (e.g. an integer, a string, etc). If multiple values are + * returned, __soapCall will return + * an associative array of named output parameters. + *

+ *

+ * On error, if the SoapClient object was constructed with the trace + * option set to false, a SoapFault object will be returned. + */ + public function __soapCall ($function_name, array $arguments, array $options = null, $input_headers = null, array &$output_headers = null) {} + + /** + * Returns last SOAP request + * @link http://www.php.net/manual/en/soapclient.getlastrequest.php + * @return string The last SOAP request, as an XML string. + */ + public function __getLastRequest () {} + + /** + * Returns last SOAP response + * @link http://www.php.net/manual/en/soapclient.getlastresponse.php + * @return string The last SOAP response, as an XML string. + */ + public function __getLastResponse () {} + + /** + * Returns the SOAP headers from the last request + * @link http://www.php.net/manual/en/soapclient.getlastrequestheaders.php + * @return string The last SOAP request headers. + */ + public function __getLastRequestHeaders () {} + + /** + * Returns the SOAP headers from the last response + * @link http://www.php.net/manual/en/soapclient.getlastresponseheaders.php + * @return string The last SOAP response headers. + */ + public function __getLastResponseHeaders () {} + + /** + * Returns list of available SOAP functions + * @link http://www.php.net/manual/en/soapclient.getfunctions.php + * @return array The list of SOAP functions. + */ + public function __getFunctions () {} + + /** + * Returns a list of SOAP types + * @link http://www.php.net/manual/en/soapclient.gettypes.php + * @return array An array of SOAP types. + */ + public function __getTypes () {} + + /** + * Performs a SOAP request + * @link http://www.php.net/manual/en/soapclient.dorequest.php + * @param request string

+ * The XML SOAP request. + *

+ * @param location string

+ * The URL to request. + *

+ * @param action string

+ * The SOAP action. + *

+ * @param version int

+ * The SOAP version. + *

+ * @param one_way int[optional]

+ * If one_way is set to 1, this method returns nothing. + * Use this where a response is not expected. + *

+ * @return string The XML SOAP response. + */ + public function __doRequest ($request, $location, $action, $version, $one_way = null) {} + + /** + * The __setCookie purpose + * @link http://www.php.net/manual/en/soapclient.setcookie.php + * @param name string

+ * The name of the cookie. + *

+ * @param value string[optional]

+ * The value of the cookie. If not specified, the cookie will be deleted. + *

+ * @return void + */ + public function __setCookie ($name, $value = null) {} + + /** + * Sets the location of the Web service to use + * @link http://www.php.net/manual/en/soapclient.setlocation.php + * @param new_location string[optional]

+ * The new endpoint URL. + *

+ * @return string The old endpoint URL. + */ + public function __setLocation ($new_location = null) {} + + /** + * Sets SOAP headers for subsequent calls + * @link http://www.php.net/manual/en/soapclient.setsoapheaders.php + * @param soapheaders mixed[optional]

+ * The headers to be set. It could be SoapHeader + * object or array of SoapHeader objects. + * If not specified or set to &null;, the headers will be deleted. + *

+ * @return bool Returns true on success or false on failure. + */ + public function __setSoapHeaders ($soapheaders = null) {} + +} + +/** @jms-builtin */ +class SoapVar { + + /** + * SoapVar constructor + * @link http://www.php.net/manual/en/soapvar.soapvar.php + * @param data + * @param encoding + * @param type_name[optional] + * @param type_namespace[optional] + * @param node_name[optional] + * @param node_namespace[optional] + */ + public function SoapVar ($data, $encoding, $type_name, $type_namespace, $node_name, $node_namespace) {} + +} + +/** @jms-builtin */ +class SoapServer { + + /** + * SoapServer constructor + * @link http://www.php.net/manual/en/soapserver.soapserver.php + * @param wsdl + * @param options[optional] + */ + public function SoapServer ($wsdl, $options) {} + + /** + * Sets SoapServer persistence mode + * @link http://www.php.net/manual/en/soapserver.setpersistence.php + * @param mode string

+ * One of the SOAP_PERSISTENCE_XXX constants. + *

+ *

+ * SOAP_PERSISTENCE_REQUEST - persist the object for the duration of a request. + *

+ *

+ * SOAP_PERSISTENCE_SESSION - persist the object for the duration of a session. + *

+ * @return void + */ + public function setPersistence ($mode) {} + + /** + * Sets the class which handles SOAP requests + * @link http://www.php.net/manual/en/soapserver.setclass.php + * @param class_name string

+ * The name of the exported class. + *

+ * @param args string[optional]

+ * These optional parameters will be passed to the default class constructor + * during object creation. + *

+ * @return void + */ + public function setClass ($class_name, $args = null) {} + + /** + * Sets the object which will be used to handle SOAP requests + * @link http://www.php.net/manual/en/soapserver.setobject.php + * @param object string

+ * The object to handle the requests. + *

+ * @return void + */ + public function setObject ($object) {} + + /** + * Adds one or more functions to handle SOAP requests + * @link http://www.php.net/manual/en/soapserver.addfunction.php + * @param functions string

+ * To export one function, pass the function name into this parameter as + * a string. + *

+ *

+ * To export several functions, pass an array of function names. + *

+ *

+ * To export all the functions, pass a special constant SOAP_FUNCTIONS_ALL. + *

+ *

+ * functions must receive all input arguments in the same + * order as defined in the WSDL file (They should not receive any output parameters + * as arguments) and return one or more values. To return several values they must + * return an array with named output parameters. + *

+ * @return void + */ + public function addFunction ($functions) {} + + /** + * Returns list of defined functions + * @link http://www.php.net/manual/en/soapserver.getfunctions.php + * @return array An array of the defined functions. + */ + public function getFunctions () {} + + /** + * Handles a SOAP request + * @link http://www.php.net/manual/en/soapserver.handle.php + * @param soap_request string[optional]

+ * The SOAP request. If this argument is omitted, the request is assumed to be + * in the raw POST data of the HTTP request. + *

+ * @return void + */ + public function handle ($soap_request = null) {} + + /** + * Issue SoapServer fault indicating an error + * @link http://www.php.net/manual/en/soapserver.fault.php + * @param code string

+ * The error code to return + *

+ * @param string string

+ * A brief description of the error + *

+ * @param actor string[optional]

+ * A string identifying the actor that caused the fault. + *

+ * @param details string[optional]

+ * More details of the fault + *

+ * @param name string[optional]

+ * The name of the fault. This can be used to select a name from a WSDL file. + *

+ * @return void + */ + public function fault ($code, $string, $actor = null, $details = null, $name = null) {} + + /** + * Add a SOAP header to the response + * @link http://www.php.net/manual/en/soapserver.addsoapheader.php + * @param object SoapHeader

+ * The header to be returned. + *

+ * @return void + */ + public function addSoapHeader (SoapHeader $object) {} + +} + +/** @jms-builtin */ +class SoapFault extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * SoapFault constructor + * @link http://www.php.net/manual/en/soapfault.soapfault.php + * @param faultcode + * @param faultstring + * @param faultactor[optional] + * @param detail[optional] + * @param faultname[optional] + * @param headerfault[optional] + */ + public function SoapFault ($faultcode, $faultstring, $faultactor, $detail, $faultname, $headerfault) {} + + /** + * Obtain a string representation of a SoapFault + * @link http://www.php.net/manual/en/soapfault.tostring.php + * @return string A string describing the SoapFault. + */ + public function __toString () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class SoapParam { + + /** + * SoapParam constructor + * @link http://www.php.net/manual/en/soapparam.soapparam.php + * @param data + * @param name + */ + public function SoapParam ($data, $name) {} + +} + +/** @jms-builtin */ +class SoapHeader { + + /** + * SoapHeader constructor + * @link http://www.php.net/manual/en/soapheader.soapheader.php + * @param namespace + * @param name + * @param data[optional] + * @param mustunderstand[optional] + * @param actor[optional] + */ + public function SoapHeader ($namespace, $name, $data, $mustunderstand, $actor) {} + +} + +/** + * Set whether to use the SOAP error handler + * @link http://www.php.net/manual/en/function.use-soap-error-handler.php + * @param handler bool[optional]

+ * Set to true to send error details to clients. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function use_soap_error_handler ($handler = null) {} + +/** + * Checks if a SOAP call has failed + * @link http://www.php.net/manual/en/function.is-soap-fault.php + * @param object mixed

+ * The object to test. + *

+ * @return bool This will return true on error, and false otherwise. + * + * @jms-builtin + */ +function is_soap_fault ($object) {} + +define ('SOAP_1_1', 1); +define ('SOAP_1_2', 2); +define ('SOAP_PERSISTENCE_SESSION', 1); +define ('SOAP_PERSISTENCE_REQUEST', 2); +define ('SOAP_FUNCTIONS_ALL', 999); +define ('SOAP_ENCODED', 1); +define ('SOAP_LITERAL', 2); +define ('SOAP_RPC', 1); +define ('SOAP_DOCUMENT', 2); +define ('SOAP_ACTOR_NEXT', 1); +define ('SOAP_ACTOR_NONE', 2); +define ('SOAP_ACTOR_UNLIMATERECEIVER', 3); +define ('SOAP_COMPRESSION_ACCEPT', 32); +define ('SOAP_COMPRESSION_GZIP', 0); +define ('SOAP_COMPRESSION_DEFLATE', 16); +define ('SOAP_AUTHENTICATION_BASIC', 0); +define ('SOAP_AUTHENTICATION_DIGEST', 1); +define ('UNKNOWN_TYPE', 999998); +define ('XSD_STRING', 101); +define ('XSD_BOOLEAN', 102); +define ('XSD_DECIMAL', 103); +define ('XSD_FLOAT', 104); +define ('XSD_DOUBLE', 105); +define ('XSD_DURATION', 106); +define ('XSD_DATETIME', 107); +define ('XSD_TIME', 108); +define ('XSD_DATE', 109); +define ('XSD_GYEARMONTH', 110); +define ('XSD_GYEAR', 111); +define ('XSD_GMONTHDAY', 112); +define ('XSD_GDAY', 113); +define ('XSD_GMONTH', 114); +define ('XSD_HEXBINARY', 115); +define ('XSD_BASE64BINARY', 116); +define ('XSD_ANYURI', 117); +define ('XSD_QNAME', 118); +define ('XSD_NOTATION', 119); +define ('XSD_NORMALIZEDSTRING', 120); +define ('XSD_TOKEN', 121); +define ('XSD_LANGUAGE', 122); +define ('XSD_NMTOKEN', 123); +define ('XSD_NAME', 124); +define ('XSD_NCNAME', 125); +define ('XSD_ID', 126); +define ('XSD_IDREF', 127); +define ('XSD_IDREFS', 128); +define ('XSD_ENTITY', 129); +define ('XSD_ENTITIES', 130); +define ('XSD_INTEGER', 131); +define ('XSD_NONPOSITIVEINTEGER', 132); +define ('XSD_NEGATIVEINTEGER', 133); +define ('XSD_LONG', 134); +define ('XSD_INT', 135); +define ('XSD_SHORT', 136); +define ('XSD_BYTE', 137); +define ('XSD_NONNEGATIVEINTEGER', 138); +define ('XSD_UNSIGNEDLONG', 139); +define ('XSD_UNSIGNEDINT', 140); +define ('XSD_UNSIGNEDSHORT', 141); +define ('XSD_UNSIGNEDBYTE', 142); +define ('XSD_POSITIVEINTEGER', 143); +define ('XSD_NMTOKENS', 144); +define ('XSD_ANYTYPE', 145); +define ('XSD_ANYXML', 147); +define ('APACHE_MAP', 200); +define ('SOAP_ENC_OBJECT', 301); +define ('SOAP_ENC_ARRAY', 300); +define ('XSD_1999_TIMEINSTANT', 401); +define ('XSD_NAMESPACE', "http://www.w3.org/2001/XMLSchema"); +define ('XSD_1999_NAMESPACE', "http://www.w3.org/1999/XMLSchema"); +define ('SOAP_SINGLE_ELEMENT_ARRAYS', 1); +define ('SOAP_WAIT_ONE_WAY_CALLS', 2); +define ('SOAP_USE_XSI_ARRAY_TYPE', 4); +define ('WSDL_CACHE_NONE', 0); +define ('WSDL_CACHE_DISK', 1); +define ('WSDL_CACHE_MEMORY', 2); +define ('WSDL_CACHE_BOTH', 3); + +// End of soap v. +?> diff --git a/res/php-5.3-core-api/sockets.php b/res/php-5.3-core-api/sockets.php new file mode 100644 index 0000000..a616ec2 --- /dev/null +++ b/res/php-5.3-core-api/sockets.php @@ -0,0 +1,1777 @@ + + * The sockets listed in the read array will be + * watched to see if characters become available for reading (more + * precisely, to see if a read will not block - in particular, a socket + * resource is also ready on end-of-file, in which case a + * socket_read will return a zero length string). + *

+ * @param write array

+ * The sockets listed in the write array will be + * watched to see if a write will not block. + *

+ * @param except array

+ * The sockets listed in the except array will be + * watched for exceptions. + *

+ * @param tv_sec int

+ * The tv_sec and tv_usec + * together form the timeout parameter. The + * timeout is an upper bound on the amount of time + * elapsed before socket_select return. + * tv_sec may be zero , causing + * socket_select to return immediately. This is useful + * for polling. If tv_sec is &null; (no timeout), + * socket_select can block indefinitely. + *

+ * @param tv_usec int[optional]

+ *

+ * @return int On success socket_select returns the number of + * socket resources contained in the modified arrays, which may be zero if + * the timeout expires before anything interesting happens. On error false + * is returned. The error code can be retrieved with + * socket_last_error. + *

+ *

+ * Be sure to use the === operator when checking for an + * error. Since the socket_select may return 0 the + * comparison with == would evaluate to true: + * Understanding socket_select's result + * ]]> + * + * @jms-builtin + */ +function socket_select (array &$read, array &$write, array &$except, $tv_sec, $tv_usec = null) {} + +/** + * Create a socket (endpoint for communication) + * @link http://www.php.net/manual/en/function.socket-create.php + * @param domain int

+ * The domain parameter specifies the protocol + * family to be used by the socket. + *

+ * + * Available address/protocol families + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
DomainDescription
AF_INET + * IPv4 Internet based protocols. TCP and UDP are common protocols of + * this protocol family. + *
AF_INET6 + * IPv6 Internet based protocols. TCP and UDP are common protocols of + * this protocol family. + *
AF_UNIX + * Local communication protocol family. High efficiency and low + * overhead make it a great form of IPC (Interprocess Communication). + *
+ * @param type int

+ * The type parameter selects the type of communication + * to be used by the socket. + *

+ * + * Available socket types + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeDescription
SOCK_STREAM + * Provides sequenced, reliable, full-duplex, connection-based byte streams. + * An out-of-band data transmission mechanism may be supported. + * The TCP protocol is based on this socket type. + *
SOCK_DGRAM + * Supports datagrams (connectionless, unreliable messages of a fixed maximum length). + * The UDP protocol is based on this socket type. + *
SOCK_SEQPACKET + * Provides a sequenced, reliable, two-way connection-based data transmission path for + * datagrams of fixed maximum length; a consumer is required to read an + * entire packet with each read call. + *
SOCK_RAW + * Provides raw network protocol access. This special type of socket + * can be used to manually construct any type of protocol. A common use + * for this socket type is to perform ICMP requests (like ping). + *
SOCK_RDM + * Provides a reliable datagram layer that does not guarantee ordering. + * This is most likely not implemented on your operating system. + *
+ * @param protocol int

+ * The protocol parameter sets the specific + * protocol within the specified domain to be used + * when communicating on the returned socket. The proper value can be + * retrieved by name by using getprotobyname. If + * the desired protocol is TCP, or UDP the corresponding constants + * SOL_TCP, and SOL_UDP + * can also be used. + *

+ * + * Common protocols + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
icmp + * The Internet Control Message Protocol is used primarily by gateways + * and hosts to report errors in datagram communication. The "ping" + * command (present in most modern operating systems) is an example + * application of ICMP. + *
udp + * The User Datagram Protocol is a connectionless, unreliable, + * protocol with fixed record lengths. Due to these aspects, UDP + * requires a minimum amount of protocol overhead. + *
tcp + * The Transmission Control Protocol is a reliable, connection based, + * stream oriented, full duplex protocol. TCP guarantees that all data packets + * will be received in the order in which they were sent. If any packet is somehow + * lost during communication, TCP will automatically retransmit the packet until + * the destination host acknowledges that packet. For reliability and performance + * reasons, the TCP implementation itself decides the appropriate octet boundaries + * of the underlying datagram communication layer. Therefore, TCP applications must + * allow for the possibility of partial record transmission. + *
+ * @return resource socket_create returns a socket resource on success, + * or false on error. The actual error code can be retrieved by calling + * socket_last_error. This error code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * + * @jms-builtin + */ +function socket_create ($domain, $type, $protocol) {} + +/** + * Opens a socket on port to accept connections + * @link http://www.php.net/manual/en/function.socket-create-listen.php + * @param port int

+ * The port on which to listen on all interfaces. + *

+ * @param backlog int[optional]

+ * The backlog parameter defines the maximum length + * the queue of pending connections may grow to. + * SOMAXCONN may be passed as + * backlog parameter, see + * socket_listen for more information. + *

+ * @return resource socket_create_listen returns a new socket resource + * on success or false on error. The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * + * @jms-builtin + */ +function socket_create_listen ($port, $backlog = null) {} + +/** + * Creates a pair of indistinguishable sockets and stores them in an array + * @link http://www.php.net/manual/en/function.socket-create-pair.php + * @param domain int

+ * The domain parameter specifies the protocol + * family to be used by the socket. See socket_create + * for the full list. + *

+ * @param type int

+ * The type parameter selects the type of communication + * to be used by the socket. See socket_create for the + * full list. + *

+ * @param protocol int

+ * The protocol parameter sets the specific + * protocol within the specified domain to be used + * when communicating on the returned socket. The proper value can be retrieved by + * name by using getprotobyname. If + * the desired protocol is TCP, or UDP the corresponding constants + * SOL_TCP, and SOL_UDP + * can also be used. + *

+ *

+ * See socket_create for the full list of supported + * protocols. + *

+ * @param fd array

+ * Reference to an array in which the two socket resources will be inserted. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function socket_create_pair ($domain, $type, $protocol, array &$fd) {} + +/** + * Accepts a connection on a socket + * @link http://www.php.net/manual/en/function.socket-accept.php + * @param socket resource

+ * A valid socket resource created with socket_create. + *

+ * @return resource a new socket resource on success, or false on error. The actual + * error code can be retrieved by calling + * socket_last_error. This error code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * + * @jms-builtin + */ +function socket_accept ($socket) {} + +/** + * Sets nonblocking mode for file descriptor fd + * @link http://www.php.net/manual/en/function.socket-set-nonblock.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function socket_set_nonblock ($socket) {} + +/** + * Sets blocking mode on a socket resource + * @link http://www.php.net/manual/en/function.socket-set-block.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function socket_set_block ($socket) {} + +/** + * Listens for a connection on a socket + * @link http://www.php.net/manual/en/function.socket-listen.php + * @param socket resource

+ * A valid socket resource created with socket_create. + *

+ * @param backlog int[optional]

+ * A maximum of backlog incoming connections will be + * queued for processing. If a connection request arrives with the queue + * full the client may receive an error with an indication of + * ECONNREFUSED, or, if the underlying protocol supports + * retransmission, the request may be ignored so that retries may succeed. + *

+ *

+ * The maximum number passed to the backlog + * parameter highly depends on the underlying platform. On Linux, it is + * silently truncated to SOMAXCONN. On win32, if + * passed SOMAXCONN, the underlying service provider + * responsible for the socket will set the backlog to a maximum + * reasonable value. There is no standard provision to + * find out the actual backlog value on this platform. + *

+ * @return bool Returns true on success or false on failure. The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * + * @jms-builtin + */ +function socket_listen ($socket, $backlog = null) {} + +/** + * Closes a socket resource + * @link http://www.php.net/manual/en/function.socket-close.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @return void + * + * @jms-builtin + */ +function socket_close ($socket) {} + +/** + * Write to a socket + * @link http://www.php.net/manual/en/function.socket-write.php + * @param socket resource

+ *

+ * @param buffer string

+ * The buffer to be written. + *

+ * @param length int[optional]

+ * The optional parameter length can specify an + * alternate length of bytes written to the socket. If this length is + * greater then the buffer length, it is silently truncated to the length + * of the buffer. + *

+ * @return int the number of bytes successfully written to the socket&return.falseforfailure;. + * The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + *

+ *

+ * It is perfectly valid for socket_write to + * return zero which means no bytes have been written. Be sure to use the + * === operator to check for false in case of an + * error. + * + * @jms-builtin + */ +function socket_write ($socket, $buffer, $length = null) {} + +/** + * Reads a maximum of length bytes from a socket + * @link http://www.php.net/manual/en/function.socket-read.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param length int

+ * The maximum number of bytes read is specified by the + * length parameter. Otherwise you can use + * \r, \n, + * or \0 to end reading (depending on the type + * parameter, see below). + *

+ * @param type int[optional]

+ * Optional type parameter is a named constant: + * PHP_BINARY_READ (Default) - use the system + * recv() function. Safe for reading binary data. + * @return string socket_read returns the data as a string on success, + * or false on error (including if the remote host has closed the + * connection). The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual representation of + * the error. + *

+ *

+ * socket_read returns a zero length string ("") + * when there is no more data to read. + * + * @jms-builtin + */ +function socket_read ($socket, $length, $type = null) {} + +/** + * Queries the local side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type + * @link http://www.php.net/manual/en/function.socket-getsockname.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param addr string

+ * If the given socket is of type AF_INET + * or AF_INET6, socket_getsockname + * will return the local IP address in appropriate notation (e.g. + * 127.0.0.1 or fe80::1) in the + * address parameter and, if the optional + * port parameter is present, also the associated port. + *

+ *

+ * If the given socket is of type AF_UNIX, + * socket_getsockname will return the Unix filesystem + * path (e.g. /var/run/daemon.sock) in the + * address parameter. + *

+ * @param port int[optional]

+ * If provided, this will hold the associated port. + *

+ * @return bool Returns true on success or false on failure. socket_getsockname may also return + * false if the socket type is not any of AF_INET, + * AF_INET6, or AF_UNIX, in which + * case the last socket error code is not updated. + * + * @jms-builtin + */ +function socket_getsockname ($socket, &$addr, &$port = null) {} + +/** + * Queries the remote side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type + * @link http://www.php.net/manual/en/function.socket-getpeername.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param address string

+ * If the given socket is of type AF_INET or + * AF_INET6, socket_getpeername + * will return the peers (remote) IP address in + * appropriate notation (e.g. 127.0.0.1 or + * fe80::1) in the address + * parameter and, if the optional port parameter is + * present, also the associated port. + *

+ *

+ * If the given socket is of type AF_UNIX, + * socket_getpeername will return the Unix filesystem + * path (e.g. /var/run/daemon.sock) in the + * address parameter. + *

+ * @param port int[optional]

+ * If given, this will hold the port associated to + * address. + *

+ * @return bool Returns true on success or false on failure. socket_getpeername may also return + * false if the socket type is not any of AF_INET, + * AF_INET6, or AF_UNIX, in which + * case the last socket error code is not updated. + * + * @jms-builtin + */ +function socket_getpeername ($socket, &$address, &$port = null) {} + +/** + * Initiates a connection on a socket + * @link http://www.php.net/manual/en/function.socket-connect.php + * @param socket resource

+ *

+ * @param address string

+ * The address parameter is either an IPv4 address + * in dotted-quad notation (e.g. 127.0.0.1) if + * socket is AF_INET, a valid + * IPv6 address (e.g. ::1) if IPv6 support is enabled and + * socket is AF_INET6 + * or the pathname of a Unix domain socket, if the socket family is + * AF_UNIX. + *

+ * @param port int[optional]

+ * The port parameter is only used and is mandatory + * when connecting to an AF_INET or an + * AF_INET6 socket, and designates + * the port on the remote host to which a connection should be made. + *

+ * @return bool Returns true on success or false on failure. The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + *

+ *

+ * If the socket is non-blocking then this function returns false with an + * error Operation now in progress. + * + * @jms-builtin + */ +function socket_connect ($socket, $address, $port = null) {} + +/** + * Return a string describing a socket error + * @link http://www.php.net/manual/en/function.socket-strerror.php + * @param errno int

+ * A valid socket error number, likely produced by + * socket_last_error. + *

+ * @return string the error message associated with the errno + * parameter. + * + * @jms-builtin + */ +function socket_strerror ($errno) {} + +/** + * Binds a name to a socket + * @link http://www.php.net/manual/en/function.socket-bind.php + * @param socket resource

+ * A valid socket resource created with socket_create. + *

+ * @param address string

+ * If the socket is of the AF_INET family, the + * address is an IP in dotted-quad notation + * (e.g. 127.0.0.1). + *

+ *

+ * If the socket is of the AF_UNIX family, the + * address is the path of a + * Unix-domain socket (e.g. /tmp/my.sock). + *

+ * @param port int[optional]

+ * The port parameter is only used when + * connecting to an AF_INET socket, and + * designates the port on the remote host to which a connection + * should be made. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * The error code can be retrieved with socket_last_error. + * This code may be passed to socket_strerror to get a + * textual explanation of the error. + * + * @jms-builtin + */ +function socket_bind ($socket, $address, $port = null) {} + +/** + * Receives data from a connected socket + * @link http://www.php.net/manual/en/function.socket-recv.php + * @param socket resource

+ * The socket must be a socket resource previously + * created by socket_create(). + *

+ * @param buf string

+ * The data received will be fetched to the variable specified with + * buf. If an error occurs, if the + * connection is reset, or if no data is + * available, buf will be set to &null;. + *

+ * @param len int

+ * Up to len bytes will be fetched from remote host. + *

+ * @param flags int

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + *

+ * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
MSG_OOB + * Process out-of-band data. + *
MSG_PEEK + * Receive data from the beginning of the receive queue without + * removing it from the queue. + *
MSG_WAITALL + * Block until at least len are received. + * However, if a signal is caught or the remote host disconnects, the + * function may return less data. + *
MSG_DONTWAIT + * With this flag set, the function returns even if it would normally + * have blocked. + *
+ * @return int socket_recv returns the number of bytes received, + * or false if there was an error. The actual error code can be retrieved by + * calling socket_last_error. This error code may be + * passed to socket_strerror to get a textual explanation + * of the error. + * + * @jms-builtin + */ +function socket_recv ($socket, &$buf, $len, $flags) {} + +/** + * Sends data to a connected socket + * @link http://www.php.net/manual/en/function.socket-send.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param buf string

+ * A buffer containing the data that will be sent to the remote host. + *

+ * @param len int

+ * The number of bytes that will be sent to the remote host from + * buf. + *

+ * @param flags int

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
MSG_OOB + * Send OOB (out-of-band) data. + *
MSG_EOR + * Indicate a record mark. The sent data completes the record. + *
MSG_EOF + * Close the sender side of the socket and include an appropriate + * notification of this at the end of the sent data. The sent data + * completes the transaction. + *
MSG_DONTROUTE + * Bypass routing, use direct interface. + *
+ *

+ * @return int socket_send returns the number of bytes sent, or false on error. + * + * @jms-builtin + */ +function socket_send ($socket, $buf, $len, $flags) {} + +/** + * Receives data from a socket whether or not it is connection-oriented + * @link http://www.php.net/manual/en/function.socket-recvfrom.php + * @param socket resource

+ * The socket must be a socket resource previously + * created by socket_create(). + *

+ * @param buf string

+ * The data received will be fetched to the variable specified with + * buf. + *

+ * @param len int

+ * Up to len bytes will be fetched from remote host. + *

+ * @param flags int

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + *

+ * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
MSG_OOB + * Process out-of-band data. + *
MSG_PEEK + * Receive data from the beginning of the receive queue without + * removing it from the queue. + *
MSG_WAITALL + * Block until at least len are received. + * However, if a signal is caught or the remote host disconnects, the + * function may return less data. + *
MSG_DONTWAIT + * With this flag set, the function returns even if it would normally + * have blocked. + *
+ * @param name string

+ * If the socket is of the type AF_UNIX type, + * name is the path to the file. Else, for + * unconnected sockets, name is the IP address of, + * the remote host, or &null; if the socket is connection-oriented. + *

+ * @param port int[optional]

+ * This argument only applies to AF_INET and + * AF_INET6 sockets, and specifies the remote port + * from which the data is received. If the socket is connection-oriented, + * port will be &null;. + *

+ * @return int socket_recvfrom returns the number of bytes received, + * or false if there was an error. The actual error code can be retrieved by + * calling socket_last_error. This error code may be + * passed to socket_strerror to get a textual explanation + * of the error. + * + * @jms-builtin + */ +function socket_recvfrom ($socket, &$buf, $len, $flags, &$name, &$port = null) {} + +/** + * Sends a message to a socket, whether it is connected or not + * @link http://www.php.net/manual/en/function.socket-sendto.php + * @param socket resource

+ * A valid socket resource created using socket_create. + *

+ * @param buf string

+ * The sent data will be taken from buffer buf. + *

+ * @param len int

+ * len bytes from buf will be + * sent. + *

+ * @param flags int

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
MSG_OOB + * Send OOB (out-of-band) data. + *
MSG_EOR + * Indicate a record mark. The sent data completes the record. + *
MSG_EOF + * Close the sender side of the socket and include an appropriate + * notification of this at the end of the sent data. The sent data + * completes the transaction. + *
MSG_DONTROUTE + * Bypass routing, use direct interface. + *
+ *

+ * @param addr string

+ * IP address of the remote host. + *

+ * @param port int[optional]

+ * port is the remote port number at which the data + * will be sent. + *

+ * @return int socket_sendto returns the number of bytes sent to the + * remote host, or false if an error occurred. + * + * @jms-builtin + */ +function socket_sendto ($socket, $buf, $len, $flags, $addr, $port = null) {} + +/** + * Gets socket options for the socket + * @link http://www.php.net/manual/en/function.socket-get-option.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param level int

+ * The level parameter specifies the protocol + * level at which the option resides. For example, to retrieve options at + * the socket level, a level parameter of + * SOL_SOCKET would be used. Other levels, such as + * TCP, can be used by + * specifying the protocol number of that level. Protocol numbers can be + * found by using the getprotobyname function. + *

+ * @param optname int + * Available Socket Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionDescriptionType
SO_DEBUG + * Reports whether debugging information is being recorded. + * + * int + *
SO_BROADCAST + * Reports whether transmission of broadcast messages is supported. + * + * int + *
SO_REUSEADDR + * Reports whether local addresses can be reused. + * + * int + *
SO_KEEPALIVE + * Reports whether connections are kept active with periodic transmission + * of messages. If the connected socket fails to respond to these messages, + * the connection is broken and processes writing to that socket are notified + * with a SIGPIPE signal. + * + * int + *
SO_LINGER + *

+ * Reports whether the socket lingers on + * socket_close if data is present. By default, + * when the socket is closed, it attempts to send all unsent data. + * In the case of a connection-oriented socket, + * socket_close will wait for its peer to + * acknowledge the data. + *

+ *

+ * If l_onoff is non-zero and + * l_linger is zero, all the + * unsent data will be discarded and RST (reset) is sent to the + * peer in the case of a connection-oriented socket. + *

+ *

+ * On the other hand, if l_onoff is + * non-zero and l_linger is non-zero, + * socket_close will block until all the data + * is sent or the time specified in l_linger + * elapses. If the socket is non-blocking, + * socket_close will fail and return an error. + *

+ *
+ * array. The array will contain two keys: + * l_onoff and + * l_linger. + *
SO_OOBINLINE + * Reports whether the socket leaves out-of-band data inline. + * + * int + *
SO_SNDBUF + * Reports the size of the send buffer. + * + * int + *
SO_RCVBUF + * Reports the size of the receive buffer. + * + * int + *
SO_ERROR + * Reports information about error status and clears it. + * + * int (cannot be set by socket_set_option) + *
SO_TYPE + * Reports the socket type (e.g. + * SOCK_STREAM). + * + * int (cannot be set by socket_set_option) + *
SO_DONTROUTE + * Reports whether outgoing messages bypass the standard routing facilities. + * + * int + *
SO_RCVLOWAT + * Reports the minimum number of bytes to process for socket + * input operations. + * + * int + *
SO_RCVTIMEO + * Reports the timeout value for input operations. + * + * array. The array will contain two keys: + * sec which is the seconds part on the timeout + * value and usec which is the microsecond part + * of the timeout value. + *
SO_SNDTIMEO + * Reports the timeout value specifying the amount of time that an output + * function blocks because flow control prevents data from being sent. + * + * array. The array will contain two keys: + * sec which is the seconds part on the timeout + * value and usec which is the microsecond part + * of the timeout value. + *
SO_SNDLOWAT + * Reports the minimum number of bytes to process for socket output operations. + * + * int + *
TCP_NODELAY + * Reports whether the Nagle TCP algorithm is disabled. + * + * int + *
+ * @return mixed the value of the given option, or false on errors. + * + * @jms-builtin + */ +function socket_get_option ($socket, $level, $optname) {} + +/** + * Sets socket options for the socket + * @link http://www.php.net/manual/en/function.socket-set-option.php + * @param socket resource

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param level int

+ * The level parameter specifies the protocol + * level at which the option resides. For example, to retrieve options at + * the socket level, a level parameter of + * SOL_SOCKET would be used. Other levels, such as + * TCP, can be used by specifying the protocol number of that level. + * Protocol numbers can be found by using the + * getprotobyname function. + *

+ * @param optname int

+ * The available socket options are the same as those for the + * socket_get_option function. + *

+ * @param optval mixed

+ * The option value. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function socket_set_option ($socket, $level, $optname, $optval) {} + +/** + * Shuts down a socket for receiving, sending, or both + * @link http://www.php.net/manual/en/function.socket-shutdown.php + * @param socket resource

+ * A valid socket resource created with socket_create. + *

+ * @param how int[optional]

+ * The value of how can be one of the following: + * + * possible values for how + * + * + * + * + * + * + * + * + * + * + * + * + *
0 + * Shutdown socket reading + *
1 + * Shutdown socket writing + *
2 + * Shutdown socket reading and writing + *
+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function socket_shutdown ($socket, $how = null) {} + +/** + * Returns the last error on the socket + * @link http://www.php.net/manual/en/function.socket-last-error.php + * @param socket resource[optional]

+ * A valid socket resource created with socket_create. + *

+ * @return int This function returns a socket error code. + * + * @jms-builtin + */ +function socket_last_error ($socket = null) {} + +/** + * Clears the error on the socket or the last error code + * @link http://www.php.net/manual/en/function.socket-clear-error.php + * @param socket resource[optional]

+ * A valid socket resource created with socket_create. + *

+ * @return void + * + * @jms-builtin + */ +function socket_clear_error ($socket = null) {} + +/** + * @param socket + * @param level + * @param optname + * + * @jms-builtin + */ +function socket_getopt ($socket, $level, $optname) {} + +/** + * @param socket + * @param level + * @param optname + * @param optval + * + * @jms-builtin + */ +function socket_setopt ($socket, $level, $optname, $optval) {} + +define ('AF_UNIX', 1); +define ('AF_INET', 2); + +/** + * Only available if compiled with IPv6 support. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('AF_INET6', 10); +define ('SOCK_STREAM', 1); +define ('SOCK_DGRAM', 2); +define ('SOCK_RAW', 3); +define ('SOCK_SEQPACKET', 5); +define ('SOCK_RDM', 4); +define ('MSG_OOB', 1); +define ('MSG_WAITALL', 256); +define ('MSG_DONTWAIT', 64); +define ('MSG_PEEK', 2); +define ('MSG_DONTROUTE', 4); + +/** + * Not available on Windows platforms. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('MSG_EOR', 128); + +/** + * Not available on Windows platforms. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('MSG_EOF', 512); +define ('SO_DEBUG', 1); +define ('SO_REUSEADDR', 2); +define ('SO_KEEPALIVE', 9); +define ('SO_DONTROUTE', 5); +define ('SO_LINGER', 13); +define ('SO_BROADCAST', 6); +define ('SO_OOBINLINE', 10); +define ('SO_SNDBUF', 7); +define ('SO_RCVBUF', 8); +define ('SO_SNDLOWAT', 19); +define ('SO_RCVLOWAT', 18); +define ('SO_SNDTIMEO', 21); +define ('SO_RCVTIMEO', 20); +define ('SO_TYPE', 3); +define ('SO_ERROR', 4); +define ('SOL_SOCKET', 1); +define ('SOMAXCONN', 128); + +/** + * Used to disable Nagle TCP algorithm. + * Added in PHP 5.2.7. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('TCP_NODELAY', 1); +define ('PHP_NORMAL_READ', 1); +define ('PHP_BINARY_READ', 2); + +/** + * Operation not permitted. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPERM', 1); + +/** + * No such file or directory. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOENT', 2); + +/** + * Interrupted system call. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EINTR', 4); + +/** + * I/O error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EIO', 5); + +/** + * No such device or address. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENXIO', 6); + +/** + * Arg list too long. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_E2BIG', 7); + +/** + * Bad file number. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADF', 9); + +/** + * Try again. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EAGAIN', 11); + +/** + * Out of memory. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOMEM', 12); + +/** + * Permission denied. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EACCES', 13); + +/** + * Bad address. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EFAULT', 14); + +/** + * Block device required. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTBLK', 15); + +/** + * Device or resource busy. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBUSY', 16); + +/** + * File exists. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EEXIST', 17); + +/** + * Cross-device link. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EXDEV', 18); + +/** + * No such device. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENODEV', 19); + +/** + * Not a directory. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTDIR', 20); + +/** + * Is a directory. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EISDIR', 21); + +/** + * Invalid argument. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EINVAL', 22); + +/** + * File table overflow. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENFILE', 23); + +/** + * Too many open files. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMFILE', 24); + +/** + * Not a typewriter. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTTY', 25); + +/** + * No space left on device. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSPC', 28); + +/** + * Illegal seek. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESPIPE', 29); + +/** + * Read-only file system. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EROFS', 30); + +/** + * Too many links. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMLINK', 31); + +/** + * Broken pipe. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPIPE', 32); + +/** + * File name too long. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENAMETOOLONG', 36); + +/** + * No record locks available. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOLCK', 37); + +/** + * Function not implemented. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSYS', 38); + +/** + * Directory not empty. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTEMPTY', 39); + +/** + * Too many symbolic links encountered. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ELOOP', 40); + +/** + * Operation would block. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EWOULDBLOCK', 11); + +/** + * No message of desired type. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOMSG', 42); + +/** + * Identifier removed. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EIDRM', 43); + +/** + * Channel number out of range. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECHRNG', 44); + +/** + * Level 2 not synchronized. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL2NSYNC', 45); + +/** + * Level 3 halted. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL3HLT', 46); + +/** + * Level 3 reset. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL3RST', 47); + +/** + * Link number out of range. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ELNRNG', 48); + +/** + * Protocol driver not attached. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EUNATCH', 49); + +/** + * No CSI structure available. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOCSI', 50); + +/** + * Level 2 halted. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL2HLT', 51); + +/** + * Invalid exchange. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADE', 52); + +/** + * Invalid request descriptor. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADR', 53); + +/** + * Exchange full. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EXFULL', 54); + +/** + * No anode. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOANO', 55); + +/** + * Invalid request code. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADRQC', 56); + +/** + * Invalid slot. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADSLT', 57); + +/** + * Device not a stream. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSTR', 60); + +/** + * No data available. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENODATA', 61); + +/** + * Timer expired. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ETIME', 62); + +/** + * Out of streams resources. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSR', 63); + +/** + * Machine is not on the network. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENONET', 64); + +/** + * Object is remote. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EREMOTE', 66); + +/** + * Link has been severed. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOLINK', 67); + +/** + * Advertise error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EADV', 68); + +/** + * Srmount error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESRMNT', 69); + +/** + * Communication error on send. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECOMM', 70); + +/** + * Protocol error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPROTO', 71); + +/** + * Multihop attempted. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMULTIHOP', 72); + +/** + * Not a data message. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADMSG', 74); + +/** + * Name not unique on network. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTUNIQ', 76); + +/** + * File descriptor in bad state. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADFD', 77); + +/** + * Remote address changed. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EREMCHG', 78); + +/** + * Interrupted system call should be restarted. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ERESTART', 85); + +/** + * Streams pipe error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESTRPIPE', 86); + +/** + * Too many users. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EUSERS', 87); + +/** + * Socket operation on non-socket. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTSOCK', 88); + +/** + * Destination address required. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EDESTADDRREQ', 89); + +/** + * Message too long. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMSGSIZE', 90); + +/** + * Protocol wrong type for socket. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPROTOTYPE', 91); +define ('SOCKET_ENOPROTOOPT', 92); + +/** + * Protocol not supported. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPROTONOSUPPORT', 93); + +/** + * Socket type not supported. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESOCKTNOSUPPORT', 94); + +/** + * Operation not supported on transport endpoint. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EOPNOTSUPP', 95); + +/** + * Protocol family not supported. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPFNOSUPPORT', 96); + +/** + * Address family not supported by protocol. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EAFNOSUPPORT', 97); +define ('SOCKET_EADDRINUSE', 98); + +/** + * Cannot assign requested address. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EADDRNOTAVAIL', 99); + +/** + * Network is down. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENETDOWN', 100); + +/** + * Network is unreachable. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENETUNREACH', 101); + +/** + * Network dropped connection because of reset. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENETRESET', 102); + +/** + * Software caused connection abort. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECONNABORTED', 103); + +/** + * Connection reset by peer. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECONNRESET', 104); + +/** + * No buffer space available. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOBUFS', 105); + +/** + * Transport endpoint is already connected. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EISCONN', 106); + +/** + * Transport endpoint is not connected. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTCONN', 107); + +/** + * Cannot send after transport endpoint shutdown. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESHUTDOWN', 108); + +/** + * Too many references: cannot splice. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ETOOMANYREFS', 109); + +/** + * Connection timed out. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ETIMEDOUT', 110); + +/** + * Connection refused. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECONNREFUSED', 111); + +/** + * Host is down. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EHOSTDOWN', 112); + +/** + * No route to host. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EHOSTUNREACH', 113); + +/** + * Operation already in progress. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EALREADY', 114); + +/** + * Operation now in progress. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EINPROGRESS', 115); + +/** + * Is a named type file. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EISNAM', 120); + +/** + * Remote I/O error. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EREMOTEIO', 121); + +/** + * Quota exceeded. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EDQUOT', 122); + +/** + * No medium found. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOMEDIUM', 123); + +/** + * Wrong medium type. + * @link http://www.php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMEDIUMTYPE', 124); +define ('SOL_TCP', 6); +define ('SOL_UDP', 17); + +// End of sockets v. +?> diff --git a/res/php-5.3-core-api/sqlite3.php b/res/php-5.3-core-api/sqlite3.php new file mode 100644 index 0000000..3478371 --- /dev/null +++ b/res/php-5.3-core-api/sqlite3.php @@ -0,0 +1,470 @@ + + * Path to the SQLite database, or :memory: to use in-memory database. + *

+ * @param flags int[optional]

+ * Optional flags used to determine how to open the SQLite database. By + * default, open uses SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE. + *

+ * SQLITE3_OPEN_READONLY: Open the database for + * reading only. + *

+ * @param encryption_key string[optional]

+ * An optional encryption key used when encrypting and decrypting an + * SQLite database. + *

+ * @return void + */ + public function open ($filename, $flags = null, $encryption_key = null) {} + + /** + * Closes the database connection + * @link http://www.php.net/manual/en/sqlite3.close.php + * @return bool true on success, false on failure. + */ + public function close () {} + + /** + * Executes a result-less query against a given database + * @link http://www.php.net/manual/en/sqlite3.exec.php + * @param query string

+ * The SQL query to execute (typically an INSERT, UPDATE, or DELETE + * query). + *

+ * @return bool true if the query succeeded, false on failure. + */ + public function exec ($query) {} + + /** + * Returns the SQLite3 library version as a string constant and as a number + * @link http://www.php.net/manual/en/sqlite3.version.php + * @return array an associative array with the keys "versionString" and + * "versionNumber". + */ + public static function version () {} + + /** + * Returns the row ID of the most recent INSERT into the database + * @link http://www.php.net/manual/en/sqlite3.lastinsertrowid.php + * @return int the row ID of the most recent INSERT into the database + */ + public function lastInsertRowID () {} + + /** + * Returns the numeric result code of the most recent failed SQLite request + * @link http://www.php.net/manual/en/sqlite3.lasterrorcode.php + * @return int an integer value representing the numeric result code of the most + * recent failed SQLite request. + */ + public function lastErrorCode () {} + + /** + * Returns English text describing the most recent failed SQLite request + * @link http://www.php.net/manual/en/sqlite3.lasterrormsg.php + * @return string an English string describing the most recent failed SQLite request. + */ + public function lastErrorMsg () {} + + /** + * Sets the busy connection handler + * @link http://www.php.net/manual/en/sqlite3.busytimeout.php + * @param msecs int

+ * The milliseconds to sleep. Setting this value to a value less than + * or equal to zero, will turn off an already set timeout handler. + *

+ * @return bool true on success, false on failure. + */ + public function busyTimeout ($msecs) {} + + /** + * Attempts to load an SQLite extension library + * @link http://www.php.net/manual/en/sqlite3.loadextension.php + * @param shared_library string

+ * The name of the library to load. The library must be located in the + * directory specified in the configure option sqlite3.extension_dir. + *

+ * @return bool true if the extension is successfully loaded, false on failure. + */ + public function loadExtension ($shared_library) {} + + /** + * Returns the number of database rows that were changed (or inserted or + deleted) by the most recent SQL statement + * @link http://www.php.net/manual/en/sqlite3.changes.php + * @return int an integer value corresponding to the number of + * database rows changed (or inserted or deleted) by the most recent SQL + * statement. + */ + public function changes () {} + + /** + * Returns a string that has been properly escaped + * @link http://www.php.net/manual/en/sqlite3.escapestring.php + * @param value string

+ * The string to be escaped. + *

+ * @return string a properly escaped string that may be used safely in an SQL + * statement. + */ + public static function escapeString ($value) {} + + /** + * Prepares an SQL statement for execution + * @link http://www.php.net/manual/en/sqlite3.prepare.php + * @param query string

+ * The SQL query to prepare. + *

+ * @return SQLite3Stmt an SQLite3Stmt object on success&return.falseforfailure;. + */ + public function prepare ($query) {} + + /** + * Executes an SQL query + * @link http://www.php.net/manual/en/sqlite3.query.php + * @param query string

+ * The SQL query to execute. + *

+ * @return SQLite3Result an SQLite3Result object if the query returns results. Otherwise, + * returns true if the query succeeded, false on failure. + */ + public function query ($query) {} + + /** + * Executes a query and returns a single result + * @link http://www.php.net/manual/en/sqlite3.querysingle.php + * @param query string

+ * The SQL query to execute. + *

+ * @param entire_row bool[optional]

+ * By default, querySingle returns the value of the + * first column returned by the query. If + * entire_row is true, then it returns an array + * of the entire first row. + *

+ * @return mixed the value of the first column of results or an array of the entire + * first row (if entire_row is true). + *

+ *

+ * If the query is valid but no results are returned, then &null; will be + * returned if entire_row is false, otherwise an + * empty array is returned. + *

+ *

+ * Invalid or failing queries will return false. + */ + public function querySingle ($query, $entire_row = null) {} + + /** + * Registers a PHP function for use as an SQL scalar function + * @link http://www.php.net/manual/en/sqlite3.createfunction.php + * @param name string

+ * Name of the SQL function to be created or redefined. + *

+ * @param callback mixed

+ * The name of a PHP function or user-defined function to apply as a + * callback, defining the behavior of the SQL function. + *

+ * @param argument_count int[optional]

+ * The number of arguments that the SQL function takes. If + * this parameter is negative, then the SQL function may take + * any number of arguments. + *

+ * @return bool true upon successful creation of the function, false on failure. + */ + public function createFunction ($name, $callback, $argument_count = null) {} + + /** + * Registers a PHP function for use as an SQL aggregate function + * @link http://www.php.net/manual/en/sqlite3.createaggregate.php + * @param name string

+ * Name of the SQL aggregate to be created or redefined. + *

+ * @param step_callback mixed

+ * The name of a PHP function or user-defined function to apply as a + * callback for every item in the aggregate. + *

+ * @param final_callback mixed

+ * The name of a PHP function or user-defined function to apply as a + * callback at the end of the aggregate data. + *

+ * @param argument_count int[optional]

+ * The number of arguments that the SQL aggregate takes. If + * this parameter is negative, then the SQL aggregate may take + * any number of arguments. + *

+ * @return bool true upon successful creation of the aggregate, false on + * failure. + */ + public function createAggregate ($name, $step_callback, $final_callback, $argument_count = null) {} + + /** + * @param table + * @param column + * @param rowid + * @param dbname[optional] + */ + public function openBlob ($table, $column, $rowid, $dbname) {} + + /** + * @param enableExceptions + */ + public function enableExceptions ($enableExceptions) {} + + /** + * Instantiates an SQLite3 object and opens an SQLite 3 database + * @link http://www.php.net/manual/en/sqlite3.construct.php + * @param filename + * @param flags + * @param encryption_key + */ + public function __construct ($filename, $flags, $encryption_key) {} + +} + +/** @jms-builtin */ +class SQLite3Stmt { + + /** + * Returns the number of parameters within the prepared statement + * @link http://www.php.net/manual/en/sqlite3stmt.paramcount.php + * @return int the number of parameters within the prepared statement. + */ + public function paramCount () {} + + /** + * Closes the prepared statement + * @link http://www.php.net/manual/en/sqlite3stmt.close.php + * @return bool true + */ + public function close () {} + + /** + * Resets the prepared statement + * @link http://www.php.net/manual/en/sqlite3stmt.reset.php + * @return bool true if the statement is successfully reset, false on failure. + */ + public function reset () {} + + /** + * Clears all current bound parameters + * @link http://www.php.net/manual/en/sqlite3stmt.clear.php + * @return bool true on successful clearing of bound parameters, false on + * failure. + */ + public function clear () {} + + /** + * Executes a prepared statement and returns a result set object + * @link http://www.php.net/manual/en/sqlite3stmt.execute.php + * @return SQLite3Result an SQLite3Result object on successful execution of the prepared + * statement, false on failure. + */ + public function execute () {} + + /** + * Binds a parameter to a statement variable + * @link http://www.php.net/manual/en/sqlite3stmt.bindparam.php + * @param sql_param string

+ * An string identifying the statement variable to which the + * parameter should be bound. + *

+ * @param param mixed

+ * The parameter to bind to a statement variable. + *

+ * @param type int[optional]

+ * The data type of the parameter to bind. + *

+ * SQLITE3_INTEGER: The value is a signed integer, + * stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of + * the value. + *

+ * @return bool true if the parameter is bound to the statement variable, false + * on failure. + */ + public function bindParam ($sql_param, &$param, $type = null) {} + + /** + * Binds the value of a parameter to a statement variable + * @link http://www.php.net/manual/en/sqlite3stmt.bindvalue.php + * @param sql_param string

+ * An string identifying the statement variable to which the + * value should be bound. + *

+ * @param value mixed

+ * The value to bind to a statement variable. + *

+ * @param type int[optional]

+ * The data type of the value to bind. + *

+ * SQLITE3_INTEGER: The value is a signed integer, + * stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of + * the value. + *

+ * @return bool true if the value is bound to the statement variable, false + * on failure. + */ + public function bindValue ($sql_param, $value, $type = null) {} + + public function readOnly () {} + + /** + * @param sqlite3 + */ + private function __construct ($sqlite3) {} + +} + +/** @jms-builtin */ +class SQLite3Result { + + /** + * Returns the number of columns in the result set + * @link http://www.php.net/manual/en/sqlite3result.numcolumns.php + * @return int the number of columns in the result set. + */ + public function numColumns () {} + + /** + * Returns the name of the nth column + * @link http://www.php.net/manual/en/sqlite3result.columnname.php + * @param column_number int

+ * The numeric zero-based index of the column. + *

+ * @return string the string name of the column identified by + * column_number. + */ + public function columnName ($column_number) {} + + /** + * Returns the type of the nth column + * @link http://www.php.net/manual/en/sqlite3result.columntype.php + * @param column_number int

+ * The numeric zero-based index of the column. + *

+ * @return int the data type index of the column identified by + * column_number (one of + * SQLITE3_INTEGER, SQLITE3_FLOAT, + * SQLITE3_TEXT, SQLITE3_BLOB, or + * SQLITE3_NULL). + */ + public function columnType ($column_number) {} + + /** + * Fetches a result row as an associative or numerically indexed array or both + * @link http://www.php.net/manual/en/sqlite3result.fetcharray.php + * @param mode int[optional]

+ * Controls how the next row will be returned to the caller. This value + * must be one of either SQLITE3_ASSOC, + * SQLITE3_NUM, or SQLITE3_BOTH. + *

+ * SQLITE3_ASSOC: returns an array indexed by column + * name as returned in the corresponding result set + *

+ * @return array a result row as an associatively or numerically indexed array or + * both. + */ + public function fetchArray ($mode = null) {} + + /** + * Resets the result set back to the first row + * @link http://www.php.net/manual/en/sqlite3Result.reset.php + * @return bool true if the result set is successfully reset + * back to the first row, false on failure. + */ + public function reset () {} + + /** + * Closes the result set + * @link http://www.php.net/manual/en/sqlite3result.finalize.php + * @return bool true. + */ + public function finalize () {} + + private function __construct () {} + +} + +/** + * Specifies that the Sqlite3Result::fetchArray + * method shall return an array indexed by column name as returned in the + * corresponding result set. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_ASSOC', 1); + +/** + * Specifies that the Sqlite3Result::fetchArray + * method shall return an array indexed by column number as returned in the + * corresponding result set, starting at column 0. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_NUM', 2); + +/** + * Specifies that the Sqlite3Result::fetchArray + * method shall return an array indexed by both column name and number as + * returned in the corresponding result set, starting at column 0. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_BOTH', 3); + +/** + * Represents the SQLite3 INTEGER storage class. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_INTEGER', 1); + +/** + * Represents the SQLite3 REAL (FLOAT) storage class. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_FLOAT', 2); + +/** + * Represents the SQLite3 TEXT storage class. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_TEXT', 3); + +/** + * Represents the SQLite3 BLOB storage class. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_BLOB', 4); + +/** + * Represents the SQLite3 NULL storage class. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_NULL', 5); + +/** + * Specifies that the SQLite3 database be opened for reading only. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_OPEN_READONLY', 1); + +/** + * Specifies that the SQLite3 database be opened for reading and writing. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_OPEN_READWRITE', 2); + +/** + * Specifies that the SQLite3 database be created if it does not already + * exist. + * @link http://www.php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_OPEN_CREATE', 4); + +// End of sqlite3 v.0.7-dev +?> diff --git a/res/php-5.3-core-api/standard.php b/res/php-5.3-core-api/standard.php new file mode 100644 index 0000000..806fd92 --- /dev/null +++ b/res/php-5.3-core-api/standard.php @@ -0,0 +1,12304 @@ + + * The constant name. + *

+ * @return mixed the value of the constant, or &null; if the constant is not + * defined. + * + * @jms-builtin + */ +function constant ($name) {} + +/** + * Convert binary data into hexadecimal representation + * @link http://www.php.net/manual/en/function.bin2hex.php + * @param str string

+ * A character. + *

+ * @return string the hexadecimal representation of the given string. + * + * @jms-builtin + */ +function bin2hex ($str) {} + +/** + * Delay execution + * @link http://www.php.net/manual/en/function.sleep.php + * @param seconds int

+ * Halt time in seconds. + *

+ * @return int zero on success, or false on errors. If the call was interrupted + * by a signal, sleep returns the number of seconds left + * to sleep. + * + * @jms-builtin + */ +function sleep ($seconds) {} + +/** + * Delay execution in microseconds + * @link http://www.php.net/manual/en/function.usleep.php + * @param micro_seconds int

+ * Halt time in micro seconds. A micro second is one millionth of a + * second. + *

+ * @return void + * + * @jms-builtin + */ +function usleep ($micro_seconds) {} + +/** + * Delay for a number of seconds and nanoseconds + * @link http://www.php.net/manual/en/function.time-nanosleep.php + * @param seconds int

+ * Must be a positive integer. + *

+ * @param nanoseconds int

+ * Must be a positive integer less than 1 billion. + *

+ * @return mixed Returns true on success or false on failure. + *

+ *

+ * If the delay was interrupted by a signal, an associative array will be + * returned with the components: + * seconds - number of seconds remaining in + * the delay + * nanoseconds - number of nanoseconds + * remaining in the delay + * + * @jms-builtin + */ +function time_nanosleep ($seconds, $nanoseconds) {} + +/** + * Make the script sleep until the specified time + * @link http://www.php.net/manual/en/function.time-sleep-until.php + * @param timestamp float

+ * The timestamp when the script should wake. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function time_sleep_until ($timestamp) {} + +/** + * Parse a time/date generated with strftime + * @link http://www.php.net/manual/en/function.strptime.php + * @param date string

+ * The string to parse (e.g. returned from strftime) + *

+ * @param format string

+ * The format used in date (e.g. the same as + * used in strftime). + *

+ *

+ * For more information about the format options, read the + * strftime page. + *

+ * @return array an array&return.falseforfailure;. + *

+ *

+ * + * The following parameters are returned in the array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
parametersDescription
"tm_sec"Seconds after the minute (0-61)
"tm_min"Minutes after the hour (0-59)
"tm_hour"Hour since midnight (0-23)
"tm_mday"Day of the month (1-31)
"tm_mon"Months since January (0-11)
"tm_year"Years since 1900
"tm_wday"Days since Sunday (0-6)
"tm_yday"Days since January 1 (0-365)
"unparsed"the date part which was not + * recognized using the specified format
+ * + * @jms-builtin + */ +function strptime ($date, $format) {} + +/** + * Flush the output buffer + * @link http://www.php.net/manual/en/function.flush.php + * @return void + * + * @jms-builtin + */ +function flush () {} + +/** + * Wraps a string to a given number of characters + * @link http://www.php.net/manual/en/function.wordwrap.php + * @param str string

+ * The input string. + *

+ * @param width int[optional]

+ * The column width. + *

+ * @param break string[optional]

+ * The line is broken using the optional + * break parameter. + *

+ * @param cut bool[optional]

+ * If the cut is set to true, the string is + * always wrapped at or before the specified width. So if you have + * a word that is larger than the given width, it is broken apart. + * (See second example). + *

+ * @return string the given string wrapped at the specified column. + * + * @jms-builtin + */ +function wordwrap ($str, $width = null, $break = null, $cut = null) {} + +/** + * Convert special characters to HTML entities + * @link http://www.php.net/manual/en/function.htmlspecialchars.php + * @param string string

+ * The string being converted. + *

+ * @param quote_style int[optional]

+ * The optional second argument, quote_style, tells + * the function what to do with single and double quote characters. + * The default mode, ENT_COMPAT, is the backwards compatible mode + * which only translates the double-quote character and leaves the + * single-quote untranslated. If ENT_QUOTES is set, both single and + * double quotes are translated and if ENT_NOQUOTES is set neither + * single nor double quotes are translated. + *

+ * @param charset string[optional]

+ * Defines character set used in conversion. + * The default character set is ISO-8859-1. + *

+ *

+ * For the purposes of this function, the charsets + * ISO-8859-1, ISO-8859-15, + * UTF-8, cp866, + * cp1251, cp1252, and + * KOI8-R are effectively equivalent, as the + * characters affected by htmlspecialchars + * occupy the same positions in all of these charsets. + *

+ * &reference.strings.charsets; + * @param double_encode bool[optional]

+ * When double_encode is turned off PHP will not + * encode existing html entities, the default is to convert everything. + *

+ * @return string The converted string. + * + * @jms-builtin + */ +function htmlspecialchars ($string, $quote_style = null, $charset = null, $double_encode = null) {} + +/** + * Convert all applicable characters to HTML entities + * @link http://www.php.net/manual/en/function.htmlentities.php + * @param string string

+ * The input string. + *

+ * @param quote_style int[optional]

+ * Like htmlspecialchars, the optional second + * quote_style parameter lets you define what will + * be done with 'single' and "double" quotes. It takes on one of three + * constants with the default being ENT_COMPAT: + * + * Available quote_style constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATWill convert double-quotes and leave single-quotes alone.
ENT_QUOTESWill convert both double and single quotes.
ENT_NOQUOTESWill leave both double and single quotes unconverted.
+ *

+ * @param charset string[optional]

+ * Like htmlspecialchars, it takes an optional + * third argument charset which defines character + * set used in conversion. + * Presently, the ISO-8859-1 character set is used as the default. + *

+ * &reference.strings.charsets; + * @param double_encode bool[optional]

+ * When double_encode is turned off PHP will not + * encode existing html entities. The default is to convert everything. + *

+ * @return string the encoded string. + * + * @jms-builtin + */ +function htmlentities ($string, $quote_style = null, $charset = null, $double_encode = null) {} + +/** + * Convert all HTML entities to their applicable characters + * @link http://www.php.net/manual/en/function.html-entity-decode.php + * @param string string

+ * The input string. + *

+ * @param quote_style int[optional]

+ * The optional second quote_style parameter lets + * you define what will be done with 'single' and "double" quotes. It takes + * on one of three constants with the default being + * ENT_COMPAT: + * + * Available quote_style constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATWill convert double-quotes and leave single-quotes alone.
ENT_QUOTESWill convert both double and single quotes.
ENT_NOQUOTESWill leave both double and single quotes unconverted.
+ *

+ * @param charset string[optional]

+ * The ISO-8859-1 character set is used as default for the optional third + * charset. This defines the character set used in + * conversion. + *

+ * &reference.strings.charsets; + * @return string the decoded string. + * + * @jms-builtin + */ +function html_entity_decode ($string, $quote_style = null, $charset = null) {} + +/** + * Convert special HTML entities back to characters + * @link http://www.php.net/manual/en/function.htmlspecialchars-decode.php + * @param string string

+ * The string to decode + *

+ * @param quote_style int[optional]

+ * The quote style. One of the following constants: + * + * quote_style constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATWill convert double-quotes and leave single-quotes alone + * (default)
ENT_QUOTESWill convert both double and single quotes
ENT_NOQUOTESWill leave both double and single quotes unconverted
+ *

+ * @return string the decoded string. + * + * @jms-builtin + */ +function htmlspecialchars_decode ($string, $quote_style = null) {} + +/** + * Returns the translation table used by htmlspecialchars and htmlentities + * @link http://www.php.net/manual/en/function.get-html-translation-table.php + * @param table int[optional]

+ * There are two new constants (HTML_ENTITIES, + * HTML_SPECIALCHARS) that allow you to specify the + * table you want. + *

+ * @param quote_style int[optional]

+ * Like the htmlspecialchars and + * htmlentities functions you can optionally specify + * the quote_style you are working with. + * See the description + * of these modes in htmlspecialchars. + *

+ * @return array the translation table as an array. + * + * @jms-builtin + */ +function get_html_translation_table ($table = null, $quote_style = null) {} + +/** + * Calculate the sha1 hash of a string + * @link http://www.php.net/manual/en/function.sha1.php + * @param str string

+ * The input string. + *

+ * @param raw_output bool[optional]

+ * If the optional raw_output is set to true, + * then the sha1 digest is instead returned in raw binary format with a + * length of 20, otherwise the returned value is a 40-character + * hexadecimal number. + *

+ * @return string the sha1 hash as a string. + * + * @jms-builtin + */ +function sha1 ($str, $raw_output = null) {} + +/** + * Calculate the sha1 hash of a file + * @link http://www.php.net/manual/en/function.sha1-file.php + * @param filename string

+ * The filename of the file to hash. + *

+ * @param raw_output bool[optional]

+ * When true, returns the digest in raw binary format with a length of + * 20. + *

+ * @return string a string on success, false otherwise. + * + * @jms-builtin + */ +function sha1_file ($filename, $raw_output = null) {} + +/** + * Calculate the md5 hash of a string + * @link http://www.php.net/manual/en/function.md5.php + * @param str string

+ * The string. + *

+ * @param raw_output bool[optional]

+ * If the optional raw_output is set to true, + * then the md5 digest is instead returned in raw binary format with a + * length of 16. + *

+ * @return string the hash as a 32-character hexadecimal number. + * + * @jms-builtin + */ +function md5 ($str, $raw_output = null) {} + +/** + * Calculates the md5 hash of a given file + * @link http://www.php.net/manual/en/function.md5-file.php + * @param filename string

+ * The filename + *

+ * @param raw_output bool[optional]

+ * When true, returns the digest in raw binary format with a length of + * 16. + *

+ * @return string a string on success, false otherwise. + * + * @jms-builtin + */ +function md5_file ($filename, $raw_output = null) {} + +/** + * Calculates the crc32 polynomial of a string + * @link http://www.php.net/manual/en/function.crc32.php + * @param str string

+ * The data. + *

+ * @return int the crc32 checksum of str as an integer. + * + * @jms-builtin + */ +function crc32 ($str) {} + +/** + * Parse a binary IPTC block into single tags. + * @link http://www.php.net/manual/en/function.iptcparse.php + * @param iptcblock string

+ * A binary IPTC block. + *

+ * @return array an array using the tagmarker as an index and the value as the + * value. It returns false on error or if no IPTC data was found. + * + * @jms-builtin + */ +function iptcparse ($iptcblock) {} + +/** + * Embeds binary IPTC data into a JPEG image + * @link http://www.php.net/manual/en/function.iptcembed.php + * @param iptcdata string

+ * The data to be written. + *

+ * @param jpeg_file_name string

+ * Path to the JPEG image. + *

+ * @param spool int[optional]

+ * Spool flag. If the spool flag is over 2 then the JPEG will be + * returned as a string. + *

+ * @return mixed If success and spool flag is lower than 2 then the JPEG will not be + * returned as a string, false on errors. + * + * @jms-builtin + */ +function iptcembed ($iptcdata, $jpeg_file_name, $spool = null) {} + +/** + * Get the size of an image + * @link http://www.php.net/manual/en/function.getimagesize.php + * @param filename string

+ * This parameter specifies the file you wish to retrieve information + * about. It can reference a local file or (configuration permitting) a + * remote file using one of the supported streams. + *

+ * @param imageinfo array[optional]

+ * This optional parameter allows you to extract some extended + * information from the image file. Currently, this will return the + * different JPG APP markers as an associative array. + * Some programs use these APP markers to embed text information in + * images. A very common one is to embed + * IPTC information in the APP13 marker. + * You can use the iptcparse function to parse the + * binary APP13 marker into something readable. + *

+ * @return array an array with 7 elements. + *

+ *

+ * Index 0 and 1 contains respectively the width and the height of the image. + *

+ *

+ * Some formats may contain no image or may contain multiple images. In these + * cases, getimagesize might not be able to properly + * determine the image size. getimagesize will return + * zero for width and height in these cases. + *

+ *

+ * Index 2 is one of the IMAGETYPE_XXX constants indicating + * the type of the image. + *

+ *

+ * Index 3 is a text string with the correct + * height="yyy" width="xxx" string that can be used + * directly in an IMG tag. + *

+ *

+ * mime is the correspondant MIME type of the image. + * This information can be used to deliver images with correct the HTTP + * Content-type header: + * getimagesize and MIME types + * ]]> + *

+ *

+ * channels will be 3 for RGB pictures and 4 for CMYK + * pictures. + *

+ *

+ * bits is the number of bits for each color. + *

+ *

+ * For some image types, the presence of channels and + * bits values can be a bit + * confusing. As an example, GIF always uses 3 channels + * per pixel, but the number of bits per pixel cannot be calculated for an + * animated GIF with a global color table. + *

+ *

+ * On failure, false is returned. + * + * @jms-builtin + */ +function getimagesize ($filename, array &$imageinfo = null) {} + +/** + * Get Mime-Type for image-type returned by getimagesize, + exif_read_data, exif_thumbnail, exif_imagetype + * @link http://www.php.net/manual/en/function.image-type-to-mime-type.php + * @param imagetype int

+ * One of the IMAGETYPE_XXX constants. + *

+ * @return string The returned values are as follows + * + * Returned values Constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
imagetypeReturned value
IMAGETYPE_GIFimage/gif
IMAGETYPE_JPEGimage/jpeg
IMAGETYPE_PNGimage/png
IMAGETYPE_SWFapplication/x-shockwave-flash
IMAGETYPE_PSDimage/psd
IMAGETYPE_BMPimage/bmp
IMAGETYPE_TIFF_II (intel byte order)image/tiff
+ * IMAGETYPE_TIFF_MM (motorola byte order) + * image/tiff
IMAGETYPE_JPCapplication/octet-stream
IMAGETYPE_JP2image/jp2
IMAGETYPE_JPXapplication/octet-stream
IMAGETYPE_JB2application/octet-stream
IMAGETYPE_SWCapplication/x-shockwave-flash
IMAGETYPE_IFFimage/iff
IMAGETYPE_WBMPimage/vnd.wap.wbmp
IMAGETYPE_XBMimage/xbm
IMAGETYPE_ICOimage/vnd.microsoft.icon
+ * + * @jms-builtin + */ +function image_type_to_mime_type ($imagetype) {} + +/** + * Get file extension for image type + * @link http://www.php.net/manual/en/function.image-type-to-extension.php + * @param imagetype int

+ * One of the IMAGETYPE_XXX constant. + *

+ * @param include_dot bool[optional]

+ * Whether to prepend a dot to the extension or not. Default to true. + *

+ * @return string A string with the extension corresponding to the given image type. + * + * @jms-builtin + */ +function image_type_to_extension ($imagetype, $include_dot = null) {} + +/** + * Outputs information about PHP's configuration + * @link http://www.php.net/manual/en/function.phpinfo.php + * @param what int[optional]

+ * The output may be customized by passing one or more of the + * following constants bitwise values summed + * together in the optional what parameter. + * One can also combine the respective constants or bitwise values + * together with the or operator. + *

+ *

+ * + * phpinfo options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Name (constant)ValueDescription
INFO_GENERAL1 + * The configuration line, &php.ini; location, build date, Web + * Server, System and more. + *
INFO_CREDITS2 + * PHP Credits. See also phpcredits. + *
INFO_CONFIGURATION4 + * Current Local and Master values for PHP directives. See + * also ini_get. + *
INFO_MODULES8 + * Loaded modules and their respective settings. See also + * get_loaded_extensions. + *
INFO_ENVIRONMENT16 + * Environment Variable information that's also available in + * $_ENV. + *
INFO_VARIABLES32 + * Shows all + * predefined variables from EGPCS (Environment, GET, + * POST, Cookie, Server). + *
INFO_LICENSE64 + * PHP License information. See also the license FAQ. + *
INFO_ALL-1 + * Shows all of the above. + *
+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function phpinfo ($what = null) {} + +/** + * Gets the current PHP version + * @link http://www.php.net/manual/en/function.phpversion.php + * @param extension string[optional]

+ * An optional extension name. + *

+ * @return string If the optional extension parameter is + * specified, phpversion returns the version of that + * extension, or false if there is no version information associated or + * the extension isn't enabled. + * + * @jms-builtin + */ +function phpversion ($extension = null) {} + +/** + * Prints out the credits for PHP + * @link http://www.php.net/manual/en/function.phpcredits.php + * @param flag int[optional]

+ * To generate a custom credits page, you may want to use the + * flag parameter. + *

+ *

+ * + * Pre-defined phpcredits flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
namedescription
CREDITS_ALL + * All the credits, equivalent to using: CREDITS_DOCS + + * CREDITS_GENERAL + CREDITS_GROUP + + * CREDITS_MODULES + CREDITS_FULLPAGE. + * It generates a complete stand-alone HTML page with the appropriate tags. + *
CREDITS_DOCSThe credits for the documentation team
CREDITS_FULLPAGE + * Usually used in combination with the other flags. Indicates + * that a complete stand-alone HTML page needs to be + * printed including the information indicated by the other + * flags. + *
CREDITS_GENERAL + * General credits: Language design and concept, PHP authors + * and SAPI module. + *
CREDITS_GROUPA list of the core developers
CREDITS_MODULES + * A list of the extension modules for PHP, and their authors + *
CREDITS_SAPI + * A list of the server API modules for PHP, and their authors + *
+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function phpcredits ($flag = null) {} + +/** + * Gets the logo guid + * @link http://www.php.net/manual/en/function.php-logo-guid.php + * @return string PHPE9568F34-D428-11d2-A769-00AA001ACF42. + * + * @jms-builtin + */ +function php_logo_guid () {} + +function php_real_logo_guid () {} + +function php_egg_logo_guid () {} + +/** + * Gets the Zend guid + * @link http://www.php.net/manual/en/function.zend-logo-guid.php + * @return string PHPE9568F35-D428-11d2-A769-00AA001ACF42. + * + * @jms-builtin + */ +function zend_logo_guid () {} + +/** + * Returns the type of interface between web server and PHP + * @link http://www.php.net/manual/en/function.php-sapi-name.php + * @return string the interface type, as a lowercase string. + *

+ *

+ * Although not exhaustive, the possible return values include + * aolserver, apache, + * apache2filter, apache2handler, + * caudium, cgi (until PHP 5.3), + * cgi-fcgi, cli, + * continuity, embed, + * isapi, litespeed, + * milter, nsapi, + * phttpd, pi3web, roxen, + * thttpd, tux, and webjames. + * + * @jms-builtin + */ +function php_sapi_name () {} + +/** + * Returns information about the operating system PHP is running on + * @link http://www.php.net/manual/en/function.php-uname.php + * @param mode string[optional]

+ * mode is a single character that defines what + * information is returned: + * 'a': This is the default. Contains all modes in + * the sequence "s n r v m". + * @return string the description, as a string. + * + * @jms-builtin + */ +function php_uname ($mode = null) {} + +/** + * Return a list of .ini files parsed from the additional ini dir + * @link http://www.php.net/manual/en/function.php-ini-scanned-files.php + * @return string a comma-separated string of .ini files on success. Each comma is + * followed by a newline. If the directive --with-config-file-scan-dir wasn't set, + * false is returned. If it was set and the directory was empty, an + * empty string is returned. If a file is unrecognizable, the file will + * still make it into the returned string but a PHP error will also result. + * This PHP error will be seen both at compile time and while using + * php_ini_scanned_files. + * + * @jms-builtin + */ +function php_ini_scanned_files () {} + +/** + * Retrieve a path to the loaded php.ini file + * @link http://www.php.net/manual/en/function.php-ini-loaded-file.php + * @return string The loaded &php.ini; path, or false if one is not loaded. + * + * @jms-builtin + */ +function php_ini_loaded_file () {} + +/** + * String comparisons using a "natural order" algorithm + * @link http://www.php.net/manual/en/function.strnatcmp.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @return int Similar to other string comparison functions, this one returns < 0 if + * str1 is less than str2; > + * 0 if str1 is greater than + * str2, and 0 if they are equal. + * + * @jms-builtin + */ +function strnatcmp ($str1, $str2) {} + +/** + * Case insensitive string comparisons using a "natural order" algorithm + * @link http://www.php.net/manual/en/function.strnatcasecmp.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @return int Similar to other string comparison functions, this one returns < 0 if + * str1 is less than str2 > + * 0 if str1 is greater than + * str2, and 0 if they are equal. + * + * @jms-builtin + */ +function strnatcasecmp ($str1, $str2) {} + +/** + * Count the number of substring occurrences + * @link http://www.php.net/manual/en/function.substr-count.php + * @param haystack string

+ * The string to search in + *

+ * @param needle string

+ * The substring to search for + *

+ * @param offset int[optional]

+ * The offset where to start counting + *

+ * @param length int[optional]

+ * The maximum length after the specified offset to search for the + * substring. It outputs a warning if the offset plus the length is + * greater than the haystack length. + *

+ * @return int This functions returns an integer. + * + * @jms-builtin + */ +function substr_count ($haystack, $needle, $offset = null, $length = null) {} + +/** + * Finds the length of the first segment of a string consisting + entirely of characters contained within a given mask. + * @link http://www.php.net/manual/en/function.strspn.php + * @param subject string

+ * The string to examine. + *

+ * @param mask string

+ * The list of allowable characters to include in counted segments. + *

+ * @param start int[optional]

+ * The position in subject to + * start searching. + *

+ *

+ * If start is given and is non-negative, + * then strspn will begin + * examining subject at + * the start'th position. For instance, in + * the string 'abcdef', the character at + * position 0 is 'a', the + * character at position 2 is + * 'c', and so forth. + *

+ *

+ * If start is given and is negative, + * then strspn will begin + * examining subject at + * the start'th position from the end + * of subject. + *

+ * @param length int[optional]

+ * The length of the segment from subject + * to examine. + *

+ *

+ * If length is given and is non-negative, + * then subject will be examined + * for length characters after the starting + * position. + *

+ *

+ * If lengthis given and is negative, + * then subject will be examined from the + * starting position up to length + * characters from the end of subject. + *

+ * @return int the length of the initial segment of str1 + * which consists entirely of characters in str2. + * + * @jms-builtin + */ +function strspn ($subject, $mask, $start = null, $length = null) {} + +/** + * Find length of initial segment not matching mask + * @link http://www.php.net/manual/en/function.strcspn.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @param start int[optional]

+ * The start position of the string to examine. + *

+ * @param length int[optional]

+ * The length of the string to examine. + *

+ * @return int the length of the segment as an integer. + * + * @jms-builtin + */ +function strcspn ($str1, $str2, $start = null, $length = null) {} + +/** + * Tokenize string + * @link http://www.php.net/manual/en/function.strtok.php + * @param str string

+ * The string being split up into smaller strings (tokens). + *

+ * @param token string

+ * The delimiter used when splitting up str. + *

+ * @return string A string token. + * + * @jms-builtin + */ +function strtok ($str, $token) {} + +/** + * Make a string uppercase + * @link http://www.php.net/manual/en/function.strtoupper.php + * @param string string

+ * The input string. + *

+ * @return string the uppercased string. + * + * @jms-builtin + */ +function strtoupper ($string) {} + +/** + * Make a string lowercase + * @link http://www.php.net/manual/en/function.strtolower.php + * @param str string

+ * The input string. + *

+ * @return string the lowercased string. + * + * @jms-builtin + */ +function strtolower ($str) {} + +/** + * Find position of first occurrence of a string + * @link http://www.php.net/manual/en/function.strpos.php + * @param haystack string

+ * The string to search in + *

+ * @param needle mixed

+ * If needle is not a string, it is converted + * to an integer and applied as the ordinal value of a character. + *

+ * @param offset int[optional]

+ * The optional offset parameter allows you + * to specify which character in haystack to + * start searching. The position returned is still relative to the + * beginning of haystack. + *

+ * @return int the position as an integer. If needle is + * not found, strpos will return boolean + * false. + * + * @jms-builtin + */ +function strpos ($haystack, $needle, $offset = null) {} + +/** + * Find position of first occurrence of a case-insensitive string + * @link http://www.php.net/manual/en/function.stripos.php + * @param haystack string

+ * The string to search in + *

+ * @param needle string

+ * Note that the needle may be a string of one or + * more characters. + *

+ *

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @param offset int[optional]

+ * The optional offset parameter allows you + * to specify which character in haystack to + * start searching. The position returned is still relative to the + * beginning of haystack. + *

+ * @return int If needle is not found, + * stripos will return boolean false. + * + * @jms-builtin + */ +function stripos ($haystack, $needle, $offset = null) {} + +/** + * Find position of last occurrence of a char in a string + * @link http://www.php.net/manual/en/function.strrpos.php + * @param haystack string

+ * The string to search in. + *

+ * @param needle string

+ * If needle is not a string, it is converted + * to an integer and applied as the ordinal value of a character. + *

+ * @param offset int[optional]

+ * May be specified to begin searching an arbitrary number of characters into + * the string. Negative values will stop searching at an arbitrary point + * prior to the end of the string. + *

+ * @return int the position where the needle exists. Returns false if the needle + * was not found. + * + * @jms-builtin + */ +function strrpos ($haystack, $needle, $offset = null) {} + +/** + * Find position of last occurrence of a case-insensitive string in a string + * @link http://www.php.net/manual/en/function.strripos.php + * @param haystack string

+ * The string to search in + *

+ * @param needle string

+ * Note that the needle may be a string of one or + * more characters. + *

+ * @param offset int[optional]

+ * The offset parameter may be specified to begin + * searching an arbitrary number of characters into the string. + *

+ *

+ * Negative offset values will start the search at + * offset characters from the + * start of the string. + *

+ * @return int the numerical position of the last occurrence of + * needle. Also note that string positions start at 0, + * and not 1. + *

+ *

+ * If needle is not found, false is returned. + * + * @jms-builtin + */ +function strripos ($haystack, $needle, $offset = null) {} + +/** + * Reverse a string + * @link http://www.php.net/manual/en/function.strrev.php + * @param string string

+ * The string to be reversed. + *

+ * @return string the reversed string. + * + * @jms-builtin + */ +function strrev ($string) {} + +/** + * Convert logical Hebrew text to visual text + * @link http://www.php.net/manual/en/function.hebrev.php + * @param hebrew_text string

+ * A Hebrew input string. + *

+ * @param max_chars_per_line int[optional]

+ * This optional parameter indicates maximum number of characters per + * line that will be returned. + *

+ * @return string the visual string. + * + * @jms-builtin + */ +function hebrev ($hebrew_text, $max_chars_per_line = null) {} + +/** + * Convert logical Hebrew text to visual text with newline conversion + * @link http://www.php.net/manual/en/function.hebrevc.php + * @param hebrew_text string

+ * A Hebrew input string. + *

+ * @param max_chars_per_line int[optional]

+ * This optional parameter indicates maximum number of characters per + * line that will be returned. + *

+ * @return string the visual string. + * + * @jms-builtin + */ +function hebrevc ($hebrew_text, $max_chars_per_line = null) {} + +/** + * Inserts HTML line breaks before all newlines in a string + * @link http://www.php.net/manual/en/function.nl2br.php + * @param string string

+ * The input string. + *

+ * @param is_xhtml bool[optional]

+ * Whenever to use XHTML compatible line breaks or not. + *

+ * @return string the altered string. + * + * @jms-builtin + */ +function nl2br ($string, $is_xhtml = null) {} + +/** + * Returns filename component of path + * @link http://www.php.net/manual/en/function.basename.php + * @param path string

+ * A path. + *

+ *

+ * On Windows, both slash (/) and backslash + * (\) are used as directory separator character. In + * other environments, it is the forward slash (/). + *

+ * @param suffix string[optional]

+ * If the filename ends in suffix this will also + * be cut off. + *

+ * @return string the base name of the given path. + * + * @jms-builtin + */ +function basename ($path, $suffix = null) {} + +/** + * Returns directory name component of path + * @link http://www.php.net/manual/en/function.dirname.php + * @param path string

+ * A path. + *

+ *

+ * On Windows, both slash (/) and backslash + * (\) are used as directory separator character. In + * other environments, it is the forward slash (/). + *

+ * @return string the name of the directory. If there are no slashes in + * path, a dot ('.') is returned, + * indicating the current directory. Otherwise, the returned string is + * path with any trailing + * /component removed. + * + * @jms-builtin + */ +function dirname ($path) {} + +/** + * Returns information about a file path + * @link http://www.php.net/manual/en/function.pathinfo.php + * @param path string

+ * The path being checked. + *

+ * @param options int[optional]

+ * You can specify which elements are returned with optional parameter + * options. It composes from + * PATHINFO_DIRNAME, + * PATHINFO_BASENAME, + * PATHINFO_EXTENSION and + * PATHINFO_FILENAME. It + * defaults to return all elements. + *

+ * @return mixed The following associative array elements are returned: + * dirname, basename, + * extension (if any), and filename. + *

+ *

+ * If options is used, this function will return a + * string if not all elements are requested. + * + * @jms-builtin + */ +function pathinfo ($path, $options = null) {} + +/** + * Un-quotes a quoted string + * @link http://www.php.net/manual/en/function.stripslashes.php + * @param str string

+ * The input string. + *

+ * @return string a string with backslashes stripped off. + * (\' becomes ' and so on.) + * Double backslashes (\\) are made into a single + * backslash (\). + * + * @jms-builtin + */ +function stripslashes ($str) {} + +/** + * Un-quote string quoted with addcslashes + * @link http://www.php.net/manual/en/function.stripcslashes.php + * @param str string

+ * The string to be unescaped. + *

+ * @return string the unescaped string. + * + * @jms-builtin + */ +function stripcslashes ($str) {} + +/** + * Find first occurrence of a string + * @link http://www.php.net/manual/en/function.strstr.php + * @param haystack string

+ * The input string. + *

+ * @param needle mixed

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @param before_needle bool[optional]

+ * If true, strstr returns + * the part of the haystack before the first + * occurrence of the needle. + *

+ * @return string the portion of string, or false if needle + * is not found. + * + * @jms-builtin + */ +function strstr ($haystack, $needle, $before_needle = null) {} + +/** + * Case-insensitive strstr + * @link http://www.php.net/manual/en/function.stristr.php + * @param haystack string

+ * The string to search in + *

+ * @param needle mixed

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @param before_needle bool[optional]

+ * If true, stristr + * returns the part of the haystack before the + * first occurrence of the needle. + *

+ * @return string the matched substring. If needle is not + * found, returns false. + * + * @jms-builtin + */ +function stristr ($haystack, $needle, $before_needle = null) {} + +/** + * Find the last occurrence of a character in a string + * @link http://www.php.net/manual/en/function.strrchr.php + * @param haystack string

+ * The string to search in + *

+ * @param needle mixed

+ * If needle contains more than one character, + * only the first is used. This behavior is different from that of + * strstr. + *

+ *

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @return string This function returns the portion of string, or false if + * needle is not found. + * + * @jms-builtin + */ +function strrchr ($haystack, $needle) {} + +/** + * Randomly shuffles a string + * @link http://www.php.net/manual/en/function.str-shuffle.php + * @param str string

+ * The input string. + *

+ * @return string the shuffled string. + * + * @jms-builtin + */ +function str_shuffle ($str) {} + +/** + * Return information about words used in a string + * @link http://www.php.net/manual/en/function.str-word-count.php + * @param string string

+ * The string + *

+ * @param format int[optional]

+ * Specify the return value of this function. The current supported values + * are: + * 0 - returns the number of words found + * @param charlist string[optional]

+ * A list of additional characters which will be considered as 'word' + *

+ * @return mixed an array or an integer, depending on the + * format chosen. + * + * @jms-builtin + */ +function str_word_count ($string, $format = null, $charlist = null) {} + +/** + * Convert a string to an array + * @link http://www.php.net/manual/en/function.str-split.php + * @param string string

+ * The input string. + *

+ * @param split_length int[optional]

+ * Maximum length of the chunk. + *

+ * @return array If the optional split_length parameter is + * specified, the returned array will be broken down into chunks with each + * being split_length in length, otherwise each chunk + * will be one character in length. + *

+ *

+ * false is returned if split_length is less than 1. + * If the split_length length exceeds the length of + * string, the entire string is returned as the first + * (and only) array element. + * + * @jms-builtin + */ +function str_split ($string, $split_length = null) {} + +/** + * Search a string for any of a set of characters + * @link http://www.php.net/manual/en/function.strpbrk.php + * @param haystack string

+ * The string where char_list is looked for. + *

+ * @param char_list string

+ * This parameter is case sensitive. + *

+ * @return string a string starting from the character found, or false if it is + * not found. + * + * @jms-builtin + */ +function strpbrk ($haystack, $char_list) {} + +/** + * Binary safe comparison of two strings from an offset, up to length characters + * @link http://www.php.net/manual/en/function.substr-compare.php + * @param main_str string

+ * The main string being compared. + *

+ * @param str string

+ * The secondary string being compared. + *

+ * @param offset int

+ * The start position for the comparison. If negative, it starts counting + * from the end of the string. + *

+ * @param length int[optional]

+ * The length of the comparison. The default value is the largest of the + * length of the str compared to the length of + * main_str less the + * offset. + *

+ * @param case_insensitivity bool[optional]

+ * If case_insensitivity is true, comparison is + * case insensitive. + *

+ * @return int < 0 if main_str from position + * offset is less than str, > + * 0 if it is greater than str, and 0 if they are equal. + * If offset is equal to or greater than the length of + * main_str or length is set and + * is less than 1, substr_compare prints a warning and returns + * false. + * + * @jms-builtin + */ +function substr_compare ($main_str, $str, $offset, $length = null, $case_insensitivity = null) {} + +/** + * Locale based string comparison + * @link http://www.php.net/manual/en/function.strcoll.php + * @param str1 string

+ * The first string. + *

+ * @param str2 string

+ * The second string. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if + * str1 is greater than + * str2, and 0 if they are equal. + * + * @jms-builtin + */ +function strcoll ($str1, $str2) {} + +/** + * Formats a number as a currency string + * @link http://www.php.net/manual/en/function.money-format.php + * @param format string

+ * The format specification consists of the following sequence: + *

a % character

+ * @param number float

+ * The number to be formatted. + *

+ * @return string the formatted string. Characters before and after the formatting + * string will be returned unchanged. + * Non-numeric number causes returning &null; and + * emitting E_WARNING. + * + * @jms-builtin + */ +function money_format ($format, $number) {} + +/** + * Return part of a string + * @link http://www.php.net/manual/en/function.substr.php + * @param string string

+ * The input string. + *

+ * @param start int

+ * If start is non-negative, the returned string + * will start at the start'th position in + * string, counting from zero. For instance, + * in the string 'abcdef', the character at + * position 0 is 'a', the + * character at position 2 is + * 'c', and so forth. + *

+ *

+ * If start is negative, the returned string + * will start at the start'th character + * from the end of string. + *

+ *

+ * If string is less than or equal to + * start characters long, false will be returned. + *

+ *

+ * Using a negative start + * ]]> + *

+ * @param length int[optional]

+ * If length is given and is positive, the string + * returned will contain at most length characters + * beginning from start (depending on the length of + * string). + *

+ *

+ * If length is given and is negative, then that many + * characters will be omitted from the end of string + * (after the start position has been calculated when a + * start is negative). If + * start denotes a position beyond this truncation, + * an empty string will be returned. + *

+ *

+ * If length is given and is 0, + * false or &null; an empty string will be returned. + *

+ * Using a negative length + * ]]> + * @return string the extracted part of string&return.falseforfailure;. + * + * @jms-builtin + */ +function substr ($string, $start, $length = null) {} + +/** + * Replace text within a portion of a string + * @link http://www.php.net/manual/en/function.substr-replace.php + * @param string mixed

+ * The input string. + *

+ * @param replacement string

+ * The replacement string. + *

+ * @param start int

+ * If start is positive, the replacing will + * begin at the start'th offset into + * string. + *

+ *

+ * If start is negative, the replacing will + * begin at the start'th character from the + * end of string. + *

+ * @param length int[optional]

+ * If given and is positive, it represents the length of the portion of + * string which is to be replaced. If it is + * negative, it represents the number of characters from the end of + * string at which to stop replacing. If it + * is not given, then it will default to strlen( + * string ); i.e. end the replacing at the + * end of string. Of course, if + * length is zero then this function will have the + * effect of inserting replacement into + * string at the given + * start offset. + *

+ * @return mixed The result string is returned. If string is an + * array then array is returned. + * + * @jms-builtin + */ +function substr_replace ($string, $replacement, $start, $length = null) {} + +/** + * Quote meta characters + * @link http://www.php.net/manual/en/function.quotemeta.php + * @param str string

+ * The input string. + *

+ * @return string the string with meta characters quoted. + * + * @jms-builtin + */ +function quotemeta ($str) {} + +/** + * Make a string's first character uppercase + * @link http://www.php.net/manual/en/function.ucfirst.php + * @param str string

+ * The input string. + *

+ * @return string the resulting string. + * + * @jms-builtin + */ +function ucfirst ($str) {} + +/** + * Make a string's first character lowercase + * @link http://www.php.net/manual/en/function.lcfirst.php + * @param str string

+ * The input string. + *

+ * @return string the resulting string. + * + * @jms-builtin + */ +function lcfirst ($str) {} + +/** + * Uppercase the first character of each word in a string + * @link http://www.php.net/manual/en/function.ucwords.php + * @param str string

+ * The input string. + *

+ * @return string the modified string. + * + * @jms-builtin + */ +function ucwords ($str) {} + +/** + * Translate certain characters + * @link http://www.php.net/manual/en/function.strtr.php + * @param str string

+ * The string being translated. + *

+ * @param from string

+ * The string being translated to to. + *

+ * @param to string

+ * The string replacing from. + *

+ * @return string This function returns a copy of str, + * translating all occurrences of each character in + * from to the corresponding character in + * to. + * + * @jms-builtin + * @jms-variable-parameters This could be removed if we support different parameter sets. + */ +function strtr ($str, $from, $to) {} + +/** + * Quote string with slashes + * @link http://www.php.net/manual/en/function.addslashes.php + * @param str string

+ * The string to be escaped. + *

+ * @return string the escaped string. + * + * @jms-builtin + */ +function addslashes ($str) {} + +/** + * Quote string with slashes in a C style + * @link http://www.php.net/manual/en/function.addcslashes.php + * @param str string

+ * The string to be escaped. + *

+ * @param charlist string

+ * A list of characters to be escaped. If + * charlist contains characters + * \n, \r etc., they are + * converted in C-like style, while other non-alphanumeric characters + * with ASCII codes lower than 32 and higher than 126 converted to + * octal representation. + *

+ *

+ * When you define a sequence of characters in the charlist argument + * make sure that you know what characters come between the + * characters that you set as the start and end of the range. + * ]]> + * Also, if the first character in a range has a higher ASCII value + * than the second character in the range, no range will be + * constructed. Only the start, end and period characters will be + * escaped. Use the ord function to find the + * ASCII value for a character. + * ]]> + *

+ *

+ * Be careful if you choose to escape characters 0, a, b, f, n, r, + * t and v. They will be converted to \0, \a, \b, \f, \n, \r, \t + * and \v. + * In PHP \0 (NULL), \r (carriage return), \n (newline), \f (form feed), + * \v (vertical tab) and \t (tab) are predefined escape sequences, + * while in C all of these are predefined escape sequences. + *

+ * @return string the escaped string. + * + * @jms-builtin + */ +function addcslashes ($str, $charlist) {} + +/** + * Strip whitespace (or other characters) from the end of a string + * @link http://www.php.net/manual/en/function.rtrim.php + * @param str string

+ * The input string. + *

+ * @param charlist string[optional]

+ * You can also specify the characters you want to strip, by means + * of the charlist parameter. + * Simply list all characters that you want to be stripped. With + * .. you can specify a range of characters. + *

+ * @return string the modified string. + * + * @jms-builtin + */ +function rtrim ($str, $charlist = null) {} + +/** + * Replace all occurrences of the search string with the replacement string + * @link http://www.php.net/manual/en/function.str-replace.php + * @param search mixed

+ * The value being searched for, otherwise known as the needle. + * An array may be used to designate multiple needles. + *

+ * @param replace mixed

+ * The replacement value that replaces found search + * values. An array may be used to designate multiple replacements. + *

+ * @param subject mixed

+ * The string or array being searched and replaced on, + * otherwise known as the haystack. + *

+ *

+ * If subject is an array, then the search and + * replace is performed with every entry of + * subject, and the return value is an array as + * well. + *

+ * @param count int[optional] If passed, this will hold the number of matched and replaced needles. + * @return mixed This function returns a string or an array with the replaced values. + * + * @jms-builtin + */ +function str_replace ($search, $replace, $subject, &$count = null) {} + +/** + * Case-insensitive version of str_replace. + * @link http://www.php.net/manual/en/function.str-ireplace.php + * @param search mixed

+ * Every replacement with search array is + * performed on the result of previous replacement. + *

+ * @param replace mixed

+ *

+ * @param subject mixed

+ * If subject is an array, then the search and + * replace is performed with every entry of + * subject, and the return value is an array as + * well. + *

+ * @param count int[optional]

+ * The number of matched and replaced needles will + * be returned in count which is passed by + * reference. + *

+ * @return mixed a string or an array of replacements. + * + * @jms-builtin + */ +function str_ireplace ($search, $replace, $subject, &$count = null) {} + +/** + * Repeat a string + * @link http://www.php.net/manual/en/function.str-repeat.php + * @param input string

+ * The string to be repeated. + *

+ * @param multiplier int

+ * Number of time the input string should be + * repeated. + *

+ *

+ * multiplier has to be greater than or equal to 0. + * If the multiplier is set to 0, the function + * will return an empty string. + *

+ * @return string the repeated string. + * + * @jms-builtin + */ +function str_repeat ($input, $multiplier) {} + +/** + * Return information about characters used in a string + * @link http://www.php.net/manual/en/function.count-chars.php + * @param string string

+ * The examined string. + *

+ * @param mode int[optional]

+ * See return values. + *

+ * @return mixed Depending on mode + * count_chars returns one of the following: + * 0 - an array with the byte-value as key and the frequency of + * every byte as value. + * 1 - same as 0 but only byte-values with a frequency greater + * than zero are listed. + * 2 - same as 0 but only byte-values with a frequency equal to + * zero are listed. + * 3 - a string containing all unique characters is returned. + * 4 - a string containing all not used characters is returned. + * + * @jms-builtin + */ +function count_chars ($string, $mode = null) {} + +/** + * Split a string into smaller chunks + * @link http://www.php.net/manual/en/function.chunk-split.php + * @param body string

+ * The string to be chunked. + *

+ * @param chunklen int[optional]

+ * The chunk length. + *

+ * @param end string[optional]

+ * The line ending sequence. + *

+ * @return string the chunked string. + * + * @jms-builtin + */ +function chunk_split ($body, $chunklen = null, $end = null) {} + +/** + * Strip whitespace (or other characters) from the beginning and end of a string + * @link http://www.php.net/manual/en/function.trim.php + * @param str string

+ * The string that will be trimmed. + *

+ * @param charlist string[optional]

+ * Optionally, the stripped characters can also be specified using + * the charlist parameter. + * Simply list all characters that you want to be stripped. With + * .. you can specify a range of characters. + *

+ * @return string The trimmed string. + * + * @jms-builtin + */ +function trim ($str, $charlist = null) {} + +/** + * Strip whitespace (or other characters) from the beginning of a string + * @link http://www.php.net/manual/en/function.ltrim.php + * @param str string

+ * The input string. + *

+ * @param charlist string[optional]

+ * You can also specify the characters you want to strip, by means of the + * charlist parameter. + * Simply list all characters that you want to be stripped. With + * .. you can specify a range of characters. + *

+ * @return string This function returns a string with whitespace stripped from the + * beginning of str. + * Without the second parameter, + * ltrim will strip these characters: + * " " (ASCII 32 + * (0x20)), an ordinary space. + * "\t" (ASCII 9 + * (0x09)), a tab. + * "\n" (ASCII 10 + * (0x0A)), a new line (line feed). + * "\r" (ASCII 13 + * (0x0D)), a carriage return. + * "\0" (ASCII 0 + * (0x00)), the NUL-byte. + * "\x0B" (ASCII 11 + * (0x0B)), a vertical tab. + * + * @jms-builtin + */ +function ltrim ($str, $charlist = null) {} + +/** + * Strip HTML and PHP tags from a string + * @link http://www.php.net/manual/en/function.strip-tags.php + * @param str string

+ * The input string. + *

+ * @param allowable_tags string[optional]

+ * You can use the optional second parameter to specify tags which should + * not be stripped. + *

+ *

+ * HTML comments and PHP tags are also stripped. This is hardcoded and + * can not be changed with allowable_tags. + *

+ * @return string the stripped string. + * + * @jms-builtin + */ +function strip_tags ($str, $allowable_tags = null) {} + +/** + * Calculate the similarity between two strings + * @link http://www.php.net/manual/en/function.similar-text.php + * @param first string

+ * The first string. + *

+ * @param second string

+ * The second string. + *

+ * @param percent float[optional]

+ * By passing a reference as third argument, + * similar_text will calculate the similarity in + * percent for you. + *

+ * @return int the number of matching chars in both strings. + * + * @jms-builtin + */ +function similar_text ($first, $second, &$percent = null) {} + +/** + * Split a string by string + * @link http://www.php.net/manual/en/function.explode.php + * @param delimiter string

+ * The boundary string. + *

+ * @param string string

+ * The input string. + *

+ * @param limit int[optional]

+ * If limit is set and positive, the returned array will contain + * a maximum of limit elements with the last + * element containing the rest of string. + *

+ *

+ * If the limit parameter is negative, all components + * except the last -limit are returned. + *

+ *

+ * If the limit parameter is zero, then this is treated as 1. + *

+ * @return array If delimiter is an empty string (""), + * explode will return false. + * If delimiter contains a value that is not + * contained in string and a negative + * limit is used, then an empty array will be + * returned. For any other limit, an array containing + * string will be returned. + * + * @jms-builtin + */ +function explode ($delimiter, $string, $limit = null) {} + +/** + * Join array elements with a string + * @link http://www.php.net/manual/en/function.implode.php + * @param glue string

+ * Defaults to an empty string. This is not the preferred usage of + * implode as glue would be + * the second parameter and thus, the bad prototype would be used. + *

+ * @param pieces array

+ * The array of strings to implode. + *

+ * @return string a string containing a string representation of all the array + * elements in the same order, with the glue string between each element. + * + * @jms-builtin + * @jms-variable-parameters + */ +function implode ($glue, array $pieces) {} + +/** + * &Alias; implode + * @link http://www.php.net/manual/en/function.join.php + * @param glue + * @param pieces + * + * @jms-builtin + */ +function join ($glue, $pieces) {} + +/** + * Set locale information + * @link http://www.php.net/manual/en/function.setlocale.php + * @param category int

+ * category is a named constant specifying the + * category of the functions affected by the locale setting: + * LC_ALL for all of the below + * @param locale string

+ * If locale is &null; or the empty string + * "", the locale names will be set from the + * values of environment variables with the same names as the above + * categories, or from "LANG". + *

+ *

+ * If locale is "0", + * the locale setting is not affected, only the current setting is returned. + *

+ *

+ * If locale is an array or followed by additional + * parameters then each array element or parameter is tried to be set as + * new locale until success. This is useful if a locale is known under + * different names on different systems or for providing a fallback + * for a possibly not available locale. + *

+ * @param _ string[optional] + * @return string the new current locale, or false if the locale functionality is + * not implemented on your platform, the specified locale does not exist or + * the category name is invalid. + *

+ *

+ * An invalid category name also causes a warning message. Category/locale + * names can be found in RFC 1766 + * and ISO 639. + * Different systems have different naming schemes for locales. + *

+ *

+ * The return value of setlocale depends + * on the system that PHP is running. It returns exactly + * what the system setlocale function returns. + * + * @jms-builtin + */ +function setlocale ($category, $locale, $_ = null) {} + +/** + * Get numeric formatting information + * @link http://www.php.net/manual/en/function.localeconv.php + * @return array localeconv returns data based upon the current locale + * as set by setlocale. The associative array that is + * returned contains the following fields: + * + * Array element + * Description + * + * + * decimal_point + * Decimal point character + * + * + * thousands_sep + * Thousands separator + * + * + * grouping + * Array containing numeric groupings + * + * + * int_curr_symbol + * International currency symbol (i.e. USD) + * + * + * currency_symbol + * Local currency symbol (i.e. $) + * + * + * mon_decimal_point + * Monetary decimal point character + * + * + * mon_thousands_sep + * Monetary thousands separator + * + * + * mon_grouping + * Array containing monetary groupings + * + * + * positive_sign + * Sign for positive values + * + * + * negative_sign + * Sign for negative values + * + * + * int_frac_digits + * International fractional digits + * + * + * frac_digits + * Local fractional digits + * + * + * p_cs_precedes + * + * true if currency_symbol precedes a positive value, false + * if it succeeds one + * + * + * + * p_sep_by_space + * + * true if a space separates currency_symbol from a positive + * value, false otherwise + * + * + * + * n_cs_precedes + * + * true if currency_symbol precedes a negative value, false + * if it succeeds one + * + * + * + * n_sep_by_space + * + * true if a space separates currency_symbol from a negative + * value, false otherwise + * + * + * p_sign_posn + * + * 0 - Parentheses surround the quantity and currency_symbol + * 1 - The sign string precedes the quantity and currency_symbol + * 2 - The sign string succeeds the quantity and currency_symbol + * 3 - The sign string immediately precedes the currency_symbol + * 4 - The sign string immediately succeeds the currency_symbol + * + * + * n_sign_posn + * + * 0 - Parentheses surround the quantity and currency_symbol + * 1 - The sign string precedes the quantity and currency_symbol + * 2 - The sign string succeeds the quantity and currency_symbol + * 3 - The sign string immediately precedes the currency_symbol + * 4 - The sign string immediately succeeds the currency_symbol + * + * + *

+ *

+ * The p_sign_posn, and n_sign_posn contain a string + * of formatting options. Each number representing one of the above listed conditions. + *

+ *

+ * The grouping fields contain arrays that define the way numbers should be + * grouped. For example, the monetary grouping field for the nl_NL locale (in + * UTF-8 mode with the euro sign), would contain a 2 item array with the + * values 3 and 3. The higher the index in the array, the farther left the + * grouping is. If an array element is equal to CHAR_MAX, + * no further grouping is done. If an array element is equal to 0, the previous + * element should be used. + * + * @jms-builtin + */ +function localeconv () {} + +/** + * Query language and locale information + * @link http://www.php.net/manual/en/function.nl-langinfo.php + * @param item int

+ * item may be an integer value of the element or the + * constant name of the element. The following is a list of constant names + * for item that may be used and their description. + * Some of these constants may not be defined or hold no value for certain + * locales. + * + * nl_langinfo Constants + * + * + * + * + * + * LC_TIME Category Constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * LC_MONETARY Category Constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Returns 0 if parentheses surround the quantity and CURRENCY_SYMBOL. + * @return string the element as a string, or false if item + * is not valid. + * + * @jms-builtin + */ +function nl_langinfo ($item) {} + +/** + * Calculate the soundex key of a string + * @link http://www.php.net/manual/en/function.soundex.php + * @param str string

+ * The input string. + *

+ * @return string the soundex key as a string. + * + * @jms-builtin + */ +function soundex ($str) {} + +/** + * Calculate Levenshtein distance between two strings + * @link http://www.php.net/manual/en/function.levenshtein.php + * @param str1 string

+ * One of the strings being evaluated for Levenshtein distance. + *

+ * @param str2 string

+ * One of the strings being evaluated for Levenshtein distance. + *

+ * @return int This function returns the Levenshtein-Distance between the + * two argument strings or -1, if one of the argument strings + * is longer than the limit of 255 characters. + * + * @jms-builtin + */ +function levenshtein ($str1, $str2) {} + +/** + * Return a specific character + * @link http://www.php.net/manual/en/function.chr.php + * @param ascii int

+ * The ascii code. + *

+ * @return string the specified character. + * + * @jms-builtin + */ +function chr ($ascii) {} + +/** + * Return ASCII value of character + * @link http://www.php.net/manual/en/function.ord.php + * @param string string

+ * A character. + *

+ * @return int the ASCII value as an integer. + * + * @jms-builtin + */ +function ord ($string) {} + +/** + * Parses the string into variables + * @link http://www.php.net/manual/en/function.parse-str.php + * @param str string

+ * The input string. + *

+ * @param arr array[optional]

+ * If the second parameter arr is present, + * variables are stored in this variable as array elements instead. + *

+ * @return void + * + * @jms-builtin + */ +function parse_str ($str, array &$arr = null) {} + +/** + * Parse a CSV string into an array + * @link http://www.php.net/manual/en/function.str-getcsv.php + * @param input string

+ * The string to parse. + *

+ * @param delimiter string[optional]

+ * Set the field delimiter (one character only). + *

+ * @param enclosure string[optional]

+ * Set the field enclosure character (one character only). + *

+ * @param escape string[optional]

+ * Set the escape character (one character only). Defaults as a backslash + * (\) + *

+ * @return array an indexed array containing the fields read. + * + * @jms-builtin + */ +function str_getcsv ($input, $delimiter = null, $enclosure = null, $escape = null) {} + +/** + * Pad a string to a certain length with another string + * @link http://www.php.net/manual/en/function.str-pad.php + * @param input string

+ * The input string. + *

+ * @param pad_length int

+ * If the value of pad_length is negative, + * less than, or equal to the length of the input string, no padding + * takes place. + *

+ * @param pad_string string[optional]

+ * The pad_string may be truncated if the + * required number of padding characters can't be evenly divided by the + * pad_string's length. + *

+ * @param pad_type int[optional]

+ * Optional argument pad_type can be + * STR_PAD_RIGHT, STR_PAD_LEFT, + * or STR_PAD_BOTH. If + * pad_type is not specified it is assumed to be + * STR_PAD_RIGHT. + *

+ * @return string the padded string. + * + * @jms-builtin + */ +function str_pad ($input, $pad_length, $pad_string = null, $pad_type = null) {} + +/** + * &Alias; rtrim + * @link http://www.php.net/manual/en/function.chop.php + * @param str + * @param character_mask[optional] + * + * @jms-builtin + */ +function chop ($str, $character_mask) {} + +/** + * &Alias; strstr + * @link http://www.php.net/manual/en/function.strchr.php + * @param haystack + * @param needle + * @param boolean $beforeNeedle + * + * @jms-builtin + */ +function strchr ($haystack, $needle, $beforeNeedle = false) {} + +/** + * Return a formatted string + * @link http://www.php.net/manual/en/function.sprintf.php + * @param format string

+ * The format string is composed of zero or more directives: + * ordinary characters (excluding %) that are + * copied directly to the result, and conversion + * specifications, each of which results in fetching its + * own parameter. This applies to both sprintf + * and printf. + *

+ *

+ * Each conversion specification consists of a percent sign + * (%), followed by one or more of these + * elements, in order: + * An optional sign specifier that forces a sign + * (- or +) to be used on a number. By default, only the - sign is used + * on a number if it's negative. This specifier forces positive numbers + * to have the + sign attached as well, and was added in PHP 4.3.0. + * @param args mixed[optional]

+ *

+ * @param _ mixed[optional] + * @return string a string produced according to the formatting string + * format. + * + * @jms-builtin + */ +function sprintf ($format, $args = null, $_ = null) { + // We add this function call here as this is considered by the parser + // to allow an arbitrary number of arguments. + func_num_args(); +} + +/** + * Output a formatted string + * @link http://www.php.net/manual/en/function.printf.php + * @param format string

+ * See sprintf for a description of + * format. + *

+ * @param args mixed[optional]

+ *

+ * @param _ mixed[optional] + * @return int the length of the outputted string. + * + * @jms-builtin + */ +function printf ($format, $args = null, $_ = null) {} + +/** + * Output a formatted string + * @link http://www.php.net/manual/en/function.vprintf.php + * @param format string

+ * See sprintf for a description of + * format. + *

+ * @param args array

+ *

+ * @return int the length of the outputted string. + * + * @jms-builtin + */ +function vprintf ($format, array $args) {} + +/** + * Return a formatted string + * @link http://www.php.net/manual/en/function.vsprintf.php + * @param format string

+ * See sprintf for a description of + * format. + *

+ * @param args array

+ *

+ * @return string Return array values as a formatted string according to + * format (which is described in the documentation + * for sprintf). + * + * @jms-builtin + */ +function vsprintf ($format, array $args) {} + +/** + * Write a formatted string to a stream + * @link http://www.php.net/manual/en/function.fprintf.php + * @param handle resource &fs.file.pointer; + * @param format string

+ * See sprintf for a description of + * format. + *

+ * @param args mixed[optional]

+ *

+ * @param _ mixed[optional] + * @return int the length of the string written. + * + * @jms-builtin + */ +function fprintf ($handle, $format, $args = null, $_ = null) {} + +/** + * Write a formatted string to a stream + * @link http://www.php.net/manual/en/function.vfprintf.php + * @param handle resource

+ *

+ * @param format string

+ * See sprintf for a description of + * format. + *

+ * @param args array

+ *

+ * @return int the length of the outputted string. + * + * @jms-builtin + */ +function vfprintf ($handle, $format, array $args) {} + +/** + * Parses input from a string according to a format + * @link http://www.php.net/manual/en/function.sscanf.php + * @param str string

+ * The input string being parsed. + *

+ * @param format string

+ * The interpreted format for str, which is + * described in the documentation for sprintf with + * following differences: + * Function is not locale-aware. + * F, g, G and + * b are not supported. + * D stands for decimal number. + * i stands for integer with base detection. + * n stands for number of characters processed so far. + *

+ * @param _ mixed[optional] + * @return mixed If only + * two parameters were passed to this function, the values parsed + * will be returned as an array. Otherwise, if optional parameters are passed, + * the function will return the number of assigned values. The optional + * parameters must be passed by reference. + * + * @jms-builtin + */ +function sscanf ($str, $format, &$_ = null) {} + +/** + * Parses input from a file according to a format + * @link http://www.php.net/manual/en/function.fscanf.php + * @param handle resource &fs.file.pointer; + * @param format string

+ * The specified format as described in the + * sprintf documentation. + *

+ * @param _ mixed[optional] + * @return mixed If only two parameters were passed to this function, the values parsed will be + * returned as an array. Otherwise, if optional parameters are passed, the + * function will return the number of assigned values. The optional + * parameters must be passed by reference. + * + * @jms-builtin + */ +function fscanf ($handle, $format, &$_ = null) {} + +/** + * Parse a URL and return its components + * @link http://www.php.net/manual/en/function.parse-url.php + * @param url string

+ * The URL to parse. Invalid characters are replaced by + * _. + *

+ * @param component int[optional]

+ * Specify one of PHP_URL_SCHEME, + * PHP_URL_HOST, PHP_URL_PORT, + * PHP_URL_USER, PHP_URL_PASS, + * PHP_URL_PATH, PHP_URL_QUERY + * or PHP_URL_FRAGMENT to retrieve just a specific + * URL component as a string. + *

+ * @return mixed On seriously malformed URLs, parse_url may return + * false and emit a E_WARNING. Otherwise an associative + * array is returned, whose components may be (at least one): + * scheme - e.g. http + * host + * port + * user + * pass + * path + * query - after the question mark ? + * fragment - after the hashmark # + *

+ *

+ * If the component parameter is specified a + * string is returned instead of an array. + * + * @jms-builtin + */ +function parse_url ($url, $component = null) {} + +/** + * URL-encodes string + * @link http://www.php.net/manual/en/function.urlencode.php + * @param str string

+ * The string to be encoded. + *

+ * @return string a string in which all non-alphanumeric characters except + * -_. have been replaced with a percent + * (%) sign followed by two hex digits and spaces encoded + * as plus (+) signs. It is encoded the same way that the + * posted data from a WWW form is encoded, that is the same way as in + * application/x-www-form-urlencoded media type. This + * differs from the RFC 1738 encoding (see + * rawurlencode) in that for historical reasons, spaces + * are encoded as plus (+) signs. + * + * @jms-builtin + */ +function urlencode ($str) {} + +/** + * Decodes URL-encoded string + * @link http://www.php.net/manual/en/function.urldecode.php + * @param str string

+ * The string to be decoded. + *

+ * @return string the decoded string. + * + * @jms-builtin + */ +function urldecode ($str) {} + +/** + * URL-encode according to RFC 1738 + * @link http://www.php.net/manual/en/function.rawurlencode.php + * @param str string

+ * The URL to be encoded. + *

+ * @return string a string in which all non-alphanumeric characters except + * -_. have been replaced with a percent + * (%) sign followed by two hex digits. This is the + * encoding described in RFC 1738 for + * protecting literal characters from being interpreted as special URL + * delimiters, and for protecting URLs from being mangled by transmission + * media with character conversions (like some email systems). + * + * @jms-builtin + */ +function rawurlencode ($str) {} + +/** + * Decode URL-encoded strings + * @link http://www.php.net/manual/en/function.rawurldecode.php + * @param str string

+ * The URL to be decoded. + *

+ * @return string the decoded URL, as a string. + * + * @jms-builtin + */ +function rawurldecode ($str) {} + +/** + * Generate URL-encoded query string + * @link http://www.php.net/manual/en/function.http-build-query.php + * @param formdata array

+ * May be an array or object containing properties. + *

+ *

+ * The array form may be a simple one-dimensional structure, or an array + * of arrays (who in turn may contain other arrays). + *

+ * @param numeric_prefix string[optional]

+ * If numeric indices are used in the base array and this parameter is + * provided, it will be prepended to the numeric index for elements in + * the base array only. + *

+ *

+ * This is meant to allow for legal variable names when the data is + * decoded by PHP or another CGI application later on. + *

+ * @param arg_separator string[optional]

+ * arg_separator.output + * is used to separate arguments, unless this parameter is specified, + * and is then used. + *

+ * @return string a URL-encoded string. + * + * @jms-builtin + */ +function http_build_query (array $formdata, $numeric_prefix = null, $arg_separator = null) {} + +/** + * Returns the target of a symbolic link + * @link http://www.php.net/manual/en/function.readlink.php + * @param path string

+ * The symbolic link path. + *

+ * @return string the contents of the symbolic link path or false on error. + * + * @jms-builtin + */ +function readlink ($path) {} + +/** + * Gets information about a link + * @link http://www.php.net/manual/en/function.linkinfo.php + * @param path string

+ * Path to the link. + *

+ * @return int linkinfo returns the st_dev field + * of the Unix C stat structure returned by the lstat + * system call. Returns 0 or false in case of error. + * + * @jms-builtin + */ +function linkinfo ($path) {} + +/** + * @param target + * @param link + * + * @jms-builtin + */ +function symlink ($target, $link) {} + +/** + * Create a hard link + * @link http://www.php.net/manual/en/function.link.php + * @param from_path string

+ * The link name. + *

+ * @param to_path string

+ * Target of the link. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function link ($from_path, $to_path) {} + +/** + * Deletes a file + * @link http://www.php.net/manual/en/function.unlink.php + * @param filename string

+ * Path to the file. + *

+ * @param context resource[optional] ¬e.context-support; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function unlink ($filename, $context = null) {} + +/** + * Execute an external program + * @link http://www.php.net/manual/en/function.exec.php + * @param command string

+ * The command that will be executed. + *

+ * @param output array[optional]

+ * If the output argument is present, then the + * specified array will be filled with every line of output from the + * command. Trailing whitespace, such as \n, is not + * included in this array. Note that if the array already contains some + * elements, exec will append to the end of the array. + * If you do not want the function to append elements, call + * unset on the array before passing it to + * exec. + *

+ * @param return_var int[optional]

+ * If the return_var argument is present + * along with the output argument, then the + * return status of the executed command will be written to this + * variable. + *

+ * @return string The last line from the result of the command. If you need to execute a + * command and have all the data from the command passed directly back without + * any interference, use the passthru function. + *

+ *

+ * To get the output of the executed command, be sure to set and use the + * output parameter. + * + * @jms-builtin + */ +function exec ($command, array &$output = null, &$return_var = null) {} + +/** + * Execute an external program and display the output + * @link http://www.php.net/manual/en/function.system.php + * @param command string

+ * The command that will be executed. + *

+ * @param return_var int[optional]

+ * If the return_var argument is present, then the + * return status of the executed command will be written to this + * variable. + *

+ * @return string the last line of the command output on success, and false + * on failure. + * + * @jms-builtin + */ +function system ($command, &$return_var = null) {} + +/** + * Escape shell metacharacters + * @link http://www.php.net/manual/en/function.escapeshellcmd.php + * @param command string

+ * The command that will be escaped. + *

+ * @return string The escaped string. + * + * @jms-builtin + */ +function escapeshellcmd ($command) {} + +/** + * Escape a string to be used as a shell argument + * @link http://www.php.net/manual/en/function.escapeshellarg.php + * @param arg string

+ * The argument that will be escaped. + *

+ * @return string The escaped string. + * + * @jms-builtin + */ +function escapeshellarg ($arg) {} + +/** + * Execute an external program and display raw output + * @link http://www.php.net/manual/en/function.passthru.php + * @param command string

+ * The command that will be executed. + *

+ * @param return_var int[optional]

+ * If the return_var argument is present, the + * return status of the Unix command will be placed here. + *

+ * @return void + * + * @jms-builtin + */ +function passthru ($command, &$return_var = null) {} + +/** + * Execute command via shell and return the complete output as a string + * @link http://www.php.net/manual/en/function.shell-exec.php + * @param cmd string

+ * The command that will be executed. + *

+ * @return string The output from the executed command. + * + * @jms-builtin + */ +function shell_exec ($cmd) {} + +/** + * Execute a command and open file pointers for input/output + * @link http://www.php.net/manual/en/function.proc-open.php + * @param cmd string

+ * The command to execute + *

+ * @param descriptorspec array

+ * An indexed array where the key represents the descriptor number and the + * value represents how PHP will pass that descriptor to the child + * process. 0 is stdin, 1 is stdout, while 2 is stderr. + *

+ *

+ * Each element can be: + * An array describing the pipe to pass to the process. The first + * element is the descriptor type and the second element is an option for + * the given type. Valid types are pipe (the second + * element is either r to pass the read end of the pipe + * to the process, or w to pass the write end) and + * file (the second element is a filename). + * A stream resource representing a real file descriptor (e.g. opened file, + * a socket, STDIN). + *

+ *

+ * The file descriptor numbers are not limited to 0, 1 and 2 - you may + * specify any valid file descriptor number and it will be passed to the + * child process. This allows your script to interoperate with other + * scripts that run as "co-processes". In particular, this is useful for + * passing passphrases to programs like PGP, GPG and openssl in a more + * secure manner. It is also useful for reading status information + * provided by those programs on auxiliary file descriptors. + *

+ * @param pipes array

+ * Will be set to an indexed array of file pointers that correspond to + * PHP's end of any pipes that are created. + *

+ * @param cwd string[optional]

+ * The initial working dir for the command. This must be an + * absolute directory path, or &null; + * if you want to use the default value (the working dir of the current + * PHP process) + *

+ * @param env array[optional]

+ * An array with the environment variables for the command that will be + * run, or &null; to use the same environment as the current PHP process + *

+ * @param other_options array[optional]

+ * Allows you to specify additional options. Currently supported options + * include: + * suppress_errors (windows only): suppresses errors + * generated by this function when it's set to true + * bypass_shell (windows only): bypass + * cmd.exe shell when set to true + * context: stream context used when opening files + * (created with stream_context_create) + * binary_pipes: open pipes in binary mode, instead + * of using the usual stream_encoding + *

+ * @return resource a resource representing the process, which should be freed using + * proc_close when you are finished with it. On failure + * returns false. + * + * @jms-builtin + */ +function proc_open ($cmd, array $descriptorspec, array &$pipes, $cwd = null, array $env = null, array $other_options = null) {} + +/** + * Close a process opened by proc_open and return the exit code of that process + * @link http://www.php.net/manual/en/function.proc-close.php + * @param process resource

+ * The proc_open resource that will + * be closed. + *

+ * @return int the termination status of the process that was run. + * + * @jms-builtin + */ +function proc_close ($process) {} + +/** + * Kills a process opened by proc_open + * @link http://www.php.net/manual/en/function.proc-terminate.php + * @param process resource

+ * The proc_open resource that will + * be closed. + *

+ * @param signal int[optional]

+ * This optional parameter is only useful on POSIX + * operating systems; you may specify a signal to send to the process + * using the kill(2) system call. The default is + * SIGTERM. + *

+ * @return bool the termination status of the process that was run. + * + * @jms-builtin + */ +function proc_terminate ($process, $signal = null) {} + +/** + * Get information about a process opened by proc_open + * @link http://www.php.net/manual/en/function.proc-get-status.php + * @param process resource

+ * The proc_open resource that will + * be evaluated. + *

+ * @return array An array of collected information on success, and false + * on failure. The returned array contains the following elements: + *

+ *

+ *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * @jms-builtin + */ +function proc_get_status ($process) {} + +/** + * Change the priority of the current process + * @link http://www.php.net/manual/en/function.proc-nice.php + * @param increment int

+ * The increment value of the priority change. + *

+ * @return bool Returns true on success or false on failure. + * If an error occurs, like the user lacks permission to change the priority, + * an error of level E_WARNING is also generated. + * + * @jms-builtin + */ +function proc_nice ($increment) {} + +/** + * Generate a random integer + * @link http://www.php.net/manual/en/function.rand.php + * @param min[optional] + * @param max[optional] + * @return int A pseudo random value between min + * (or 0) and max (or getrandmax, inclusive). + * + * @jms-builtin + */ +function rand ($min = 0, $max = 0) {} + +/** + * Seed the random number generator + * @link http://www.php.net/manual/en/function.srand.php + * @param seed int[optional]

+ * Optional seed value + *

+ * @return void + * + * @jms-builtin + */ +function srand ($seed = null) {} + +/** + * Show largest possible random value + * @link http://www.php.net/manual/en/function.getrandmax.php + * @return int The largest possible random value returned by rand + * + * @jms-builtin + */ +function getrandmax () {} + +/** + * Generate a better random value + * @link http://www.php.net/manual/en/function.mt-rand.php + * @param min[optional] + * @param max[optional] + * @return int A random integer value between min (or 0) + * and max (or mt_getrandmax, inclusive) + * + * @jms-builtin + */ +function mt_rand ($min = 0, $max = 0) {} + +/** + * Seed the better random number generator + * @link http://www.php.net/manual/en/function.mt-srand.php + * @param seed int[optional]

+ * An optional seed value + *

+ * @return void + * + * @jms-builtin + */ +function mt_srand ($seed = null) {} + +/** + * Show largest possible random value + * @link http://www.php.net/manual/en/function.mt-getrandmax.php + * @return int the maximum random value returned by mt_rand + * + * @jms-builtin + */ +function mt_getrandmax () {} + +/** + * Get port number associated with an Internet service and protocol + * @link http://www.php.net/manual/en/function.getservbyname.php + * @param service string

+ * The Internet service name, as a string. + *

+ * @param protocol string

+ * protocol is either "tcp" + * or "udp" (in lowercase). + *

+ * @return int the port number, or false if service or + * protocol is not found. + * + * @jms-builtin + */ +function getservbyname ($service, $protocol) {} + +/** + * Get Internet service which corresponds to port and protocol + * @link http://www.php.net/manual/en/function.getservbyport.php + * @param port int

+ * The port number. + *

+ * @param protocol string

+ * protocol is either "tcp" + * or "udp" (in lowercase). + *

+ * @return string the Internet service name as a string. + * + * @jms-builtin + */ +function getservbyport ($port, $protocol) {} + +/** + * Get protocol number associated with protocol name + * @link http://www.php.net/manual/en/function.getprotobyname.php + * @param name string

+ * The protocol name. + *

+ * @return int the protocol number or -1 if the protocol is not found. + * + * @jms-builtin + */ +function getprotobyname ($name) {} + +/** + * Get protocol name associated with protocol number + * @link http://www.php.net/manual/en/function.getprotobynumber.php + * @param number int

+ * The protocol number. + *

+ * @return string the protocol name as a string. + * + * @jms-builtin + */ +function getprotobynumber ($number) {} + +/** + * Gets PHP script owner's UID + * @link http://www.php.net/manual/en/function.getmyuid.php + * @return int the user ID of the current script, or false on error. + * + * @jms-builtin + */ +function getmyuid () {} + +/** + * Get PHP script owner's GID + * @link http://www.php.net/manual/en/function.getmygid.php + * @return int the group ID of the current script, or false on error. + * + * @jms-builtin + */ +function getmygid () {} + +/** + * Gets PHP's process ID + * @link http://www.php.net/manual/en/function.getmypid.php + * @return int the current PHP process ID, or false on error. + * + * @jms-builtin + */ +function getmypid () {} + +/** + * Gets the inode of the current script + * @link http://www.php.net/manual/en/function.getmyinode.php + * @return int the current script's inode as an integer, or false on error. + * + * @jms-builtin + */ +function getmyinode () {} + +/** + * Gets time of last page modification + * @link http://www.php.net/manual/en/function.getlastmod.php + * @return int the time of the last modification of the current + * page. The value returned is a Unix timestamp, suitable for + * feeding to date. Returns false on error. + * + * @jms-builtin + */ +function getlastmod () {} + +/** + * Decodes data encoded with MIME base64 + * @link http://www.php.net/manual/en/function.base64-decode.php + * @param data string

+ * The encoded data. + *

+ * @param strict bool[optional]

+ * Returns false if input contains character from outside the base64 + * alphabet. + *

+ * @return string the original data&return.falseforfailure;. The returned data may be + * binary. + * + * @jms-builtin + */ +function base64_decode ($data, $strict = null) {} + +/** + * Encodes data with MIME base64 + * @link http://www.php.net/manual/en/function.base64-encode.php + * @param data string

+ * The data to encode. + *

+ * @return string The encoded data, as a string. + * + * @jms-builtin + */ +function base64_encode ($data) {} + +/** + * Uuencode a string + * @link http://www.php.net/manual/en/function.convert-uuencode.php + * @param data string

+ * The data to be encoded. + *

+ * @return string the uuencoded data. + * + * @jms-builtin + */ +function convert_uuencode ($data) {} + +/** + * Decode a uuencoded string + * @link http://www.php.net/manual/en/function.convert-uudecode.php + * @param data string

+ * The uuencoded data. + *

+ * @return string the decoded data as a string. + * + * @jms-builtin + */ +function convert_uudecode ($data) {} + +/** + * Absolute value + * @link http://www.php.net/manual/en/function.abs.php + * @param number mixed

+ * The numeric value to process + *

+ * @return number The absolute value of number. If the + * argument number is + * of type float, the return type is also float, + * otherwise it is integer (as float usually has a + * bigger value range than integer). + * + * @jms-builtin + */ +function abs ($number) {} + +/** + * Round fractions up + * @link http://www.php.net/manual/en/function.ceil.php + * @param value float

+ * The value to round + *

+ * @return float value rounded up to the next highest + * integer. + * The return value of ceil is still of type + * float as the value range of float is + * usually bigger than that of integer. + * + * @jms-builtin + */ +function ceil ($value) {} + +/** + * Round fractions down + * @link http://www.php.net/manual/en/function.floor.php + * @param value float

+ * The numeric value to round + *

+ * @return float value rounded to the next lowest integer. + * The return value of floor is still of type + * float because the value range of float is + * usually bigger than that of integer. + * + * @jms-builtin + */ +function floor ($value) {} + +/** + * Rounds a float + * @link http://www.php.net/manual/en/function.round.php + * @param val float

+ * The value to round + *

+ * @param precision int[optional]

+ * The optional number of decimal digits to round to. + *

+ * @param mode int[optional]

+ * One of PHP_ROUND_HALF_UP, + * PHP_ROUND_HALF_DOWN, + * PHP_ROUND_HALF_EVEN, or + * PHP_ROUND_HALF_ODD. + *

+ * @return float The rounded value + * + * @jms-builtin + */ +function round ($val, $precision = null, $mode = null) {} + +/** + * Sine + * @link http://www.php.net/manual/en/function.sin.php + * @param arg float

+ * A value in radians + *

+ * @return float The sine of arg + * + * @jms-builtin + */ +function sin ($arg) {} + +/** + * Cosine + * @link http://www.php.net/manual/en/function.cos.php + * @param arg float

+ * An angle in radians + *

+ * @return float The cosine of arg + * + * @jms-builtin + */ +function cos ($arg) {} + +/** + * Tangent + * @link http://www.php.net/manual/en/function.tan.php + * @param arg float

+ * The argument to process in radians + *

+ * @return float The tangent of arg + * + * @jms-builtin + */ +function tan ($arg) {} + +/** + * Arc sine + * @link http://www.php.net/manual/en/function.asin.php + * @param arg float

+ * The argument to process + *

+ * @return float The arc sine of arg in radians + * + * @jms-builtin + */ +function asin ($arg) {} + +/** + * Arc cosine + * @link http://www.php.net/manual/en/function.acos.php + * @param arg float

+ * The argument to process + *

+ * @return float The arc cosine of arg in radians. + * + * @jms-builtin + */ +function acos ($arg) {} + +/** + * Arc tangent + * @link http://www.php.net/manual/en/function.atan.php + * @param arg float

+ * The argument to process + *

+ * @return float The arc tangent of arg in radians. + * + * @jms-builtin + */ +function atan ($arg) {} + +/** + * Inverse hyperbolic tangent + * @link http://www.php.net/manual/en/function.atanh.php + * @param arg float

+ * The argument to process + *

+ * @return float Inverse hyperbolic tangent of arg + * + * @jms-builtin + */ +function atanh ($arg) {} + +/** + * Arc tangent of two variables + * @link http://www.php.net/manual/en/function.atan2.php + * @param y float

+ * Dividend parameter + *

+ * @param x float

+ * Divisor parameter + *

+ * @return float The arc tangent of y/x + * in radians. + * + * @jms-builtin + */ +function atan2 ($y, $x) {} + +/** + * Hyperbolic sine + * @link http://www.php.net/manual/en/function.sinh.php + * @param arg float

+ * The argument to process + *

+ * @return float The hyperbolic sine of arg + * + * @jms-builtin + */ +function sinh ($arg) {} + +/** + * Hyperbolic cosine + * @link http://www.php.net/manual/en/function.cosh.php + * @param arg float

+ * The argument to process + *

+ * @return float The hyperbolic cosine of arg + * + * @jms-builtin + */ +function cosh ($arg) {} + +/** + * Hyperbolic tangent + * @link http://www.php.net/manual/en/function.tanh.php + * @param arg float

+ * The argument to process + *

+ * @return float The hyperbolic tangent of arg + * + * @jms-builtin + */ +function tanh ($arg) {} + +/** + * Inverse hyperbolic sine + * @link http://www.php.net/manual/en/function.asinh.php + * @param arg float

+ * The argument to process + *

+ * @return float The inverse hyperbolic sine of arg + * + * @jms-builtin + */ +function asinh ($arg) {} + +/** + * Inverse hyperbolic cosine + * @link http://www.php.net/manual/en/function.acosh.php + * @param arg float

+ * The value to process + *

+ * @return float The inverse hyperbolic cosine of arg + * + * @jms-builtin + */ +function acosh ($arg) {} + +/** + * Returns exp(number) - 1, computed in a way that is accurate even + when the value of number is close to zero + * @link http://www.php.net/manual/en/function.expm1.php + * @param arg float

+ * The argument to process + *

+ * @return float 'e' to the power of arg minus one + * + * @jms-builtin + */ +function expm1 ($arg) {} + +/** + * Returns log(1 + number), computed in a way that is accurate even when + the value of number is close to zero + * @link http://www.php.net/manual/en/function.log1p.php + * @param number float

+ * The argument to process + *

+ * @return float log(1 + number) + * + * @jms-builtin + */ +function log1p ($number) {} + +/** + * Get value of pi + * @link http://www.php.net/manual/en/function.pi.php + * @return float The value of pi as float. + * + * @jms-builtin + */ +function pi () {} + +/** + * Finds whether a value is a legal finite number + * @link http://www.php.net/manual/en/function.is-finite.php + * @param val float

+ * The value to check + *

+ * @return bool true if val is a legal finite + * number within the allowed range for a PHP float on this platform, + * else false. + * + * @jms-builtin + */ +function is_finite ($val) {} + +/** + * Finds whether a value is not a number + * @link http://www.php.net/manual/en/function.is-nan.php + * @param val float

+ * The value to check + *

+ * @return bool true if val is 'not a number', + * else false. + * + * @jms-builtin + */ +function is_nan ($val) {} + +/** + * Finds whether a value is infinite + * @link http://www.php.net/manual/en/function.is-infinite.php + * @param val float

+ * The value to check + *

+ * @return bool true if val is infinite, else false. + * + * @jms-builtin + */ +function is_infinite ($val) {} + +/** + * Exponential expression + * @link http://www.php.net/manual/en/function.pow.php + * @param base number

+ * The base to use + *

+ * @param exp number

+ * The exponent + *

+ * @return number base raised to the power of exp. + * If the result can be represented as integer it will be returned as type + * integer, else it will be returned as type float. + * If the power cannot be computed false will be returned instead. + * + * @jms-builtin + */ +function pow ($base, $exp) {} + +/** + * Calculates the exponent of e + * @link http://www.php.net/manual/en/function.exp.php + * @param arg float

+ * The argument to process + *

+ * @return float 'e' raised to the power of arg + * + * @jms-builtin + */ +function exp ($arg) {} + +/** + * Natural logarithm + * @link http://www.php.net/manual/en/function.log.php + * @param arg float

+ * The value to calculate the logarithm for + *

+ * @param base float[optional]

+ * The optional logarithmic base to use + * (defaults to 'e' and so to the natural logarithm). + *

+ * @return float The logarithm of arg to + * base, if given, or the + * natural logarithm. + * + * @jms-builtin + */ +function log ($arg, $base = null) {} + +/** + * Base-10 logarithm + * @link http://www.php.net/manual/en/function.log10.php + * @param arg float

+ * The argument to process + *

+ * @return float The base-10 logarithm of arg + * + * @jms-builtin + */ +function log10 ($arg) {} + +/** + * Square root + * @link http://www.php.net/manual/en/function.sqrt.php + * @param arg float

+ * The argument to process + *

+ * @return float The square root of arg + * or the special value NAN for negative numbers. + * + * @jms-builtin + */ +function sqrt ($arg) {} + +/** + * Calculate the length of the hypotenuse of a right-angle triangle + * @link http://www.php.net/manual/en/function.hypot.php + * @param x float

+ * Length of first side + *

+ * @param y float

+ * Length of second side + *

+ * @return float Calculated length of the hypotenuse + * + * @jms-builtin + */ +function hypot ($x, $y) {} + +/** + * Converts the number in degrees to the radian equivalent + * @link http://www.php.net/manual/en/function.deg2rad.php + * @param number float

+ * Angular value in degrees + *

+ * @return float The radian equivalent of number + * + * @jms-builtin + */ +function deg2rad ($number) {} + +/** + * Converts the radian number to the equivalent number in degrees + * @link http://www.php.net/manual/en/function.rad2deg.php + * @param number float

+ * A radian value + *

+ * @return float The equivalent of number in degrees + * + * @jms-builtin + */ +function rad2deg ($number) {} + +/** + * Binary to decimal + * @link http://www.php.net/manual/en/function.bindec.php + * @param binary_string string

+ * The binary string to convert + *

+ * @return number The decimal value of binary_string + * + * @jms-builtin + */ +function bindec ($binary_string) {} + +/** + * Hexadecimal to decimal + * @link http://www.php.net/manual/en/function.hexdec.php + * @param hex_string string

+ * The hexadecimal string to convert + *

+ * @return number The decimal representation of hex_string + * + * @jms-builtin + */ +function hexdec ($hex_string) {} + +/** + * Octal to decimal + * @link http://www.php.net/manual/en/function.octdec.php + * @param octal_string string

+ * The octal string to convert + *

+ * @return number The decimal representation of octal_string + * + * @jms-builtin + */ +function octdec ($octal_string) {} + +/** + * Decimal to binary + * @link http://www.php.net/manual/en/function.decbin.php + * @param number int

+ * Decimal value to convert + *

+ *
ConstantDescription
ABDAY_(1-7)Abbreviated name of n-th day of the week.
DAY_(1-7)Name of the n-th day of the week (DAY_1 = Sunday).
ABMON_(1-12)Abbreviated name of the n-th month of the year.
MON_(1-12)Name of the n-th month of the year.
AM_STRString for Ante meridian.
PM_STRString for Post meridian.
D_T_FMTString that can be used as the format string for strftime to represent time and date.
D_FMTString that can be used as the format string for strftime to represent date.
T_FMTString that can be used as the format string for strftime to represent time.
T_FMT_AMPMString that can be used as the format string for strftime to represent time in 12-hour format with ante/post meridian.
ERAAlternate era.
ERA_YEARYear in alternate era format.
ERA_D_T_FMTDate and time in alternate era format (string can be used in strftime).
ERA_D_FMTDate in alternate era format (string can be used in strftime).
ERA_T_FMTTime in alternate era format (string can be used in strftime).
INT_CURR_SYMBOLInternational currency symbol.
CURRENCY_SYMBOLLocal currency symbol.
CRNCYSTRSame value as CURRENCY_SYMBOL.
MON_DECIMAL_POINTDecimal point character.
MON_THOUSANDS_SEPThousands separator (groups of three digits).
MON_GROUPINGLike "grouping" element.
POSITIVE_SIGNSign for positive values.
NEGATIVE_SIGNSign for negative values.
INT_FRAC_DIGITSInternational fractional digits.
FRAC_DIGITSLocal fractional digits.
P_CS_PRECEDESReturns 1 if CURRENCY_SYMBOL precedes a positive value.
P_SEP_BY_SPACEReturns 1 if a space separates CURRENCY_SYMBOL from a positive value.
N_CS_PRECEDESReturns 1 if CURRENCY_SYMBOL precedes a negative value.
N_SEP_BY_SPACEReturns 1 if a space separates CURRENCY_SYMBOL from a negative value.
P_SIGN_POSN
elementtypedescription
commandstring + * The command string that was passed to proc_open. + *
pidintprocess id
runningbool + * true if the process is still running, false if it has + * terminated. + *
signaledbool + * true if the child process has been terminated by + * an uncaught signal. Always set to false on Windows. + *
stoppedbool + * true if the child process has been stopped by a + * signal. Always set to false on Windows. + *
exitcodeint + * The exit code returned by the process (which is only + * meaningful if running is false). + * Only first call of this function return real value, next calls return + * -1. + *
termsigint + * The number of the signal that caused the child process to terminate + * its execution (only meaningful if signaled is true). + *
stopsigint + * The number of the signal that caused the child process to stop its + * execution (only meaningful if stopped is true). + *
+ * Range of inputs on 32-bit machines + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + *
positive numbernegative numberreturn value
00
11
210
21474836461111111111111111111111111111110
2147483647 (largest signed integer)1111111111111111111111111111111 (31 1's)
2147483648-214748364810000000000000000000000000000000
4294967294-211111111111111111111111111111110
4294967295 (largest unsigned integer)-111111111111111111111111111111111 (32 1's)
+ * + * Range of inputs on 64-bit machines + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + *
positive numbernegative numberreturn value
00
11
210
9223372036854775806111111111111111111111111111111111111111111111111111111111111110
9223372036854775807 (largest signed integer)111111111111111111111111111111111111111111111111111111111111111 (31 1's)
-92233720368547758081000000000000000000000000000000000000000000000000000000000000000
-21111111111111111111111111111111111111111111111111111111111111110
-11111111111111111111111111111111111111111111111111111111111111111 (64 1's)
+ * @return string Binary string representation of number + * + * @jms-builtin + */ +function decbin ($number) {} + +/** + * Decimal to octal + * @link http://www.php.net/manual/en/function.decoct.php + * @param number int

+ * Decimal value to convert + *

+ * @return string Octal string representation of number + * + * @jms-builtin + */ +function decoct ($number) {} + +/** + * Decimal to hexadecimal + * @link http://www.php.net/manual/en/function.dechex.php + * @param number int

+ * Decimal value to convert + *

+ * @return string Hexadecimal string representation of number + * + * @jms-builtin + */ +function dechex ($number) {} + +/** + * Convert a number between arbitrary bases + * @link http://www.php.net/manual/en/function.base-convert.php + * @param number string

+ * The number to convert + *

+ * @param frombase int

+ * The base number is in + *

+ * @param tobase int

+ * The base to convert number to + *

+ * @return string number converted to base tobase + * + * @jms-builtin + */ +function base_convert ($number, $frombase, $tobase) {} + +/** + * Format a number with grouped thousands + * @link http://www.php.net/manual/en/function.number-format.php + * @param number float

+ * The number being formatted. + *

+ * @param decimals int[optional]

+ * Sets the number of decimal points. + *

+ * @return string A formatted version of number. + * + * @jms-builtin + */ +function number_format ($number, $decimals = null) {} + +/** + * Returns the floating point remainder (modulo) of the division + of the arguments + * @link http://www.php.net/manual/en/function.fmod.php + * @param x float

+ * The dividend + *

+ * @param y float

+ * The divisor + *

+ * @return float The floating point remainder of + * x/y + * + * @jms-builtin + */ +function fmod ($x, $y) {} + +/** + * Converts a packed internet address to a human readable representation + * @link http://www.php.net/manual/en/function.inet-ntop.php + * @param in_addr string

+ * A 32bit IPv4, or 128bit IPv6 address. + *

+ * @return string a string representation of the address&return.falseforfailure;. + * + * @jms-builtin + */ +function inet_ntop ($in_addr) {} + +/** + * Converts a human readable IP address to its packed in_addr representation + * @link http://www.php.net/manual/en/function.inet-pton.php + * @param address string

+ * A human readable IPv4 or IPv6 address. + *

+ * @return string the in_addr representation of the given + * address + * + * @jms-builtin + */ +function inet_pton ($address) {} + +/** + * Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address + * @link http://www.php.net/manual/en/function.ip2long.php + * @param ip_address string

+ * A standard format address. + *

+ * @return int the IPv4 address or false if ip_address + * is invalid. + * + * @jms-builtin + */ +function ip2long ($ip_address) {} + +/** + * Converts an (IPv4) Internet network address into a string in Internet standard dotted format + * @link http://www.php.net/manual/en/function.long2ip.php + * @param proper_address string

+ * A proper address representation. + *

+ * @return string the Internet IP address as a string. + * + * @jms-builtin + */ +function long2ip ($proper_address) {} + +/** + * Gets the value of an environment variable + * @link http://www.php.net/manual/en/function.getenv.php + * @param varname string

+ * The variable name. + *

+ * @return string the value of the environment variable + * varname, or false on an error. + * + * @jms-builtin + */ +function getenv ($varname) {} + +/** + * Sets the value of an environment variable + * @link http://www.php.net/manual/en/function.putenv.php + * @param setting string

+ * The setting, like "FOO=BAR" + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function putenv ($setting) {} + +/** + * Gets options from the command line argument list + * @link http://www.php.net/manual/en/function.getopt.php + * @param options string Each character in this string will be used as option characters and + * matched against options passed to the script starting with a single + * hyphen (-). + * For example, an option string "x" recognizes an + * option -x. + * Only a-z, A-Z and 0-9 are allowed. + * @param longopts array[optional] An array of options. Each element in this array will be used as option + * strings and matched against options passed to the script starting with + * two hyphens (--). + * For example, an longopts element "opt" recognizes an + * option --opt. + * Prior to PHP5.3.0 this parameter was only available on few systems + * @return array This function will return an array of option / argument pairs or false on + * failure. + *

+ *

+ * The parsing of options will end at the first non-option found, anything + * that follows is discarded. + * + * @jms-builtin + */ +function getopt ($options, array $longopts = null) {} + +/** + * Gets system load average + * @link http://www.php.net/manual/en/function.sys-getloadavg.php + * @return array an array with three samples (last 1, 5 and 15 + * minutes). + * + * @jms-builtin + */ +function sys_getloadavg () {} + +/** + * Return current Unix timestamp with microseconds + * @link http://www.php.net/manual/en/function.microtime.php + * @param get_as_float bool[optional]

+ * When called without the optional argument, this function returns the string + * "msec sec" where sec is the current time measured in the number of + * seconds since the Unix Epoch (0:00:00 January 1, 1970 GMT), and + * msec is the microseconds part. + * Both portions of the string are returned in units of seconds. + *

+ *

+ * If the optional get_as_float is set to + * true then a float (in seconds) is returned. + *

+ * @return string|float + * + * @jms-builtin + */ +function microtime ($get_as_float = null) {} + +/** + * Get current time + * @link http://www.php.net/manual/en/function.gettimeofday.php + * @param return_float bool[optional]

+ * When set to true, a float instead of an array is returned. + *

+ * @return mixed By default an array is returned. If return_float + * is set, then a float is returned. + *

+ *

+ * Array keys: + * "sec" - seconds since the Unix Epoch + * "usec" - microseconds + * "minuteswest" - minutes west of Greenwich + * "dsttime" - type of dst correction + * + * @jms-builtin + */ +function gettimeofday ($return_float = null) {} + +/** + * Gets the current resource usages + * @link http://www.php.net/manual/en/function.getrusage.php + * @param who int[optional]

+ * If who is 1, getrusage will be called with + * RUSAGE_CHILDREN. + *

+ * @return array an associative array containing the data returned from the system + * call. All entries are accessible by using their documented field names. + * + * @jms-builtin + */ +function getrusage ($who = null) {} + +/** + * Generate a unique ID + * @link http://www.php.net/manual/en/function.uniqid.php + * @param prefix string[optional]

+ * Can be useful, for instance, if you generate identifiers + * simultaneously on several hosts that might happen to generate the + * identifier at the same microsecond. + *

+ *

+ * With an empty prefix, the returned string will + * be 13 characters long. If more_entropy is + * true, it will be 23 characters. + *

+ * @param more_entropy bool[optional]

+ * If set to true, uniqid will add additional + * entropy (using the combined linear congruential generator) at the end + * of the return value, which should make the results more unique. + *

+ * @return string the unique identifier, as a string. + * + * @jms-builtin + */ +function uniqid ($prefix = null, $more_entropy = null) {} + +/** + * Convert a quoted-printable string to an 8 bit string + * @link http://www.php.net/manual/en/function.quoted-printable-decode.php + * @param str string

+ * The input string. + *

+ * @return string the 8-bit binary string. + * + * @jms-builtin + */ +function quoted_printable_decode ($str) {} + +/** + * Convert a 8 bit string to a quoted-printable string + * @link http://www.php.net/manual/en/function.quoted-printable-encode.php + * @param str string

+ * The input string. + *

+ * @return string the encoded string. + * + * @jms-builtin + */ +function quoted_printable_encode ($str) {} + +/** + * Convert from one Cyrillic character set to another + * @link http://www.php.net/manual/en/function.convert-cyr-string.php + * @param str string

+ * The string to be converted. + *

+ * @param from string

+ * The source Cyrillic character set, as a single character. + *

+ * @param to string

+ * The target Cyrillic character set, as a single character. + *

+ * @return string the converted string. + * + * @jms-builtin + */ +function convert_cyr_string ($str, $from, $to) {} + +/** + * Gets the name of the owner of the current PHP script + * @link http://www.php.net/manual/en/function.get-current-user.php + * @return string the username as a string. + * + * @jms-builtin + */ +function get_current_user () {} + +/** + * Limits the maximum execution time + * @link http://www.php.net/manual/en/function.set-time-limit.php + * @param seconds int

+ * The maximum execution time, in seconds. If set to zero, no time limit + * is imposed. + *

+ * @return void + * + * @jms-builtin + */ +function set_time_limit ($seconds) {} + +/** + * Gets the value of a PHP configuration option + * @link http://www.php.net/manual/en/function.get-cfg-var.php + * @param option string

+ * The configuration option name. + *

+ * @return string the current value of the PHP configuration variable specified by + * option, or false if an error occurs. + * + * @jms-builtin + */ +function get_cfg_var ($option) {} + +/** + * &Alias; set_magic_quotes_runtime + * @link http://www.php.net/manual/en/function.magic-quotes-runtime.php + * @param new_setting + * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged. + * + * @jms-builtin + */ +function magic_quotes_runtime ($new_setting) {} + +/** + * Sets the current active configuration setting of magic_quotes_runtime + * @link http://www.php.net/manual/en/function.set-magic-quotes-runtime.php + * @param new_setting bool

+ * false for off, true for on. + *

+ * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function set_magic_quotes_runtime ($new_setting) {} + +/** + * Gets the current configuration setting of magic_quotes_gpc + * @link http://www.php.net/manual/en/function.get-magic-quotes-gpc.php + * @return int 0 if magic_quotes_gpc is off, 1 otherwise. + * + * @jms-builtin + */ +function get_magic_quotes_gpc () {} + +/** + * Gets the current active configuration setting of magic_quotes_runtime + * @link http://www.php.net/manual/en/function.get-magic-quotes-runtime.php + * @return int 0 if magic_quotes_runtime is off, 1 otherwise. + * + * @jms-builtin + */ +function get_magic_quotes_runtime () {} + +/** + * Import GET/POST/Cookie variables into the global scope + * @link http://www.php.net/manual/en/function.import-request-variables.php + * @param types string

+ * Using the types parameter, you can specify + * which request variables to import. You can use 'G', 'P' and 'C' + * characters respectively for GET, POST and Cookie. These characters are + * not case sensitive, so you can also use any combination of 'g', 'p' + * and 'c'. POST includes the POST uploaded file information. + *

+ *

+ * Note that the order of the letters matters, as when using + * "GP", the + * POST variables will overwrite GET variables with the same name. Any + * other letters than GPC are discarded. + *

+ * @param prefix string[optional]

+ * Variable name prefix, prepended before all variable's name imported + * into the global scope. So if you have a GET value named + * "userid", and provide a prefix + * "pref_", then you'll get a global variable named + * $pref_userid. + *

+ *

+ * Although the prefix parameter is optional, you + * will get an E_NOTICE level + * error if you specify no prefix, or specify an empty string as a + * prefix. This is a possible security hazard. Notice level errors are + * not displayed using the default error reporting level. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function import_request_variables ($types, $prefix = null) {} + +/** + * Send an error message somewhere + * @link http://www.php.net/manual/en/function.error-log.php + * @param message string

+ * The error message that should be logged. + *

+ * @param message_type int[optional]

+ * Says where the error should go. The possible message types are as + * follows: + *

+ *

+ * + * error_log log types + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
0 + * message is sent to PHP's system logger, using + * the Operating System's system logging mechanism or a file, depending + * on what the error_log + * configuration directive is set to. This is the default option. + *
1 + * message is sent by email to the address in + * the destination parameter. This is the only + * message type where the fourth parameter, + * extra_headers is used. + *
2 + * No longer an option. + *
3 + * message is appended to the file + * destination. A newline is not automatically + * added to the end of the message string. + *
4 + * message is sent directly to the SAPI logging + * handler. + *
+ *

+ * @param destination string[optional]

+ * The destination. Its meaning depends on the + * message_type parameter as described above. + *

+ * @param extra_headers string[optional]

+ * The extra headers. It's used when the message_type + * parameter is set to 1. + * This message type uses the same internal function as + * mail does. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function error_log ($message, $message_type = null, $destination = null, $extra_headers = null) {} + +/** + * Get the last occurred error + * @link http://www.php.net/manual/en/function.error-get-last.php + * @return array an associative array describing the last error with keys "type", + * "message", "file" and "line". Returns &null; if there hasn't been an error + * yet. + * + * @jms-builtin + */ +function error_get_last () {} + +/** + * Call a user function given by the first parameter + * @link http://www.php.net/manual/en/function.call-user-func.php + * @param function callback

+ * The function to be called. Class methods may also be invoked + * statically using this function by passing + * array($classname, $methodname) to this parameter. + * Additionally class methods of an object instance may be called by passing + * array($objectinstance, $methodname) to this parameter. + *

+ * @param parameter mixed[optional]

+ * Zero or more parameters to be passed to the function. + *

+ *

+ * Note that the parameters for call_user_func are + * not passed by reference. + * call_user_func example and references + * ]]> + * &example.outputs; + *

+ * @param _ mixed[optional] + * @return mixed the function result, or false on error. + * + * @jms-builtin + */ +function call_user_func ($function, $parameter = null, $_ = null) {} + +/** + * Call a user function given with an array of parameters + * @link http://www.php.net/manual/en/function.call-user-func-array.php + * @param function callback

+ * The function to be called. + *

+ * @param param_arr array

+ * The parameters to be passed to the function, as an indexed array. + *

+ * @return mixed the function result, or false on error. + * + * @jms-builtin + */ +function call_user_func_array ($function, array $param_arr) {} + +/** + * Call a user method on an specific object [deprecated] + * @link http://www.php.net/manual/en/function.call-user-method.php + * @param method_name string

+ * The method name being called. + *

+ * @param obj object

+ * The object that method_name + * is being called on. + *

+ * @param parameter mixed[optional] + * @param _ mixed[optional] + * @deprecated Deprecated as of PHP 4.1.0 (use call_user_func() instead). + * @return mixed + * + * @jms-builtin + */ +function call_user_method ($method_name, &$obj, $parameter = null, $_ = null) {} + +/** + * Call a user method given with an array of parameters [deprecated] + * @link http://www.php.net/manual/en/function.call-user-method-array.php + * @param method_name string

+ * The method name being called. + *

+ * @param obj object

+ * The object that method_name + * is being called on. + *

+ * @param params array

+ * An array of parameters. + *

+ * @deprecated Deprecated as of PHP 4.1.0 (use call_user_func_array() instead). + * @return mixed + * + * @jms-builtin + */ +function call_user_method_array ($method_name, &$obj, array $params) {} + +/** + * Call a static method + * @link http://www.php.net/manual/en/function.forward-static-call.php + * @param function callback

+ * The function or method to be called. This parameter may be an array, + * with the name of the class, and the method, or a string, with a function + * name. + *

+ * @param parameter mixed[optional]

+ * Zero or more parameters to be passed to the function. + *

+ * @param _ mixed[optional] + * @return mixed the function result, or false on error. + * + * @jms-builtin + */ +function forward_static_call ($function, $parameter = null, $_ = null) {} + +/** + * Call a static method and pass the arguments as array + * @link http://www.php.net/manual/en/function.forward-static-call-array.php + * @param function callback

+ * The function or method to be called. This parameter may be an &array;, + * with the name of the class, and the method, or a &string;, with a function + * name. + *

+ * @param parameters array[optional] + * @return mixed the function result, or false on error. + * + * @jms-builtin + */ +function forward_static_call_array ($function, array $parameters = null) {} + +/** + * Generates a storable representation of a value + * @link http://www.php.net/manual/en/function.serialize.php + * @param value mixed

+ * The value to be serialized. serialize + * handles all types, except the resource-type. + * You can even serialize arrays that contain + * references to itself. Circular references inside the array/object you + * are serializing will also be stored. Any other + * reference will be lost. + *

+ *

+ * When serializing objects, PHP will attempt to call the member function + * __sleep prior to serialization. + * This is to allow the object to do any last minute clean-up, etc. prior + * to being serialized. Likewise, when the object is restored using + * unserialize the __wakeup member function is called. + *

+ *

+ * Object's private members have the class name prepended to the member + * name; protected members have a '*' prepended to the member name. + * These prepended values have null bytes on either side. + *

+ * @return string a string containing a byte-stream representation of + * value that can be stored anywhere. + * + * @jms-builtin + */ +function serialize ($value) {} + +/** + * Creates a PHP value from a stored representation + * @link http://www.php.net/manual/en/function.unserialize.php + * @param str string

+ * The serialized string. + *

+ *

+ * If the variable being unserialized is an object, after successfully + * reconstructing the object PHP will automatically attempt to call the + * __wakeup member function (if it exists). + *

+ *

+ * unserialize_callback_func directive + *

+ * It's possible to set a callback-function which will be called, + * if an undefined class should be instantiated during unserializing. + * (to prevent getting an incomplete object "__PHP_Incomplete_Class".) + * Use your &php.ini;, ini_set or &htaccess; + * to define 'unserialize_callback_func'. Everytime an undefined class + * should be instantiated, it'll be called. To disable this feature just + * empty this setting. + *

+ *

+ * @return mixed The converted value is returned, and can be a boolean, + * integer, float, string, + * array or object. + *

+ *

+ * In case the passed string is not unserializeable, false is returned and + * E_NOTICE is issued. + * + * @jms-builtin + */ +function unserialize ($str) {} + +/** + * Dumps information about a variable + * @link http://www.php.net/manual/en/function.var-dump.php + * @param expression mixed

+ * The variable you want to export. + *

+ * @param expression mixed[optional] + * @return void + * + * @jms-builtin + */ +function var_dump ($expression, $expression = null) {} + +/** + * Outputs or returns a parsable string representation of a variable + * @link http://www.php.net/manual/en/function.var-export.php + * @param expression mixed

+ * The variable you want to export. + *

+ * @param return bool[optional]

+ * If used and set to true, var_export will return + * the variable representation instead of outputing it. + *

+ * ¬e.uses-ob; + * @return string|null the variable representation when the return + * parameter is used and evaluates to true. Otherwise, this function will + * return &null;. + * + * @jms-builtin + */ +function var_export ($expression, $return = null) {} + +/** + * Dumps a string representation of an internal zend value to output + * @link http://www.php.net/manual/en/function.debug-zval-dump.php + * @param variable mixed

+ * The variable being evaluated. + *

+ * @return void + * + * @jms-builtin + */ +function debug_zval_dump ($variable) {} + +/** + * Prints human-readable information about a variable + * @link http://www.php.net/manual/en/function.print-r.php + * @param expression mixed

+ * The expression to be printed. + *

+ * @param return bool[optional]

+ * If you would like to capture the output of print_r, + * use the return parameter. When this parameter is set + * to true, print_r will return the information rather than print it. + *

+ * @return mixed If given a string, integer or float, + * the value itself will be printed. If given an array, values + * will be presented in a format that shows keys and elements. Similar + * notation is used for objects. + *

+ *

+ * When the return parameter is true, this function + * will return a string. Otherwise, the return value is true. + * + * @jms-builtin + */ +function print_r ($expression, $return = null) {} + +/** + * Returns the amount of memory allocated to PHP + * @link http://www.php.net/manual/en/function.memory-get-usage.php + * @param real_usage bool[optional]

+ * Set this to true to get the real size of memory allocated from + * system. If not set or false only the memory used by + * emalloc() is reported. + *

+ * @return int the memory amount in bytes. + * + * @jms-builtin + */ +function memory_get_usage ($real_usage = null) {} + +/** + * Returns the peak of memory allocated by PHP + * @link http://www.php.net/manual/en/function.memory-get-peak-usage.php + * @param real_usage bool[optional]

+ * Set this to true to get the real size of memory allocated from + * system. If not set or false only the memory used by + * emalloc() is reported. + *

+ * @return int the memory peak in bytes. + * + * @jms-builtin + */ +function memory_get_peak_usage ($real_usage = null) {} + +/** + * Register a function for execution on shutdown + * @link http://www.php.net/manual/en/function.register-shutdown-function.php + * @param function callback

+ * The shutdown function to register. + *

+ *

+ * The shutdown functions are called as the part of the request so that + * it's possible to send the output from them. There is currently no way + * to process the data with output buffering functions in the shutdown + * function. + *

+ *

+ * Shutdown functions are called after closing all opened output buffers + * thus, for example, its output will not be compressed if zlib.output_compression is + * enabled. + *

+ * @param parameter mixed[optional]

+ * It is possible to pass parameters to the shutdown function by passing + * additional parameters. + *

+ * @param _ mixed[optional] + * @return void + * + * @jms-builtin + */ +function register_shutdown_function ($function, $parameter = null, $_ = null) {} + +/** + * Register a function for execution on each tick + * @link http://www.php.net/manual/en/function.register-tick-function.php + * @param function callback

+ * The function name as a string, or an array consisting of an object and + * a method. + *

+ * @param arg mixed[optional]

+ *

+ * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function register_tick_function ($function, $arg = null, $_ = null) {} + +/** + * De-register a function for execution on each tick + * @link http://www.php.net/manual/en/function.unregister-tick-function.php + * @param function_name string

+ * The function name, as a string. + *

+ * @return void + * + * @jms-builtin + */ +function unregister_tick_function ($function_name) {} + +/** + * Syntax highlighting of a file + * @link http://www.php.net/manual/en/function.highlight-file.php + * @param filename string

+ * Path to the PHP file to be highlighted. + *

+ * @param return bool[optional]

+ * Set this parameter to true to make this function return the + * highlighted code. + *

+ * @return mixed If return is set to true, returns the highlighted + * code as a string instead of printing it out. Otherwise, it will return + * true on success, false on failure. + * + * @jms-builtin + */ +function highlight_file ($filename, $return = null) {} + +/** + * &Alias; highlight_file + * @link http://www.php.net/manual/en/function.show-source.php + * @param file_name + * @param return[optional] + * + * @jms-builtin + */ +function show_source ($file_name, $return) {} + +/** + * Syntax highlighting of a string + * @link http://www.php.net/manual/en/function.highlight-string.php + * @param str string

+ * The PHP code to be highlighted. This should include the opening tag. + *

+ * @param return bool[optional]

+ * Set this parameter to true to make this function return the + * highlighted code. + *

+ * @return mixed If return is set to true, returns the highlighted + * code as a string instead of printing it out. Otherwise, it will return + * true on success, false on failure. + * + * @jms-builtin + */ +function highlight_string ($str, $return = null) {} + +/** + * Return source with stripped comments and whitespace + * @link http://www.php.net/manual/en/function.php-strip-whitespace.php + * @param filename string

+ * Path to the PHP file. + *

+ * @return string The stripped source code will be returned on success, or an empty string + * on failure. + *

+ *

+ * This function works as described as of PHP 5.0.1. Before this it would + * only return an empty string. For more information on this bug and its + * prior behavior, see bug report + * #29606. + * + * @jms-builtin + */ +function php_strip_whitespace ($filename) {} + +/** + * Gets the value of a configuration option + * @link http://www.php.net/manual/en/function.ini-get.php + * @param varname string

+ * The configuration option name. + *

+ * @return string the value of the configuration option as a string on success, or + * an empty string on failure or for null values. + * + * @jms-builtin + */ +function ini_get ($varname) {} + +/** + * Gets all configuration options + * @link http://www.php.net/manual/en/function.ini-get-all.php + * @param extension string[optional]

+ * An optional extension name. If set, the function return only options + * specific for that extension. + *

+ * @param details bool[optional]

+ * Retrieve details settings or only the current value for each setting. + * Default is true (retrieve details). + *

+ * @return array an associative array with directive name as the array key. + *

+ *

+ * When details is true (default) the array will + * contain global_value (set in + * &php.ini;), local_value (perhaps set with + * ini_set or &htaccess;), and + * access (the access level). + *

+ *

+ * When details is false the value will be the + * current value of the option. + *

+ *

+ * See the manual section + * for information on what access levels mean. + *

+ *

+ * It's possible for a directive to have multiple access levels, which is + * why access shows the appropriate bitmask values. + * + * @jms-builtin + */ +function ini_get_all ($extension = null, $details = null) {} + +/** + * Sets the value of a configuration option + * @link http://www.php.net/manual/en/function.ini-set.php + * @param varname string

+ *

+ *

+ * Not all the available options can be changed using + * ini_set. There is a list of all available options + * in the appendix. + *

+ * @param newvalue string

+ * The new value for the option. + *

+ * @return string the old value on success, false on failure. + * + * @jms-builtin + */ +function ini_set ($varname, $newvalue) {} + +/** + * &Alias; ini_set + * @link http://www.php.net/manual/en/function.ini-alter.php + * @param varname + * @param newvalue + * + * @jms-builtin + */ +function ini_alter ($varname, $newvalue) {} + +/** + * Restores the value of a configuration option + * @link http://www.php.net/manual/en/function.ini-restore.php + * @param varname string

+ * The configuration option name. + *

+ * @return void + * + * @jms-builtin + */ +function ini_restore ($varname) {} + +/** + * Gets the current include_path configuration option + * @link http://www.php.net/manual/en/function.get-include-path.php + * @return string the path, as a string. + * + * @jms-builtin + */ +function get_include_path () {} + +/** + * Sets the include_path configuration option + * @link http://www.php.net/manual/en/function.set-include-path.php + * @param new_include_path string

+ * The new value for the include_path + *

+ * @return string the old include_path on + * success&return.falseforfailure;. + * + * @jms-builtin + */ +function set_include_path ($new_include_path) {} + +/** + * Restores the value of the include_path configuration option + * @link http://www.php.net/manual/en/function.restore-include-path.php + * @return void + * + * @jms-builtin + */ +function restore_include_path () {} + +/** + * Send a cookie + * @link http://www.php.net/manual/en/function.setcookie.php + * @param name string

+ * The name of the cookie. + *

+ * @param value string[optional]

+ * The value of the cookie. This value is stored on the clients + * computer; do not store sensitive information. + * Assuming the name is 'cookiename', this + * value is retrieved through $_COOKIE['cookiename'] + *

+ * @param expire int[optional]

+ * The time the cookie expires. This is a Unix timestamp so is + * in number of seconds since the epoch. In other words, you'll + * most likely set this with the time function + * plus the number of seconds before you want it to expire. Or + * you might use mktime. + * time()+60*60*24*30 will set the cookie to + * expire in 30 days. If set to 0, or omitted, the cookie will expire at + * the end of the session (when the browser closes). + *

+ *

+ *

+ * You may notice the expire parameter takes on a + * Unix timestamp, as opposed to the date format Wdy, DD-Mon-YYYY + * HH:MM:SS GMT, this is because PHP does this conversion + * internally. + *

+ *

+ * expire is compared to the client's time which can + * differ from server's time. + *

+ *

+ * @param path string[optional]

+ * The path on the server in which the cookie will be available on. + * If set to '/', the cookie will be available + * within the entire domain. If set to + * '/foo/', the cookie will only be available + * within the /foo/ directory and all + * sub-directories such as /foo/bar/ of + * domain. The default value is the + * current directory that the cookie is being set in. + *

+ * @param domain string[optional]

+ * The domain that the cookie is available. + * To make the cookie available on all subdomains of example.com + * then you'd set it to '.example.com'. The + * . is not required but makes it compatible + * with more browsers. Setting it to www.example.com + * will make the cookie only available in the www + * subdomain. Refer to tail matching in the + * spec for details. + *

+ * @param secure bool[optional]

+ * Indicates that the cookie should only be transmitted over a + * secure HTTPS connection from the client. When set to true, the + * cookie will only be set if a secure connection exists. + * On the server-side, it's on the programmer to send this + * kind of cookie only on secure connection (e.g. with respect to + * $_SERVER["HTTPS"]). + *

+ * @param httponly bool[optional]

+ * When true the cookie will be made accessible only through the HTTP + * protocol. This means that the cookie won't be accessible by + * scripting languages, such as JavaScript. This setting can effectively + * help to reduce identity theft through XSS attacks (although it is + * not supported by all browsers). Added in PHP 5.2.0. + * true or false + *

+ * @return bool If output exists prior to calling this function, + * setcookie will fail and return false. If + * setcookie successfully runs, it will return true. + * This does not indicate whether the user accepted the cookie. + * + * @jms-builtin + */ +function setcookie ($name, $value = null, $expire = null, $path = null, $domain = null, $secure = null, $httponly = null) {} + +/** + * Send a cookie without urlencoding the cookie value + * @link http://www.php.net/manual/en/function.setrawcookie.php + * @param name string + * @param value string[optional] + * @param expire int[optional] + * @param path string[optional] + * @param domain string[optional] + * @param secure bool[optional] + * @param httponly bool[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function setrawcookie ($name, $value = null, $expire = null, $path = null, $domain = null, $secure = null, $httponly = null) {} + +/** + * Send a raw HTTP header + * @link http://www.php.net/manual/en/function.header.php + * @param string string

+ * The header string. + *

+ *

+ * There are two special-case header calls. The first is a header + * that starts with the string "HTTP/" (case is not + * significant), which will be used to figure out the HTTP status + * code to send. For example, if you have configured Apache to + * use a PHP script to handle requests for missing files (using + * the ErrorDocument directive), you may want to + * make sure that your script generates the proper status code. + *

+ *

+ * ]]> + *

+ *

+ * The second special case is the "Location:" header. Not only does + * it send this header back to the browser, but it also returns a + * REDIRECT (302) status code to the browser + * unless the 201 or + * a 3xx status code has already been set. + *

+ *

+ * ]]> + *

+ * @param replace bool[optional]

+ * The optional replace parameter indicates + * whether the header should replace a previous similar header, or + * add a second header of the same type. By default it will replace, + * but if you pass in false as the second argument you can force + * multiple headers of the same type. For example: + *

+ *

+ * ]]> + *

+ * @param http_response_code int[optional]

+ * Forces the HTTP response code to the specified value. + *

+ * @return void + * + * @jms-builtin + */ +function header ($string, $replace = null, $http_response_code = null) {} + +/** + * Remove previously set headers + * @link http://www.php.net/manual/en/function.header-remove.php + * @param name string[optional]

+ * The header name to be removed. + *

+ * This parameter is case-insensitive. + * @return void + * + * @jms-builtin + */ +function header_remove ($name = null) {} + +/** + * Checks if or where headers have been sent + * @link http://www.php.net/manual/en/function.headers-sent.php + * @param file string[optional]

+ * If the optional file and + * line parameters are set, + * headers_sent will put the PHP source file name + * and line number where output started in the file + * and line variables. + *

+ * @param line int[optional]

+ * The line number where the output started. + *

+ * @return bool headers_sent will return false if no HTTP headers + * have already been sent or true otherwise. + * + * @jms-builtin + */ +function headers_sent (&$file = null, &$line = null) {} + +/** + * Returns a list of response headers sent (or ready to send) + * @link http://www.php.net/manual/en/function.headers-list.php + * @return array a numerically indexed array of headers. + * + * @jms-builtin + */ +function headers_list () {} + +/** + * Check whether client disconnected + * @link http://www.php.net/manual/en/function.connection-aborted.php + * @return int 1 if client disconnected, 0 otherwise. + * + * @jms-builtin + */ +function connection_aborted () {} + +/** + * Returns connection status bitfield + * @link http://www.php.net/manual/en/function.connection-status.php + * @return int the connection status bitfield, which can be used against the + * CONNECTION_XXX constants to determine the connection + * status. + * + * @jms-builtin + */ +function connection_status () {} + +/** + * Set whether a client disconnect should abort script execution + * @link http://www.php.net/manual/en/function.ignore-user-abort.php + * @param value string[optional]

+ * If set, this function will set the ignore_user_abort ini setting + * to the given value. If not, this function will + * only return the previous setting without changing it. + *

+ * @return int the previous setting, as an integer. + * + * @jms-builtin + */ +function ignore_user_abort ($value = null) {} + +/** + * Parse a configuration file + * @link http://www.php.net/manual/en/function.parse-ini-file.php + * @param filename string

+ * The filename of the ini file being parsed. + *

+ * @param process_sections bool[optional]

+ * By setting the process_sections + * parameter to true, you get a multidimensional array, with + * the section names and settings included. The default + * for process_sections is false + *

+ * @param scanner_mode int[optional]

+ * Can either be INI_SCANNER_NORMAL (default) or + * INI_SCANNER_RAW. If INI_SCANNER_RAW + * is supplied, then option values will not be parsed. + *

+ * @return array The settings are returned as an associative array on success, + * and false on failure. + * + * @jms-builtin + */ +function parse_ini_file ($filename, $process_sections = null, $scanner_mode = null) {} + +/** + * Parse a configuration string + * @link http://www.php.net/manual/en/function.parse-ini-string.php + * @param ini string

+ * The contents of the ini file being parsed. + *

+ * @param process_sections bool[optional]

+ * By setting the process_sections + * parameter to true, you get a multidimensional array, with + * the section names and settings included. The default + * for process_sections is false + *

+ * @param scanner_mode int[optional]

+ * Can either be INI_SCANNER_NORMAL (default) or + * INI_SCANNER_RAW. If INI_SCANNER_RAW + * is supplied, then option values will not be parsed. + *

+ * @return array The settings are returned as an associative array on success, + * and false on failure. + * + * @jms-builtin + */ +function parse_ini_string ($ini, $process_sections = null, $scanner_mode = null) {} + +/** + * Tells whether the file was uploaded via HTTP POST + * @link http://www.php.net/manual/en/function.is-uploaded-file.php + * @param filename string

+ * The filename being checked. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function is_uploaded_file ($filename) {} + +/** + * Moves an uploaded file to a new location + * @link http://www.php.net/manual/en/function.move-uploaded-file.php + * @param filename string

+ * The filename of the uploaded file. + *

+ * @param destination string

+ * The destination of the moved file. + *

+ * @return bool If filename is not a valid upload file, + * then no action will occur, and + * move_uploaded_file will return + * false. + *

+ *

+ * If filename is a valid upload file, but + * cannot be moved for some reason, no action will occur, and + * move_uploaded_file will return + * false. Additionally, a warning will be issued. + * + * @jms-builtin + */ +function move_uploaded_file ($filename, $destination) {} + +/** + * Get the Internet host name corresponding to a given IP address + * @link http://www.php.net/manual/en/function.gethostbyaddr.php + * @param ip_address string

+ * The host IP address. + *

+ * @return string the host name or the unmodified ip_address + * on failure. + * + * @jms-builtin + */ +function gethostbyaddr ($ip_address) {} + +/** + * Get the IPv4 address corresponding to a given Internet host name + * @link http://www.php.net/manual/en/function.gethostbyname.php + * @param hostname string

+ * The host name. + *

+ * @return string the IPv4 address or a string containing the unmodified + * hostname on failure. + * + * @jms-builtin + */ +function gethostbyname ($hostname) {} + +/** + * Get a list of IPv4 addresses corresponding to a given Internet host + name + * @link http://www.php.net/manual/en/function.gethostbynamel.php + * @param hostname string

+ * The host name. + *

+ * @return array an array of IPv4 addresses or false if + * hostname could not be resolved. + * + * @jms-builtin + */ +function gethostbynamel ($hostname) {} + +/** + * Gets the host name + * @link http://www.php.net/manual/en/function.gethostname.php + * @return string a string with the hostname on success, otherwise false is + * returned. + * + * @jms-builtin + */ +function gethostname () {} + +/** + * &Alias; checkdnsrr + * @link http://www.php.net/manual/en/function.dns-check-record.php + * @param host + * @param type[optional] + * + * @jms-builtin + */ +function dns_check_record ($host, $type) {} + +/** + * Check DNS records corresponding to a given Internet host name or IP address + * @link http://www.php.net/manual/en/function.checkdnsrr.php + * @param host string

+ * host may either be the IP address in + * dotted-quad notation or the host name. + *

+ * @param type string[optional]

+ * type may be any one of: A, MX, NS, SOA, + * PTR, CNAME, AAAA, A6, SRV, NAPTR, TXT or ANY. + *

+ * @return bool true if any records are found; returns false if no records + * were found or if an error occurred. + * + * @jms-builtin + */ +function checkdnsrr ($host, $type = null) {} + +/** + * &Alias; getmxrr + * @link http://www.php.net/manual/en/function.dns-get-mx.php + * @param hostname + * @param mxhosts + * @param weight[optional] + * + * @jms-builtin + */ +function dns_get_mx ($hostname, &$mxhosts, &$weight) {} + +/** + * Get MX records corresponding to a given Internet host name + * @link http://www.php.net/manual/en/function.getmxrr.php + * @param hostname string

+ * The Internet host name. + *

+ * @param mxhosts array

+ * A list of the MX records found is placed into the array + * mxhosts. + *

+ * @param weight array[optional]

+ * If the weight array is given, it will be filled + * with the weight information gathered. + *

+ * @return bool true if any records are found; returns false if no records + * were found or if an error occurred. + * + * @jms-builtin + */ +function getmxrr ($hostname, array &$mxhosts, array &$weight = null) {} + +/** + * Fetch DNS Resource Records associated with a hostname + * @link http://www.php.net/manual/en/function.dns-get-record.php + * @param hostname string

+ * hostname should be a valid DNS hostname such + * as "www.example.com". Reverse lookups can be generated + * using in-addr.arpa notation, but + * gethostbyaddr is more suitable for + * the majority of reverse lookups. + *

+ *

+ * Per DNS standards, email addresses are given in user.host format (for + * example: hostmaster.example.com as opposed to hostmaster@example.com), + * be sure to check this value and modify if necessary before using it + * with a functions such as mail. + *

+ * @param type int[optional]

+ * By default, dns_get_record will search for any + * resource records associated with hostname. + * To limit the query, specify the optional type + * parameter. May be any one of the following: + * DNS_A, DNS_CNAME, + * DNS_HINFO, DNS_MX, + * DNS_NS, DNS_PTR, + * DNS_SOA, DNS_TXT, + * DNS_AAAA, DNS_SRV, + * DNS_NAPTR, DNS_A6, + * DNS_ALL or DNS_ANY. + *

+ *

+ * Because of eccentricities in the performance of libresolv + * between platforms, DNS_ANY will not + * always return every record, the slower DNS_ALL + * will collect all records more reliably. + *

+ * @param authns array[optional]

+ * Passed by reference and, if given, will be populated with Resource + * Records for the Authoritative Name Servers. + *

+ * @param addtl array[optional]

+ * Passed by reference and, if given, will be populated with any + * Additional Records. + *

+ * @return array This function returns an array of associative arrays. Each associative array contains + * at minimum the following keys: + * + * Basic DNS attributes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
AttributeMeaning
host + * The record in the DNS namespace to which the rest of the associated data refers. + *
class + * dns_get_record only returns Internet class records and as + * such this parameter will always return IN. + *
type + * String containing the record type. Additional attributes will also be contained + * in the resulting array dependant on the value of type. See table below. + *
ttl + * "Time To Live" remaining for this record. This will not equal + * the record's original ttl, but will rather equal the original ttl minus whatever + * length of time has passed since the authoritative name server was queried. + *
+ *

+ *

+ * + * Other keys in associative arrays dependant on 'type' + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeExtra Columns
A + * ip: An IPv4 addresses in dotted decimal notation. + *
MX + * pri: Priority of mail exchanger. + * Lower numbers indicate greater priority. + * target: FQDN of the mail exchanger. + * See also dns_get_mx. + *
CNAME + * target: FQDN of location in DNS namespace to which + * the record is aliased. + *
NS + * target: FQDN of the name server which is authoritative + * for this hostname. + *
PTR + * target: Location within the DNS namespace to which + * this record points. + *
TXT + * txt: Arbitrary string data associated with this record. + *
HINFO + * cpu: IANA number designating the CPU of the machine + * referenced by this record. + * os: IANA number designating the Operating System on + * the machine referenced by this record. + * See IANA's Operating System + * Names for the meaning of these values. + *
SOA + * mname: FQDN of the machine from which the resource + * records originated. + * rname: Email address of the administrative contain + * for this domain. + * serial: Serial # of this revision of the requested + * domain. + * refresh: Refresh interval (seconds) secondary name + * servers should use when updating remote copies of this domain. + * retry: Length of time (seconds) to wait after a + * failed refresh before making a second attempt. + * expire: Maximum length of time (seconds) a secondary + * DNS server should retain remote copies of the zone data without a + * successful refresh before discarding. + * minimum-ttl: Minimum length of time (seconds) a + * client can continue to use a DNS resolution before it should request + * a new resolution from the server. Can be overridden by individual + * resource records. + *
AAAA + * ipv6: IPv6 address + *
A6(PHP >= 5.1.0) + * masklen: Length (in bits) to inherit from the target + * specified by chain. + * ipv6: Address for this specific record to merge with + * chain. + * chain: Parent record to merge with + * ipv6 data. + *
SRV + * pri: (Priority) lowest priorities should be used first. + * weight: Ranking to weight which of commonly prioritized + * targets should be chosen at random. + * target and port: hostname and port + * where the requested service can be found. + * For additional information see: RFC 2782 + *
NAPTR + * order and pref: Equivalent to + * pri and weight above. + * flags, services, regex, + * and replacement: Parameters as defined by + * RFC 2915. + *
+ * + * @jms-builtin + */ +function dns_get_record ($hostname, $type = null, array &$authns = null, array &$addtl = null) {} + +/** + * Get the integer value of a variable + * @link http://www.php.net/manual/en/function.intval.php + * @param var mixed

+ * The scalar value being converted to an integer + *

+ * @param base int[optional]

+ * The base for the conversion + *

+ * @return int The integer value of var on success, or 0 on + * failure. Empty arrays and objects return 0, non-empty arrays and + * objects return 1. + *

+ *

+ * The maximum value depends on the system. 32 bit systems have a + * maximum signed integer range of -2147483648 to 2147483647. So for example + * on such a system, intval('1000000000000') will return + * 2147483647. The maximum signed integer value for 64 bit systems is + * 9223372036854775807. + *

+ *

+ * Strings will most likely return 0 although this depends on the + * leftmost characters of the string. The common rules of + * integer casting + * apply. + * + * @jms-builtin + */ +function intval ($var, $base = null) {} + +/** + * Get float value of a variable + * @link http://www.php.net/manual/en/function.floatval.php + * @param var mixed

+ * May be any scalar type. floatval should not be used + * on objects, as doing so will emit an E_NOTICE level + * error and return 1. + *

+ * @return float The float value of the given variable. Empty arrays return 0, non-empty + * arrays return 1. + * + * @jms-builtin + */ +function floatval ($var) {} + +/** + * &Alias; floatval + * @link http://www.php.net/manual/en/function.doubleval.php + * @param var + * + * @jms-builtin + */ +function doubleval ($var) {} + +/** + * Get string value of a variable + * @link http://www.php.net/manual/en/function.strval.php + * @param var mixed

+ * The variable that is being converted to a string. + *

+ *

+ * var may be any scalar type. You cannot use + * strval on arrays or objects. + *

+ * @return string The string value of var. + * + * @jms-builtin + */ +function strval ($var) {} + +/** + * Get the type of a variable + * @link http://www.php.net/manual/en/function.gettype.php + * @param var mixed

+ * The variable being type checked. + *

+ * @return string Possibles values for the returned string are: + * "boolean" + * "integer" + * "double" (for historical reasons "double" is + * returned in case of a float, and not simply + * "float") + * "string" + * "array" + * "object" + * "resource" + * "NULL" + * "unknown type" + * + * @jms-builtin + */ +function gettype ($var) {} + +/** + * Set the type of a variable + * @link http://www.php.net/manual/en/function.settype.php + * @param var mixed

+ * The variable being converted. + *

+ * @param type string

+ * Possibles values of type are: + * "boolean" (or, since PHP 4.2.0, "bool") + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function settype (&$var, $type) {} + +/** + * Finds whether a variable is &null; + * @link http://www.php.net/manual/en/function.is-null.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is null, false + * otherwise. + * + * @jms-builtin + */ +function is_null ($var) {} + +/** + * Finds whether a variable is a resource + * @link http://www.php.net/manual/en/function.is-resource.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is a resource, + * false otherwise. + * + * @jms-builtin + */ +function is_resource ($var) {} + +/** + * Finds out whether a variable is a boolean + * @link http://www.php.net/manual/en/function.is-bool.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is a boolean, + * false otherwise. + * + * @jms-builtin + */ +function is_bool ($var) {} + +/** + * &Alias; is_int + * @link http://www.php.net/manual/en/function.is-long.php + * @param var + * + * @jms-builtin + */ +function is_long ($var) {} + +/** + * Finds whether the type of a variable is float + * @link http://www.php.net/manual/en/function.is-float.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is a float, + * false otherwise. + * + * @jms-builtin + */ +function is_float ($var) {} + +/** + * Find whether the type of a variable is integer + * @link http://www.php.net/manual/en/function.is-int.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is an integer, + * false otherwise. + * + * @jms-builtin + */ +function is_int ($var) {} + +/** + * &Alias; is_int + * @link http://www.php.net/manual/en/function.is-integer.php + * @param var + * + * @jms-builtin + */ +function is_integer ($var) {} + +/** + * &Alias; is_float + * @link http://www.php.net/manual/en/function.is-double.php + * @param var + * + * @jms-builtin + */ +function is_double ($var) {} + +/** + * &Alias; is_float + * @link http://www.php.net/manual/en/function.is-real.php + * @param var + * + * @jms-builtin + */ +function is_real ($var) {} + +/** + * Finds whether a variable is a number or a numeric string + * @link http://www.php.net/manual/en/function.is-numeric.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is a number or a numeric + * string, false otherwise. + * + * @jms-builtin + */ +function is_numeric ($var) {} + +/** + * Find whether the type of a variable is string + * @link http://www.php.net/manual/en/function.is-string.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is of type string, + * false otherwise. + * + * @jms-builtin + */ +function is_string ($var) {} + +/** + * Finds whether a variable is an array + * @link http://www.php.net/manual/en/function.is-array.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is an array, + * false otherwise. + * + * @jms-builtin + */ +function is_array ($var) {} + +/** + * Finds whether a variable is an object + * @link http://www.php.net/manual/en/function.is-object.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is an object, + * false otherwise. + * + * @jms-builtin + */ +function is_object ($var) {} + +/** + * Finds whether a variable is a scalar + * @link http://www.php.net/manual/en/function.is-scalar.php + * @param var mixed

+ * The variable being evaluated. + *

+ * @return bool true if var is a scalar false + * otherwise. + * + * @jms-builtin + */ +function is_scalar ($var) {} + +/** + * Verify that the contents of a variable can be called as a function + * @link http://www.php.net/manual/en/function.is-callable.php + * @param mixed $name

+ * Can be either the name of a function stored in a string variable, or + * an object and the name of a method within the object, like this: + * array($SomeObject, 'MethodName') + *

+ * @param syntax_only bool [optional]

+ * If set to true the function only verifies that + * name might be a function or method. It will only + * reject simple variables that are not strings, or an array that does + * not have a valid structure to be used as a callback. The valid ones + * are supposed to have only 2 entries, the first of which is an object + * or a string, and the second a string. + *

+ * @param callable_name string[optional]

+ * Receives the "callable name". In the example below it is + * "someClass::someMethod". Note, however, that despite the implication + * that someClass::SomeMethod() is a callable static method, this is not + * the case. + *

+ * @return bool true if name is callable, false + * otherwise. + * + * @jms-builtin + */ +function is_callable ($name, $syntax_only = null, &$callable_name = null) {} + +/** + * Closes process file pointer + * @link http://www.php.net/manual/en/function.pclose.php + * @param handle resource

+ * The file pointer must be valid, and must have been returned by a + * successful call to popen. + *

+ * @return int the termination status of the process that was run. + * + * @jms-builtin + */ +function pclose ($handle) {} + +/** + * Opens process file pointer + * @link http://www.php.net/manual/en/function.popen.php + * @param command string

+ * The command + *

+ * @param mode string

+ * The mode + *

+ * @return resource a file pointer identical to that returned by + * fopen, except that it is unidirectional (may + * only be used for reading or writing) and must be closed with + * pclose. This pointer may be used with + * fgets, fgetss, and + * fwrite. + *

+ *

+ * If an error occurs, returns false. + * + * @jms-builtin + */ +function popen ($command, $mode) {} + +/** + * Outputs a file + * @link http://www.php.net/manual/en/function.readfile.php + * @param filename string

+ * The filename being read. + *

+ * @param use_include_path bool[optional]

+ * You can use the optional second parameter and set it to true, if + * you want to search for the file in the include_path, too. + *

+ * @param context resource[optional]

+ * A context stream resource. + *

+ * @return int the number of bytes read from the file. If an error + * occurs, false is returned and unless the function was called as + * @readfile, an error message is printed. + * + * @jms-builtin + */ +function readfile ($filename, $use_include_path = null, $context = null) {} + +/** + * Rewind the position of a file pointer + * @link http://www.php.net/manual/en/function.rewind.php + * @param handle resource

+ * The file pointer must be valid, and must point to a file + * successfully opened by fopen. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function rewind ($handle) {} + +/** + * Removes directory + * @link http://www.php.net/manual/en/function.rmdir.php + * @param dirname string

+ * Path to the directory. + *

+ * @param context resource[optional] ¬e.context-support; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function rmdir ($dirname, $context = null) {} + +/** + * Changes the current umask + * @link http://www.php.net/manual/en/function.umask.php + * @param mask int[optional]

+ * The new umask. + *

+ * @return int umask without arguments simply returns the + * current umask otherwise the old umask is returned. + * + * @jms-builtin + */ +function umask ($mask = null) {} + +/** + * Closes an open file pointer + * @link http://www.php.net/manual/en/function.fclose.php + * @param handle resource

+ * The file pointer must be valid, and must point to a file successfully + * opened by fopen or fsockopen. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function fclose ($handle) {} + +/** + * Tests for end-of-file on a file pointer + * @link http://www.php.net/manual/en/function.feof.php + * @param handle resource &fs.validfp.all; + * @return bool true if the file pointer is at EOF or an error occurs + * (including socket timeout); otherwise returns false. + * + * @jms-builtin + */ +function feof ($handle) {} + +/** + * Gets character from file pointer + * @link http://www.php.net/manual/en/function.fgetc.php + * @param handle resource &fs.validfp.all; + * @return string a string containing a single character read from the file pointed + * to by handle. Returns false on EOF. + * + * @jms-builtin + */ +function fgetc ($handle) {} + +/** + * Gets line from file pointer + * @link http://www.php.net/manual/en/function.fgets.php + * @param handle resource &fs.validfp.all; + * @param length int[optional]

+ * Reading ends when length - 1 bytes have been + * read, on a newline (which is included in the return value), or on EOF + * (whichever comes first). If no length is specified, it will keep + * reading from the stream until it reaches the end of the line. + *

+ *

+ * Until PHP 4.3.0, omitting it would assume 1024 as the line length. + * If the majority of the lines in the file are all larger than 8KB, + * it is more resource efficient for your script to specify the maximum + * line length. + *

+ * @return string a string of up to length - 1 bytes read from + * the file pointed to by handle. + *

+ *

+ * If an error occurs, returns false. + * + * @jms-builtin + */ +function fgets ($handle, $length = null) {} + +/** + * Gets line from file pointer and strip HTML tags + * @link http://www.php.net/manual/en/function.fgetss.php + * @param handle resource &fs.validfp.all; + * @param length int[optional]

+ * Length of the data to be retrieved. + *

+ * @param allowable_tags string[optional]

+ * You can use the optional third parameter to specify tags which should + * not be stripped. + *

+ * @return string a string of up to length - 1 bytes read from + * the file pointed to by handle, with all HTML and PHP + * code stripped. + *

+ *

+ * If an error occurs, returns false. + * + * @jms-builtin + */ +function fgetss ($handle, $length = null, $allowable_tags = null) {} + +/** + * Binary-safe file read + * @link http://www.php.net/manual/en/function.fread.php + * @param handle resource &fs.file.pointer; + * @param length int

+ * Up to length number of bytes read. + *

+ * @return string the read string &return.falseforfailure;. + * + * @jms-builtin + */ +function fread ($handle, $length) {} + +/** + * Opens file or URL + * @link http://www.php.net/manual/en/function.fopen.php + * @param filename string

+ * If filename is of the form "scheme://...", it + * is assumed to be a URL and PHP will search for a protocol handler + * (also known as a wrapper) for that scheme. If no wrappers for that + * protocol are registered, PHP will emit a notice to help you track + * potential problems in your script and then continue as though + * filename specifies a regular file. + *

+ *

+ * If PHP has decided that filename specifies + * a local file, then it will try to open a stream on that file. + * The file must be accessible to PHP, so you need to ensure that + * the file access permissions allow this access. + * If you have enabled &safemode;, + * or open_basedir further + * restrictions may apply. + *

+ *

+ * If PHP has decided that filename specifies + * a registered protocol, and that protocol is registered as a + * network URL, PHP will check to make sure that + * allow_url_fopen is + * enabled. If it is switched off, PHP will emit a warning and + * the fopen call will fail. + *

+ *

+ * The list of supported protocols can be found in . Some protocols (also referred to as + * wrappers) support context + * and/or &php.ini; options. Refer to the specific page for the + * protocol in use for a list of options which can be set. (e.g. + * &php.ini; value user_agent used by the + * http wrapper). + *

+ *

+ * On the Windows platform, be careful to escape any backslashes + * used in the path to the file, or use forward slashes. + * ]]> + *

+ * @param mode string

+ * The mode parameter specifies the type of access + * you require to the stream. It may be any of the following: + * + * A list of possible modes for fopen + * using mode + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
modeDescription
'r' + * Open for reading only; place the file pointer at the + * beginning of the file. + *
'r+' + * Open for reading and writing; place the file pointer at + * the beginning of the file. + *
'w' + * Open for writing only; place the file pointer at the + * beginning of the file and truncate the file to zero length. + * If the file does not exist, attempt to create it. + *
'w+' + * Open for reading and writing; place the file pointer at + * the beginning of the file and truncate the file to zero + * length. If the file does not exist, attempt to create it. + *
'a' + * Open for writing only; place the file pointer at the end of + * the file. If the file does not exist, attempt to create it. + *
'a+' + * Open for reading and writing; place the file pointer at + * the end of the file. If the file does not exist, attempt to + * create it. + *
'x' + * Create and open for writing only; place the file pointer at the + * beginning of the file. If the file already exists, the + * fopen call will fail by returning false and + * generating an error of level E_WARNING. If + * the file does not exist, attempt to create it. This is equivalent + * to specifying O_EXCL|O_CREAT flags for the + * underlying open(2) system call. + *
'x+' + * Create and open for reading and writing; place the file pointer at + * the beginning of the file. If the file already exists, the + * fopen call will fail by returning false and + * generating an error of level E_WARNING. If + * the file does not exist, attempt to create it. This is equivalent + * to specifying O_EXCL|O_CREAT flags for the + * underlying open(2) system call. + *
+ *

+ *

+ * Different operating system families have different line-ending + * conventions. When you write a text file and want to insert a line + * break, you need to use the correct line-ending character(s) for your + * operating system. Unix based systems use \n as the + * line ending character, Windows based systems use \r\n + * as the line ending characters and Macintosh based systems use + * \r as the line ending character. + *

+ *

+ * If you use the wrong line ending characters when writing your files, you + * might find that other applications that open those files will "look + * funny". + *

+ *

+ * Windows offers a text-mode translation flag ('t') + * which will transparently translate \n to + * \r\n when working with the file. In contrast, you + * can also use 'b' to force binary mode, which will not + * translate your data. To use these flags, specify either + * 'b' or 't' as the last character + * of the mode parameter. + *

+ *

+ * The default translation mode depends on the SAPI and version of PHP that + * you are using, so you are encouraged to always specify the appropriate + * flag for portability reasons. You should use the 't' + * mode if you are working with plain-text files and you use + * \n to delimit your line endings in your script, but + * expect your files to be readable with applications such as notepad. You + * should use the 'b' in all other cases. + *

+ *

+ * If you do not specify the 'b' flag when working with binary files, you + * may experience strange problems with your data, including broken image + * files and strange problems with \r\n characters. + *

+ *

+ * For portability, it is strongly recommended that you always + * use the 'b' flag when opening files with fopen. + *

+ *

+ * Again, for portability, it is also strongly recommended that + * you re-write code that uses or relies upon the 't' + * mode so that it uses the correct line endings and + * 'b' mode instead. + *

+ * @param use_include_path bool[optional]

+ * The optional third use_include_path parameter + * can be set to '1' or true if you want to search for the file in the + * include_path, too. + *

+ * @param context resource[optional] ¬e.context-support; + * @return resource a file pointer resource on success, or false on error. + * + * @jms-builtin + */ +function fopen ($filename, $mode, $use_include_path = null, $context = null) {} + +/** + * Output all remaining data on a file pointer + * @link http://www.php.net/manual/en/function.fpassthru.php + * @param handle resource &fs.validfp.all; + * @return int If an error occurs, fpassthru returns + * false. Otherwise, fpassthru returns + * the number of characters read from handle + * and passed through to the output. + * + * @jms-builtin + */ +function fpassthru ($handle) {} + +/** + * Truncates a file to a given length + * @link http://www.php.net/manual/en/function.ftruncate.php + * @param handle resource

+ * The file pointer. + *

+ *

+ * The handle must be open for writing. + *

+ * @param size int

+ * The size to truncate to. + *

+ *

+ * If size is larger than the file it is extended + * with null bytes. + *

+ *

+ * If size is smaller than the extra data + * will be lost. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ftruncate ($handle, $size) {} + +/** + * Gets information about a file using an open file pointer + * @link http://www.php.net/manual/en/function.fstat.php + * @param handle resource &fs.file.pointer; + * @return array an array with the statistics of the file; the format of the array + * is described in detail on the stat manual page. + * + * @jms-builtin + */ +function fstat ($handle) {} + +/** + * Seeks on a file pointer + * @link http://www.php.net/manual/en/function.fseek.php + * @param handle resource &fs.file.pointer; + * @param offset int

+ * The offset. + *

+ *

+ * To move to a position before the end-of-file, you need to pass + * a negative value in offset and + * set whence + * to SEEK_END. + *

+ * @param whence int[optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + * SEEK_END - Set position to end-of-file plus offset. + *

+ * @return int Upon success, returns 0; otherwise, returns -1. Note that seeking + * past EOF is not considered an error. + * + * @jms-builtin + */ +function fseek ($handle, $offset, $whence = null) {} + +/** + * Returns the current position of the file read/write pointer + * @link http://www.php.net/manual/en/function.ftell.php + * @param handle resource

+ * The file pointer must be valid, and must point to a file successfully + * opened by fopen or popen. + * ftell gives undefined results for append-only streams + * (opened with "a" flag). + *

+ * @return int the position of the file pointer referenced by + * handle as an integer; i.e., its offset into the file stream. + *

+ *

+ * If an error occurs, returns false. + * + * @jms-builtin + */ +function ftell ($handle) {} + +/** + * Flushes the output to a file + * @link http://www.php.net/manual/en/function.fflush.php + * @param handle resource &fs.validfp.all; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function fflush ($handle) {} + +/** + * Binary-safe file write + * @link http://www.php.net/manual/en/function.fwrite.php + * @param handle resource &fs.file.pointer; + * @param string string

+ * The string that is to be written. + *

+ * @param length int[optional]

+ * If the length argument is given, writing will + * stop after length bytes have been written or + * the end of string is reached, whichever comes + * first. + *

+ *

+ * Note that if the length argument is given, + * then the magic_quotes_runtime + * configuration option will be ignored and no slashes will be + * stripped from string. + *

+ * @return int + * + * @jms-builtin + */ +function fwrite ($handle, $string, $length = null) {} + +/** + * &Alias; fwrite + * @link http://www.php.net/manual/en/function.fputs.php + * @param fp + * @param str + * @param length[optional] + * + * @jms-builtin + */ +function fputs ($fp, $str, $length) {} + +/** + * Makes directory + * @link http://www.php.net/manual/en/function.mkdir.php + * @param pathname string

+ * The directory path. + *

+ * @param mode int[optional]

+ * The mode is 0777 by default, which means the widest possible + * access. For more information on modes, read the details + * on the chmod page. + *

+ *

+ * mode is ignored on Windows. + *

+ *

+ * Note that you probably want to specify the mode as an octal number, + * which means it should have a leading zero. The mode is also modified + * by the current umask, which you can change using + * umask. + *

+ * @param recursive bool[optional]

+ * Allows the creation of nested directories specified in the + * pathname. Defaults to false. + *

+ * @param context resource[optional] ¬e.context-support; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function mkdir ($pathname, $mode = null, $recursive = null, $context = null) {} + +/** + * Renames a file or directory + * @link http://www.php.net/manual/en/function.rename.php + * @param oldname string

+ *

+ *

+ * The old name. The wrapper used in oldname + * must match the wrapper used in + * newname. + *

+ * @param newname string

+ * The new name. + *

+ * @param context resource[optional] ¬e.context-support; + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function rename ($oldname, $newname, $context = null) {} + +/** + * Copies file + * @link http://www.php.net/manual/en/function.copy.php + * @param source string

+ * Path to the source file. + *

+ * @param dest string

+ * The destination path. If dest is a URL, the + * copy operation may fail if the wrapper does not support overwriting of + * existing files. + *

+ *

+ * If the destination file already exists, it will be overwritten. + *

+ * @param context resource[optional]

+ * A valid context resource created with + * stream_context_create. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function copy ($source, $dest, $context = null) {} + +/** + * Create file with unique file name + * @link http://www.php.net/manual/en/function.tempnam.php + * @param dir string

+ * The directory where the temporary filename will be created. + *

+ * @param prefix string

+ * The prefix of the generated temporary filename. + *

+ * Windows uses only the first three characters of prefix. + * @return string the new temporary filename, or false on + * failure. + * + * @jms-builtin + */ +function tempnam ($dir, $prefix) {} + +/** + * Creates a temporary file + * @link http://www.php.net/manual/en/function.tmpfile.php + * @return resource a file handle, similar to the one returned by + * fopen, for the new file&return.falseforfailure;. + * + * @jms-builtin + */ +function tmpfile () {} + +/** + * Reads entire file into an array + * @link http://www.php.net/manual/en/function.file.php + * @param filename string

+ * Path to the file. + *

+ * &tip.fopen-wrapper; + * @param flags int[optional]

+ * The optional parameter flags can be one, or + * more, of the following constants: + * FILE_USE_INCLUDE_PATH + * Search for the file in the include_path. + * @param context resource[optional]

+ * A context resource created with the + * stream_context_create function. + *

+ *

+ * ¬e.context-support; + *

+ * @return array the file in an array. Each element of the array corresponds to a + * line in the file, with the newline still attached. Upon failure, + * file returns false. + *

+ *

+ * Each line in the resulting array will include the line ending, unless + * FILE_IGNORE_NEW_LINES is used, so you still need to + * use rtrim if you do not want the line ending + * present. + * + * @jms-builtin + */ +function file ($filename, $flags = null, $context = null) {} + +/** + * Reads entire file into a string + * @link http://www.php.net/manual/en/function.file-get-contents.php + * @param filename string

+ * Name of the file to read. + *

+ * @param use_include_path bool[optional]

+ * As of PHP 5 the FILE_USE_INCLUDE_PATH can be used + * to trigger include path + * search. + *

+ * @param context resource[optional]

+ * A valid context resource created with + * stream_context_create. If you don't need to use a + * custom context, you can skip this parameter by &null;. + *

+ * @param offset int[optional]

+ * The offset where the reading starts on the original stream. + *

+ * @param maxlen int[optional]

+ * Maximum length of data read. The default is to read until end + * of file is reached. Note that this parameter is applied to the + * stream processed by the filters. + *

+ * @return string The function returns the read data&return.falseforfailure;. + * + * @jms-builtin + */ +function file_get_contents ($filename, $use_include_path = null, $context = null, $offset = null, $maxlen = null) {} + +/** + * Write a string to a file + * @link http://www.php.net/manual/en/function.file-put-contents.php + * @param filename string

+ * Path to the file where to write the data. + *

+ * @param data mixed

+ * The data to write. Can be either a string, an + * array or a stream resource. + *

+ *

+ * If data is a stream resource, the + * remaining buffer of that stream will be copied to the specified file. + * This is similar with using stream_copy_to_stream. + *

+ *

+ * You can also specify the data parameter as a single + * dimension array. This is equivalent to + * file_put_contents($filename, implode('', $array)). + *

+ * @param flags int[optional]

+ * The value of flags can be any combination of + * the following flags (with some restrictions), joined with the binary OR + * (|) operator. + *

+ *

+ * + * Available flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
+ * FILE_USE_INCLUDE_PATH + * + * Search for filename in the include directory. + * See include_path for more + * information. + *
+ * FILE_APPEND + * + * If file filename already exists, append + * the data to the file instead of overwriting it. Mutually + * exclusive with LOCK_EX since appends are atomic and thus there + * is no reason to lock. + *
+ * LOCK_EX + * + * Acquire an exclusive lock on the file while proceeding to the + * writing. Mutually exclusive with FILE_APPEND. + *
+ *

+ * @param context resource[optional]

+ * A valid context resource created with + * stream_context_create. + *

+ * @return int The function returns the number of bytes that were written to the file, or + * false on failure. + * + * @jms-builtin + */ +function file_put_contents ($filename, $data, $flags = null, $context = null) {} + +/** + * Runs the equivalent of the select() system call on the given + arrays of streams with a timeout specified by tv_sec and tv_usec + * @link http://www.php.net/manual/en/function.stream-select.php + * @param read array

+ * The streams listed in the read array will be watched to + * see if characters become available for reading (more precisely, to see if + * a read will not block - in particular, a stream resource is also ready on + * end-of-file, in which case an fread will return + * a zero length string). + *

+ * @param write array

+ * The streams listed in the write array will be + * watched to see if a write will not block. + *

+ * @param except array

+ * The streams listed in the except array will be + * watched for high priority exceptional ("out-of-band") data arriving. + *

+ *

+ * When stream_select returns, the arrays + * read, write and + * except are modified to indicate which stream + * resource(s) actually changed status. + *

+ * You do not need to pass every array to + * stream_select. You can leave it out and use an + * empty array or &null; instead. Also do not forget that those arrays are + * passed by reference and will be modified after + * stream_select returns. + * @param tv_sec int

+ * The tv_sec and tv_usec + * together form the timeout parameter, + * tv_sec specifies the number of seconds while + * tv_usec the number of microseconds. + * The timeout is an upper bound on the amount of time + * that stream_select will wait before it returns. + * If tv_sec and tv_usec are + * both set to 0, stream_select will + * not wait for data - instead it will return immediately, indicating the + * current status of the streams. + *

+ *

+ * If tv_sec is &null; stream_select + * can block indefinitely, returning only when an event on one of the + * watched streams occurs (or if a signal interrupts the system call). + *

+ *

+ * Using a timeout value of 0 allows you to + * instantaneously poll the status of the streams, however, it is NOT a + * good idea to use a 0 timeout value in a loop as it + * will cause your script to consume too much CPU time. + *

+ *

+ * It is much better to specify a timeout value of a few seconds, although + * if you need to be checking and running other code concurrently, using a + * timeout value of at least 200000 microseconds will + * help reduce the CPU usage of your script. + *

+ *

+ * Remember that the timeout value is the maximum time that will elapse; + * stream_select will return as soon as the + * requested streams are ready for use. + *

+ * @param tv_usec int[optional]

+ * See tv_sec description. + *

+ * @return int On success stream_select returns the number of + * stream resources contained in the modified arrays, which may be zero if + * the timeout expires before anything interesting happens. On error false + * is returned and a warning raised (this can happen if the system call is + * interrupted by an incoming signal). + * + * @jms-builtin + */ +function stream_select (array &$read, array &$write, array &$except, $tv_sec, $tv_usec = null) {} + +/** + * Create a streams context + * @link http://www.php.net/manual/en/function.stream-context-create.php + * @param options array[optional]

+ * Must be an associative array of associative arrays in the format + * $arr['wrapper']['option'] = $value. + *

+ *

+ * Default to an empty array. + *

+ * @param params array[optional]

+ * Must be an associative array in the format + * $arr['parameter'] = $value. + * Refer to context parameters for + * a listing of standard stream parameters. + *

+ * @return resource A stream context resource. + * + * @jms-builtin + */ +function stream_context_create (array $options = null, array $params = null) {} + +/** + * Set parameters for a stream/wrapper/context + * @link http://www.php.net/manual/en/function.stream-context-set-params.php + * @param stream_or_context resource

+ * The stream or context to apply the parameters too. + *

+ * @param params array

+ * An array of parameters to set. + *

+ *

+ * params should be an associative array of the structure: + * $params['paramname'] = "paramvalue";. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_context_set_params ($stream_or_context, array $params) {} + +/** + * Retrieves parameters from a context + * @link http://www.php.net/manual/en/function.stream-context-get-params.php + * @param stream_or_context resource

+ * A stream resource or a + * context resource + *

+ * @return array an associate array containing all context options and parameters. + * + * @jms-builtin + */ +function stream_context_get_params ($stream_or_context) {} + +/** + * Sets an option for a stream/wrapper/context + * @link http://www.php.net/manual/en/function.stream-context-set-option.php + * @param stream_or_context resource

+ * The stream or context resource to apply the options too. + *

+ * @param wrapper string + * @param option string + * @param value mixed + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_context_set_option ($stream_or_context, $wrapper, $option, $value) {} + +/** + * Retrieve options for a stream/wrapper/context + * @link http://www.php.net/manual/en/function.stream-context-get-options.php + * @param stream_or_context resource

+ * The stream or context to get options from + *

+ * @return array an associative array with the options. + * + * @jms-builtin + */ +function stream_context_get_options ($stream_or_context) {} + +/** + * Retreive the default streams context + * @link http://www.php.net/manual/en/function.stream-context-get-default.php + * @param options array[optional] options must be an associative + * array of associative arrays in the format + * $arr['wrapper']['option'] = $value. + *

+ * As of PHP 5.3.0, the stream_context_set_default function + * can be used to set the default context. + *

+ * @return resource A stream context resource. + * + * @jms-builtin + */ +function stream_context_get_default (array $options = null) {} + +/** + * Set the default streams context + * @link http://www.php.net/manual/en/function.stream-context-set-default.php + * @param options array

+ * The options to set for the default context. + *

+ *

+ * options must be an associative + * array of associative arrays in the format + * $arr['wrapper']['option'] = $value. + *

+ * @return resource the default stream context. + * + * @jms-builtin + */ +function stream_context_set_default (array $options) {} + +/** + * Attach a filter to a stream + * @link http://www.php.net/manual/en/function.stream-filter-prepend.php + * @param stream resource

+ * The target stream. + *

+ * @param filtername string

+ * The filter name. + *

+ * @param read_write int[optional]

+ * By default, stream_filter_prepend will + * attach the filter to the read filter chain + * if the file was opened for reading (i.e. File Mode: + * r, and/or +). The filter + * will also be attached to the write filter chain + * if the file was opened for writing (i.e. File Mode: + * w, a, and/or +). + * STREAM_FILTER_READ, + * STREAM_FILTER_WRITE, and/or + * STREAM_FILTER_ALL can also be passed to the + * read_write parameter to override this behavior. + * See stream_filter_append for an example of + * using this parameter. + *

+ * @param params mixed[optional]

+ * This filter will be added with the specified params + * to the beginning of the list and will therefore be + * called first during stream operations. To add a filter to the end of the + * list, use stream_filter_append. + *

+ * @return resource a resource which can be used to refer to this filter + * instance during a call to stream_filter_remove. + * + * @jms-builtin + */ +function stream_filter_prepend ($stream, $filtername, $read_write = null, $params = null) {} + +/** + * Attach a filter to a stream + * @link http://www.php.net/manual/en/function.stream-filter-append.php + * @param stream resource

+ * The target stream. + *

+ * @param filtername string

+ * The filter name. + *

+ * @param read_write int[optional]

+ * By default, stream_filter_append will + * attach the filter to the read filter chain + * if the file was opened for reading (i.e. File Mode: + * r, and/or +). The filter + * will also be attached to the write filter chain + * if the file was opened for writing (i.e. File Mode: + * w, a, and/or +). + * STREAM_FILTER_READ, + * STREAM_FILTER_WRITE, and/or + * STREAM_FILTER_ALL can also be passed to the + * read_write parameter to override this behavior. + *

+ * @param params mixed[optional]

+ * This filter will be added with the specified + * params to the end of + * the list and will therefore be called last during stream operations. + * To add a filter to the beginning of the list, use + * stream_filter_prepend. + *

+ * @return resource a resource which can be used to refer to this filter + * instance during a call to stream_filter_remove. + * + * @jms-builtin + */ +function stream_filter_append ($stream, $filtername, $read_write = null, $params = null) {} + +/** + * Remove a filter from a stream + * @link http://www.php.net/manual/en/function.stream-filter-remove.php + * @param stream_filter resource

+ * The stream filter to be removed. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_filter_remove ($stream_filter) {} + +/** + * Open Internet or Unix domain socket connection + * @link http://www.php.net/manual/en/function.stream-socket-client.php + * @param remote_socket string

+ * Address to the socket to connect to. + *

+ * @param errno int[optional]

+ * Will be set to the system level error number if connection fails. + *

+ * @param errstr string[optional]

+ * Will be set to the system level error message if the connection fails. + *

+ * @param timeout float[optional]

+ * Number of seconds until the connect() system call + * should timeout. + * This parameter only applies when not making asynchronous + * connection attempts. + *

+ * To set a timeout for reading/writing data over the socket, use the + * stream_set_timeout, as the + * timeout only applies while making connecting + * the socket. + *

+ *

+ * @param flags int[optional]

+ * Bitmask field which may be set to any combination of connection flags. + * Currently the select of connection flags is limited to + * STREAM_CLIENT_CONNECT (default), + * STREAM_CLIENT_ASYNC_CONNECT and + * STREAM_CLIENT_PERSISTENT. + *

+ * @param context resource[optional]

+ * A valid context resource created with stream_context_create. + *

+ * @return resource On success a stream resource is returned which may + * be used together with the other file functions (such as + * fgets, fgetss, + * fwrite, fclose, and + * feof), false on failure. + * + * @jms-builtin + */ +function stream_socket_client ($remote_socket, &$errno = null, &$errstr = null, $timeout = null, $flags = null, $context = null) {} + +/** + * Create an Internet or Unix domain server socket + * @link http://www.php.net/manual/en/function.stream-socket-server.php + * @param local_socket string

+ * The type of socket created is determined by the transport specified + * using standard URL formatting: transport://target. + *

+ *

+ * For Internet Domain sockets (AF_INET) such as TCP and UDP, the + * target portion of the + * remote_socket parameter should consist of a + * hostname or IP address followed by a colon and a port number. For + * Unix domain sockets, the target portion should + * point to the socket file on the filesystem. + *

+ *

+ * Depending on the environment, Unix domain sockets may not be available. + * A list of available transports can be retrieved using + * stream_get_transports. See + * for a list of bulitin transports. + *

+ * @param errno int[optional]

+ * If the optional errno and errstr + * arguments are present they will be set to indicate the actual system + * level error that occurred in the system-level socket(), + * bind(), and listen() calls. If + * the value returned in errno is + * 0 and the function returned false, it is an + * indication that the error occurred before the bind() + * call. This is most likely due to a problem initializing the socket. + * Note that the errno and + * errstr arguments will always be passed by reference. + *

+ * @param errstr string[optional]

+ * See errno description. + *

+ * @param flags int[optional]

+ * A bitmask field which may be set to any combination of socket creation + * flags. + *

+ *

+ * For UDP sockets, you must use STREAM_SERVER_BIND as + * the flags parameter. + *

+ * @param context resource[optional]

+ *

+ * @return resource the created stream, or false on error. + * + * @jms-builtin + */ +function stream_socket_server ($local_socket, &$errno = null, &$errstr = null, $flags = null, $context = null) {} + +/** + * Accept a connection on a socket created by stream_socket_server + * @link http://www.php.net/manual/en/function.stream-socket-accept.php + * @param server_socket resource + * @param timeout float[optional]

+ * Override the default socket accept timeout. Time should be given in + * seconds. + *

+ * @param peername string[optional]

+ * Will be set to the name (address) of the client which connected, if + * included and available from the selected transport. + *

+ *

+ * Can also be determined later using + * stream_socket_get_name. + *

+ * @return resource Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_socket_accept ($server_socket, $timeout = null, &$peername = null) {} + +/** + * Retrieve the name of the local or remote sockets + * @link http://www.php.net/manual/en/function.stream-socket-get-name.php + * @param handle resource

+ * The socket to get the name of. + *

+ * @param want_peer bool

+ * If set to true the remote socket name will be returned, if set + * to false the local socket name will be returned. + *

+ * @return string The name of the socket. + * + * @jms-builtin + */ +function stream_socket_get_name ($handle, $want_peer) {} + +/** + * Receives data from a socket, connected or not + * @link http://www.php.net/manual/en/function.stream-socket-recvfrom.php + * @param socket resource

+ * The remote socket. + *

+ * @param length int

+ * The number of bytes to receive from the socket. + *

+ * @param flags int[optional]

+ * The value of flags can be any combination + * of the following: + * + * Possible values for flags + * + * + * + * + * + * + * + * + *
STREAM_OOB + * Process OOB (out-of-band) data. + *
STREAM_PEEK + * Retrieve data from the socket, but do not consume the buffer. + * Subsequent calls to fread or + * stream_socket_recvfrom will see + * the same data. + *
+ *

+ * @param address string[optional]

+ * If address is provided it will be populated with + * the address of the remote socket. + *

+ * @return string the read data, as a string + * + * @jms-builtin + */ +function stream_socket_recvfrom ($socket, $length, $flags = null, &$address = null) {} + +/** + * Sends a message to a socket, whether it is connected or not + * @link http://www.php.net/manual/en/function.stream-socket-sendto.php + * @param socket resource

+ * The socket to send data to. + *

+ * @param data string

+ * The data to be sent. + *

+ * @param flags int[optional]

+ * The value of flags can be any combination + * of the following: + * + * possible values for flags + * + * + * + * + *
STREAM_OOB + * Process OOB (out-of-band) data. + *
+ *

+ * @param address string[optional]

+ * The address specified when the socket stream was created will be used + * unless an alternate address is specified in address. + *

+ *

+ * If specified, it must be in dotted quad (or [ipv6]) format. + *

+ * @return int a result code, as an integer. + * + * @jms-builtin + */ +function stream_socket_sendto ($socket, $data, $flags = null, $address = null) {} + +/** + * Turns encryption on/off on an already connected socket + * @link http://www.php.net/manual/en/function.stream-socket-enable-crypto.php + * @param stream resource

+ * The stream resource. + *

+ * @param enable bool

+ * Enable/disable cryptography on the stream. + *

+ * @param crypto_type int[optional]

+ * Setup encryption on the stream. + * Valid methods are + * STREAM_CRYPTO_METHOD_SSLv2_CLIENT + * @param session_stream resource[optional]

+ * Seed the stream with settings from session_stream. + *

+ * @return mixed true on success, false if negotiation has failed or + * 0 if there isn't enough data and you should try again + * (only for non-blocking sockets). + * + * @jms-builtin + */ +function stream_socket_enable_crypto ($stream, $enable, $crypto_type = null, $session_stream = null) {} + +/** + * Shutdown a full-duplex connection + * @link http://www.php.net/manual/en/function.stream-socket-shutdown.php + * @param stream resource

+ * An open stream (opened with stream_socket_client, + * for example) + *

+ * @param how int

+ * One of the following constants: STREAM_SHUT_RD + * (disable further receptions), STREAM_SHUT_WR + * (disable further transmissions) or + * STREAM_SHUT_RDWR (disable further receptions and + * transmissions). + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_socket_shutdown ($stream, $how) {} + +/** + * Creates a pair of connected, indistinguishable socket streams + * @link http://www.php.net/manual/en/function.stream-socket-pair.php + * @param domain int

+ * The protocol family to be used: STREAM_PF_INET, + * STREAM_PF_INET6 or + * STREAM_PF_UNIX + *

+ * @param type int

+ * The type of communication to be used: + * STREAM_SOCK_DGRAM, + * STREAM_SOCK_RAW, + * STREAM_SOCK_RDM, + * STREAM_SOCK_SEQPACKET or + * STREAM_SOCK_STREAM + *

+ * @param protocol int

+ * The protocol to be used: STREAM_IPPROTO_ICMP, + * STREAM_IPPROTO_IP, + * STREAM_IPPROTO_RAW, + * STREAM_IPPROTO_TCP or + * STREAM_IPPROTO_UDP + *

+ * @return array an array with the two socket resources on success, or + * false on failure. + * + * @jms-builtin + */ +function stream_socket_pair ($domain, $type, $protocol) {} + +/** + * Copies data from one stream to another + * @link http://www.php.net/manual/en/function.stream-copy-to-stream.php + * @param source resource

+ * The source stream + *

+ * @param dest resource

+ * The destination stream + *

+ * @param maxlength int[optional]

+ * Maximum bytes to copy + *

+ * @param offset int[optional]

+ * The offset where to start to copy data + *

+ * @return int the total count of bytes copied. + * + * @jms-builtin + */ +function stream_copy_to_stream ($source, $dest, $maxlength = null, $offset = null) {} + +/** + * Reads remainder of a stream into a string + * @link http://www.php.net/manual/en/function.stream-get-contents.php + * @param handle resource

+ * A stream resource (e.g. returned from fopen) + *

+ * @param maxlength int[optional]

+ * The maximum bytes to read. Defaults to -1 (read all the remaining + * buffer). + *

+ * @param offset int[optional]

+ * Seek to the specified offset before reading. + *

+ * @return string a string&return.falseforfailure;. + * + * @jms-builtin + */ +function stream_get_contents ($handle, $maxlength = null, $offset = null) {} + +/** + * Tells whether the stream supports locking. + * @link http://www.php.net/manual/en/function.stream-supports-lock.php + * @param stream resource

+ * The stream to check. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_supports_lock ($stream) {} + +/** + * Gets line from file pointer and parse for CSV fields + * @link http://www.php.net/manual/en/function.fgetcsv.php + * @param handle resource

+ * A valid file pointer to a file successfully opened by + * fopen, popen, or + * fsockopen. + *

+ * @param length int[optional]

+ * Must be greater than the longest line (in characters) to be found in + * the CSV file (allowing for trailing line-end characters). It became + * optional in PHP 5. Omitting this parameter (or setting it to 0 in PHP + * 5.0.4 and later) the maximum line length is not limited, which is + * slightly slower. + *

+ * @param delimiter string[optional]

+ * Set the field delimiter (one character only). + *

+ * @param enclosure string[optional]

+ * Set the field enclosure character (one character only). + *

+ * @param escape string[optional]

+ * Set the escape character (one character only). Defaults as a backslash. + *

+ * @return array an indexed array containing the fields read. + *

+ *

+ * A blank line in a CSV file will be returned as an array + * comprising a single null field, and will not be treated + * as an error. + *

+ * ¬e.line-endings; + *

+ * fgetcsv returns &null; if an invalid + * handle is supplied or false on other errors, + * including end of file. + * + * @jms-builtin + */ +function fgetcsv ($handle, $length = null, $delimiter = null, $enclosure = null, $escape = null) {} + +/** + * Format line as CSV and write to file pointer + * @link http://www.php.net/manual/en/function.fputcsv.php + * @param handle resource &fs.validfp.all; + * @param fields array

+ * An array of values. + *

+ * @param delimiter string[optional]

+ * The optional delimiter parameter sets the field + * delimiter (one character only). + *

+ * @param enclosure string[optional]

+ * The optional enclosure parameter sets the field + * enclosure (one character only). + *

+ * @return int the length of the written string&return.falseforfailure;. + * + * @jms-builtin + */ +function fputcsv ($handle, array $fields, $delimiter = null, $enclosure = null) {} + +/** + * Portable advisory file locking + * @link http://www.php.net/manual/en/function.flock.php + * @param handle resource

+ * An open file pointer. + *

+ * @param operation int

+ * operation is one of the following: + * LOCK_SH to acquire a shared lock (reader). + * @param wouldblock int[optional]

+ * The optional third argument is set to true if the lock would block + * (EWOULDBLOCK errno condition). (not supported on Windows) + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function flock ($handle, $operation, &$wouldblock = null) {} + +/** + * Extracts all meta tag content attributes from a file and returns an array + * @link http://www.php.net/manual/en/function.get-meta-tags.php + * @param filename string

+ * The path to the HTML file, as a string. This can be a local file or an + * URL. + *

+ *

+ * What get_meta_tags parses + * ]]> + * (pay attention to line endings - PHP uses a native function to + * parse the input, so a Mac file won't work on Unix). + *

+ * @param use_include_path bool[optional]

+ * Setting use_include_path to true will result + * in PHP trying to open the file along the standard include path as per + * the include_path directive. + * This is used for local files, not URLs. + *

+ * @return array an array with all the parsed meta tags. + *

+ *

+ * The value of the name property becomes the key, the value of the content + * property becomes the value of the returned array, so you can easily use + * standard array functions to traverse it or access single values. + * Special characters in the value of the name property are substituted with + * '_', the rest is converted to lower case. If two meta tags have the same + * name, only the last one is returned. + * + * @jms-builtin + */ +function get_meta_tags ($filename, $use_include_path = null) {} + +/** + * Sets file buffering on the given stream + * @link http://www.php.net/manual/en/function.stream-set-write-buffer.php + * @param stream resource

+ * The file pointer. + *

+ * @param buffer int

+ * The number of bytes to buffer. If buffer + * is 0 then write operations are unbuffered. This ensures that all writes + * with fwrite are completed before other processes are + * allowed to write to that output stream. + *

+ * @return int 0 on success, or EOF if the request cannot be honored. + * + * @jms-builtin + */ +function stream_set_write_buffer ($stream, $buffer) {} + +/** + * &Alias; stream_set_write_buffer + * @link http://www.php.net/manual/en/function.set-file-buffer.php + * @param fp + * @param buffer + * + * @jms-builtin + */ +function set_file_buffer ($fp, $buffer) {} + +/** + * &Alias; stream_set_blocking + * @link http://www.php.net/manual/en/function.set-socket-blocking.php + * @param socket + * @param mode + * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged (use stream_set_blocking() instead). + * + * @jms-builtin + */ +function set_socket_blocking ($socket, $mode) {} + +/** + * Set blocking/non-blocking mode on a stream + * @link http://www.php.net/manual/en/function.stream-set-blocking.php + * @param stream resource

+ * The stream. + *

+ * @param mode int

+ * If mode is 0, the given stream + * will be switched to non-blocking mode, and if 1, it + * will be switched to blocking mode. This affects calls like + * fgets and fread + * that read from the stream. In non-blocking mode an + * fgets call will always return right away + * while in blocking mode it will wait for data to become available + * on the stream. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_set_blocking ($stream, $mode) {} + +/** + * &Alias; stream_set_blocking + * @link http://www.php.net/manual/en/function.socket-set-blocking.php + * @param socket + * @param mode + * + * @jms-builtin + */ +function socket_set_blocking ($socket, $mode) {} + +/** + * Retrieves header/meta data from streams/file pointers + * @link http://www.php.net/manual/en/function.stream-get-meta-data.php + * @param stream resource

+ * The stream can be any stream created by fopen, + * fsockopen and pfsockopen. + *

+ * @return array The result array contains the following items: + *

+ *

+ * timed_out (bool) - true if the stream + * timed out while waiting for data on the last call to + * fread or fgets. + *

+ *

+ * blocked (bool) - true if the stream is + * in blocking IO mode. See stream_set_blocking. + *

+ *

+ * eof (bool) - true if the stream has reached + * end-of-file. Note that for socket streams this member can be true + * even when unread_bytes is non-zero. To + * determine if there is more data to be read, use + * feof instead of reading this item. + *

+ *

+ * unread_bytes (int) - the number of bytes + * currently contained in the PHP's own internal buffer. + *

+ * You shouldn't use this value in a script. + *

+ * stream_type (string) - a label describing + * the underlying implementation of the stream. + *

+ *

+ * wrapper_type (string) - a label describing + * the protocol wrapper implementation layered over the stream. + * See for more information about wrappers. + *

+ *

+ * wrapper_data (mixed) - wrapper specific + * data attached to this stream. See for + * more information about wrappers and their wrapper data. + *

+ *

+ * filters (array) - and array containing + * the names of any filters that have been stacked onto this stream. + * Documentation on filters can be found in the + * Filters appendix. + *

+ *

+ * mode (string) - the type of access required for + * this stream (see Table 1 of the fopen() reference) + *

+ *

+ * seekable (bool) - whether the current stream can + * be seeked. + *

+ *

+ * uri (string) - the URI/filename associated with this + * stream. + * + * @jms-builtin + */ +function stream_get_meta_data ($stream) {} + +/** + * Gets line from stream resource up to a given delimiter + * @link http://www.php.net/manual/en/function.stream-get-line.php + * @param handle resource

+ * A valid file handle. + *

+ * @param length int

+ * The number of bytes to read from the handle. + *

+ * @param ending string[optional]

+ * An optional string delimiter. + *

+ * @return string a string of up to length bytes read from the file + * pointed to by handle. + *

+ *

+ * If an error occurs, returns false. + * + * @jms-builtin + */ +function stream_get_line ($handle, $length, $ending = null) {} + +/** + * Register a URL wrapper implemented as a PHP class + * @link http://www.php.net/manual/en/function.stream-wrapper-register.php + * @param protocol string

+ * The wrapper name to be registered. + *

+ * @param classname string

+ * The classname which implements the protocol. + *

+ * @param flags int[optional]

+ * Should be set to STREAM_IS_URL if + * protocol is a URL protocol. Default is 0, local + * stream. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * stream_wrapper_register will return false if the + * protocol already has a handler. + * + * @jms-builtin + */ +function stream_wrapper_register ($protocol, $classname, $flags = null) {} + +/** + * &Alias; stream_wrapper_register + * @link http://www.php.net/manual/en/function.stream-register-wrapper.php + * @param protocol + * @param classname + * @param flags[optional] + * + * @jms-builtin + */ +function stream_register_wrapper ($protocol, $classname, $flags) {} + +/** + * Unregister a URL wrapper + * @link http://www.php.net/manual/en/function.stream-wrapper-unregister.php + * @param protocol string

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_wrapper_unregister ($protocol) {} + +/** + * Restores a previously unregistered built-in wrapper + * @link http://www.php.net/manual/en/function.stream-wrapper-restore.php + * @param protocol string

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_wrapper_restore ($protocol) {} + +/** + * Retrieve list of registered streams + * @link http://www.php.net/manual/en/function.stream-get-wrappers.php + * @return array an indexed array containing the name of all stream wrappers + * available on the running system. + * + * @jms-builtin + */ +function stream_get_wrappers () {} + +/** + * Retrieve list of registered socket transports + * @link http://www.php.net/manual/en/function.stream-get-transports.php + * @return array an indexed array of socket transports names. + * + * @jms-builtin + */ +function stream_get_transports () {} + +/** + * Resolve filename against the include path + * @link http://www.php.net/manual/en/function.stream-resolve-include-path.php + * @param filename string + * @param context resource[optional]

+ * A valid context resource created with stream_context_create. + *

+ * @return string On success, the resolved absolute filename is returned. On failure, false is returned. + * + * @jms-builtin + */ +function stream_resolve_include_path ($filename, $context = null) {} + +/** + * Checks if a stream is a local stream + * @link http://www.php.net/manual/en/function.stream-is-local.php + * @param stream_or_url mixed

+ * The stream resource or URL to check. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_is_local ($stream_or_url) {} + +/** + * Fetches all the headers sent by the server in response to a HTTP request + * @link http://www.php.net/manual/en/function.get-headers.php + * @param url string

+ * The target URL. + *

+ * @param format int[optional]

+ * If the optional format parameter is set to non-zero, + * get_headers parses the response and sets the + * array's keys. + *

+ * @return array an indexed or associative array with the headers, or false on + * failure. + * + * @jms-builtin + */ +function get_headers ($url, $format = null) {} + +/** + * Set timeout period on a stream + * @link http://www.php.net/manual/en/function.stream-set-timeout.php + * @param stream resource

+ * The target stream. + *

+ * @param seconds int

+ * The seconds part of the timeout to be set. + *

+ * @param microseconds int[optional]

+ * The microseconds part of the timeout to be set. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function stream_set_timeout ($stream, $seconds, $microseconds = null) {} + +/** + * &Alias; stream_set_timeout + * @link http://www.php.net/manual/en/function.socket-set-timeout.php + * @param stream + * @param seconds + * @param microseconds + * + * @jms-builtin + */ +function socket_set_timeout ($stream, $seconds, $microseconds) {} + +/** + * &Alias; stream_get_meta_data + * @link http://www.php.net/manual/en/function.socket-get-status.php + * @param fp + * + * @jms-builtin + */ +function socket_get_status ($fp) {} + +/** + * Returns canonicalized absolute pathname + * @link http://www.php.net/manual/en/function.realpath.php + * @param path string

+ * The path being checked. + *

+ * @return string the canonicalized absolute pathname on success. The resulting path + * will have no symbolic link, '/./' or '/../' components. + *

+ *

+ * realpath returns false on failure, e.g. if + * the file does not exist. + *

+ *

+ * The running script must have executable permissions on all directories in + * the hierarchy, otherwise realpath will return + * false. + * + * @jms-builtin + */ +function realpath ($path) {} + +/** + * Match filename against a pattern + * @link http://www.php.net/manual/en/function.fnmatch.php + * @param pattern string

+ * The shell wildcard pattern. + *

+ * @param string string

+ * The tested string. This function is especially useful for filenames, + * but may also be used on regular strings. + *

+ *

+ * The average user may be used to shell patterns or at least in their + * simplest form to '?' and '*' + * wildcards so using fnmatch instead of + * preg_match for + * frontend search expression input may be way more convenient for + * non-programming users. + *

+ * @param flags int[optional]

+ * The value of flags can be any combination of + * the following flags, joined with the + * binary OR (|) operator. + * + * A list of possible flags for fnmatch + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
FNM_NOESCAPE + * Disable backslash escaping. + *
FNM_PATHNAME + * Slash in string only matches slash in the given pattern. + *
FNM_PERIOD + * Leading period in string must be exactly matched by period in the given pattern. + *
FNM_CASEFOLD + * Caseless match. Part of the GNU extension. + *
+ *

+ * @return bool true if there is a match, false otherwise. + * + * @jms-builtin + */ +function fnmatch ($pattern, $string, $flags = null) {} + +/** + * Open Internet or Unix domain socket connection + * @link http://www.php.net/manual/en/function.fsockopen.php + * @param hostname string

+ * If you have compiled in OpenSSL support, you may prefix the + * hostname with either ssl:// + * or tls:// to use an SSL or TLS client connection + * over TCP/IP to connect to the remote host. + *

+ * @param port int[optional]

+ * The port number. + *

+ * @param errno int[optional]

+ * If provided, holds the system level error number that occurred in the + * system-level connect() call. + *

+ *

+ * If the value returned in errno is + * 0 and the function returned false, it is an + * indication that the error occurred before the + * connect() call. This is most likely due to a + * problem initializing the socket. + *

+ * @param errstr string[optional]

+ * The error message as a string. + *

+ * @param timeout float[optional]

+ * The connection timeout, in seconds. + *

+ *

+ * If you need to set a timeout for reading/writing data over the + * socket, use stream_set_timeout, as the + * timeout parameter to + * fsockopen only applies while connecting the + * socket. + *

+ * @return resource fsockopen returns a file pointer which may be used + * together with the other file functions (such as + * fgets, fgetss, + * fwrite, fclose, and + * feof). If the call fails, it will return false + * + * @jms-builtin + */ +function fsockopen ($hostname, $port = null, &$errno = null, &$errstr = null, $timeout = null) {} + +/** + * Open persistent Internet or Unix domain socket connection + * @link http://www.php.net/manual/en/function.pfsockopen.php + * @param hostname string + * @param port int[optional] + * @param errno int[optional] + * @param errstr string[optional] + * @param timeout float[optional] + * @return resource + * + * @jms-builtin + */ +function pfsockopen ($hostname, $port = null, &$errno = null, &$errstr = null, $timeout = null) {} + +/** + * Pack data into binary string + * @link http://www.php.net/manual/en/function.pack.php + * @param format string

+ * The format string consists of format codes + * followed by an optional repeater argument. The repeater argument can + * be either an integer value or * for repeating to + * the end of the input data. For a, A, h, H the repeat count specifies + * how many characters of one data argument are taken, for @ it is the + * absolute position where to put the next data, for everything else the + * repeat count specifies how many data arguments are consumed and packed + * into the resulting binary string. + *

+ *

+ * Currently implemented formats are: + * + * pack format characters + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CodeDescription
aNUL-padded string
ASPACE-padded string
hHex string, low nibble first
HHex string, high nibble first
csigned char
Cunsigned char
ssigned short (always 16 bit, machine byte order)
Sunsigned short (always 16 bit, machine byte order)
nunsigned short (always 16 bit, big endian byte order)
vunsigned short (always 16 bit, little endian byte order)
isigned integer (machine dependent size and byte order)
Iunsigned integer (machine dependent size and byte order)
lsigned long (always 32 bit, machine byte order)
Lunsigned long (always 32 bit, machine byte order)
Nunsigned long (always 32 bit, big endian byte order)
Vunsigned long (always 32 bit, little endian byte order)
ffloat (machine dependent size and representation)
ddouble (machine dependent size and representation)
xNUL byte
XBack up one byte
@NUL-fill to absolute position
+ *

+ * @param args mixed[optional]

+ *

+ * @param _ mixed[optional] + * @return string a binary string containing data. + * + * @jms-builtin + */ +function pack ($format, $args = null, $_ = null) {} + +/** + * Unpack data from binary string + * @link http://www.php.net/manual/en/function.unpack.php + * @param format string

+ * See pack for an explanation of the format codes. + *

+ * @param data string

+ * The packed data. + *

+ * @return array an associative array containing unpacked elements of binary + * string. + * + * @jms-builtin + */ +function unpack ($format, $data) {} + +/** + * Tells what the user's browser is capable of + * @link http://www.php.net/manual/en/function.get-browser.php + * @param user_agent string[optional]

+ * The User Agent to be analyzed. By default, the value of HTTP + * User-Agent header is used; however, you can alter this (i.e., look up + * another browser's info) by passing this parameter. + *

+ *

+ * You can bypass this parameter with a &null; value. + *

+ * @param return_array bool[optional]

+ * If set to true, this function will return an array + * instead of an object. + *

+ * @return mixed The information is returned in an object or an array which will contain + * various data elements representing, for instance, the browser's major and + * minor version numbers and ID string; true/false values for features + * such as frames, JavaScript, and cookies; and so forth. + *

+ *

+ * The cookies value simply means that the browser + * itself is capable of accepting cookies and does not mean the user has + * enabled the browser to accept cookies or not. The only way to test if + * cookies are accepted is to set one with setcookie, + * reload, and check for the value. + * + * @jms-builtin + */ +function get_browser ($user_agent = null, $return_array = null) {} + +/** + * One-way string hashing + * @link http://www.php.net/manual/en/function.crypt.php + * @param str string

+ * The string to be hashed. + *

+ * @param salt string[optional]

+ * An optional salt string to base the hashing on. If not provided, + * one will be randomly generated by PHP each time you call this function. + *

+ *

+ * If you are using the supplied salt, you should be aware that the salt + * is generated once. If you are calling this function repeatedly, this + * may impact both appearance and security. + *

+ * @return string the hashed string or a string that is shorter than 13 characters + * and is guaranteed to differ from the salt on failure. + * + * @jms-builtin + */ +function crypt ($str, $salt = null) {} + +/** + * Open directory handle + * @link http://www.php.net/manual/en/function.opendir.php + * @param path string

+ * The directory path that is to be opened + *

+ * @param context resource[optional]

+ * For a description of the context parameter, + * refer to the streams section of + * the manual. + *

+ * @return resource a directory handle resource on success, or + * false on failure. + *

+ *

+ * If path is not a valid directory or the + * directory can not be opened due to permission restrictions or + * filesystem errors, opendir returns false and + * generates a PHP error of level + * E_WARNING. You can suppress the error output of + * opendir by prepending + * '@' to the + * front of the function name. + * + * @jms-builtin + */ +function opendir ($path, $context = null) {} + +/** + * Close directory handle + * @link http://www.php.net/manual/en/function.closedir.php + * @param dir_handle resource[optional]

+ * The directory handle resource previously opened + * with opendir. If the directory handle is + * not specified, the last link opened by opendir + * is assumed. + *

+ * @return void + * + * @jms-builtin + */ +function closedir ($dir_handle = null) {} + +/** + * Change directory + * @link http://www.php.net/manual/en/function.chdir.php + * @param directory string

+ * The new current directory + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function chdir ($directory) {} + +/** + * Gets the current working directory + * @link http://www.php.net/manual/en/function.getcwd.php + * @return string the current working directory on success, or false on + * failure. + *

+ *

+ * On some Unix variants, getcwd will return + * false if any one of the parent directories does not have the + * readable or search mode set, even if the current directory + * does. See chmod for more information on + * modes and permissions. + * + * @jms-builtin + */ +function getcwd () {} + +/** + * Rewind directory handle + * @link http://www.php.net/manual/en/function.rewinddir.php + * @param dir_handle resource[optional]

+ * The directory handle resource previously opened + * with opendir. If the directory handle is + * not specified, the last link opened by opendir + * is assumed. + *

+ * @return void + * + * @jms-builtin + */ +function rewinddir ($dir_handle = null) {} + +/** + * Read entry from directory handle + * @link http://www.php.net/manual/en/function.readdir.php + * @param dir_handle resource[optional]

+ * The directory handle resource previously opened + * with opendir. If the directory handle is + * not specified, the last link opened by opendir + * is assumed. + *

+ * @return string the filename on success&return.falseforfailure;. + * + * @jms-builtin + */ +function readdir ($dir_handle = null) {} + +/** + * Return an instance of the Directory class + * @link http://www.php.net/manual/en/class.dir.php + * @param directory + * @param context[optional] + * @return string + * + * @jms-builtin + */ +function dir ($directory, $context) {} + +/** + * List files and directories inside the specified path + * @link http://www.php.net/manual/en/function.scandir.php + * @param directory string

+ * The directory that will be scanned. + *

+ * @param sorting_order int[optional]

+ * By default, the sorted order is alphabetical in ascending order. If + * the optional sorting_order is set to non-zero, + * then the sort order is alphabetical in descending order. + *

+ * @param context resource[optional]

+ * For a description of the context parameter, + * refer to the streams section of + * the manual. + *

+ * @return array an array of filenames on success, or false on + * failure. If directory is not a directory, then + * boolean false is returned, and an error of level + * E_WARNING is generated. + * + * @jms-builtin + */ +function scandir ($directory, $sorting_order = null, $context = null) {} + +/** + * Find pathnames matching a pattern + * @link http://www.php.net/manual/en/function.glob.php + * @param pattern string

+ * The pattern. No tilde expansion or parameter substitution is done. + *

+ * @param flags int[optional]

+ * Valid flags: + * GLOB_MARK - Adds a slash to each directory returned + * @return array an array containing the matched files/directories, an empty array + * if no file matched or false on error. + *

+ *

+ * On some systems it is impossible to distinguish between empty match and an + * error. + * + * @jms-builtin + */ +function glob ($pattern, $flags = null) {} + +/** + * Gets last access time of file + * @link http://www.php.net/manual/en/function.fileatime.php + * @param filename string

+ * Path to the file. + *

+ * @return int the time the file was last accessed, &return.falseforfailure;. + * The time is returned as a Unix timestamp. + * + * @jms-builtin + */ +function fileatime ($filename) {} + +/** + * Gets inode change time of file + * @link http://www.php.net/manual/en/function.filectime.php + * @param filename string

+ * Path to the file. + *

+ * @return int the time the file was last changed, &return.falseforfailure;. + * The time is returned as a Unix timestamp. + * + * @jms-builtin + */ +function filectime ($filename) {} + +/** + * Gets file group + * @link http://www.php.net/manual/en/function.filegroup.php + * @param filename string

+ * Path to the file. + *

+ * @return int the group ID of the file, or false in case + * of an error. The group ID is returned in numerical format, use + * posix_getgrgid to resolve it to a group name. + * Upon failure, false is returned. + * + * @jms-builtin + */ +function filegroup ($filename) {} + +/** + * Gets file inode + * @link http://www.php.net/manual/en/function.fileinode.php + * @param filename string

+ * Path to the file. + *

+ * @return int the inode number of the file, &return.falseforfailure;. + * + * @jms-builtin + */ +function fileinode ($filename) {} + +/** + * Gets file modification time + * @link http://www.php.net/manual/en/function.filemtime.php + * @param filename string

+ * Path to the file. + *

+ * @return int the time the file was last modified, &return.falseforfailure;. + * The time is returned as a Unix timestamp, which is + * suitable for the date function. + * + * @jms-builtin + */ +function filemtime ($filename) {} + +/** + * Gets file owner + * @link http://www.php.net/manual/en/function.fileowner.php + * @param filename string

+ * Path to the file. + *

+ * @return int the user ID of the owner of the file, &return.falseforfailure;. + * The user ID is returned in numerical format, use + * posix_getpwuid to resolve it to a username. + * + * @jms-builtin + */ +function fileowner ($filename) {} + +/** + * Gets file permissions + * @link http://www.php.net/manual/en/function.fileperms.php + * @param filename string

+ * Path to the file. + *

+ * @return int the permissions on the file, &return.falseforfailure;. + * + * @jms-builtin + */ +function fileperms ($filename) {} + +/** + * Gets file size + * @link http://www.php.net/manual/en/function.filesize.php + * @param filename string

+ * Path to the file. + *

+ * @return int the size of the file in bytes, or false (and generates an error + * of level E_WARNING) in case of an error. + * + * @jms-builtin + */ +function filesize ($filename) {} + +/** + * Gets file type + * @link http://www.php.net/manual/en/function.filetype.php + * @param filename string

+ * Path to the file. + *

+ * @return string the type of the file. Possible values are fifo, char, + * dir, block, link, file, socket and unknown. + *

+ *

+ * Returns false if an error occurs. filetype will also + * produce an E_NOTICE message if the stat call fails + * or if the file type is unknown. + * + * @jms-builtin + */ +function filetype ($filename) {} + +/** + * Checks whether a file or directory exists + * @link http://www.php.net/manual/en/function.file-exists.php + * @param filename string

+ * Path to the file or directory. + *

+ *

+ * On windows, use //computername/share/filename or + * \\computername\share\filename to check files on + * network shares. + *

+ * @return bool true if the file or directory specified by + * filename exists; false otherwise. + *

+ *

+ * This function will return false for symlinks pointing to non-existing + * files. + *

+ *

+ * This function returns false for files inaccessible due to safe mode restrictions. However these + * files still can be included if + * they are located in safe_mode_include_dir. + *

+ *

+ * The check is done using the real UID/GID instead of the effective one. + * + * @jms-builtin + */ +function file_exists ($filename) {} + +/** + * Tells whether the filename is writable + * @link http://www.php.net/manual/en/function.is-writable.php + * @param filename string

+ * The filename being checked. + *

+ * @return bool true if the filename exists and is + * writable. + * + * @jms-builtin + */ +function is_writable ($filename) {} + +/** + * &Alias; is_writable + * @link http://www.php.net/manual/en/function.is-writeable.php + * @param filename + * + * @jms-builtin + */ +function is_writeable ($filename) {} + +/** + * Tells whether a file exists and is readable + * @link http://www.php.net/manual/en/function.is-readable.php + * @param filename string

+ * Path to the file. + *

+ * @return bool true if the file or directory specified by + * filename exists and is readable, false otherwise. + * + * @jms-builtin + */ +function is_readable ($filename) {} + +/** + * Tells whether the filename is executable + * @link http://www.php.net/manual/en/function.is-executable.php + * @param filename string

+ * Path to the file. + *

+ * @return bool true if the filename exists and is executable, or false on + * error. + * + * @jms-builtin + */ +function is_executable ($filename) {} + +/** + * Tells whether the filename is a regular file + * @link http://www.php.net/manual/en/function.is-file.php + * @param filename string

+ * Path to the file. + *

+ * @return bool true if the filename exists and is a regular file, false + * otherwise. + * + * @jms-builtin + */ +function is_file ($filename) {} + +/** + * Tells whether the filename is a directory + * @link http://www.php.net/manual/en/function.is-dir.php + * @param filename string

+ * Path to the file. If filename is a relative + * filename, it will be checked relative to the current working + * directory. If filename is a symbolic or hard link + * then the link will be resolved and checked. If you have enabled &safemode;, + * or open_basedir further + * restrictions may apply. + *

+ * @return bool true if the filename exists and is a directory, false + * otherwise. + * + * @jms-builtin + */ +function is_dir ($filename) {} + +/** + * Tells whether the filename is a symbolic link + * @link http://www.php.net/manual/en/function.is-link.php + * @param filename string

+ * Path to the file. + *

+ * @return bool true if the filename exists and is a symbolic link, false + * otherwise. + * + * @jms-builtin + */ +function is_link ($filename) {} + +/** + * Gives information about a file + * @link http://www.php.net/manual/en/function.stat.php + * @param filename string

+ * Path to the file. + *

+ * @return array + * stat and fstat result + * format + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NumericAssociative (since PHP 4.0.6)Description
0devdevice number
1inoinode number *
2modeinode protection mode
3nlinknumber of links
4uiduserid of owner *
5gidgroupid of owner *
6rdevdevice type, if inode device
7sizesize in bytes
8atimetime of last access (Unix timestamp)
9mtimetime of last modification (Unix timestamp)
10ctimetime of last inode change (Unix timestamp)
11blksizeblocksize of filesystem IO **
12blocksnumber of 512-byte blocks allocated **
+ * * On Windows this will always be 0. + *

+ *

+ * ** Only valid on systems supporting the st_blksize type - other + * systems (e.g. Windows) return -1. + *

+ *

+ * In case of error, stat returns false. + * + * @jms-builtin + */ +function stat ($filename) {} + +/** + * Gives information about a file or symbolic link + * @link http://www.php.net/manual/en/function.lstat.php + * @param filename string

+ * Path to a file or a symbolic link. + *

+ * @return array See the manual page for stat for information on + * the structure of the array that lstat returns. + * This function is identical to the stat function + * except that if the filename parameter is a symbolic + * link, the status of the symbolic link is returned, not the status of the + * file pointed to by the symbolic link. + * + * @jms-builtin + */ +function lstat ($filename) {} + +/** + * Changes file owner + * @link http://www.php.net/manual/en/function.chown.php + * @param filename string

+ * Path to the file. + *

+ * @param user mixed

+ * A user name or number. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function chown ($filename, $user) {} + +/** + * Changes file group + * @link http://www.php.net/manual/en/function.chgrp.php + * @param filename string

+ * Path to the file. + *

+ * @param group mixed

+ * A group name or number. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function chgrp ($filename, $group) {} + +/** + * Changes user ownership of symlink + * @link http://www.php.net/manual/en/function.lchown.php + * @param filename string

+ * Path to the file. + *

+ * @param user mixed

+ * User name or number. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function lchown ($filename, $user) {} + +/** + * Changes group ownership of symlink + * @link http://www.php.net/manual/en/function.lchgrp.php + * @param filename string

+ * Path to the symlink. + *

+ * @param group mixed

+ * The group specified by name or number. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function lchgrp ($filename, $group) {} + +/** + * Changes file mode + * @link http://www.php.net/manual/en/function.chmod.php + * @param filename string

+ * Path to the file. + *

+ * @param mode int

+ * Note that mode is not automatically + * assumed to be an octal value, so strings (such as "g+w") will + * not work properly. To ensure the expected operation, + * you need to prefix mode with a zero (0): + *

+ *

+ * ]]> + *

+ *

+ * The mode parameter consists of three octal + * number components specifying access restrictions for the owner, + * the user group in which the owner is in, and to everybody else in + * this order. One component can be computed by adding up the needed + * permissions for that target user base. Number 1 means that you + * grant execute rights, number 2 means that you make the file + * writeable, number 4 means that you make the file readable. Add + * up these numbers to specify needed rights. You can also read more + * about modes on Unix systems with 'man 1 chmod' + * and 'man 2 chmod'. + *

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function chmod ($filename, $mode) {} + +/** + * Sets access and modification time of file + * @link http://www.php.net/manual/en/function.touch.php + * @param filename string

+ * The name of the file being touched. + *

+ * @param time int[optional]

+ * The touch time. If time is not supplied, + * the current system time is used. + *

+ * @param atime int[optional]

+ * If present, the access time of the given filename is set to + * the value of atime. Otherwise, it is set to + * time. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function touch ($filename, $time = null, $atime = null) {} + +/** + * Clears file status cache + * @link http://www.php.net/manual/en/function.clearstatcache.php + * @param clear_realpath_cache bool[optional]

+ * Whether to clear the realpath cache or not. + *

+ * @param filename string[optional]

+ * Clear the realpath cache for a specific filename; only used if + * clear_realpath_cache is true. + *

+ * @return void + * + * @jms-builtin + */ +function clearstatcache ($clear_realpath_cache = null, $filename = null) {} + +/** + * Returns the total size of a filesystem or disk partition + * @link http://www.php.net/manual/en/function.disk-total-space.php + * @param directory string

+ * A directory of the filesystem or disk partition. + *

+ * @return float the total number of bytes as a float + * &return.falseforfailure;. + * + * @jms-builtin + */ +function disk_total_space ($directory) {} + +/** + * Returns available space on filesystem or disk partition + * @link http://www.php.net/manual/en/function.disk-free-space.php + * @param directory string

+ * A directory of the filesystem or disk partition. + *

+ *

+ * Given a file name instead of a directory, the behaviour of the + * function is unspecified and may differ between operating systems and + * PHP versions. + *

+ * @return float the number of available bytes as a float + * &return.falseforfailure;. + * + * @jms-builtin + */ +function disk_free_space ($directory) {} + +/** + * &Alias; disk_free_space + * @link http://www.php.net/manual/en/function.diskfreespace.php + * @param path + * + * @jms-builtin + */ +function diskfreespace ($path) {} + +/** + * Get realpath cache size + * @link http://www.php.net/manual/en/function.realpath_cache_size.php + * @return int how much memory realpath cache is using. + * + * @jms-builtin + */ +function realpath_cache_size () {} + +/** + * Get realpath cache entries + * @link http://www.php.net/manual/en/function.realpath_cache_get.php + * @return array an array of realpath cache entries. The keys are original path + * entries, and the values are arrays of data items, containing the resolved + * path, expiration date, and other options kept in the cache. + * + * @jms-builtin + */ +function realpath_cache_get () {} + +/** + * Send mail + * @link http://www.php.net/manual/en/function.mail.php + * @param to string

+ * Receiver, or receivers of the mail. + *

+ *

+ * The formatting of this string must comply with + * RFC 2822. Some examples are: + * user@example.com + * user@example.com, anotheruser@example.com + * User <user@example.com> + * User <user@example.com>, Another User <anotheruser@example.com> + *

+ * @param subject string

+ * Subject of the email to be sent. + *

+ *

+ * Subject must satisfy RFC 2047. + *

+ * @param message string

+ * Message to be sent. + *

+ *

+ * Each line should be separated with a LF (\n). Lines should not be larger + * than 70 characters. + *

+ *

+ * (Windows only) When PHP is talking to a SMTP server directly, if a full + * stop is found on the start of a line, it is removed. To counter-act this, + * replace these occurrences with a double dot. + * ]]> + *

+ * @param additional_headers string[optional]

+ * String to be inserted at the end of the email header. + *

+ *

+ * This is typically used to add extra headers (From, Cc, and Bcc). + * Multiple extra headers should be separated with a CRLF (\r\n). + *

+ *

+ * When sending mail, the mail must contain + * a From header. This can be set with the + * additional_headers parameter, or a default + * can be set in &php.ini;. + *

+ *

+ * Failing to do this will result in an error + * message similar to Warning: mail(): "sendmail_from" not + * set in php.ini or custom "From:" header missing. + * The From header sets also + * Return-Path under Windows. + *

+ *

+ * If messages are not received, try using a LF (\n) only. + * Some poor quality Unix mail transfer agents replace LF by CRLF + * automatically (which leads to doubling CR if CRLF is used). + * This should be a last resort, as it does not comply with + * RFC 2822. + *

+ * @param additional_parameters string[optional]

+ * The additional_parameters parameter + * can be used to pass additional flags as command line options to the + * program configured to be used when sending mail, as defined by the + * sendmail_path configuration setting. For example, + * this can be used to set the envelope sender address when using + * sendmail with the -f sendmail option. + *

+ *

+ * The user that the webserver runs as should be added as a trusted user to the + * sendmail configuration to prevent a 'X-Warning' header from being added + * to the message when the envelope sender (-f) is set using this method. + * For sendmail users, this file is /etc/mail/trusted-users. + *

+ * @return bool true if the mail was successfully accepted for delivery, false otherwise. + *

+ *

+ * It is important to note that just because the mail was accepted for delivery, + * it does NOT mean the mail will actually reach the intended destination. + * + * @jms-builtin + */ +function mail ($to, $subject, $message, $additional_headers = null, $additional_parameters = null) {} + +/** + * Calculate the hash value needed by EZMLM + * @link http://www.php.net/manual/en/function.ezmlm-hash.php + * @param addr string

+ * The email address that's being hashed. + *

+ * @return int The hash value of addr. + * + * @jms-builtin + */ +function ezmlm_hash ($addr) {} + +/** + * Open connection to system logger + * @link http://www.php.net/manual/en/function.openlog.php + * @param ident string

+ * The string ident is added to each message. + *

+ * @param option int

+ * The option argument is used to indicate + * what logging options will be used when generating a log message. + * + * openlog Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
LOG_CONS + * if there is an error while sending data to the system logger, + * write directly to the system console + *
LOG_NDELAY + * open the connection to the logger immediately + *
LOG_ODELAY + * (default) delay opening the connection until the first + * message is logged + *
LOG_PERRORprint log message also to standard error
LOG_PIDinclude PID with each message
+ * You can use one or more of this options. When using multiple options + * you need to OR them, i.e. to open the connection + * immediately, write to the console and include the PID in each message, + * you will use: LOG_CONS | LOG_NDELAY | LOG_PID + *

+ * @param facility int

+ * The facility argument is used to specify what + * type of program is logging the message. This allows you to specify + * (in your machine's syslog configuration) how messages coming from + * different facilities will be handled. + * + * openlog Facilities + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
LOG_AUTH + * security/authorization messages (use + * LOG_AUTHPRIV instead + * in systems where that constant is defined) + *
LOG_AUTHPRIVsecurity/authorization messages (private)
LOG_CRONclock daemon (cron and at)
LOG_DAEMONother system daemons
LOG_KERNkernel messages
LOG_LOCAL0 ... LOG_LOCAL7reserved for local use, these are not available in Windows
LOG_LPRline printer subsystem
LOG_MAILmail subsystem
LOG_NEWSUSENET news subsystem
LOG_SYSLOGmessages generated internally by syslogd
LOG_USERgeneric user-level messages
LOG_UUCPUUCP subsystem
+ *

+ *

+ * LOG_USER is the only valid log type under Windows + * operating systems + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function openlog ($ident, $option, $facility) {} + +/** + * Generate a system log message + * @link http://www.php.net/manual/en/function.syslog.php + * @param priority int

+ * priority is a combination of the facility and + * the level. Possible values are: + * + * syslog Priorities (in descending order) + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
LOG_EMERGsystem is unusable
LOG_ALERTaction must be taken immediately
LOG_CRITcritical conditions
LOG_ERRerror conditions
LOG_WARNINGwarning conditions
LOG_NOTICEnormal, but significant, condition
LOG_INFOinformational message
LOG_DEBUGdebug-level message
+ *

+ * @param message string

+ * The message to send, except that the two characters + * %m will be replaced by the error message string + * (strerror) corresponding to the present value of + * errno. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function syslog ($priority, $message) {} + +/** + * Close connection to system logger + * @link http://www.php.net/manual/en/function.closelog.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function closelog () {} + +/** + * Initializes all syslog related variables + * @link http://www.php.net/manual/en/function.define-syslog-variables.php + * @deprecated Deprecated as of PHP 5.3.0. Relying on this feature is highly discouraged. + * @return void + * + * @jms-builtin + */ +function define_syslog_variables () {} + +/** + * Combined linear congruential generator + * @link http://www.php.net/manual/en/function.lcg-value.php + * @return float A pseudo random float value in the range of (0, 1) + * + * @jms-builtin + */ +function lcg_value () {} + +/** + * Calculate the metaphone key of a string + * @link http://www.php.net/manual/en/function.metaphone.php + * @param str string

+ * The input string. + *

+ * @param phonemes int[optional]

+ * This parameter restricts the returned metaphone key to + * phonemes characters in length. + * The default value of 0 means no restriction. + *

+ * @return string the metaphone key as a string, &return.falseforfailure;. + * + * @jms-builtin + */ +function metaphone ($str, $phonemes = null) {} + +/** + * Turn on output buffering + * @link http://www.php.net/manual/en/function.ob-start.php + * @param output_callback callback[optional]

+ * An optional output_callback function may be + * specified. This function takes a string as a parameter and should + * return a string. The function will be called when + * the output buffer is flushed (sent) or cleaned (with + * ob_flush, ob_clean or similar + * function) or when the output buffer + * is flushed to the browser at the end of the request. When + * output_callback is called, it will receive the + * contents of the output buffer as its parameter and is expected to + * return a new output buffer as a result, which will be sent to the + * browser. If the output_callback is not a + * callable function, this function will return false. + *

+ *

+ * If the callback function has two parameters, the second parameter is + * filled with a bit-field consisting of + * PHP_OUTPUT_HANDLER_START, + * PHP_OUTPUT_HANDLER_CONT and + * PHP_OUTPUT_HANDLER_END. + *

+ *

+ * If output_callback returns false original + * input is sent to the browser. + *

+ *

+ * The output_callback parameter may be bypassed + * by passing a &null; value. + *

+ *

+ * ob_end_clean, ob_end_flush, + * ob_clean, ob_flush and + * ob_start may not be called from a callback + * function. If you call them from callback function, the behavior is + * undefined. If you would like to delete the contents of a buffer, + * return "" (a null string) from callback function. + * You can't even call functions using the output buffering functions like + * print_r($expression, true) or + * highlight_file($filename, true) from a callback + * function. + *

+ *

+ * In PHP 4.0.4, ob_gzhandler was introduced to + * facilitate sending gz-encoded data to web browsers that support + * compressed web pages. ob_gzhandler determines + * what type of content encoding the browser will accept and will return + * its output accordingly. + *

+ * @param chunk_size int[optional]

+ * If the optional parameter chunk_size is passed, the + * buffer will be flushed after any output call which causes the buffer's + * length to equal or exceed chunk_size. + * Default value 0 means that the function is called only in the end, + * other special value 1 sets chunk_size to 4096. + *

+ * @param erase bool[optional]

+ * If the optional parameter erase is set to false, + * the buffer will not be deleted until the script finishes. + * This causes that flushing and cleaning functions would issue a notice + * and return false if called. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ob_start ($output_callback = null, $chunk_size = null, $erase = null) {} + +/** + * Flush (send) the output buffer + * @link http://www.php.net/manual/en/function.ob-flush.php + * @return void + * + * @jms-builtin + */ +function ob_flush () {} + +/** + * Clean (erase) the output buffer + * @link http://www.php.net/manual/en/function.ob-clean.php + * @return void + * + * @jms-builtin + */ +function ob_clean () {} + +/** + * Flush (send) the output buffer and turn off output buffering + * @link http://www.php.net/manual/en/function.ob-end-flush.php + * @return bool Returns true on success or false on failure. Reasons for failure are first that you called the + * function without an active buffer or that for some reason a buffer could + * not be deleted (possible for special buffer). + * + * @jms-builtin + */ +function ob_end_flush () {} + +/** + * Clean (erase) the output buffer and turn off output buffering + * @link http://www.php.net/manual/en/function.ob-end-clean.php + * @return bool Returns true on success or false on failure. Reasons for failure are first that you called the + * function without an active buffer or that for some reason a buffer could + * not be deleted (possible for special buffer). + * + * @jms-builtin + */ +function ob_end_clean () {} + +/** + * Flush the output buffer, return it as a string and turn off output buffering + * @link http://www.php.net/manual/en/function.ob-get-flush.php + * @return string the output buffer or false if no buffering is active. + * + * @jms-builtin + */ +function ob_get_flush () {} + +/** + * Get current buffer contents and delete current output buffer + * @link http://www.php.net/manual/en/function.ob-get-clean.php + * @return string the contents of the output buffer and end output buffering. + * If output buffering isn't active then false is returned. + * + * @jms-builtin + */ +function ob_get_clean () {} + +/** + * Return the length of the output buffer + * @link http://www.php.net/manual/en/function.ob-get-length.php + * @return int the length of the output buffer contents or false if no + * buffering is active. + * + * @jms-builtin + */ +function ob_get_length () {} + +/** + * Return the nesting level of the output buffering mechanism + * @link http://www.php.net/manual/en/function.ob-get-level.php + * @return int the level of nested output buffering handlers or zero if output + * buffering is not active. + * + * @jms-builtin + */ +function ob_get_level () {} + +/** + * Get status of output buffers + * @link http://www.php.net/manual/en/function.ob-get-status.php + * @param full_status bool[optional]

+ * true to return all active output buffer levels. If false or not + * set, only the top level output buffer is returned. + *

+ * @return array If called without the full_status parameter + * or with full_status = false a simple array + * with the following elements is returned: + * 2 + * [type] => 0 + * [status] => 0 + * [name] => URL-Rewriter + * [del] => 1 + * ) + * ]]> + * Simple ob_get_status results + * KeyValue + * levelOutput nesting level + * typePHP_OUTPUT_HANDLER_INTERNAL (0) or PHP_OUTPUT_HANDLER_USER (1) + * statusOne of PHP_OUTPUT_HANDLER_START (0), PHP_OUTPUT_HANDLER_CONT (1) or PHP_OUTPUT_HANDLER_END (2) + * nameName of active output handler or ' default output handler' if none is set + * delErase-flag as set by ob_start + *

+ *

+ * If called with full_status = true an array + * with one element for each active output buffer level is returned. + * The output level is used as key of the top level array and each array + * element itself is another array holding status information + * on one active output level. + * Array + * ( + * [chunk_size] => 0 + * [size] => 40960 + * [block_size] => 10240 + * [type] => 1 + * [status] => 0 + * [name] => default output handler + * [del] => 1 + * ) + * [1] => Array + * ( + * [chunk_size] => 0 + * [size] => 40960 + * [block_size] => 10240 + * [type] => 0 + * [buffer_size] => 0 + * [status] => 0 + * [name] => URL-Rewriter + * [del] => 1 + * ) + * ) + * ]]> + *

+ *

+ * The full output contains these additional elements: + * Full ob_get_status results + * KeyValue + * chunk_sizeChunk size as set by ob_start + * size... + * blocksize... + * + * @jms-builtin + */ +function ob_get_status ($full_status = null) {} + +/** + * Return the contents of the output buffer + * @link http://www.php.net/manual/en/function.ob-get-contents.php + * @return string This will return the contents of the output buffer or false, if output + * buffering isn't active. + * + * @jms-builtin + */ +function ob_get_contents () {} + +/** + * Turn implicit flush on/off + * @link http://www.php.net/manual/en/function.ob-implicit-flush.php + * @param flag int[optional]

+ * true to turn implicit flushing on, false otherwise. + *

+ * @return void + * + * @jms-builtin + */ +function ob_implicit_flush ($flag = null) {} + +/** + * List all output handlers in use + * @link http://www.php.net/manual/en/function.ob-list-handlers.php + * @return array This will return an array with the output handlers in use (if any). If + * output_buffering is enabled or + * an anonymous function was used with ob_start, + * ob_list_handlers will return "default output + * handler". + * + * @jms-builtin + */ +function ob_list_handlers () {} + +/** + * Sort an array by key + * @link http://www.php.net/manual/en/function.ksort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * You may modify the behavior of the sort using the optional + * parameter sort_flags, for details + * see sort. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function ksort (array &$array, $sort_flags = null) {} + +/** + * Sort an array by key in reverse order + * @link http://www.php.net/manual/en/function.krsort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * You may modify the behavior of the sort using the optional parameter + * sort_flags, for details see + * sort. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function krsort (array &$array, $sort_flags = null) {} + +/** + * Sort an array using a "natural order" algorithm + * @link http://www.php.net/manual/en/function.natsort.php + * @param array array

+ * The input array. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function natsort (array &$array) {} + +/** + * Sort an array using a case insensitive "natural order" algorithm + * @link http://www.php.net/manual/en/function.natcasesort.php + * @param array array

+ * The input array. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function natcasesort (array &$array) {} + +/** + * Sort an array and maintain index association + * @link http://www.php.net/manual/en/function.asort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * You may modify the behavior of the sort using the optional + * parameter sort_flags, for details + * see sort. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function asort (array &$array, $sort_flags = null) {} + +/** + * Sort an array in reverse order and maintain index association + * @link http://www.php.net/manual/en/function.arsort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * You may modify the behavior of the sort using the optional parameter + * sort_flags, for details see + * sort. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function arsort (array &$array, $sort_flags = null) {} + +/** + * Sort an array + * @link http://www.php.net/manual/en/function.sort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * The optional second parameter sort_flags + * may be used to modify the sorting behavior using these values: + *

+ *

+ * Sorting type flags: + * SORT_REGULAR - compare items normally + * (don't change types) + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function sort (array &$array, $sort_flags = null) {} + +/** + * Sort an array in reverse order + * @link http://www.php.net/manual/en/function.rsort.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * You may modify the behavior of the sort using the optional + * parameter sort_flags, for details see + * sort. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function rsort (array &$array, $sort_flags = null) {} + +/** + * Sort an array by values using a user-defined comparison function + * @link http://www.php.net/manual/en/function.usort.php + * @param array array

+ * The input array. + *

+ * @param cmp_function callback

+ * The comparison function must return an integer less than, equal to, or + * greater than zero if the first argument is considered to be + * respectively less than, equal to, or greater than the second. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function usort (array &$array, $cmp_function) {} + +/** + * Sort an array with a user-defined comparison function and maintain index association + * @link http://www.php.net/manual/en/function.uasort.php + * @param array array

+ * The input array. + *

+ * @param cmp_function callback

+ * See usort and uksort for + * examples of user-defined comparison functions. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function uasort (array &$array, $cmp_function) {} + +/** + * Sort an array by keys using a user-defined comparison function + * @link http://www.php.net/manual/en/function.uksort.php + * @param array array

+ * The input array. + *

+ * @param cmp_function callback

+ * The callback comparison function. + *

+ *

+ * Function cmp_function should accept two + * parameters which will be filled by pairs of array keys. + * The comparison function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function uksort (array &$array, $cmp_function) {} + +/** + * Shuffle an array + * @link http://www.php.net/manual/en/function.shuffle.php + * @param array array

+ * The array. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function shuffle (array &$array) {} + +/** + * Apply a user function to every member of an array + * @link http://www.php.net/manual/en/function.array-walk.php + * @param array array

+ * The input array. + *

+ * @param funcname callback

+ * Typically, funcname takes on two parameters. + * The array parameter's value being the first, and + * the key/index second. + *

+ *

+ * If funcname needs to be working with the + * actual values of the array, specify the first parameter of + * funcname as a + * reference. Then, + * any changes made to those elements will be made in the + * original array itself. + *

+ *

+ * Users may not change the array itself from the + * callback function. e.g. Add/delete elements, unset elements, etc. If + * the array that array_walk is applied to is + * changed, the behavior of this function is undefined, and unpredictable. + *

+ * @param userdata mixed[optional]

+ * If the optional userdata parameter is supplied, + * it will be passed as the third parameter to the callback + * funcname. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function array_walk (array &$array, $funcname, $userdata = null) {} + +/** + * Apply a user function recursively to every member of an array + * @link http://www.php.net/manual/en/function.array-walk-recursive.php + * @param input array

+ * The input array. + *

+ * @param funcname callback

+ * Typically, funcname takes on two parameters. + * The input parameter's value being the first, and + * the key/index second. + *

+ *

+ * If funcname needs to be working with the + * actual values of the array, specify the first parameter of + * funcname as a + * reference. Then, + * any changes made to those elements will be made in the + * original array itself. + *

+ * @param userdata mixed[optional]

+ * If the optional userdata parameter is supplied, + * it will be passed as the third parameter to the callback + * funcname. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function array_walk_recursive (array &$input, $funcname, $userdata = null) {} + +/** + * Count all elements in an array, or properties in an object + * @link http://www.php.net/manual/en/function.count.php + * @param var mixed

+ * The array. + *

+ * @param mode int[optional]

+ * If the optional mode parameter is set to + * COUNT_RECURSIVE (or 1), count + * will recursively count the array. This is particularly useful for + * counting all the elements of a multidimensional array. + * count does not detect infinite recursion. + *

+ * @return int the number of elements in var, which is + * typically an array, since anything else will have one + * element. + *

+ *

+ * If var is not an array or an object with + * implemented Countable interface, + * 1 will be returned. + * There is one exception, if var is &null;, + * 0 will be returned. + *

+ *

+ * count may return 0 for a variable that isn't set, + * but it may also return 0 for a variable that has been initialized with an + * empty array. Use isset to test if a variable is set. + * + * @jms-builtin + */ +function count ($var, $mode = null) {} + +/** + * Set the internal pointer of an array to its last element + * @link http://www.php.net/manual/en/function.end.php + * @param array array

+ * The array. This array is passed by reference because it is modified by + * the function. This means you must pass it a real variable and not + * a function returning an array because only actual variables may be + * passed by reference. + *

+ * @return mixed the value of the last element or false for empty array. + * + * @jms-builtin + */ +function end (array &$array) {} + +/** + * Rewind the internal array pointer + * @link http://www.php.net/manual/en/function.prev.php + * @param array array

+ * The input array. + *

+ * @return mixed the array value in the previous place that's pointed to by + * the internal array pointer, or false if there are no more + * elements. + * + * @jms-builtin + */ +function prev (array &$array) {} + +/** + * Advance the internal array pointer of an array + * @link http://www.php.net/manual/en/function.next.php + * @param array array

+ * The array being affected. + *

+ * @return mixed the array value in the next place that's pointed to by the + * internal array pointer, or false if there are no more elements. + * + * @jms-builtin + */ +function next (array &$array) {} + +/** + * Set the internal pointer of an array to its first element + * @link http://www.php.net/manual/en/function.reset.php + * @param array array

+ * The input array. + *

+ * @return mixed the value of the first array element, or false if the array is + * empty. + * + * @jms-builtin + */ +function reset (array &$array) {} + +/** + * Return the current element in an array + * @link http://www.php.net/manual/en/function.current.php + * @param array array

+ * The array. + *

+ * @return mixed The current function simply returns the + * value of the array element that's currently being pointed to by the + * internal pointer. It does not move the pointer in any way. If the + * internal pointer points beyond the end of the elements list or the array is + * empty, current returns false. + * + * @jms-builtin + */ +function current (array $array) {} + +/** + * Fetch a key from an array + * @link http://www.php.net/manual/en/function.key.php + * @param array array

+ * The array. + *

+ * @return mixed The key function simply returns the + * key of the array element that's currently being pointed to by the + * internal pointer. It does not move the pointer in any way. If the + * internal pointer points beyond the end of the elements list or the array is + * empty, key returns &null;. + * + * @jms-builtin + */ +function key (array &$array) {} + +/** + * Find lowest value + * @link http://www.php.net/manual/en/function.min.php + * @param values array

+ * An array containing the values. + *

+ * @return mixed min returns the numerically lowest of the + * parameter values. + * + * @jms-builtin + * @jms-variable-parameters + */ +function min (array $values) {} + +/** + * Find highest value + * @link http://www.php.net/manual/en/function.max.php + * @param values array

+ * An array containing the values. + *

+ * @return mixed max returns the numerically highest of the + * parameter values. If multiple values can be considered of the same size, + * the one that is listed first will be returned. + *

+ *

+ * When max is given multiple arrays, the + * longest array is returned. If all the arrays have the same length, + * max will use lexicographic ordering to find the return + * value. + *

+ *

+ * When given a string it will be cast as an integer + * when comparing. + * + * @jms-builtin + * @jms-variable-parameters + */ +function max (array $values) {} + +/** + * Checks if a value exists in an array + * @link http://www.php.net/manual/en/function.in-array.php + * @param needle mixed

+ * The searched value. + *

+ *

+ * If needle is a string, the comparison is done + * in a case-sensitive manner. + *

+ * @param haystack array

+ * The array. + *

+ * @param strict bool[optional]

+ * If the third parameter strict is set to true + * then the in_array function will also check the + * types of the + * needle in the haystack. + *

+ * @return bool true if needle is found in the array, + * false otherwise. + * + * @jms-builtin + */ +function in_array ($needle, array $haystack, $strict = null) {} + +/** + * Searches the array for a given value and returns the corresponding key if successful + * @link http://www.php.net/manual/en/function.array-search.php + * @param needle mixed

+ * The searched value. + *

+ *

+ * If needle is a string, the comparison is done + * in a case-sensitive manner. + *

+ * @param haystack array

+ * The array. + *

+ * @param strict bool[optional]

+ * If the third parameter strict is set to true + * then the array_search function will search for + * identical elements in the + * haystack. This means it will also check the + * types of the + * needle in the haystack, + * and objects must be the same instance. + *

+ * @return mixed the key for needle if it is found in the + * array, false otherwise. + *

+ *

+ * If needle is found in haystack + * more than once, the first matching key is returned. To return the keys for + * all matching values, use array_keys with the optional + * search_value parameter instead. + * + * @jms-builtin + */ +function array_search ($needle, array $haystack, $strict = null) {} + +/** + * Import variables into the current symbol table from an array + * @link http://www.php.net/manual/en/function.extract.php + * @param var_array array

+ * Note that prefix is only required if + * extract_type is EXTR_PREFIX_SAME, + * EXTR_PREFIX_ALL, EXTR_PREFIX_INVALID + * or EXTR_PREFIX_IF_EXISTS. If + * the prefixed result is not a valid variable name, it is not + * imported into the symbol table. Prefixes are automatically separated from + * the array key by an underscore character. + *

+ * @param extract_type int[optional]

+ * The way invalid/numeric keys and collisions are treated is determined + * by the extract_type. It can be one of the + * following values: + * EXTR_OVERWRITE + * If there is a collision, overwrite the existing variable. + * @param prefix string[optional] Only overwrite the variable if it already exists in the + * current symbol table, otherwise do nothing. This is useful + * for defining a list of valid variables and then extracting + * only those variables you have defined out of + * $_REQUEST, for example. + * @return int the number of variables successfully imported into the symbol + * table. + * + * @jms-builtin + */ +function extract (array $var_array, $extract_type = null, $prefix = null) {} + +/** + * Create array containing variables and their values + * @link http://www.php.net/manual/en/function.compact.php + * @param varname mixed

+ * compact takes a variable number of parameters. + * Each parameter can be either a string containing the name of the + * variable, or an array of variable names. The array can contain other + * arrays of variable names inside it; compact + * handles it recursively. + *

+ * @param _ mixed[optional] + * @return array the output array with all the variables added to it. + * + * @jms-builtin + */ +function compact ($varname, $_ = null) {} + +/** + * Fill an array with values + * @link http://www.php.net/manual/en/function.array-fill.php + * @param start_index int

+ * The first index of the returned array. + * Supports non-negative indexes only. + *

+ * @param num int

+ * Number of elements to insert + *

+ * @param value mixed

+ * Value to use for filling + *

+ * @return array the filled array + * + * @jms-builtin + */ +function array_fill ($start_index, $num, $value) {} + +/** + * Fill an array with values, specifying keys + * @link http://www.php.net/manual/en/function.array-fill-keys.php + * @param keys array

+ * Array of values that will be used as keys. Illegal values + * for key will be converted to string. + *

+ * @param value mixed

+ * Value to use for filling + *

+ * @return array the filled array + * + * @jms-builtin + */ +function array_fill_keys (array $keys, $value) {} + +/** + * Create an array containing a range of elements + * @link http://www.php.net/manual/en/function.range.php + * @param low mixed

+ * Low value. + *

+ * @param high mixed

+ * High value. + *

+ * @param step number[optional]

+ * If a step value is given, it will be used as the + * increment between elements in the sequence. step + * should be given as a positive number. If not specified, + * step will default to 1. + *

+ * @return array an array of elements from low to + * high, inclusive. If low > high, the sequence will + * be from high to low. + * + * @jms-builtin + */ +function range ($low, $high, $step = null) {} + +/** + * Sort multiple or multi-dimensional arrays + * @link http://www.php.net/manual/en/function.array-multisort.php + * @param arr array

+ * An array being sorted. + *

+ * @param arg mixed[optional]

+ * Optionally another array, or sort options for the + * previous array argument: + * SORT_ASC, + * SORT_DESC, + * SORT_REGULAR, + * SORT_NUMERIC, + * SORT_STRING. + *

+ * @param arg mixed[optional] + * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function array_multisort (array &$arr, $arg = null, $arg = null, $_ = null) {} + +/** + * Push one or more elements onto the end of array + * @link http://www.php.net/manual/en/function.array-push.php + * @param array array

+ * The input array. + *

+ * @param var mixed

+ * The pushed value. + *

+ * @param _ mixed[optional] + * @return int the new number of elements in the array. + * + * @jms-builtin + */ +function array_push (array &$array, $var, $_ = null) {} + +/** + * Pop the element off the end of array + * @link http://www.php.net/manual/en/function.array-pop.php + * @param array array

+ * The array to get the value from. + *

+ * @return mixed the last value of array. + * If array is empty (or is not an array), + * &null; will be returned. + * + * @jms-builtin + */ +function array_pop (array &$array) {} + +/** + * Shift an element off the beginning of array + * @link http://www.php.net/manual/en/function.array-shift.php + * @param array array

+ * The input array. + *

+ * @return mixed the shifted value, or &null; if array is + * empty or is not an array. + * + * @jms-builtin + */ +function array_shift (array &$array) {} + +/** + * Prepend one or more elements to the beginning of an array + * @link http://www.php.net/manual/en/function.array-unshift.php + * @param array array

+ * The input array. + *

+ * @param var mixed

+ * The prepended variable. + *

+ * @param _ mixed[optional] + * @return int the new number of elements in the array. + * + * @jms-builtin + */ +function array_unshift (array &$array, $var, $_ = null) {} + +/** + * Remove a portion of the array and replace it with something else + * @link http://www.php.net/manual/en/function.array-splice.php + * @param input array

+ * The input array. + *

+ * @param offset int

+ * If offset is positive then the start of removed + * portion is at that offset from the beginning of the + * input array. If offset + * is negative then it starts that far from the end of the + * input array. + *

+ * @param length int[optional]

+ * If length is omitted, removes everything + * from offset to the end of the array. If + * length is specified and is positive, then + * that many elements will be removed. If + * length is specified and is negative then + * the end of the removed portion will be that many elements from + * the end of the array. Tip: to remove everything from + * offset to the end of the array when + * replacement is also specified, use + * count($input) for + * length. + *

+ * @param replacement mixed[optional]

+ * If replacement array is specified, then the + * removed elements are replaced with elements from this array. + *

+ *

+ * If offset and length + * are such that nothing is removed, then the elements from the + * replacement array are inserted in the place + * specified by the offset. Note that keys in + * replacement array are not preserved. + *

+ *

+ * If replacement is just one element it is + * not necessary to put array() + * around it, unless the element is an array itself, an object or &null;. + *

+ * @return array the array consisting of the extracted elements. + * + * @jms-builtin + */ +function array_splice (array &$input, $offset, $length = null, $replacement = null) {} + +/** + * Extract a slice of the array + * @link http://www.php.net/manual/en/function.array-slice.php + * @param array array

+ * The input array. + *

+ * @param offset int

+ * If offset is non-negative, the sequence will + * start at that offset in the array. If + * offset is negative, the sequence will + * start that far from the end of the array. + *

+ * @param length int[optional]

+ * If length is given and is positive, then + * the sequence will have that many elements in it. If + * length is given and is negative then the + * sequence will stop that many elements from the end of the + * array. If it is omitted, then the sequence will have everything + * from offset up until the end of the + * array. + *

+ * @param preserve_keys bool[optional]

+ * Note that array_slice will reorder and reset the + * array indices by default. You can change this behaviour by setting + * preserve_keys to true. + *

+ * @return array the slice. + * + * @jms-builtin + */ +function array_slice (array $array, $offset, $length = null, $preserve_keys = null) {} + +/** + * Merge one or more arrays + * @link http://www.php.net/manual/en/function.array-merge.php + * @param array1 array

+ * Initial array to merge. + *

+ * @param array2 array[optional] + * @param _ array[optional] + * @return array the resulting array. + * + * @jms-builtin + */ +function array_merge (array $array1, array $array2 = array(), array $_ = array()) {} + +/** + * Merge two or more arrays recursively + * @link http://www.php.net/manual/en/function.array-merge-recursive.php + * @param array1 array

+ * Initial array to merge. + *

+ * @param _ array[optional] + * @return array An array of values resulted from merging the arguments together. + * + * @jms-builtin + */ +function array_merge_recursive (array $array1, array $_ = array()) {} + +/** + * Replaces elements from passed arrays into the first array + * @link http://www.php.net/manual/en/function.array-replace.php + * @param array array

+ * The array in which elements are replaced. + *

+ * @param array1 array

+ * The array from which elements will be extracted. + *

+ * @param array2 array[optional] + * @param _ array[optional] + * @return array an array, or &null; if an error occurs. + * + * @jms-builtin + */ +function array_replace (array $array, array $array1, array $array2 = null, array $_ = null) {} + +/** + * Replaces elements from passed arrays into the first array recursively + * @link http://www.php.net/manual/en/function.array-replace-recursive.php + * @param array array

+ * The array in which elements are replaced. + *

+ * @param array1 array

+ * The array from which elements will be extracted. + *

+ * @param array2 array[optional] + * @param _ array[optional] + * @return array an array, or &null; if an error occurs. + * + * @jms-builtin + */ +function array_replace_recursive (array $array, array $array1, array $array2 = null, array $_ = null) {} + +/** + * Return all the keys of an array + * @link http://www.php.net/manual/en/function.array-keys.php + * @param input array

+ * An array containing keys to return. + *

+ * @param search_value mixed[optional]

+ * If specified, then only keys containing these values are returned. + *

+ * @param strict bool[optional]

+ * Determines if strict comparison (===) should be used during the search. + *

+ * @return array an array of all the keys in input. + * + * @jms-builtin + */ +function array_keys (array $input, $search_value = null, $strict = null) {} + +/** + * Return all the values of an array + * @link http://www.php.net/manual/en/function.array-values.php + * @param input array

+ * The array. + *

+ * @return array an indexed array of values. + * + * @jms-builtin + */ +function array_values (array $input) {} + +/** + * Counts all the values of an array + * @link http://www.php.net/manual/en/function.array-count-values.php + * @param input array

+ * The array of values to count + *

+ * @return array an associative array of values from input as + * keys and their count as value. + * + * @jms-builtin + */ +function array_count_values (array $input) {} + +/** + * Return an array with elements in reverse order + * @link http://www.php.net/manual/en/function.array-reverse.php + * @param array array

+ * The input array. + *

+ * @param preserve_keys bool[optional]

+ * If set to true keys are preserved. + *

+ * @return array the reversed array. + * + * @jms-builtin + */ +function array_reverse (array $array, $preserve_keys = null) {} + +/** + * Iteratively reduce the array to a single value using a callback function + * @link http://www.php.net/manual/en/function.array-reduce.php + * @param input array

+ * The input array. + *

+ * @param function callback

+ * The callback function. + *

+ * @param initial mixed[optional]

+ * If the optional initial is available, it will + * be used at the beginning of the process, or as a final result in case + * the array is empty. + *

+ * @return mixed the resulting value. + *

+ *

+ * If the array is empty and initial is not passed, + * array_reduce returns &null;. + * + * @jms-builtin + */ +function array_reduce (array $input, $function, $initial = null) {} + +/** + * Pad array to the specified length with a value + * @link http://www.php.net/manual/en/function.array-pad.php + * @param input array

+ * Initial array of values to pad. + *

+ * @param pad_size int

+ * New size of the array. + *

+ * @param pad_value mixed

+ * Value to pad if input is less than + * pad_size. + *

+ * @return array a copy of the input padded to size specified + * by pad_size with value + * pad_value. If pad_size is + * positive then the array is padded on the right, if it's negative then + * on the left. If the absolute value of pad_size is less than or equal to + * the length of the input then no padding takes place. + * + * @jms-builtin + */ +function array_pad (array $input, $pad_size, $pad_value) {} + +/** + * Exchanges all keys with their associated values in an array + * @link http://www.php.net/manual/en/function.array-flip.php + * @param trans array

+ * An array of key/value pairs to be flipped. + *

+ * @return array the flipped array on success and &null; on failure. + * + * @jms-builtin + */ +function array_flip (array $trans) {} + +/** + * Changes all keys in an array + * @link http://www.php.net/manual/en/function.array-change-key-case.php + * @param input array

+ * The array to work on + *

+ * @param case int[optional]

+ * Either CASE_UPPER or + * CASE_LOWER (default) + *

+ * @return array an array with its keys lower or uppercased, or false if + * input is not an array. + * + * @jms-builtin + */ +function array_change_key_case (array $input, $case = null) {} + +/** + * Pick one or more random entries out of an array + * @link http://www.php.net/manual/en/function.array-rand.php + * @param input array

+ * The input array. + *

+ * @param num_req int[optional]

+ * Specifies how many entries you want to pick. Trying to pick more + * elements than there are in the array will result in an + * E_WARNING level error. + *

+ * @return mixed If you are picking only one entry, array_rand + * returns the key for a random entry. Otherwise, it returns an array + * of keys for the random entries. This is done so that you can pick + * random keys as well as values out of the array. + * + * @jms-builtin + */ +function array_rand (array $input, $num_req = null) {} + +/** + * Removes duplicate values from an array + * @link http://www.php.net/manual/en/function.array-unique.php + * @param array array

+ * The input array. + *

+ * @param sort_flags int[optional]

+ * The optional second parameter sort_flags + * may be used to modify the sorting behavior using these values: + *

+ *

+ * Sorting type flags: + * SORT_REGULAR - compare items normally + * (don't change types) + * @return array the filtered array. + * + * @jms-builtin + */ +function array_unique (array $array, $sort_flags = null) {} + +/** + * Computes the intersection of arrays + * @link http://www.php.net/manual/en/function.array-intersect.php + * @param array1 array

+ * The array with master values to check. + *

+ * @param array2 array

+ * An array to compare values against. + *

+ * @param _ array[optional] + * @return array an array containing all of the values in + * array1 whose values exist in all of the parameters. + * + * @jms-builtin + */ +function array_intersect (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the intersection of arrays using keys for comparison + * @link http://www.php.net/manual/en/function.array-intersect-key.php + * @param array1 array

+ * The array with master keys to check. + *

+ * @param array2 array

+ * An array to compare keys against. + *

+ * @param _ array[optional] + * @return array an associative array containing all the entries of + * array1 which have keys that are present in all + * arguments. + * + * @jms-builtin + */ +function array_intersect_key (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the intersection of arrays using a callback function on the keys for comparison + * @link http://www.php.net/manual/en/function.array-intersect-ukey.php + * @param array1 array

+ * Initial array for comparison of the arrays. + *

+ * @param array2 array

+ * First array to compare keys against. + *

+ * @param _ array[optional] + * @param key_compare_func callback

+ * User supplied callback function to do the comparison. + *

+ * @return array the values of array1 whose keys exist + * in all the arguments. + * + * @jms-builtin + */ +function array_intersect_ukey (array $array1, array $array2, array $_ = null, $key_compare_func) {} + +/** + * Computes the intersection of arrays, compares data by a callback function + * @link http://www.php.net/manual/en/function.array-uintersect.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * The callback comparison function. + *

+ *

+ * The user supplied callback function is used for comparison. + * It must return an integer less than, equal to, or greater than zero if + * the first argument is considered to be respectively less than, equal + * to, or greater than the second. + *

+ * @return array an array containing all the values of array1 + * that are present in all the arguments. + * + * @jms-builtin + */ +function array_uintersect (array $array1, array $array2, array $_ = null, $data_compare_func) {} + +/** + * Computes the intersection of arrays with additional index check + * @link http://www.php.net/manual/en/function.array-intersect-assoc.php + * @param array1 array

+ * The array with master values to check. + *

+ * @param array2 array

+ * An array to compare values against. + *

+ * @param _ array[optional] + * @return array an associative array containing all the values in + * array1 that are present in all of the arguments. + * + * @jms-builtin + */ +function array_intersect_assoc (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the intersection of arrays with additional index check, compares data by a callback function + * @link http://www.php.net/manual/en/function.array-uintersect-assoc.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * For comparison is used the user supplied callback function. + * It must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @return array an array containing all the values of + * array1 that are present in all the arguments. + * + * @jms-builtin + */ +function array_uintersect_assoc (array $array1, array $array2, array $_ = null, $data_compare_func) {} + +/** + * Computes the intersection of arrays with additional index check, compares indexes by a callback function + * @link http://www.php.net/manual/en/function.array-intersect-uassoc.php + * @param array1 array

+ * Initial array for comparison of the arrays. + *

+ * @param array2 array

+ * First array to compare keys against. + *

+ * @param _ array[optional] + * @param key_compare_func callback

+ * User supplied callback function to do the comparison. + *

+ * @return array the values of array1 whose values exist + * in all of the arguments. + * + * @jms-builtin + */ +function array_intersect_uassoc (array $array1, array $array2, array $_ = null, $key_compare_func) {} + +/** + * Computes the intersection of arrays with additional index check, compares data and indexes by a callback functions + * @link http://www.php.net/manual/en/function.array-uintersect-uassoc.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * For comparison is used the user supplied callback function. + * It must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @param key_compare_func callback

+ * Key comparison callback function. + *

+ * @return array an array containing all the values of + * array1 that are present in all the arguments. + * + * @jms-builtin + */ +function array_uintersect_uassoc (array $array1, array $array2, array $_ = null, $data_compare_func, $key_compare_func) {} + +/** + * Computes the difference of arrays + * @link http://www.php.net/manual/en/function.array-diff.php + * @param array1 array

+ * The array to compare from + *

+ * @param array2 array

+ * An array to compare against + *

+ * @param _ array[optional] + * @return array an array containing all the entries from + * array1 that are not present in any of the other arrays. + * + * @jms-builtin + */ +function array_diff (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the difference of arrays using keys for comparison + * @link http://www.php.net/manual/en/function.array-diff-key.php + * @param array1 array

+ * The array to compare from + *

+ * @param array2 array

+ * An array to compare against + *

+ * @param _ array[optional] + * @return array an array containing all the entries from + * array1 whose keys are not present in any of the + * other arrays. + * + * @jms-builtin + */ +function array_diff_key (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the difference of arrays using a callback function on the keys for comparison + * @link http://www.php.net/manual/en/function.array-diff-ukey.php + * @param array1 array

+ * The array to compare from + *

+ * @param array2 array

+ * An array to compare against + *

+ * @param _ array[optional] + * @param key_compare_func callback

+ * callback function to use. + * The callback function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the second. + *

+ * @return array an array containing all the entries from + * array1 that are not present in any of the other arrays. + * + * @jms-builtin + */ +function array_diff_ukey (array $array1, array $array2, array $_ = null, $key_compare_func) {} + +/** + * Computes the difference of arrays by using a callback function for data comparison + * @link http://www.php.net/manual/en/function.array-udiff.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * The callback comparison function. + *

+ *

+ * The user supplied callback function is used for comparison. + * It must return an integer less than, equal to, or greater than zero if + * the first argument is considered to be respectively less than, equal + * to, or greater than the second. + *

+ * @return array an array containing all the values of array1 + * that are not present in any of the other arguments. + * + * @jms-builtin + */ +function array_udiff (array $array1, array $array2, array $_ = null, $data_compare_func) {} + +/** + * Computes the difference of arrays with additional index check + * @link http://www.php.net/manual/en/function.array-diff-assoc.php + * @param array1 array

+ * The array to compare from + *

+ * @param array2 array

+ * An array to compare against + *

+ * @param _ array[optional] + * @return array an array containing all the values from + * array1 that are not present in any of the other arrays. + * + * @jms-builtin + */ +function array_diff_assoc (array $array1, array $array2, array $_ = null) {} + +/** + * Computes the difference of arrays with additional index check, compares data by a callback function + * @link http://www.php.net/manual/en/function.array-udiff-assoc.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * The callback comparison function. + *

+ *

+ * The user supplied callback function is used for comparison. + * It must return an integer less than, equal to, or greater than zero if + * the first argument is considered to be respectively less than, equal + * to, or greater than the second. + *

+ * @return array array_udiff_assoc returns an array + * containing all the values from array1 + * that are not present in any of the other arguments. + * Note that the keys are used in the comparison unlike + * array_diff and array_udiff. + * The comparison of arrays' data is performed by using an user-supplied + * callback. In this aspect the behaviour is opposite to the behaviour of + * array_diff_assoc which uses internal function for + * comparison. + * + * @jms-builtin + */ +function array_udiff_assoc (array $array1, array $array2, array $_ = null, $data_compare_func) {} + +/** + * Computes the difference of arrays with additional index check which is performed by a user supplied callback function + * @link http://www.php.net/manual/en/function.array-diff-uassoc.php + * @param array1 array

+ * The array to compare from + *

+ * @param array2 array

+ * An array to compare against + *

+ * @param _ array[optional] + * @param key_compare_func callback

+ * callback function to use. + * The callback function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the second. + *

+ * @return array an array containing all the entries from + * array1 that are not present in any of the other arrays. + * + * @jms-builtin + */ +function array_diff_uassoc (array $array1, array $array2, array $_ = null, $key_compare_func) {} + +/** + * Computes the difference of arrays with additional index check, compares data and indexes by a callback function + * @link http://www.php.net/manual/en/function.array-udiff-uassoc.php + * @param array1 array

+ * The first array. + *

+ * @param array2 array

+ * The second array. + *

+ * @param _ array[optional] + * @param data_compare_func callback

+ * The callback comparison function. + *

+ *

+ * The user supplied callback function is used for comparison. + * It must return an integer less than, equal to, or greater than zero if + * the first argument is considered to be respectively less than, equal + * to, or greater than the second. + *

+ *

+ * The comparison of arrays' data is performed by using an user-supplied + * callback : data_compare_func. In this aspect + * the behaviour is opposite to the behaviour of + * array_diff_assoc which uses internal function for + * comparison. + *

+ * @param key_compare_func callback

+ * The comparison of keys (indices) is done also by the callback function + * key_compare_func. This behaviour is unlike what + * array_udiff_assoc does, since the latter compares + * the indices by using an internal function. + *

+ * @return array an array containing all the values from + * array1 that are not present in any of the other + * arguments. + * + * @jms-builtin + */ +function array_udiff_uassoc (array $array1, array $array2, array $_ = null, $data_compare_func, $key_compare_func) {} + +/** + * Calculate the sum of values in an array + * @link http://www.php.net/manual/en/function.array-sum.php + * @param array array

+ * The input array. + *

+ * @return number the sum of values as an integer or float. + * + * @jms-builtin + */ +function array_sum (array $array) {} + +/** + * Calculate the product of values in an array + * @link http://www.php.net/manual/en/function.array-product.php + * @param array array

+ * The array. + *

+ * @return number the product as an integer or float. + * + * @jms-builtin + */ +function array_product (array $array) {} + +/** + * Filters elements of an array using a callback function + * @link http://www.php.net/manual/en/function.array-filter.php + * @param input array

+ * The array to iterate over + *

+ * @param callback callback[optional]

+ * The callback function to use + *

+ *

+ * If no callback is supplied, all entries of + * input equal to false (see + * converting to + * boolean) will be removed. + *

+ * @return array the filtered array. + * + * @jms-builtin + */ +function array_filter (array $input, $callback = null) {} + +/** + * Applies the callback to the elements of the given arrays + * @link http://www.php.net/manual/en/function.array-map.php + * @param callback callback

+ * Callback function to run for each element in each array. + *

+ * @param arr1 array

+ * An array to run through the callback function. + *

+ * @param _ array[optional] + * @return array an array containing all the elements of arr1 + * after applying the callback function to each one. + * + * @jms-builtin + */ +function array_map ($callback, array $arr1, array $_ = null) {} + +/** + * Split an array into chunks + * @link http://www.php.net/manual/en/function.array-chunk.php + * @param input array

+ * The array to work on + *

+ * @param size int

+ * The size of each chunk + *

+ * @param preserve_keys bool[optional]

+ * When set to true keys will be preserved. + * Default is false which will reindex the chunk numerically + *

+ * @return array a multidimensional numerically indexed array, starting with zero, + * with each dimension containing size elements. + * + * @jms-builtin + */ +function array_chunk (array $input, $size, $preserve_keys = null) {} + +/** + * Creates an array by using one array for keys and another for its values + * @link http://www.php.net/manual/en/function.array-combine.php + * @param keys array

+ * Array of keys to be used. Illegal values for key will be + * converted to string. + *

+ * @param values array

+ * Array of values to be used + *

+ * @return array the combined array, false if the number of elements + * for each array isn't equal or if the arrays are empty. + * + * @jms-builtin + */ +function array_combine (array $keys, array $values) {} + +/** + * Checks if the given key or index exists in the array + * @link http://www.php.net/manual/en/function.array-key-exists.php + * @param key mixed

+ * Value to check. + *

+ * @param search array

+ * An array with keys to check. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function array_key_exists ($key, array $search) {} + +/** + * &Alias; current + * @link http://www.php.net/manual/en/function.pos.php + * @param arg + * + * @jms-builtin + */ +function pos (&$arg) {} + +/** + * &Alias; count + * @link http://www.php.net/manual/en/function.sizeof.php + * @param var + * @param mode[optional] + * + * @jms-builtin + */ +function sizeof ($var, $mode = null) {} + +/** + * @param key + * @param search + * + * @jms-builtin + */ +function key_exists ($key, $search) {} + +/** + * Checks if assertion is &false; + * @link http://www.php.net/manual/en/function.assert.php + * @param assertion mixed

+ * The assertion. + *

+ * @return bool false if the assertion is false, true otherwise. + * + * @jms-builtin + */ +function assert ($assertion) {} + +/** + * Set/get the various assert flags + * @link http://www.php.net/manual/en/function.assert-options.php + * @param what int

+ * + * Assert Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionINI SettingDefault valueDescription
ASSERT_ACTIVEassert.active1enable assert evaluation
ASSERT_WARNINGassert.warning1issue a PHP warning for each failed assertion
ASSERT_BAILassert.bail0terminate execution on failed assertions
ASSERT_QUIET_EVALassert.quiet_eval0 + * disable error_reporting during assertion expression + * evaluation + *
ASSERT_CALLBACKassert.callbackCallback to call on failed assertions
+ *

+ * @param value mixed[optional]

+ * An optional new value for the option. + *

+ * @return mixed the original setting of any option or false on errors. + * + * @jms-builtin + */ +function assert_options ($what, $value = null) {} + +/** + * Compares two "PHP-standardized" version number strings + * @link http://www.php.net/manual/en/function.version-compare.php + * @param version1 string

+ * First version number. + *

+ * @param version2 string

+ * Second version number. + *

+ * @param operator string[optional]

+ * If you specify the third optional operator + * argument, you can test for a particular relationship. The + * possible operators are: <, + * lt, <=, + * le, >, + * gt, >=, + * ge, ==, + * =, eq, + * !=, <>, + * ne respectively. + *

+ *

+ * This parameter is case-sensitive, so values should be lowercase. + *

+ * @return mixed By default, version_compare returns + * -1 if the first version is lower than the second, + * 0 if they are equal, and + * 1 if the second is lower. + *

+ *

+ * When using the optional operator argument, the + * function will return true if the relationship is the one specified + * by the operator, false otherwise. + * + * @jms-builtin + */ +function version_compare ($version1, $version2, $operator = null) {} + +/** + * Convert a pathname and a project identifier to a System V IPC key + * @link http://www.php.net/manual/en/function.ftok.php + * @param pathname string

+ * Path to an accessible file. + *

+ * @param proj string

+ * Project identifier. This must be a one character string. + *

+ * @return int On success the return value will be the created key value, otherwise + * -1 is returned. + * + * @jms-builtin + */ +function ftok ($pathname, $proj) {} + +/** + * Perform the rot13 transform on a string + * @link http://www.php.net/manual/en/function.str-rot13.php + * @param str string

+ * The input string. + *

+ * @return string the ROT13 version of the given string. + * + * @jms-builtin + */ +function str_rot13 ($str) {} + +/** + * Retrieve list of registered filters + * @link http://www.php.net/manual/en/function.stream-get-filters.php + * @return array an indexed array containing the name of all stream filters + * available. + * + * @jms-builtin + */ +function stream_get_filters () {} + +/** + * Register a user defined stream filter + * @link http://www.php.net/manual/en/function.stream-filter-register.php + * @param filtername string

+ * The filter name to be registered. + *

+ * @param classname string

+ * To implement a filter, you need to define a class as an extension of + * php_user_filter with a number of member functions + * as defined below. When performing read/write operations on the stream + * to which your filter is attached, PHP will pass the data through your + * filter (and any other filters attached to that stream) so that the + * data may be modified as desired. You must implement the methods + * exactly as described below - doing otherwise will lead to undefined + * behaviour. + *

+ * intfilter + * resourcein + * resourceout + * intconsumed + * boolclosing + *

+ * This method is called whenever data is read from or written to + * the attached stream (such as with fread or fwrite). + * in is a resource pointing to a bucket brigade + * which contains one or more bucket objects containing data to be filtered. + * out is a resource pointing to a second bucket brigade + * into which your modified buckets should be placed. + * consumed, which must always + * be declared by reference, should be incremented by the length of the data + * which your filter reads in and alters. In most cases this means you will + * increment consumed by $bucket->datalen + * for each $bucket. If the stream is in the process of closing + * (and therefore this is the last pass through the filterchain), + * the closing parameter will be set to true. + * The filter method must return one of + * three values upon completion. + * + * Return Value + * Meaning + * + * + * PSFS_PASS_ON + * + * Filter processed successfully with data available in the + * out bucket brigade. + * + * + * + * PSFS_FEED_ME + * + * Filter processed successfully, however no data was available to + * return. More data is required from the stream or prior filter. + * + * + * + * PSFS_ERR_FATAL (default) + * + * The filter experienced an unrecoverable error and cannot continue. + * + * + *

+ * boolonCreate + * This method is called during instantiation of the filter class + * object. If your filter allocates or initializes any other resources + * (such as a buffer), this is the place to do it. Your implementation of + * this method should return false on failure, or true on success. + * When your filter is first instantiated, and + * yourfilter->onCreate() is called, a number of properties + * will be available as shown in the table below. + *

+ * + * Property + * Contents + * + * + * FilterClass->filtername + * + * A string containing the name the filter was instantiated with. + * Filters may be registered under multiple names or under wildcards. + * Use this property to determine which name was used. + * + * + * + * FilterClass->params + * + * The contents of the params parameter passed + * to stream_filter_append + * or stream_filter_prepend. + * + * + * + * FilterClass->stream + * + * The stream resource being filtered. Maybe available only during + * filter calls when the + * closing parameter is set to false. + * + * + *

+ * voidonClose + *

+ * This method is called upon filter shutdown (typically, this is also + * during stream shutdown), and is executed after + * the flush method is called. If any resources + * were allocated or initialized during onCreate() + * this would be the time to destroy or dispose of them. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * stream_filter_register will return false if the + * filtername is already defined. + * + * @jms-builtin + */ +function stream_filter_register ($filtername, $classname) {} + +/** + * Return a bucket object from the brigade for operating on + * @link http://www.php.net/manual/en/function.stream-bucket-make-writeable.php + * @param brigade resource + * @return object + * + * @jms-builtin + */ +function stream_bucket_make_writeable ($brigade) {} + +/** + * Prepend bucket to brigade + * @link http://www.php.net/manual/en/function.stream-bucket-prepend.php + * @param brigade resource + * @param bucket resource + * @return void + * + * @jms-builtin + */ +function stream_bucket_prepend ($brigade, $bucket) {} + +/** + * Append bucket to brigade + * @link http://www.php.net/manual/en/function.stream-bucket-append.php + * @param brigade resource + * @param bucket resource + * @return void + * + * @jms-builtin + */ +function stream_bucket_append ($brigade, $bucket) {} + +/** + * Create a new bucket for use on the current stream + * @link http://www.php.net/manual/en/function.stream-bucket-new.php + * @param stream resource + * @param buffer string + * @return object + * + * @jms-builtin + */ +function stream_bucket_new ($stream, $buffer) {} + +/** + * Add URL rewriter values + * @link http://www.php.net/manual/en/function.output-add-rewrite-var.php + * @param name string

+ * The variable name. + *

+ * @param value string

+ * The variable value. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function output_add_rewrite_var ($name, $value) {} + +/** + * Reset URL rewriter values + * @link http://www.php.net/manual/en/function.output-reset-rewrite-vars.php + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function output_reset_rewrite_vars () {} + +/** + * Returns directory path used for temporary files + * @link http://www.php.net/manual/en/function.sys-get-temp-dir.php + * @return string the path of the temporary directory. + * + * @jms-builtin + */ +function sys_get_temp_dir () {} + +define ('CONNECTION_ABORTED', 1); +define ('CONNECTION_NORMAL', 0); +define ('CONNECTION_TIMEOUT', 2); +define ('INI_USER', 1); +define ('INI_PERDIR', 2); +define ('INI_SYSTEM', 4); +define ('INI_ALL', 7); + +/** + * Normal INI scanner mode (since PHP 5.3). + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('INI_SCANNER_NORMAL', 0); + +/** + * Raw INI scanner mode (since PHP 5.3). + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('INI_SCANNER_RAW', 1); +define ('PHP_URL_SCHEME', 0); +define ('PHP_URL_HOST', 1); +define ('PHP_URL_PORT', 2); +define ('PHP_URL_USER', 3); +define ('PHP_URL_PASS', 4); +define ('PHP_URL_PATH', 5); +define ('PHP_URL_QUERY', 6); +define ('PHP_URL_FRAGMENT', 7); +define ('M_E', 2.718281828459); +define ('M_LOG2E', 1.442695040889); +define ('M_LOG10E', 0.43429448190325); +define ('M_LN2', 0.69314718055995); +define ('M_LN10', 2.302585092994); + +/** + * Round halves up + * @link http://www.php.net/manual/en/math.constants.php + */ +define ('M_PI', 3.1415926535898); +define ('M_PI_2', 1.5707963267949); +define ('M_PI_4', 0.78539816339745); +define ('M_1_PI', 0.31830988618379); +define ('M_2_PI', 0.63661977236758); +define ('M_SQRTPI', 1.7724538509055); +define ('M_2_SQRTPI', 1.1283791670955); +define ('M_LNPI', 1.1447298858494); +define ('M_EULER', 0.57721566490153); +define ('M_SQRT2', 1.4142135623731); +define ('M_SQRT1_2', 0.70710678118655); +define ('M_SQRT3', 1.7320508075689); +define ('INF', INF); +define ('NAN', NAN); +define ('PHP_ROUND_HALF_UP', 1); + +/** + * Round halves down + * @link http://www.php.net/manual/en/math.constants.php + */ +define ('PHP_ROUND_HALF_DOWN', 2); + +/** + * Round halves to even numbers + * @link http://www.php.net/manual/en/math.constants.php + */ +define ('PHP_ROUND_HALF_EVEN', 3); + +/** + * Round halves to odd numbers + * @link http://www.php.net/manual/en/math.constants.php + */ +define ('PHP_ROUND_HALF_ODD', 4); +define ('INFO_GENERAL', 1); + +/** + * PHP Credits. See also phpcredits. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_CREDITS', 2); + +/** + * Current Local and Master values for PHP directives. See + * also ini_get. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_CONFIGURATION', 4); + +/** + * Loaded modules and their respective settings. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_MODULES', 8); + +/** + * Environment Variable information that's also available in + * $_ENV. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_ENVIRONMENT', 16); + +/** + * Shows all + * predefined variables from EGPCS (Environment, GET, + * POST, Cookie, Server). + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_VARIABLES', 32); + +/** + * PHP License information. See also the license faq. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('INFO_LICENSE', 64); +define ('INFO_ALL', -1); + +/** + * A list of the core developers + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_GROUP', 1); + +/** + * General credits: Language design and concept, PHP + * authors and SAPI module. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_GENERAL', 2); + +/** + * A list of the server API modules for PHP, and their authors. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_SAPI', 4); + +/** + * A list of the extension modules for PHP, and their authors. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_MODULES', 8); + +/** + * The credits for the documentation team. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_DOCS', 16); + +/** + * Usually used in combination with the other flags. Indicates + * that a complete stand-alone HTML page needs to be + * printed including the information indicated by the other + * flags. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_FULLPAGE', 32); + +/** + * The credits for the quality assurance team. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_QA', 64); + +/** + * The configuration line, &php.ini; location, build date, Web + * Server, System and more. + * @link http://www.php.net/manual/en/info.constants.php + */ +define ('CREDITS_ALL', -1); +define ('HTML_SPECIALCHARS', 0); +define ('HTML_ENTITIES', 1); +define ('ENT_COMPAT', 2); +define ('ENT_QUOTES', 3); +define ('ENT_NOQUOTES', 0); +define ('ENT_IGNORE', 4); +define ('STR_PAD_LEFT', 0); +define ('STR_PAD_RIGHT', 1); +define ('STR_PAD_BOTH', 2); +define ('PATHINFO_DIRNAME', 1); +define ('PATHINFO_BASENAME', 2); +define ('PATHINFO_EXTENSION', 4); + +/** + * Since PHP 5.2.0. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('PATHINFO_FILENAME', 8); +define ('CHAR_MAX', 127); +define ('LC_CTYPE', 0); +define ('LC_NUMERIC', 1); +define ('LC_TIME', 2); +define ('LC_COLLATE', 3); +define ('LC_MONETARY', 4); +define ('LC_ALL', 6); +define ('LC_MESSAGES', 5); +define ('SEEK_SET', 0); +define ('SEEK_CUR', 1); +define ('SEEK_END', 2); +define ('LOCK_SH', 1); +define ('LOCK_EX', 2); +define ('LOCK_UN', 3); +define ('LOCK_NB', 4); + +/** + * A connection with an external resource has been established. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_CONNECT', 2); + +/** + * Additional authorization is required to access the specified resource. + * Typical issued with severity level of + * STREAM_NOTIFY_SEVERITY_ERR. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_AUTH_REQUIRED', 3); + +/** + * Authorization has been completed (with or without success). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_AUTH_RESULT', 10); + +/** + * The mime-type of resource has been identified, + * refer to message for a description of the + * discovered type. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_MIME_TYPE_IS', 4); + +/** + * The size of the resource has been discovered. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_FILE_SIZE_IS', 5); + +/** + * The external resource has redirected the stream to an alternate + * location. Refer to message. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_REDIRECTED', 6); + +/** + * Indicates current progress of the stream transfer in + * bytes_transferred and possibly + * bytes_max as well. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_PROGRESS', 7); + +/** + * A generic error occurred on the stream, consult + * message and message_code + * for details. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_FAILURE', 9); + +/** + * There is no more data available on the stream. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_COMPLETED', 8); + +/** + * A remote address required for this stream has been resolved, or the resolution + * failed. See severity for an indication of which happened. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_RESOLVE', 1); + +/** + * Normal, non-error related, notification. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_SEVERITY_INFO', 0); + +/** + * Non critical error condition. Processing may continue. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_SEVERITY_WARN', 1); + +/** + * A critical error occurred. Processing cannot continue. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_SEVERITY_ERR', 2); + +/** + * Used with stream_filter_append and + * stream_filter_prepend to indicate + * that the specified filter should only be applied when + * reading + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_FILTER_READ', 1); + +/** + * Used with stream_filter_append and + * stream_filter_prepend to indicate + * that the specified filter should only be applied when + * writing + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_FILTER_WRITE', 2); + +/** + * This constant is equivalent to + * STREAM_FILTER_READ | STREAM_FILTER_WRITE + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_FILTER_ALL', 3); + +/** + * Client socket opened with stream_socket_client + * should remain persistent between page loads. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_CLIENT_PERSISTENT', 1); + +/** + * Open client socket asynchronously. This option must be used + * together with the STREAM_CLIENT_CONNECT flag. + * Used with stream_socket_client. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_CLIENT_ASYNC_CONNECT', 2); + +/** + * Open client socket connection. Client sockets should always + * include this flag. Used with stream_socket_client. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_CLIENT_CONNECT', 4); +define ('STREAM_CRYPTO_METHOD_SSLv2_CLIENT', 0); +define ('STREAM_CRYPTO_METHOD_SSLv3_CLIENT', 1); +define ('STREAM_CRYPTO_METHOD_SSLv23_CLIENT', 2); +define ('STREAM_CRYPTO_METHOD_TLS_CLIENT', 3); +define ('STREAM_CRYPTO_METHOD_SSLv2_SERVER', 4); +define ('STREAM_CRYPTO_METHOD_SSLv3_SERVER', 5); +define ('STREAM_CRYPTO_METHOD_SSLv23_SERVER', 6); +define ('STREAM_CRYPTO_METHOD_TLS_SERVER', 7); + +/** + * Used with stream_socket_shutdown to disable + * further receptions. Added in PHP 5.2.1. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SHUT_RD', 0); + +/** + * Used with stream_socket_shutdown to disable + * further transmissions. Added in PHP 5.2.1. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SHUT_WR', 1); + +/** + * Used with stream_socket_shutdown to disable + * further receptions and transmissions. Added in PHP 5.2.1. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SHUT_RDWR', 2); + +/** + * Internet Protocol Version 4 (IPv4). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_PF_INET', 2); + +/** + * Internet Protocol Version 6 (IPv6). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_PF_INET6', 10); + +/** + * Unix system internal protocols. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_PF_UNIX', 1); + +/** + * Provides a IP socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_IP', 0); + +/** + * Provides a TCP socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_TCP', 6); + +/** + * Provides a UDP socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_UDP', 17); + +/** + * Provides a ICMP socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_ICMP', 1); + +/** + * Provides a RAW socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_RAW', 255); + +/** + * Provides sequenced, two-way byte streams with a transmission mechanism + * for out-of-band data (TCP, for example). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_STREAM', 1); + +/** + * Provides datagrams, which are connectionless messages (UDP, for + * example). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_DGRAM', 2); + +/** + * Provides a raw socket, which provides access to internal network + * protocols and interfaces. Usually this type of socket is just available + * to the root user. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_RAW', 3); + +/** + * Provides a sequenced packet stream socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_SEQPACKET', 5); + +/** + * Provides a RDM (Reliably-delivered messages) socket. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_RDM', 4); +define ('STREAM_PEEK', 2); +define ('STREAM_OOB', 1); + +/** + * Tells a stream created with stream_socket_server + * to bind to the specified target. Server sockets should always include this flag. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SERVER_BIND', 4); + +/** + * Tells a stream created with stream_socket_server + * and bound using the STREAM_SERVER_BIND flag to start + * listening on the socket. Connection-orientated transports (such as TCP) + * must use this flag, otherwise the server socket will not be enabled. + * Using this flag for connect-less transports (such as UDP) is an error. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_SERVER_LISTEN', 8); + +/** + * Search for filename in + * include_path (since PHP 5). + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_USE_INCLUDE_PATH', 1); + +/** + * Strip EOL characters (since PHP 5). + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_IGNORE_NEW_LINES', 2); + +/** + * Skip empty lines (since PHP 5). + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_SKIP_EMPTY_LINES', 4); + +/** + * Append content to existing file. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_APPEND', 8); +define ('FILE_NO_DEFAULT_CONTEXT', 16); + +/** + *

+ * Text mode (since PHP 5.2.7). + *

+ * This constant has no effect, and is only available for + * forward compatibility. + *

+ *

+ * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_TEXT', 0); + +/** + *

+ * Binary mode (since PHP 5.2.7). + *

+ * This constant has no effect, and is only available for + * forward compatibility. + *

+ *

+ * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FILE_BINARY', 0); + +/** + * Disable backslash escaping. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FNM_NOESCAPE', 2); + +/** + * Slash in string only matches slash in the given pattern. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FNM_PATHNAME', 1); + +/** + * Leading period in string must be exactly matched by period in the given pattern. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FNM_PERIOD', 4); + +/** + * Caseless match. Part of the GNU extension. + * @link http://www.php.net/manual/en/filesystem.constants.php + */ +define ('FNM_CASEFOLD', 16); + +/** + * Return Code indicating that the + * userspace filter returned buckets in $out. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_PASS_ON', 2); + +/** + * Return Code indicating that the + * userspace filter did not return buckets in $out + * (i.e. No data available). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_FEED_ME', 1); + +/** + * Return Code indicating that the + * userspace filter encountered an unrecoverable error + * (i.e. Invalid data received). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_ERR_FATAL', 0); + +/** + * Regular read/write. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_FLAG_NORMAL', 0); + +/** + * An incremental flush. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_FLAG_FLUSH_INC', 1); + +/** + * Final flush prior to closing. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('PSFS_FLAG_FLUSH_CLOSE', 2); +define ('ABDAY_1', 131072); +define ('ABDAY_2', 131073); +define ('ABDAY_3', 131074); +define ('ABDAY_4', 131075); +define ('ABDAY_5', 131076); +define ('ABDAY_6', 131077); +define ('ABDAY_7', 131078); +define ('DAY_1', 131079); +define ('DAY_2', 131080); +define ('DAY_3', 131081); +define ('DAY_4', 131082); +define ('DAY_5', 131083); +define ('DAY_6', 131084); +define ('DAY_7', 131085); +define ('ABMON_1', 131086); +define ('ABMON_2', 131087); +define ('ABMON_3', 131088); +define ('ABMON_4', 131089); +define ('ABMON_5', 131090); +define ('ABMON_6', 131091); +define ('ABMON_7', 131092); +define ('ABMON_8', 131093); +define ('ABMON_9', 131094); +define ('ABMON_10', 131095); +define ('ABMON_11', 131096); +define ('ABMON_12', 131097); +define ('MON_1', 131098); +define ('MON_2', 131099); +define ('MON_3', 131100); +define ('MON_4', 131101); +define ('MON_5', 131102); +define ('MON_6', 131103); +define ('MON_7', 131104); +define ('MON_8', 131105); +define ('MON_9', 131106); +define ('MON_10', 131107); +define ('MON_11', 131108); +define ('MON_12', 131109); +define ('AM_STR', 131110); +define ('PM_STR', 131111); +define ('D_T_FMT', 131112); +define ('D_FMT', 131113); +define ('T_FMT', 131114); +define ('T_FMT_AMPM', 131115); +define ('ERA', 131116); +define ('ERA_D_T_FMT', 131120); +define ('ERA_D_FMT', 131118); +define ('ERA_T_FMT', 131121); +define ('ALT_DIGITS', 131119); +define ('CRNCYSTR', 262159); +define ('RADIXCHAR', 65536); +define ('THOUSEP', 65537); +define ('YESEXPR', 327680); +define ('NOEXPR', 327681); +define ('CODESET', 14); +define ('CRYPT_SALT_LENGTH', 123); +define ('CRYPT_STD_DES', 1); +define ('CRYPT_EXT_DES', 1); +define ('CRYPT_MD5', 1); +define ('CRYPT_BLOWFISH', 1); +define ('CRYPT_SHA256', 1); +define ('CRYPT_SHA512', 1); +define ('DIRECTORY_SEPARATOR', "/"); +define ('PATH_SEPARATOR', ":"); +define ('GLOB_BRACE', 1024); +define ('GLOB_MARK', 2); +define ('GLOB_NOSORT', 4); +define ('GLOB_NOCHECK', 16); +define ('GLOB_NOESCAPE', 64); +define ('GLOB_ERR', 1); +define ('GLOB_ONLYDIR', 8192); +define ('GLOB_AVAILABLE_FLAGS', 9303); + +/** + * system is unusable + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_EMERG', 0); + +/** + * action must be taken immediately + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_ALERT', 1); + +/** + * critical conditions + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_CRIT', 2); + +/** + * error conditions + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_ERR', 3); + +/** + * warning conditions + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_WARNING', 4); + +/** + * normal, but significant, condition + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_NOTICE', 5); + +/** + * informational message + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_INFO', 6); + +/** + * debug-level message + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_DEBUG', 7); + +/** + * kernel messages + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_KERN', 0); + +/** + * generic user-level messages + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_USER', 8); + +/** + * mail subsystem + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_MAIL', 16); + +/** + * other system daemons + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_DAEMON', 24); + +/** + * security/authorization messages (use LOG_AUTHPRIV instead + * in systems where that constant is defined) + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_AUTH', 32); + +/** + * messages generated internally by syslogd + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_SYSLOG', 40); + +/** + * line printer subsystem + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_LPR', 48); + +/** + * USENET news subsystem + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_NEWS', 56); + +/** + * UUCP subsystem + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_UUCP', 64); + +/** + * clock daemon (cron and at) + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_CRON', 72); + +/** + * security/authorization messages (private) + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_AUTHPRIV', 80); +define ('LOG_LOCAL0', 128); +define ('LOG_LOCAL1', 136); +define ('LOG_LOCAL2', 144); +define ('LOG_LOCAL3', 152); +define ('LOG_LOCAL4', 160); +define ('LOG_LOCAL5', 168); +define ('LOG_LOCAL6', 176); +define ('LOG_LOCAL7', 184); + +/** + * include PID with each message + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_PID', 1); + +/** + * if there is an error while sending data to the system logger, + * write directly to the system console + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_CONS', 2); + +/** + * (default) delay opening the connection until the first + * message is logged + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_ODELAY', 4); + +/** + * open the connection to the logger immediately + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_NDELAY', 8); +define ('LOG_NOWAIT', 16); + +/** + * print log message also to standard error + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('LOG_PERROR', 32); +define ('EXTR_OVERWRITE', 0); +define ('EXTR_SKIP', 1); +define ('EXTR_PREFIX_SAME', 2); +define ('EXTR_PREFIX_ALL', 3); +define ('EXTR_PREFIX_INVALID', 4); +define ('EXTR_PREFIX_IF_EXISTS', 5); +define ('EXTR_IF_EXISTS', 6); +define ('EXTR_REFS', 256); + +/** + * SORT_ASC is used with + * array_multisort to sort in ascending order. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_ASC', 4); + +/** + * SORT_DESC is used with + * array_multisort to sort in descending order. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_DESC', 3); + +/** + * SORT_REGULAR is used to compare items normally. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_REGULAR', 0); + +/** + * SORT_NUMERIC is used to compare items numerically. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_NUMERIC', 1); + +/** + * SORT_STRING is used to compare items as strings. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_STRING', 2); + +/** + * SORT_LOCALE_STRING is used to compare items as + * strings, based on the current locale. Added in PHP 4.4.0 and 5.0.2. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('SORT_LOCALE_STRING', 5); + +/** + * CASE_LOWER is used with + * array_change_key_case and is used to convert array + * keys to lower case. This is also the default case for + * array_change_key_case. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('CASE_LOWER', 0); + +/** + * CASE_UPPER is used with + * array_change_key_case and is used to convert array + * keys to upper case. + * @link http://www.php.net/manual/en/array.constants.php + */ +define ('CASE_UPPER', 1); +define ('COUNT_NORMAL', 0); +define ('COUNT_RECURSIVE', 1); +define ('ASSERT_ACTIVE', 1); +define ('ASSERT_CALLBACK', 2); +define ('ASSERT_BAIL', 3); +define ('ASSERT_WARNING', 4); +define ('ASSERT_QUIET_EVAL', 5); + +/** + * Flag indicating if the stream + * used the include path. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_USE_PATH', 1); +define ('STREAM_IGNORE_URL', 2); +define ('STREAM_ENFORCE_SAFE_MODE', 4); + +/** + * Flag indicating if the wrapper + * is responsible for raising errors using trigger_error + * during opening of the stream. If this flag is not set, you + * should not raise any errors. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_REPORT_ERRORS', 8); + +/** + * This flag is useful when your extension really must be able to randomly + * seek around in a stream. Some streams may not be seekable in their + * native form, so this flag asks the streams API to check to see if the + * stream does support seeking. If it does not, it will copy the stream + * into temporary storage (which may be a temporary file or a memory + * stream) which does support seeking. + * Please note that this flag is not useful when you want to seek the + * stream and write to it, because the stream you are accessing might + * not be bound to the actual resource you requested. + * If the requested resource is network based, this flag will cause the + * opener to block until the whole contents have been downloaded. + * @link http://www.php.net/manual/en/internals2.ze1.streams.constants.php + */ +define ('STREAM_MUST_SEEK', 16); +define ('STREAM_URL_STAT_LINK', 1); +define ('STREAM_URL_STAT_QUIET', 2); +define ('STREAM_MKDIR_RECURSIVE', 1); +define ('STREAM_IS_URL', 1); +define ('STREAM_OPTION_BLOCKING', 1); +define ('STREAM_OPTION_READ_TIMEOUT', 4); +define ('STREAM_OPTION_READ_BUFFER', 2); +define ('STREAM_OPTION_WRITE_BUFFER', 3); +define ('STREAM_BUFFER_NONE', 0); +define ('STREAM_BUFFER_LINE', 1); +define ('STREAM_BUFFER_FULL', 2); + +/** + * Stream casting, when stream_cast is called + * otherwise (see above). + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_CAST_AS_STREAM', 0); + +/** + * Stream casting, for when stream_select is + * calling stream_cast. + * @link http://www.php.net/manual/en/stream.constants.php + */ +define ('STREAM_CAST_FOR_SELECT', 3); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_GIF', 1); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPEG', 2); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_PNG', 3); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_SWF', 4); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_PSD', 5); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_BMP', 6); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_TIFF_II', 7); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_TIFF_MM', 8); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPC', 9); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JP2', 10); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPX', 11); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JB2', 12); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_SWC', 13); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_IFF', 14); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_WBMP', 15); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPEG2000', 9); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_XBM', 16); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * (Available as of PHP 5.3.0) + * @link http://www.php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_ICO', 17); +define ('IMAGETYPE_UNKNOWN', 0); +define ('IMAGETYPE_COUNT', 18); + +/** + * IPv4 Address Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_A', 1); + +/** + * Authoritative Name Server Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_NS', 2); + +/** + * Alias (Canonical Name) Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_CNAME', 16); + +/** + * Start of Authority Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_SOA', 32); + +/** + * Pointer Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_PTR', 2048); + +/** + * Host Info Resource (See IANA's + * Operating System Names + * for the meaning of these values) + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_HINFO', 4096); + +/** + * Mail Exchanger Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_MX', 16384); + +/** + * Text Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_TXT', 32768); +define ('DNS_SRV', 33554432); +define ('DNS_NAPTR', 67108864); + +/** + * IPv6 Address Resource + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_AAAA', 134217728); +define ('DNS_A6', 16777216); + +/** + * Any Resource Record. On most systems + * this returns all resource records, however + * it should not be counted upon for critical + * uses. Try DNS_ALL instead. + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_ANY', 268435456); + +/** + * Iteratively query the name server for + * each available record type. + * @link http://www.php.net/manual/en/network.constants.php + */ +define ('DNS_ALL', 251713587); + +// End of standard v.5.3.2 +?> diff --git a/res/php-5.3-core-api/tidy.php b/res/php-5.3-core-api/tidy.php new file mode 100644 index 0000000..b7a78a0 --- /dev/null +++ b/res/php-5.3-core-api/tidy.php @@ -0,0 +1,737 @@ + + * You will find a list with each configuration option and their types + * at: &url.tidy.conf;. + *

+ * @return mixed the value of the specified option. + * The return type depends on the type of the specified one. + */ + public function getOpt ($option) {} + + /** + * Execute configured cleanup and repair operations on parsed markup + * @link http://www.php.net/manual/en/tidy.cleanrepair.php + * @return bool Returns true on success or false on failure. + */ + public function cleanRepair () {} + + /** + * Parse markup in file or URI + * @link http://www.php.net/manual/en/tidy.parsefile.php + * @param filename string

+ * If the filename parameter is given, this function + * will also read that file and initialize the object with the file, + * acting like tidy_parse_file. + *

+ * @param config mixed[optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * For an explanation about each option, see + * &url.tidy.conf;. + *

+ * @param encoding string[optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @param use_include_path bool[optional]

+ * Search for the file in the include_path. + *

+ * @return bool Returns true on success or false on failure. + */ + public function parseFile ($filename, $config = null, $encoding = null, $use_include_path = null) {} + + /** + * Parse a document stored in a string + * @link http://www.php.net/manual/en/tidy.parsestring.php + * @param input string

+ * The data to be parsed. + *

+ * @param config mixed[optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * For an explanation about each option, visit &url.tidy.conf;. + *

+ * @param encoding string[optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @return bool a new tidy instance. + */ + public function parseString ($input, $config = null, $encoding = null) {} + + /** + * Repair a string using an optionally provided configuration file + * @link http://www.php.net/manual/en/tidy.repairstring.php + * @param data string

+ * The data to be repaired. + *

+ * @param config mixed[optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * Check &url.tidy.conf; for + * an explanation about each option. + *

+ * @param encoding string[optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @return string the repaired string. + */ + public function repairString ($data, $config = null, $encoding = null) {} + + /** + * Repair a file and return it as a string + * @link http://www.php.net/manual/en/tidy.repairfile.php + * @param filename string

+ * The file to be repaired. + *

+ * @param config mixed[optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * Check http://tidy.sourceforge.net/docs/quickref.html for an + * explanation about each option. + *

+ * @param encoding string[optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @param use_include_path bool[optional]

+ * Search for the file in the include_path. + *

+ * @return string the repaired contents as a string. + */ + public function repairFile ($filename, $config = null, $encoding = null, $use_include_path = null) {} + + /** + * Run configured diagnostics on parsed and repaired markup + * @link http://www.php.net/manual/en/function.tidy-diagnose.php + * @return bool Returns true on success or false on failure. + */ + public function diagnose () {} + + /** + * Get release date (version) for Tidy library + * @link http://www.php.net/manual/en/tidy.getrelease.php + * @return string a string with the release date of the Tidy library. + */ + public function getRelease () {} + + /** + * Get current Tidy configuration + * @link http://www.php.net/manual/en/tidy.getconfig.php + * @return array an array of configuration options. + *

+ *

+ * For an explanation about each option, visit &url.tidy.conf;. + */ + public function getConfig () {} + + /** + * Get status of specified document + * @link http://www.php.net/manual/en/tidy.getstatus.php + * @return int 0 if no error/warning was raised, 1 for warnings or accessibility + * errors, or 2 for errors. + */ + public function getStatus () {} + + public function getHtmlVer () {} + + /** + * Returns the documentation for the given option name + * @link http://www.php.net/manual/en/tidy.getoptdoc.php + * @param optname string

+ * The option name + *

+ * @return string a string if the option exists and has documentation available, or + * false otherwise. + */ + public function getOptDoc ($optname) {} + + /** + * Indicates if the document is a XHTML document + * @link http://www.php.net/manual/en/tidy.isxhtml.php + * @return bool This function returns true if the specified tidy + * object is a XHTML document, or false otherwise. + *

+ *

+ * This function is not yet implemented in the Tidylib itself, so it always + * return false. + */ + public function isXhtml () {} + + /** + * Indicates if the document is a generic (non HTML/XHTML) XML document + * @link http://www.php.net/manual/en/tidy.isxml.php + * @return bool This function returns true if the specified tidy + * object is a generic XML document (non HTML/XHTML), + * or false otherwise. + *

+ *

+ * This function is not yet implemented in the Tidylib itself, so it always + * return false. + */ + public function isXml () {} + + /** + * Returns a tidyNode object representing the root of the tidy parse tree + * @link http://www.php.net/manual/en/tidy.root.php + * @return tidyNode the tidyNode object. + */ + public function root () {} + + /** + * Returns a tidyNode object starting from the <head> tag of the tidy parse tree + * @link http://www.php.net/manual/en/tidy.head.php + * @return tidyNode the tidyNode object. + */ + public function head () {} + + /** + * Returns a tidyNode object starting from the <html> tag of the tidy parse tree + * @link http://www.php.net/manual/en/tidy.html.php + * @return tidyNode the tidyNode object. + */ + public function html () {} + + /** + * Returns a tidyNode object starting from the <body> tag of the tidy parse tree + * @link http://www.php.net/manual/en/tidy.body.php + * @return tidyNode the detected HTML version. + *

+ *

+ * This function is not yet implemented in the Tidylib itself, so it always + * return 0. + */ + public function body () {} + + /** + * Constructs a new tidy object + * @link http://www.php.net/manual/en/tidy.construct.php + * @param filename string[optional]

+ * If the filename parameter is given, this function + * will also read that file and initialize the object with the file, + * acting like tidy_parse_file. + *

+ * @param config mixed[optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * For an explanation about each option, visit &url.tidy.conf;. + *

+ * @param encoding string[optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @param use_include_path bool[optional]

+ * Search for the file in the include_path. + *

+ * @return tidy the new tidy instance. + */ + public function __construct ($filename = null, $config = null, $encoding = null, $use_include_path = null) {} + +} + +/** @jms-builtin */ +final class tidyNode { + + /** + * Checks if a node has children + * @link http://www.php.net/manual/en/tidynode.haschildren.php + * @return bool true if the node has children, false otherwise. + */ + public function hasChildren () {} + + /** + * Checks if a node has siblings + * @link http://www.php.net/manual/en/tidynode.hassiblings.php + * @return bool true if the node has siblings, false otherwise. + */ + public function hasSiblings () {} + + /** + * Checks if a node represents a comment + * @link http://www.php.net/manual/en/tidynode.iscomment.php + * @return bool true if the node is a comment, false otherwise. + */ + public function isComment () {} + + /** + * Checks if a node is part of a HTML document + * @link http://www.php.net/manual/en/tidynode.ishtml.php + * @return bool true if the node is part of a HTML document, false otherwise. + */ + public function isHtml () {} + + /** + * Checks if a node represents text (no markup) + * @link http://www.php.net/manual/en/tidynode.istext.php + * @return bool true if the node represent a text, false otherwise. + */ + public function isText () {} + + /** + * Checks if this node is JSTE + * @link http://www.php.net/manual/en/tidynode.isjste.php + * @return bool true if the node is JSTE, false otherwise. + */ + public function isJste () {} + + /** + * Checks if this node is ASP + * @link http://www.php.net/manual/en/tidynode.isasp.php + * @return bool true if the node is ASP, false otherwise. + */ + public function isAsp () {} + + /** + * Checks if a node is PHP + * @link http://www.php.net/manual/en/tidynode.isphp.php + * @return bool true if the current node is PHP code, false otherwise. + */ + public function isPhp () {} + + /** + * Returns the parent node of the current node + * @link http://www.php.net/manual/en/tidynode.getparent.php + * @return tidyNode a tidyNode if the node has a parent, or &null; + * otherwise. + */ + public function getParent () {} + + private function __construct () {} + +} + +/** + * @param option + * + * @jms-builtin + */ +function tidy_getopt ($option) {} + +/** + * @param input + * @param config_options[optional] + * @param encoding[optional] + * + * @jms-builtin + */ +function tidy_parse_string ($input, $config_options, $encoding) {} + +/** + * @param file + * @param config_options[optional] + * @param encoding[optional] + * @param use_include_path[optional] + * + * @jms-builtin + */ +function tidy_parse_file ($file, $config_options, $encoding, $use_include_path) {} + +/** + * Return a string representing the parsed tidy markup + * @link http://www.php.net/manual/en/function.tidy-get-output.php + * @param object tidy

+ * &tidy.object; + *

+ * @return string the parsed tidy markup. + * + * @jms-builtin + */ +function tidy_get_output (tidy $object) {} + +/** + * Return warnings and errors which occurred parsing the specified document + * @link http://www.php.net/manual/en/function.tidy-get-error-buffer.php + * @param object tidy

+ * &tidy.object; + *

+ * @return string the error buffer as a string. + * + * @jms-builtin + */ +function tidy_get_error_buffer (tidy $object) {} + +function tidy_clean_repair () {} + +/** + * @param data + * @param config_file[optional] + * @param encoding[optional] + * + * @jms-builtin + */ +function tidy_repair_string ($data, $config_file, $encoding) {} + +/** + * @param filename + * @param config_file[optional] + * @param encoding[optional] + * @param use_include_path[optional] + * + * @jms-builtin + */ +function tidy_repair_file ($filename, $config_file, $encoding, $use_include_path) {} + +function tidy_diagnose () {} + +function tidy_get_release () {} + +function tidy_get_config () {} + +function tidy_get_status () {} + +function tidy_get_html_ver () {} + +function tidy_is_xhtml () {} + +function tidy_is_xml () {} + +/** + * Returns the Number of Tidy errors encountered for specified document + * @link http://www.php.net/manual/en/function.tidy-error-count.php + * @param object tidy

+ * &tidy.object; + *

+ * @return int the number of errors. + * + * @jms-builtin + */ +function tidy_error_count (tidy $object) {} + +/** + * Returns the Number of Tidy warnings encountered for specified document + * @link http://www.php.net/manual/en/function.tidy-warning-count.php + * @param object tidy

+ * &tidy.object; + *

+ * @return int the number of warnings. + * + * @jms-builtin + */ +function tidy_warning_count (tidy $object) {} + +/** + * Returns the Number of Tidy accessibility warnings encountered for specified document + * @link http://www.php.net/manual/en/function.tidy-access-count.php + * @param object tidy

+ * &tidy.object; + *

+ * @return int the number of warnings. + * + * @jms-builtin + */ +function tidy_access_count (tidy $object) {} + +/** + * Returns the Number of Tidy configuration errors encountered for specified document + * @link http://www.php.net/manual/en/function.tidy-config-count.php + * @param object tidy

+ * &tidy.object; + *

+ * @return int the number of errors. + * + * @jms-builtin + */ +function tidy_config_count (tidy $object) {} + +/** + * @param resource + * @param optname + * + * @jms-builtin + */ +function tidy_get_opt_doc ($resource, $optname) {} + +function tidy_get_root () {} + +function tidy_get_head () {} + +function tidy_get_html () {} + +/** + * @param tidy + * + * @jms-builtin + */ +function tidy_get_body ($tidy) {} + +/** + * ob_start callback function to repair the buffer + * @link http://www.php.net/manual/en/function.ob-tidyhandler.php + * @param input string

+ * The buffer. + *

+ * @param mode int[optional]

+ * The buffer mode. + *

+ * @return string the modified buffer. + * + * @jms-builtin + */ +function ob_tidyhandler ($input, $mode = null) {} + + +/** + * description + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_TAG_UNKNOWN', 0); +define ('TIDY_TAG_A', 1); +define ('TIDY_TAG_ABBR', 2); +define ('TIDY_TAG_ACRONYM', 3); +define ('TIDY_TAG_ADDRESS', 4); +define ('TIDY_TAG_ALIGN', 5); +define ('TIDY_TAG_APPLET', 6); +define ('TIDY_TAG_AREA', 7); +define ('TIDY_TAG_B', 8); +define ('TIDY_TAG_BASE', 9); +define ('TIDY_TAG_BASEFONT', 10); +define ('TIDY_TAG_BDO', 11); +define ('TIDY_TAG_BGSOUND', 12); +define ('TIDY_TAG_BIG', 13); +define ('TIDY_TAG_BLINK', 14); +define ('TIDY_TAG_BLOCKQUOTE', 15); +define ('TIDY_TAG_BODY', 16); +define ('TIDY_TAG_BR', 17); +define ('TIDY_TAG_BUTTON', 18); +define ('TIDY_TAG_CAPTION', 19); +define ('TIDY_TAG_CENTER', 20); +define ('TIDY_TAG_CITE', 21); +define ('TIDY_TAG_CODE', 22); +define ('TIDY_TAG_COL', 23); +define ('TIDY_TAG_COLGROUP', 24); +define ('TIDY_TAG_COMMENT', 25); +define ('TIDY_TAG_DD', 26); +define ('TIDY_TAG_DEL', 27); +define ('TIDY_TAG_DFN', 28); +define ('TIDY_TAG_DIR', 29); +define ('TIDY_TAG_DIV', 30); +define ('TIDY_TAG_DL', 31); +define ('TIDY_TAG_DT', 32); +define ('TIDY_TAG_EM', 33); +define ('TIDY_TAG_EMBED', 34); +define ('TIDY_TAG_FIELDSET', 35); +define ('TIDY_TAG_FONT', 36); +define ('TIDY_TAG_FORM', 37); +define ('TIDY_TAG_FRAME', 38); +define ('TIDY_TAG_FRAMESET', 39); +define ('TIDY_TAG_H1', 40); +define ('TIDY_TAG_H2', 41); +define ('TIDY_TAG_H3', 42); +define ('TIDY_TAG_H4', 43); +define ('TIDY_TAG_H5', 44); +define ('TIDY_TAG_H6', 45); +define ('TIDY_TAG_HEAD', 46); +define ('TIDY_TAG_HR', 47); +define ('TIDY_TAG_HTML', 48); +define ('TIDY_TAG_I', 49); +define ('TIDY_TAG_IFRAME', 50); +define ('TIDY_TAG_ILAYER', 51); +define ('TIDY_TAG_IMG', 52); +define ('TIDY_TAG_INPUT', 53); +define ('TIDY_TAG_INS', 54); +define ('TIDY_TAG_ISINDEX', 55); +define ('TIDY_TAG_KBD', 56); +define ('TIDY_TAG_KEYGEN', 57); +define ('TIDY_TAG_LABEL', 58); +define ('TIDY_TAG_LAYER', 59); +define ('TIDY_TAG_LEGEND', 60); +define ('TIDY_TAG_LI', 61); +define ('TIDY_TAG_LINK', 62); +define ('TIDY_TAG_LISTING', 63); +define ('TIDY_TAG_MAP', 64); +define ('TIDY_TAG_MARQUEE', 65); +define ('TIDY_TAG_MENU', 66); +define ('TIDY_TAG_META', 67); +define ('TIDY_TAG_MULTICOL', 68); +define ('TIDY_TAG_NOBR', 69); +define ('TIDY_TAG_NOEMBED', 70); +define ('TIDY_TAG_NOFRAMES', 71); +define ('TIDY_TAG_NOLAYER', 72); +define ('TIDY_TAG_NOSAVE', 73); +define ('TIDY_TAG_NOSCRIPT', 74); +define ('TIDY_TAG_OBJECT', 75); +define ('TIDY_TAG_OL', 76); +define ('TIDY_TAG_OPTGROUP', 77); +define ('TIDY_TAG_OPTION', 78); +define ('TIDY_TAG_P', 79); +define ('TIDY_TAG_PARAM', 80); +define ('TIDY_TAG_PLAINTEXT', 81); +define ('TIDY_TAG_PRE', 82); +define ('TIDY_TAG_Q', 83); +define ('TIDY_TAG_RB', 84); +define ('TIDY_TAG_RBC', 85); +define ('TIDY_TAG_RP', 86); +define ('TIDY_TAG_RT', 87); +define ('TIDY_TAG_RTC', 88); +define ('TIDY_TAG_RUBY', 89); +define ('TIDY_TAG_S', 90); +define ('TIDY_TAG_SAMP', 91); +define ('TIDY_TAG_SCRIPT', 92); +define ('TIDY_TAG_SELECT', 93); +define ('TIDY_TAG_SERVER', 94); +define ('TIDY_TAG_SERVLET', 95); +define ('TIDY_TAG_SMALL', 96); +define ('TIDY_TAG_SPACER', 97); +define ('TIDY_TAG_SPAN', 98); +define ('TIDY_TAG_STRIKE', 99); +define ('TIDY_TAG_STRONG', 100); +define ('TIDY_TAG_STYLE', 101); +define ('TIDY_TAG_SUB', 102); +define ('TIDY_TAG_SUP', 103); +define ('TIDY_TAG_TABLE', 104); +define ('TIDY_TAG_TBODY', 105); +define ('TIDY_TAG_TD', 106); +define ('TIDY_TAG_TEXTAREA', 107); +define ('TIDY_TAG_TFOOT', 108); +define ('TIDY_TAG_TH', 109); +define ('TIDY_TAG_THEAD', 110); +define ('TIDY_TAG_TITLE', 111); +define ('TIDY_TAG_TR', 112); +define ('TIDY_TAG_TT', 113); +define ('TIDY_TAG_U', 114); +define ('TIDY_TAG_UL', 115); +define ('TIDY_TAG_VAR', 116); +define ('TIDY_TAG_WBR', 117); +define ('TIDY_TAG_XMP', 118); + +/** + * root node + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_ROOT', 0); + +/** + * doctype + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_DOCTYPE', 1); + +/** + * HTML comment + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_COMMENT', 2); + +/** + * Processing Instruction + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_PROCINS', 3); + +/** + * Text + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_TEXT', 4); + +/** + * start tag + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_START', 5); + +/** + * end tag + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_END', 6); + +/** + * empty tag + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_STARTEND', 7); + +/** + * CDATA + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_CDATA', 8); + +/** + * XML section + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_SECTION', 9); + +/** + * ASP code + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_ASP', 10); + +/** + * JSTE code + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_JSTE', 11); + +/** + * PHP code + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_PHP', 12); + +/** + * XML declaration + * @link http://www.php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_XMLDECL', 13); + +// End of tidy v.2.0 +?> diff --git a/res/php-5.3-core-api/tokenizer.php b/res/php-5.3-core-api/tokenizer.php new file mode 100644 index 0000000..7192354 --- /dev/null +++ b/res/php-5.3-core-api/tokenizer.php @@ -0,0 +1,160 @@ + + * The PHP source to parse. + *

+ * @return array An array of token identifiers. Each individual token identifier is either + * a single character (i.e.: ;, ., + * >, !, etc...), + * or a three element array containing the token index in element 0, the string + * content of the original token in element 1 and the line number in element 2. + * + * @jms-builtin + */ +function token_get_all ($source) {} + +/** + * Get the symbolic name of a given PHP token + * @link http://www.php.net/manual/en/function.token-name.php + * @param token int

+ * The token value. + *

+ * @return string The symbolic name of the given token. The returned + * name returned matches the name of the matching token constant. + * + * @jms-builtin + */ +function token_name ($token) {} + +define ('T_REQUIRE_ONCE', 258); +define ('T_REQUIRE', 259); +define ('T_EVAL', 260); +define ('T_INCLUDE_ONCE', 261); +define ('T_INCLUDE', 262); +define ('T_LOGICAL_OR', 263); +define ('T_LOGICAL_XOR', 264); +define ('T_LOGICAL_AND', 265); +define ('T_PRINT', 266); +define ('T_SR_EQUAL', 267); +define ('T_SL_EQUAL', 268); +define ('T_XOR_EQUAL', 269); +define ('T_OR_EQUAL', 270); +define ('T_AND_EQUAL', 271); +define ('T_MOD_EQUAL', 272); +define ('T_CONCAT_EQUAL', 273); +define ('T_DIV_EQUAL', 274); +define ('T_MUL_EQUAL', 275); +define ('T_MINUS_EQUAL', 276); +define ('T_PLUS_EQUAL', 277); +define ('T_BOOLEAN_OR', 278); +define ('T_BOOLEAN_AND', 279); +define ('T_IS_NOT_IDENTICAL', 280); +define ('T_IS_IDENTICAL', 281); +define ('T_IS_NOT_EQUAL', 282); +define ('T_IS_EQUAL', 283); +define ('T_IS_GREATER_OR_EQUAL', 284); +define ('T_IS_SMALLER_OR_EQUAL', 285); +define ('T_SR', 286); +define ('T_SL', 287); +define ('T_INSTANCEOF', 288); +define ('T_UNSET_CAST', 289); +define ('T_BOOL_CAST', 290); +define ('T_OBJECT_CAST', 291); +define ('T_ARRAY_CAST', 292); +define ('T_STRING_CAST', 293); +define ('T_DOUBLE_CAST', 294); +define ('T_INT_CAST', 295); +define ('T_DEC', 296); +define ('T_INC', 297); +define ('T_CLONE', 298); +define ('T_NEW', 299); +define ('T_EXIT', 300); +define ('T_IF', 301); +define ('T_ELSEIF', 302); +define ('T_ELSE', 303); +define ('T_ENDIF', 304); +define ('T_LNUMBER', 305); +define ('T_DNUMBER', 306); +define ('T_STRING', 307); +define ('T_STRING_VARNAME', 308); +define ('T_VARIABLE', 309); +define ('T_NUM_STRING', 310); +define ('T_INLINE_HTML', 311); +define ('T_CHARACTER', 312); +define ('T_BAD_CHARACTER', 313); +define ('T_ENCAPSED_AND_WHITESPACE', 314); +define ('T_CONSTANT_ENCAPSED_STRING', 315); +define ('T_ECHO', 316); +define ('T_DO', 317); +define ('T_WHILE', 318); +define ('T_ENDWHILE', 319); +define ('T_FOR', 320); +define ('T_ENDFOR', 321); +define ('T_FOREACH', 322); +define ('T_ENDFOREACH', 323); +define ('T_DECLARE', 324); +define ('T_ENDDECLARE', 325); +define ('T_AS', 326); +define ('T_SWITCH', 327); +define ('T_ENDSWITCH', 328); +define ('T_CASE', 329); +define ('T_DEFAULT', 330); +define ('T_BREAK', 331); +define ('T_CONTINUE', 332); +define ('T_GOTO', 333); +define ('T_FUNCTION', 334); +define ('T_CONST', 335); +define ('T_RETURN', 336); +define ('T_TRY', 337); +define ('T_CATCH', 338); +define ('T_THROW', 339); +define ('T_USE', 340); +define ('T_GLOBAL', 341); +define ('T_PUBLIC', 342); +define ('T_PROTECTED', 343); +define ('T_PRIVATE', 344); +define ('T_FINAL', 345); +define ('T_ABSTRACT', 346); +define ('T_STATIC', 347); +define ('T_VAR', 348); +define ('T_UNSET', 349); +define ('T_ISSET', 350); +define ('T_EMPTY', 351); +define ('T_HALT_COMPILER', 352); +define ('T_CLASS', 353); +define ('T_INTERFACE', 354); +define ('T_EXTENDS', 355); +define ('T_IMPLEMENTS', 356); +define ('T_OBJECT_OPERATOR', 357); +define ('T_DOUBLE_ARROW', 358); +define ('T_LIST', 359); +define ('T_ARRAY', 360); +define ('T_CLASS_C', 361); +define ('T_METHOD_C', 362); +define ('T_FUNC_C', 363); +define ('T_LINE', 364); +define ('T_FILE', 365); +define ('T_COMMENT', 366); +define ('T_DOC_COMMENT', 367); +define ('T_OPEN_TAG', 368); +define ('T_OPEN_TAG_WITH_ECHO', 369); +define ('T_CLOSE_TAG', 370); +define ('T_WHITESPACE', 371); +define ('T_START_HEREDOC', 372); +define ('T_END_HEREDOC', 373); +define ('T_DOLLAR_OPEN_CURLY_BRACES', 374); +define ('T_CURLY_OPEN', 375); +define ('T_PAAMAYIM_NEKUDOTAYIM', 376); +define ('T_NAMESPACE', 377); +define ('T_NS_C', 378); +define ('T_DIR', 379); +define ('T_NS_SEPARATOR', 380); +define ('T_DOUBLE_COLON', 376); + +// End of tokenizer v.0.1 +?> diff --git a/res/php-5.3-core-api/wddx.php b/res/php-5.3-core-api/wddx.php new file mode 100644 index 0000000..01b8551 --- /dev/null +++ b/res/php-5.3-core-api/wddx.php @@ -0,0 +1,85 @@ + + * The value to be serialized + *

+ * @param comment string[optional]

+ * An optional comment string that appears in the packet header. + *

+ * @return string the WDDX packet, or false on error. + * + * @jms-builtin + */ +function wddx_serialize_value ($var, $comment = null) {} + +/** + * Serialize variables into a WDDX packet + * @link http://www.php.net/manual/en/function.wddx-serialize-vars.php + * @param var_name mixed

+ * Can be either a string naming a variable or an array containing + * strings naming the variables or another array, etc. + *

+ * @param _ mixed[optional] + * @return string the WDDX packet, or false on error. + * + * @jms-builtin + */ +function wddx_serialize_vars ($var_name, $_ = null) {} + +/** + * Starts a new WDDX packet with structure inside it + * @link http://www.php.net/manual/en/function.wddx-packet-start.php + * @param comment string[optional]

+ * An optional comment string. + *

+ * @return resource a packet ID for use in later functions, or false on error. + * + * @jms-builtin + */ +function wddx_packet_start ($comment = null) {} + +/** + * Ends a WDDX packet with the specified ID + * @link http://www.php.net/manual/en/function.wddx-packet-end.php + * @param packet_id resource

+ * A WDDX packet, returned by wddx_packet_start. + *

+ * @return string the string containing the WDDX packet. + * + * @jms-builtin + */ +function wddx_packet_end ($packet_id) {} + +/** + * Add variables to a WDDX packet with the specified ID + * @link http://www.php.net/manual/en/function.wddx-add-vars.php + * @param packet_id resource

+ * A WDDX packet, returned by wddx_packet_start. + *

+ * @param var_name mixed

+ * Can be either a string naming a variable or an array containing + * strings naming the variables or another array, etc. + *

+ * @param _ mixed[optional] + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function wddx_add_vars ($packet_id, $var_name, $_ = null) {} + +/** + * &Alias; wddx_unserialize + * @link http://www.php.net/manual/en/function.wddx-deserialize.php + * @param packet + * + * @jms-builtin + */ +function wddx_deserialize ($packet) {} + +// End of wddx v. +?> diff --git a/res/php-5.3-core-api/xml.php b/res/php-5.3-core-api/xml.php new file mode 100644 index 0000000..9a512f2 --- /dev/null +++ b/res/php-5.3-core-api/xml.php @@ -0,0 +1,600 @@ + + * The optional encoding specifies the character + * encoding for the input/output in PHP 4. Starting from PHP 5, the input + * encoding is automatically detected, so that the + * encoding parameter specifies only the output + * encoding. In PHP 4, the default output encoding is the same as the + * input charset. If empty string is passed, the parser attempts to identify + * which encoding the document is encoded in by looking at the heading 3 or + * 4 bytes. In PHP 5.0.0 and 5.0.1, the default output charset is + * ISO-8859-1, while in PHP 5.0.2 and upper is UTF-8. The supported + * encodings are ISO-8859-1, UTF-8 and + * US-ASCII. + *

+ * @return resource a resource handle for the new XML parser. + * + * @jms-builtin + */ +function xml_parser_create ($encoding = null) {} + +/** + * Create an XML parser with namespace support + * @link http://www.php.net/manual/en/function.xml-parser-create-ns.php + * @param encoding string[optional]

+ * The optional encoding specifies the character + * encoding for the input/output in PHP 4. Starting from PHP 5, the input + * encoding is automatically detected, so that the + * encoding parameter specifies only the output + * encoding. In PHP 4, the default output encoding is the same as the + * input charset. In PHP 5.0.0 and 5.0.1, the default output charset is + * ISO-8859-1, while in PHP 5.0.2 and upper is UTF-8. The supported + * encodings are ISO-8859-1, UTF-8 and + * US-ASCII. + *

+ * @param separator string[optional]

+ * With a namespace aware parser tag parameters passed to the various + * handler functions will consist of namespace and tag name separated by + * the string specified in seperator. + *

+ * @return resource a resource handle for the new XML parser. + * + * @jms-builtin + */ +function xml_parser_create_ns ($encoding = null, $separator = null) {} + +/** + * Use XML Parser within an object + * @link http://www.php.net/manual/en/function.xml-set-object.php + * @param parser resource

+ *

+ * @param object object

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_object ($parser, &$object) {} + +/** + * Set up start and end element handlers + * @link http://www.php.net/manual/en/function.xml-set-element-handler.php + * @param parser resource

+ *

+ * @param start_element_handler callback

+ * The function named by start_element_handler + * must accept three parameters: + * start_element_handler + * resourceparser + * stringname + * arrayattribs + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @param end_element_handler callback

+ * The function named by end_element_handler + * must accept two parameters: + * end_element_handler + * resourceparser + * stringname + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_element_handler ($parser, $start_element_handler, $end_element_handler) {} + +/** + * Set up character data handler + * @link http://www.php.net/manual/en/function.xml-set-character-data-handler.php + * @param parser resource

+ *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * two parameters: + * handler + * resourceparser + * stringdata + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_character_data_handler ($parser, $handler) {} + +/** + * Set up processing instruction (PI) handler + * @link http://www.php.net/manual/en/function.xml-set-processing-instruction-handler.php + * @param parser resource

+ *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * three parameters: + * handler + * resourceparser + * stringtarget + * stringdata + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_processing_instruction_handler ($parser, $handler) {} + +/** + * Set up default handler + * @link http://www.php.net/manual/en/function.xml-set-default-handler.php + * @param parser resource

+ *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * two parameters: + * handler + * resourceparser + * stringdata + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_default_handler ($parser, $handler) {} + +/** + * Set up unparsed entity declaration handler + * @link http://www.php.net/manual/en/function.xml-set-unparsed-entity-decl-handler.php + * @param parser resource

+ *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept six + * parameters: + * handler + * resourceparser + * stringentity_name + * stringbase + * stringsystem_id + * stringpublic_id + * stringnotation_name + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the + * handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_unparsed_entity_decl_handler ($parser, $handler) {} + +/** + * Set up notation declaration handler + * @link http://www.php.net/manual/en/function.xml-set-notation-decl-handler.php + * @param parser resource

+ *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * five parameters: + * handler + * resourceparser + * stringnotation_name + * stringbase + * stringsystem_id + * stringpublic_id + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_notation_decl_handler ($parser, $handler) {} + +/** + * Set up external entity reference handler + * @link http://www.php.net/manual/en/function.xml-set-external-entity-ref-handler.php + * @param parser resource + * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * five parameters, and should return an integer value.If the + * value returned from the handler is false (which it will be if no + * value is returned), the XML parser will stop parsing and + * xml_get_error_code will return + * XML_ERROR_EXTERNAL_ENTITY_HANDLING. + * handler + * resourceparser + * stringopen_entity_names + * stringbase + * stringsystem_id + * stringpublic_id + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_external_entity_ref_handler ($parser, $handler) {} + +/** + * Set up start namespace declaration handler + * @link http://www.php.net/manual/en/function.xml-set-start-namespace-decl-handler.php + * @param parser resource

+ * A reference to the XML parser. + *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * four parameters, and should return an integer value. If the + * value returned from the handler is false (which it will be if no + * value is returned), the XML parser will stop parsing and + * xml_get_error_code will return + * XML_ERROR_EXTERNAL_ENTITY_HANDLING. + * handler + * resourceparser + * stringuser_data + * stringprefix + * stringuri + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_start_namespace_decl_handler ($parser, $handler) {} + +/** + * Set up end namespace declaration handler + * @link http://www.php.net/manual/en/function.xml-set-end-namespace-decl-handler.php + * @param parser resource

+ * A reference to the XML parser. + *

+ * @param handler callback

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * three parameters, and should return an integer value. If the + * value returned from the handler is false (which it will be if no + * value is returned), the XML parser will stop parsing and + * xml_get_error_code will return + * XML_ERROR_EXTERNAL_ENTITY_HANDLING. + * handler + * resourceparser + * stringuser_data + * stringprefix + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xml_set_end_namespace_decl_handler ($parser, $handler) {} + +/** + * Start parsing an XML document + * @link http://www.php.net/manual/en/function.xml-parse.php + * @param parser resource

+ * A reference to the XML parser to use. + *

+ * @param data string

+ * Chunk of data to parse. A document may be parsed piece-wise by + * calling xml_parse several times with new data, + * as long as the is_final parameter is set and + * true when the last data is parsed. + *

+ * @param is_final bool[optional]

+ * If set and true, data is the last piece of + * data sent in this parse. + *

+ * @return int 1 on success or 0 on failure. + *

+ *

+ * For unsuccessful parses, error information can be retrieved with + * xml_get_error_code, + * xml_error_string, + * xml_get_current_line_number, + * xml_get_current_column_number and + * xml_get_current_byte_index. + *

+ *

+ * Entity errors are reported at the end of the data thus only if + * is_final is set and true. + * + * @jms-builtin + */ +function xml_parse ($parser, $data, $is_final = null) {} + +/** + * Parse XML data into an array structure + * @link http://www.php.net/manual/en/function.xml-parse-into-struct.php + * @param parser resource

+ *

+ * @param data string

+ *

+ * @param values array

+ *

+ * @param index array[optional]

+ *

+ * @return int xml_parse_into_struct returns 0 for failure and 1 for + * success. This is not the same as false and true, be careful with + * operators such as ===. + * + * @jms-builtin + */ +function xml_parse_into_struct ($parser, $data, array &$values, array &$index = null) {} + +/** + * Get XML parser error code + * @link http://www.php.net/manual/en/function.xml-get-error-code.php + * @param parser resource

+ * A reference to the XML parser to get error code from. + *

+ * @return int This function returns false if parser does + * not refer to a valid parser, or else it returns one of the error + * codes listed in the error codes + * section. + * + * @jms-builtin + */ +function xml_get_error_code ($parser) {} + +/** + * Get XML parser error string + * @link http://www.php.net/manual/en/function.xml-error-string.php + * @param code int

+ * An error code from xml_get_error_code. + *

+ * @return string a string with a textual description of the error + * code, or false if no description was found. + * + * @jms-builtin + */ +function xml_error_string ($code) {} + +/** + * Get current line number for an XML parser + * @link http://www.php.net/manual/en/function.xml-get-current-line-number.php + * @param parser resource

+ * A reference to the XML parser to get line number from. + *

+ * @return int This function returns false if parser does + * not refer to a valid parser, or else it returns which line the + * parser is currently at in its data buffer. + * + * @jms-builtin + */ +function xml_get_current_line_number ($parser) {} + +/** + * Get current column number for an XML parser + * @link http://www.php.net/manual/en/function.xml-get-current-column-number.php + * @param parser resource

+ * A reference to the XML parser to get column number from. + *

+ * @return int This function returns false if parser does + * not refer to a valid parser, or else it returns which column on + * the current line (as given by + * xml_get_current_line_number) the parser is + * currently at. + * + * @jms-builtin + */ +function xml_get_current_column_number ($parser) {} + +/** + * Get current byte index for an XML parser + * @link http://www.php.net/manual/en/function.xml-get-current-byte-index.php + * @param parser resource

+ * A reference to the XML parser to get byte index from. + *

+ * @return int This function returns false if parser does + * not refer to a valid parser, or else it returns which byte index + * the parser is currently at in its data buffer (starting at 0). + * + * @jms-builtin + */ +function xml_get_current_byte_index ($parser) {} + +/** + * Free an XML parser + * @link http://www.php.net/manual/en/function.xml-parser-free.php + * @param parser resource A reference to the XML parser to free. + * @return bool This function returns false if parser does not + * refer to a valid parser, or else it frees the parser and returns true. + * + * @jms-builtin + */ +function xml_parser_free ($parser) {} + +/** + * Set options in an XML parser + * @link http://www.php.net/manual/en/function.xml-parser-set-option.php + * @param parser resource

+ * A reference to the XML parser to set an option in. + *

+ * @param option int

+ * Which option to set. See below. + *

+ *

+ * The following options are available: + * + * XML parser options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Option constantData typeDescription
XML_OPTION_CASE_FOLDINGinteger + * Controls whether case-folding is enabled for this + * XML parser. Enabled by default. + *
XML_OPTION_SKIP_TAGSTARTinteger + * Specify how many characters should be skipped in the beginning of a + * tag name. + *
XML_OPTION_SKIP_WHITEinteger + * Whether to skip values consisting of whitespace characters. + *
XML_OPTION_TARGET_ENCODINGstring + * Sets which target encoding to + * use in this XML parser.By default, it is set to the same as the + * source encoding used by xml_parser_create. + * Supported target encodings are ISO-8859-1, + * US-ASCII and UTF-8. + *
+ *

+ * @param value mixed

+ * The option's new value. + *

+ * @return bool This function returns false if parser does not + * refer to a valid parser, or if the option could not be set. Else the + * option is set and true is returned. + * + * @jms-builtin + */ +function xml_parser_set_option ($parser, $option, $value) {} + +/** + * Get options from an XML parser + * @link http://www.php.net/manual/en/function.xml-parser-get-option.php + * @param parser resource A reference to the XML parser to get an option from. + * @param option int Which option to fetch. XML_OPTION_CASE_FOLDING + * and XML_OPTION_TARGET_ENCODING are available. + * See xml_parser_set_option for their description. + * @return mixed This function returns false if parser does + * not refer to a valid parser or if option isn't + * valid (generates also a E_WARNING). + * Else the option's value is returned. + * + * @jms-builtin + */ +function xml_parser_get_option ($parser, $option) {} + +/** + * Encodes an ISO-8859-1 string to UTF-8 + * @link http://www.php.net/manual/en/function.utf8-encode.php + * @param data string

+ * An ISO-8859-1 string. + *

+ * @return string the UTF-8 translation of data. + * + * @jms-builtin + */ +function utf8_encode ($data) {} + +/** + * Converts a string with ISO-8859-1 characters encoded with UTF-8 + to single-byte ISO-8859-1 + * @link http://www.php.net/manual/en/function.utf8-decode.php + * @param data string

+ * An UTF-8 encoded string. + *

+ * @return string the ISO-8859-1 translation of data. + * + * @jms-builtin + */ +function utf8_decode ($data) {} + +define ('XML_ERROR_NONE', 0); +define ('XML_ERROR_NO_MEMORY', 1); +define ('XML_ERROR_SYNTAX', 2); +define ('XML_ERROR_NO_ELEMENTS', 3); +define ('XML_ERROR_INVALID_TOKEN', 4); +define ('XML_ERROR_UNCLOSED_TOKEN', 5); +define ('XML_ERROR_PARTIAL_CHAR', 6); +define ('XML_ERROR_TAG_MISMATCH', 7); +define ('XML_ERROR_DUPLICATE_ATTRIBUTE', 8); +define ('XML_ERROR_JUNK_AFTER_DOC_ELEMENT', 9); +define ('XML_ERROR_PARAM_ENTITY_REF', 10); +define ('XML_ERROR_UNDEFINED_ENTITY', 11); +define ('XML_ERROR_RECURSIVE_ENTITY_REF', 12); +define ('XML_ERROR_ASYNC_ENTITY', 13); +define ('XML_ERROR_BAD_CHAR_REF', 14); +define ('XML_ERROR_BINARY_ENTITY_REF', 15); +define ('XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF', 16); +define ('XML_ERROR_MISPLACED_XML_PI', 17); +define ('XML_ERROR_UNKNOWN_ENCODING', 18); +define ('XML_ERROR_INCORRECT_ENCODING', 19); +define ('XML_ERROR_UNCLOSED_CDATA_SECTION', 20); +define ('XML_ERROR_EXTERNAL_ENTITY_HANDLING', 21); +define ('XML_OPTION_CASE_FOLDING', 1); +define ('XML_OPTION_TARGET_ENCODING', 2); +define ('XML_OPTION_SKIP_TAGSTART', 3); +define ('XML_OPTION_SKIP_WHITE', 4); + +/** + * Holds the SAX implementation method. + * Can be libxml or expat. + * @link http://www.php.net/manual/en/xml.constants.php + */ +define ('XML_SAX_IMPL', "libxml"); + +// End of xml v. +?> diff --git a/res/php-5.3-core-api/xmlreader.php b/res/php-5.3-core-api/xmlreader.php new file mode 100644 index 0000000..4852696 --- /dev/null +++ b/res/php-5.3-core-api/xmlreader.php @@ -0,0 +1,285 @@ + + * The name of the attribute. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given name is found or not positioned of element. + */ + public function getAttribute ($name) {} + + /** + * Get the value of an attribute by index + * @link http://www.php.net/manual/en/xmlreader.getattributeno.php + * @param index int

+ * The position of the attribute. + *

+ * @return string The value of the attribute, or an empty string if no attribute exists + * at index or not positioned of element. + */ + public function getAttributeNo ($index) {} + + /** + * Get the value of an attribute by localname and URI + * @link http://www.php.net/manual/en/xmlreader.getattributens.php + * @param localName string

+ * The local name. + *

+ * @param namespaceURI string

+ * The namespace URI. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given localName and + * namespaceURI is found or not positioned of element. + */ + public function getAttributeNs ($localName, $namespaceURI) {} + + /** + * Indicates if specified property has been set + * @link http://www.php.net/manual/en/xmlreader.getparserproperty.php + * @param property int

+ * One of the parser option + * constants. + *

+ * @return bool Returns true on success or false on failure. + */ + public function getParserProperty ($property) {} + + /** + * Indicates if the parsed document is valid + * @link http://www.php.net/manual/en/xmlreader.isvalid.php + * @return bool Returns true on success or false on failure. + */ + public function isValid () {} + + /** + * Lookup namespace for a prefix + * @link http://www.php.net/manual/en/xmlreader.lookupnamespace.php + * @param prefix string

+ * String containing the prefix. + *

+ * @return bool Returns true on success or false on failure. + */ + public function lookupNamespace ($prefix) {} + + /** + * Move cursor to an attribute by index + * @link http://www.php.net/manual/en/xmlreader.movetoattributeno.php + * @param index int

+ * The position of the attribute. + *

+ * @return bool Returns true on success or false on failure. + */ + public function moveToAttributeNo ($index) {} + + /** + * Move cursor to a named attribute + * @link http://www.php.net/manual/en/xmlreader.movetoattribute.php + * @param name string

+ * The name of the attribute. + *

+ * @return bool Returns true on success or false on failure. + */ + public function moveToAttribute ($name) {} + + /** + * Move cursor to a named attribute + * @link http://www.php.net/manual/en/xmlreader.movetoattributens.php + * @param localName string

+ * The local name. + *

+ * @param namespaceURI string

+ * The namespace URI. + *

+ * @return bool Returns true on success or false on failure. + */ + public function moveToAttributeNs ($localName, $namespaceURI) {} + + /** + * Position cursor on the parent Element of current Attribute + * @link http://www.php.net/manual/en/xmlreader.movetoelement.php + * @return bool true if successful and false if it fails or not positioned on + * Attribute when this method is called. + */ + public function moveToElement () {} + + /** + * Position cursor on the first Attribute + * @link http://www.php.net/manual/en/xmlreader.movetofirstattribute.php + * @return bool Returns true on success or false on failure. + */ + public function moveToFirstAttribute () {} + + /** + * Position cursor on the next Attribute + * @link http://www.php.net/manual/en/xmlreader.movetonextattribute.php + * @return bool Returns true on success or false on failure. + */ + public function moveToNextAttribute () {} + + /** + * Set the URI containing the XML to parse + * @link http://www.php.net/manual/en/xmlreader.open.php + * @param URI string

+ * URI pointing to the document. + *

+ * @param encoding string[optional]

+ * The document encoding or &null;. + *

+ * @param options int[optional]

+ * A bitmask of the LIBXML_* + * constants. + *

+ * @return bool Returns true on success or false on failure. + */ + public function open ($URI, $encoding = null, $options = null) {} + + /** + * Move to next node in document + * @link http://www.php.net/manual/en/xmlreader.read.php + * @return bool Returns true on success or false on failure. + */ + public function read () {} + + /** + * Move cursor to next node skipping all subtrees + * @link http://www.php.net/manual/en/xmlreader.next.php + * @param localname string[optional]

+ * The name of the next node to move to. + *

+ * @return bool Returns true on success or false on failure. + */ + public function next ($localname = null) {} + + /** + * Retrieve XML from current node + * @link http://www.php.net/manual/en/xmlreader.readinnerxml.php + * @return string the contents of the current node as a string. Empty string on failure. + */ + public function readInnerXml () {} + + /** + * Retrieve XML from current node, including it self + * @link http://www.php.net/manual/en/xmlreader.readouterxml.php + * @return string the contents of current node, including itself, as a string. Empty string on failure. + */ + public function readOuterXml () {} + + /** + * Reads the contents of the current node as an string + * @link http://www.php.net/manual/en/xmlreader.readstring.php + * @return string the content of the current node as a string. Empty string on + * failure. + */ + public function readString () {} + + /** + * Validate document against XSD + * @link http://www.php.net/manual/en/xmlreader.setschema.php + * @param filename string

+ * The filename of the XSD schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setSchema ($filename) {} + + /** + * Set or Unset parser options + * @link http://www.php.net/manual/en/xmlreader.setparserproperty.php + * @param property int

+ * One of the parser option + * constants. + *

+ * @param value bool

+ * If set to true the option will be enabled otherwise will + * be disabled. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setParserProperty ($property, $value) {} + + /** + * Set the filename or URI for a RelaxNG Schema + * @link http://www.php.net/manual/en/xmlreader.setrelaxngschema.php + * @param filename string

+ * filename or URI pointing to a RelaxNG Schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setRelaxNGSchema ($filename) {} + + /** + * Set the data containing a RelaxNG Schema + * @link http://www.php.net/manual/en/xmlreader.setrelaxngschemasource.php + * @param source string

+ * String containing the RelaxNG Schema. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setRelaxNGSchemaSource ($source) {} + + /** + * Set the data containing the XML to parse + * @link http://www.php.net/manual/en/xmlreader.xml.php + * @param source string

+ * String containing the XML to be parsed. + *

+ * @param encoding string[optional]

+ * The document encoding or &null;. + *

+ * @param options int[optional]

+ * A bitmask of the LIBXML_* + * constants. + *

+ * @return bool Returns true on success or false on failure. + */ + public function XML ($source, $encoding = null, $options = null) {} + + /** + * Returns a copy of the current node as a DOM object + * @link http://www.php.net/manual/en/xmlreader.expand.php + * @return DOMNode The resulting DOMNode or false on error. + */ + public function expand () {} + +} +// End of xmlreader v.0.1 +?> diff --git a/res/php-5.3-core-api/xmlwriter.php b/res/php-5.3-core-api/xmlwriter.php new file mode 100644 index 0000000..1c15bd3 --- /dev/null +++ b/res/php-5.3-core-api/xmlwriter.php @@ -0,0 +1,1038 @@ + + * The URI of the resource for the output. + *

+ * @return bool &style.oop;: Returns true on success or false on failure. + *

+ *

+ * &style.procedural;: Returns a new xmlwriter &resource; for later use with the + * xmlwriter functions on success, false on error. + */ + public function openUri ($uri) {} + + /** + * Create new xmlwriter using memory for string output + * @link http://www.php.net/manual/en/function.xmlwriter-open-memory.php + * @return bool &style.oop;: Returns true on success or false on failure. + *

+ *

+ * &style.procedural;: Returns a new xmlwriter &resource; for later use with the + * xmlwriter functions on success, false on error. + */ + public function openMemory () {} + + /** + * Toggle indentation on/off + * @link http://www.php.net/manual/en/function.xmlwriter-set-indent.php + * @param indent bool

+ * Whether indentation is enabled. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setIndent ($indent) {} + + /** + * Set string used for indenting + * @link http://www.php.net/manual/en/function.xmlwriter-set-indent-string.php + * @param indentString string

+ * The indentation string. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setIndentString ($indentString) {} + + /** + * Create start comment + * @link http://www.php.net/manual/en/function.xmlwriter-start-comment.php + * @return bool Returns true on success or false on failure. + */ + public function startComment () {} + + /** + * Create end comment + * @link http://www.php.net/manual/en/function.xmlwriter-end-comment.php + * @return bool Returns true on success or false on failure. + */ + public function endComment () {} + + /** + * Create start attribute + * @link http://www.php.net/manual/en/function.xmlwriter-start-attribute.php + * @param name string

+ * The attribute name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startAttribute ($name) {} + + /** + * End attribute + * @link http://www.php.net/manual/en/function.xmlwriter-end-attribute.php + * @return bool Returns true on success or false on failure. + */ + public function endAttribute () {} + + /** + * Write full attribute + * @link http://www.php.net/manual/en/function.xmlwriter-write-attribute.php + * @param name string

+ * The name of the attribute. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeAttribute ($name, $value) {} + + /** + * Create start namespaced attribute + * @link http://www.php.net/manual/en/function.xmlwriter-start-attribute-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The attribute name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startAttributeNs ($prefix, $name, $uri) {} + + /** + * Write full namespaced attribute + * @link http://www.php.net/manual/en/function.xmlwriter-write-attribute-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The attribute name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @param content string

+ * The attribute value. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeAttributeNs ($prefix, $name, $uri, $content) {} + + /** + * Create start element tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-element.php + * @param name string

+ * The element name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startElement ($name) {} + + /** + * End current element + * @link http://www.php.net/manual/en/function.xmlwriter-end-element.php + * @return bool Returns true on success or false on failure. + */ + public function endElement () {} + + /** + * End current element + * @link http://www.php.net/manual/en/function.xmlwriter-full-end-element.php + * @return bool Returns true on success or false on failure. + */ + public function fullEndElement () {} + + /** + * Create start namespaced element tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-element-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The element name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startElementNs ($prefix, $name, $uri) {} + + /** + * Write full element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-element.php + * @param name string

+ * The element name. + *

+ * @param content string[optional]

+ * The element contents. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeElement ($name, $content = null) {} + + /** + * Write full namespaced element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-element-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The element name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @param content string[optional]

+ * The element contents. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeElementNs ($prefix, $name, $uri, $content = null) {} + + /** + * Create start PI tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-pi.php + * @param target string

+ * The target of the processing instruction. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startPi ($target) {} + + /** + * End current PI + * @link http://www.php.net/manual/en/function.xmlwriter-end-pi.php + * @return bool Returns true on success or false on failure. + */ + public function endPi () {} + + /** + * Writes a PI + * @link http://www.php.net/manual/en/function.xmlwriter-write-pi.php + * @param target string

+ * The target of the processing instruction. + *

+ * @param content string

+ * The content of the processing instruction. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writePi ($target, $content) {} + + /** + * Create start CDATA tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-cdata.php + * @return bool Returns true on success or false on failure. + */ + public function startCdata () {} + + /** + * End current CDATA + * @link http://www.php.net/manual/en/function.xmlwriter-end-cdata.php + * @return bool Returns true on success or false on failure. + */ + public function endCdata () {} + + /** + * Write full CDATA tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-cdata.php + * @param content string

+ * The contents of the CDATA. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeCdata ($content) {} + + /** + * Write text + * @link http://www.php.net/manual/en/function.xmlwriter-text.php + * @param content string

+ * The contents of the text. + *

+ * @return bool Returns true on success or false on failure. + */ + public function text ($content) {} + + /** + * Write a raw XML text + * @link http://www.php.net/manual/en/function.xmlwriter-write-raw.php + * @param content string

+ * The text string to write. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeRaw ($content) {} + + /** + * Create document tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-document.php + * @param version string[optional]

+ * The version number of the document as part of the XML declaration. + * Defaults to 1.0. + *

+ * @param encoding string[optional]

+ * The encoding of the document as part of the XML declaration. + * &null; by default. + *

+ * @param standalone string[optional]

+ * yes or no. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startDocument ($version = null, $encoding = null, $standalone = null) {} + + /** + * End current document + * @link http://www.php.net/manual/en/function.xmlwriter-end-document.php + * @return bool Returns true on success or false on failure. + */ + public function endDocument () {} + + /** + * Write full comment tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-comment.php + * @param content string

+ * The contents of the comment. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeComment ($content) {} + + /** + * Create start DTD tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd.php + * @param qualifiedName string

+ * The qualified name of the document type to create. + *

+ * @param publicId string[optional]

+ * The external subset public identifier. + *

+ * @param systemId string[optional]

+ * The external subset system identifier. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startDtd ($qualifiedName, $publicId = null, $systemId = null) {} + + /** + * End current DTD + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd.php + * @return bool Returns true on success or false on failure. + */ + public function endDtd () {} + + /** + * Write full DTD tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd.php + * @param name string

+ * The DTD name. + *

+ * @param publicId string[optional]

+ * The external subset public identifier. + *

+ * @param systemId string[optional]

+ * The external subset system identifier. + *

+ * @param subset string[optional]

+ * The content of the DTD. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeDtd ($name, $publicId = null, $systemId = null, $subset = null) {} + + /** + * Create start DTD element + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-element.php + * @param qualifiedName string

+ * The qualified name of the document type to create. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startDtdElement ($qualifiedName) {} + + /** + * End current DTD element + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-element.php + * @return bool Returns true on success or false on failure. + */ + public function endDtdElement () {} + + /** + * Write full DTD element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-element.php + * @param name string

+ * The name of the DTD element. + *

+ * @param content string

+ * The content of the element. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeDtdElement ($name, $content) {} + + /** + * Create start DTD AttList + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-attlist.php + * @param name string

+ * The attribute list name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function startDtdAttlist ($name) {} + + /** + * End current DTD AttList + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-attlist.php + * @return bool Returns true on success or false on failure. + */ + public function endDtdAttlist () {} + + /** + * Write full DTD AttList tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-attlist.php + * @param name string

+ * The name of the DTD attribute list. + *

+ * @param content string

+ * The content of the DTD attribute list. + *

+ * @return bool Returns true on success or false on failure. + */ + public function writeDtdAttlist ($name, $content) {} + + /** + * Create start DTD Entity + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-entity.php + * @param name string

+ * The name of the entity. + *

+ * @param isparam bool

+ *

+ * @return bool Returns true on success or false on failure. + */ + public function startDtdEntity ($name, $isparam) {} + + /** + * End current DTD Entity + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-entity.php + * @return bool Returns true on success or false on failure. + */ + public function endDtdEntity () {} + + /** + * Write full DTD Entity tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-entity.php + * @param name string

+ * The name of the entity. + *

+ * @param content string

+ * The content of the entity. + *

+ * @param pe bool + * @param pubid string + * @param sysid string + * @param ndataid string + * @return bool Returns true on success or false on failure. + */ + public function writeDtdEntity ($name, $content, $pe, $pubid, $sysid, $ndataid) {} + + /** + * Returns current buffer + * @link http://www.php.net/manual/en/function.xmlwriter-output-memory.php + * @param flush bool[optional]

+ * Whether to flush the output buffer or no. Default is true. + *

+ * @return string the current buffer as a string. + */ + public function outputMemory ($flush = null) {} + + /** + * Flush current buffer + * @link http://www.php.net/manual/en/function.xmlwriter-flush.php + * @param empty bool[optional]

+ * Whether to empty the buffer or no. Default is true. + *

+ * @return mixed If you opened the writer in memory, this function returns the generated XML buffer, + * Else, if using URI, this function will write the buffer and return the number of + * written bytes. + */ + public function flush ($empty = null) {} + +} + +/** + * Create new xmlwriter using source uri for output + * @link http://www.php.net/manual/en/function.xmlwriter-open-uri.php + * @param uri string

+ * The URI of the resource for the output. + *

+ * @return bool &style.oop;: Returns true on success or false on failure. + *

+ *

+ * &style.procedural;: Returns a new xmlwriter &resource; for later use with the + * xmlwriter functions on success, false on error. + * + * @jms-builtin + */ +function xmlwriter_open_uri ($uri) {} + +/** + * Create new xmlwriter using memory for string output + * @link http://www.php.net/manual/en/function.xmlwriter-open-memory.php + * @return bool &style.oop;: Returns true on success or false on failure. + *

+ *

+ * &style.procedural;: Returns a new xmlwriter &resource; for later use with the + * xmlwriter functions on success, false on error. + * + * @jms-builtin + */ +function xmlwriter_open_memory () {} + +/** + * Toggle indentation on/off + * @link http://www.php.net/manual/en/function.xmlwriter-set-indent.php + * @param indent bool

+ * Whether indentation is enabled. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_set_indent ($indent) {} + +/** + * Set string used for indenting + * @link http://www.php.net/manual/en/function.xmlwriter-set-indent-string.php + * @param indentString string

+ * The indentation string. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_set_indent_string ($indentString) {} + +/** + * Create start comment + * @link http://www.php.net/manual/en/function.xmlwriter-start-comment.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_comment ($xmlwriter) {} + +/** + * Create end comment + * @link http://www.php.net/manual/en/function.xmlwriter-end-comment.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_comment ($xmlwriter) {} + +/** + * Create start attribute + * @link http://www.php.net/manual/en/function.xmlwriter-start-attribute.php + * @param name string

+ * The attribute name. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_attribute ($name) {} + +/** + * End attribute + * @link http://www.php.net/manual/en/function.xmlwriter-end-attribute.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_attribute ($xmlwriter) {} + +/** + * Write full attribute + * @link http://www.php.net/manual/en/function.xmlwriter-write-attribute.php + * @param name string

+ * The name of the attribute. + *

+ * @param value string

+ * The value of the attribute. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_attribute ($name, $value) {} + +/** + * Create start namespaced attribute + * @link http://www.php.net/manual/en/function.xmlwriter-start-attribute-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The attribute name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_attribute_ns ($prefix, $name, $uri) {} + +/** + * Write full namespaced attribute + * @link http://www.php.net/manual/en/function.xmlwriter-write-attribute-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The attribute name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @param content string

+ * The attribute value. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_attribute_ns ($prefix, $name, $uri, $content) {} + +/** + * Create start element tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-element.php + * @param name string

+ * The element name. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_element ($name) {} + +/** + * End current element + * @link http://www.php.net/manual/en/function.xmlwriter-end-element.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_element ($xmlwriter) {} + +/** + * End current element + * @link http://www.php.net/manual/en/function.xmlwriter-full-end-element.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_full_end_element ($xmlwriter) {} + +/** + * Create start namespaced element tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-element-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The element name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_element_ns ($prefix, $name, $uri) {} + +/** + * Write full element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-element.php + * @param name string

+ * The element name. + *

+ * @param content string[optional]

+ * The element contents. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_element ($name, $content = null) {} + +/** + * Write full namespaced element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-element-ns.php + * @param prefix string

+ * The namespace prefix. + *

+ * @param name string

+ * The element name. + *

+ * @param uri string

+ * The namespace URI. + *

+ * @param content string[optional]

+ * The element contents. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_element_ns ($prefix, $name, $uri, $content = null) {} + +/** + * Create start PI tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-pi.php + * @param target string

+ * The target of the processing instruction. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_pi ($target) {} + +/** + * End current PI + * @link http://www.php.net/manual/en/function.xmlwriter-end-pi.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_pi ($xmlwriter) {} + +/** + * Writes a PI + * @link http://www.php.net/manual/en/function.xmlwriter-write-pi.php + * @param target string

+ * The target of the processing instruction. + *

+ * @param content string

+ * The content of the processing instruction. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_pi ($target, $content) {} + +/** + * Create start CDATA tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-cdata.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_cdata ($xmlwriter) {} + +/** + * End current CDATA + * @link http://www.php.net/manual/en/function.xmlwriter-end-cdata.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_cdata ($xmlwriter) {} + +/** + * Write full CDATA tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-cdata.php + * @param content string

+ * The contents of the CDATA. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_cdata ($content) {} + +/** + * Write text + * @link http://www.php.net/manual/en/function.xmlwriter-text.php + * @param content string

+ * The contents of the text. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_text ($content) {} + +/** + * Write a raw XML text + * @link http://www.php.net/manual/en/function.xmlwriter-write-raw.php + * @param content string

+ * The text string to write. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_raw ($content) {} + +/** + * Create document tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-document.php + * @param version string[optional]

+ * The version number of the document as part of the XML declaration. + * Defaults to 1.0. + *

+ * @param encoding string[optional]

+ * The encoding of the document as part of the XML declaration. + * &null; by default. + *

+ * @param standalone string[optional]

+ * yes or no. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_document ($version = null, $encoding = null, $standalone = null) {} + +/** + * End current document + * @link http://www.php.net/manual/en/function.xmlwriter-end-document.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_document ($xmlwriter) {} + +/** + * Write full comment tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-comment.php + * @param content string

+ * The contents of the comment. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_comment ($content) {} + +/** + * Create start DTD tag + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd.php + * @param qualifiedName string

+ * The qualified name of the document type to create. + *

+ * @param publicId string[optional]

+ * The external subset public identifier. + *

+ * @param systemId string[optional]

+ * The external subset system identifier. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_dtd ($qualifiedName, $publicId = null, $systemId = null) {} + +/** + * End current DTD + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_dtd ($xmlwriter) {} + +/** + * Write full DTD tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd.php + * @param name string

+ * The DTD name. + *

+ * @param publicId string[optional]

+ * The external subset public identifier. + *

+ * @param systemId string[optional]

+ * The external subset system identifier. + *

+ * @param subset string[optional]

+ * The content of the DTD. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_dtd ($name, $publicId = null, $systemId = null, $subset = null) {} + +/** + * Create start DTD element + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-element.php + * @param qualifiedName string

+ * The qualified name of the document type to create. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_dtd_element ($qualifiedName) {} + +/** + * End current DTD element + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-element.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_dtd_element ($xmlwriter) {} + +/** + * Write full DTD element tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-element.php + * @param name string

+ * The name of the DTD element. + *

+ * @param content string

+ * The content of the element. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_dtd_element ($name, $content) {} + +/** + * Create start DTD AttList + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-attlist.php + * @param name string

+ * The attribute list name. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_dtd_attlist ($name) {} + +/** + * End current DTD AttList + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-attlist.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_dtd_attlist ($xmlwriter) {} + +/** + * Write full DTD AttList tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-attlist.php + * @param name string

+ * The name of the DTD attribute list. + *

+ * @param content string

+ * The content of the DTD attribute list. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_dtd_attlist ($name, $content) {} + +/** + * Create start DTD Entity + * @link http://www.php.net/manual/en/function.xmlwriter-start-dtd-entity.php + * @param name string

+ * The name of the entity. + *

+ * @param isparam bool

+ *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_start_dtd_entity ($name, $isparam) {} + +/** + * End current DTD Entity + * @link http://www.php.net/manual/en/function.xmlwriter-end-dtd-entity.php + * @param xmlwriter + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_end_dtd_entity ($xmlwriter) {} + +/** + * Write full DTD Entity tag + * @link http://www.php.net/manual/en/function.xmlwriter-write-dtd-entity.php + * @param name string

+ * The name of the entity. + *

+ * @param content string

+ * The content of the entity. + *

+ * @param pe bool + * @param pubid string + * @param sysid string + * @param ndataid string + * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function xmlwriter_write_dtd_entity ($name, $content, $pe, $pubid, $sysid, $ndataid) {} + +/** + * Returns current buffer + * @link http://www.php.net/manual/en/function.xmlwriter-output-memory.php + * @param flush bool[optional]

+ * Whether to flush the output buffer or no. Default is true. + *

+ * @return string the current buffer as a string. + * + * @jms-builtin + */ +function xmlwriter_output_memory ($flush = null) {} + +/** + * Flush current buffer + * @link http://www.php.net/manual/en/function.xmlwriter-flush.php + * @param empty bool[optional]

+ * Whether to empty the buffer or no. Default is true. + *

+ * @return mixed If you opened the writer in memory, this function returns the generated XML buffer, + * Else, if using URI, this function will write the buffer and return the number of + * written bytes. + * + * @jms-builtin + */ +function xmlwriter_flush ($empty = null) {} + +// End of xmlwriter v.0.1 +?> diff --git a/res/php-5.3-core-api/xsl.php b/res/php-5.3-core-api/xsl.php new file mode 100644 index 0000000..4a3c9c2 --- /dev/null +++ b/res/php-5.3-core-api/xsl.php @@ -0,0 +1,153 @@ + + * The imported style sheet as a DOMDocument or + * SimpleXMLElement object. + *

+ * @return void + */ + public function importStylesheet ($stylesheet) {} + + /** + * Transform to a DOMDocument + * @link http://www.php.net/manual/en/xsltprocessor.transformtodoc.php + * @param doc DOMNode

+ * The node to be transformed. + *

+ * @return DOMDocument The resulting DOMDocument or false on error. + */ + public function transformToDoc (DOMNode $doc) {} + + /** + * Transform to URI + * @link http://www.php.net/manual/en/xsltprocessor.transformtouri.php + * @param doc DOMDocument

+ * The transformed document. + *

+ * @param uri string

+ *

+ * @return int the number of bytes written or false if an error occurred. + */ + public function transformToUri (DOMDocument $doc, $uri) {} + + /** + * Transform to XML + * @link http://www.php.net/manual/en/xsltprocessor.transformtoxml.php + * @param doc DOMDocument

+ * The transformed document. + *

+ * @return string The result of the transformation as a string or false on error. + */ + public function transformToXml (DOMDocument $doc) {} + + /** + * Set value for a parameter + * @link http://www.php.net/manual/en/xsltprocessor.setparameter.php + * @param namespace string

+ * The namespace URI of the XSLT parameter. + *

+ * @param options array

+ * An array of name => value pairs. This syntax is + * available since PHP 5.1.0. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setParameter ($namespace, array $options) {} + + /** + * Get value of a parameter + * @link http://www.php.net/manual/en/xsltprocessor.getparameter.php + * @param namespaceURI string

+ * The namespace URI of the XSLT parameter. + *

+ * @param localName string

+ * The local name of the XSLT parameter. + *

+ * @return string The value of the parameter or &null; if it's not set. + */ + public function getParameter ($namespaceURI, $localName) {} + + /** + * Remove parameter + * @link http://www.php.net/manual/en/xsltprocessor.removeparameter.php + * @param namespaceURI string

+ * The namespace URI of the XSLT parameter. + *

+ * @param localName string

+ * The local name of the XSLT parameter. + *

+ * @return bool Returns true on success or false on failure. + */ + public function removeParameter ($namespaceURI, $localName) {} + + /** + * Determine if PHP has EXSLT support + * @link http://www.php.net/manual/en/xsltprocessor.hasexsltsupport.php + * @return bool Returns true on success or false on failure. + */ + public function hasExsltSupport () {} + + /** + * Enables the ability to use PHP functions as XSLT functions + * @link http://www.php.net/manual/en/xsltprocessor.registerphpfunctions.php + * @param restrict mixed[optional]

+ * Use this parameter to only allow certain functions to be called from + * XSLT. + *

+ *

+ * This parameter can be either a string (a function name) or an array of + * functions. + *

+ * @return void + */ + public function registerPHPFunctions ($restrict = null) {} + + /** + * Sets profiling output file + * @link http://www.php.net/manual/en/xsltprocessor.setprofiling.php + * @param filename string

+ * Path to the file to dump profiling information. + *

+ * @return bool Returns true on success or false on failure. + */ + public function setProfiling ($filename) {} + +} +define ('XSL_CLONE_AUTO', 0); +define ('XSL_CLONE_NEVER', -1); +define ('XSL_CLONE_ALWAYS', 1); + +/** + * libxslt version like 10117. Available as of PHP 5.1.2. + * @link http://www.php.net/manual/en/xsl.constants.php + */ +define ('LIBXSLT_VERSION', 10123); + +/** + * libxslt version like 1.1.17. Available as of PHP 5.1.2. + * @link http://www.php.net/manual/en/xsl.constants.php + */ +define ('LIBXSLT_DOTTED_VERSION', "1.1.23"); + +/** + * libexslt version like 813. Available as of PHP 5.1.2. + * @link http://www.php.net/manual/en/xsl.constants.php + */ +define ('LIBEXSLT_VERSION', 813); + +/** + * libexslt version like 1.1.17. Available as of PHP 5.1.2. + * @link http://www.php.net/manual/en/xsl.constants.php + */ +define ('LIBEXSLT_DOTTED_VERSION', "1.1.23"); + +// End of xsl v.0.1 +?> diff --git a/res/php-5.3-core-api/zip.php b/res/php-5.3-core-api/zip.php new file mode 100644 index 0000000..6b3f0e7 --- /dev/null +++ b/res/php-5.3-core-api/zip.php @@ -0,0 +1,572 @@ + + * The file name of the ZIP archive to open. + *

+ * @param flags int[optional]

+ * The mode to use to open the archive. + *

+ * ZIPARCHIVE::OVERWRITE + *

+ * @return mixed Error codes + *

+ * Returns true on success or the error code. + *

+ * ZIPARCHIVE::ER_EXISTS + *

+ *

+ * ZIPARCHIVE::ER_INCONS + *

+ *

+ * ZIPARCHIVE::ER_INVAL + *

+ *

+ * ZIPARCHIVE::ER_MEMORY + *

+ *

+ * ZIPARCHIVE::ER_NOENT + *

+ *

+ * ZIPARCHIVE::ER_NOZIP + *

+ *

+ * ZIPARCHIVE::ER_OPEN + *

+ *

+ * ZIPARCHIVE::ER_READ + *

+ *

+ * ZIPARCHIVE::ER_SEEK + *

+ *

+ */ + public function open ($filename, $flags = null) {} + + /** + * Close the active archive (opened or newly created) + * @link http://www.php.net/manual/en/function.ziparchive-close.php + * @return bool Returns true on success or false on failure. + */ + public function close () {} + + /** + * Returns the status error message, system and/or zip messages + * @link http://www.php.net/manual/en/function.ziparchive-getstatusstring.php + * @return string a string with the status message on success&return.falseforfailure;. + */ + public function getStatusString () {} + + /** + * Add a new directory + * @link http://www.php.net/manual/en/function.ziparchive-addemptydir.php + * @param dirname string

+ * The directory to add. + *

+ * @return bool Returns true on success or false on failure. + */ + public function addEmptyDir ($dirname) {} + + /** + * Add a file to a ZIP archive using its contents + * @link http://www.php.net/manual/en/function.ziparchive-addfromstring.php + * @param localname string

+ * The name of the entry to create. + *

+ * @param contents string

+ * The contents to use to create the entry. It is used in a binary + * safe mode. + *

+ * @return bool Returns true on success or false on failure. + */ + public function addFromString ($localname, $contents) {} + + /** + * Adds a file to a ZIP archive from the given path + * @link http://www.php.net/manual/en/function.ziparchive-addfile.php + * @param filename string

+ * The path to the file to add. + *

+ * @param localname string[optional]

+ * local name inside ZIP archive. + *

+ * @return bool Returns true on success or false on failure. + */ + public function addFile ($filename, $localname = null) {} + + public function addGlob () {} + + public function addPattern () {} + + /** + * Renames an entry defined by its index + * @link http://www.php.net/manual/en/function.ziparchive-renameindex.php + * @param index int

+ * Index of the entry to rename. + *

+ * @param newname string

+ * New name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function renameIndex ($index, $newname) {} + + /** + * Renames an entry defined by its name + * @link http://www.php.net/manual/en/function.ziparchive-renamename.php + * @param name string

+ * Name of the entry to rename. + *

+ * @param newname string

+ * New name. + *

+ * @return bool Returns true on success or false on failure. + */ + public function renameName ($name, $newname) {} + + /** + * Set the comment of a ZIP archive + * @link http://www.php.net/manual/en/function.ziparchive-setarchivecomment.php + * @param comment string

+ * The contents of the comment. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function setArchiveComment ($comment) {} + + /** + * Returns the Zip archive comment + * @link http://www.php.net/manual/en/function.ziparchive-getarchivecomment.php + * @return string the Zip archive comment&return.falseforfailure;. + */ + public function getArchiveComment () {} + + /** + * Set the comment of an entry defined by its index + * @link http://www.php.net/manual/en/function.ziparchive-setcommentindex.php + * @param index int

+ * Index of the entry. + *

+ * @param comment string

+ * The contents of the comment. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function setCommentIndex ($index, $comment) {} + + /** + * Set the comment of an entry defined by its name + * @link http://www.php.net/manual/en/function.ziparchive-setCommentName.php + * @param name string

+ * Name of the entry. + *

+ * @param comment string

+ * The contents of the comment. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function setCommentName ($name, $comment) {} + + /** + * Returns the comment of an entry using the entry index + * @link http://www.php.net/manual/en/function.ziparchive-getcommentindex.php + * @param index int

+ * Index of the entry + *

+ * @param flags int[optional]

+ * If flags is set to ZIPARCHIVE::FL_UNCHANGED, the original unchanged + * comment is returned. + *

+ * @return string the comment on success&return.falseforfailure;. + */ + public function getCommentIndex ($index, $flags = null) {} + + /** + * Returns the comment of an entry using the entry name + * @link http://www.php.net/manual/en/function.ziparchive-getcommentname.php + * @param name string

+ * Name of the entry + *

+ * @param flags int[optional]

+ * If flags is set to ZIPARCHIVE::FL_UNCHANGED, the original unchanged + * comment is returned. + *

+ * @return string the comment on success&return.falseforfailure;. + */ + public function getCommentName ($name, $flags = null) {} + + /** + * delete an entry in the archive using its index + * @link http://www.php.net/manual/en/function.ziparchive-deleteindex.php + * @param index int

+ * Index of the entry to delete. + *

+ * @return bool Returns true on success or false on failure. + */ + public function deleteIndex ($index) {} + + /** + * delete an entry in the archive using its name + * @link http://www.php.net/manual/en/function.ziparchive-deletename.php + * @param name string

+ * Name of the entry to delete. + *

+ * @return bool Returns true on success or false on failure. + */ + public function deleteName ($name) {} + + /** + * Get the details of an entry defined by its name. + * @link http://www.php.net/manual/en/function.ziparchive-statname.php + * @param name name

+ * Name of the entry + *

+ * @param flags int[optional]

+ * The flags argument specifies how the name lookup should be done. + * Also, ZIPARCHIVE::FL_UNCHANGED may be ORed to it to request + * information about the original file in the archive, + * ignoring any changes made. + *

+ * ZIPARCHIVE::FL_NOCASE + *

+ * @return mixed an array containing the entry details &return.falseforfailure;. + */ + public function statName ($name, $flags = null) {} + + /** + * Get the details of an entry defined by its index. + * @link http://www.php.net/manual/en/function.ziparchive-statindex.php + * @param index int

+ * Index of the entry + *

+ * @param flags int[optional]

+ * ZIPARCHIVE::FL_UNCHANGED may be ORed to it to request + * information about the original file in the archive, + * ignoring any changes made. + *

+ * @return mixed an array containing the entry details&return.falseforfailure;. + */ + public function statIndex ($index, $flags = null) {} + + /** + * Returns the index of the entry in the archive + * @link http://www.php.net/manual/en/function.ziparchive-locatename.php + * @param name string

+ * The name of the entry to look up + *

+ * @param flags int[optional]

+ * The flags are specified by ORing the following values, + * or 0 for none of them. + *

+ * ZIPARCHIVE::FL_NOCASE + *

+ * @return mixed the index of the entry on success&return.falseforfailure;. + */ + public function locateName ($name, $flags = null) {} + + /** + * Returns the name of an entry using its index + * @link http://www.php.net/manual/en/function.ziparchive-getnameindex.php + * @param index int

+ * Index of the entry. + *

+ * @return string the name on success&return.falseforfailure;. + */ + public function getNameIndex ($index) {} + + /** + * Revert all global changes done in the archive. + * @link http://www.php.net/manual/en/function.ziparchive-unchangearchive.php + * @return mixed Returns true on success or false on failure. + */ + public function unchangeArchive () {} + + /** + * Undo all changes done in the archive + * @link http://www.php.net/manual/en/function.ziparchive-unchangeall.php + * @return mixed Returns true on success or false on failure. + */ + public function unchangeAll () {} + + /** + * Revert all changes done to an entry at the given index + * @link http://www.php.net/manual/en/function.ziparchive-unchangeindex.php + * @param index int

+ * Index of the entry. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function unchangeIndex ($index) {} + + /** + * Revert all changes done to an entry with the given name. + * @link http://www.php.net/manual/en/function.ziparchive-unchangename.php + * @param name string

+ * Name of the entry. + *

+ * @return mixed Returns true on success or false on failure. + */ + public function unchangeName ($name) {} + + /** + * Extract the archive contents + * @link http://www.php.net/manual/en/function.ziparchive-extractto.php + * @param destination string

+ * Location where to extract the files. + *

+ * @param entries mixed[optional]

+ * The entries to extract. It accepts either a single entry name or + * an array of names. + *

+ * @return bool Returns true on success or false on failure. + */ + public function extractTo ($destination, $entries = null) {} + + /** + * Returns the entry contents using its name + * @link http://www.php.net/manual/en/function.ziparchive-getfromname.php + * @param name string

+ * Name of the entry + *

+ * @param flags int[optional]

+ * The flags to use to open the archive. the following values may + * be ORed to it. + *

+ * ZIPARCHIVE::FL_UNCHANGED + *

+ * @return mixed the contents of the entry on success&return.falseforfailure;. + */ + public function getFromName ($name, $flags = null) {} + + /** + * Returns the entry contents using its index + * @link http://www.php.net/manual/en/function.ziparchive-getfromindex.php + * @param index int

+ * Index of the entry + *

+ * @param flags int[optional]

+ * The flags to use to open the archive. the following values may + * be ORed to it. + *

+ * ZIPARCHIVE::FL_UNCHANGED + *

+ * @return mixed the contents of the entry on success&return.falseforfailure;. + */ + public function getFromIndex ($index, $flags = null) {} + + /** + * Get a file handler to the entry defined by its name (read only). + * @link http://www.php.net/manual/en/function.ziparchive-getstream.php + * @param name string

+ * The name of the entry to use. + *

+ * @return resource a file pointer (resource) on success&return.falseforfailure;. + */ + public function getStream ($name) {} + +} + +/** + * Open a ZIP file archive + * @link http://www.php.net/manual/en/function.zip-open.php + * @param filename string

+ * The file name of the ZIP archive to open. + *

+ * @return mixed a resource handle for later use with + * zip_read and zip_close + * or returns the number of error if filename does not + * exist or in case of other error. + * + * @jms-builtin + */ +function zip_open ($filename) {} + +/** + * Close a ZIP file archive + * @link http://www.php.net/manual/en/function.zip-close.php + * @param zip resource

+ * A ZIP file previously opened with zip_open. + *

+ * @return void + * + * @jms-builtin + */ +function zip_close ($zip) {} + +/** + * Read next entry in a ZIP file archive + * @link http://www.php.net/manual/en/function.zip-read.php + * @param zip resource

+ * A ZIP file previously opened with zip_open. + *

+ * @return mixed a directory entry resource for later use with the + * zip_entry_... functions or false if + * there's no more entries to read or number of error in case of other error. + * + * @jms-builtin + */ +function zip_read ($zip) {} + +/** + * Open a directory entry for reading + * @link http://www.php.net/manual/en/function.zip-entry-open.php + * @param zip resource

+ * A valid resource handle returned by zip_open. + *

+ * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @param mode string[optional]

+ * Any of the modes specified in the documentation of + * fopen. + *

+ *

+ * Currently, mode is ignored and is always + * "rb". This is due to the fact that zip support + * in PHP is read only access. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * Unlike fopen and other similar functions, + * the return value of zip_entry_open only + * indicates the result of the operation and is not needed for + * reading or closing the directory entry. + * + * @jms-builtin + */ +function zip_entry_open ($zip, $zip_entry, $mode = null) {} + +/** + * Close a directory entry + * @link http://www.php.net/manual/en/function.zip-entry-close.php + * @param zip_entry resource

+ * A directory entry previously opened zip_entry_open. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function zip_entry_close ($zip_entry) {} + +/** + * Read from an open directory entry + * @link http://www.php.net/manual/en/function.zip-entry-read.php + * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @param length int[optional]

+ * The number of bytes to return. If not specified, this function will + * attempt to read 1024 bytes. + *

+ *

+ * This should be the uncompressed length you wish to read. + *

+ * @return string the data read, or false if the end of the file is + * reached. + * + * @jms-builtin + */ +function zip_entry_read ($zip_entry, $length = null) {} + +/** + * Retrieve the actual file size of a directory entry + * @link http://www.php.net/manual/en/function.zip-entry-filesize.php + * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @return int The size of the directory entry. + * + * @jms-builtin + */ +function zip_entry_filesize ($zip_entry) {} + +/** + * Retrieve the name of a directory entry + * @link http://www.php.net/manual/en/function.zip-entry-name.php + * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @return string The name of the directory entry. + * + * @jms-builtin + */ +function zip_entry_name ($zip_entry) {} + +/** + * Retrieve the compressed size of a directory entry + * @link http://www.php.net/manual/en/function.zip-entry-compressedsize.php + * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @return int The compressed size. + * + * @jms-builtin + */ +function zip_entry_compressedsize ($zip_entry) {} + +/** + * Retrieve the compression method of a directory entry + * @link http://www.php.net/manual/en/function.zip-entry-compressionmethod.php + * @param zip_entry resource

+ * A directory entry returned by zip_read. + *

+ * @return string The compression method. + * + * @jms-builtin + */ +function zip_entry_compressionmethod ($zip_entry) {} + +// End of zip v.1.9.1 +?> diff --git a/res/php-5.3-core-api/zlib.php b/res/php-5.3-core-api/zlib.php new file mode 100644 index 0000000..8b9ee0a --- /dev/null +++ b/res/php-5.3-core-api/zlib.php @@ -0,0 +1,393 @@ + + * The file name. This file will be opened from the filesystem and its + * contents written to standard output. + *

+ * @param use_include_path int[optional]

+ * You can set this optional parameter to 1, if you + * want to search for the file in the include_path too. + *

+ * @return int the number of (uncompressed) bytes read from the file. If + * an error occurs, false is returned and unless the function was + * called as @readgzfile, an error message is + * printed. + * + * @jms-builtin + */ +function readgzfile ($filename, $use_include_path = null) {} + +/** + * Rewind the position of a gz-file pointer + * @link http://www.php.net/manual/en/function.gzrewind.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function gzrewind ($zp) {} + +/** + * Close an open gz-file pointer + * @link http://www.php.net/manual/en/function.gzclose.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return bool Returns true on success or false on failure. + * + * @jms-builtin + */ +function gzclose ($zp) {} + +/** + * Test for EOF on a gz-file pointer + * @link http://www.php.net/manual/en/function.gzeof.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return int true if the gz-file pointer is at EOF or an error occurs; + * otherwise returns false. + * + * @jms-builtin + */ +function gzeof ($zp) {} + +/** + * Get character from gz-file pointer + * @link http://www.php.net/manual/en/function.gzgetc.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return string The uncompressed character or false on EOF (unlike gzeof). + * + * @jms-builtin + */ +function gzgetc ($zp) {} + +/** + * Get line from file pointer + * @link http://www.php.net/manual/en/function.gzgets.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @param length int

+ * The length of data to get. + *

+ * @return string The uncompressed string, or false on error. + * + * @jms-builtin + */ +function gzgets ($zp, $length) {} + +/** + * Get line from gz-file pointer and strip HTML tags + * @link http://www.php.net/manual/en/function.gzgetss.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @param length int

+ * The length of data to get. + *

+ * @param allowable_tags string[optional]

+ * You can use this optional parameter to specify tags which should not + * be stripped. + *

+ * @return string The uncompressed and striped string, or false on error. + * + * @jms-builtin + */ +function gzgetss ($zp, $length, $allowable_tags = null) {} + +/** + * Binary-safe gz-file read + * @link http://www.php.net/manual/en/function.gzread.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @param length int

+ * The number of bytes to read. + *

+ * @return string The data that have been read. + * + * @jms-builtin + */ +function gzread ($zp, $length) {} + +/** + * Open gz-file + * @link http://www.php.net/manual/en/function.gzopen.php + * @param filename string

+ * The file name. + *

+ * @param mode string

+ * As in fopen (rb or + * wb) but can also include a compression level + * (wb9) or a strategy: f for + * filtered data as in wb6f, h for + * Huffman only compression as in wb1h. + * (See the description of deflateInit2 + * in zlib.h for + * more information about the strategy parameter.) + *

+ * @param use_include_path int[optional]

+ * You can set this optional parameter to 1, if you + * want to search for the file in the include_path too. + *

+ * @return resource a file pointer to the file opened, after that, everything you read + * from this file descriptor will be transparently decompressed and what you + * write gets compressed. + *

+ *

+ * If the open fails, the function returns false. + * + * @jms-builtin + */ +function gzopen ($filename, $mode, $use_include_path = null) {} + +/** + * Output all remaining data on a gz-file pointer + * @link http://www.php.net/manual/en/function.gzpassthru.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return int The number of uncompressed characters read from gz + * and passed through to the input, or false on error. + * + * @jms-builtin + */ +function gzpassthru ($zp) {} + +/** + * Seek on a gz-file pointer + * @link http://www.php.net/manual/en/function.gzseek.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @param offset int

+ * The seeked offset. + *

+ * @param whence int[optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + *

+ *

+ * If whence is not specified, it is assumed to be + * SEEK_SET. + *

+ * @return int Upon success, returns 0; otherwise, returns -1. Note that seeking + * past EOF is not considered an error. + * + * @jms-builtin + */ +function gzseek ($zp, $offset, $whence = null) {} + +/** + * Tell gz-file pointer read/write position + * @link http://www.php.net/manual/en/function.gztell.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @return int The position of the file pointer or false if an error occurs. + * + * @jms-builtin + */ +function gztell ($zp) {} + +/** + * Binary-safe gz-file write + * @link http://www.php.net/manual/en/function.gzwrite.php + * @param zp resource

+ * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

+ * @param string string

+ * The string to write. + *

+ * @param length int[optional]

+ * The number of uncompressed bytes to write. If supplied, writing will + * stop after length (uncompressed) bytes have been + * written or the end of string is reached, + * whichever comes first. + *

+ *

+ * Note that if the length argument is given, + * then the magic_quotes_runtime + * configuration option will be ignored and no slashes will be + * stripped from string. + *

+ * @return int the number of (uncompressed) bytes written to the given gz-file + * stream. + * + * @jms-builtin + */ +function gzwrite ($zp, $string, $length = null) {} + +/** + * &Alias; gzwrite + * @link http://www.php.net/manual/en/function.gzputs.php + * + * @jms-builtin + */ +function gzputs () {} + +/** + * Read entire gz-file into an array + * @link http://www.php.net/manual/en/function.gzfile.php + * @param filename string

+ * The file name. + *

+ * @param use_include_path int[optional]

+ * You can set this optional parameter to 1, if you + * want to search for the file in the include_path too. + *

+ * @return array An array containing the file, one line per cell. + * + * @jms-builtin + */ +function gzfile ($filename, $use_include_path = null) {} + +/** + * Compress a string + * @link http://www.php.net/manual/en/function.gzcompress.php + * @param data string

+ * The data to compress. + *

+ * @param level int[optional]

+ * The level of compression. Can be given as 0 for no compression up to 9 + * for maximum compression. + *

+ * @return string The compressed string or false if an error occurred. + * + * @jms-builtin + */ +function gzcompress ($data, $level = null) {} + +/** + * Uncompress a compressed string + * @link http://www.php.net/manual/en/function.gzuncompress.php + * @param data string

+ * The data compressed by gzcompress. + *

+ * @param length int[optional]

+ * The maximum length of data to decode. + *

+ * @return string The original uncompressed data or false on error. + *

+ *

+ * The function will return an error if the uncompressed data is more than + * 32768 times the length of the compressed input data + * or more than the optional parameter length. + * + * @jms-builtin + */ +function gzuncompress ($data, $length = null) {} + +/** + * Deflate a string + * @link http://www.php.net/manual/en/function.gzdeflate.php + * @param data string

+ * The data to deflate. + *

+ * @param level int[optional]

+ * The level of compression. Can be given as 0 for no compression up to 9 + * for maximum compression. If not given, the default compression level will + * be the default compression level of the zlib library. + *

+ * @return string The deflated string or false if an error occurred. + * + * @jms-builtin + */ +function gzdeflate ($data, $level = null) {} + +/** + * Inflate a deflated string + * @link http://www.php.net/manual/en/function.gzinflate.php + * @param data string

+ * The data compressed by gzdeflate. + *

+ * @param length int[optional]

+ * The maximum length of data to decode. + *

+ * @return string The original uncompressed data or false on error. + *

+ *

+ * The function will return an error if the uncompressed data is more than + * 32768 times the length of the compressed input data + * or more than the optional parameter length. + * + * @jms-builtin + */ +function gzinflate ($data, $length = null) {} + +/** + * Create a gzip compressed string + * @link http://www.php.net/manual/en/function.gzencode.php + * @param data string

+ * The data to encode. + *

+ * @param level int[optional]

+ * The level of compression. Can be given as 0 for no compression up to 9 + * for maximum compression. If not given, the default compression level will + * be the default compression level of the zlib library. + *

+ * @param encoding_mode int[optional]

+ * The encoding mode. Can be FORCE_GZIP (the default) + * or FORCE_DEFLATE. + *

+ *

+ * If you use FORCE_DEFLATE, you get a standard zlib + * deflated string (inclusive zlib headers) after the gzip file header but + * without the trailing crc32 checksum. + *

+ * @return string The encoded string, or false if an error occurred. + * + * @jms-builtin + */ +function gzencode ($data, $level = null, $encoding_mode = null) {} + +/** + * ob_start callback function to gzip output buffer + * @link http://www.php.net/manual/en/function.ob-gzhandler.php + * @param buffer string

+ *

+ * @param mode int

+ *

+ * @return string + * + * @jms-builtin + */ +function ob_gzhandler ($buffer, $mode) {} + +/** + * Returns the coding type used for output compression + * @link http://www.php.net/manual/en/function.zlib-get-coding-type.php + * @return string Possible return values are gzip, deflate, + * or false. + * + * @jms-builtin + */ +function zlib_get_coding_type () {} + +define ('FORCE_GZIP', 1); +define ('FORCE_DEFLATE', 2); + +// End of zlib v.1.1 +?> diff --git a/res/php-5.4-core-api/Core.php b/res/php-5.4-core-api/Core.php new file mode 100644 index 0000000..dea98bc --- /dev/null +++ b/res/php-5.4-core-api/Core.php @@ -0,0 +1,1596 @@ + + * Retrieve an external iterator + * @link http://php.net/manual/en/iteratoraggregate.getiterator.php + * @return Traversable An instance of an object implementing Iterator or + * Traversable + */ + abstract public function getIterator (); + +} + +/** + * Interface for external iterators or objects that can be iterated + * themselves internally. + * @link http://php.net/manual/en/class.iterator.php + */ +interface Iterator extends Traversable { + + /** + * (PHP 5 >= 5.0.0)
+ * Return the current element + * @link http://php.net/manual/en/iterator.current.php + * @return mixed Can return any type. + */ + abstract public function current (); + + /** + * (PHP 5 >= 5.0.0)
+ * Move forward to next element + * @link http://php.net/manual/en/iterator.next.php + * @return void Any returned value is ignored. + */ + abstract public function next (); + + /** + * (PHP 5 >= 5.0.0)
+ * Return the key of the current element + * @link http://php.net/manual/en/iterator.key.php + * @return scalar scalar on success, or NULL on failure. + */ + abstract public function key (); + + /** + * (PHP 5 >= 5.0.0)
+ * Checks if current position is valid + * @link http://php.net/manual/en/iterator.valid.php + * @return boolean The return value will be casted to boolean and then evaluated. + * Returns TRUE on success or FALSE on failure. + */ + abstract public function valid (); + + /** + * (PHP 5 >= 5.0.0)
+ * Rewind the Iterator to the first element + * @link http://php.net/manual/en/iterator.rewind.php + * @return void Any returned value is ignored. + */ + abstract public function rewind (); + +} + +/** + * Interface to provide accessing objects as arrays. + * @link http://php.net/manual/en/class.arrayaccess.php + */ +interface ArrayAccess { + + /** + * (PHP 5 >= 5.0.0)
+ * Whether a offset exists + * @link http://php.net/manual/en/arrayaccess.offsetexists.php + * @param mixed $offset

+ * An offset to check for. + *

+ * @return boolean TRUE on success or FALSE on failure. + *

+ *

+ * The return value will be casted to boolean if non-boolean was returned. + */ + abstract public function offsetExists ($offset); + + /** + * (PHP 5 >= 5.0.0)
+ * Offset to retrieve + * @link http://php.net/manual/en/arrayaccess.offsetget.php + * @param mixed $offset

+ * The offset to retrieve. + *

+ * @return mixed Can return all value types. + */ + abstract public function offsetGet ($offset); + + /** + * (PHP 5 >= 5.0.0)
+ * Offset to set + * @link http://php.net/manual/en/arrayaccess.offsetset.php + * @param mixed $offset

+ * The offset to assign the value to. + *

+ * @param mixed $value

+ * The value to set. + *

+ * @return void No value is returned. + */ + abstract public function offsetSet ($offset, $value); + + /** + * (PHP 5 >= 5.0.0)
+ * Offset to unset + * @link http://php.net/manual/en/arrayaccess.offsetunset.php + * @param mixed $offset

+ * The offset to unset. + *

+ * @return void No value is returned. + */ + abstract public function offsetUnset ($offset); + +} + +/** + * Interface for customized serializing. + * @link http://php.net/manual/en/class.serializable.php + */ +interface Serializable { + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of object + * @link http://php.net/manual/en/serializable.serialize.php + * @return string the string representation of the object or NULL + */ + abstract public function serialize (); + + /** + * (PHP 5 >= 5.1.0)
+ * Constructs the object + * @link http://php.net/manual/en/serializable.unserialize.php + * @param string $serialized

+ * The string representation of the object. + *

+ * @return void The return value from this method is ignored. + */ + abstract public function unserialize ($serialized); + +} + +/** + * Exception is the base class for + * all Exceptions. + * @link http://php.net/manual/en/class.exception.php + * @jms-builtin + */ +class Exception { + protected $message; + private $string; + protected $code; + protected $file; + protected $line; + private $trace; + private $previous; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * An Error Exception. + * @link http://php.net/manual/en/class.errorexception.php + * @jms-builtin + */ +class ErrorException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + protected $severity; + + + /** + * (PHP 5 >= 5.1.0)
+ * Constructs the exception + * @link http://php.net/manual/en/errorexception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $severity [optional] + * @param $filename [optional] + * @param $lineno [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $severity, $filename, $lineno, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the exception severity + * @link http://php.net/manual/en/errorexception.getseverity.php + * @return int the severity level of the exception. + */ + final public function getSeverity () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Class used to represent anonymous + * functions. + * @link http://php.net/manual/en/class.closure.php + * @jms-builtin + */ +final class Closure { + + /** + * (No version information available, might only be in SVN)
+ * Constructor that disallows instantiation + * @link http://php.net/manual/en/closure.construct.php + */ + private function __construct () {} + + /** + * (No version information available, might only be in SVN)
+ * Duplicates a closure with a specific bound object and class scope + * @link http://php.net/manual/en/closure.bind.php + * @param Closure $closure

+ * The anonymous functions to bind. + *

+ * @param object $newthis

+ * The object to which the given anonymous function should be bound, or + * NULL for the closure to be unbound. + *

+ * @param mixed $newscope [optional]

+ * The class scope to which associate the closure is to be associated, or + * 'static' to keep the current one. If an object is given, the type of the + * object will be used instead. This determines the visibility of protected + * and private methods of the bound object. + *

+ * @return Closure a new Closure object or FALSE on failure + */ + public static function bind (Closure $closure, $newthis, $newscope = null) {} + + /** + * (No version information available, might only be in SVN)
+ * Duplicates the closure with a new bound object and class scope + * @link http://php.net/manual/en/closure.bindto.php + * @param object $newthis

+ * The object to which the given anonymous function should be bound, or + * NULL for the closure to be unbound. + *

+ * @param mixed $newscope [optional]

+ * The class scope to which associate the closure is to be associated, or + * 'static' to keep the current one. If an object is given, the type of the + * object will be used instead. This determines the visibility of protected + * and private methods of the bound object. + *

+ * @return Closure the newly created Closure object + * or FALSE on failure + */ + public function bindTo ($newthis, $newscope = null) {} + +} + +/** + * (PHP 4, PHP 5)
+ * Gets the version of the current Zend engine + * @link http://php.net/manual/en/function.zend-version.php + * @return string the Zend Engine version number, as a string. + * @jms-builtin + */ +function zend_version () {} + +/** + * (PHP 4, PHP 5)
+ * Returns the number of arguments passed to the function + * @link http://php.net/manual/en/function.func-num-args.php + * @return int the number of arguments passed into the current user-defined + * function. + * @jms-builtin + */ +function func_num_args () {} + +/** + * (PHP 4, PHP 5)
+ * Return an item from the argument list + * @link http://php.net/manual/en/function.func-get-arg.php + * @param int $arg_num

+ * The argument offset. Function arguments are counted starting from + * zero. + *

+ * @return mixed the specified argument, or FALSE on error. + * @jms-builtin + */ +function func_get_arg ($arg_num) {} + +/** + * (PHP 4, PHP 5)
+ * Returns an array comprising a function's argument list + * @link http://php.net/manual/en/function.func-get-args.php + * @return array an array in which each element is a copy of the corresponding + * member of the current user-defined function's argument list. + * @jms-builtin + */ +function func_get_args () {} + +/** + * (PHP 4, PHP 5)
+ * Get string length + * @link http://php.net/manual/en/function.strlen.php + * @param string $string

+ * The string being measured for length. + *

+ * @return int The length of the string on success, + * and 0 if the string is empty. + * @jms-builtin + */ +function strlen ($string) {} + +/** + * (PHP 4, PHP 5)
+ * Binary safe string comparison + * @link http://php.net/manual/en/function.strcmp.php + * @param string $str1

+ * The first string. + *

+ * @param string $str2

+ * The second string. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 + * is greater than str2, and 0 if they are + * equal. + * @jms-builtin + */ +function strcmp ($str1, $str2) {} + +/** + * (PHP 4, PHP 5)
+ * Binary safe string comparison of the first n characters + * @link http://php.net/manual/en/function.strncmp.php + * @param string $str1

+ * The first string. + *

+ * @param string $str2

+ * The second string. + *

+ * @param int $len

+ * Number of characters to use in the comparison. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 + * is greater than str2, and 0 if they are + * equal. + * @jms-builtin + */ +function strncmp ($str1, $str2, $len) {} + +/** + * (PHP 4, PHP 5)
+ * Binary safe case-insensitive string comparison + * @link http://php.net/manual/en/function.strcasecmp.php + * @param string $str1

+ * The first string + *

+ * @param string $str2

+ * The second string + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 + * is greater than str2, and 0 if they are + * equal. + * @jms-builtin + */ +function strcasecmp ($str1, $str2) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Binary safe case-insensitive string comparison of the first n characters + * @link http://php.net/manual/en/function.strncasecmp.php + * @param string $str1

+ * The first string. + *

+ * @param string $str2

+ * The second string. + *

+ * @param int $len

+ * The length of strings to be used in the comparison. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if str1 is + * greater than str2, and 0 if they are equal. + * @jms-builtin + */ +function strncasecmp ($str1, $str2, $len) {} + +/** + * (PHP 4, PHP 5)
+ * Return the current key and value pair from an array and advance the array cursor + * @link http://php.net/manual/en/function.each.php + * @param array $array

+ * The input array. + *

+ * @return array the current key and value pair from the array + * array. This pair is returned in a four-element + * array, with the keys 0, 1, + * key, and value. Elements + * 0 and key contain the key name of + * the array element, and 1 and value + * contain the data. + *

+ *

+ * If the internal pointer for the array points past the end of the + * array contents, each returns + * FALSE. + * @jms-builtin + */ +function each (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Sets which PHP errors are reported + * @link http://php.net/manual/en/function.error-reporting.php + * @param int $level [optional]

+ * The new error_reporting + * level. It takes on either a bitmask, or named constants. Using named + * constants is strongly encouraged to ensure compatibility for future + * versions. As error levels are added, the range of integers increases, + * so older integer-based error levels will not always behave as expected. + *

+ *

+ * The available error level constants and the actual + * meanings of these error levels are described in the + * predefined constants. + *

+ * @return int the old error_reporting + * level or the current level if no level parameter is + * given. + * @jms-builtin + */ +function error_reporting ($level = null) {} + +/** + * (PHP 4, PHP 5)
+ * Defines a named constant + * @link http://php.net/manual/en/function.define.php + * @param string $name

+ * The name of the constant. + *

+ * @param mixed $value

+ * The value of the constant; only scalar and null values are allowed. + * Scalar values are integer, + * float, string or boolean values. It is + * possible to define resource constants, however it is not recommended + * and may cause unpredictable behavior. + *

+ * @param bool $case_insensitive [optional]

+ * If set to TRUE, the constant will be defined case-insensitive. + * The default behavior is case-sensitive; i.e. + * CONSTANT and Constant represent + * different values. + *

+ *

+ * Case-insensitive constants are stored as lower-case. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function define ($name, $value, $case_insensitive = false) {} + +/** + * (PHP 4, PHP 5)
+ * Checks whether a given named constant exists + * @link http://php.net/manual/en/function.defined.php + * @param string $name

+ * The constant name. + *

+ * @return bool TRUE if the named constant given by name + * has been defined, FALSE otherwise. + * @jms-builtin + */ +function defined ($name) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the name of the class of an object + * @link http://php.net/manual/en/function.get-class.php + * @param object $object [optional]

+ * The tested object. This parameter may be omitted when inside a class. + *

+ * @return string the name of the class of which object is an + * instance. Returns FALSE if object is not an + * object. + *

+ *

+ * If object is omitted when inside a class, the + * name of that class is returned. + * @jms-builtin + */ +function get_class ($object = null) {} + +/** + * (PHP 5 >= 5.3.0)
+ * the "Late Static Binding" class name + * @link http://php.net/manual/en/function.get-called-class.php + * @return string the class name. Returns FALSE if called from outside a class. + * @jms-builtin + */ +function get_called_class () {} + +/** + * (PHP 4, PHP 5)
+ * Retrieves the parent class name for object or class + * @link http://php.net/manual/en/function.get-parent-class.php + * @param mixed $object [optional]

+ * The tested object or class name + *

+ * @return string the name of the parent class of the class of which + * object is an instance or the name. + *

+ *

+ * If the object does not have a parent or the class given does not exist FALSE will be returned. + *

+ *

+ * If called without parameter outside object, this function returns FALSE. + * @jms-builtin + */ +function get_parent_class ($object = null) {} + +/** + * (PHP 4, PHP 5)
+ * Checks if the class method exists + * @link http://php.net/manual/en/function.method-exists.php + * @param mixed $object

+ * An object instance or a class name + *

+ * @param string $method_name

+ * The method name + *

+ * @return bool TRUE if the method given by method_name + * has been defined for the given object, FALSE + * otherwise. + * @jms-builtin + */ +function method_exists ($object, $method_name) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Checks if the object or class has a property + * @link http://php.net/manual/en/function.property-exists.php + * @param mixed $class

+ * The class name or an object of the class to test for + *

+ * @param string $property

+ * The name of the property + *

+ * @return bool TRUE if the property exists, FALSE if it doesn't exist or + * NULL in case of an error. + * @jms-builtin + */ +function property_exists ($class, $property) {} + +/** + * (PHP 4, PHP 5)
+ * Checks if the class has been defined + * @link http://php.net/manual/en/function.class-exists.php + * @param string $class_name

+ * The class name. The name is matched in a case-insensitive manner. + *

+ * @param bool $autoload [optional]

+ * Whether or not to call __autoload by default. + *

+ * @return bool TRUE if class_name is a defined class, + * FALSE otherwise. + * @jms-builtin + */ +function class_exists ($class_name, $autoload = true) {} + +/** + * (PHP 5 >= 5.0.2)
+ * Checks if the interface has been defined + * @link http://php.net/manual/en/function.interface-exists.php + * @param string $interface_name

+ * The interface name + *

+ * @param bool $autoload [optional]

+ * Whether to call __autoload or not by default. + *

+ * @return bool TRUE if the interface given by + * interface_name has been defined, FALSE otherwise. + * @jms-builtin + */ +function interface_exists ($interface_name, $autoload = true) {} + +/** + * (No version information available, might only be in SVN)
+ * Checks if the trait exists + * @link http://php.net/manual/en/function.trait-exists.php + * @param string $traitname

+ * Name of the trait to check + *

+ * @param bool $autoload [optional]

+ * Whether to autoload if not already loaded. + *

+ * @return bool TRUE if trait exists, FALSE if not, NULL in case of an error. + * @jms-builtin + */ +function trait_exists ($traitname, $autoload = null) {} + +/** + * (PHP 4, PHP 5)
+ * Return TRUE if the given function has been defined + * @link http://php.net/manual/en/function.function-exists.php + * @param string $function_name

+ * The function name, as a string. + *

+ * @return bool TRUE if function_name exists and is a + * function, FALSE otherwise. + *

+ *

+ * This function will return FALSE for constructs, such as + * include_once and echo. + * @jms-builtin + */ +function function_exists ($function_name) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Creates an alias for a class + * @link http://php.net/manual/en/function.class-alias.php + * @param string $original [optional]

+ * The original class. + *

+ * @param string $alias [optional]

+ * The alias name for the class. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function class_alias ($original = null, $alias = null) {} + +/** + * (PHP 4, PHP 5)
+ * Returns an array with the names of included or required files + * @link http://php.net/manual/en/function.get-included-files.php + * @return array an array of the names of all files. + *

+ *

+ * The script originally called is considered an "included file," so it will + * be listed together with the files referenced by + * include and family. + *

+ *

+ * Files that are included or required multiple times only show up once in + * the returned array. + * @jms-builtin + */ +function get_included_files () {} + +/** + * (PHP 4, PHP 5)
+ * Alias of get_included_files + * @link http://php.net/manual/en/function.get-required-files.php + * @jms-builtin + */ +function get_required_files () {} + +/** + * (PHP 4, PHP 5)
+ * Checks if the object has this class as one of its parents + * @link http://php.net/manual/en/function.is-subclass-of.php + * @param mixed $object

+ * A class name or an object instance + *

+ * @param string $class_name

+ * The class name + *

+ * @param bool $allow_string [optional]

+ * If this parameter set to false, string class name as object + * is not allowed. This also prevents from calling autoloader if the class doesn't exist. + *

+ * @return bool This function returns TRUE if the object object, + * belongs to a class which is a subclass of + * class_name, FALSE otherwise. + * @jms-builtin + */ +function is_subclass_of ($object, $class_name, $allow_string = '&true;') {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Checks if the object is of this class or has this class as one of its parents + * @link http://php.net/manual/en/function.is-a.php + * @param object $object

+ * The tested object + *

+ * @param string $class_name

+ * The class name + *

+ * @param bool $allow_string [optional]

+ * If this parameter set to false, string class name as object + * is not allowed. This also prevents from calling autoloader if the class doesn't exist. + *

+ * @return bool TRUE if the object is of this class or has this class as one of + * its parents, FALSE otherwise. + * @jms-builtin + */ +function is_a ($object, $class_name, $allow_string = '&false;') {} + +/** + * (PHP 4, PHP 5)
+ * Get the default properties of the class + * @link http://php.net/manual/en/function.get-class-vars.php + * @param string $class_name

+ * The class name + *

+ * @return array an associative array of declared properties visible from the + * current scope, with their default value. + * The resulting array elements are in the form of + * varname => value. + * In case of an error, it returns FALSE. + * @jms-builtin + */ +function get_class_vars ($class_name) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the properties of the given object + * @link http://php.net/manual/en/function.get-object-vars.php + * @param object $object

+ * An object instance. + *

+ * @return array an associative array of defined object accessible non-static properties + * for the specified object in scope. If a property have + * not been assigned a value, it will be returned with a NULL value. + * @jms-builtin + */ +function get_object_vars ($object) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the class methods' names + * @link http://php.net/manual/en/function.get-class-methods.php + * @param mixed $class_name

+ * The class name or an object instance + *

+ * @return array an array of method names defined for the class specified by + * class_name. In case of an error, it returns NULL. + * @jms-builtin + */ +function get_class_methods ($class_name) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Generates a user-level error/warning/notice message + * @link http://php.net/manual/en/function.trigger-error.php + * @param string $error_msg

+ * The designated error message for this error. It's limited to 1024 + * characters in length. Any additional characters beyond 1024 will be + * truncated. + *

+ * @param int $error_type [optional]

+ * The designated error type for this error. It only works with the E_USER + * family of constants, and will default to E_USER_NOTICE. + *

+ * @return bool This function returns FALSE if wrong error_type is + * specified, TRUE otherwise. + * @jms-builtin + */ +function trigger_error ($error_msg, $error_type = 'E_USER_NOTICE') {} + +/** + * (PHP 4, PHP 5)
+ * Alias of trigger_error + * @link http://php.net/manual/en/function.user-error.php + * @param $message + * @param $error_type [optional] + * @jms-builtin + */ +function user_error ($message, $error_type) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Sets a user-defined error handler function + * @link http://php.net/manual/en/function.set-error-handler.php + * @param callable $error_handler

+ * The user function needs to accept two parameters: the error code, and a + * string describing the error. Then there are three optional parameters + * that may be supplied: the filename in which the error occurred, the + * line number in which the error occurred, and the context in which the + * error occurred (an array that points to the active symbol table at the + * point the error occurred). The function can be shown as: + *

+ *

+ * handler + * interrno + * stringerrstr + * stringerrfile + * interrline + * arrayerrcontext + * errno + * The first parameter, errno, contains the + * level of the error raised, as an integer. + * @param int $error_types [optional]

+ * Can be used to mask the triggering of the + * error_handler function just like the error_reporting ini setting + * controls which errors are shown. Without this mask set the + * error_handler will be called for every error + * regardless to the setting of the error_reporting setting. + *

+ * @return mixed a string containing the previously defined error handler (if any). If + * the built-in error handler is used NULL is returned. NULL is also returned + * in case of an error such as an invalid callback. If the previous error handler + * was a class method, this function will return an indexed array with the class + * and the method name. + * @jms-builtin + */ +function set_error_handler (callable $error_handler, $error_types = 'E_ALL | E_STRICT') {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Restores the previous error handler function + * @link http://php.net/manual/en/function.restore-error-handler.php + * @return bool This function always returns TRUE. + * @jms-builtin + */ +function restore_error_handler () {} + +/** + * (PHP 5)
+ * Sets a user-defined exception handler function + * @link http://php.net/manual/en/function.set-exception-handler.php + * @param callable $exception_handler

+ * Name of the function to be called when an uncaught exception occurs. + * This function must be defined before calling + * set_exception_handler. This handler function + * needs to accept one parameter, which will be the exception object that + * was thrown. + *

+ *

+ * NULL may be passed instead, to reset this handler to its + * default state. + *

+ * @return callable the name of the previously defined exception handler, or NULL on error. If + * no previous handler was defined, NULL is also returned. If NULL is passed, + * resetting the handler to its default state, TRUE is returned. + * @jms-builtin + */ +function set_exception_handler (callable $exception_handler) {} + +/** + * (PHP 5)
+ * Restores the previously defined exception handler function + * @link http://php.net/manual/en/function.restore-exception-handler.php + * @return bool This function always returns TRUE. + * @jms-builtin + */ +function restore_exception_handler () {} + +/** + * (PHP 4, PHP 5)
+ * Returns an array with the name of the defined classes + * @link http://php.net/manual/en/function.get-declared-classes.php + * @return array an array of the names of the declared classes in the current + * script. + *

+ *

+ * Note that depending on what extensions you have compiled or + * loaded into PHP, additional classes could be present. This means that + * you will not be able to define your own classes using these + * names. There is a list of predefined classes in the Predefined Classes section of + * the appendices. + * @jms-builtin + */ +function get_declared_classes () {} + +/** + * (No version information available, might only be in SVN)
+ * Returns an array of all declared traits + * @link http://php.net/manual/en/function.get-declared-traits.php + * @return array an array with names of all declared traits in values. + * Returns NULL in case of a failure. + * @jms-builtin + */ +function get_declared_traits () {} + +/** + * (PHP 5)
+ * Returns an array of all declared interfaces + * @link http://php.net/manual/en/function.get-declared-interfaces.php + * @return array an array of the names of the declared interfaces in the current + * script. + * @jms-builtin + */ +function get_declared_interfaces () {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Returns an array of all defined functions + * @link http://php.net/manual/en/function.get-defined-functions.php + * @return array an multidimensional array containing a list of all defined + * functions, both built-in (internal) and user-defined. The internal + * functions will be accessible via $arr["internal"], and + * the user defined ones using $arr["user"] (see example + * below). + * @jms-builtin + */ +function get_defined_functions () {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Returns an array of all defined variables + * @link http://php.net/manual/en/function.get-defined-vars.php + * @return array A multidimensional array with all the variables. + * @jms-builtin + */ +function get_defined_vars () {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Create an anonymous (lambda-style) function + * @link http://php.net/manual/en/function.create-function.php + * @param string $args

+ * The function arguments. + *

+ * @param string $code

+ * The function code. + *

+ * @return string a unique function name as a string, or FALSE on error. + * @jms-builtin + */ +function create_function ($args, $code) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns the resource type + * @link http://php.net/manual/en/function.get-resource-type.php + * @param resource $handle

+ * The evaluated resource handle. + *

+ * @return string If the given handle is a resource, this function + * will return a string representing its type. If the type is not identified + * by this function, the return value will be the string + * Unknown. + *

+ *

+ * This function will return FALSE and generate an error if + * handle is not a resource. + * @jms-builtin + */ +function get_resource_type ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Returns an array with the names of all modules compiled and loaded + * @link http://php.net/manual/en/function.get-loaded-extensions.php + * @param bool $zend_extensions [optional]

+ * Only return Zend extensions, if not then regular extensions, like + * mysqli are listed. Defaults to FALSE (return regular extensions). + *

+ * @return array an indexed array of all the modules names. + * @jms-builtin + */ +function get_loaded_extensions ($zend_extensions = false) {} + +/** + * (PHP 4, PHP 5)
+ * Find out whether an extension is loaded + * @link http://php.net/manual/en/function.extension-loaded.php + * @param string $name

+ * The extension name. + *

+ *

+ * You can see the names of various extensions by using + * phpinfo or if you're using the + * CGI or CLI version of + * PHP you can use the -m switch to + * list all available extensions: + *

+ * $ php -m
+ * [PHP Modules]
+ * xml
+ * tokenizer
+ * standard
+ * sockets
+ * session
+ * posix
+ * pcre
+ * overload
+ * mysql
+ * mbstring
+ * ctype
+ * [Zend Modules]
+ * 
+ *

+ * @return bool TRUE if the extension identified by name + * is loaded, FALSE otherwise. + * @jms-builtin + */ +function extension_loaded ($name) {} + +/** + * (PHP 4, PHP 5)
+ * Returns an array with the names of the functions of a module + * @link http://php.net/manual/en/function.get-extension-funcs.php + * @param string $module_name

+ * The module name. + *

+ *

+ * This parameter must be in lowercase. + *

+ * @return array an array with all the functions, or FALSE if + * module_name is not a valid extension. + * @jms-builtin + */ +function get_extension_funcs ($module_name) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Returns an associative array with the names of all the constants and their values + * @link http://php.net/manual/en/function.get-defined-constants.php + * @param bool $categorize [optional]

+ * Causing this function to return a multi-dimensional + * array with categories in the keys of the first dimension and constants + * and their values in the second dimension. + * + * define("MY_CONSTANT", 1); + * print_r(get_defined_constants(true)); + * + * The above example will output + * something similar to:

+ *
+ * Array
+ * (
+ * [Core] => Array
+ * (
+ * [E_ERROR] => 1
+ * [E_WARNING] => 2
+ * [E_PARSE] => 4
+ * [E_NOTICE] => 8
+ * [E_CORE_ERROR] => 16
+ * [E_CORE_WARNING] => 32
+ * [E_COMPILE_ERROR] => 64
+ * [E_COMPILE_WARNING] => 128
+ * [E_USER_ERROR] => 256
+ * [E_USER_WARNING] => 512
+ * [E_USER_NOTICE] => 1024
+ * [E_ALL] => 2047
+ * [TRUE] => 1
+ * )
+ * [pcre] => Array
+ * (
+ * [PREG_PATTERN_ORDER] => 1
+ * [PREG_SET_ORDER] => 2
+ * [PREG_OFFSET_CAPTURE] => 256
+ * [PREG_SPLIT_NO_EMPTY] => 1
+ * [PREG_SPLIT_DELIM_CAPTURE] => 2
+ * [PREG_SPLIT_OFFSET_CAPTURE] => 4
+ * [PREG_GREP_INVERT] => 1
+ * )
+ * [user] => Array
+ * (
+ * [MY_CONSTANT] => 1
+ * )
+ * )
+ * 
+ *

+ * @return array + * @jms-builtin + */ +function get_defined_constants ($categorize = false) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Generates a backtrace + * @link http://php.net/manual/en/function.debug-backtrace.php + * @param int $options [optional]

+ * As of 5.3.6, this parameter is a bitmask for the following options: + * + * debug_backtrace options + * + * + * + * + * + * + * + * + *
DEBUG_BACKTRACE_PROVIDE_OBJECT + * Whether or not to populate the "object" index. + *
DEBUG_BACKTRACE_IGNORE_ARGS + * Whether or not to omit the "args" index, and thus all the function/method arguments, + * to save memory. + *
+ * Before 5.3.6, the only values recognized are TRUE or FALSE, which are the same as + * setting or not setting the DEBUG_BACKTRACE_PROVIDE_OBJECT option respectively. + *

+ * @param int $limit [optional]

+ * As of 5.4.0, this parameter can be used to limit the number of stack frames returned. + * By default (limit=0) it returns all stack frames. + *

+ * @return array an array of associative arrays. The possible returned elements + * are as follows: + *

+ *

+ * + * Possible returned elements from debug_backtrace + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameTypeDescription
functionstring + * The current function name. See also + * __FUNCTION__. + *
lineinteger + * The current line number. See also + * __LINE__. + *
filestring + * The current file name. See also + * __FILE__. + *
classstring + * The current class name. See also + * __CLASS__ + *
objectobject + * The current object. + *
typestring + * The current call type. If a method call, "->" is returned. If a static + * method call, "::" is returned. If a function call, nothing is returned. + *
argsarray + * If inside a function, this lists the functions arguments. If + * inside an included file, this lists the included file name(s). + *
+ * @jms-builtin + */ +function debug_backtrace ($options = 'DEBUG_BACKTRACE_PROVIDE_OBJECT', $limit = 0) {} + +/** + * (PHP 5)
+ * Prints a backtrace + * @link http://php.net/manual/en/function.debug-print-backtrace.php + * @param int $options [optional]

+ * As of 5.3.6, this parameter is a bitmask for the following options: + * + * debug_print_backtrace options + * + * + * + * + *
DEBUG_BACKTRACE_IGNORE_ARGS + * Whether or not to omit the "args" index, and thus all the function/method arguments, + * to save memory. + *
+ *

+ * @param int $limit [optional]

+ * As of 5.4.0, this parameter can be used to limit the number of stack frames printed. + * By default (limit=0) it prints all stack frames. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function debug_print_backtrace ($options = 0, $limit = 0) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Forces collection of any existing garbage cycles + * @link http://php.net/manual/en/function.gc-collect-cycles.php + * @return int number of collected cycles. + * @jms-builtin + */ +function gc_collect_cycles () {} + +/** + * (PHP 5 >= 5.3.0)
+ * Returns status of the circular reference collector + * @link http://php.net/manual/en/function.gc-enabled.php + * @return bool TRUE if the garbage collector is enabled, FALSE otherwise. + * @jms-builtin + */ +function gc_enabled () {} + +/** + * (PHP 5 >= 5.3.0)
+ * Activates the circular reference collector + * @link http://php.net/manual/en/function.gc-enable.php + * @return void No value is returned. + * @jms-builtin + */ +function gc_enable () {} + +/** + * (PHP 5 >= 5.3.0)
+ * Deactivates the circular reference collector + * @link http://php.net/manual/en/function.gc-disable.php + * @return void No value is returned. + * @jms-builtin + */ +function gc_disable () {} + + +/** + * Fatal run-time errors. These indicate errors that can not be + * recovered from, such as a memory allocation problem. + * Execution of the script is halted. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_ERROR', 1); + +/** + * Catchable fatal error. It indicates that a probably dangerous error + * occured, but did not leave the Engine in an unstable state. If the error + * is not caught by a user defined handle (see also + * set_error_handler), the application aborts as it + * was an E_ERROR. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_RECOVERABLE_ERROR', 4096); + +/** + * Run-time warnings (non-fatal errors). Execution of the script is not + * halted. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_WARNING', 2); + +/** + * Compile-time parse errors. Parse errors should only be generated by + * the parser. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_PARSE', 4); + +/** + * Run-time notices. Indicate that the script encountered something that + * could indicate an error, but could also happen in the normal course of + * running a script. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_NOTICE', 8); + +/** + * Enable to have PHP suggest changes + * to your code which will ensure the best interoperability + * and forward compatibility of your code. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_STRICT', 2048); + +/** + * Run-time notices. Enable this to receive warnings about code + * that will not work in future versions. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_DEPRECATED', 8192); + +/** + * Fatal errors that occur during PHP's initial startup. This is like an + * E_ERROR, except it is generated by the core of PHP. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_CORE_ERROR', 16); + +/** + * Warnings (non-fatal errors) that occur during PHP's initial startup. + * This is like an E_WARNING, except it is generated + * by the core of PHP. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_CORE_WARNING', 32); + +/** + * Fatal compile-time errors. This is like an E_ERROR, + * except it is generated by the Zend Scripting Engine. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_COMPILE_ERROR', 64); + +/** + * Compile-time warnings (non-fatal errors). This is like an + * E_WARNING, except it is generated by the Zend + * Scripting Engine. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_COMPILE_WARNING', 128); + +/** + * User-generated error message. This is like an + * E_ERROR, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_ERROR', 256); + +/** + * User-generated warning message. This is like an + * E_WARNING, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_WARNING', 512); + +/** + * User-generated notice message. This is like an + * E_NOTICE, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_NOTICE', 1024); + +/** + * User-generated warning message. This is like an + * E_DEPRECATED, except it is generated in PHP code by + * using the PHP function trigger_error. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_USER_DEPRECATED', 16384); + +/** + * All errors and warnings, as supported, except of level + * E_STRICT prior to PHP 5.4.0. + * @link http://php.net/manual/en/errorfunc.constants.php + */ +define ('E_ALL', 32767); +define ('DEBUG_BACKTRACE_PROVIDE_OBJECT', 1); +define ('DEBUG_BACKTRACE_IGNORE_ARGS', 2); +define ('TRUE', true); +define ('FALSE', false); +define ('NULL', null); +define ('ZEND_THREAD_SAFE', false); +define ('ZEND_DEBUG_BUILD', false); +define ('PHP_VERSION', "5.4.3-4~precise+1"); +define ('PHP_MAJOR_VERSION', 5); +define ('PHP_MINOR_VERSION', 4); +define ('PHP_RELEASE_VERSION', 3); +define ('PHP_EXTRA_VERSION', "-4~precise+1"); +define ('PHP_VERSION_ID', 50403); +define ('PHP_ZTS', 0); +define ('PHP_DEBUG', 0); +define ('PHP_OS', "Linux"); +define ('PHP_SAPI', "cli"); +define ('DEFAULT_INCLUDE_PATH', ".:/usr/share/php:/usr/share/pear"); +define ('PEAR_INSTALL_DIR', "/usr/share/php"); +define ('PEAR_EXTENSION_DIR', "/usr/lib/php5/20100525"); +define ('PHP_EXTENSION_DIR', "/usr/lib/php5/20100525"); +define ('PHP_PREFIX', "/usr"); +define ('PHP_BINDIR', "/usr/bin"); +define ('PHP_MANDIR', "/usr/share/man"); +define ('PHP_LIBDIR', "/usr/lib/php5"); +define ('PHP_DATADIR', "${prefix}/share"); +define ('PHP_SYSCONFDIR', "/etc"); +define ('PHP_LOCALSTATEDIR', "/var"); +define ('PHP_CONFIG_FILE_PATH', "/etc/php5/cli"); +define ('PHP_CONFIG_FILE_SCAN_DIR', "/etc/php5/cli/conf.d"); +define ('PHP_SHLIB_SUFFIX', "so"); +define ('PHP_EOL', "\n"); +define ('PHP_MAXPATHLEN', 4096); +define ('PHP_INT_MAX', 9223372036854775807); +define ('PHP_INT_SIZE', 8); +define ('PHP_BINARY', "/usr/bin/php5"); +define ('PHP_OUTPUT_HANDLER_START', 1); +define ('PHP_OUTPUT_HANDLER_WRITE', 0); +define ('PHP_OUTPUT_HANDLER_FLUSH', 4); +define ('PHP_OUTPUT_HANDLER_CLEAN', 2); +define ('PHP_OUTPUT_HANDLER_FINAL', 8); +define ('PHP_OUTPUT_HANDLER_CONT', 0); +define ('PHP_OUTPUT_HANDLER_END', 8); +define ('PHP_OUTPUT_HANDLER_CLEANABLE', 16); +define ('PHP_OUTPUT_HANDLER_FLUSHABLE', 32); +define ('PHP_OUTPUT_HANDLER_REMOVABLE', 64); +define ('PHP_OUTPUT_HANDLER_STDFLAGS', 112); +define ('PHP_OUTPUT_HANDLER_STARTED', 4096); +define ('PHP_OUTPUT_HANDLER_DISABLED', 8192); +define ('UPLOAD_ERR_OK', 0); +define ('UPLOAD_ERR_INI_SIZE', 1); +define ('UPLOAD_ERR_FORM_SIZE', 2); +define ('UPLOAD_ERR_PARTIAL', 3); +define ('UPLOAD_ERR_NO_FILE', 4); +define ('UPLOAD_ERR_NO_TMP_DIR', 6); +define ('UPLOAD_ERR_CANT_WRITE', 7); +define ('UPLOAD_ERR_EXTENSION', 8); +define ('STDIN', "Resource id #1"); +define ('STDOUT', "Resource id #2"); +define ('STDERR', "Resource id #3"); + +// End of Core v.5.4.3-4~precise+1 +?> diff --git a/res/php-5.4-core-api/PDO.php b/res/php-5.4-core-api/PDO.php new file mode 100644 index 0000000..65b7f65 --- /dev/null +++ b/res/php-5.4-core-api/PDO.php @@ -0,0 +1,1448 @@ +PDOException from your own code. + * See Exceptions for more + * information about Exceptions in PHP. + * @link http://php.net/manual/en/class.pdoexception.php + * @jms-builtin + */ +class PDOException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + public $errorInfo; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Represents a connection between PHP and a database server. + * @link http://php.net/manual/en/class.pdo.php + * @jms-builtin + */ +class PDO { + + /** + * Represents a boolean data type. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_BOOL = 5; + + /** + * Represents the SQL NULL data type. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_NULL = 0; + + /** + * Represents the SQL INTEGER data type. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_INT = 1; + + /** + * Represents the SQL CHAR, VARCHAR, or other string data type. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_STR = 2; + + /** + * Represents the SQL large object data type. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_LOB = 3; + + /** + * Represents a recordset type. Not currently supported by any drivers. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_STMT = 4; + + /** + * Specifies that the parameter is an INOUT parameter for a stored + * procedure. You must bitwise-OR this value with an explicit + * PDO::PARAM_* data type. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_INPUT_OUTPUT = 2147483648; + + /** + * Allocation event + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_EVT_ALLOC = 0; + + /** + * Deallocation event + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_EVT_FREE = 1; + + /** + * Event triggered prior to execution of a prepared statement. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_EVT_EXEC_PRE = 2; + + /** + * Event triggered subsequent to execution of a prepared statement. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_EVT_EXEC_POST = 3; + + /** + * Event triggered prior to fetching a result from a resultset. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_EVT_FETCH_PRE = 4; + + /** + * Event triggered subsequent to fetching a result from a resultset. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_EVT_FETCH_POST = 5; + + /** + * Event triggered during bound parameter registration + * allowing the driver to normalize the parameter name. + * @link http://php.net/manual/en/pdo.constants.php + */ + const PARAM_EVT_NORMALIZE = 6; + + /** + * Specifies that the fetch method shall return each row as an object with + * variable names that correspond to the column names returned in the result + * set. PDO::FETCH_LAZY creates the object variable names as they are accessed. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_LAZY = 1; + + /** + * Specifies that the fetch method shall return each row as an array indexed + * by column name as returned in the corresponding result set. If the result + * set contains multiple columns with the same name, + * PDO::FETCH_ASSOC returns + * only a single value per column name. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_ASSOC = 2; + + /** + * Specifies that the fetch method shall return each row as an array indexed + * by column number as returned in the corresponding result set, starting at + * column 0. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_NUM = 3; + + /** + * Specifies that the fetch method shall return each row as an array indexed + * by both column name and number as returned in the corresponding result set, + * starting at column 0. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_BOTH = 4; + + /** + * Specifies that the fetch method shall return each row as an object with + * property names that correspond to the column names returned in the result + * set. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_OBJ = 5; + + /** + * Specifies that the fetch method shall return TRUE and assign the values of + * the columns in the result set to the PHP variables to which they were + * bound with the PDOStatement::bindParam or + * PDOStatement::bindColumn methods. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_BOUND = 6; + + /** + * Specifies that the fetch method shall return only a single requested + * column from the next row in the result set. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_COLUMN = 7; + + /** + * Specifies that the fetch method shall return a new instance of the + * requested class, mapping the columns to named properties in the class. + * The magic + * __set + * method is called if the property doesn't exist in the requested class + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_CLASS = 8; + + /** + * Specifies that the fetch method shall update an existing instance of the + * requested class, mapping the columns to named properties in the class. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_INTO = 9; + const FETCH_FUNC = 10; + const FETCH_GROUP = 65536; + const FETCH_UNIQUE = 196608; + + /** + * Fetch a two-column result into an array where the first column is a key and the second column + * is the value. Available since PHP 5.2.3. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_KEY_PAIR = 12; + + /** + * Determine the class name from the value of first column. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_CLASSTYPE = 262144; + + /** + * As PDO::FETCH_INTO but object is provided as a serialized string. + * Available since PHP 5.1.0. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_SERIALIZE = 524288; + + /** + * Available since PHP 5.2.0 + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_PROPS_LATE = 1048576; + + /** + * Specifies that the fetch method shall return each row as an array indexed + * by column name as returned in the corresponding result set. If the result + * set contains multiple columns with the same name, + * PDO::FETCH_NAMED returns + * an array of values per column name. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_NAMED = 11; + + /** + * If this value is FALSE, PDO attempts to disable autocommit so that the + * connection begins a transaction. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_AUTOCOMMIT = 0; + + /** + * Setting the prefetch size allows you to balance speed against memory + * usage for your application. Not all database/driver combinations support + * setting of the prefetch size. A larger prefetch size results in + * increased performance at the cost of higher memory usage. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_PREFETCH = 1; + + /** + * Sets the timeout value in seconds for communications with the database. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_TIMEOUT = 2; + + /** + * See the Errors and error + * handling section for more information about this attribute. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_ERRMODE = 3; + + /** + * This is a read only attribute; it will return information about the + * version of the database server to which PDO is connected. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_SERVER_VERSION = 4; + + /** + * This is a read only attribute; it will return information about the + * version of the client libraries that the PDO driver is using. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_CLIENT_VERSION = 5; + + /** + * This is a read only attribute; it will return some meta information about the + * database server to which PDO is connected. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_SERVER_INFO = 6; + const ATTR_CONNECTION_STATUS = 7; + + /** + * Force column names to a specific case specified by the PDO::CASE_* + * constants. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_CASE = 8; + + /** + * Get or set the name to use for a cursor. Most useful when using + * scrollable cursors and positioned updates. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_CURSOR_NAME = 9; + + /** + * Selects the cursor type. PDO currently supports either + * PDO::CURSOR_FWDONLY and + * PDO::CURSOR_SCROLL. Stick with + * PDO::CURSOR_FWDONLY unless you know that you need a + * scrollable cursor. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_CURSOR = 10; + + /** + * Convert empty strings to SQL NULL values on data fetches. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_ORACLE_NULLS = 11; + + /** + * Request a persistent connection, rather than creating a new connection. + * See Connections and Connection + * management for more information on this attribute. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_PERSISTENT = 12; + const ATTR_STATEMENT_CLASS = 13; + + /** + * Prepend the containing table name to each column name returned in the + * result set. The table name and column name are separated by a decimal (.) + * character. Support of this attribute is at the driver level; it may not + * be supported by your driver. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_FETCH_TABLE_NAMES = 14; + + /** + * Prepend the containing catalog name to each column name returned in the + * result set. The catalog name and column name are separated by a decimal + * (.) character. Support of this attribute is at the driver level; it may + * not be supported by your driver. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_FETCH_CATALOG_NAMES = 15; + + /** + * Returns the name of the driver. + *

+ * using PDO::ATTR_DRIVER_NAME + * + * if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') { + * echo "Running on mysql; doing something mysql specific here\n"; + * } + * + *

+ * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_DRIVER_NAME = 16; + const ATTR_STRINGIFY_FETCHES = 17; + const ATTR_MAX_COLUMN_LEN = 18; + + /** + * Available since PHP 5.1.3. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_EMULATE_PREPARES = 20; + + /** + * Available since PHP 5.2.0 + * @link http://php.net/manual/en/pdo.constants.php + */ + const ATTR_DEFAULT_FETCH_MODE = 19; + + /** + * Do not raise an error or exception if an error occurs. The developer is + * expected to explicitly check for errors. This is the default mode. + * See Errors and error handling + * for more information about this attribute. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ERRMODE_SILENT = 0; + + /** + * Issue a PHP E_WARNING message if an error occurs. + * See Errors and error handling + * for more information about this attribute. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ERRMODE_WARNING = 1; + + /** + * Throw a PDOException if an error occurs. + * See Errors and error handling + * for more information about this attribute. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ERRMODE_EXCEPTION = 2; + + /** + * Leave column names as returned by the database driver. + * @link http://php.net/manual/en/pdo.constants.php + */ + const CASE_NATURAL = 0; + + /** + * Force column names to lower case. + * @link http://php.net/manual/en/pdo.constants.php + */ + const CASE_LOWER = 2; + + /** + * Force column names to upper case. + * @link http://php.net/manual/en/pdo.constants.php + */ + const CASE_UPPER = 1; + const NULL_NATURAL = 0; + const NULL_EMPTY_STRING = 1; + const NULL_TO_STRING = 2; + + /** + * Corresponds to SQLSTATE '00000', meaning that the SQL statement was + * successfully issued with no errors or warnings. This constant is for + * your convenience when checking PDO::errorCode or + * PDOStatement::errorCode to determine if an error + * occurred. You will usually know if this is the case by examining the + * return code from the method that raised the error condition anyway. + * @link http://php.net/manual/en/pdo.constants.php + */ + const ERR_NONE = 00000; + + /** + * Fetch the next row in the result set. Valid only for scrollable cursors. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_ORI_NEXT = 0; + + /** + * Fetch the previous row in the result set. Valid only for scrollable + * cursors. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_ORI_PRIOR = 1; + + /** + * Fetch the first row in the result set. Valid only for scrollable cursors. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_ORI_FIRST = 2; + + /** + * Fetch the last row in the result set. Valid only for scrollable cursors. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_ORI_LAST = 3; + + /** + * Fetch the requested row by row number from the result set. Valid only + * for scrollable cursors. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_ORI_ABS = 4; + + /** + * Fetch the requested row by relative position from the current position + * of the cursor in the result set. Valid only for scrollable cursors. + * @link http://php.net/manual/en/pdo.constants.php + */ + const FETCH_ORI_REL = 5; + + /** + * Create a PDOStatement object with a forward-only cursor. This is the + * default cursor choice, as it is the fastest and most common data access + * pattern in PHP. + * @link http://php.net/manual/en/pdo.constants.php + */ + const CURSOR_FWDONLY = 0; + + /** + * Create a PDOStatement object with a scrollable cursor. Pass the + * PDO::FETCH_ORI_* constants to control the rows fetched from the result set. + * @link http://php.net/manual/en/pdo.constants.php + */ + const CURSOR_SCROLL = 1; + + /** + *

+ * Available since PHP 5.3.0. + *

+ *

+ * Sets the date format. + *

+ * @link http://php.net/manual/en/pdo-firebird.constants.php + */ + const FB_ATTR_DATE_FORMAT = 1000; + + /** + *

+ * Sets the time format. + *

+ *

+ * Available since PHP 5.3.0. + *

+ * @link http://php.net/manual/en/pdo-firebird.constants.php + */ + const FB_ATTR_TIME_FORMAT = 1001; + + /** + *

+ * Sets the timestamp format. + *

+ *

+ * Available since PHP 5.3.0. + *

+ * @link http://php.net/manual/en/pdo-firebird.constants.php + */ + const FB_ATTR_TIMESTAMP_FORMAT = 1002; + + /** + * If this attribute is set to TRUE on a + * PDOStatement, the MySQL driver will use the + * buffered versions of the MySQL API. If you're writing portable code, you + * should use PDOStatement::fetchAll instead. + *

+ * Forcing queries to be buffered in mysql + * + * if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') { + * $stmt = $db->prepare('select * from foo', + * array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); + * } else { + * die("my application only works with mysql; I should use \$stmt->fetchAll() instead"); + * } + * + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_USE_BUFFERED_QUERY = 1000; + + /** + *

+ * Enable LOAD LOCAL INFILE. + *

+ *

+ * Note, this constant can only be used in the driver_options + * array when constructing a new database handle. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_LOCAL_INFILE = 1001; + + /** + *

+ * Command to execute when connecting to the MySQL server. Will + * automatically be re-executed when reconnecting. + *

+ *

+ * Note, this constant can only be used in the driver_options + * array when constructing a new database handle. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_INIT_COMMAND = 1002; + + /** + *

+ * Maximum buffer size. Defaults to 1 MiB. This constant is not supported when + * compiled against mysqlnd. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_MAX_BUFFER_SIZE = 1005; + + /** + *

+ * Read options from the named option file instead of from + * my.cnf. This option is not available if + * mysqlnd is used, because mysqlnd does not read the mysql + * configuration files. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_READ_DEFAULT_FILE = 1003; + + /** + *

+ * Read options from the named group from my.cnf or the + * file specified with MYSQL_READ_DEFAULT_FILE. This option + * is not available if mysqlnd is used, because mysqlnd does not read the mysql + * configuration files. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_READ_DEFAULT_GROUP = 1004; + + /** + *

+ * Enable network communication compression. This is not supported when + * compiled against mysqlnd. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_COMPRESS = 1006; + + /** + *

+ * Perform direct queries, don't use prepared statements. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_DIRECT_QUERY = 1007; + + /** + *

+ * Return the number of found (matched) rows, not the + * number of changed rows. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_FOUND_ROWS = 1008; + + /** + *

+ * Permit spaces after function names. Makes all functions + * names reserved words. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_IGNORE_SPACE = 1009; + const MYSQL_ATTR_SSL_KEY = 1010; + + /** + *

+ * The file path to the SSL certificate. + *

+ *

+ * This exists as of PHP 5.3.7. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_SSL_CERT = 1011; + + /** + *

+ * The file path to the SSL certificate authority. + *

+ *

+ * This exists as of PHP 5.3.7. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_SSL_CA = 1012; + + /** + *

+ * The file path to the directory that contains the trusted SSL + * CA certificates, which are stored in PEM format. + *

+ *

+ * This exists as of PHP 5.3.7. + *

+ * @link http://php.net/manual/en/pdo-mysql.constants.php + */ + const MYSQL_ATTR_SSL_CAPATH = 1013; + const MYSQL_ATTR_SSL_CIPHER = 1014; + const ODBC_ATTR_USE_CURSOR_LIBRARY = 1000; + const ODBC_ATTR_ASSUME_UTF8 = 1001; + const ODBC_SQL_USE_IF_NEEDED = 0; + const ODBC_SQL_USE_DRIVER = 2; + const ODBC_SQL_USE_ODBC = 1; + const PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT = 1000; + const PGSQL_TRANSACTION_IDLE = 0; + const PGSQL_TRANSACTION_ACTIVE = 1; + const PGSQL_TRANSACTION_INTRANS = 2; + const PGSQL_TRANSACTION_INERROR = 3; + const PGSQL_TRANSACTION_UNKNOWN = 4; + + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Creates a PDO instance representing a connection to a database + * @link http://php.net/manual/en/pdo.construct.php + * @param $dsn + * @param $username + * @param $passwd + * @param $options [optional] + */ + public function __construct ($dsn, $username, $passwd, $options) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Prepares a statement for execution and returns a statement object + * @link http://php.net/manual/en/pdo.prepare.php + * @param string $statement

+ * This must be a valid SQL statement for the target database server. + *

+ * @param array $driver_options [optional]

+ * This array holds one or more key=>value pairs to set + * attribute values for the PDOStatement object that this method + * returns. You would most commonly use this to set the + * PDO::ATTR_CURSOR value to + * PDO::CURSOR_SCROLL to request a scrollable cursor. + * Some drivers have driver specific options that may be set at + * prepare-time. + *

+ * @return PDOStatement If the database server successfully prepares the statement, + * PDO::prepare returns a + * PDOStatement object. + * If the database server cannot successfully prepare the statement, + * PDO::prepare returns FALSE or emits + * PDOException (depending on error handling). + *

+ *

+ * Emulated prepared statements does not communicate with the database server + * so PDO::prepare does not check the statement. + */ + public function prepare ($statement, array $driver_options = 'array()') {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Initiates a transaction + * @link http://php.net/manual/en/pdo.begintransaction.php + * @return bool TRUE on success or FALSE on failure. + */ + public function beginTransaction () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Commits a transaction + * @link http://php.net/manual/en/pdo.commit.php + * @return bool TRUE on success or FALSE on failure. + */ + public function commit () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Rolls back a transaction + * @link http://php.net/manual/en/pdo.rollback.php + * @return bool TRUE on success or FALSE on failure. + */ + public function rollBack () {} + + /** + * (PHP 5 >= 5.3.3, Bundled pdo_pgsql)
+ * Checks if inside a transaction + * @link http://php.net/manual/en/pdo.intransaction.php + * @return bool TRUE if a transaction is currently active, and FALSE if not. + */ + public function inTransaction () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Set an attribute + * @link http://php.net/manual/en/pdo.setattribute.php + * @param int $attribute + * @param mixed $value + * @return bool TRUE on success or FALSE on failure. + */ + public function setAttribute ($attribute, $value) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Execute an SQL statement and return the number of affected rows + * @link http://php.net/manual/en/pdo.exec.php + * @param string $statement

+ * The SQL statement to prepare and execute. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return int PDO::exec returns the number of rows that were modified + * or deleted by the SQL statement you issued. If no rows were affected, + * PDO::exec returns 0. + *

+ * This function may + * return Boolean FALSE, but may also return a non-Boolean value which + * evaluates to FALSE. Please read the section on Booleans for more + * information. Use the === + * operator for testing the return value of this + * function. + *

+ * The following example incorrectly relies on the return value of + * PDO::exec, wherein a statement that affected 0 rows + * results in a call to die: + * + * $db->exec() or die(print_r($db->errorInfo(), true)); + * + */ + public function exec ($statement) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
+ * Executes an SQL statement, returning a result set as a PDOStatement object + * @link http://php.net/manual/en/pdo.query.php + * @param string $statement

+ * The SQL statement to prepare and execute. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return PDOStatement PDO::query returns a PDOStatement object, or FALSE + * on failure. + */ + public function query ($statement) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Returns the ID of the last inserted row or sequence value + * @link http://php.net/manual/en/pdo.lastinsertid.php + * @param string $name [optional]

+ * Name of the sequence object from which the ID should be returned. + *

+ * @return string If a sequence name was not specified for the name + * parameter, PDO::lastInsertId returns a + * string representing the row ID of the last row that was inserted into + * the database. + *

+ *

+ * If a sequence name was specified for the name + * parameter, PDO::lastInsertId returns a + * string representing the last value retrieved from the specified sequence + * object. + *

+ *

+ * If the PDO driver does not support this capability, + * PDO::lastInsertId triggers an + * IM001 SQLSTATE. + */ + public function lastInsertId ($name = null) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Fetch the SQLSTATE associated with the last operation on the database handle + * @link http://php.net/manual/en/pdo.errorcode.php + * @return mixed an SQLSTATE, a five characters alphanumeric identifier defined in + * the ANSI SQL-92 standard. Briefly, an SQLSTATE consists of a + * two characters class value followed by a three characters subclass value. A + * class value of 01 indicates a warning and is accompanied by a return code + * of SQL_SUCCESS_WITH_INFO. Class values other than '01', except for the + * class 'IM', indicate an error. The class 'IM' is specific to warnings + * and errors that derive from the implementation of PDO (or perhaps ODBC, + * if you're using the ODBC driver) itself. The subclass value '000' in any + * class indicates that there is no subclass for that SQLSTATE. + *

+ *

+ * PDO::errorCode only retrieves error codes for operations + * performed directly on the database handle. If you create a PDOStatement + * object through PDO::prepare or + * PDO::query and invoke an error on the statement + * handle, PDO::errorCode will not reflect that error. + * You must call PDOStatement::errorCode to return the error + * code for an operation performed on a particular statement handle. + *

+ *

+ * Returns NULL if no operation has been run on the database handle. + */ + public function errorCode () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Fetch extended error information associated with the last operation on the database handle + * @link http://php.net/manual/en/pdo.errorinfo.php + * @return array PDO::errorInfo returns an array of error information + * about the last operation performed by this database handle. The array + * consists of the following fields: + * + * Element + * Information + * + * + * 0 + * SQLSTATE error code (a five characters alphanumeric identifier defined + * in the ANSI SQL standard). + * + * + * 1 + * Driver-specific error code. + * + * + * 2 + * Driver-specific error message. + * + *

+ *

+ * If the SQLSTATE error code is not set or there is no driver-specific + * error, the elements following element 0 will be set to NULL. + *

+ *

+ * PDO::errorInfo only retrieves error information for + * operations performed directly on the database handle. If you create a + * PDOStatement object through PDO::prepare or + * PDO::query and invoke an error on the statement + * handle, PDO::errorInfo will not reflect the error + * from the statement handle. You must call + * PDOStatement::errorInfo to return the error + * information for an operation performed on a particular statement handle. + */ + public function errorInfo () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
+ * Retrieve a database connection attribute + * @link http://php.net/manual/en/pdo.getattribute.php + * @param int $attribute

+ * One of the PDO::ATTR_* constants. The constants that + * apply to database connections are as follows: + * PDO::ATTR_AUTOCOMMIT + * PDO::ATTR_CASE + * PDO::ATTR_CLIENT_VERSION + * PDO::ATTR_CONNECTION_STATUS + * PDO::ATTR_DRIVER_NAME + * PDO::ATTR_ERRMODE + * PDO::ATTR_ORACLE_NULLS + * PDO::ATTR_PERSISTENT + * PDO::ATTR_PREFETCH + * PDO::ATTR_SERVER_INFO + * PDO::ATTR_SERVER_VERSION + * PDO::ATTR_TIMEOUT + *

+ * @return mixed A successful call returns the value of the requested PDO attribute. + * An unsuccessful call returns null. + */ + public function getAttribute ($attribute) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.2.1)
+ * Quotes a string for use in a query. + * @link http://php.net/manual/en/pdo.quote.php + * @param string $string

+ * The string to be quoted. + *

+ * @param int $parameter_type [optional]

+ * Provides a data type hint for drivers that have alternate quoting styles. + *

+ * @return string a quoted string that is theoretically safe to pass into an + * SQL statement. Returns FALSE if the driver does not support quoting in + * this way. + */ + public function quote ($string, $parameter_type = 'PDO::PARAM_STR') {} + + final public function __wakeup () {} + + final public function __sleep () {} + + /** + * (PHP 5 >= 5.1.3, PECL pdo >= 1.0.3)
+ * Return an array of available PDO drivers + * @link http://php.net/manual/en/pdo.getavailabledrivers.php + * @return array PDO::getAvailableDrivers returns an array of PDO driver names. If + * no drivers are available, it returns an empty array. + */ + public static function getAvailableDrivers () {} + +} + +/** + * Represents a prepared statement and, after the statement is executed, an + * associated result set. + * @link http://php.net/manual/en/class.pdostatement.php + * @jms-builtin + */ +class PDOStatement implements Traversable { + /** + * @var string + */ + public $queryString; + + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Executes a prepared statement + * @link http://php.net/manual/en/pdostatement.execute.php + * @param array $input_parameters [optional]

+ * An array of values with as many elements as there are bound + * parameters in the SQL statement being executed. + * All values are treated as PDO::PARAM_STR. + *

+ *

+ * You cannot bind multiple values to a single parameter; for example, + * you cannot bind two values to a single named parameter in an IN() + * clause. + *

+ *

+ * You cannot bind more values than specified; if more keys exist in + * input_parameters than in the SQL specified + * in the PDO::prepare, then the statement will + * fail and an error is emitted. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function execute (array $input_parameters = null) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Fetches the next row from a result set + * @link http://php.net/manual/en/pdostatement.fetch.php + * @param int $fetch_style [optional]

+ * Controls how the next row will be returned to the caller. This value + * must be one of the PDO::FETCH_* constants, + * defaulting to value of PDO::ATTR_DEFAULT_FETCH_MODE + * (which defaults to PDO::FETCH_BOTH). + *

+ * PDO::FETCH_ASSOC: returns an array indexed by column + * name as returned in your result set + *

+ * @param int $cursor_orientation [optional]

+ * For a PDOStatement object representing a scrollable cursor, this + * value determines which row will be returned to the caller. This value + * must be one of the PDO::FETCH_ORI_* constants, + * defaulting to PDO::FETCH_ORI_NEXT. To request a + * scrollable cursor for your PDOStatement object, you must set the + * PDO::ATTR_CURSOR attribute to + * PDO::CURSOR_SCROLL when you prepare the SQL + * statement with PDO::prepare. + *

+ * @param int $cursor_offset [optional] + * @return mixed The return value of this function on success depends on the fetch type. In + * all cases, FALSE is returned on failure. + */ + public function fetch ($fetch_style = null, $cursor_orientation = 'PDO::FETCH_ORI_NEXT', $cursor_offset = 0) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Binds a parameter to the specified variable name + * @link http://php.net/manual/en/pdostatement.bindparam.php + * @param mixed $parameter

+ * Parameter identifier. For a prepared statement using named + * placeholders, this will be a parameter name of the form + * :name. For a prepared statement using + * question mark placeholders, this will be the 1-indexed position of + * the parameter. + *

+ * @param mixed $variable

+ * Name of the PHP variable to bind to the SQL statement parameter. + *

+ * @param int $data_type [optional]

+ * Explicit data type for the parameter using the PDO::PARAM_* + * constants. + * To return an INOUT parameter from a stored procedure, + * use the bitwise OR operator to set the PDO::PARAM_INPUT_OUTPUT bits + * for the data_type parameter. + *

+ * @param int $length [optional]

+ * Length of the data type. To indicate that a parameter is an OUT + * parameter from a stored procedure, you must explicitly set the + * length. + *

+ * @param mixed $driver_options [optional]

+ *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function bindParam ($parameter, &$variable, $data_type = 'PDO::PARAM_STR', $length = null, $driver_options = null) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Bind a column to a PHP variable + * @link http://php.net/manual/en/pdostatement.bindcolumn.php + * @param mixed $column

+ * Number of the column (1-indexed) or name of the column in the result set. + * If using the column name, be aware that the name should match the + * case of the column, as returned by the driver. + *

+ * @param mixed $param

+ * Name of the PHP variable to which the column will be bound. + *

+ * @param int $type [optional]

+ * Data type of the parameter, specified by the PDO::PARAM_* constants. + *

+ * @param int $maxlen [optional]

+ * A hint for pre-allocation. + *

+ * @param mixed $driverdata [optional]

+ * Optional parameter(s) for the driver. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function bindColumn ($column, &$param, $type = null, $maxlen = null, $driverdata = null) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 1.0.0)
+ * Binds a value to a parameter + * @link http://php.net/manual/en/pdostatement.bindvalue.php + * @param mixed $parameter

+ * Parameter identifier. For a prepared statement using named + * placeholders, this will be a parameter name of the form + * :name. For a prepared statement using + * question mark placeholders, this will be the 1-indexed position of + * the parameter. + *

+ * @param mixed $value

+ * The value to bind to the parameter. + *

+ * @param int $data_type [optional]

+ * Explicit data type for the parameter using the PDO::PARAM_* + * constants. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function bindValue ($parameter, $value, $data_type = 'PDO::PARAM_STR') {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Returns the number of rows affected by the last SQL statement + * @link http://php.net/manual/en/pdostatement.rowcount.php + * @return int the number of rows. + */ + public function rowCount () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.9.0)
+ * Returns a single column from the next row of a result set + * @link http://php.net/manual/en/pdostatement.fetchcolumn.php + * @param int $column_number [optional]

+ * 0-indexed number of the column you wish to retrieve from the row. If + * no value is supplied, PDOStatement::fetchColumn + * fetches the first column. + *

+ * @return string PDOStatement::fetchColumn returns a single column + * in the next row of a result set. + *

+ *

+ * There is no way to return another column from the same row if you + * use PDOStatement::fetchColumn to retrieve data. + */ + public function fetchColumn ($column_number = 0) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Returns an array containing all of the result set rows + * @link http://php.net/manual/en/pdostatement.fetchall.php + * @param int $fetch_style [optional]

+ * Controls the contents of the returned array as documented in + * PDOStatement::fetch. + * Defaults to value of PDO::ATTR_DEFAULT_FETCH_MODE + * (which defaults to PDO::FETCH_BOTH) + *

+ *

+ * To return an array consisting of all values of a single column from + * the result set, specify PDO::FETCH_COLUMN. You + * can specify which column you want with the + * column-index parameter. + *

+ *

+ * To fetch only the unique values of a single column from the result set, + * bitwise-OR PDO::FETCH_COLUMN with + * PDO::FETCH_UNIQUE. + *

+ *

+ * To return an associative array grouped by the values of a specified + * column, bitwise-OR PDO::FETCH_COLUMN with + * PDO::FETCH_GROUP. + *

+ * @param mixed $fetch_argument [optional]

+ * This argument have a different meaning depending on the value of + * the fetch_style parameter: + *

+ * PDO::FETCH_COLUMN: Returns the indicated 0-indexed + * column. + *

+ * @param array $ctor_args [optional]

+ * Arguments of custom class constructor when the fetch_style + * parameter is PDO::FETCH_CLASS. + *

+ * @return array PDOStatement::fetchAll returns an array containing + * all of the remaining rows in the result set. The array represents each + * row as either an array of column values or an object with properties + * corresponding to each column name. + *

+ *

+ * Using this method to fetch large result sets will result in a heavy + * demand on system and possibly network resources. Rather than retrieving + * all of the data and manipulating it in PHP, consider using the database + * server to manipulate the result sets. For example, use the WHERE and + * ORDER BY clauses in SQL to restrict results before retrieving and + * processing them with PHP. + */ + public function fetchAll ($fetch_style = null, $fetch_argument = null, array $ctor_args = 'array()') {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.2.4)
+ * Fetches the next row and returns it as an object. + * @link http://php.net/manual/en/pdostatement.fetchobject.php + * @param string $class_name [optional]

+ * Name of the created class. + *

+ * @param array $ctor_args [optional]

+ * Elements of this array are passed to the constructor. + *

+ * @return mixed an instance of the required class with property names that + * correspond to the column names or FALSE on failure. + */ + public function fetchObject ($class_name = "stdClass", array $ctor_args = null) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Fetch the SQLSTATE associated with the last operation on the statement handle + * @link http://php.net/manual/en/pdostatement.errorcode.php + * @return string Identical to PDO::errorCode, except that + * PDOStatement::errorCode only retrieves error codes + * for operations performed with PDOStatement objects. + */ + public function errorCode () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
+ * Fetch extended error information associated with the last operation on the statement handle + * @link http://php.net/manual/en/pdostatement.errorinfo.php + * @return array PDOStatement::errorInfo returns an array of + * error information about the last operation performed by this + * statement handle. The array consists of the following fields: + * + * Element + * Information + * + * + * 0 + * SQLSTATE error code (a five characters alphanumeric identifier defined + * in the ANSI SQL standard). + * + * + * 1 + * Driver specific error code. + * + * + * 2 + * Driver specific error message. + * + */ + public function errorInfo () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
+ * Set a statement attribute + * @link http://php.net/manual/en/pdostatement.setattribute.php + * @param int $attribute + * @param mixed $value + * @return bool TRUE on success or FALSE on failure. + */ + public function setAttribute ($attribute, $value) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
+ * Retrieve a statement attribute + * @link http://php.net/manual/en/pdostatement.getattribute.php + * @param int $attribute + * @return mixed the attribute value. + */ + public function getAttribute ($attribute) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
+ * Returns the number of columns in the result set + * @link http://php.net/manual/en/pdostatement.columncount.php + * @return int the number of columns in the result set represented by the + * PDOStatement object. If there is no result set, + * PDOStatement::columnCount returns 0. + */ + public function columnCount () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
+ * Returns metadata for a column in a result set + * @link http://php.net/manual/en/pdostatement.getcolumnmeta.php + * @param int $column

+ * The 0-indexed column in the result set. + *

+ * @return array an associative array containing the following values representing + * the metadata for a single column: + *

+ * + * Column metadata + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameValue
native_typeThe PHP native type used to represent the column value.
driver:decl_typeThe SQL type used to represent the column value in the database. + * If the column in the result set is the result of a function, this value + * is not returned by PDOStatement::getColumnMeta. + *
flagsAny flags set for this column.
nameThe name of this column as returned by the database.
tableThe name of this column's table as returned by the database.
lenThe length of this column. Normally -1 for + * types other than floating point decimals.
precisionThe numeric precision of this column. Normally + * 0 for types other than floating point + * decimals.
pdo_typeThe type of this column as represented by the + * PDO::PARAM_* constants.
+ *

+ * Returns FALSE if the requested column does not exist in the result set, + * or if no result set exists. + */ + public function getColumnMeta ($column) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
+ * Set the default fetch mode for this statement + * @link http://php.net/manual/en/pdostatement.setfetchmode.php + * @param int $mode

+ * The fetch mode must be one of the PDO::FETCH_* constants. + *

+ * @return bool 1 on success or FALSE on failure. + */ + public function setFetchMode ($mode) {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
+ * Advances to the next rowset in a multi-rowset statement handle + * @link http://php.net/manual/en/pdostatement.nextrowset.php + * @return bool TRUE on success or FALSE on failure. + */ + public function nextRowset () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.9.0)
+ * Closes the cursor, enabling the statement to be executed again. + * @link http://php.net/manual/en/pdostatement.closecursor.php + * @return bool TRUE on success or FALSE on failure. + */ + public function closeCursor () {} + + /** + * (PHP 5 >= 5.1.0, PECL pdo >= 0.9.0)
+ * Dump an SQL prepared command + * @link http://php.net/manual/en/pdostatement.debugdumpparams.php + * @return bool No value is returned. + */ + public function debugDumpParams () {} + + final public function __wakeup () {} + + final public function __sleep () {} + +} + +/** @jms-builtin */ +final class PDORow { +} + +/** @jms-builtin */ +function pdo_drivers () {} + +// End of PDO v.1.0.4dev +?> diff --git a/res/php-5.4-core-api/PDO_Firebird.php b/res/php-5.4-core-api/PDO_Firebird.php new file mode 100644 index 0000000..10bc42f --- /dev/null +++ b/res/php-5.4-core-api/PDO_Firebird.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.4-core-api/PDO_ODBC.php b/res/php-5.4-core-api/PDO_ODBC.php new file mode 100644 index 0000000..a1ef860 --- /dev/null +++ b/res/php-5.4-core-api/PDO_ODBC.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.4-core-api/Phar.php b/res/php-5.4-core-api/Phar.php new file mode 100644 index 0000000..5a613a2 --- /dev/null +++ b/res/php-5.4-core-api/Phar.php @@ -0,0 +1,2496 @@ + + * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * The Phar class provides a high-level interface to accessing and creating + * phar archives. + * @link http://php.net/manual/en/class.phar.php + * @jms-builtin + */ +class Phar extends RecursiveDirectoryIterator implements RecursiveIterator, SeekableIterator, Traversable, Iterator, Countable, ArrayAccess { + const CURRENT_MODE_MASK = 240; + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const KEY_MODE_MASK = 3840; + const KEY_AS_PATHNAME = 0; + const FOLLOW_SYMLINKS = 512; + const KEY_AS_FILENAME = 256; + const NEW_CURRENT_AND_KEY = 256; + const OTHER_MODE_MASK = 12288; + const SKIP_DOTS = 4096; + const UNIX_PATHS = 8192; + const BZ2 = 8192; + const GZ = 4096; + const NONE = 0; + const PHAR = 1; + const TAR = 2; + const ZIP = 3; + const COMPRESSED = 61440; + const PHP = 0; + const PHPS = 1; + const MD5 = 1; + const OPENSSL = 16; + const SHA1 = 2; + const SHA256 = 3; + const SHA512 = 4; + + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Construct a Phar archive object + * @link http://php.net/manual/en/phar.construct.php + * @param string $fname

+ * Path to an existing Phar archive or to-be-created archive + *

+ * @param int $flags [optional]

+ * Flags to pass to parent class RecursiveDirectoryIterator. + *

+ * @param string $alias [optional]

+ * Alias with which this Phar archive should be referred to in calls to stream + * functionality. + *

+ */ + public function __construct ($fname, $flags = null, $alias = null) {} + + public function __destruct () {} + + /** + * (Unknown)
+ * Add an empty directory to the phar archive + * @link http://php.net/manual/en/phar.addemptydir.php + * @param string $dirname

+ * The name of the empty directory to create in the phar archive + *

+ * @return void no return value, exception is thrown on failure. + */ + public function addEmptyDir ($dirname) {} + + /** + * (Unknown)
+ * Add a file from the filesystem to the phar archive + * @link http://php.net/manual/en/phar.addfile.php + * @param string $file

+ * Full or relative path to a file on disk to be added + * to the phar archive. + *

+ * @param string $localname [optional]

+ * Path that the file will be stored in the archive. + *

+ * @return void no return value, exception is thrown on failure. + */ + public function addFile ($file, $localname = null) {} + + /** + * (Unknown)
+ * Add a file from the filesystem to the phar archive + * @link http://php.net/manual/en/phar.addfromstring.php + * @param string $localname

+ * Path that the file will be stored in the archive. + *

+ * @param string $contents

+ * The file contents to store + *

+ * @return void no return value, exception is thrown on failure. + */ + public function addFromString ($localname, $contents) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Construct a phar archive from the files within a directory. + * @link http://php.net/manual/en/phar.buildfromdirectory.php + * @param string $base_dir

+ * The full or relative path to the directory that contains all files + * to add to the archive. + *

+ * @param string $regex [optional]

+ * An optional pcre regular expression that is used to filter the + * list of files. Only file paths matching the regular expression + * will be included in the archive. + *

+ * @return array Phar::buildFromDirectory returns an associative array + * mapping internal path of file to the full path of the file on the + * filesystem. + */ + public function buildFromDirectory ($base_dir, $regex = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Construct a phar archive from an iterator. + * @link http://php.net/manual/en/phar.buildfromiterator.php + * @param Iterator $iter

+ * Any iterator that either associatively maps phar file to location or + * returns SplFileInfo objects + *

+ * @param string $base_directory [optional]

+ * For iterators that return SplFileInfo objects, the portion of each + * file's full path to remove when adding to the phar archive + *

+ * @return array Phar::buildFromIterator returns an associative array + * mapping internal path of file to the full path of the file on the + * filesystem. + */ + public function buildFromIterator (Iterator $iter, $base_directory = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Compresses all files in the current Phar archive + * @link http://php.net/manual/en/phar.compressfiles.php + * @param int $compression

+ * Compression must be one of Phar::GZ, + * Phar::BZ2 to add compression, or Phar::NONE + * to remove compression. + *

+ * @return void No value is returned. + */ + public function compressFiles ($compression) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Decompresses all files in the current Phar archive + * @link http://php.net/manual/en/phar.decompressfiles.php + * @return bool TRUE on success or FALSE on failure. + */ + public function decompressFiles () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Compresses the entire Phar archive using Gzip or Bzip2 compression + * @link http://php.net/manual/en/phar.compress.php + * @param int $compression

+ * Compression must be one of Phar::GZ, + * Phar::BZ2 to add compression, or Phar::NONE + * to remove compression. + *

+ * @param string $extension [optional]

+ * By default, the extension is .phar.gz + * or .phar.bz2 for compressing phar archives, and + * .phar.tar.gz or .phar.tar.bz2 for + * compressing tar archives. For decompressing, the default file extensions + * are .phar and .phar.tar. + *

+ * @return object a Phar object. + */ + public function compress ($compression, $extension = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Decompresses the entire Phar archive + * @link http://php.net/manual/en/phar.decompress.php + * @param string $extension [optional]

+ * For decompressing, the default file extensions + * are .phar and .phar.tar. + * Use this parameter to specify another file extension. Be aware + * that all executable phar archives must contain .phar + * in their filename. + *

+ * @return object A Phar object is returned. + */ + public function decompress ($extension = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Convert a phar archive to another executable phar archive file format + * @link http://php.net/manual/en/phar.converttoexecutable.php + * @param int $format [optional]

+ * This should be one of Phar::PHAR, Phar::TAR, + * or Phar::ZIP. If set to NULL, the existing file format + * will be preserved. + *

+ * @param int $compression [optional]

+ * This should be one of Phar::NONE for no whole-archive + * compression, Phar::GZ for zlib-based compression, and + * Phar::BZ2 for bzip-based compression. + *

+ * @param string $extension [optional]

+ * This parameter is used to override the default file extension for a + * converted archive. Note that all zip- and tar-based phar archives must contain + * .phar in their file extension in order to be processed as a + * phar archive. + *

+ *

+ * If converting to a phar-based archive, the default extensions are + * .phar, .phar.gz, or .phar.bz2 + * depending on the specified compression. For tar-based phar archives, the + * default extensions are .phar.tar, .phar.tar.gz, + * and .phar.tar.bz2. For zip-based phar archives, the + * default extension is .phar.zip. + *

+ * @return Phar The method returns a Phar object on success and throws an + * exception on failure. + */ + public function convertToExecutable ($format = 9021976, $compression = 9021976, $extension = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Convert a phar archive to a non-executable tar or zip file + * @link http://php.net/manual/en/phar.converttodata.php + * @param int $format [optional]

+ * This should be one of Phar::TAR + * or Phar::ZIP. If set to NULL, the existing file format + * will be preserved. + *

+ * @param int $compression [optional]

+ * This should be one of Phar::NONE for no whole-archive + * compression, Phar::GZ for zlib-based compression, and + * Phar::BZ2 for bzip-based compression. + *

+ * @param string $extension [optional]

+ * This parameter is used to override the default file extension for a + * converted archive. Note that .phar cannot be used + * anywhere in the filename for a non-executable tar or zip archive. + *

+ *

+ * If converting to a tar-based phar archive, the + * default extensions are .tar, .tar.gz, + * and .tar.bz2 depending on specified compression. + * For zip-based archives, the + * default extension is .zip. + *

+ * @return PharData The method returns a PharData object on success and throws an + * exception on failure. + */ + public function convertToData ($format = 9021976, $compression = 9021976, $extension = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Copy a file internal to the phar archive to another new file within the phar + * @link http://php.net/manual/en/phar.copy.php + * @param string $oldfile + * @param string $newfile + * @return bool returns TRUE on success, but it is safer to encase method call in a + * try/catch block and assume success if no exception is thrown. + */ + public function copy ($oldfile, $newfile) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns the number of entries (files) in the Phar archive + * @link http://php.net/manual/en/phar.count.php + * @return int The number of files contained within this phar, or 0 (the number zero) + * if none. + */ + public function count () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Delete a file within a phar archive + * @link http://php.net/manual/en/phar.delete.php + * @param string $entry

+ * Path within an archive to the file to delete. + *

+ * @return bool returns TRUE on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function delete ($entry) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.2.0)
+ * Deletes the global metadata of the phar + * @link http://php.net/manual/en/phar.delmetadata.php + * @return bool returns TRUE on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function delMetadata () {} + + /** + * (Unknown)
+ * Extract the contents of a phar archive to a directory + * @link http://php.net/manual/en/phar.extractto.php + * @param string $pathto

+ * Path within an archive to the file to delete. + *

+ * @param string|array $files [optional]

+ * The name of a file or directory to extract, or an array of files/directories to extract + *

+ * @param bool $overwrite [optional]

+ * Set to TRUE to enable overwriting existing files + *

+ * @return bool returns TRUE on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function extractTo ($pathto, $files = null, $overwrite = false) {} + + public function getAlias () {} + + public function getPath () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns phar archive meta-data + * @link http://php.net/manual/en/phar.getmetadata.php + * @return mixed any PHP variable that can be serialized and is stored as meta-data for the Phar archive, + * or NULL if no meta-data is stored. + */ + public function getMetadata () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Return whether phar was modified + * @link http://php.net/manual/en/phar.getmodified.php + * @return bool TRUE if the phar has been modified since opened, FALSE if not. + */ + public function getModified () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Return MD5/SHA1/SHA256/SHA512/OpenSSL signature of a Phar archive + * @link http://php.net/manual/en/phar.getsignature.php + * @return array Array with the opened archive's signature in hash key and MD5, + * SHA-1, + * SHA-256, SHA-512, or OpenSSL + * in hash_type. This signature is a hash calculated on the + * entire phar's contents, and may be used to verify the integrity of the archive. + * A valid signature is absolutely required of all executable phar archives if the + * phar.require_hash INI variable + * is set to true. + */ + public function getSignature () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Return the PHP loader or bootstrap stub of a Phar archive + * @link http://php.net/manual/en/phar.getstub.php + * @return string a string containing the contents of the bootstrap loader (stub) of + * the current Phar archive. + */ + public function getStub () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Return version info of Phar archive + * @link http://php.net/manual/en/phar.getversion.php + * @return string The opened archive's API version. This is not to be confused with + * the API version that the loaded phar extension will use to create + * new phars. Each Phar archive has the API version hard-coded into + * its manifest. See Phar file format + * documentation for more information. + */ + public function getVersion () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.2.0)
+ * Returns whether phar has global meta-data + * @link http://php.net/manual/en/phar.hasmetadata.php + * @return bool TRUE if meta-data has been set, and FALSE if not. + */ + public function hasMetadata () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Used to determine whether Phar write operations are being buffered, or are flushing directly to disk + * @link http://php.net/manual/en/phar.isbuffering.php + * @return bool TRUE if the write operations are being buffer, FALSE otherwise. + */ + public function isBuffering () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Returns Phar::GZ or PHAR::BZ2 if the entire phar archive is compressed (.tar.gz/tar.bz and so on) + * @link http://php.net/manual/en/phar.iscompressed.php + * @return mixed Phar::GZ, Phar::BZ2 or FALSE + */ + public function isCompressed () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Returns true if the phar archive is based on the tar/phar/zip file format depending on the parameter + * @link http://php.net/manual/en/phar.isfileformat.php + * @param int $format

+ * Either Phar::PHAR, Phar::TAR, or + * Phar::ZIP to test for the format of the archive. + *

+ * @return bool TRUE if the phar archive matches the file format requested by the parameter + */ + public function isFileFormat ($format) {} + + /** + * (Unknown)
+ * Returns true if the phar archive can be modified + * @link http://php.net/manual/en/phar.iswritable.php + * @return bool TRUE if the phar archive can be modified + */ + public function isWritable () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * determines whether a file exists in the phar + * @link http://php.net/manual/en/phar.offsetexists.php + * @param string $offset

+ * The filename (relative path) to look for in a Phar. + *

+ * @return bool TRUE if the file exists within the phar, or FALSE if not. + */ + public function offsetExists ($offset) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Gets a PharFileInfo object for a specific file + * @link http://php.net/manual/en/phar.offsetget.php + * @param string $offset

+ * The filename (relative path) to look for in a Phar. + *

+ * @return int A PharFileInfo object is returned that can be used to + * iterate over a file's contents or to retrieve information about the current file. + */ + public function offsetGet ($offset) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * set the contents of an internal file to those of an external file + * @link http://php.net/manual/en/phar.offsetset.php + * @param string $offset

+ * The filename (relative path) to modify in a Phar. + *

+ * @param string $value

+ * Content of the file. + *

+ * @return void No return values. + */ + public function offsetSet ($offset, $value) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * remove a file from a phar + * @link http://php.net/manual/en/phar.offsetunset.php + * @param string $offset

+ * The filename (relative path) to modify in a Phar. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function offsetUnset ($offset) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.2.1)
+ * Set the alias for the Phar archive + * @link http://php.net/manual/en/phar.setalias.php + * @param string $alias

+ * A shorthand string that this archive can be referred to in phar + * stream wrapper access. + *

+ * @return bool + */ + public function setAlias ($alias) {} + + /** + * (Unknown)
+ * Used to set the PHP loader or bootstrap stub of a Phar archive to the default loader + * @link http://php.net/manual/en/phar.setdefaultstub.php + * @param string $index [optional]

+ * Relative path within the phar archive to run if accessed on the command-line + *

+ * @param string $webindex [optional]

+ * Relative path within the phar archive to run if accessed through a web browser + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setDefaultStub ($index = null, $webindex = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Sets phar archive meta-data + * @link http://php.net/manual/en/phardata.setmetadata.php + * @param mixed $metadata

+ * Any PHP variable containing information to store that describes the phar archive + *

+ * @return void No value is returned. + */ + public function setMetadata ($metadata) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.1.0)
+ * set the signature algorithm for a phar and apply it. The + * @link http://php.net/manual/en/phardata.setsignaturealgorithm.php + * @param int $sigtype

+ * One of Phar::MD5, + * Phar::SHA1, Phar::SHA256, + * Phar::SHA512, or Phar::PGP + *

+ * @return void No value is returned. + */ + public function setSignatureAlgorithm ($sigtype) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Used to set the PHP loader or bootstrap stub of a Phar archive + * @link http://php.net/manual/en/phar.setstub.php + * @param string $stub

+ * A string or an open stream handle to use as the executable stub for this + * phar archive. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setStub ($stub) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Start buffering Phar write operations, do not modify the Phar object on disk + * @link http://php.net/manual/en/phar.startbuffering.php + * @return void No value is returned. + */ + public function startBuffering () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Stop buffering write requests to the Phar archive, and save changes to disk + * @link http://php.net/manual/en/phar.stopbuffering.php + * @return void No value is returned. + */ + public function stopBuffering () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns the api version + * @link http://php.net/manual/en/phar.apiversion.php + * @return string The API version string as in "1.0.0". + */ + final public static function apiVersion () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns whether phar extension supports compression using either zlib or bzip2 + * @link http://php.net/manual/en/phar.cancompress.php + * @param int $type [optional]

+ * Either Phar::GZ or Phar::BZ2 can be + * used to test whether compression is possible with a specific compression + * algorithm (zlib or bzip2). + *

+ * @return bool TRUE if compression/decompression is available, FALSE if not. + */ + final public static function canCompress ($type = 0) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns whether phar extension supports writing and creating phars + * @link http://php.net/manual/en/phar.canwrite.php + * @return bool TRUE if write access is enabled, FALSE if it is disabled. + */ + final public static function canWrite () {} + + /** + * (Unknown)
+ * Create a phar-file format specific stub + * @link http://php.net/manual/en/phar.createdefaultstub.php + * @param string $indexfile [optional] + * @param string $webindexfile [optional] + * @return string a string containing the contents of a customized bootstrap loader (stub) + * that allows the created Phar archive to work with or without the Phar extension + * enabled. + */ + final public static function createDefaultStub ($indexfile = null, $webindexfile = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.2.0)
+ * Return array of supported compression algorithms + * @link http://php.net/manual/en/phar.getsupportedcompression.php + * @return array an array containing any of Phar::GZ or + * Phar::BZ2, depending on the availability of + * the zlib extension or the + * bz2 extension. + */ + final public static function getSupportedCompression () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.1.0)
+ * Return array of supported signature types + * @link http://php.net/manual/en/phar.getsupportedsignatures.php + * @return array an array containing any of MD5, SHA-1, + * SHA-256, SHA-512, or OpenSSL. + */ + final public static function getSupportedSignatures () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * instructs phar to intercept fopen, file_get_contents, opendir, and all of the stat-related functions + * @link http://php.net/manual/en/phar.interceptfilefuncs.php + * @return void + */ + final public static function interceptFileFuncs () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.2.0)
+ * Returns whether the given filename is a valid phar filename + * @link http://php.net/manual/en/phar.isvalidpharfilename.php + * @param string $filename

+ * The name or full path to a phar archive not yet created + *

+ * @param bool $executable [optional]

+ * This parameter determines whether the filename should be treated as + * a phar executable archive, or a data non-executable archive + *

+ * @return bool TRUE if the filename is valid, FALSE if not. + */ + final public static function isValidPharFilename ($filename, $executable = true) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Loads any phar archive with an alias + * @link http://php.net/manual/en/phar.loadphar.php + * @param string $filename

+ * the full or relative path to the phar archive to open + *

+ * @param string $alias [optional]

+ * The alias that may be used to refer to the phar archive. Note + * that many phar archives specify an explicit alias inside the + * phar archive, and a PharException will be thrown if + * a new alias is specified in this case. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + final public static function loadPhar ($filename, $alias = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Reads the currently executed file (a phar) and registers its manifest + * @link http://php.net/manual/en/phar.mapphar.php + * @param string $alias [optional]

+ * The alias that can be used in phar:// URLs to + * refer to this archive, rather than its full path. + *

+ * @param int $dataoffset [optional]

+ * Unused variable, here for compatibility with PEAR's PHP_Archive. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + final public static function mapPhar ($alias = null, $dataoffset = 0) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Returns the full path on disk or full phar URL to the currently executing Phar archive + * @link http://php.net/manual/en/phar.running.php + * @param bool $retphar [optional]

+ * If FALSE, the full path on disk to the phar + * archive is returned. If TRUE, a full phar URL is returned. + *

+ * @return string the filename if valid, empty string otherwise. + */ + final public static function running ($retphar = true) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Mount an external path or file to a virtual location within the phar archive + * @link http://php.net/manual/en/phar.mount.php + * @param string $pharpath

+ * The internal path within the phar archive to use as the mounted path location. + * This must be a relative path within the phar archive, and must not already exist. + *

+ * @param string $externalpath

+ * A path or URL to an external file or directory to mount within the phar archive + *

+ * @return void No return. PharException is thrown on failure. + */ + final public static function mount ($pharpath, $externalpath) {} + + /** + * (Unknown)
+ * Defines a list of up to 4 $_SERVER variables that should be modified for execution + * @link http://php.net/manual/en/phar.mungserver.php + * @param array $munglist

+ * an array containing as string indices any of + * REQUEST_URI, PHP_SELF, + * SCRIPT_NAME and SCRIPT_FILENAME. + * Other values trigger an exception, and Phar::mungServer + * is case-sensitive. + *

+ * @return void No return. + */ + final public static function mungServer (array $munglist) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Completely remove a phar archive from disk and from memory + * @link http://php.net/manual/en/phar.unlinkarchive.php + * @param string $archive

+ * The path on disk to the phar archive. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + final public static function unlinkArchive ($archive) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * mapPhar for web-based phars. front controller for web applications + * @link http://php.net/manual/en/phar.webphar.php + * @param string $alias [optional]

+ * The alias that can be used in phar:// URLs to + * refer to this archive, rather than its full path. + *

+ * @param string $index [optional]

+ * The location within the phar of the directory index. + *

+ * @param string $f404 [optional]

+ * The location of the script to run when a file is not found. This + * script should output the proper HTTP 404 headers. + *

+ * @param array $mimetypes [optional]

+ * An array mapping additional file extensions to MIME type. + * If the default mapping is sufficient, pass an empty array. + * By default, these extensions are mapped to these MIME types: + * + * $mimes = array( + * 'phps' => Phar::PHPS, // pass to highlight_file() + * 'c' => 'text/plain', + * 'cc' => 'text/plain', + * 'cpp' => 'text/plain', + * 'c++' => 'text/plain', + * 'dtd' => 'text/plain', + * 'h' => 'text/plain', + * 'log' => 'text/plain', + * 'rng' => 'text/plain', + * 'txt' => 'text/plain', + * 'xsd' => 'text/plain', + * 'php' => Phar::PHP, // parse as PHP + * 'inc' => Phar::PHP, // parse as PHP + * 'avi' => 'video/avi', + * 'bmp' => 'image/bmp', + * 'css' => 'text/css', + * 'gif' => 'image/gif', + * 'htm' => 'text/html', + * 'html' => 'text/html', + * 'htmls' => 'text/html', + * 'ico' => 'image/x-ico', + * 'jpe' => 'image/jpeg', + * 'jpg' => 'image/jpeg', + * 'jpeg' => 'image/jpeg', + * 'js' => 'application/x-javascript', + * 'midi' => 'audio/midi', + * 'mid' => 'audio/midi', + * 'mod' => 'audio/mod', + * 'mov' => 'movie/quicktime', + * 'mp3' => 'audio/mp3', + * 'mpg' => 'video/mpeg', + * 'mpeg' => 'video/mpeg', + * 'pdf' => 'application/pdf', + * 'png' => 'image/png', + * 'swf' => 'application/shockwave-flash', + * 'tif' => 'image/tiff', + * 'tiff' => 'image/tiff', + * 'wav' => 'audio/wav', + * 'xbm' => 'image/xbm', + * 'xml' => 'text/xml', + * ); + * + *

+ * @param array $rewrites [optional]

+ * An array mapping URI to internal file, simulating mod_rewrite of apache. + * For example: + * + * array( + * 'myinfo' => 'myinfo.php' + * ); + * + * would route calls to http://<host>/myphar.phar/myinfo + * to the file phar:///path/to/myphar.phar/myinfo.php, preserving + * GET/POST. This does not quite work like mod_rewrite in that it would not + * match http://<host>/myphar.phar/myinfo/another. + *

+ * @return void No value is returned. + */ + final public static function webPhar ($alias = null, $index = "index.php", $f404 = null, array $mimetypes = null, array $rewrites = null) {} + + /** + * (PHP 5)
+ * Returns whether current entry is a directory and not '.' or '..' + * @link http://php.net/manual/en/recursivedirectoryiterator.haschildren.php + * @param bool $allow_links [optional]

+ *

+ * @return bool whether the current entry is a directory, but not '.' or '..' + */ + public function hasChildren ($allow_links = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns an iterator for the current entry if it is a directory + * @link http://php.net/manual/en/recursivedirectoryiterator.getchildren.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator + * constants. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get sub path + * @link http://php.net/manual/en/recursivedirectoryiterator.getsubpath.php + * @return string The sub path (sub directory). + */ + public function getSubPath () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get sub path and name + * @link http://php.net/manual/en/recursivedirectoryiterator.getsubpathname.php + * @return string The sub path (sub directory) and filename. + */ + public function getSubPathname () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewinds back to the beginning + * @link http://php.net/manual/en/filesystemiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to the next file + * @link http://php.net/manual/en/filesystemiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Retrieve the key for the current file + * @link http://php.net/manual/en/filesystemiterator.key.php + * @return string the pathname or filename depending on the set flags. + * See the FilesystemIterator constants. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * The current file + * @link http://php.net/manual/en/filesystemiterator.current.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator constants. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get the handling flags + * @link http://php.net/manual/en/filesystemiterator.getflags.php + * @return int The integer value of the set flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets handling flags + * @link http://php.net/manual/en/filesystemiterator.setflags.php + * @param int $flags [optional]

+ * The handling flags to set. + * See the FilesystemIterator constants. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags = null) {} + + /** + * (PHP 5)
+ * Return file name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * (No version information available, might only be in SVN)
+ * Returns the file extension component of path + * @link http://php.net/manual/en/directoryiterator.getextension.php + * @return string + */ + public function getExtension () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Get base name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getbasename.php + * @param string $suffix [optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * (PHP 5)
+ * Determine if current DirectoryIterator item is '.' or '..' + * @link http://php.net/manual/en/directoryiterator.isdot.php + * @return bool TRUE if the entry is . or .., + * otherwise FALSE + */ + public function isDot () {} + + /** + * (PHP 5)
+ * Check whether current DirectoryIterator position is a valid file + * @link http://php.net/manual/en/directoryiterator.valid.php + * @return bool TRUE if the position is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Seek to a DirectoryIterator item + * @link http://php.net/manual/en/directoryiterator.seek.php + * @param int $position

+ * The zero-based numeric position to seek to. + *

+ * @return void No value is returned. + */ + public function seek ($position) {} + + /** + * (PHP 5)
+ * Get file name as a string + * @link http://php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path to the file + * @link http://php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file permissions + * @link http://php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode for the file + * @link http://php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file size + * @link http://php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the owner of the file + * @link http://php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the file group + * @link http://php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets last access time of the file + * @link http://php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the last modified time + * @link http://php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode change time + * @link http://php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file type + * @link http://php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if file is readable + * @link http://php.net/manual/en/splfileinfo.isreadable.php + * @return bool TRUE if readable, FALSE otherwise. + */ + public function isReadable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is executable + * @link http://php.net/manual/en/splfileinfo.isexecutable.php + * @return bool TRUE if executable, FALSE otherwise. + */ + public function isExecutable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the object references a regular file + * @link http://php.net/manual/en/splfileinfo.isfile.php + * @return bool TRUE if the file exists and is a regular file (not a link), FALSE otherwise. + */ + public function isFile () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a directory + * @link http://php.net/manual/en/splfileinfo.isdir.php + * @return bool TRUE if a directory, FALSE otherwise. + */ + public function isDir () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a link + * @link http://php.net/manual/en/splfileinfo.islink.php + * @return bool TRUE if the file is a link, FALSE otherwise. + */ + public function isLink () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the target of a link + * @link http://php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets absolute path to file + * @link http://php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the file + * @link http://php.net/manual/en/splfileinfo.getfileinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the path + * @link http://php.net/manual/en/splfileinfo.getpathinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileObject object for the file + * @link http://php.net/manual/en/splfileinfo.openfile.php + * @param string $open_mode [optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param bool $use_include_path [optional]

+ * When set to TRUE, the filename is also + * searched for within the include_path + *

+ * @param resource $context [optional]

+ * Refer to the context + * section of the manual for a description of contexts. + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = 'r', $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class name used with SplFileInfo::openFile + * @link http://php.net/manual/en/splfileinfo.setfileclass.php + * @param string $class_name [optional]

+ * The class name to use when openFile() is called. + *

+ * @return void No value is returned. + */ + public function setFileClass ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class used with getFileInfo and getPathInfo + * @link http://php.net/manual/en/splfileinfo.setinfoclass.php + * @param string $class_name [optional]

+ * The class name to use. + *

+ * @return void No value is returned. + */ + public function setInfoClass ($class_name = null) {} + + final public function _bad_state_ex () {} + +} + +/** + * The PharData class provides a high-level interface to accessing and creating + * non-executable tar and zip archives. Because these archives do not contain + * a stub and cannot be executed by the phar extension, it is possible to create + * and manipulate regular zip and tar files using the PharData class even if + * phar.readonly php.ini setting is 1. + * @link http://php.net/manual/en/class.phardata.php + * @jms-builtin + */ +class PharData extends RecursiveDirectoryIterator implements RecursiveIterator, SeekableIterator, Traversable, Iterator, Countable, ArrayAccess { + const CURRENT_MODE_MASK = 240; + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const KEY_MODE_MASK = 3840; + const KEY_AS_PATHNAME = 0; + const FOLLOW_SYMLINKS = 512; + const KEY_AS_FILENAME = 256; + const NEW_CURRENT_AND_KEY = 256; + const OTHER_MODE_MASK = 12288; + const SKIP_DOTS = 4096; + const UNIX_PATHS = 8192; + + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Construct a non-executable tar or zip archive object + * @link http://php.net/manual/en/phardata.construct.php + * @param string $fname

+ * Path to an existing tar/zip archive or to-be-created archive + *

+ * @param int $flags [optional]

+ * Flags to pass to Phar parent class + * RecursiveDirectoryIterator. + *

+ * @param string $alias [optional]

+ * Alias with which this Phar archive should be referred to in calls to stream + * functionality. + *

+ * @param int $format [optional]

+ * One of the + * file format constants + * available within the Phar class. + *

+ */ + public function __construct ($fname, $flags = null, $alias = null, $format = 'Phar::TAR') {} + + public function __destruct () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Add an empty directory to the tar/zip archive + * @link http://php.net/manual/en/phardata.addemptydir.php + * @param string $dirname

+ * The name of the empty directory to create in the phar archive + *

+ * @return bool no return value, exception is thrown on failure. + */ + public function addEmptyDir ($dirname) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Add a file from the filesystem to the tar/zip archive + * @link http://php.net/manual/en/phardata.addfile.php + * @param string $file

+ * Full or relative path to a file on disk to be added + * to the phar archive. + *

+ * @param string $localname [optional]

+ * Path that the file will be stored in the archive. + *

+ * @return void no return value, exception is thrown on failure. + */ + public function addFile ($file, $localname = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Add a file from the filesystem to the tar/zip archive + * @link http://php.net/manual/en/phardata.addfromstring.php + * @param string $localname

+ * Path that the file will be stored in the archive. + *

+ * @param string $contents

+ * The file contents to store + *

+ * @return bool no return value, exception is thrown on failure. + */ + public function addFromString ($localname, $contents) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Construct a tar/zip archive from the files within a directory. + * @link http://php.net/manual/en/phardata.buildfromdirectory.php + * @param string $base_dir

+ * The full or relative path to the directory that contains all files + * to add to the archive. + *

+ * @param string $regex [optional]

+ * An optional pcre regular expression that is used to filter the + * list of files. Only file paths matching the regular expression + * will be included in the archive. + *

+ * @return array Phar::buildFromDirectory returns an associative array + * mapping internal path of file to the full path of the file on the + * filesystem. + */ + public function buildFromDirectory ($base_dir, $regex = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Construct a tar or zip archive from an iterator. + * @link http://php.net/manual/en/phardata.buildfromiterator.php + * @param Iterator $iter

+ * Any iterator that either associatively maps tar/zip file to location or + * returns SplFileInfo objects + *

+ * @param string $base_directory [optional]

+ * For iterators that return SplFileInfo objects, the portion of each + * file's full path to remove when adding to the tar/zip archive + *

+ * @return array PharData::buildFromIterator returns an associative array + * mapping internal path of file to the full path of the file on the + * filesystem. + */ + public function buildFromIterator (Iterator $iter, $base_directory = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Compresses all files in the current tar/zip archive + * @link http://php.net/manual/en/phardata.compressfiles.php + * @param int $compression

+ * Compression must be one of Phar::GZ, + * Phar::BZ2 to add compression, or Phar::NONE + * to remove compression. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function compressFiles ($compression) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Decompresses all files in the current zip archive + * @link http://php.net/manual/en/phardata.decompressfiles.php + * @return bool TRUE on success or FALSE on failure. + */ + public function decompressFiles () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Compresses the entire tar/zip archive using Gzip or Bzip2 compression + * @link http://php.net/manual/en/phardata.compress.php + * @param int $compression

+ * Compression must be one of Phar::GZ, + * Phar::BZ2 to add compression, or Phar::NONE + * to remove compression. + *

+ * @param string $extension [optional]

+ * By default, the extension is .tar.gz or .tar.bz2 + * for compressing a tar, and .tar for decompressing. + *

+ * @return object A PharData object is returned. + */ + public function compress ($compression, $extension = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Decompresses the entire Phar archive + * @link http://php.net/manual/en/phardata.decompress.php + * @param string $extension [optional]

+ * For decompressing, the default file extension + * is .phar.tar. + * Use this parameter to specify another file extension. Be aware + * that no non-executable archives cannot contain .phar + * in their filename. + *

+ * @return object A PharData object is returned. + */ + public function decompress ($extension = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Convert a non-executable tar/zip archive to an executable phar archive + * @link http://php.net/manual/en/phardata.converttoexecutable.php + * @param int $format [optional]

+ * This should be one of Phar::PHAR, Phar::TAR, + * or Phar::ZIP. If set to NULL, the existing file format + * will be preserved. + *

+ * @param int $compression [optional]

+ * This should be one of Phar::NONE for no whole-archive + * compression, Phar::GZ for zlib-based compression, and + * Phar::BZ2 for bzip-based compression. + *

+ * @param string $extension [optional]

+ * This parameter is used to override the default file extension for a + * converted archive. Note that all zip- and tar-based phar archives must contain + * .phar in their file extension in order to be processed as a + * phar archive. + *

+ *

+ * If converting to a phar-based archive, the default extensions are + * .phar, .phar.gz, or .phar.bz2 + * depending on the specified compression. For tar-based phar archives, the + * default extensions are .phar.tar, .phar.tar.gz, + * and .phar.tar.bz2. For zip-based phar archives, the + * default extension is .phar.zip. + *

+ * @return Phar The method returns a Phar object on success and throws an + * exception on failure. + */ + public function convertToExecutable ($format = null, $compression = null, $extension = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Convert a phar archive to a non-executable tar or zip file + * @link http://php.net/manual/en/phardata.converttodata.php + * @param int $format [optional]

+ * This should be one of Phar::TAR + * or Phar::ZIP. If set to NULL, the existing file format + * will be preserved. + *

+ * @param int $compression [optional]

+ * This should be one of Phar::NONE for no whole-archive + * compression, Phar::GZ for zlib-based compression, and + * Phar::BZ2 for bzip-based compression. + *

+ * @param string $extension [optional]

+ * This parameter is used to override the default file extension for a + * converted archive. Note that .phar cannot be used + * anywhere in the filename for a non-executable tar or zip archive. + *

+ *

+ * If converting to a tar-based phar archive, the + * default extensions are .tar, .tar.gz, + * and .tar.bz2 depending on specified compression. + * For zip-based archives, the + * default extension is .zip. + *

+ * @return PharData The method returns a PharData object on success and throws an + * exception on failure. + */ + public function convertToData ($format = null, $compression = null, $extension = null) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Copy a file internal to the phar archive to another new file within the phar + * @link http://php.net/manual/en/phardata.copy.php + * @param string $oldfile + * @param string $newfile + * @return bool returns TRUE on success, but it is safer to encase method call in a + * try/catch block and assume success if no exception is thrown. + */ + public function copy ($oldfile, $newfile) {} + + public function count () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Delete a file within a tar/zip archive + * @link http://php.net/manual/en/phardata.delete.php + * @param string $entry

+ * Path within an archive to the file to delete. + *

+ * @return bool returns TRUE on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function delete ($entry) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Deletes the global metadata of a zip archive + * @link http://php.net/manual/en/phardata.delmetadata.php + * @return bool returns TRUE on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function delMetadata () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Extract the contents of a tar/zip archive to a directory + * @link http://php.net/manual/en/phardata.extractto.php + * @param string $pathto

+ * Path within an archive to the file to delete. + *

+ * @param string|array $files [optional]

+ * The name of a file or directory to extract, or an array of files/directories to extract + *

+ * @param bool $overwrite [optional]

+ * Set to TRUE to enable overwriting existing files + *

+ * @return bool returns TRUE on success, but it is better to check for thrown exception, + * and assume success if none is thrown. + */ + public function extractTo ($pathto, $files = null, $overwrite = false) {} + + public function getAlias () {} + + public function getPath () {} + + public function getMetadata () {} + + public function getModified () {} + + public function getSignature () {} + + public function getStub () {} + + public function getVersion () {} + + public function hasMetadata () {} + + public function isBuffering () {} + + public function isCompressed () {} + + /** + * @param $fileformat + */ + public function isFileFormat ($fileformat) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Returns true if the tar/zip archive can be modified + * @link http://php.net/manual/en/phardata.iswritable.php + * @return bool TRUE if the tar/zip archive can be modified + */ + public function isWritable () {} + + /** + * @param $entry + */ + public function offsetExists ($entry) {} + + /** + * @param $entry + */ + public function offsetGet ($entry) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * set the contents of a file within the tar/zip to those of an external file or string + * @link http://php.net/manual/en/phardata.offsetset.php + * @param string $offset

+ * The filename (relative path) to modify in a tar or zip archive. + *

+ * @param string $value

+ * Content of the file. + *

+ * @return void No return values. + */ + public function offsetSet ($offset, $value) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * remove a file from a tar/zip archive + * @link http://php.net/manual/en/phardata.offsetunset.php + * @param string $offset

+ * The filename (relative path) to modify in the tar/zip archive. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function offsetUnset ($offset) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * dummy function (Phar::setAlias is not valid for PharData) + * @link http://php.net/manual/en/phardata.setalias.php + * @param string $alias

+ * A shorthand string that this archive can be referred to in phar + * stream wrapper access. This parameter is ignored. + *

+ * @return bool + */ + public function setAlias ($alias) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * dummy function (Phar::setDefaultStub is not valid for PharData) + * @link http://php.net/manual/en/phardata.setdefaultstub.php + * @param string $index [optional]

+ * Relative path within the phar archive to run if accessed on the command-line + *

+ * @param string $webindex [optional]

+ * Relative path within the phar archive to run if accessed through a web browser + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setDefaultStub ($index = null, $webindex = null) {} + + /** + * @param $metadata + */ + public function setMetadata ($metadata) {} + + /** + * @param $algorithm + * @param $privatekey [optional] + */ + public function setSignatureAlgorithm ($algorithm, $privatekey) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * dummy function (Phar::setStub is not valid for PharData) + * @link http://php.net/manual/en/phardata.setstub.php + * @param string $stub

+ * A string or an open stream handle to use as the executable stub for this + * phar archive. This parameter is ignored. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setStub ($stub) {} + + public function startBuffering () {} + + public function stopBuffering () {} + + final public static function apiVersion () {} + + /** + * @param $method [optional] + */ + final public static function canCompress ($method) {} + + final public static function canWrite () {} + + /** + * @param $index [optional] + * @param $webindex [optional] + */ + final public static function createDefaultStub ($index, $webindex) {} + + final public static function getSupportedCompression () {} + + final public static function getSupportedSignatures () {} + + final public static function interceptFileFuncs () {} + + /** + * @param $filename + * @param $executable [optional] + */ + final public static function isValidPharFilename ($filename, $executable) {} + + /** + * @param $filename + * @param $alias [optional] + */ + final public static function loadPhar ($filename, $alias) {} + + /** + * @param $alias [optional] + * @param $offset [optional] + */ + final public static function mapPhar ($alias, $offset) {} + + /** + * @param $retphar + */ + final public static function running ($retphar) {} + + /** + * @param $inphar + * @param $externalfile + */ + final public static function mount ($inphar, $externalfile) {} + + /** + * @param $munglist + */ + final public static function mungServer ($munglist) {} + + /** + * @param $archive + */ + final public static function unlinkArchive ($archive) {} + + /** + * @param $alias [optional] + * @param $index [optional] + * @param $f404 [optional] + * @param $mimetypes [optional] + * @param $rewrites [optional] + */ + final public static function webPhar ($alias, $index, $f404, $mimetypes, $rewrites) {} + + /** + * (PHP 5)
+ * Returns whether current entry is a directory and not '.' or '..' + * @link http://php.net/manual/en/recursivedirectoryiterator.haschildren.php + * @param bool $allow_links [optional]

+ *

+ * @return bool whether the current entry is a directory, but not '.' or '..' + */ + public function hasChildren ($allow_links = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns an iterator for the current entry if it is a directory + * @link http://php.net/manual/en/recursivedirectoryiterator.getchildren.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator + * constants. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get sub path + * @link http://php.net/manual/en/recursivedirectoryiterator.getsubpath.php + * @return string The sub path (sub directory). + */ + public function getSubPath () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get sub path and name + * @link http://php.net/manual/en/recursivedirectoryiterator.getsubpathname.php + * @return string The sub path (sub directory) and filename. + */ + public function getSubPathname () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewinds back to the beginning + * @link http://php.net/manual/en/filesystemiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to the next file + * @link http://php.net/manual/en/filesystemiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Retrieve the key for the current file + * @link http://php.net/manual/en/filesystemiterator.key.php + * @return string the pathname or filename depending on the set flags. + * See the FilesystemIterator constants. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * The current file + * @link http://php.net/manual/en/filesystemiterator.current.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator constants. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get the handling flags + * @link http://php.net/manual/en/filesystemiterator.getflags.php + * @return int The integer value of the set flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets handling flags + * @link http://php.net/manual/en/filesystemiterator.setflags.php + * @param int $flags [optional]

+ * The handling flags to set. + * See the FilesystemIterator constants. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags = null) {} + + /** + * (PHP 5)
+ * Return file name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * (No version information available, might only be in SVN)
+ * Returns the file extension component of path + * @link http://php.net/manual/en/directoryiterator.getextension.php + * @return string + */ + public function getExtension () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Get base name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getbasename.php + * @param string $suffix [optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * (PHP 5)
+ * Determine if current DirectoryIterator item is '.' or '..' + * @link http://php.net/manual/en/directoryiterator.isdot.php + * @return bool TRUE if the entry is . or .., + * otherwise FALSE + */ + public function isDot () {} + + /** + * (PHP 5)
+ * Check whether current DirectoryIterator position is a valid file + * @link http://php.net/manual/en/directoryiterator.valid.php + * @return bool TRUE if the position is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Seek to a DirectoryIterator item + * @link http://php.net/manual/en/directoryiterator.seek.php + * @param int $position

+ * The zero-based numeric position to seek to. + *

+ * @return void No value is returned. + */ + public function seek ($position) {} + + /** + * (PHP 5)
+ * Get file name as a string + * @link http://php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path to the file + * @link http://php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file permissions + * @link http://php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode for the file + * @link http://php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file size + * @link http://php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the owner of the file + * @link http://php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the file group + * @link http://php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets last access time of the file + * @link http://php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the last modified time + * @link http://php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode change time + * @link http://php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file type + * @link http://php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if file is readable + * @link http://php.net/manual/en/splfileinfo.isreadable.php + * @return bool TRUE if readable, FALSE otherwise. + */ + public function isReadable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is executable + * @link http://php.net/manual/en/splfileinfo.isexecutable.php + * @return bool TRUE if executable, FALSE otherwise. + */ + public function isExecutable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the object references a regular file + * @link http://php.net/manual/en/splfileinfo.isfile.php + * @return bool TRUE if the file exists and is a regular file (not a link), FALSE otherwise. + */ + public function isFile () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a directory + * @link http://php.net/manual/en/splfileinfo.isdir.php + * @return bool TRUE if a directory, FALSE otherwise. + */ + public function isDir () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a link + * @link http://php.net/manual/en/splfileinfo.islink.php + * @return bool TRUE if the file is a link, FALSE otherwise. + */ + public function isLink () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the target of a link + * @link http://php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets absolute path to file + * @link http://php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the file + * @link http://php.net/manual/en/splfileinfo.getfileinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the path + * @link http://php.net/manual/en/splfileinfo.getpathinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileObject object for the file + * @link http://php.net/manual/en/splfileinfo.openfile.php + * @param string $open_mode [optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param bool $use_include_path [optional]

+ * When set to TRUE, the filename is also + * searched for within the include_path + *

+ * @param resource $context [optional]

+ * Refer to the context + * section of the manual for a description of contexts. + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = 'r', $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class name used with SplFileInfo::openFile + * @link http://php.net/manual/en/splfileinfo.setfileclass.php + * @param string $class_name [optional]

+ * The class name to use when openFile() is called. + *

+ * @return void No value is returned. + */ + public function setFileClass ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class used with getFileInfo and getPathInfo + * @link http://php.net/manual/en/splfileinfo.setinfoclass.php + * @param string $class_name [optional]

+ * The class name to use. + *

+ * @return void No value is returned. + */ + public function setInfoClass ($class_name = null) {} + + final public function _bad_state_ex () {} + +} + +/** + * The PharFileInfo class provides a high-level interface to the contents + * and attributes of a single file within a phar archive. + * @link http://php.net/manual/en/class.pharfileinfo.php + * @jms-builtin + */ +class PharFileInfo extends SplFileInfo { + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Construct a Phar entry object + * @link http://php.net/manual/en/pharfileinfo.construct.php + * @param string $entry

+ * The full url to retrieve a file. If you wish to retrieve the information + * for the file my/file.php from the phar boo.phar, + * the entry should be phar://boo.phar/my/file.php. + *

+ */ + public function __construct ($entry) {} + + public function __destruct () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Sets file-specific permission bits + * @link http://php.net/manual/en/pharfileinfo.chmod.php + * @param int $permissions

+ * permissions (see chmod) + *

+ * @return void No value is returned. + */ + public function chmod ($permissions) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Compresses the current Phar entry with either zlib or bzip2 compression + * @link http://php.net/manual/en/pharfileinfo.compress.php + * @param int $compression + * @return bool TRUE on success or FALSE on failure. + */ + public function compress ($compression) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 2.0.0)
+ * Decompresses the current Phar entry within the phar + * @link http://php.net/manual/en/pharfileinfo.decompress.php + * @return bool TRUE on success or FALSE on failure. + */ + public function decompress () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.2.0)
+ * Deletes the metadata of the entry + * @link http://php.net/manual/en/pharfileinfo.delmetadata.php + * @return bool TRUE if successful, FALSE if the entry had no metadata. + * As with all functionality that modifies the contents of + * a phar, the phar.readonly INI variable + * must be off in order to succeed if the file is within a Phar + * archive. Files within PharData archives do not have + * this restriction. + */ + public function delMetadata () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns the actual size of the file (with compression) inside the Phar archive + * @link http://php.net/manual/en/pharfileinfo.getcompressedsize.php + * @return int The size in bytes of the file within the Phar archive on disk. + */ + public function getCompressedSize () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns CRC32 code or throws an exception if CRC has not been verified + * @link http://php.net/manual/en/pharfileinfo.getcrc32.php + * @return int The crc32 checksum of the file within the Phar archive. + */ + public function getCRC32 () {} + + public function getContent () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns file-specific meta-data saved with a file + * @link http://php.net/manual/en/pharfileinfo.getmetadata.php + * @return mixed any PHP variable that can be serialized and is stored as meta-data for the file, + * or NULL if no meta-data is stored. + */ + public function getMetadata () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns the Phar file entry flags + * @link http://php.net/manual/en/pharfileinfo.getpharflags.php + * @return int The Phar flags (always 0 in the current implementation) + */ + public function getPharFlags () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.2.0)
+ * Returns the metadata of the entry + * @link http://php.net/manual/en/pharfileinfo.hasmetadata.php + * @return bool FALSE if no metadata is set or is NULL, TRUE if metadata is not NULL + */ + public function hasMetadata () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns whether the entry is compressed + * @link http://php.net/manual/en/pharfileinfo.iscompressed.php + * @param int $compression_type [optional]

+ * One of Phar::GZ or Phar::BZ2, + * defaults to any compression. + *

+ * @return bool TRUE if the file is compressed within the Phar archive, FALSE if not. + */ + public function isCompressed ($compression_type = 9021976) {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Returns whether file entry has had its CRC verified + * @link http://php.net/manual/en/pharfileinfo.iscrcchecked.php + * @return bool TRUE if the file has had its CRC verified, FALSE if not. + */ + public function isCRCChecked () {} + + /** + * (PHP >= 5.3.0, PECL phar >= 1.0.0)
+ * Sets file-specific meta-data saved with a file + * @link http://php.net/manual/en/pharfileinfo.setmetadata.php + * @param mixed $metadata

+ * Any PHP variable containing information to store alongside a file + *

+ * @return void No value is returned. + */ + public function setMetadata ($metadata) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path without filename + * @link http://php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the filename + * @link http://php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * (PHP 5 >= 5.3.6)
+ * Gets the file extension + * @link http://php.net/manual/en/splfileinfo.getextension.php + * @return string a string containing the file extension, or an + * empty string if the file has no extension. + */ + public function getExtension () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the base name of the file + * @link http://php.net/manual/en/splfileinfo.getbasename.php + * @param string $suffix [optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path to the file + * @link http://php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file permissions + * @link http://php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode for the file + * @link http://php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file size + * @link http://php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the owner of the file + * @link http://php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the file group + * @link http://php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets last access time of the file + * @link http://php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the last modified time + * @link http://php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode change time + * @link http://php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file type + * @link http://php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the entry is writable + * @link http://php.net/manual/en/splfileinfo.iswritable.php + * @return bool TRUE if writable, FALSE otherwise; + */ + public function isWritable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if file is readable + * @link http://php.net/manual/en/splfileinfo.isreadable.php + * @return bool TRUE if readable, FALSE otherwise. + */ + public function isReadable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is executable + * @link http://php.net/manual/en/splfileinfo.isexecutable.php + * @return bool TRUE if executable, FALSE otherwise. + */ + public function isExecutable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the object references a regular file + * @link http://php.net/manual/en/splfileinfo.isfile.php + * @return bool TRUE if the file exists and is a regular file (not a link), FALSE otherwise. + */ + public function isFile () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a directory + * @link http://php.net/manual/en/splfileinfo.isdir.php + * @return bool TRUE if a directory, FALSE otherwise. + */ + public function isDir () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a link + * @link http://php.net/manual/en/splfileinfo.islink.php + * @return bool TRUE if the file is a link, FALSE otherwise. + */ + public function isLink () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the target of a link + * @link http://php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets absolute path to file + * @link http://php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the file + * @link http://php.net/manual/en/splfileinfo.getfileinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the path + * @link http://php.net/manual/en/splfileinfo.getpathinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileObject object for the file + * @link http://php.net/manual/en/splfileinfo.openfile.php + * @param string $open_mode [optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param bool $use_include_path [optional]

+ * When set to TRUE, the filename is also + * searched for within the include_path + *

+ * @param resource $context [optional]

+ * Refer to the context + * section of the manual for a description of contexts. + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = 'r', $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class name used with SplFileInfo::openFile + * @link http://php.net/manual/en/splfileinfo.setfileclass.php + * @param string $class_name [optional]

+ * The class name to use when openFile() is called. + *

+ * @return void No value is returned. + */ + public function setFileClass ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class used with getFileInfo and getPathInfo + * @link http://php.net/manual/en/splfileinfo.setinfoclass.php + * @param string $class_name [optional]

+ * The class name to use. + *

+ * @return void No value is returned. + */ + public function setInfoClass ($class_name = null) {} + + final public function _bad_state_ex () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Returns the path to the file as a string + * @link http://php.net/manual/en/splfileinfo.tostring.php + * @return void the path to the file. + */ + public function __toString () {} + +} +// End of Phar v.2.0.1 +?> diff --git a/res/php-5.4-core-api/Reflection.php b/res/php-5.4-core-api/Reflection.php new file mode 100644 index 0000000..02ff527 --- /dev/null +++ b/res/php-5.4-core-api/Reflection.php @@ -0,0 +1,2577 @@ + + * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * The reflection class. + * @link http://php.net/manual/en/class.reflection.php + * @jms-builtin + */ +class Reflection { + + /** + * (PHP 5)
+ * Gets modifier names + * @link http://php.net/manual/en/reflection.getmodifiernames.php + * @param int $modifiers

+ * The modifiers to get, which is from a numeric value. + *

+ * @return array An array of modifier names. + */ + public static function getModifierNames ($modifiers) {} + + /** + * (PHP 5)
+ * Exports + * @link http://php.net/manual/en/reflection.export.php + * @param Reflector $reflector

+ * The reflection to export. + *

+ * @param bool $return [optional]

+ * Setting to TRUE will return the export, + * as opposed to emitting it. Setting to FALSE (the default) will do the opposite. + *

+ * @return string If the return parameter + * is set to TRUE, then the export is returned as a string, + * otherwise NULL is returned. + */ + public static function export (Reflector $reflector, $return = false) {} + +} + +/** + * Reflector is an interface implemented by all + * exportable Reflection classes. + * @link http://php.net/manual/en/class.reflector.php + */ +interface Reflector { + + /** + * (PHP 5)
+ * Exports + * @link http://php.net/manual/en/reflector.export.php + * @return string + */ + abstract public static function export (); + + /** + * (PHP 5)
+ * To string + * @link http://php.net/manual/en/reflector.tostring.php + * @return string + */ + abstract public function __toString (); + +} + +/** + * A parent class to ReflectionFunction, read its + * description for details. + * @link http://php.net/manual/en/class.reflectionfunctionabstract.php + * @jms-builtin + */ +class ReflectionFunctionAbstract implements Reflector { + public $name; + + + /** + * (PHP 5)
+ * Clones function + * @link http://php.net/manual/en/reflectionfunctionabstract.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5)
+ * To string + * @link http://php.net/manual/en/reflectionfunctionabstract.tostring.php + * @return void The string. + */ + abstract public function __toString (); + + /** + * (PHP 5 >= 5.3.0)
+ * Checks if function in namespace + * @link http://php.net/manual/en/reflectionfunctionabstract.innamespace.php + * @return bool TRUE if it's in a namespace, otherwise FALSE + */ + public function inNamespace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks if closure + * @link http://php.net/manual/en/reflectionfunctionabstract.isclosure.php + * @return bool TRUE if it's a closure, otherwise FALSE + */ + public function isClosure () {} + + /** + * (PHP 5)
+ * Checks if deprecated + * @link http://php.net/manual/en/reflectionfunctionabstract.isdeprecated.php + * @return bool TRUE if it's deprecated, otherwise FALSE + */ + public function isDeprecated () {} + + /** + * (PHP 5)
+ * Checks if is internal + * @link http://php.net/manual/en/reflectionfunctionabstract.isinternal.php + * @return bool TRUE if it's internal, otherwise FALSE + */ + public function isInternal () {} + + /** + * (PHP 5)
+ * Checks if user defined + * @link http://php.net/manual/en/reflectionfunctionabstract.isuserdefined.php + * @return bool TRUE if it's user-defined, otherwise false; + */ + public function isUserDefined () {} + + /** + * (No version information available, might only be in SVN)
+ * Returns this pointer bound to closure + * @link http://php.net/manual/en/reflectionfunctionabstract.getclosurethis.php + * @return object $this pointer. + * Returns NULL in case of an error. + */ + public function getClosureThis () {} + + public function getClosureScopeClass () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets doc comment + * @link http://php.net/manual/en/reflectionfunctionabstract.getdoccomment.php + * @return string The doc comment if it exists, otherwise FALSE + */ + public function getDocComment () {} + + /** + * (PHP 5)
+ * Gets end line number + * @link http://php.net/manual/en/reflectionfunctionabstract.getendline.php + * @return int The ending line number of the user defined function, or FALSE if unknown. + */ + public function getEndLine () {} + + /** + * (PHP 5)
+ * Gets extension info + * @link http://php.net/manual/en/reflectionfunctionabstract.getextension.php + * @return ReflectionExtension The extension information, as a ReflectionExtension object. + */ + public function getExtension () {} + + /** + * (PHP 5)
+ * Gets extension name + * @link http://php.net/manual/en/reflectionfunctionabstract.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * (PHP 5)
+ * Gets file name + * @link http://php.net/manual/en/reflectionfunctionabstract.getfilename.php + * @return string The file name. + */ + public function getFileName () {} + + /** + * (PHP 5)
+ * Gets function name + * @link http://php.net/manual/en/reflectionfunctionabstract.getname.php + * @return string The name of the function. + */ + public function getName () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets namespace name + * @link http://php.net/manual/en/reflectionfunctionabstract.getnamespacename.php + * @return string The namespace name. + */ + public function getNamespaceName () {} + + /** + * (PHP 5 >= 5.0.3)
+ * Gets number of parameters + * @link http://php.net/manual/en/reflectionfunctionabstract.getnumberofparameters.php + * @return int The number of parameters. + */ + public function getNumberOfParameters () {} + + /** + * (PHP 5 >= 5.0.3)
+ * Gets number of required parameters + * @link http://php.net/manual/en/reflectionfunctionabstract.getnumberofrequiredparameters.php + * @return int The number of required parameters. + */ + public function getNumberOfRequiredParameters () {} + + /** + * (PHP 5)
+ * Gets parameters + * @link http://php.net/manual/en/reflectionfunctionabstract.getparameters.php + * @return array The parameters, as a ReflectionParameter object. + */ + public function getParameters () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets function short name + * @link http://php.net/manual/en/reflectionfunctionabstract.getshortname.php + * @return string The short name of the function. + */ + public function getShortName () {} + + /** + * (PHP 5)
+ * Gets starting line number + * @link http://php.net/manual/en/reflectionfunctionabstract.getstartline.php + * @return int The starting line number. + */ + public function getStartLine () {} + + /** + * (PHP 5)
+ * Gets static variables + * @link http://php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php + * @return array An array of static variables. + */ + public function getStaticVariables () {} + + /** + * (PHP 5)
+ * Checks if returns reference + * @link http://php.net/manual/en/reflectionfunctionabstract.returnsreference.php + * @return bool TRUE if it returns a reference, otherwise FALSE + */ + public function returnsReference () {} + +} + +/** + * The ReflectionFunction class reports + * information about a function. + * @link http://php.net/manual/en/class.reflectionfunction.php + * @jms-builtin + */ +class ReflectionFunction extends ReflectionFunctionAbstract implements Reflector { + const IS_DEPRECATED = 262144; + + public $name; + + + /** + * (PHP 5)
+ * Constructs a ReflectionFunction object + * @link http://php.net/manual/en/reflectionfunction.construct.php + * @param mixed $name

+ * The name of the function to reflect or a closure. + *

+ */ + public function __construct ($name) {} + + /** + * (PHP 5)
+ * To string + * @link http://php.net/manual/en/reflectionfunction.tostring.php + * @return string ReflectionFunction::export-like output for + * the function. + */ + public function __toString () {} + + /** + * (PHP 5)
+ * Exports function + * @link http://php.net/manual/en/reflectionfunction.export.php + * @param string $name

+ * The reflection to export. + *

+ * @param string $return [optional]

+ * Setting to TRUE will return the export, + * as opposed to emitting it. Setting to FALSE (the default) will do the opposite. + *

+ * @return string If the return parameter + * is set to TRUE, then the export is returned as a string, + * otherwise NULL is returned. + */ + public static function export ($name, $return = null) {} + + /** + * (PHP 5)
+ * Checks if function is disabled + * @link http://php.net/manual/en/reflectionfunction.isdisabled.php + * @return bool TRUE if it's disable, otherwise FALSE + */ + public function isDisabled () {} + + /** + * (PHP 5)
+ * Invokes function + * @link http://php.net/manual/en/reflectionfunction.invoke.php + * @param mixed $parameter [optional] + * @param mixed $_ [optional] + * @return mixed the result of the invoked function call. + * + * @jms-variable-parameters + */ + public function invoke ($parameter = null, $_ = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Invokes function args + * @link http://php.net/manual/en/reflectionfunction.invokeargs.php + * @param array $args

+ * The passed arguments to the function as an array, much like + * call_user_func_array works. + *

+ * @return mixed the result of the invoked function + */ + public function invokeArgs (array $args) {} + + /** + * (No version information available, might only be in SVN)
+ * Returns a dynamically created closure for the function + * @link http://php.net/manual/en/reflectionfunction.getclosure.php + * @return Closure Closure. + * Returns NULL in case of an error. + */ + public function getClosure () {} + + /** + * (PHP 5)
+ * Clones function + * @link http://php.net/manual/en/reflectionfunctionabstract.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks if function in namespace + * @link http://php.net/manual/en/reflectionfunctionabstract.innamespace.php + * @return bool TRUE if it's in a namespace, otherwise FALSE + */ + public function inNamespace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks if closure + * @link http://php.net/manual/en/reflectionfunctionabstract.isclosure.php + * @return bool TRUE if it's a closure, otherwise FALSE + */ + public function isClosure () {} + + /** + * (PHP 5)
+ * Checks if deprecated + * @link http://php.net/manual/en/reflectionfunctionabstract.isdeprecated.php + * @return bool TRUE if it's deprecated, otherwise FALSE + */ + public function isDeprecated () {} + + /** + * (PHP 5)
+ * Checks if is internal + * @link http://php.net/manual/en/reflectionfunctionabstract.isinternal.php + * @return bool TRUE if it's internal, otherwise FALSE + */ + public function isInternal () {} + + /** + * (PHP 5)
+ * Checks if user defined + * @link http://php.net/manual/en/reflectionfunctionabstract.isuserdefined.php + * @return bool TRUE if it's user-defined, otherwise false; + */ + public function isUserDefined () {} + + /** + * (No version information available, might only be in SVN)
+ * Returns this pointer bound to closure + * @link http://php.net/manual/en/reflectionfunctionabstract.getclosurethis.php + * @return object $this pointer. + * Returns NULL in case of an error. + */ + public function getClosureThis () {} + + public function getClosureScopeClass () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets doc comment + * @link http://php.net/manual/en/reflectionfunctionabstract.getdoccomment.php + * @return string The doc comment if it exists, otherwise FALSE + */ + public function getDocComment () {} + + /** + * (PHP 5)
+ * Gets end line number + * @link http://php.net/manual/en/reflectionfunctionabstract.getendline.php + * @return int The ending line number of the user defined function, or FALSE if unknown. + */ + public function getEndLine () {} + + /** + * (PHP 5)
+ * Gets extension info + * @link http://php.net/manual/en/reflectionfunctionabstract.getextension.php + * @return ReflectionExtension The extension information, as a ReflectionExtension object. + */ + public function getExtension () {} + + /** + * (PHP 5)
+ * Gets extension name + * @link http://php.net/manual/en/reflectionfunctionabstract.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * (PHP 5)
+ * Gets file name + * @link http://php.net/manual/en/reflectionfunctionabstract.getfilename.php + * @return string The file name. + */ + public function getFileName () {} + + /** + * (PHP 5)
+ * Gets function name + * @link http://php.net/manual/en/reflectionfunctionabstract.getname.php + * @return string The name of the function. + */ + public function getName () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets namespace name + * @link http://php.net/manual/en/reflectionfunctionabstract.getnamespacename.php + * @return string The namespace name. + */ + public function getNamespaceName () {} + + /** + * (PHP 5 >= 5.0.3)
+ * Gets number of parameters + * @link http://php.net/manual/en/reflectionfunctionabstract.getnumberofparameters.php + * @return int The number of parameters. + */ + public function getNumberOfParameters () {} + + /** + * (PHP 5 >= 5.0.3)
+ * Gets number of required parameters + * @link http://php.net/manual/en/reflectionfunctionabstract.getnumberofrequiredparameters.php + * @return int The number of required parameters. + */ + public function getNumberOfRequiredParameters () {} + + /** + * (PHP 5)
+ * Gets parameters + * @link http://php.net/manual/en/reflectionfunctionabstract.getparameters.php + * @return array The parameters, as a ReflectionParameter object. + */ + public function getParameters () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets function short name + * @link http://php.net/manual/en/reflectionfunctionabstract.getshortname.php + * @return string The short name of the function. + */ + public function getShortName () {} + + /** + * (PHP 5)
+ * Gets starting line number + * @link http://php.net/manual/en/reflectionfunctionabstract.getstartline.php + * @return int The starting line number. + */ + public function getStartLine () {} + + /** + * (PHP 5)
+ * Gets static variables + * @link http://php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php + * @return array An array of static variables. + */ + public function getStaticVariables () {} + + /** + * (PHP 5)
+ * Checks if returns reference + * @link http://php.net/manual/en/reflectionfunctionabstract.returnsreference.php + * @return bool TRUE if it returns a reference, otherwise FALSE + */ + public function returnsReference () {} + +} + +/** + * The ReflectionParameter class retrieves + * information about function's or method's parameters. + * @link http://php.net/manual/en/class.reflectionparameter.php + * @jms-builtin + */ +class ReflectionParameter implements Reflector { + public $name; + + + /** + * (PHP 5)
+ * Clone + * @link http://php.net/manual/en/reflectionparameter.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5)
+ * Exports + * @link http://php.net/manual/en/reflectionparameter.export.php + * @param string $function

+ * The function name. + *

+ * @param string $parameter

+ * The parameter name. + *

+ * @param bool $return [optional]

+ * Setting to TRUE will return the export, + * as opposed to emitting it. Setting to FALSE (the default) will do the opposite. + *

+ * @return string The exported reflection. + */ + public static function export ($function, $parameter, $return = null) {} + + /** + * (PHP 5)
+ * Construct + * @link http://php.net/manual/en/reflectionparameter.construct.php + * @param string $function

+ * The function to reflect parameters from. + *

+ * @param string $parameter

+ * The parameter. + *

+ */ + public function __construct ($function, $parameter) {} + + /** + * (PHP 5)
+ * To string + * @link http://php.net/manual/en/reflectionparameter.tostring.php + * @return string + */ + public function __toString () {} + + /** + * (PHP 5)
+ * Gets parameter name + * @link http://php.net/manual/en/reflectionparameter.getname.php + * @return string The name of the reflected parameter. + */ + public function getName () {} + + /** + * (PHP 5)
+ * Checks if passed by reference + * @link http://php.net/manual/en/reflectionparameter.ispassedbyreference.php + * @return bool TRUE if the parameter is passed in by reference, otherwise FALSE + */ + public function isPassedByReference () {} + + /** + * (PHP >= 5.4.0)
+ * Returns whether this parameter can be passed by value + * @link http://php.net/manual/en/reflectionparameter.canbepassedbyvalue.php + * @return bool TRUE if the parameter can be passed by value, FALSE otherwise. + * Returns NULL in case of an error. + */ + public function canBePassedByValue () {} + + /** + * (PHP 5 >= 5.2.3)
+ * Gets declaring function + * @link http://php.net/manual/en/reflectionparameter.getdeclaringfunction.php + * @return ReflectionFunction A ReflectionFunction object. + */ + public function getDeclaringFunction () {} + + /** + * (PHP 5)
+ * Gets declaring class + * @link http://php.net/manual/en/reflectionparameter.getdeclaringclass.php + * @return ReflectionClass A ReflectionClass object. + */ + public function getDeclaringClass () {} + + /** + * (PHP 5)
+ * Get class + * @link http://php.net/manual/en/reflectionparameter.getclass.php + * @return ReflectionClass A ReflectionClass object. + */ + public function getClass () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks if parameter expects an array + * @link http://php.net/manual/en/reflectionparameter.isarray.php + * @return bool TRUE if an array is expected, FALSE otherwise. + */ + public function isArray () {} + + public function isCallable () {} + + /** + * (PHP 5)
+ * Checks if null is allowed + * @link http://php.net/manual/en/reflectionparameter.allowsnull.php + * @return bool TRUE if NULL is allowed, otherwise FALSE + */ + public function allowsNull () {} + + /** + * (PHP 5 >= 5.2.3)
+ * Gets parameter position + * @link http://php.net/manual/en/reflectionparameter.getposition.php + * @return int The position of the parameter, left to right, starting at position #0. + */ + public function getPosition () {} + + /** + * (PHP 5 >= 5.0.3)
+ * Checks if optional + * @link http://php.net/manual/en/reflectionparameter.isoptional.php + * @return bool TRUE if the parameter is optional, otherwise FALSE + */ + public function isOptional () {} + + /** + * (PHP 5 >= 5.0.3)
+ * Checks if a default value is available + * @link http://php.net/manual/en/reflectionparameter.isdefaultvalueavailable.php + * @return bool TRUE if a default value is available, otherwise FALSE + */ + public function isDefaultValueAvailable () {} + + /** + * (PHP 5 >= 5.0.3)
+ * Gets default parameter value + * @link http://php.net/manual/en/reflectionparameter.getdefaultvalue.php + * @return mixed The parameters default value. + */ + public function getDefaultValue () {} + +} + +/** + * The ReflectionMethod class reports + * information about a method. + * @link http://php.net/manual/en/class.reflectionmethod.php + * @jms-builtin + */ +class ReflectionMethod extends ReflectionFunctionAbstract implements Reflector { + const IS_STATIC = 1; + const IS_PUBLIC = 256; + const IS_PROTECTED = 512; + const IS_PRIVATE = 1024; + const IS_ABSTRACT = 2; + const IS_FINAL = 4; + + public $name; + public $class; + + + /** + * (PHP 5)
+ * Export a reflection method. + * @link http://php.net/manual/en/reflectionmethod.export.php + * @param string $class

+ * The class name. + *

+ * @param string $name

+ * The name of the method. + *

+ * @param bool $return [optional]

+ * Setting to TRUE will return the export, + * as opposed to emitting it. Setting to FALSE (the default) will do the opposite. + *

+ * @return string If the return parameter + * is set to TRUE, then the export is returned as a string, + * otherwise NULL is returned. + */ + public static function export ($class, $name, $return = false) {} + + /** + * (PHP 5)
+ * Constructs a ReflectionMethod + * @link http://php.net/manual/en/reflectionmethod.construct.php + * @param mixed $class

+ * Classname or object (instance of the class) that contains the method. + *

+ * @param string $name

+ * Name of the method. + *

+ */ + public function __construct ($class, $name) {} + + /** + * (PHP 5)
+ * Returns the string representation of the Reflection method object. + * @link http://php.net/manual/en/reflectionmethod.tostring.php + * @return string A string representation of this ReflectionMethod instance. + */ + public function __toString () {} + + /** + * (PHP 5)
+ * Checks if method is public + * @link http://php.net/manual/en/reflectionmethod.ispublic.php + * @return bool TRUE if the method is public, otherwise FALSE + */ + public function isPublic () {} + + /** + * (PHP 5)
+ * Checks if method is private + * @link http://php.net/manual/en/reflectionmethod.isprivate.php + * @return bool TRUE if the method is private, otherwise FALSE + */ + public function isPrivate () {} + + /** + * (PHP 5)
+ * Checks if method is protected + * @link http://php.net/manual/en/reflectionmethod.isprotected.php + * @return bool TRUE if the method is protected, otherwise FALSE + */ + public function isProtected () {} + + /** + * (PHP 5)
+ * Checks if method is abstract + * @link http://php.net/manual/en/reflectionmethod.isabstract.php + * @return bool TRUE if the method is abstract, otherwise FALSE + */ + public function isAbstract () {} + + /** + * (PHP 5)
+ * Checks if method is final + * @link http://php.net/manual/en/reflectionmethod.isfinal.php + * @return bool TRUE if the method is final, otherwise FALSE + */ + public function isFinal () {} + + /** + * (PHP 5)
+ * Checks if method is static + * @link http://php.net/manual/en/reflectionmethod.isstatic.php + * @return bool TRUE if the method is static, otherwise FALSE + */ + public function isStatic () {} + + /** + * (PHP 5)
+ * Checks if method is a constructor + * @link http://php.net/manual/en/reflectionmethod.isconstructor.php + * @return bool TRUE if the method is a constructor, otherwise FALSE + */ + public function isConstructor () {} + + /** + * (PHP 5)
+ * Checks if method is a destructor + * @link http://php.net/manual/en/reflectionmethod.isdestructor.php + * @return bool TRUE if the method is a destructor, otherwise FALSE + */ + public function isDestructor () {} + + /** + * (PHP >= 5.4.0)
+ * Returns a dynamically created closure for the method + * @link http://php.net/manual/en/reflectionmethod.getclosure.php + * @param string $object

+ * Forbidden for static methods, required for other methods. + *

+ * @return Closure Closure. + * Returns NULL in case of an error. + */ + public function getClosure ($object) {} + + /** + * (PHP 5)
+ * Gets the method modifiers + * @link http://php.net/manual/en/reflectionmethod.getmodifiers.php + * @return int A numeric representation of the modifiers. The modifiers are listed below. + * The actual meanings of these modifiers are described in the + * predefined constants. + */ + public function getModifiers () {} + + /** + * (PHP 5)
+ * Invoke + * @link http://php.net/manual/en/reflectionmethod.invoke.php + * @param object $object

+ * The object to invoke the method on. For static methods, pass + * null to this parameter. + *

+ * @param mixed $parameter [optional]

+ * Zero or more parameters to be passed to the method. + * It accepts a variable number of parameters which are passed to the method. + *

+ * @param mixed $_ [optional] + * @return mixed the method result. + * + * @jms-variable-parameters + */ + public function invoke ($object, $parameter = null, $_ = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Invoke args + * @link http://php.net/manual/en/reflectionmethod.invokeargs.php + * @param object $object

+ * The object to invoke the method on. In case of static methods, you can pass + * null to this parameter. + *

+ * @param array $args

+ * The parameters to be passed to the function, as an array. + *

+ * @return mixed the method result. + */ + public function invokeArgs ($object, array $args) {} + + /** + * (PHP 5)
+ * Gets declaring class for the reflected method. + * @link http://php.net/manual/en/reflectionmethod.getdeclaringclass.php + * @return ReflectionClass A ReflectionClass object of the class that the + * reflected method is part of. + */ + public function getDeclaringClass () {} + + /** + * (PHP 5)
+ * Gets the method prototype (if there is one). + * @link http://php.net/manual/en/reflectionmethod.getprototype.php + * @return ReflectionMethod A ReflectionMethod instance of the method prototype. + */ + public function getPrototype () {} + + /** + * (PHP 5 >= 5.3.2)
+ * Set method accessibility + * @link http://php.net/manual/en/reflectionmethod.setaccessible.php + * @param bool $accessible

+ * TRUE to allow accessibility, or FALSE. + *

+ * @return void No value is returned. + */ + public function setAccessible ($accessible) {} + + /** + * (PHP 5)
+ * Clones function + * @link http://php.net/manual/en/reflectionfunctionabstract.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks if function in namespace + * @link http://php.net/manual/en/reflectionfunctionabstract.innamespace.php + * @return bool TRUE if it's in a namespace, otherwise FALSE + */ + public function inNamespace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks if closure + * @link http://php.net/manual/en/reflectionfunctionabstract.isclosure.php + * @return bool TRUE if it's a closure, otherwise FALSE + */ + public function isClosure () {} + + /** + * (PHP 5)
+ * Checks if deprecated + * @link http://php.net/manual/en/reflectionfunctionabstract.isdeprecated.php + * @return bool TRUE if it's deprecated, otherwise FALSE + */ + public function isDeprecated () {} + + /** + * (PHP 5)
+ * Checks if is internal + * @link http://php.net/manual/en/reflectionfunctionabstract.isinternal.php + * @return bool TRUE if it's internal, otherwise FALSE + */ + public function isInternal () {} + + /** + * (PHP 5)
+ * Checks if user defined + * @link http://php.net/manual/en/reflectionfunctionabstract.isuserdefined.php + * @return bool TRUE if it's user-defined, otherwise false; + */ + public function isUserDefined () {} + + /** + * (No version information available, might only be in SVN)
+ * Returns this pointer bound to closure + * @link http://php.net/manual/en/reflectionfunctionabstract.getclosurethis.php + * @return object $this pointer. + * Returns NULL in case of an error. + */ + public function getClosureThis () {} + + public function getClosureScopeClass () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets doc comment + * @link http://php.net/manual/en/reflectionfunctionabstract.getdoccomment.php + * @return string The doc comment if it exists, otherwise FALSE + */ + public function getDocComment () {} + + /** + * (PHP 5)
+ * Gets end line number + * @link http://php.net/manual/en/reflectionfunctionabstract.getendline.php + * @return int The ending line number of the user defined function, or FALSE if unknown. + */ + public function getEndLine () {} + + /** + * (PHP 5)
+ * Gets extension info + * @link http://php.net/manual/en/reflectionfunctionabstract.getextension.php + * @return ReflectionExtension The extension information, as a ReflectionExtension object. + */ + public function getExtension () {} + + /** + * (PHP 5)
+ * Gets extension name + * @link http://php.net/manual/en/reflectionfunctionabstract.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * (PHP 5)
+ * Gets file name + * @link http://php.net/manual/en/reflectionfunctionabstract.getfilename.php + * @return string The file name. + */ + public function getFileName () {} + + /** + * (PHP 5)
+ * Gets function name + * @link http://php.net/manual/en/reflectionfunctionabstract.getname.php + * @return string The name of the function. + */ + public function getName () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets namespace name + * @link http://php.net/manual/en/reflectionfunctionabstract.getnamespacename.php + * @return string The namespace name. + */ + public function getNamespaceName () {} + + /** + * (PHP 5 >= 5.0.3)
+ * Gets number of parameters + * @link http://php.net/manual/en/reflectionfunctionabstract.getnumberofparameters.php + * @return int The number of parameters. + */ + public function getNumberOfParameters () {} + + /** + * (PHP 5 >= 5.0.3)
+ * Gets number of required parameters + * @link http://php.net/manual/en/reflectionfunctionabstract.getnumberofrequiredparameters.php + * @return int The number of required parameters. + */ + public function getNumberOfRequiredParameters () {} + + /** + * (PHP 5)
+ * Gets parameters + * @link http://php.net/manual/en/reflectionfunctionabstract.getparameters.php + * @return array The parameters, as a ReflectionParameter object. + */ + public function getParameters () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets function short name + * @link http://php.net/manual/en/reflectionfunctionabstract.getshortname.php + * @return string The short name of the function. + */ + public function getShortName () {} + + /** + * (PHP 5)
+ * Gets starting line number + * @link http://php.net/manual/en/reflectionfunctionabstract.getstartline.php + * @return int The starting line number. + */ + public function getStartLine () {} + + /** + * (PHP 5)
+ * Gets static variables + * @link http://php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php + * @return array An array of static variables. + */ + public function getStaticVariables () {} + + /** + * (PHP 5)
+ * Checks if returns reference + * @link http://php.net/manual/en/reflectionfunctionabstract.returnsreference.php + * @return bool TRUE if it returns a reference, otherwise FALSE + */ + public function returnsReference () {} + +} + +/** + * The ReflectionClass class reports + * information about a class. + * @link http://php.net/manual/en/class.reflectionclass.php + * @jms-builtin + */ +class ReflectionClass implements Reflector { + const IS_IMPLICIT_ABSTRACT = 16; + const IS_EXPLICIT_ABSTRACT = 32; + const IS_FINAL = 64; + + public $name; + + + /** + * (PHP 5)
+ * Clones object + * @link http://php.net/manual/en/reflectionclass.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5)
+ * Exports a class + * @link http://php.net/manual/en/reflectionclass.export.php + * @param mixed $argument

+ * The reflection to export. + *

+ * @param bool $return [optional]

+ * Setting to TRUE will return the export, + * as opposed to emitting it. Setting to FALSE (the default) will do the opposite. + *

+ * @return string If the return parameter + * is set to TRUE, then the export is returned as a string, + * otherwise NULL is returned. + */ + public static function export ($argument, $return = false) {} + + /** + * (PHP 5)
+ * Constructs a ReflectionClass + * @link http://php.net/manual/en/reflectionclass.construct.php + * @param mixed $argument

+ * Either a string containing the name of the class to + * reflect, or an object. + *

+ */ + public function __construct ($argument) {} + + /** + * (PHP 5)
+ * Returns the string representation of the ReflectionClass object. + * @link http://php.net/manual/en/reflectionclass.tostring.php + * @return string A string representation of this ReflectionClass instance. + */ + public function __toString () {} + + /** + * (PHP 5)
+ * Gets class name + * @link http://php.net/manual/en/reflectionclass.getname.php + * @return string The class name. + */ + public function getName () {} + + /** + * (PHP 5)
+ * Checks if internal + * @link http://php.net/manual/en/reflectionclass.isinternal.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isInternal () {} + + /** + * (PHP 5)
+ * Checks if user defined + * @link http://php.net/manual/en/reflectionclass.isuserdefined.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isUserDefined () {} + + /** + * (PHP 5)
+ * Checks if instantiable + * @link http://php.net/manual/en/reflectionclass.isinstantiable.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isInstantiable () {} + + /** + * (PHP >= 5.4.0)
+ * Returns whether this class is cloneable + * @link http://php.net/manual/en/reflectionclass.iscloneable.php + * @return bool TRUE if the class is cloneable, FALSE otherwise. + */ + public function isCloneable () {} + + /** + * (PHP 5)
+ * Gets the filename of the file in which the class has been defined + * @link http://php.net/manual/en/reflectionclass.getfilename.php + * @return string the filename of the file in which the class has been defined. + * If the class is defined in the PHP core or in a PHP extension, FALSE + * is returned. + */ + public function getFileName () {} + + /** + * (PHP 5)
+ * Gets starting line number + * @link http://php.net/manual/en/reflectionclass.getstartline.php + * @return int The starting line number, as an integer. + */ + public function getStartLine () {} + + /** + * (PHP 5)
+ * Gets end line + * @link http://php.net/manual/en/reflectionclass.getendline.php + * @return int The ending line number of the user defined class, or FALSE if unknown. + */ + public function getEndLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets doc comments + * @link http://php.net/manual/en/reflectionclass.getdoccomment.php + * @return string The doc comment if it exists, otherwise FALSE + */ + public function getDocComment () {} + + /** + * (PHP 5)
+ * Gets constructor + * @link http://php.net/manual/en/reflectionclass.getconstructor.php + * @return object A ReflectionMethod object. + */ + public function getConstructor () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks if method is defined + * @link http://php.net/manual/en/reflectionclass.hasmethod.php + * @param string $name

+ * Name of the method being checked for. + *

+ * @return bool TRUE if it has the method, otherwise FALSE + */ + public function hasMethod ($name) {} + + /** + * (PHP 5)
+ * Gets a ReflectionMethod + * @link http://php.net/manual/en/reflectionclass.getmethod.php + * @param string $name

+ * The method name to reflect. + *

+ * @return ReflectionMethod A ReflectionMethod. + */ + public function getMethod ($name) {} + + /** + * (PHP 5)
+ * Gets a list of methods + * @link http://php.net/manual/en/reflectionclass.getmethods.php + * @param string $filter [optional]

+ * Any combination of ReflectionMethod::IS_STATIC, + * ReflectionMethod::IS_PUBLIC, + * ReflectionMethod::IS_PROTECTED, + * ReflectionMethod::IS_PRIVATE, + * ReflectionMethod::IS_ABSTRACT, + * ReflectionMethod::IS_FINAL. + *

+ * @return array An array of methods. + */ + public function getMethods ($filter = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks if property is defined + * @link http://php.net/manual/en/reflectionclass.hasproperty.php + * @param string $name

+ * Name of the property being checked for. + *

+ * @return bool TRUE if it has the property, otherwise FALSE + */ + public function hasProperty ($name) {} + + /** + * (PHP 5)
+ * Gets property + * @link http://php.net/manual/en/reflectionclass.getproperty.php + * @param string $name

+ * The property name. + *

+ * @return ReflectionProperty A ReflectionProperty. + */ + public function getProperty ($name) {} + + /** + * (PHP 5)
+ * Gets properties + * @link http://php.net/manual/en/reflectionclass.getproperties.php + * @param int $filter [optional]

+ * The optional filter, for filtering desired property types. It's configured using + * the ReflectionProperty constants, + * and defaults to all property types. + *

+ * @return array An array of ReflectionProperty objects. + */ + public function getProperties ($filter = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks if constant is defined + * @link http://php.net/manual/en/reflectionclass.hasconstant.php + * @param string $name

+ * The name of the constant being checked for. + *

+ * @return bool TRUE if the constant is defined, otherwise FALSE. + */ + public function hasConstant ($name) {} + + /** + * (PHP 5)
+ * Gets constants + * @link http://php.net/manual/en/reflectionclass.getconstants.php + * @return array An array of constants. + * Constant name in key, constant value in value. + */ + public function getConstants () {} + + /** + * (PHP 5)
+ * Gets defined constant + * @link http://php.net/manual/en/reflectionclass.getconstant.php + * @param string $name

+ * Name of the constant. + *

+ * @return mixed Value of the constant. + */ + public function getConstant ($name) {} + + /** + * (PHP 5)
+ * Gets the interfaces + * @link http://php.net/manual/en/reflectionclass.getinterfaces.php + * @return array An associative array of interfaces, with keys as interface + * names and the array values as ReflectionClass objects. + */ + public function getInterfaces () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Gets the interface names + * @link http://php.net/manual/en/reflectionclass.getinterfacenames.php + * @return array A numerical array with interface names as the values. + */ + public function getInterfaceNames () {} + + /** + * (PHP 5)
+ * Checks if interface + * @link http://php.net/manual/en/reflectionclass.isinterface.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isInterface () {} + + /** + * (PHP >= 5.4.0)
+ * Returns an array of traits used by this class + * @link http://php.net/manual/en/reflectionclass.gettraits.php + * @return array an array with trait names in keys and instances of trait's + * ReflectionClass in values. + * Returns NULL in case of an error. + */ + public function getTraits () {} + + /** + * (PHP >= 5.4.0)
+ * Returns an array of names of traits used by this class + * @link http://php.net/manual/en/reflectionclass.gettraitnames.php + * @return array an array with trait names in values. + * Returns NULL in case of an error. + */ + public function getTraitNames () {} + + /** + * (PHP >= 5.4.0)
+ * Returns an array of trait aliases + * @link http://php.net/manual/en/reflectionclass.gettraitaliases.php + * @return array an array with new method names in keys and original names (in the + * format "TraitName::original") in values. + * Returns NULL in case of an error. + */ + public function getTraitAliases () {} + + /** + * (PHP >= 5.4.0)
+ * Returns whether this is a trait + * @link http://php.net/manual/en/reflectionclass.istrait.php + * @return bool TRUE if this is a trait, FALSE otherwise. + * Returns NULL in case of an error. + */ + public function isTrait () {} + + /** + * (PHP 5)
+ * Checks if class is abstract + * @link http://php.net/manual/en/reflectionclass.isabstract.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isAbstract () {} + + /** + * (PHP 5)
+ * Checks if class is final + * @link http://php.net/manual/en/reflectionclass.isfinal.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isFinal () {} + + /** + * (PHP 5)
+ * Gets modifiers + * @link http://php.net/manual/en/reflectionclass.getmodifiers.php + * @return int bitmask of + * modifier constants. + */ + public function getModifiers () {} + + /** + * (PHP 5)
+ * Checks class for instance + * @link http://php.net/manual/en/reflectionclass.isinstance.php + * @param object $object

+ * The object being compared to. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isInstance ($object) {} + + /** + * (PHP 5)
+ * Creates a new class instance from given arguments. + * @link http://php.net/manual/en/reflectionclass.newinstance.php + * @param mixed $args

+ * Accepts a variable number of arguments which are passed to the class + * constructor, much like call_user_func. + *

+ * @param mixed $_ [optional] + * @return object + */ + public function newInstance ($args, $_ = null) {} + + /** + * (PHP >= 5.4.0)
+ * Creates a new class instance without invoking the constructor. + * @link http://php.net/manual/en/reflectionclass.newinstancewithoutconstructor.php + * @return object + */ + public function newInstanceWithoutConstructor () {} + + /** + * (PHP 5 >= 5.1.3)
+ * Creates a new class instance from given arguments. + * @link http://php.net/manual/en/reflectionclass.newinstanceargs.php + * @param array $args [optional]

+ * The parameters to be passed to the class constructor as an array. + *

+ * @return object a new instance of the class. + */ + public function newInstanceArgs (array $args = null) {} + + /** + * (PHP 5)
+ * Gets parent class + * @link http://php.net/manual/en/reflectionclass.getparentclass.php + * @return object A ReflectionClass. + */ + public function getParentClass () {} + + /** + * (PHP 5)
+ * Checks if a subclass + * @link http://php.net/manual/en/reflectionclass.issubclassof.php + * @param string $class

+ * The class name being checked against. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSubclassOf ($class) {} + + /** + * (PHP 5)
+ * Gets static properties + * @link http://php.net/manual/en/reflectionclass.getstaticproperties.php + * @return array The static properties, as an array. + */ + public function getStaticProperties () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets static property value + * @link http://php.net/manual/en/reflectionclass.getstaticpropertyvalue.php + * @param string $name

+ *

+ * @param string $default [optional]

+ *

+ * @return mixed + */ + public function getStaticPropertyValue ($name, $default = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Sets static property value + * @link http://php.net/manual/en/reflectionclass.setstaticpropertyvalue.php + * @param string $name

+ * Property name. + *

+ * @param string $value

+ * New property value. + *

+ * @return void No value is returned. + */ + public function setStaticPropertyValue ($name, $value) {} + + /** + * (PHP 5)
+ * Gets default properties + * @link http://php.net/manual/en/reflectionclass.getdefaultproperties.php + * @return array An array of default properties, with the key being the name of + * the property and the value being the default value of the property or NULL + * if the property doesn't have a default value. The function does not distinguish + * between static and non static properties and does not take visibility modifiers + * into account. + */ + public function getDefaultProperties () {} + + /** + * (PHP 5)
+ * Checks if iterateable + * @link http://php.net/manual/en/reflectionclass.isiterateable.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isIterateable () {} + + /** + * (PHP 5)
+ * Implements interface + * @link http://php.net/manual/en/reflectionclass.implementsinterface.php + * @param string $interface

+ * The interface name. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function implementsInterface ($interface) {} + + /** + * (PHP 5)
+ * Gets extension info + * @link http://php.net/manual/en/reflectionclass.getextension.php + * @return ReflectionExtension A ReflectionExtension object. + */ + public function getExtension () {} + + /** + * (PHP 5)
+ * Gets an extensions name + * @link http://php.net/manual/en/reflectionclass.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks if in namespace + * @link http://php.net/manual/en/reflectionclass.innamespace.php + * @return bool TRUE on success or FALSE on failure. + */ + public function inNamespace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets namespace name + * @link http://php.net/manual/en/reflectionclass.getnamespacename.php + * @return string The namespace name. + */ + public function getNamespaceName () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets short name + * @link http://php.net/manual/en/reflectionclass.getshortname.php + * @return string The class short name. + */ + public function getShortName () {} + +} + +/** + * The ReflectionObject class reports + * information about an object. + * @link http://php.net/manual/en/class.reflectionobject.php + * @jms-builtin + */ +class ReflectionObject extends ReflectionClass implements Reflector { + const IS_IMPLICIT_ABSTRACT = 16; + const IS_EXPLICIT_ABSTRACT = 32; + const IS_FINAL = 64; + + public $name; + + + /** + * (PHP 5)
+ * Export + * @link http://php.net/manual/en/reflectionobject.export.php + * @param string $argument

+ * The reflection to export. + *

+ * @param bool $return [optional]

+ * Setting to TRUE will return the export, + * as opposed to emitting it. Setting to FALSE (the default) will do the opposite. + *

+ * @return string If the return parameter + * is set to TRUE, then the export is returned as a string, + * otherwise NULL is returned. + */ + public static function export ($argument, $return = null) {} + + /** + * (PHP 5)
+ * Constructs a ReflectionObject + * @link http://php.net/manual/en/reflectionobject.construct.php + * @param object $argument

+ * An object instance. + *

+ */ + public function __construct ($argument) {} + + /** + * (PHP 5)
+ * Clones object + * @link http://php.net/manual/en/reflectionclass.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5)
+ * Returns the string representation of the ReflectionClass object. + * @link http://php.net/manual/en/reflectionclass.tostring.php + * @return string A string representation of this ReflectionClass instance. + */ + public function __toString () {} + + /** + * (PHP 5)
+ * Gets class name + * @link http://php.net/manual/en/reflectionclass.getname.php + * @return string The class name. + */ + public function getName () {} + + /** + * (PHP 5)
+ * Checks if internal + * @link http://php.net/manual/en/reflectionclass.isinternal.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isInternal () {} + + /** + * (PHP 5)
+ * Checks if user defined + * @link http://php.net/manual/en/reflectionclass.isuserdefined.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isUserDefined () {} + + /** + * (PHP 5)
+ * Checks if instantiable + * @link http://php.net/manual/en/reflectionclass.isinstantiable.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isInstantiable () {} + + /** + * (PHP >= 5.4.0)
+ * Returns whether this class is cloneable + * @link http://php.net/manual/en/reflectionclass.iscloneable.php + * @return bool TRUE if the class is cloneable, FALSE otherwise. + */ + public function isCloneable () {} + + /** + * (PHP 5)
+ * Gets the filename of the file in which the class has been defined + * @link http://php.net/manual/en/reflectionclass.getfilename.php + * @return string the filename of the file in which the class has been defined. + * If the class is defined in the PHP core or in a PHP extension, FALSE + * is returned. + */ + public function getFileName () {} + + /** + * (PHP 5)
+ * Gets starting line number + * @link http://php.net/manual/en/reflectionclass.getstartline.php + * @return int The starting line number, as an integer. + */ + public function getStartLine () {} + + /** + * (PHP 5)
+ * Gets end line + * @link http://php.net/manual/en/reflectionclass.getendline.php + * @return int The ending line number of the user defined class, or FALSE if unknown. + */ + public function getEndLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets doc comments + * @link http://php.net/manual/en/reflectionclass.getdoccomment.php + * @return string The doc comment if it exists, otherwise FALSE + */ + public function getDocComment () {} + + /** + * (PHP 5)
+ * Gets constructor + * @link http://php.net/manual/en/reflectionclass.getconstructor.php + * @return object A ReflectionMethod object. + */ + public function getConstructor () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks if method is defined + * @link http://php.net/manual/en/reflectionclass.hasmethod.php + * @param string $name

+ * Name of the method being checked for. + *

+ * @return bool TRUE if it has the method, otherwise FALSE + */ + public function hasMethod ($name) {} + + /** + * (PHP 5)
+ * Gets a ReflectionMethod + * @link http://php.net/manual/en/reflectionclass.getmethod.php + * @param string $name

+ * The method name to reflect. + *

+ * @return ReflectionMethod A ReflectionMethod. + */ + public function getMethod ($name) {} + + /** + * (PHP 5)
+ * Gets a list of methods + * @link http://php.net/manual/en/reflectionclass.getmethods.php + * @param string $filter [optional]

+ * Any combination of ReflectionMethod::IS_STATIC, + * ReflectionMethod::IS_PUBLIC, + * ReflectionMethod::IS_PROTECTED, + * ReflectionMethod::IS_PRIVATE, + * ReflectionMethod::IS_ABSTRACT, + * ReflectionMethod::IS_FINAL. + *

+ * @return array An array of methods. + */ + public function getMethods ($filter = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks if property is defined + * @link http://php.net/manual/en/reflectionclass.hasproperty.php + * @param string $name

+ * Name of the property being checked for. + *

+ * @return bool TRUE if it has the property, otherwise FALSE + */ + public function hasProperty ($name) {} + + /** + * (PHP 5)
+ * Gets property + * @link http://php.net/manual/en/reflectionclass.getproperty.php + * @param string $name

+ * The property name. + *

+ * @return ReflectionProperty A ReflectionProperty. + */ + public function getProperty ($name) {} + + /** + * (PHP 5)
+ * Gets properties + * @link http://php.net/manual/en/reflectionclass.getproperties.php + * @param int $filter [optional]

+ * The optional filter, for filtering desired property types. It's configured using + * the ReflectionProperty constants, + * and defaults to all property types. + *

+ * @return array An array of ReflectionProperty objects. + */ + public function getProperties ($filter = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks if constant is defined + * @link http://php.net/manual/en/reflectionclass.hasconstant.php + * @param string $name

+ * The name of the constant being checked for. + *

+ * @return bool TRUE if the constant is defined, otherwise FALSE. + */ + public function hasConstant ($name) {} + + /** + * (PHP 5)
+ * Gets constants + * @link http://php.net/manual/en/reflectionclass.getconstants.php + * @return array An array of constants. + * Constant name in key, constant value in value. + */ + public function getConstants () {} + + /** + * (PHP 5)
+ * Gets defined constant + * @link http://php.net/manual/en/reflectionclass.getconstant.php + * @param string $name

+ * Name of the constant. + *

+ * @return mixed Value of the constant. + */ + public function getConstant ($name) {} + + /** + * (PHP 5)
+ * Gets the interfaces + * @link http://php.net/manual/en/reflectionclass.getinterfaces.php + * @return array An associative array of interfaces, with keys as interface + * names and the array values as ReflectionClass objects. + */ + public function getInterfaces () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Gets the interface names + * @link http://php.net/manual/en/reflectionclass.getinterfacenames.php + * @return array A numerical array with interface names as the values. + */ + public function getInterfaceNames () {} + + /** + * (PHP 5)
+ * Checks if interface + * @link http://php.net/manual/en/reflectionclass.isinterface.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isInterface () {} + + /** + * (PHP >= 5.4.0)
+ * Returns an array of traits used by this class + * @link http://php.net/manual/en/reflectionclass.gettraits.php + * @return array an array with trait names in keys and instances of trait's + * ReflectionClass in values. + * Returns NULL in case of an error. + */ + public function getTraits () {} + + /** + * (PHP >= 5.4.0)
+ * Returns an array of names of traits used by this class + * @link http://php.net/manual/en/reflectionclass.gettraitnames.php + * @return array an array with trait names in values. + * Returns NULL in case of an error. + */ + public function getTraitNames () {} + + /** + * (PHP >= 5.4.0)
+ * Returns an array of trait aliases + * @link http://php.net/manual/en/reflectionclass.gettraitaliases.php + * @return array an array with new method names in keys and original names (in the + * format "TraitName::original") in values. + * Returns NULL in case of an error. + */ + public function getTraitAliases () {} + + /** + * (PHP >= 5.4.0)
+ * Returns whether this is a trait + * @link http://php.net/manual/en/reflectionclass.istrait.php + * @return bool TRUE if this is a trait, FALSE otherwise. + * Returns NULL in case of an error. + */ + public function isTrait () {} + + /** + * (PHP 5)
+ * Checks if class is abstract + * @link http://php.net/manual/en/reflectionclass.isabstract.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isAbstract () {} + + /** + * (PHP 5)
+ * Checks if class is final + * @link http://php.net/manual/en/reflectionclass.isfinal.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isFinal () {} + + /** + * (PHP 5)
+ * Gets modifiers + * @link http://php.net/manual/en/reflectionclass.getmodifiers.php + * @return int bitmask of + * modifier constants. + */ + public function getModifiers () {} + + /** + * (PHP 5)
+ * Checks class for instance + * @link http://php.net/manual/en/reflectionclass.isinstance.php + * @param object $object

+ * The object being compared to. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isInstance ($object) {} + + /** + * (PHP 5)
+ * Creates a new class instance from given arguments. + * @link http://php.net/manual/en/reflectionclass.newinstance.php + * @param mixed $args

+ * Accepts a variable number of arguments which are passed to the class + * constructor, much like call_user_func. + *

+ * @param mixed $_ [optional] + * @return object + */ + public function newInstance ($args, $_ = null) {} + + /** + * (PHP >= 5.4.0)
+ * Creates a new class instance without invoking the constructor. + * @link http://php.net/manual/en/reflectionclass.newinstancewithoutconstructor.php + * @return object + */ + public function newInstanceWithoutConstructor () {} + + /** + * (PHP 5 >= 5.1.3)
+ * Creates a new class instance from given arguments. + * @link http://php.net/manual/en/reflectionclass.newinstanceargs.php + * @param array $args [optional]

+ * The parameters to be passed to the class constructor as an array. + *

+ * @return object a new instance of the class. + */ + public function newInstanceArgs (array $args = null) {} + + /** + * (PHP 5)
+ * Gets parent class + * @link http://php.net/manual/en/reflectionclass.getparentclass.php + * @return object A ReflectionClass. + */ + public function getParentClass () {} + + /** + * (PHP 5)
+ * Checks if a subclass + * @link http://php.net/manual/en/reflectionclass.issubclassof.php + * @param string $class

+ * The class name being checked against. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSubclassOf ($class) {} + + /** + * (PHP 5)
+ * Gets static properties + * @link http://php.net/manual/en/reflectionclass.getstaticproperties.php + * @return array The static properties, as an array. + */ + public function getStaticProperties () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets static property value + * @link http://php.net/manual/en/reflectionclass.getstaticpropertyvalue.php + * @param string $name

+ *

+ * @param string $default [optional]

+ *

+ * @return mixed + */ + public function getStaticPropertyValue ($name, $default = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Sets static property value + * @link http://php.net/manual/en/reflectionclass.setstaticpropertyvalue.php + * @param string $name

+ * Property name. + *

+ * @param string $value

+ * New property value. + *

+ * @return void No value is returned. + */ + public function setStaticPropertyValue ($name, $value) {} + + /** + * (PHP 5)
+ * Gets default properties + * @link http://php.net/manual/en/reflectionclass.getdefaultproperties.php + * @return array An array of default properties, with the key being the name of + * the property and the value being the default value of the property or NULL + * if the property doesn't have a default value. The function does not distinguish + * between static and non static properties and does not take visibility modifiers + * into account. + */ + public function getDefaultProperties () {} + + /** + * (PHP 5)
+ * Checks if iterateable + * @link http://php.net/manual/en/reflectionclass.isiterateable.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isIterateable () {} + + /** + * (PHP 5)
+ * Implements interface + * @link http://php.net/manual/en/reflectionclass.implementsinterface.php + * @param string $interface

+ * The interface name. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function implementsInterface ($interface) {} + + /** + * (PHP 5)
+ * Gets extension info + * @link http://php.net/manual/en/reflectionclass.getextension.php + * @return ReflectionExtension A ReflectionExtension object. + */ + public function getExtension () {} + + /** + * (PHP 5)
+ * Gets an extensions name + * @link http://php.net/manual/en/reflectionclass.getextensionname.php + * @return string The extensions name. + */ + public function getExtensionName () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks if in namespace + * @link http://php.net/manual/en/reflectionclass.innamespace.php + * @return bool TRUE on success or FALSE on failure. + */ + public function inNamespace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets namespace name + * @link http://php.net/manual/en/reflectionclass.getnamespacename.php + * @return string The namespace name. + */ + public function getNamespaceName () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets short name + * @link http://php.net/manual/en/reflectionclass.getshortname.php + * @return string The class short name. + */ + public function getShortName () {} + +} + +/** + * The ReflectionProperty class reports + * information about classes properties. + * @link http://php.net/manual/en/class.reflectionproperty.php + * @jms-builtin + */ +class ReflectionProperty implements Reflector { + const IS_STATIC = 1; + const IS_PUBLIC = 256; + const IS_PROTECTED = 512; + const IS_PRIVATE = 1024; + + public $name; + public $class; + + + /** + * (PHP 5)
+ * Clone + * @link http://php.net/manual/en/reflectionproperty.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5)
+ * Export + * @link http://php.net/manual/en/reflectionproperty.export.php + * @param mixed $class + * @param string $name

+ * The property name. + *

+ * @param bool $return [optional]

+ * Setting to TRUE will return the export, + * as opposed to emitting it. Setting to FALSE (the default) will do the opposite. + *

+ * @return string + */ + public static function export ($class, $name, $return = null) {} + + /** + * (PHP 5)
+ * Construct a ReflectionProperty object + * @link http://php.net/manual/en/reflectionproperty.construct.php + * @param mixed $class

+ * The class name, that contains the property. + *

+ * @param string $name

+ * The name of the property being reflected. + *

+ */ + public function __construct ($class, $name) {} + + /** + * (PHP 5)
+ * To string + * @link http://php.net/manual/en/reflectionproperty.tostring.php + * @return string + */ + public function __toString () {} + + /** + * (PHP 5)
+ * Gets property name + * @link http://php.net/manual/en/reflectionproperty.getname.php + * @return string The name of the reflected property. + */ + public function getName () {} + + /** + * (PHP 5)
+ * Gets value + * @link http://php.net/manual/en/reflectionproperty.getvalue.php + * @param object $object

+ * If the property is non-static an object must be provided to fetch the + * property from. If you want to fetch the default property without + * providing an object use ReflectionClass::getDefaultProperties + * instead. + *

+ * @return mixed The current value of the property. + */ + public function getValue ($object) {} + + /** + * (PHP 5)
+ * Set property value + * @link http://php.net/manual/en/reflectionproperty.setvalue.php + * @param object $object

+ * If the property is non-static an object must be provided to change + * the property on. If the property is static this parameter is left + * out and only value needs to be provided. + *

+ * @param mixed $value

+ * The new value. + *

+ * @return void No value is returned. + */ + public function setValue ($object, $value) {} + + /** + * (PHP 5)
+ * Checks if property is public + * @link http://php.net/manual/en/reflectionproperty.ispublic.php + * @return bool TRUE if the property is public, FALSE otherwise. + */ + public function isPublic () {} + + /** + * (PHP 5)
+ * Checks if property is private + * @link http://php.net/manual/en/reflectionproperty.isprivate.php + * @return bool TRUE if the property is private, FALSE otherwise. + */ + public function isPrivate () {} + + /** + * (PHP 5)
+ * Checks if property is protected + * @link http://php.net/manual/en/reflectionproperty.isprotected.php + * @return bool TRUE if the property is protected, FALSE otherwise. + */ + public function isProtected () {} + + /** + * (PHP 5)
+ * Checks if property is static + * @link http://php.net/manual/en/reflectionproperty.isstatic.php + * @return bool TRUE if the property is static, FALSE otherwise. + */ + public function isStatic () {} + + /** + * (PHP 5)
+ * Checks if default value + * @link http://php.net/manual/en/reflectionproperty.isdefault.php + * @return bool TRUE if the property was declared at compile-time, or FALSE if + * it was created at run-time. + */ + public function isDefault () {} + + /** + * (PHP 5)
+ * Gets modifiers + * @link http://php.net/manual/en/reflectionproperty.getmodifiers.php + * @return int A numeric representation of the modifiers. + */ + public function getModifiers () {} + + /** + * (PHP 5)
+ * Gets declaring class + * @link http://php.net/manual/en/reflectionproperty.getdeclaringclass.php + * @return ReflectionClass A ReflectionClass object. + */ + public function getDeclaringClass () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets doc comment + * @link http://php.net/manual/en/reflectionproperty.getdoccomment.php + * @return string The doc comment. + */ + public function getDocComment () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Set property accessibility + * @link http://php.net/manual/en/reflectionproperty.setaccessible.php + * @param bool $accessible

+ * TRUE to allow accessibility, or FALSE. + *

+ * @return void No value is returned. + */ + public function setAccessible ($accessible) {} + +} + +/** + * The ReflectionExtension class reports + * information about an extension. + * @link http://php.net/manual/en/class.reflectionextension.php + * @jms-builtin + */ +class ReflectionExtension implements Reflector { + public $name; + + + /** + * (PHP 5)
+ * Clones + * @link http://php.net/manual/en/reflectionextension.clone.php + * @return void No value is returned, if called a fatal error will occur. + */ + final private function __clone () {} + + /** + * (PHP 5)
+ * Export + * @link http://php.net/manual/en/reflectionextension.export.php + * @param string $name

+ * The reflection to export. + *

+ * @param string $return [optional]

+ * Setting to TRUE will return the export, + * as opposed to emitting it. Setting to FALSE (the default) will do the opposite. + *

+ * @return string If the return parameter + * is set to TRUE, then the export is returned as a string, + * otherwise NULL is returned. + */ + public static function export ($name, $return = false) {} + + /** + * (PHP 5)
+ * Constructs a ReflectionExtension + * @link http://php.net/manual/en/reflectionextension.construct.php + * @param string $name

+ * Name of the extension. + *

+ */ + public function __construct ($name) {} + + /** + * (PHP 5)
+ * To string + * @link http://php.net/manual/en/reflectionextension.tostring.php + * @return string the exported extension as a string, in the same way as the + * ReflectionExtension::export. + */ + public function __toString () {} + + /** + * (PHP 5)
+ * Gets extension name + * @link http://php.net/manual/en/reflectionextension.getname.php + * @return string The extensions name. + */ + public function getName () {} + + /** + * (PHP 5)
+ * Gets extension version + * @link http://php.net/manual/en/reflectionextension.getversion.php + * @return string The version of the extension. + */ + public function getVersion () {} + + /** + * (PHP 5)
+ * Gets extension functions + * @link http://php.net/manual/en/reflectionextension.getfunctions.php + * @return array An associative array of ReflectionFunction objects, + * for each function defined in the extension with the keys being the function + * names. If no function are defined, an empty array is returned. + */ + public function getFunctions () {} + + /** + * (PHP 5)
+ * Gets constants + * @link http://php.net/manual/en/reflectionextension.getconstants.php + * @return array An associative array with constant names as keys. + */ + public function getConstants () {} + + /** + * (PHP 5)
+ * Gets extension ini entries + * @link http://php.net/manual/en/reflectionextension.getinientries.php + * @return array An associative array with the ini entries as keys, + * with their defined values as values. + */ + public function getINIEntries () {} + + /** + * (PHP 5)
+ * Gets classes + * @link http://php.net/manual/en/reflectionextension.getclasses.php + * @return array An array of ReflectionClass objects, one + * for each class within the extension. If no classes are defined, + * an empty array is returned. + */ + public function getClasses () {} + + /** + * (PHP 5)
+ * Gets class names + * @link http://php.net/manual/en/reflectionextension.getclassnames.php + * @return array An array of class names, as defined in the extension. + * If no classes are defined, an empty array is returned. + */ + public function getClassNames () {} + + /** + * (PHP 5)
+ * Gets dependencies + * @link http://php.net/manual/en/reflectionextension.getdependencies.php + * @return array An associative array with dependencies as keys and + * either Required, Optional + * or Conflicts as the values. + */ + public function getDependencies () {} + + /** + * (PHP 5)
+ * Print extension info + * @link http://php.net/manual/en/reflectionextension.info.php + * @return void Information about the extension. + */ + public function info () {} + + /** + * (PHP >= 5.4.0)
+ * Returns whether this extension is persistent + * @link http://php.net/manual/en/reflectionextension.ispersistent.php + * @return void TRUE for extensions loaded by extension, FALSE + * otherwise. + */ + public function isPersistent () {} + + /** + * (PHP >= 5.4.0)
+ * Returns whether this extension is temporary + * @link http://php.net/manual/en/reflectionextension.istemporary.php + * @return void TRUE for extensions loaded by dl, + * FALSE otherwise. + */ + public function isTemporary () {} + +} + +/** + * @link http://php.net/manual/en/class.reflectionzendextension.php + * @jms-builtin + */ +class ReflectionZendExtension implements Reflector { + public $name; + + + /** + * (PHP >= 5.4.0)
+ * Clone handler + * @link http://php.net/manual/en/reflectionzendextension.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP >= 5.4.0)
+ * Export + * @link http://php.net/manual/en/reflectionzendextension.export.php + * @param string $name

+ *

+ * @param string $return [optional]

+ *

+ * @return string + */ + public static function export ($name, $return = null) {} + + /** + * (PHP >= 5.4.0)
+ * Constructor + * @link http://php.net/manual/en/reflectionzendextension.construct.php + * @param string $name

+ *

+ */ + public function __construct ($name) {} + + /** + * (PHP >= 5.4.0)
+ * To string handler + * @link http://php.net/manual/en/reflectionzendextension.tostring.php + * @return string + */ + public function __toString () {} + + /** + * (PHP >= 5.4.0)
+ * Gets name + * @link http://php.net/manual/en/reflectionzendextension.getname.php + * @return string + */ + public function getName () {} + + /** + * (PHP >= 5.4.0)
+ * Gets version + * @link http://php.net/manual/en/reflectionzendextension.getversion.php + * @return string + */ + public function getVersion () {} + + /** + * (PHP >= 5.4.0)
+ * Gets author + * @link http://php.net/manual/en/reflectionzendextension.getauthor.php + * @return string + */ + public function getAuthor () {} + + /** + * (PHP >= 5.4.0)
+ * Gets URL + * @link http://php.net/manual/en/reflectionzendextension.geturl.php + * @return string + */ + public function getURL () {} + + /** + * (PHP >= 5.4.0)
+ * Gets copyright + * @link http://php.net/manual/en/reflectionzendextension.getcopyright.php + * @return string + */ + public function getCopyright () {} + +} +// End of Reflection v.$Id: 1cf65cee164ed57874ce2d29e5c46b82f6139524 $ +?> diff --git a/res/php-5.4-core-api/SPL.php b/res/php-5.4-core-api/SPL.php new file mode 100644 index 0000000..a37f43e --- /dev/null +++ b/res/php-5.4-core-api/SPL.php @@ -0,0 +1,9377 @@ + + * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown if a callback refers to an undefined function or if some + * arguments are missing. + * @link http://php.net/manual/en/class.badfunctioncallexception.php + * @jms-builtin + */ +class BadFunctionCallException extends LogicException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown if a callback refers to an undefined method or if some + * arguments are missing. + * @link http://php.net/manual/en/class.badmethodcallexception.php + * @jms-builtin + */ +class BadMethodCallException extends BadFunctionCallException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown if a value does not adhere to a defined valid data domain. + * @link http://php.net/manual/en/class.domainexception.php + * @jms-builtin + */ +class DomainException extends LogicException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown if an argument does not match with the expected value. + * @link http://php.net/manual/en/class.invalidargumentexception.php + * @jms-builtin + */ +class InvalidArgumentException extends LogicException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown if a length is invalid. + * @link http://php.net/manual/en/class.lengthexception.php + * @jms-builtin + */ +class LengthException extends LogicException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown when an illegal index was requested. This represents + * errors that should be detected at compile time. + * @link http://php.net/manual/en/class.outofrangeexception.php + * @jms-builtin + */ +class OutOfRangeException extends LogicException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown if an error which can only be found on runtime occurs. + * @link http://php.net/manual/en/class.runtimeexception.php + * @jms-builtin + */ +class RuntimeException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown if a value is not a valid key. This represents errors + * that cannot be detected at compile time. + * @link http://php.net/manual/en/class.outofboundsexception.php + * @jms-builtin + */ +class OutOfBoundsException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown when adding an element to a full container. + * @link http://php.net/manual/en/class.overflowexception.php + * @jms-builtin + */ +class OverflowException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown to indicate range errors during program execution. + * Normally this means there was an arithmetic error other than + * under/overflow. This is the runtime version of + * DomainException. + * @link http://php.net/manual/en/class.rangeexception.php + * @jms-builtin + */ +class RangeException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown when performing an invalid operation on an empty + * container, such as removing an element. + * @link http://php.net/manual/en/class.underflowexception.php + * @jms-builtin + */ +class UnderflowException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Exception thrown if a value does not match with a set of values. Typically + * this happens when a function calls another function and expects the return + * value to be of a certain type or value not including arithmetic or buffer + * related errors. + * @link http://php.net/manual/en/class.unexpectedvalueexception.php + * @jms-builtin + */ +class UnexpectedValueException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * Classes implementing RecursiveIterator can be used to iterate + * over iterators recursively. + * @link http://php.net/manual/en/class.recursiveiterator.php + */ +interface RecursiveIterator extends Iterator, Traversable { + + /** + * (PHP 5 >= 5.1.0)
+ * Returns if an iterator can be created fot the current entry. + * @link http://php.net/manual/en/recursiveiterator.haschildren.php + * @return bool TRUE if the current entry can be iterated over, otherwise returns FALSE. + */ + abstract public function hasChildren (); + + /** + * (PHP 5 >= 5.1.0)
+ * Returns an iterator for the current entry. + * @link http://php.net/manual/en/recursiveiterator.getchildren.php + * @return RecursiveIterator An iterator for the current entry. + */ + abstract public function getChildren (); + + /** + * (PHP 5 >= 5.0.0)
+ * Return the current element + * @link http://php.net/manual/en/iterator.current.php + * @return mixed Can return any type. + */ + abstract public function current (); + + /** + * (PHP 5 >= 5.0.0)
+ * Move forward to next element + * @link http://php.net/manual/en/iterator.next.php + * @return void Any returned value is ignored. + */ + abstract public function next (); + + /** + * (PHP 5 >= 5.0.0)
+ * Return the key of the current element + * @link http://php.net/manual/en/iterator.key.php + * @return scalar scalar on success, or NULL on failure. + */ + abstract public function key (); + + /** + * (PHP 5 >= 5.0.0)
+ * Checks if current position is valid + * @link http://php.net/manual/en/iterator.valid.php + * @return boolean The return value will be casted to boolean and then evaluated. + * Returns TRUE on success or FALSE on failure. + */ + abstract public function valid (); + + /** + * (PHP 5 >= 5.0.0)
+ * Rewind the Iterator to the first element + * @link http://php.net/manual/en/iterator.rewind.php + * @return void Any returned value is ignored. + */ + abstract public function rewind (); + +} + +/** + * Can be used to iterate through recursive iterators. + * @link http://php.net/manual/en/class.recursiveiteratoriterator.php + * @jms-builtin + */ +class RecursiveIteratorIterator implements Iterator, Traversable, OuterIterator { + const LEAVES_ONLY = 0; + const SELF_FIRST = 1; + const CHILD_FIRST = 2; + const CATCH_GET_CHILD = 16; + + + /** + * (PHP 5 >= 5.1.3)
+ * Construct a RecursiveIteratorIterator + * @link http://php.net/manual/en/recursiveiteratoriterator.construct.php + * @param Traversable $iterator

+ * The iterator being constructed from. Either a + * RecursiveIterator or IteratorAggregate. + *

+ * @param int $mode [optional]

+ * Optional mode. Possible values are + * RecursiveIteratorIterator::LEAVES_ONLY + * - The default. Lists only leaves in iteration. + * RecursiveIteratorIterator::SELF_FIRST + * - Lists leaves and parents in iteration with parents coming first. + * RecursiveIteratorIterator::CHILD_FIRST + * - Lists leaves and parents in iteration with leaves coming first. + *

+ * @param int $flags [optional]

+ * Optional flag. Possible values are RecursiveIteratorIterator::CATCH_GET_CHILD + * which will then ignore exceptions thrown in calls to RecursiveIteratorIterator::getChildren. + *

+ */ + public function __construct (Traversable $iterator, $mode = 'RecursiveIteratorIterator::LEAVES_ONLY', $flags = 0) {} + + /** + * (PHP 5)
+ * Rewind the iterator to the first element of the top level inner iterator + * @link http://php.net/manual/en/recursiveiteratoriterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5)
+ * Check whether the current position is valid + * @link http://php.net/manual/en/recursiveiteratoriterator.valid.php + * @return bool TRUE if the current position is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5)
+ * Access the current key + * @link http://php.net/manual/en/recursiveiteratoriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * (PHP 5)
+ * Access the current element value + * @link http://php.net/manual/en/recursiveiteratoriterator.current.php + * @return mixed The current elements value. + */ + public function current () {} + + /** + * (PHP 5)
+ * Move forward to the next element + * @link http://php.net/manual/en/recursiveiteratoriterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5)
+ * Get the current depth of the recursive iteration + * @link http://php.net/manual/en/recursiveiteratoriterator.getdepth.php + * @return int The current depth of the recursive iteration. + */ + public function getDepth () {} + + /** + * (PHP 5)
+ * The current active sub iterator + * @link http://php.net/manual/en/recursiveiteratoriterator.getsubiterator.php + * @param $level [optional] + * @return RecursiveIterator The current active sub iterator. + */ + public function getSubIterator ($level) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get inner iterator + * @link http://php.net/manual/en/recursiveiteratoriterator.getinneriterator.php + * @return iterator The current active sub iterator. + */ + public function getInnerIterator () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Begin Iteration + * @link http://php.net/manual/en/recursiveiteratoriterator.beginiteration.php + * @return void No value is returned. + */ + public function beginIteration () {} + + /** + * (PHP 5 >= 5.1.0)
+ * End Iteration + * @link http://php.net/manual/en/recursiveiteratoriterator.enditeration.php + * @return void No value is returned. + */ + public function endIteration () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Has children + * @link http://php.net/manual/en/recursiveiteratoriterator.callhaschildren.php + * @return bool TRUE if the element has children, otherwise FALSE + */ + public function callHasChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get children + * @link http://php.net/manual/en/recursiveiteratoriterator.callgetchildren.php + * @return RecursiveIterator A RecursiveIterator. + */ + public function callGetChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Begin children + * @link http://php.net/manual/en/recursiveiteratoriterator.beginchildren.php + * @return void No value is returned. + */ + public function beginChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * End children + * @link http://php.net/manual/en/recursiveiteratoriterator.endchildren.php + * @return void No value is returned. + */ + public function endChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Next element + * @link http://php.net/manual/en/recursiveiteratoriterator.nextelement.php + * @return void No value is returned. + */ + public function nextElement () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Set max depth + * @link http://php.net/manual/en/recursiveiteratoriterator.setmaxdepth.php + * @param string $max_depth [optional]

+ * The maximum allowed depth. -1 is used + * for any depth. + *

+ * @return void No value is returned. + */ + public function setMaxDepth ($max_depth = -1) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get max depth + * @link http://php.net/manual/en/recursiveiteratoriterator.getmaxdepth.php + * @return mixed The maximum accepted depth, or FALSE if any depth is allowed. + */ + public function getMaxDepth () {} + +} + +/** + * Classes implementing OuterIterator can be used to iterate + * over iterators. + * @link http://php.net/manual/en/class.outeriterator.php + */ +interface OuterIterator extends Iterator, Traversable { + + /** + * (PHP 5 >= 5.1.0)
+ * Returns the inner iterator for the current entry. + * @link http://php.net/manual/en/outeriterator.getinneriterator.php + * @return Iterator The inner iterator for the current entry. + */ + abstract public function getInnerIterator (); + + /** + * (PHP 5 >= 5.0.0)
+ * Return the current element + * @link http://php.net/manual/en/iterator.current.php + * @return mixed Can return any type. + */ + abstract public function current (); + + /** + * (PHP 5 >= 5.0.0)
+ * Move forward to next element + * @link http://php.net/manual/en/iterator.next.php + * @return void Any returned value is ignored. + */ + abstract public function next (); + + /** + * (PHP 5 >= 5.0.0)
+ * Return the key of the current element + * @link http://php.net/manual/en/iterator.key.php + * @return scalar scalar on success, or NULL on failure. + */ + abstract public function key (); + + /** + * (PHP 5 >= 5.0.0)
+ * Checks if current position is valid + * @link http://php.net/manual/en/iterator.valid.php + * @return boolean The return value will be casted to boolean and then evaluated. + * Returns TRUE on success or FALSE on failure. + */ + abstract public function valid (); + + /** + * (PHP 5 >= 5.0.0)
+ * Rewind the Iterator to the first element + * @link http://php.net/manual/en/iterator.rewind.php + * @return void Any returned value is ignored. + */ + abstract public function rewind (); + +} + +/** + * This iterator wrapper allows the conversion of anything that is + * Traversable into an Iterator. + * It is important to understand that most classes that do not implement + * Iterators have reasons as most likely they do not allow the full + * Iterator feature set. If so, techniques should be provided to prevent + * misuse, otherwise expect exceptions or fatal errors. + * @link http://php.net/manual/en/class.iteratoriterator.php + * @jms-builtin + */ +class IteratorIterator implements Iterator, Traversable, OuterIterator { + + /** + * (PHP 5 >= 5.1.0)
+ * Create an iterator from anything that is traversable + * @link http://php.net/manual/en/iteratoriterator.construct.php + * @param Traversable $iterator

+ * The traversable iterator. + *

+ */ + public function __construct (Traversable $iterator) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind to the first element + * @link http://php.net/manual/en/iteratoriterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks if the iterator is valid + * @link http://php.net/manual/en/iteratoriterator.valid.php + * @return bool TRUE if the iterator is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the key of the current element + * @link http://php.net/manual/en/iteratoriterator.key.php + * @return void The key of the current element. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current value + * @link http://php.net/manual/en/iteratoriterator.current.php + * @return mixed The value of the current element. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Forward to the next element + * @link http://php.net/manual/en/iteratoriterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the inner iterator + * @link http://php.net/manual/en/iteratoriterator.getinneriterator.php + * @return Traversable The inner iterator as passed to IteratorIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** + * This abstract iterator filters out unwanted values. This class should be extended to + * implement custom iterator filters. The FilterIterator::accept + * must be implemented in the subclass. + * @link http://php.net/manual/en/class.filteriterator.php + * @jms-builtin + */ +class FilterIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * (PHP 5 >= 5.1.0)
+ * Construct a filterIterator + * @link http://php.net/manual/en/filteriterator.construct.php + * @param Iterator $iterator

+ * The iterator that is being filtered. + *

+ */ + public function __construct (Iterator $iterator) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the iterator + * @link http://php.net/manual/en/filteriterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/filteriterator.valid.php + * @return bool TRUE if the current element is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current key + * @link http://php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current element value + * @link http://php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Move the iterator forward + * @link http://php.net/manual/en/filteriterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the inner iterator + * @link http://php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element of the iterator is acceptable + * @link http://php.net/manual/en/filteriterator.accept.php + * @return bool TRUE if the current element is acceptable, otherwise FALSE. + */ + abstract public function accept (); + +} + +/** + * This abstract iterator filters out unwanted values for a RecursiveIterator. + * This class should be extended to implement custom filters. + * The RecursiveFilterIterator::accept must be implemented in the subclass. + * @link http://php.net/manual/en/class.recursivefilteriterator.php + * @jms-builtin + */ +class RecursiveFilterIterator extends FilterIterator implements Iterator, Traversable, OuterIterator, RecursiveIterator { + + /** + * (PHP 5 >= 5.1.0)
+ * Create a RecursiveFilterIterator from a RecursiveIterator + * @link http://php.net/manual/en/recursivefilteriterator.construct.php + * @param RecursiveIterator $iterator

+ * The RecursiveIterator to be filtered. + *

+ */ + public function __construct (RecursiveIterator $iterator) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the inner iterator's current element has children + * @link http://php.net/manual/en/recursivefilteriterator.haschildren.php + * @return void TRUE if the inner iterator has children, otherwise FALSE + */ + public function hasChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Return the inner iterator's children contained in a RecursiveFilterIterator + * @link http://php.net/manual/en/recursivefilteriterator.getchildren.php + * @return void a RecursiveFilterIterator containing the inner iterator's children. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the iterator + * @link http://php.net/manual/en/filteriterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/filteriterator.valid.php + * @return bool TRUE if the current element is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current key + * @link http://php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current element value + * @link http://php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Move the iterator forward + * @link http://php.net/manual/en/filteriterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the inner iterator + * @link http://php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element of the iterator is acceptable + * @link http://php.net/manual/en/filteriterator.accept.php + * @return bool TRUE if the current element is acceptable, otherwise FALSE. + */ + abstract public function accept (); + +} + +/** + * @link http://php.net/manual/en/class.callbackfilteriterator.php + * @jms-builtin + */ +class CallbackFilterIterator extends FilterIterator implements Iterator, Traversable, OuterIterator { + + /** + * (PHP 5 >= 5.4.0)
+ * Create a filtered iterator from another iterator + * @link http://php.net/manual/en/callbackfilteriterator.construct.php + * @param Iterator $iterator + * @param $callback + */ + public function __construct (Iterator $iterator, $callback) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Calls the callback with the current value, the current key and the inner iterator as arguments + * @link http://php.net/manual/en/callbackfilteriterator.accept.php + * @return string TRUE to accept the current item, or FALSE otherwise. + */ + public function accept () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the iterator + * @link http://php.net/manual/en/filteriterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/filteriterator.valid.php + * @return bool TRUE if the current element is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current key + * @link http://php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current element value + * @link http://php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Move the iterator forward + * @link http://php.net/manual/en/filteriterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the inner iterator + * @link http://php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +/** + * @link http://php.net/manual/en/class.recursivecallbackfilteriterator.php + * @jms-builtin + */ +class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements OuterIterator, Traversable, Iterator, RecursiveIterator { + + /** + * (PHP 5 >= 5.4.0)
+ * Create a RecursiveCallbackFilterIterator from a RecursiveIterator + * @link http://php.net/manual/en/recursivecallbackfilteriterator.construct.php + * @param RecursiveIterator $iterator + * @param $callback + */ + public function __construct (RecursiveIterator $iterator, $callback) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Check whether the inner iterator's current element has children + * @link http://php.net/manual/en/recursivecallbackfilteriterator.haschildren.php + * @return void TRUE if the current element has children, FALSE otherwise. + */ + public function hasChildren () {} + + /** + * (PHP 5 >= 5.4.0)
+ * Return the inner iterator's children contained in a RecursiveCallbackFilterIterator + * @link http://php.net/manual/en/recursivecallbackfilteriterator.getchildren.php + * @return RecursiveCallbackFilterIterator a RecursiveCallbackFilterIterator containing + * the children. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.4.0)
+ * Calls the callback with the current value, the current key and the inner iterator as arguments + * @link http://php.net/manual/en/callbackfilteriterator.accept.php + * @return string TRUE to accept the current item, or FALSE otherwise. + */ + public function accept () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the iterator + * @link http://php.net/manual/en/filteriterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/filteriterator.valid.php + * @return bool TRUE if the current element is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current key + * @link http://php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current element value + * @link http://php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Move the iterator forward + * @link http://php.net/manual/en/filteriterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the inner iterator + * @link http://php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +/** + * This extended FilterIterator allows a recursive + * iteration using RecursiveIteratorIterator that only + * shows those elements which have children. + * @link http://php.net/manual/en/class.parentiterator.php + * @jms-builtin + */ +class ParentIterator extends RecursiveFilterIterator implements RecursiveIterator, OuterIterator, Traversable, Iterator { + + /** + * (PHP 5 >= 5.1.0)
+ * Constructs a ParentIterator + * @link http://php.net/manual/en/parentiterator.construct.php + * @param RecursiveIterator $iterator

+ * The iterator being constructed upon. + *

+ */ + public function __construct (RecursiveIterator $iterator) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Determines acceptability + * @link http://php.net/manual/en/parentiterator.accept.php + * @return bool TRUE if the current element is acceptable, otherwise FALSE. + */ + public function accept () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the inner iterator's current element has children + * @link http://php.net/manual/en/recursivefilteriterator.haschildren.php + * @return void TRUE if the inner iterator has children, otherwise FALSE + */ + public function hasChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Return the inner iterator's children contained in a RecursiveFilterIterator + * @link http://php.net/manual/en/recursivefilteriterator.getchildren.php + * @return void a RecursiveFilterIterator containing the inner iterator's children. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the iterator + * @link http://php.net/manual/en/filteriterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/filteriterator.valid.php + * @return bool TRUE if the current element is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current key + * @link http://php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current element value + * @link http://php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Move the iterator forward + * @link http://php.net/manual/en/filteriterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the inner iterator + * @link http://php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +/** + * Classes implementing Countable can be used with the + * count function. + * @link http://php.net/manual/en/class.countable.php + */ +interface Countable { + + /** + * (PHP 5 >= 5.1.0)
+ * Count elements of an object + * @link http://php.net/manual/en/countable.count.php + * @return int The custom count as an integer. + *

+ *

+ * The return value is cast to an integer. + */ + abstract public function count (); + +} + +/** + * The Seekable iterator. + * @link http://php.net/manual/en/class.seekableiterator.php + */ +interface SeekableIterator extends Iterator, Traversable { + + /** + * (PHP 5 >= 5.1.0)
+ * Seeks to a position + * @link http://php.net/manual/en/seekableiterator.seek.php + * @param int $position

+ * The position to seek to. + *

+ * @return void No value is returned. + */ + abstract public function seek ($position); + + /** + * (PHP 5 >= 5.0.0)
+ * Return the current element + * @link http://php.net/manual/en/iterator.current.php + * @return mixed Can return any type. + */ + abstract public function current (); + + /** + * (PHP 5 >= 5.0.0)
+ * Move forward to next element + * @link http://php.net/manual/en/iterator.next.php + * @return void Any returned value is ignored. + */ + abstract public function next (); + + /** + * (PHP 5 >= 5.0.0)
+ * Return the key of the current element + * @link http://php.net/manual/en/iterator.key.php + * @return scalar scalar on success, or NULL on failure. + */ + abstract public function key (); + + /** + * (PHP 5 >= 5.0.0)
+ * Checks if current position is valid + * @link http://php.net/manual/en/iterator.valid.php + * @return boolean The return value will be casted to boolean and then evaluated. + * Returns TRUE on success or FALSE on failure. + */ + abstract public function valid (); + + /** + * (PHP 5 >= 5.0.0)
+ * Rewind the Iterator to the first element + * @link http://php.net/manual/en/iterator.rewind.php + * @return void Any returned value is ignored. + */ + abstract public function rewind (); + +} + +/** + * The LimitIterator class allows iteration over + * a limited subset of items in an Iterator. + * @link http://php.net/manual/en/class.limititerator.php + * @jms-builtin + */ +class LimitIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * (PHP 5 >= 5.1.0)
+ * Construct a LimitIterator + * @link http://php.net/manual/en/limititerator.construct.php + * @param Iterator $iterator

+ * The Iterator to limit. + *

+ * @param int $offset [optional]

+ * Optional offset of the limit. + *

+ * @param int $count [optional]

+ * Optional count of the limit. + *

+ */ + public function __construct (Iterator $iterator, $offset = 0, $count = -1) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the iterator to the specified starting offset + * @link http://php.net/manual/en/limititerator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/limititerator.valid.php + * @return bool TRUE on success or FALSE on failure. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get current key + * @link http://php.net/manual/en/limititerator.key.php + * @return mixed the key for the current item. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get current element + * @link http://php.net/manual/en/limititerator.current.php + * @return mixed the current element or NULL if there is none. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Move the iterator forward + * @link http://php.net/manual/en/limititerator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Seek to the given position + * @link http://php.net/manual/en/limititerator.seek.php + * @param int $position

+ * The position to seek to. + *

+ * @return int the offset position after seeking. + */ + public function seek ($position) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Return the current position + * @link http://php.net/manual/en/limititerator.getposition.php + * @return int The current position. + */ + public function getPosition () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get inner iterator + * @link http://php.net/manual/en/limititerator.getinneriterator.php + * @return Iterator The inner iterator passed to LimitIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** + * This object supports cached iteration over another iterator. + * @link http://php.net/manual/en/class.cachingiterator.php + * @jms-builtin + */ +class CachingIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator, ArrayAccess, Countable { + const CALL_TOSTRING = 1; + const CATCH_GET_CHILD = 16; + const TOSTRING_USE_KEY = 2; + const TOSTRING_USE_CURRENT = 4; + const TOSTRING_USE_INNER = 8; + const FULL_CACHE = 256; + + + /** + * (PHP 5)
+ * Construct a new CachingIterator object for the iterator. + * @link http://php.net/manual/en/cachingiterator.construct.php + * @param Iterator $iterator

+ * Iterator to cache + *

+ * @param string $flags [optional]

+ * Bitmask of flags. + *

+ */ + public function __construct (Iterator $iterator, $flags = 'self::CALL_TOSTRING') {} + + /** + * (PHP 5)
+ * Rewind the iterator + * @link http://php.net/manual/en/cachingiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/cachingiterator.valid.php + * @return void TRUE on success or FALSE on failure. + */ + public function valid () {} + + /** + * (PHP 5)
+ * Return the key for the current element + * @link http://php.net/manual/en/cachingiterator.key.php + * @return void + */ + public function key () {} + + /** + * (PHP 5)
+ * Return the current element + * @link http://php.net/manual/en/cachingiterator.current.php + * @return void Mixed + */ + public function current () {} + + /** + * (PHP 5)
+ * Move the iterator forward + * @link http://php.net/manual/en/cachingiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5)
+ * Check whether the inner iterator has a valid next element + * @link http://php.net/manual/en/cachingiterator.hasnext.php + * @return void TRUE on success or FALSE on failure. + */ + public function hasNext () {} + + /** + * (PHP 5)
+ * Return the string representation of the current element + * @link http://php.net/manual/en/cachingiterator.tostring.php + * @return void The string representation of the current element. + */ + public function __toString () {} + + /** + * (PHP 5)
+ * Returns the inner iterator + * @link http://php.net/manual/en/cachingiterator.getinneriterator.php + * @return Iterator an object implementing the Iterator interface. + */ + public function getInnerIterator () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get flags used + * @link http://php.net/manual/en/cachingiterator.getflags.php + * @return void Description... + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.2.0)
+ * The setFlags purpose + * @link http://php.net/manual/en/cachingiterator.setflags.php + * @param bitmask $flags

+ * Bitmask of the flags to set. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags) {} + + /** + * (PHP 5 >= 5.2.0)
+ * The offsetGet purpose + * @link http://php.net/manual/en/cachingiterator.offsetget.php + * @param string $index

+ * Description... + *

+ * @return void Description... + */ + public function offsetGet ($index) {} + + /** + * (PHP 5 >= 5.2.0)
+ * The offsetSet purpose + * @link http://php.net/manual/en/cachingiterator.offsetset.php + * @param string $index

+ * The index of the element to be set. + *

+ * @param string $newval

+ * The new value for the index. + *

+ * @return void No value is returned. + */ + public function offsetSet ($index, $newval) {} + + /** + * (PHP 5 >= 5.2.0)
+ * The offsetUnset purpose + * @link http://php.net/manual/en/cachingiterator.offsetunset.php + * @param string $index

+ * The index of the element to be unset. + *

+ * @return void No value is returned. + */ + public function offsetUnset ($index) {} + + /** + * (PHP 5 >= 5.2.0)
+ * The offsetExists purpose + * @link http://php.net/manual/en/cachingiterator.offsetexists.php + * @param string $index

+ * The index being checked. + *

+ * @return void TRUE if an entry referenced by the offset exists, FALSE otherwise. + */ + public function offsetExists ($index) {} + + /** + * (PHP 5 >= 5.2.0)
+ * The getCache purpose + * @link http://php.net/manual/en/cachingiterator.getcache.php + * @return void Description... + */ + public function getCache () {} + + /** + * (PHP 5 >= 5.2.2)
+ * The number of elements in the iterator + * @link http://php.net/manual/en/cachingiterator.count.php + * @return int The count of the elements iterated over. + */ + public function count () {} + +} + +/** + * ... + * @link http://php.net/manual/en/class.recursivecachingiterator.php + * @jms-builtin + */ +class RecursiveCachingIterator extends CachingIterator implements Countable, ArrayAccess, Iterator, Traversable, OuterIterator, RecursiveIterator { + const CALL_TOSTRING = 1; + const CATCH_GET_CHILD = 16; + const TOSTRING_USE_KEY = 2; + const TOSTRING_USE_CURRENT = 4; + const TOSTRING_USE_INNER = 8; + const FULL_CACHE = 256; + + + /** + * (PHP 5 >= 5.1.0)
+ * Construct + * @link http://php.net/manual/en/recursivecachingiterator.construct.php + * @param Iterator $iterator

+ * The iterator being used. + *

+ * @param string $flags [optional]

+ * The flags. Use CALL_TOSTRING to call + * RecursiveCachingIterator::__toString for every element (the default), + * and/or CATCH_GET_CHILD to catch exceptions when trying to get children. + *

+ */ + public function __construct (Iterator $iterator, $flags = 'self::CALL_TOSTRING') {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element of the inner iterator has children + * @link http://php.net/manual/en/recursivecachingiterator.haschildren.php + * @return bool TRUE if the inner iterator has children, otherwise FALSE + */ + public function hasChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Return the inner iterator's children as a RecursiveCachingIterator + * @link http://php.net/manual/en/recursivecachingiterator.getchildren.php + * @return RecursiveCachingIterator The inner iterator's children, as a RecursiveCachingIterator. + */ + public function getChildren () {} + + /** + * (PHP 5)
+ * Rewind the iterator + * @link http://php.net/manual/en/cachingiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/cachingiterator.valid.php + * @return void TRUE on success or FALSE on failure. + */ + public function valid () {} + + /** + * (PHP 5)
+ * Return the key for the current element + * @link http://php.net/manual/en/cachingiterator.key.php + * @return void + */ + public function key () {} + + /** + * (PHP 5)
+ * Return the current element + * @link http://php.net/manual/en/cachingiterator.current.php + * @return void Mixed + */ + public function current () {} + + /** + * (PHP 5)
+ * Move the iterator forward + * @link http://php.net/manual/en/cachingiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5)
+ * Check whether the inner iterator has a valid next element + * @link http://php.net/manual/en/cachingiterator.hasnext.php + * @return void TRUE on success or FALSE on failure. + */ + public function hasNext () {} + + /** + * (PHP 5)
+ * Return the string representation of the current element + * @link http://php.net/manual/en/cachingiterator.tostring.php + * @return void The string representation of the current element. + */ + public function __toString () {} + + /** + * (PHP 5)
+ * Returns the inner iterator + * @link http://php.net/manual/en/cachingiterator.getinneriterator.php + * @return Iterator an object implementing the Iterator interface. + */ + public function getInnerIterator () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get flags used + * @link http://php.net/manual/en/cachingiterator.getflags.php + * @return void Description... + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.2.0)
+ * The setFlags purpose + * @link http://php.net/manual/en/cachingiterator.setflags.php + * @param bitmask $flags

+ * Bitmask of the flags to set. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags) {} + + /** + * (PHP 5 >= 5.2.0)
+ * The offsetGet purpose + * @link http://php.net/manual/en/cachingiterator.offsetget.php + * @param string $index

+ * Description... + *

+ * @return void Description... + */ + public function offsetGet ($index) {} + + /** + * (PHP 5 >= 5.2.0)
+ * The offsetSet purpose + * @link http://php.net/manual/en/cachingiterator.offsetset.php + * @param string $index

+ * The index of the element to be set. + *

+ * @param string $newval

+ * The new value for the index. + *

+ * @return void No value is returned. + */ + public function offsetSet ($index, $newval) {} + + /** + * (PHP 5 >= 5.2.0)
+ * The offsetUnset purpose + * @link http://php.net/manual/en/cachingiterator.offsetunset.php + * @param string $index

+ * The index of the element to be unset. + *

+ * @return void No value is returned. + */ + public function offsetUnset ($index) {} + + /** + * (PHP 5 >= 5.2.0)
+ * The offsetExists purpose + * @link http://php.net/manual/en/cachingiterator.offsetexists.php + * @param string $index

+ * The index being checked. + *

+ * @return void TRUE if an entry referenced by the offset exists, FALSE otherwise. + */ + public function offsetExists ($index) {} + + /** + * (PHP 5 >= 5.2.0)
+ * The getCache purpose + * @link http://php.net/manual/en/cachingiterator.getcache.php + * @return void Description... + */ + public function getCache () {} + + /** + * (PHP 5 >= 5.2.2)
+ * The number of elements in the iterator + * @link http://php.net/manual/en/cachingiterator.count.php + * @return int The count of the elements iterated over. + */ + public function count () {} + +} + +/** + * This iterator cannot be rewinded. + * @link http://php.net/manual/en/class.norewinditerator.php + * @jms-builtin + */ +class NoRewindIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * (PHP 5 >= 5.1.0)
+ * Construct a NoRewindIterator + * @link http://php.net/manual/en/norewinditerator.construct.php + * @param Iterator $iterator

+ * The iterator being used. + *

+ */ + public function __construct (Iterator $iterator) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Prevents the rewind operation on the inner iterator. + * @link http://php.net/manual/en/norewinditerator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Validates the iterator + * @link http://php.net/manual/en/norewinditerator.valid.php + * @return bool TRUE on success or FALSE on failure. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current key + * @link http://php.net/manual/en/norewinditerator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current value + * @link http://php.net/manual/en/norewinditerator.current.php + * @return mixed The current value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Forward to the next element + * @link http://php.net/manual/en/norewinditerator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the inner iterator + * @link http://php.net/manual/en/norewinditerator.getinneriterator.php + * @return iterator The inner iterator, as passed to NoRewindIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** + * An Iterator that iterates over several iterators one after the other. + * @link http://php.net/manual/en/class.appenditerator.php + * @jms-builtin + */ +class AppendIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * (PHP 5 >= 5.1.0)
+ * Constructs an AppendIterator + * @link http://php.net/manual/en/appenditerator.construct.php + */ + public function __construct () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Appends an iterator + * @link http://php.net/manual/en/appenditerator.append.php + * @param Iterator $iterator

+ * The iterator to append. + *

+ * @return void No value is returned. + */ + public function append (Iterator $iterator) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewinds the Iterator + * @link http://php.net/manual/en/appenditerator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks validity of the current element + * @link http://php.net/manual/en/appenditerator.valid.php + * @return bool TRUE if the current iteration is valid, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the current key + * @link http://php.net/manual/en/appenditerator.key.php + * @return void The current key if it is valid or NULL otherwise. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the current value + * @link http://php.net/manual/en/appenditerator.current.php + * @return mixed The current value if it is valid or NULL otherwise. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Moves to the next element + * @link http://php.net/manual/en/appenditerator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the inner iterator + * @link http://php.net/manual/en/appenditerator.getinneriterator.php + * @return Iterator The current inner iterator, or NULL if there is not one. + */ + public function getInnerIterator () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets an index of iterators + * @link http://php.net/manual/en/appenditerator.getiteratorindex.php + * @return int an integer, which is the zero-based index + * of the current inner iterator. + */ + public function getIteratorIndex () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the ArrayIterator + * @link http://php.net/manual/en/appenditerator.getarrayiterator.php + * @return void an ArrayIterator containing + * the appended iterators. + */ + public function getArrayIterator () {} + +} + +/** + * The InfiniteIterator allows one to + * infinitely iterate over an iterator without having to manually + * rewind the iterator upon reaching its end. + * @link http://php.net/manual/en/class.infiniteiterator.php + * @jms-builtin + */ +class InfiniteIterator extends IteratorIterator implements OuterIterator, Traversable, Iterator { + + /** + * (PHP 5 >= 5.1.0)
+ * Constructs an InfiniteIterator + * @link http://php.net/manual/en/infiniteiterator.construct.php + * @param Iterator $iterator

+ * The iterator to infinitely iterate over. + *

+ */ + public function __construct (Iterator $iterator) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Moves the inner Iterator forward or rewinds it + * @link http://php.net/manual/en/infiniteiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind to the first element + * @link http://php.net/manual/en/iteratoriterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks if the iterator is valid + * @link http://php.net/manual/en/iteratoriterator.valid.php + * @return bool TRUE if the iterator is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the key of the current element + * @link http://php.net/manual/en/iteratoriterator.key.php + * @return void The key of the current element. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current value + * @link http://php.net/manual/en/iteratoriterator.current.php + * @return mixed The value of the current element. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the inner iterator + * @link http://php.net/manual/en/iteratoriterator.getinneriterator.php + * @return Traversable The inner iterator as passed to IteratorIterator::__construct. + */ + public function getInnerIterator () {} + +} + +/** + * This iterator can be used to filter another iterator based on a regular expression. + * @link http://php.net/manual/en/class.regexiterator.php + * @jms-builtin + */ +class RegexIterator extends FilterIterator implements Iterator, Traversable, OuterIterator { + const USE_KEY = 1; + const MATCH = 0; + const GET_MATCH = 1; + const ALL_MATCHES = 2; + const SPLIT = 3; + const REPLACE = 4; + + public $replacement; + + + /** + * (PHP 5 >= 5.2.0)
+ * Create a new RegexIterator + * @link http://php.net/manual/en/regexiterator.construct.php + * @param Iterator $iterator + * @param $regex + * @param $mode [optional] + * @param $flags [optional] + * @param $preg_flags [optional] + */ + public function __construct (Iterator $iterator, $regex, $mode, $flags, $preg_flags) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get accept status + * @link http://php.net/manual/en/regexiterator.accept.php + * @return bool TRUE if a match, FALSE otherwise. + */ + public function accept () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Returns operation mode. + * @link http://php.net/manual/en/regexiterator.getmode.php + * @return int the operation mode. + */ + public function getMode () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sets the operation mode. + * @link http://php.net/manual/en/regexiterator.setmode.php + * @param int $mode

+ * The operation mode. + *

+ *

+ * The available modes are listed below. The actual + * meanings of these modes are described in the + * predefined constants. + * + * RegexIterator modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
valueconstant
0 + * RegexIterator::MATCH + *
1 + * RegexIterator::GET_MATCH + *
2 + * RegexIterator::ALL_MATCHES + *
3 + * RegexIterator::SPLIT + *
4 + * RegexIterator::REPLACE + *
+ *

+ * @return void No value is returned. + */ + public function setMode ($mode) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get flags + * @link http://php.net/manual/en/regexiterator.getflags.php + * @return int the set flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sets the flags. + * @link http://php.net/manual/en/regexiterator.setflags.php + * @param int $flags

+ * The flags to set, a bitmask of class constants. + *

+ *

+ * The available flags are listed below. The actual + * meanings of these flags are described in the + * predefined constants. + * + * RegexIterator flags + * + * + * + * + * + * + * + * + *
valueconstant
1 + * RegexIterator::USE_KEY + *
+ *

+ * @return void No value is returned. + */ + public function setFlags ($flags) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Returns the regular expression flags. + * @link http://php.net/manual/en/regexiterator.getpregflags.php + * @return int a bitmask of the regular expression flags. + */ + public function getPregFlags () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sets the regular expression flags. + * @link http://php.net/manual/en/regexiterator.setpregflags.php + * @param int $preg_flags

+ * The regular expression flags. See RegexIterator::__construct + * for an overview of available flags. + *

+ * @return void No value is returned. + */ + public function setPregFlags ($preg_flags) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Returns current regular expression + * @link http://php.net/manual/en/regexiterator.getregex.php + * @return string + */ + public function getRegex () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the iterator + * @link http://php.net/manual/en/filteriterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/filteriterator.valid.php + * @return bool TRUE if the current element is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current key + * @link http://php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current element value + * @link http://php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Move the iterator forward + * @link http://php.net/manual/en/filteriterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the inner iterator + * @link http://php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +/** + * This recursive iterator can filter another recursive iterator via a regular expression. + * @link http://php.net/manual/en/class.recursiveregexiterator.php + * @jms-builtin + */ +class RecursiveRegexIterator extends RegexIterator implements OuterIterator, Traversable, Iterator, RecursiveIterator { + const USE_KEY = 1; + const MATCH = 0; + const GET_MATCH = 1; + const ALL_MATCHES = 2; + const SPLIT = 3; + const REPLACE = 4; + + public $replacement; + + + /** + * (PHP 5 >= 5.2.0)
+ * Creates a new RecursiveRegexIterator. + * @link http://php.net/manual/en/recursiveregexiterator.construct.php + * @param RecursiveIterator $iterator + * @param $regex + * @param $mode [optional] + * @param $flags [optional] + * @param $preg_flags [optional] + */ + public function __construct (RecursiveIterator $iterator, $regex, $mode, $flags, $preg_flags) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Returns whether an iterator can be obtained for the current entry. + * @link http://php.net/manual/en/recursiveregexiterator.haschildren.php + * @return bool TRUE if an iterator can be obtained for the current entry, otherwise returns FALSE. + */ + public function hasChildren () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Returns an iterator for the current entry. + * @link http://php.net/manual/en/recursiveregexiterator.getchildren.php + * @return RecursiveRegexIterator An iterator for the current entry, if it can be iterated over by the inner iterator. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get accept status + * @link http://php.net/manual/en/regexiterator.accept.php + * @return bool TRUE if a match, FALSE otherwise. + */ + public function accept () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Returns operation mode. + * @link http://php.net/manual/en/regexiterator.getmode.php + * @return int the operation mode. + */ + public function getMode () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sets the operation mode. + * @link http://php.net/manual/en/regexiterator.setmode.php + * @param int $mode

+ * The operation mode. + *

+ *

+ * The available modes are listed below. The actual + * meanings of these modes are described in the + * predefined constants. + * + * RegexIterator modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
valueconstant
0 + * RegexIterator::MATCH + *
1 + * RegexIterator::GET_MATCH + *
2 + * RegexIterator::ALL_MATCHES + *
3 + * RegexIterator::SPLIT + *
4 + * RegexIterator::REPLACE + *
+ *

+ * @return void No value is returned. + */ + public function setMode ($mode) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get flags + * @link http://php.net/manual/en/regexiterator.getflags.php + * @return int the set flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sets the flags. + * @link http://php.net/manual/en/regexiterator.setflags.php + * @param int $flags

+ * The flags to set, a bitmask of class constants. + *

+ *

+ * The available flags are listed below. The actual + * meanings of these flags are described in the + * predefined constants. + * + * RegexIterator flags + * + * + * + * + * + * + * + * + *
valueconstant
1 + * RegexIterator::USE_KEY + *
+ *

+ * @return void No value is returned. + */ + public function setFlags ($flags) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Returns the regular expression flags. + * @link http://php.net/manual/en/regexiterator.getpregflags.php + * @return int a bitmask of the regular expression flags. + */ + public function getPregFlags () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sets the regular expression flags. + * @link http://php.net/manual/en/regexiterator.setpregflags.php + * @param int $preg_flags

+ * The regular expression flags. See RegexIterator::__construct + * for an overview of available flags. + *

+ * @return void No value is returned. + */ + public function setPregFlags ($preg_flags) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Returns current regular expression + * @link http://php.net/manual/en/regexiterator.getregex.php + * @return string + */ + public function getRegex () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the iterator + * @link http://php.net/manual/en/filteriterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/filteriterator.valid.php + * @return bool TRUE if the current element is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current key + * @link http://php.net/manual/en/filteriterator.key.php + * @return mixed The current key. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the current element value + * @link http://php.net/manual/en/filteriterator.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Move the iterator forward + * @link http://php.net/manual/en/filteriterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get the inner iterator + * @link http://php.net/manual/en/filteriterator.getinneriterator.php + * @return Iterator The inner iterator. + */ + public function getInnerIterator () {} + +} + +/** + * The EmptyIterator class for an empty iterator. + * @link http://php.net/manual/en/class.emptyiterator.php + * @jms-builtin + */ +class EmptyIterator implements Iterator, Traversable { + + /** + * (PHP 5 >= 5.1.0)
+ * The rewind() method + * @link http://php.net/manual/en/emptyiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * The valid() method + * @link http://php.net/manual/en/emptyiterator.valid.php + * @return void FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * The key() method + * @link http://php.net/manual/en/emptyiterator.key.php + * @return void No value is returned. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * The current() method + * @link http://php.net/manual/en/emptyiterator.current.php + * @return void No value is returned. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * The next() method + * @link http://php.net/manual/en/emptyiterator.next.php + * @return void No value is returned. + */ + public function next () {} + +} + +/** + * Allows iterating over a RecursiveIterator to generate an ASCII graphic tree. + * @link http://php.net/manual/en/class.recursivetreeiterator.php + * @jms-builtin + */ +class RecursiveTreeIterator extends RecursiveIteratorIterator implements OuterIterator, Traversable, Iterator { + const LEAVES_ONLY = 0; + const SELF_FIRST = 1; + const CHILD_FIRST = 2; + const CATCH_GET_CHILD = 16; + const BYPASS_CURRENT = 4; + const BYPASS_KEY = 8; + const PREFIX_LEFT = 0; + const PREFIX_MID_HAS_NEXT = 1; + const PREFIX_MID_LAST = 2; + const PREFIX_END_HAS_NEXT = 3; + const PREFIX_END_LAST = 4; + const PREFIX_RIGHT = 5; + + + /** + * (PHP 5 >= 5.3.0)
+ * Construct a RecursiveTreeIterator + * @link http://php.net/manual/en/recursivetreeiterator.construct.php + * @param RecursiveIterator|IteratorAggregate $it

+ * The RecursiveIterator or IteratorAggregate to iterate over. + *

+ * @param int $flags [optional]

+ * Flags may be provided which will affect the behavior of some methods. + * A list of the flags can found under RecursiveTreeIterator predefined constants. + *

+ * @param int $cit_flags [optional] + * @param int $mode [optional]

+ * Flags to affect the behavior of the RecursiveIteratorIterator used internally. + *

+ */ + public function __construct ($it, $flags = 'RecursiveTreeIterator::BYPASS_KEY', $cit_flags = 'CachingIterator::CATCH_GET_CHILD', $mode = 'RecursiveIteratorIterator::SELF_FIRST') {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewind iterator + * @link http://php.net/manual/en/recursivetreeiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Check validity + * @link http://php.net/manual/en/recursivetreeiterator.valid.php + * @return bool TRUE if the current position is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get the key of the current element + * @link http://php.net/manual/en/recursivetreeiterator.key.php + * @return string the current key prefixed and postfixed. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get current element + * @link http://php.net/manual/en/recursivetreeiterator.current.php + * @return string the current element prefixed and postfixed. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to next element + * @link http://php.net/manual/en/recursivetreeiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Begin iteration + * @link http://php.net/manual/en/recursivetreeiterator.beginiteration.php + * @return RecursiveIterator A RecursiveIterator. + */ + public function beginIteration () {} + + /** + * (PHP 5 >= 5.3.0)
+ * End iteration + * @link http://php.net/manual/en/recursivetreeiterator.enditeration.php + * @return void No value is returned. + */ + public function endIteration () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Has children + * @link http://php.net/manual/en/recursivetreeiterator.callhaschildren.php + * @return bool TRUE if there are children, otherwise FALSE + */ + public function callHasChildren () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get children + * @link http://php.net/manual/en/recursivetreeiterator.callgetchildren.php + * @return RecursiveIterator A RecursiveIterator. + */ + public function callGetChildren () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Begin children + * @link http://php.net/manual/en/recursivetreeiterator.beginchildren.php + * @return void No value is returned. + */ + public function beginChildren () {} + + /** + * (PHP 5 >= 5.3.0)
+ * End children + * @link http://php.net/manual/en/recursivetreeiterator.endchildren.php + * @return void No value is returned. + */ + public function endChildren () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Next element + * @link http://php.net/manual/en/recursivetreeiterator.nextelement.php + * @return void No value is returned. + */ + public function nextElement () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get the prefix + * @link http://php.net/manual/en/recursivetreeiterator.getprefix.php + * @return string the string to place in front of current element + */ + public function getPrefix () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Set a part of the prefix + * @link http://php.net/manual/en/recursivetreeiterator.setprefixpart.php + * @param int $part

+ * One of the RecursiveTreeIterator::PREFIX_* constants. + *

+ * @param string $value

+ * The value to assign to the part of the prefix specified in part. + *

+ * @return void No value is returned. + */ + public function setPrefixPart ($part, $value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get current entry + * @link http://php.net/manual/en/recursivetreeiterator.getentry.php + * @return string the part of the tree built for the current element. + */ + public function getEntry () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get the postfix + * @link http://php.net/manual/en/recursivetreeiterator.getpostfix.php + * @return void the string to place after the current element. + */ + public function getPostfix () {} + + /** + * (PHP 5)
+ * Get the current depth of the recursive iteration + * @link http://php.net/manual/en/recursiveiteratoriterator.getdepth.php + * @return int The current depth of the recursive iteration. + */ + public function getDepth () {} + + /** + * (PHP 5)
+ * The current active sub iterator + * @link http://php.net/manual/en/recursiveiteratoriterator.getsubiterator.php + * @param $level [optional] + * @return RecursiveIterator The current active sub iterator. + */ + public function getSubIterator ($level) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get inner iterator + * @link http://php.net/manual/en/recursiveiteratoriterator.getinneriterator.php + * @return iterator The current active sub iterator. + */ + public function getInnerIterator () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Set max depth + * @link http://php.net/manual/en/recursiveiteratoriterator.setmaxdepth.php + * @param string $max_depth [optional]

+ * The maximum allowed depth. -1 is used + * for any depth. + *

+ * @return void No value is returned. + */ + public function setMaxDepth ($max_depth = -1) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get max depth + * @link http://php.net/manual/en/recursiveiteratoriterator.getmaxdepth.php + * @return mixed The maximum accepted depth, or FALSE if any depth is allowed. + */ + public function getMaxDepth () {} + +} + +/** + * This class allows objects to work as arrays. + * @link http://php.net/manual/en/class.arrayobject.php + * @jms-builtin + */ +class ArrayObject implements IteratorAggregate, Traversable, ArrayAccess, Serializable, Countable { + const STD_PROP_LIST = 1; + const ARRAY_AS_PROPS = 2; + + + /** + * (PHP 5 >= 5.0.0)
+ * Construct a new array object + * @link http://php.net/manual/en/arrayobject.construct.php + * @param $array + */ + public function __construct ($array) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Returns whether the requested index exists + * @link http://php.net/manual/en/arrayobject.offsetexists.php + * @param mixed $index

+ * The index being checked. + *

+ * @return bool TRUE if the requested index exists, otherwise FALSE + */ + public function offsetExists ($index) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Returns the value at the specified index + * @link http://php.net/manual/en/arrayobject.offsetget.php + * @param mixed $index

+ * The index with the value. + *

+ * @return mixed The value at the specified index or FALSE. + */ + public function offsetGet ($index) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Sets the value at the specified index to newval + * @link http://php.net/manual/en/arrayobject.offsetset.php + * @param mixed $index

+ * The index being set. + *

+ * @param mixed $newval

+ * The new value for the index. + *

+ * @return void No value is returned. + */ + public function offsetSet ($index, $newval) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Unsets the value at the specified index + * @link http://php.net/manual/en/arrayobject.offsetunset.php + * @param mixed $index

+ * The index being unset. + *

+ * @return void No value is returned. + */ + public function offsetUnset ($index) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Appends the value + * @link http://php.net/manual/en/arrayobject.append.php + * @param mixed $value

+ * The value being appended. + *

+ * @return void No value is returned. + */ + public function append ($value) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Creates a copy of the ArrayObject. + * @link http://php.net/manual/en/arrayobject.getarraycopy.php + * @return array a copy of the array. When the ArrayObject refers to an object + * an array of the public properties of that object will be returned. + */ + public function getArrayCopy () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Get the number of public properties in the ArrayObject + * @link http://php.net/manual/en/arrayobject.count.php + * @return int The number of public properties in the ArrayObject. + *

+ *

+ * When the ArrayObject is constructed from an array all properties are public. + */ + public function count () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the behavior flags. + * @link http://php.net/manual/en/arrayobject.getflags.php + * @return int the behavior flags of the ArrayObject. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Sets the behavior flags. + * @link http://php.net/manual/en/arrayobject.setflags.php + * @param int $flags

+ * The new ArrayObject behavior. + * It takes on either a bitmask, or named constants. Using named + * constants is strongly encouraged to ensure compatibility for future + * versions. + *

+ *

+ * The available behavior flags are listed below. The actual + * meanings of these flags are described in the + * predefined constants. + * + * ArrayObject behavior flags + * + * + * + * + * + * + * + * + * + * + * + * + *
valueconstant
1 + * ArrayObject::STD_PROP_LIST + *
2 + * ArrayObject::ARRAY_AS_PROPS + *
+ *

+ * @return void No value is returned. + */ + public function setFlags ($flags) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort the entries by value + * @link http://php.net/manual/en/arrayobject.asort.php + * @return void No value is returned. + */ + public function asort () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort the entries by key + * @link http://php.net/manual/en/arrayobject.ksort.php + * @return void No value is returned. + */ + public function ksort () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort the entries with a user-defined comparison function and maintain key association + * @link http://php.net/manual/en/arrayobject.uasort.php + * @param callable $cmp_function

+ * Function cmp_function should accept two + * parameters which will be filled by pairs of entries. + * The comparison function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @return void No value is returned. + */ + public function uasort (callable $cmp_function) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort the entries by keys using a user-defined comparison function + * @link http://php.net/manual/en/arrayobject.uksort.php + * @param callable $cmp_function

+ * The callback comparison function. + *

+ *

+ * Function cmp_function should accept two + * parameters which will be filled by pairs of entry keys. + * The comparison function must return an integer less than, equal + * to, or greater than zero if the first argument is considered to + * be respectively less than, equal to, or greater than the + * second. + *

+ * @return void No value is returned. + */ + public function uksort (callable $cmp_function) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort entries using a "natural order" algorithm + * @link http://php.net/manual/en/arrayobject.natsort.php + * @return void No value is returned. + */ + public function natsort () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort an array using a case insensitive "natural order" algorithm + * @link http://php.net/manual/en/arrayobject.natcasesort.php + * @return void No value is returned. + */ + public function natcasesort () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Unserialize an ArrayObject + * @link http://php.net/manual/en/arrayobject.unserialize.php + * @param string $serialized

+ * The serialized ArrayObject. + *

+ * @return void The unserialized ArrayObject. + */ + public function unserialize ($serialized) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Serialize an ArrayObject + * @link http://php.net/manual/en/arrayobject.serialize.php + * @return void The serialized representation of the ArrayObject. + */ + public function serialize () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Create a new iterator from an ArrayObject instance + * @link http://php.net/manual/en/arrayobject.getiterator.php + * @return ArrayIterator An iterator from an ArrayObject. + */ + public function getIterator () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Exchange the array for another one. + * @link http://php.net/manual/en/arrayobject.exchangearray.php + * @param mixed $input

+ * The new array or object to exchange with the current array. + *

+ * @return array the old array. + */ + public function exchangeArray ($input) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Sets the iterator classname for the ArrayObject. + * @link http://php.net/manual/en/arrayobject.setiteratorclass.php + * @param string $iterator_class

+ * The classname of the array iterator to use when iterating over this object. + *

+ * @return void No value is returned. + */ + public function setIteratorClass ($iterator_class) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the iterator classname for the ArrayObject. + * @link http://php.net/manual/en/arrayobject.getiteratorclass.php + * @return string the iterator class name that is used to iterate over this object. + */ + public function getIteratorClass () {} + +} + +/** + * This iterator allows to unset and modify values and keys while iterating + * over Arrays and Objects. + * @link http://php.net/manual/en/class.arrayiterator.php + * @jms-builtin + */ +class ArrayIterator implements Iterator, Traversable, ArrayAccess, SeekableIterator, Serializable, Countable { + const STD_PROP_LIST = 1; + const ARRAY_AS_PROPS = 2; + + + /** + * (PHP 5 >= 5.0.0)
+ * Construct an ArrayIterator + * @link http://php.net/manual/en/arrayiterator.construct.php + * @param mixed $array

+ * The array or object to be iterated on. + *

+ */ + public function __construct ($array) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Check if offset exists + * @link http://php.net/manual/en/arrayiterator.offsetexists.php + * @param string $index

+ * The offset being checked. + *

+ * @return void TRUE if the offset exists, otherwise FALSE + */ + public function offsetExists ($index) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Get value for an offset + * @link http://php.net/manual/en/arrayiterator.offsetget.php + * @param string $index

+ * The offset to get the value from. + *

+ * @return mixed The value at offset index. + */ + public function offsetGet ($index) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Set value for an offset + * @link http://php.net/manual/en/arrayiterator.offsetset.php + * @param string $index

+ * The index to set for. + *

+ * @param string $newval

+ * The new value to store at the index. + *

+ * @return void No value is returned. + */ + public function offsetSet ($index, $newval) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Unset value for an offset + * @link http://php.net/manual/en/arrayiterator.offsetunset.php + * @param string $index

+ * The offset to unset. + *

+ * @return void No value is returned. + */ + public function offsetUnset ($index) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Append an element + * @link http://php.net/manual/en/arrayiterator.append.php + * @param mixed $value

+ * The value to append. + *

+ * @return void No value is returned. + */ + public function append ($value) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Get array copy + * @link http://php.net/manual/en/arrayiterator.getarraycopy.php + * @return array A copy of the array, or array of public properties + * if ArrayIterator refers to an object. + */ + public function getArrayCopy () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Count elements + * @link http://php.net/manual/en/arrayiterator.count.php + * @return int The number of elements or public properties in the associated + * array or object, respectively. + */ + public function count () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get flags + * @link http://php.net/manual/en/arrayiterator.getflags.php + * @return void The current flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Set behaviour flags + * @link http://php.net/manual/en/arrayiterator.setflags.php + * @param string $flags

+ * A bitmask as follows: + * 0 = Properties of the object have their normal functionality + * when accessed as list (var_dump, foreach, etc.). + * 1 = Array indices can be accessed as properties in read/write. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort array by values + * @link http://php.net/manual/en/arrayiterator.asort.php + * @return void No value is returned. + */ + public function asort () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort array by keys + * @link http://php.net/manual/en/arrayiterator.ksort.php + * @return void No value is returned. + */ + public function ksort () {} + + /** + * (PHP 5 >= 5.2.0)
+ * User defined sort + * @link http://php.net/manual/en/arrayiterator.uasort.php + * @param string $cmp_function

+ * The compare function used for the sort. + *

+ * @return void No value is returned. + */ + public function uasort ($cmp_function) {} + + /** + * (PHP 5 >= 5.2.0)
+ * User defined sort + * @link http://php.net/manual/en/arrayiterator.uksort.php + * @param string $cmp_function

+ * The compare function used for the sort. + *

+ * @return void No value is returned. + */ + public function uksort ($cmp_function) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort an array naturally + * @link http://php.net/manual/en/arrayiterator.natsort.php + * @return void No value is returned. + */ + public function natsort () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort an array naturally, case insensitive + * @link http://php.net/manual/en/arrayiterator.natcasesort.php + * @return void No value is returned. + */ + public function natcasesort () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Unserialize + * @link http://php.net/manual/en/arrayiterator.unserialize.php + * @param string $serialized

+ * The serialized ArrayIterator object to be unserialized. + *

+ * @return string The ArrayIterator. + */ + public function unserialize ($serialized) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Serialize + * @link http://php.net/manual/en/arrayiterator.serialize.php + * @return string The serialized ArrayIterator. + */ + public function serialize () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Rewind array back to the start + * @link http://php.net/manual/en/arrayiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Return current array entry + * @link http://php.net/manual/en/arrayiterator.current.php + * @return mixed The current array entry. + */ + public function current () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Return current array key + * @link http://php.net/manual/en/arrayiterator.key.php + * @return mixed The current array key. + */ + public function key () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Move to next entry + * @link http://php.net/manual/en/arrayiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Check whether array contains more entries + * @link http://php.net/manual/en/arrayiterator.valid.php + * @return bool No value is returned. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Seek to position + * @link http://php.net/manual/en/arrayiterator.seek.php + * @param int $position

+ * The position to seek to. + *

+ * @return void No value is returned. + */ + public function seek ($position) {} + +} + +/** + * This iterator allows to unset and modify values and keys while iterating over Arrays and Objects + * in the same way as the ArrayIterator. Additionally it is possible to iterate + * over the current iterator entry. + * @link http://php.net/manual/en/class.recursivearrayiterator.php + * @jms-builtin + */ +class RecursiveArrayIterator extends ArrayIterator implements Serializable, SeekableIterator, ArrayAccess, Traversable, Iterator, RecursiveIterator { + const CHILD_ARRAYS_ONLY = 4; + + + /** + * (PHP 5 >= 5.1.0)
+ * Returns whether current entry is an array or an object. + * @link http://php.net/manual/en/recursivearrayiterator.haschildren.php + * @return bool TRUE if the current entry is an array or an object, + * otherwise FALSE is returned. + */ + public function hasChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns an iterator for the current entry if it is an array or an object. + * @link http://php.net/manual/en/recursivearrayiterator.getchildren.php + * @return RecursiveArrayIterator An iterator for the current entry, if it is an array or object. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Construct an ArrayIterator + * @link http://php.net/manual/en/arrayiterator.construct.php + * @param mixed $array

+ * The array or object to be iterated on. + *

+ */ + public function __construct ($array) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Check if offset exists + * @link http://php.net/manual/en/arrayiterator.offsetexists.php + * @param string $index

+ * The offset being checked. + *

+ * @return void TRUE if the offset exists, otherwise FALSE + */ + public function offsetExists ($index) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Get value for an offset + * @link http://php.net/manual/en/arrayiterator.offsetget.php + * @param string $index

+ * The offset to get the value from. + *

+ * @return mixed The value at offset index. + */ + public function offsetGet ($index) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Set value for an offset + * @link http://php.net/manual/en/arrayiterator.offsetset.php + * @param string $index

+ * The index to set for. + *

+ * @param string $newval

+ * The new value to store at the index. + *

+ * @return void No value is returned. + */ + public function offsetSet ($index, $newval) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Unset value for an offset + * @link http://php.net/manual/en/arrayiterator.offsetunset.php + * @param string $index

+ * The offset to unset. + *

+ * @return void No value is returned. + */ + public function offsetUnset ($index) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Append an element + * @link http://php.net/manual/en/arrayiterator.append.php + * @param mixed $value

+ * The value to append. + *

+ * @return void No value is returned. + */ + public function append ($value) {} + + /** + * (PHP 5 >= 5.0.0)
+ * Get array copy + * @link http://php.net/manual/en/arrayiterator.getarraycopy.php + * @return array A copy of the array, or array of public properties + * if ArrayIterator refers to an object. + */ + public function getArrayCopy () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Count elements + * @link http://php.net/manual/en/arrayiterator.count.php + * @return int The number of elements or public properties in the associated + * array or object, respectively. + */ + public function count () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get flags + * @link http://php.net/manual/en/arrayiterator.getflags.php + * @return void The current flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Set behaviour flags + * @link http://php.net/manual/en/arrayiterator.setflags.php + * @param string $flags

+ * A bitmask as follows: + * 0 = Properties of the object have their normal functionality + * when accessed as list (var_dump, foreach, etc.). + * 1 = Array indices can be accessed as properties in read/write. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort array by values + * @link http://php.net/manual/en/arrayiterator.asort.php + * @return void No value is returned. + */ + public function asort () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort array by keys + * @link http://php.net/manual/en/arrayiterator.ksort.php + * @return void No value is returned. + */ + public function ksort () {} + + /** + * (PHP 5 >= 5.2.0)
+ * User defined sort + * @link http://php.net/manual/en/arrayiterator.uasort.php + * @param string $cmp_function

+ * The compare function used for the sort. + *

+ * @return void No value is returned. + */ + public function uasort ($cmp_function) {} + + /** + * (PHP 5 >= 5.2.0)
+ * User defined sort + * @link http://php.net/manual/en/arrayiterator.uksort.php + * @param string $cmp_function

+ * The compare function used for the sort. + *

+ * @return void No value is returned. + */ + public function uksort ($cmp_function) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort an array naturally + * @link http://php.net/manual/en/arrayiterator.natsort.php + * @return void No value is returned. + */ + public function natsort () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sort an array naturally, case insensitive + * @link http://php.net/manual/en/arrayiterator.natcasesort.php + * @return void No value is returned. + */ + public function natcasesort () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Unserialize + * @link http://php.net/manual/en/arrayiterator.unserialize.php + * @param string $serialized

+ * The serialized ArrayIterator object to be unserialized. + *

+ * @return string The ArrayIterator. + */ + public function unserialize ($serialized) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Serialize + * @link http://php.net/manual/en/arrayiterator.serialize.php + * @return string The serialized ArrayIterator. + */ + public function serialize () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Rewind array back to the start + * @link http://php.net/manual/en/arrayiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Return current array entry + * @link http://php.net/manual/en/arrayiterator.current.php + * @return mixed The current array entry. + */ + public function current () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Return current array key + * @link http://php.net/manual/en/arrayiterator.key.php + * @return mixed The current array key. + */ + public function key () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Move to next entry + * @link http://php.net/manual/en/arrayiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Check whether array contains more entries + * @link http://php.net/manual/en/arrayiterator.valid.php + * @return bool No value is returned. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.0.0)
+ * Seek to position + * @link http://php.net/manual/en/arrayiterator.seek.php + * @param int $position

+ * The position to seek to. + *

+ * @return void No value is returned. + */ + public function seek ($position) {} + +} + +/** + * The SplFileInfo class offers a high-level object oriented interface to + * information for an individual file. + * @link http://php.net/manual/en/class.splfileinfo.php + * @jms-builtin + */ +class SplFileInfo { + + /** + * (PHP 5 >= 5.1.2)
+ * Construct a new SplFileInfo object + * @link http://php.net/manual/en/splfileinfo.construct.php + * @param string $file_name

+ * Path to the file. + *

+ */ + public function __construct ($file_name) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path without filename + * @link http://php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the filename + * @link http://php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * (PHP 5 >= 5.3.6)
+ * Gets the file extension + * @link http://php.net/manual/en/splfileinfo.getextension.php + * @return string a string containing the file extension, or an + * empty string if the file has no extension. + */ + public function getExtension () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the base name of the file + * @link http://php.net/manual/en/splfileinfo.getbasename.php + * @param string $suffix [optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path to the file + * @link http://php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file permissions + * @link http://php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode for the file + * @link http://php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file size + * @link http://php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the owner of the file + * @link http://php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the file group + * @link http://php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets last access time of the file + * @link http://php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the last modified time + * @link http://php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode change time + * @link http://php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file type + * @link http://php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the entry is writable + * @link http://php.net/manual/en/splfileinfo.iswritable.php + * @return bool TRUE if writable, FALSE otherwise; + */ + public function isWritable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if file is readable + * @link http://php.net/manual/en/splfileinfo.isreadable.php + * @return bool TRUE if readable, FALSE otherwise. + */ + public function isReadable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is executable + * @link http://php.net/manual/en/splfileinfo.isexecutable.php + * @return bool TRUE if executable, FALSE otherwise. + */ + public function isExecutable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the object references a regular file + * @link http://php.net/manual/en/splfileinfo.isfile.php + * @return bool TRUE if the file exists and is a regular file (not a link), FALSE otherwise. + */ + public function isFile () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a directory + * @link http://php.net/manual/en/splfileinfo.isdir.php + * @return bool TRUE if a directory, FALSE otherwise. + */ + public function isDir () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a link + * @link http://php.net/manual/en/splfileinfo.islink.php + * @return bool TRUE if the file is a link, FALSE otherwise. + */ + public function isLink () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the target of a link + * @link http://php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets absolute path to file + * @link http://php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the file + * @link http://php.net/manual/en/splfileinfo.getfileinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the path + * @link http://php.net/manual/en/splfileinfo.getpathinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileObject object for the file + * @link http://php.net/manual/en/splfileinfo.openfile.php + * @param string $open_mode [optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param bool $use_include_path [optional]

+ * When set to TRUE, the filename is also + * searched for within the include_path + *

+ * @param resource $context [optional]

+ * Refer to the context + * section of the manual for a description of contexts. + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = 'r', $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class name used with SplFileInfo::openFile + * @link http://php.net/manual/en/splfileinfo.setfileclass.php + * @param string $class_name [optional]

+ * The class name to use when openFile() is called. + *

+ * @return void No value is returned. + */ + public function setFileClass ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class used with getFileInfo and getPathInfo + * @link http://php.net/manual/en/splfileinfo.setinfoclass.php + * @param string $class_name [optional]

+ * The class name to use. + *

+ * @return void No value is returned. + */ + public function setInfoClass ($class_name = null) {} + + final public function _bad_state_ex () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Returns the path to the file as a string + * @link http://php.net/manual/en/splfileinfo.tostring.php + * @return void the path to the file. + */ + public function __toString () {} + +} + +/** + * The DirectoryIterator class provides a simple interface for viewing + * the contents of filesystem directories. + * @link http://php.net/manual/en/class.directoryiterator.php + * @jms-builtin + */ +class DirectoryIterator extends SplFileInfo implements Iterator, Traversable, SeekableIterator { + + /** + * (PHP 5)
+ * Constructs a new directory iterator from a path + * @link http://php.net/manual/en/directoryiterator.construct.php + * @param $path + */ + public function __construct ($path) {} + + /** + * (PHP 5)
+ * Return file name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * (No version information available, might only be in SVN)
+ * Returns the file extension component of path + * @link http://php.net/manual/en/directoryiterator.getextension.php + * @return string + */ + public function getExtension () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Get base name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getbasename.php + * @param string $suffix [optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * (PHP 5)
+ * Determine if current DirectoryIterator item is '.' or '..' + * @link http://php.net/manual/en/directoryiterator.isdot.php + * @return bool TRUE if the entry is . or .., + * otherwise FALSE + */ + public function isDot () {} + + /** + * (PHP 5)
+ * Rewind the DirectoryIterator back to the start + * @link http://php.net/manual/en/directoryiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5)
+ * Check whether current DirectoryIterator position is a valid file + * @link http://php.net/manual/en/directoryiterator.valid.php + * @return bool TRUE if the position is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5)
+ * Return the key for the current DirectoryIterator item + * @link http://php.net/manual/en/directoryiterator.key.php + * @return string The key for the current DirectoryIterator item. + */ + public function key () {} + + /** + * (PHP 5)
+ * Return the current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.current.php + * @return DirectoryIterator The current DirectoryIterator item. + */ + public function current () {} + + /** + * (PHP 5)
+ * Move forward to next DirectoryIterator item + * @link http://php.net/manual/en/directoryiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Seek to a DirectoryIterator item + * @link http://php.net/manual/en/directoryiterator.seek.php + * @param int $position

+ * The zero-based numeric position to seek to. + *

+ * @return void No value is returned. + */ + public function seek ($position) {} + + /** + * (PHP 5)
+ * Get file name as a string + * @link http://php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path without filename + * @link http://php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path to the file + * @link http://php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file permissions + * @link http://php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode for the file + * @link http://php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file size + * @link http://php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the owner of the file + * @link http://php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the file group + * @link http://php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets last access time of the file + * @link http://php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the last modified time + * @link http://php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode change time + * @link http://php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file type + * @link http://php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the entry is writable + * @link http://php.net/manual/en/splfileinfo.iswritable.php + * @return bool TRUE if writable, FALSE otherwise; + */ + public function isWritable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if file is readable + * @link http://php.net/manual/en/splfileinfo.isreadable.php + * @return bool TRUE if readable, FALSE otherwise. + */ + public function isReadable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is executable + * @link http://php.net/manual/en/splfileinfo.isexecutable.php + * @return bool TRUE if executable, FALSE otherwise. + */ + public function isExecutable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the object references a regular file + * @link http://php.net/manual/en/splfileinfo.isfile.php + * @return bool TRUE if the file exists and is a regular file (not a link), FALSE otherwise. + */ + public function isFile () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a directory + * @link http://php.net/manual/en/splfileinfo.isdir.php + * @return bool TRUE if a directory, FALSE otherwise. + */ + public function isDir () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a link + * @link http://php.net/manual/en/splfileinfo.islink.php + * @return bool TRUE if the file is a link, FALSE otherwise. + */ + public function isLink () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the target of a link + * @link http://php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets absolute path to file + * @link http://php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the file + * @link http://php.net/manual/en/splfileinfo.getfileinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the path + * @link http://php.net/manual/en/splfileinfo.getpathinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileObject object for the file + * @link http://php.net/manual/en/splfileinfo.openfile.php + * @param string $open_mode [optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param bool $use_include_path [optional]

+ * When set to TRUE, the filename is also + * searched for within the include_path + *

+ * @param resource $context [optional]

+ * Refer to the context + * section of the manual for a description of contexts. + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = 'r', $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class name used with SplFileInfo::openFile + * @link http://php.net/manual/en/splfileinfo.setfileclass.php + * @param string $class_name [optional]

+ * The class name to use when openFile() is called. + *

+ * @return void No value is returned. + */ + public function setFileClass ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class used with getFileInfo and getPathInfo + * @link http://php.net/manual/en/splfileinfo.setinfoclass.php + * @param string $class_name [optional]

+ * The class name to use. + *

+ * @return void No value is returned. + */ + public function setInfoClass ($class_name = null) {} + + final public function _bad_state_ex () {} + +} + +/** + * The Filesystem iterator + * @link http://php.net/manual/en/class.filesystemiterator.php + * @jms-builtin + */ +class FilesystemIterator extends DirectoryIterator implements SeekableIterator, Traversable, Iterator { + const CURRENT_MODE_MASK = 240; + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const KEY_MODE_MASK = 3840; + const KEY_AS_PATHNAME = 0; + const FOLLOW_SYMLINKS = 512; + const KEY_AS_FILENAME = 256; + const NEW_CURRENT_AND_KEY = 256; + const OTHER_MODE_MASK = 12288; + const SKIP_DOTS = 4096; + const UNIX_PATHS = 8192; + + + /** + * (PHP 5 >= 5.3.0)
+ * Constructs a new filesystem iterator + * @link http://php.net/manual/en/filesystemiterator.construct.php + * @param string $path

+ * The path of the filesystem item to be iterated over. + *

+ * @param int $flags [optional]

+ * Flags may be provided which will affect the behavior of some methods. + * A list of the flags can found under FilesystemIterator predefined constants. + * They can also be set later with FilesystemIterator::setFlags + *

+ */ + public function __construct ($path, $flags = 'FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS') {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewinds back to the beginning + * @link http://php.net/manual/en/filesystemiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to the next file + * @link http://php.net/manual/en/filesystemiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Retrieve the key for the current file + * @link http://php.net/manual/en/filesystemiterator.key.php + * @return string the pathname or filename depending on the set flags. + * See the FilesystemIterator constants. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * The current file + * @link http://php.net/manual/en/filesystemiterator.current.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator constants. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get the handling flags + * @link http://php.net/manual/en/filesystemiterator.getflags.php + * @return int The integer value of the set flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets handling flags + * @link http://php.net/manual/en/filesystemiterator.setflags.php + * @param int $flags [optional]

+ * The handling flags to set. + * See the FilesystemIterator constants. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags = null) {} + + /** + * (PHP 5)
+ * Return file name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * (No version information available, might only be in SVN)
+ * Returns the file extension component of path + * @link http://php.net/manual/en/directoryiterator.getextension.php + * @return string + */ + public function getExtension () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Get base name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getbasename.php + * @param string $suffix [optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * (PHP 5)
+ * Determine if current DirectoryIterator item is '.' or '..' + * @link http://php.net/manual/en/directoryiterator.isdot.php + * @return bool TRUE if the entry is . or .., + * otherwise FALSE + */ + public function isDot () {} + + /** + * (PHP 5)
+ * Check whether current DirectoryIterator position is a valid file + * @link http://php.net/manual/en/directoryiterator.valid.php + * @return bool TRUE if the position is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Seek to a DirectoryIterator item + * @link http://php.net/manual/en/directoryiterator.seek.php + * @param int $position

+ * The zero-based numeric position to seek to. + *

+ * @return void No value is returned. + */ + public function seek ($position) {} + + /** + * (PHP 5)
+ * Get file name as a string + * @link http://php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path without filename + * @link http://php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path to the file + * @link http://php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file permissions + * @link http://php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode for the file + * @link http://php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file size + * @link http://php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the owner of the file + * @link http://php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the file group + * @link http://php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets last access time of the file + * @link http://php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the last modified time + * @link http://php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode change time + * @link http://php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file type + * @link http://php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the entry is writable + * @link http://php.net/manual/en/splfileinfo.iswritable.php + * @return bool TRUE if writable, FALSE otherwise; + */ + public function isWritable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if file is readable + * @link http://php.net/manual/en/splfileinfo.isreadable.php + * @return bool TRUE if readable, FALSE otherwise. + */ + public function isReadable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is executable + * @link http://php.net/manual/en/splfileinfo.isexecutable.php + * @return bool TRUE if executable, FALSE otherwise. + */ + public function isExecutable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the object references a regular file + * @link http://php.net/manual/en/splfileinfo.isfile.php + * @return bool TRUE if the file exists and is a regular file (not a link), FALSE otherwise. + */ + public function isFile () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a directory + * @link http://php.net/manual/en/splfileinfo.isdir.php + * @return bool TRUE if a directory, FALSE otherwise. + */ + public function isDir () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a link + * @link http://php.net/manual/en/splfileinfo.islink.php + * @return bool TRUE if the file is a link, FALSE otherwise. + */ + public function isLink () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the target of a link + * @link http://php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets absolute path to file + * @link http://php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the file + * @link http://php.net/manual/en/splfileinfo.getfileinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the path + * @link http://php.net/manual/en/splfileinfo.getpathinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileObject object for the file + * @link http://php.net/manual/en/splfileinfo.openfile.php + * @param string $open_mode [optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param bool $use_include_path [optional]

+ * When set to TRUE, the filename is also + * searched for within the include_path + *

+ * @param resource $context [optional]

+ * Refer to the context + * section of the manual for a description of contexts. + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = 'r', $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class name used with SplFileInfo::openFile + * @link http://php.net/manual/en/splfileinfo.setfileclass.php + * @param string $class_name [optional]

+ * The class name to use when openFile() is called. + *

+ * @return void No value is returned. + */ + public function setFileClass ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class used with getFileInfo and getPathInfo + * @link http://php.net/manual/en/splfileinfo.setinfoclass.php + * @param string $class_name [optional]

+ * The class name to use. + *

+ * @return void No value is returned. + */ + public function setInfoClass ($class_name = null) {} + + final public function _bad_state_ex () {} + +} + +/** + * The RecursiveDirectoryIterator provides + * an interface for iterating recursively over filesystem directories. + * @link http://php.net/manual/en/class.recursivedirectoryiterator.php + * @jms-builtin + */ +class RecursiveDirectoryIterator extends FilesystemIterator implements Iterator, Traversable, SeekableIterator, RecursiveIterator { + const CURRENT_MODE_MASK = 240; + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const KEY_MODE_MASK = 3840; + const KEY_AS_PATHNAME = 0; + const FOLLOW_SYMLINKS = 512; + const KEY_AS_FILENAME = 256; + const NEW_CURRENT_AND_KEY = 256; + const OTHER_MODE_MASK = 12288; + const SKIP_DOTS = 4096; + const UNIX_PATHS = 8192; + + + /** + * (PHP 5 >= 5.1.2)
+ * Constructs a RecursiveDirectoryIterator + * @link http://php.net/manual/en/recursivedirectoryiterator.construct.php + * @param string $path

+ * The path of the directory to be iterated over. + *

+ * @param int $flags [optional]

+ * Flags may be provided which will affect the behavior of some methods. + * A list of the flags can found under + * FilesystemIterator predefined constants. + * They can also be set later with FilesystemIterator::setFlags. + *

+ */ + public function __construct ($path, $flags = 'FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO') {} + + /** + * (PHP 5)
+ * Returns whether current entry is a directory and not '.' or '..' + * @link http://php.net/manual/en/recursivedirectoryiterator.haschildren.php + * @param bool $allow_links [optional]

+ *

+ * @return bool whether the current entry is a directory, but not '.' or '..' + */ + public function hasChildren ($allow_links = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns an iterator for the current entry if it is a directory + * @link http://php.net/manual/en/recursivedirectoryiterator.getchildren.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator + * constants. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get sub path + * @link http://php.net/manual/en/recursivedirectoryiterator.getsubpath.php + * @return string The sub path (sub directory). + */ + public function getSubPath () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get sub path and name + * @link http://php.net/manual/en/recursivedirectoryiterator.getsubpathname.php + * @return string The sub path (sub directory) and filename. + */ + public function getSubPathname () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewinds back to the beginning + * @link http://php.net/manual/en/filesystemiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to the next file + * @link http://php.net/manual/en/filesystemiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Retrieve the key for the current file + * @link http://php.net/manual/en/filesystemiterator.key.php + * @return string the pathname or filename depending on the set flags. + * See the FilesystemIterator constants. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * The current file + * @link http://php.net/manual/en/filesystemiterator.current.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator constants. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get the handling flags + * @link http://php.net/manual/en/filesystemiterator.getflags.php + * @return int The integer value of the set flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets handling flags + * @link http://php.net/manual/en/filesystemiterator.setflags.php + * @param int $flags [optional]

+ * The handling flags to set. + * See the FilesystemIterator constants. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags = null) {} + + /** + * (PHP 5)
+ * Return file name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * (No version information available, might only be in SVN)
+ * Returns the file extension component of path + * @link http://php.net/manual/en/directoryiterator.getextension.php + * @return string + */ + public function getExtension () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Get base name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getbasename.php + * @param string $suffix [optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * (PHP 5)
+ * Determine if current DirectoryIterator item is '.' or '..' + * @link http://php.net/manual/en/directoryiterator.isdot.php + * @return bool TRUE if the entry is . or .., + * otherwise FALSE + */ + public function isDot () {} + + /** + * (PHP 5)
+ * Check whether current DirectoryIterator position is a valid file + * @link http://php.net/manual/en/directoryiterator.valid.php + * @return bool TRUE if the position is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Seek to a DirectoryIterator item + * @link http://php.net/manual/en/directoryiterator.seek.php + * @param int $position

+ * The zero-based numeric position to seek to. + *

+ * @return void No value is returned. + */ + public function seek ($position) {} + + /** + * (PHP 5)
+ * Get file name as a string + * @link http://php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path without filename + * @link http://php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path to the file + * @link http://php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file permissions + * @link http://php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode for the file + * @link http://php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file size + * @link http://php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the owner of the file + * @link http://php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the file group + * @link http://php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets last access time of the file + * @link http://php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the last modified time + * @link http://php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode change time + * @link http://php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file type + * @link http://php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the entry is writable + * @link http://php.net/manual/en/splfileinfo.iswritable.php + * @return bool TRUE if writable, FALSE otherwise; + */ + public function isWritable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if file is readable + * @link http://php.net/manual/en/splfileinfo.isreadable.php + * @return bool TRUE if readable, FALSE otherwise. + */ + public function isReadable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is executable + * @link http://php.net/manual/en/splfileinfo.isexecutable.php + * @return bool TRUE if executable, FALSE otherwise. + */ + public function isExecutable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the object references a regular file + * @link http://php.net/manual/en/splfileinfo.isfile.php + * @return bool TRUE if the file exists and is a regular file (not a link), FALSE otherwise. + */ + public function isFile () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a directory + * @link http://php.net/manual/en/splfileinfo.isdir.php + * @return bool TRUE if a directory, FALSE otherwise. + */ + public function isDir () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a link + * @link http://php.net/manual/en/splfileinfo.islink.php + * @return bool TRUE if the file is a link, FALSE otherwise. + */ + public function isLink () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the target of a link + * @link http://php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets absolute path to file + * @link http://php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the file + * @link http://php.net/manual/en/splfileinfo.getfileinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the path + * @link http://php.net/manual/en/splfileinfo.getpathinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileObject object for the file + * @link http://php.net/manual/en/splfileinfo.openfile.php + * @param string $open_mode [optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param bool $use_include_path [optional]

+ * When set to TRUE, the filename is also + * searched for within the include_path + *

+ * @param resource $context [optional]

+ * Refer to the context + * section of the manual for a description of contexts. + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = 'r', $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class name used with SplFileInfo::openFile + * @link http://php.net/manual/en/splfileinfo.setfileclass.php + * @param string $class_name [optional]

+ * The class name to use when openFile() is called. + *

+ * @return void No value is returned. + */ + public function setFileClass ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class used with getFileInfo and getPathInfo + * @link http://php.net/manual/en/splfileinfo.setinfoclass.php + * @param string $class_name [optional]

+ * The class name to use. + *

+ * @return void No value is returned. + */ + public function setInfoClass ($class_name = null) {} + + final public function _bad_state_ex () {} + +} + +/** + * Iterates through a file system in a similar fashion to + * glob. + * @link http://php.net/manual/en/class.globiterator.php + * @jms-builtin + */ +class GlobIterator extends FilesystemIterator implements Iterator, Traversable, SeekableIterator, Countable { + const CURRENT_MODE_MASK = 240; + const CURRENT_AS_PATHNAME = 32; + const CURRENT_AS_FILEINFO = 0; + const CURRENT_AS_SELF = 16; + const KEY_MODE_MASK = 3840; + const KEY_AS_PATHNAME = 0; + const FOLLOW_SYMLINKS = 512; + const KEY_AS_FILENAME = 256; + const NEW_CURRENT_AND_KEY = 256; + const OTHER_MODE_MASK = 12288; + const SKIP_DOTS = 4096; + const UNIX_PATHS = 8192; + + + /** + * (PHP 5 >= 5.3.0)
+ * Construct a directory using glob + * @link http://php.net/manual/en/globiterator.construct.php + * @param string $path

+ * The path of the directory. + *

+ * @param int $flags [optional]

+ * Option flags, the flags may be a bitmask of the + * FilesystemIterator constants. + *

+ */ + public function __construct ($path, $flags = 'FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO') {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get the number of directories and files + * @link http://php.net/manual/en/globiterator.count.php + * @return int The number of returned directories and files, as an + * integer. + */ + public function count () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewinds back to the beginning + * @link http://php.net/manual/en/filesystemiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to the next file + * @link http://php.net/manual/en/filesystemiterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Retrieve the key for the current file + * @link http://php.net/manual/en/filesystemiterator.key.php + * @return string the pathname or filename depending on the set flags. + * See the FilesystemIterator constants. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * The current file + * @link http://php.net/manual/en/filesystemiterator.current.php + * @return mixed The filename, file information, or $this depending on the set flags. + * See the FilesystemIterator constants. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get the handling flags + * @link http://php.net/manual/en/filesystemiterator.getflags.php + * @return int The integer value of the set flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets handling flags + * @link http://php.net/manual/en/filesystemiterator.setflags.php + * @param int $flags [optional]

+ * The handling flags to set. + * See the FilesystemIterator constants. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags = null) {} + + /** + * (PHP 5)
+ * Return file name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getfilename.php + * @return string the file name of the current DirectoryIterator item. + */ + public function getFilename () {} + + /** + * (No version information available, might only be in SVN)
+ * Returns the file extension component of path + * @link http://php.net/manual/en/directoryiterator.getextension.php + * @return string + */ + public function getExtension () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Get base name of current DirectoryIterator item. + * @link http://php.net/manual/en/directoryiterator.getbasename.php + * @param string $suffix [optional]

+ * If the base name ends in suffix, + * this will be cut. + *

+ * @return string The base name of the current DirectoryIterator item. + */ + public function getBasename ($suffix = null) {} + + /** + * (PHP 5)
+ * Determine if current DirectoryIterator item is '.' or '..' + * @link http://php.net/manual/en/directoryiterator.isdot.php + * @return bool TRUE if the entry is . or .., + * otherwise FALSE + */ + public function isDot () {} + + /** + * (PHP 5)
+ * Check whether current DirectoryIterator position is a valid file + * @link http://php.net/manual/en/directoryiterator.valid.php + * @return bool TRUE if the position is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Seek to a DirectoryIterator item + * @link http://php.net/manual/en/directoryiterator.seek.php + * @param int $position

+ * The zero-based numeric position to seek to. + *

+ * @return void No value is returned. + */ + public function seek ($position) {} + + /** + * (PHP 5)
+ * Get file name as a string + * @link http://php.net/manual/en/directoryiterator.tostring.php + * @return string the file name of the current DirectoryIterator item. + */ + public function __toString () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path without filename + * @link http://php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path to the file + * @link http://php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file permissions + * @link http://php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode for the file + * @link http://php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file size + * @link http://php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the owner of the file + * @link http://php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the file group + * @link http://php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets last access time of the file + * @link http://php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the last modified time + * @link http://php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode change time + * @link http://php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file type + * @link http://php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the entry is writable + * @link http://php.net/manual/en/splfileinfo.iswritable.php + * @return bool TRUE if writable, FALSE otherwise; + */ + public function isWritable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if file is readable + * @link http://php.net/manual/en/splfileinfo.isreadable.php + * @return bool TRUE if readable, FALSE otherwise. + */ + public function isReadable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is executable + * @link http://php.net/manual/en/splfileinfo.isexecutable.php + * @return bool TRUE if executable, FALSE otherwise. + */ + public function isExecutable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the object references a regular file + * @link http://php.net/manual/en/splfileinfo.isfile.php + * @return bool TRUE if the file exists and is a regular file (not a link), FALSE otherwise. + */ + public function isFile () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a directory + * @link http://php.net/manual/en/splfileinfo.isdir.php + * @return bool TRUE if a directory, FALSE otherwise. + */ + public function isDir () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a link + * @link http://php.net/manual/en/splfileinfo.islink.php + * @return bool TRUE if the file is a link, FALSE otherwise. + */ + public function isLink () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the target of a link + * @link http://php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets absolute path to file + * @link http://php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the file + * @link http://php.net/manual/en/splfileinfo.getfileinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the path + * @link http://php.net/manual/en/splfileinfo.getpathinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileObject object for the file + * @link http://php.net/manual/en/splfileinfo.openfile.php + * @param string $open_mode [optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param bool $use_include_path [optional]

+ * When set to TRUE, the filename is also + * searched for within the include_path + *

+ * @param resource $context [optional]

+ * Refer to the context + * section of the manual for a description of contexts. + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = 'r', $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class name used with SplFileInfo::openFile + * @link http://php.net/manual/en/splfileinfo.setfileclass.php + * @param string $class_name [optional]

+ * The class name to use when openFile() is called. + *

+ * @return void No value is returned. + */ + public function setFileClass ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class used with getFileInfo and getPathInfo + * @link http://php.net/manual/en/splfileinfo.setinfoclass.php + * @param string $class_name [optional]

+ * The class name to use. + *

+ * @return void No value is returned. + */ + public function setInfoClass ($class_name = null) {} + + final public function _bad_state_ex () {} + +} + +/** + * The SplFileObject class offers an object oriented interface for a file. + * @link http://php.net/manual/en/class.splfileobject.php + * @jms-builtin + */ +class SplFileObject extends SplFileInfo implements RecursiveIterator, Traversable, Iterator, SeekableIterator { + const DROP_NEW_LINE = 1; + const READ_AHEAD = 2; + const SKIP_EMPTY = 4; + const READ_CSV = 8; + + + /** + * (PHP 5 >= 5.1.0)
+ * Construct a new file object. + * @link http://php.net/manual/en/splfileobject.construct.php + * @param string $filename

+ * The file to read. + *

+ * A URL can be used as a + * filename with this function if the fopen wrappers have been enabled. + * See fopen for more details on how to specify the + * filename. See the for links to information + * about what abilities the various wrappers have, notes on their usage, + * and information on any predefined variables they may + * provide. + * @param string $open_mode [optional]

+ * The mode in which to open the file. See fopen for a list of allowed modes. + *

+ * @param bool $use_include_path [optional]

+ * Whether to search in the include_path for filename. + *

+ * @param resource $context [optional]

+ * A valid context resource created with stream_context_create. + *

+ */ + public function __construct ($filename, $open_mode = "r", $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the file to the first line + * @link http://php.net/manual/en/splfileobject.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Reached end of file + * @link http://php.net/manual/en/splfileobject.eof.php + * @return bool TRUE if file is at EOF, FALSE otherwise. + */ + public function eof () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Not at EOF + * @link http://php.net/manual/en/splfileobject.valid.php + * @return bool TRUE if not reached EOF, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets line from file + * @link http://php.net/manual/en/splfileobject.fgets.php + * @return string a string containing the next line from the file, or FALSE on error. + */ + public function fgets () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets line from file and parse as CSV fields + * @link http://php.net/manual/en/splfileobject.fgetcsv.php + * @param string $delimiter [optional]

+ * The field delimiter (one character only). Defaults as a comma or the value set using SplFileObject::setCsvControl. + *

+ * @param string $enclosure [optional]

+ * The field enclosure character (one character only). Defaults as a double quotation mark or the value set using SplFileObject::setCsvControl. + *

+ * @param string $escape [optional]

+ * The escape character (one character only). Defaults as a backslash (\) or the value set using SplFileObject::setCsvControl. + *

+ * @return array an indexed array containing the fields read, or FALSE on error. + *

+ *

+ * A blank line in a CSV file will be returned as an array + * comprising a single NULL field unless using SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, + * in which case empty lines are skipped. + */ + public function fgetcsv ($delimiter = ",", $enclosure = "\"", $escape = "\\") {} + + /** + * (PHP 5 >= 5.4.0)
+ * Write a field array as a CSV line + * @link http://php.net/manual/en/splfileobject.fputcsv.php + * @param array $fields

+ * An array of values. + *

+ * @param string $delimiter [optional]

+ * The optional delimiter parameter sets the field + * delimiter (one character only). + *

+ * @param string $enclosure [optional]

+ * The optional enclosure parameter sets the field + * enclosure (one character only). + *

+ * @return int the length of the written string or FALSE on failure. + *

+ *

+ * Returns FALSE, and does not write the CSV line to the file, if the + * delimiter or enclosure + * parameter is not a single character. + */ + public function fputcsv (array $fields, $delimiter = ',', $enclosure = '"') {} + + /** + * (PHP 5 >= 5.2.0)
+ * Set the delimiter and enclosure character for CSV + * @link http://php.net/manual/en/splfileobject.setcsvcontrol.php + * @param string $delimiter [optional]

+ * The field delimiter (one character only). + *

+ * @param string $enclosure [optional]

+ * The field enclosure character (one character only). + *

+ * @param string $escape [optional]

+ * The field escape character (one character only). + *

+ * @return void No value is returned. + */ + public function setCsvControl ($delimiter = ",", $enclosure = "\"", $escape = "\\") {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get the delimiter and enclosure character for CSV + * @link http://php.net/manual/en/splfileobject.getcsvcontrol.php + * @return array an indexed array containing the delimiter and enclosure character. + */ + public function getCsvControl () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Portable file locking + * @link http://php.net/manual/en/splfileobject.flock.php + * @param int $operation

+ * operation is one of the following: + * LOCK_SH to acquire a shared lock (reader). + * @param int $wouldblock [optional]

+ * Set to TRUE if the lock would block (EWOULDBLOCK errno condition). + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function flock ($operation, &$wouldblock = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Flushes the output to the file + * @link http://php.net/manual/en/splfileobject.fflush.php + * @return bool TRUE on success or FALSE on failure. + */ + public function fflush () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Return current file position + * @link http://php.net/manual/en/splfileobject.ftell.php + * @return int the position of the file pointer as an integer, or FALSE on error. + */ + public function ftell () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Seek to a position + * @link http://php.net/manual/en/splfileobject.fseek.php + * @param int $offset

+ * The offset. A negative value can be used to move backwards through the file which + * is useful when SEEK_END is used as the whence value. + *

+ * @param int $whence [optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + * SEEK_END - Set position to end-of-file plus offset. + *

+ *

+ * If whence is not specified, it is assumed to be SEEK_SET. + *

+ * @return int 0 if the seek was successful, -1 otherwise. Note that seeking + * past EOF is not considered an error. + */ + public function fseek ($offset, $whence = 'SEEK_SET') {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets character from file + * @link http://php.net/manual/en/splfileobject.fgetc.php + * @return string a string containing a single character read from the file or FALSE on EOF. + */ + public function fgetc () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Output all remaining data on a file pointer + * @link http://php.net/manual/en/splfileobject.fpassthru.php + * @return int the number of characters read from handle + * and passed through to the output. + */ + public function fpassthru () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets line from file and strip HTML tags + * @link http://php.net/manual/en/splfileobject.fgetss.php + * @param string $allowable_tags [optional]

+ * You can use the optional third parameter to specify tags which should + * not be stripped. + *

+ * @return string a string containing the next line of the file with HTML and PHP + * code stripped, or FALSE on error. + */ + public function fgetss ($allowable_tags = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Parses input from file according to a format + * @link http://php.net/manual/en/splfileobject.fscanf.php + * @param string $format

+ * The specified format as described in the sprintf documentation. + *

+ * @param mixed $_ [optional]

+ * The optional assigned values. + *

+ * @return mixed If only one parameter is passed to this method, the values parsed will be + * returned as an array. Otherwise, if optional parameters are passed, the + * function will return the number of assigned values. The optional + * parameters must be passed by reference. + */ + public function fscanf ($format, &$_ = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Write to file + * @link http://php.net/manual/en/splfileobject.fwrite.php + * @param string $str

+ * The string to be written to the file. + *

+ * @param int $length [optional]

+ * If the length argument is given, writing will + * stop after length bytes have been written or + * the end of string is reached, whichever comes + * first. + *

+ * @return int the number of bytes written, or NULL on error. + */ + public function fwrite ($str, $length = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets information about the file + * @link http://php.net/manual/en/splfileobject.fstat.php + * @return array an array with the statistics of the file; the format of the array + * is described in detail on the stat manual page. + */ + public function fstat () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Truncates the file to a given length + * @link http://php.net/manual/en/splfileobject.ftruncate.php + * @param int $size

+ * The size to truncate to. + *

+ *

+ * If size is larger than the file it is extended with null bytes. + *

+ *

+ * If size is smaller than the file, the extra data will be lost. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function ftruncate ($size) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Retrieve current line of file + * @link http://php.net/manual/en/splfileobject.current.php + * @return string|array Retrieves the current line of the file. If the SplFileObject::READ_CSV flag is set, this method returns an array containing the current line parsed as CSV data. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get line number + * @link http://php.net/manual/en/splfileobject.key.php + * @return int the current line number. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Read next line + * @link http://php.net/manual/en/splfileobject.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Sets flags for the SplFileObject + * @link http://php.net/manual/en/splfileobject.setflags.php + * @param int $flags

+ * Bit mask of the flags to set. See + * SplFileObject constants + * for the available flags. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets flags for the SplFileObject + * @link http://php.net/manual/en/splfileobject.getflags.php + * @return int an integer representing the flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Set maximum line length + * @link http://php.net/manual/en/splfileobject.setmaxlinelen.php + * @param int $max_len

+ * The maximum length of a line. + *

+ * @return void No value is returned. + */ + public function setMaxLineLen ($max_len) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get maximum line length + * @link http://php.net/manual/en/splfileobject.getmaxlinelen.php + * @return int the maximum line length if one has been set with + * SplFileObject::setMaxLineLen, default is 0. + */ + public function getMaxLineLen () {} + + /** + * (PHP 5 >= 5.1.2)
+ * SplFileObject does not have children + * @link http://php.net/manual/en/splfileobject.haschildren.php + * @return bool FALSE + */ + public function hasChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * No purpose + * @link http://php.net/manual/en/splfileobject.getchildren.php + * @return void No value is returned. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Seek to specified line + * @link http://php.net/manual/en/splfileobject.seek.php + * @param int $line_pos

+ * The zero-based line number to seek to. + *

+ * @return void No value is returned. + */ + public function seek ($line_pos) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Alias of SplFileObject::fgets + * @link http://php.net/manual/en/splfileobject.getcurrentline.php + */ + public function getCurrentLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Alias of SplFileObject::current + * @link http://php.net/manual/en/splfileobject.tostring.php + */ + public function __toString () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path without filename + * @link http://php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the filename + * @link http://php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * (PHP 5 >= 5.3.6)
+ * Gets the file extension + * @link http://php.net/manual/en/splfileinfo.getextension.php + * @return string a string containing the file extension, or an + * empty string if the file has no extension. + */ + public function getExtension () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the base name of the file + * @link http://php.net/manual/en/splfileinfo.getbasename.php + * @param string $suffix [optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path to the file + * @link http://php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file permissions + * @link http://php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode for the file + * @link http://php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file size + * @link http://php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the owner of the file + * @link http://php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the file group + * @link http://php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets last access time of the file + * @link http://php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the last modified time + * @link http://php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode change time + * @link http://php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file type + * @link http://php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the entry is writable + * @link http://php.net/manual/en/splfileinfo.iswritable.php + * @return bool TRUE if writable, FALSE otherwise; + */ + public function isWritable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if file is readable + * @link http://php.net/manual/en/splfileinfo.isreadable.php + * @return bool TRUE if readable, FALSE otherwise. + */ + public function isReadable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is executable + * @link http://php.net/manual/en/splfileinfo.isexecutable.php + * @return bool TRUE if executable, FALSE otherwise. + */ + public function isExecutable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the object references a regular file + * @link http://php.net/manual/en/splfileinfo.isfile.php + * @return bool TRUE if the file exists and is a regular file (not a link), FALSE otherwise. + */ + public function isFile () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a directory + * @link http://php.net/manual/en/splfileinfo.isdir.php + * @return bool TRUE if a directory, FALSE otherwise. + */ + public function isDir () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a link + * @link http://php.net/manual/en/splfileinfo.islink.php + * @return bool TRUE if the file is a link, FALSE otherwise. + */ + public function isLink () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the target of a link + * @link http://php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets absolute path to file + * @link http://php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the file + * @link http://php.net/manual/en/splfileinfo.getfileinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the path + * @link http://php.net/manual/en/splfileinfo.getpathinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileObject object for the file + * @link http://php.net/manual/en/splfileinfo.openfile.php + * @param string $open_mode [optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param bool $use_include_path [optional]

+ * When set to TRUE, the filename is also + * searched for within the include_path + *

+ * @param resource $context [optional]

+ * Refer to the context + * section of the manual for a description of contexts. + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = 'r', $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class name used with SplFileInfo::openFile + * @link http://php.net/manual/en/splfileinfo.setfileclass.php + * @param string $class_name [optional]

+ * The class name to use when openFile() is called. + *

+ * @return void No value is returned. + */ + public function setFileClass ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class used with getFileInfo and getPathInfo + * @link http://php.net/manual/en/splfileinfo.setinfoclass.php + * @param string $class_name [optional]

+ * The class name to use. + *

+ * @return void No value is returned. + */ + public function setInfoClass ($class_name = null) {} + + final public function _bad_state_ex () {} + +} + +/** + * The SplTempFileObject class offers an object oriented interface for a temporary file. + * @link http://php.net/manual/en/class.spltempfileobject.php + * @jms-builtin + */ +class SplTempFileObject extends SplFileObject implements SeekableIterator, Iterator, Traversable, RecursiveIterator { + const DROP_NEW_LINE = 1; + const READ_AHEAD = 2; + const SKIP_EMPTY = 4; + const READ_CSV = 8; + + + /** + * (PHP 5 >= 5.1.2)
+ * Construct a new temporary file object + * @link http://php.net/manual/en/spltempfileobject.construct.php + * @param int $max_memory [optional]

+ * The maximum amount of memory (in bytes, default is 2 MB) for + * the temporary file to use. If the temporary file exceeds this + * size, it will be moved to a file in the system's temp directory. + *

+ *

+ * If max_memory is negative, only memory + * will be used. If max_memory is zero, + * no memory will be used. + *

+ */ + public function __construct ($max_memory = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the file to the first line + * @link http://php.net/manual/en/splfileobject.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Reached end of file + * @link http://php.net/manual/en/splfileobject.eof.php + * @return bool TRUE if file is at EOF, FALSE otherwise. + */ + public function eof () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Not at EOF + * @link http://php.net/manual/en/splfileobject.valid.php + * @return bool TRUE if not reached EOF, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets line from file + * @link http://php.net/manual/en/splfileobject.fgets.php + * @return string a string containing the next line from the file, or FALSE on error. + */ + public function fgets () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets line from file and parse as CSV fields + * @link http://php.net/manual/en/splfileobject.fgetcsv.php + * @param string $delimiter [optional]

+ * The field delimiter (one character only). Defaults as a comma or the value set using SplFileObject::setCsvControl. + *

+ * @param string $enclosure [optional]

+ * The field enclosure character (one character only). Defaults as a double quotation mark or the value set using SplFileObject::setCsvControl. + *

+ * @param string $escape [optional]

+ * The escape character (one character only). Defaults as a backslash (\) or the value set using SplFileObject::setCsvControl. + *

+ * @return array an indexed array containing the fields read, or FALSE on error. + *

+ *

+ * A blank line in a CSV file will be returned as an array + * comprising a single NULL field unless using SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, + * in which case empty lines are skipped. + */ + public function fgetcsv ($delimiter = ",", $enclosure = "\"", $escape = "\\") {} + + /** + * (PHP 5 >= 5.4.0)
+ * Write a field array as a CSV line + * @link http://php.net/manual/en/splfileobject.fputcsv.php + * @param array $fields

+ * An array of values. + *

+ * @param string $delimiter [optional]

+ * The optional delimiter parameter sets the field + * delimiter (one character only). + *

+ * @param string $enclosure [optional]

+ * The optional enclosure parameter sets the field + * enclosure (one character only). + *

+ * @return int the length of the written string or FALSE on failure. + *

+ *

+ * Returns FALSE, and does not write the CSV line to the file, if the + * delimiter or enclosure + * parameter is not a single character. + */ + public function fputcsv (array $fields, $delimiter = ',', $enclosure = '"') {} + + /** + * (PHP 5 >= 5.2.0)
+ * Set the delimiter and enclosure character for CSV + * @link http://php.net/manual/en/splfileobject.setcsvcontrol.php + * @param string $delimiter [optional]

+ * The field delimiter (one character only). + *

+ * @param string $enclosure [optional]

+ * The field enclosure character (one character only). + *

+ * @param string $escape [optional]

+ * The field escape character (one character only). + *

+ * @return void No value is returned. + */ + public function setCsvControl ($delimiter = ",", $enclosure = "\"", $escape = "\\") {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get the delimiter and enclosure character for CSV + * @link http://php.net/manual/en/splfileobject.getcsvcontrol.php + * @return array an indexed array containing the delimiter and enclosure character. + */ + public function getCsvControl () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Portable file locking + * @link http://php.net/manual/en/splfileobject.flock.php + * @param int $operation

+ * operation is one of the following: + * LOCK_SH to acquire a shared lock (reader). + * @param int $wouldblock [optional]

+ * Set to TRUE if the lock would block (EWOULDBLOCK errno condition). + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function flock ($operation, &$wouldblock = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Flushes the output to the file + * @link http://php.net/manual/en/splfileobject.fflush.php + * @return bool TRUE on success or FALSE on failure. + */ + public function fflush () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Return current file position + * @link http://php.net/manual/en/splfileobject.ftell.php + * @return int the position of the file pointer as an integer, or FALSE on error. + */ + public function ftell () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Seek to a position + * @link http://php.net/manual/en/splfileobject.fseek.php + * @param int $offset

+ * The offset. A negative value can be used to move backwards through the file which + * is useful when SEEK_END is used as the whence value. + *

+ * @param int $whence [optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + * SEEK_END - Set position to end-of-file plus offset. + *

+ *

+ * If whence is not specified, it is assumed to be SEEK_SET. + *

+ * @return int 0 if the seek was successful, -1 otherwise. Note that seeking + * past EOF is not considered an error. + */ + public function fseek ($offset, $whence = 'SEEK_SET') {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets character from file + * @link http://php.net/manual/en/splfileobject.fgetc.php + * @return string a string containing a single character read from the file or FALSE on EOF. + */ + public function fgetc () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Output all remaining data on a file pointer + * @link http://php.net/manual/en/splfileobject.fpassthru.php + * @return int the number of characters read from handle + * and passed through to the output. + */ + public function fpassthru () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets line from file and strip HTML tags + * @link http://php.net/manual/en/splfileobject.fgetss.php + * @param string $allowable_tags [optional]

+ * You can use the optional third parameter to specify tags which should + * not be stripped. + *

+ * @return string a string containing the next line of the file with HTML and PHP + * code stripped, or FALSE on error. + */ + public function fgetss ($allowable_tags = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Parses input from file according to a format + * @link http://php.net/manual/en/splfileobject.fscanf.php + * @param string $format

+ * The specified format as described in the sprintf documentation. + *

+ * @param mixed $_ [optional]

+ * The optional assigned values. + *

+ * @return mixed If only one parameter is passed to this method, the values parsed will be + * returned as an array. Otherwise, if optional parameters are passed, the + * function will return the number of assigned values. The optional + * parameters must be passed by reference. + */ + public function fscanf ($format, &$_ = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Write to file + * @link http://php.net/manual/en/splfileobject.fwrite.php + * @param string $str

+ * The string to be written to the file. + *

+ * @param int $length [optional]

+ * If the length argument is given, writing will + * stop after length bytes have been written or + * the end of string is reached, whichever comes + * first. + *

+ * @return int the number of bytes written, or NULL on error. + */ + public function fwrite ($str, $length = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets information about the file + * @link http://php.net/manual/en/splfileobject.fstat.php + * @return array an array with the statistics of the file; the format of the array + * is described in detail on the stat manual page. + */ + public function fstat () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Truncates the file to a given length + * @link http://php.net/manual/en/splfileobject.ftruncate.php + * @param int $size

+ * The size to truncate to. + *

+ *

+ * If size is larger than the file it is extended with null bytes. + *

+ *

+ * If size is smaller than the file, the extra data will be lost. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function ftruncate ($size) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Retrieve current line of file + * @link http://php.net/manual/en/splfileobject.current.php + * @return string|array Retrieves the current line of the file. If the SplFileObject::READ_CSV flag is set, this method returns an array containing the current line parsed as CSV data. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get line number + * @link http://php.net/manual/en/splfileobject.key.php + * @return int the current line number. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Read next line + * @link http://php.net/manual/en/splfileobject.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Sets flags for the SplFileObject + * @link http://php.net/manual/en/splfileobject.setflags.php + * @param int $flags

+ * Bit mask of the flags to set. See + * SplFileObject constants + * for the available flags. + *

+ * @return void No value is returned. + */ + public function setFlags ($flags) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets flags for the SplFileObject + * @link http://php.net/manual/en/splfileobject.getflags.php + * @return int an integer representing the flags. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Set maximum line length + * @link http://php.net/manual/en/splfileobject.setmaxlinelen.php + * @param int $max_len

+ * The maximum length of a line. + *

+ * @return void No value is returned. + */ + public function setMaxLineLen ($max_len) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get maximum line length + * @link http://php.net/manual/en/splfileobject.getmaxlinelen.php + * @return int the maximum line length if one has been set with + * SplFileObject::setMaxLineLen, default is 0. + */ + public function getMaxLineLen () {} + + /** + * (PHP 5 >= 5.1.2)
+ * SplFileObject does not have children + * @link http://php.net/manual/en/splfileobject.haschildren.php + * @return bool FALSE + */ + public function hasChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * No purpose + * @link http://php.net/manual/en/splfileobject.getchildren.php + * @return void No value is returned. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Seek to specified line + * @link http://php.net/manual/en/splfileobject.seek.php + * @param int $line_pos

+ * The zero-based line number to seek to. + *

+ * @return void No value is returned. + */ + public function seek ($line_pos) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Alias of SplFileObject::fgets + * @link http://php.net/manual/en/splfileobject.getcurrentline.php + */ + public function getCurrentLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Alias of SplFileObject::current + * @link http://php.net/manual/en/splfileobject.tostring.php + */ + public function __toString () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path without filename + * @link http://php.net/manual/en/splfileinfo.getpath.php + * @return string the path to the file. + */ + public function getPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the filename + * @link http://php.net/manual/en/splfileinfo.getfilename.php + * @return string The filename. + */ + public function getFilename () {} + + /** + * (PHP 5 >= 5.3.6)
+ * Gets the file extension + * @link http://php.net/manual/en/splfileinfo.getextension.php + * @return string a string containing the file extension, or an + * empty string if the file has no extension. + */ + public function getExtension () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the base name of the file + * @link http://php.net/manual/en/splfileinfo.getbasename.php + * @param string $suffix [optional]

+ * Optional suffix to omit from the base name returned. + *

+ * @return string the base name without path information. + */ + public function getBasename ($suffix = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the path to the file + * @link http://php.net/manual/en/splfileinfo.getpathname.php + * @return string The path to the file. + */ + public function getPathname () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file permissions + * @link http://php.net/manual/en/splfileinfo.getperms.php + * @return int the file permissions. + */ + public function getPerms () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode for the file + * @link http://php.net/manual/en/splfileinfo.getinode.php + * @return int the inode number for the filesystem object. + */ + public function getInode () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file size + * @link http://php.net/manual/en/splfileinfo.getsize.php + * @return int The filesize in bytes. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the owner of the file + * @link http://php.net/manual/en/splfileinfo.getowner.php + * @return int The owner id in numerical format. + */ + public function getOwner () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the file group + * @link http://php.net/manual/en/splfileinfo.getgroup.php + * @return int The group id in numerical format. + */ + public function getGroup () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets last access time of the file + * @link http://php.net/manual/en/splfileinfo.getatime.php + * @return int the time the file was last accessed. + */ + public function getATime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the last modified time + * @link http://php.net/manual/en/splfileinfo.getmtime.php + * @return int the last modified time for the file, in a Unix timestamp. + */ + public function getMTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets the inode change time + * @link http://php.net/manual/en/splfileinfo.getctime.php + * @return int The last change time, in a Unix timestamp. + */ + public function getCTime () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets file type + * @link http://php.net/manual/en/splfileinfo.gettype.php + * @return string A string representing the type of the entry. + * May be one of file, link, + * or dir + */ + public function getType () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the entry is writable + * @link http://php.net/manual/en/splfileinfo.iswritable.php + * @return bool TRUE if writable, FALSE otherwise; + */ + public function isWritable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if file is readable + * @link http://php.net/manual/en/splfileinfo.isreadable.php + * @return bool TRUE if readable, FALSE otherwise. + */ + public function isReadable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is executable + * @link http://php.net/manual/en/splfileinfo.isexecutable.php + * @return bool TRUE if executable, FALSE otherwise. + */ + public function isExecutable () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the object references a regular file + * @link http://php.net/manual/en/splfileinfo.isfile.php + * @return bool TRUE if the file exists and is a regular file (not a link), FALSE otherwise. + */ + public function isFile () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a directory + * @link http://php.net/manual/en/splfileinfo.isdir.php + * @return bool TRUE if a directory, FALSE otherwise. + */ + public function isDir () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Tells if the file is a link + * @link http://php.net/manual/en/splfileinfo.islink.php + * @return bool TRUE if the file is a link, FALSE otherwise. + */ + public function isLink () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets the target of a link + * @link http://php.net/manual/en/splfileinfo.getlinktarget.php + * @return string the target of the filesystem link. + */ + public function getLinkTarget () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Gets absolute path to file + * @link http://php.net/manual/en/splfileinfo.getrealpath.php + * @return string the path to the file. + */ + public function getRealPath () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the file + * @link http://php.net/manual/en/splfileinfo.getfileinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo An SplFileInfo object created for the file. + */ + public function getFileInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileInfo object for the path + * @link http://php.net/manual/en/splfileinfo.getpathinfo.php + * @param string $class_name [optional]

+ * Name of an SplFileInfo derived class to use. + *

+ * @return SplFileInfo an SplFileInfo object for the parent path of the file. + */ + public function getPathInfo ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Gets an SplFileObject object for the file + * @link http://php.net/manual/en/splfileinfo.openfile.php + * @param string $open_mode [optional]

+ * The mode for opening the file. See the fopen + * documentation for descriptions of possible modes. The default + * is read only. + *

+ * @param bool $use_include_path [optional]

+ * When set to TRUE, the filename is also + * searched for within the include_path + *

+ * @param resource $context [optional]

+ * Refer to the context + * section of the manual for a description of contexts. + *

+ * @return SplFileObject The opened file as an SplFileObject object. + */ + public function openFile ($open_mode = 'r', $use_include_path = false, $context = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class name used with SplFileInfo::openFile + * @link http://php.net/manual/en/splfileinfo.setfileclass.php + * @param string $class_name [optional]

+ * The class name to use when openFile() is called. + *

+ * @return void No value is returned. + */ + public function setFileClass ($class_name = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets the class used with getFileInfo and getPathInfo + * @link http://php.net/manual/en/splfileinfo.setinfoclass.php + * @param string $class_name [optional]

+ * The class name to use. + *

+ * @return void No value is returned. + */ + public function setInfoClass ($class_name = null) {} + + final public function _bad_state_ex () {} + +} + +/** + * The SplDoublyLinkedList class provides the main functionalities of a doubly linked list. + * @link http://php.net/manual/en/class.spldoublylinkedlist.php + * @jms-builtin + */ +class SplDoublyLinkedList implements Iterator, Traversable, Countable, ArrayAccess, Serializable { + const IT_MODE_LIFO = 2; + const IT_MODE_FIFO = 0; + const IT_MODE_DELETE = 1; + const IT_MODE_KEEP = 0; + + + /** + * (PHP 5 >= 5.3.0)
+ * Pops a node from the end of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.pop.php + * @return mixed The value of the popped node. + */ + public function pop () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Shifts a node from the beginning of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.shift.php + * @return mixed The value of the shifted node. + */ + public function shift () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Pushes an element at the end of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.push.php + * @param mixed $value

+ * The value to push. + *

+ * @return void No value is returned. + */ + public function push ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Prepends the doubly linked list with an element + * @link http://php.net/manual/en/spldoublylinkedlist.unshift.php + * @param mixed $value

+ * The value to unshift. + *

+ * @return void No value is returned. + */ + public function unshift ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Peeks at the node from the end of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.top.php + * @return mixed The value of the last node. + */ + public function top () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Peeks at the node from the beginning of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.bottom.php + * @return mixed The value of the first node. + */ + public function bottom () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks whether the doubly linked list is empty. + * @link http://php.net/manual/en/spldoublylinkedlist.isempty.php + * @return bool whether the doubly linked list is empty. + */ + public function isEmpty () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets the mode of iteration + * @link http://php.net/manual/en/spldoublylinkedlist.setiteratormode.php + * @param int $mode

+ * There are two orthogonal sets of modes that can be set: + *

+ * The direction of the iteration (either one or the other): + * SplDoublyLinkedList::IT_MODE_LIFO (Stack style) + * @return void No value is returned. + */ + public function setIteratorMode ($mode) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the mode of iteration + * @link http://php.net/manual/en/spldoublylinkedlist.getiteratormode.php + * @return int the different modes and flags that affect the iteration. + */ + public function getIteratorMode () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Counts the number of elements in the doubly linked list. + * @link http://php.net/manual/en/spldoublylinkedlist.count.php + * @return int the number of elements in the doubly linked list. + */ + public function count () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns whether the requested $index exists + * @link http://php.net/manual/en/spldoublylinkedlist.offsetexists.php + * @param mixed $index

+ * The index being checked. + *

+ * @return bool TRUE if the requested index exists, otherwise FALSE + */ + public function offsetExists ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the value at the specified $index + * @link http://php.net/manual/en/spldoublylinkedlist.offsetget.php + * @param mixed $index

+ * The index with the value. + *

+ * @return mixed The value at the specified index. + */ + public function offsetGet ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets the value at the specified $index to $newval + * @link http://php.net/manual/en/spldoublylinkedlist.offsetset.php + * @param mixed $index

+ * The index being set. + *

+ * @param mixed $newval

+ * The new value for the index. + *

+ * @return void No value is returned. + */ + public function offsetSet ($index, $newval) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Unsets the value at the specified $index + * @link http://php.net/manual/en/spldoublylinkedlist.offsetunset.php + * @param mixed $index

+ * The index being unset. + *

+ * @return void No value is returned. + */ + public function offsetUnset ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewind iterator back to the start + * @link http://php.net/manual/en/spldoublylinkedlist.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current array entry + * @link http://php.net/manual/en/spldoublylinkedlist.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node index + * @link http://php.net/manual/en/spldoublylinkedlist.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to next entry + * @link http://php.net/manual/en/spldoublylinkedlist.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to previous entry + * @link http://php.net/manual/en/spldoublylinkedlist.prev.php + * @return void No value is returned. + */ + public function prev () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Check whether the doubly linked list contains more nodes + * @link http://php.net/manual/en/spldoublylinkedlist.valid.php + * @return bool TRUE if the doubly linked list contains any more nodes, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.4.0)
+ * Unserializes the storage + * @link http://php.net/manual/en/spldoublylinkedlist.unserialize.php + * @param string $serialized

+ * The serialized string. + *

+ * @return void No value is returned. + */ + public function unserialize ($serialized) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Serializes the storage + * @link http://php.net/manual/en/spldoublylinkedlist.serialize.php + * @return string The serialized string. + */ + public function serialize () {} + +} + +/** + * The SplQueue class provides the main functionalities of a queue implemented using a doubly linked list. + * @link http://php.net/manual/en/class.splqueue.php + * @jms-builtin + */ +class SplQueue extends SplDoublyLinkedList implements Serializable, ArrayAccess, Countable, Traversable, Iterator { + const IT_MODE_LIFO = 2; + const IT_MODE_FIFO = 0; + const IT_MODE_DELETE = 1; + const IT_MODE_KEEP = 0; + + + /** + * (PHP 5 >= 5.3.0)
+ * Adds an element to the queue. + * @link http://php.net/manual/en/splqueue.enqueue.php + * @param mixed $value

+ * The value to enqueue. + *

+ * @return void No value is returned. + */ + public function enqueue ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Dequeues a node from the queue + * @link http://php.net/manual/en/splqueue.dequeue.php + * @return mixed The value of the dequeued node. + */ + public function dequeue () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Pops a node from the end of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.pop.php + * @return mixed The value of the popped node. + */ + public function pop () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Shifts a node from the beginning of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.shift.php + * @return mixed The value of the shifted node. + */ + public function shift () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Pushes an element at the end of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.push.php + * @param mixed $value

+ * The value to push. + *

+ * @return void No value is returned. + */ + public function push ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Prepends the doubly linked list with an element + * @link http://php.net/manual/en/spldoublylinkedlist.unshift.php + * @param mixed $value

+ * The value to unshift. + *

+ * @return void No value is returned. + */ + public function unshift ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Peeks at the node from the end of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.top.php + * @return mixed The value of the last node. + */ + public function top () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Peeks at the node from the beginning of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.bottom.php + * @return mixed The value of the first node. + */ + public function bottom () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks whether the doubly linked list is empty. + * @link http://php.net/manual/en/spldoublylinkedlist.isempty.php + * @return bool whether the doubly linked list is empty. + */ + public function isEmpty () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets the mode of iteration + * @link http://php.net/manual/en/spldoublylinkedlist.setiteratormode.php + * @param int $mode

+ * There are two orthogonal sets of modes that can be set: + *

+ * The direction of the iteration (either one or the other): + * SplDoublyLinkedList::IT_MODE_LIFO (Stack style) + * @return void No value is returned. + */ + public function setIteratorMode ($mode) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the mode of iteration + * @link http://php.net/manual/en/spldoublylinkedlist.getiteratormode.php + * @return int the different modes and flags that affect the iteration. + */ + public function getIteratorMode () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Counts the number of elements in the doubly linked list. + * @link http://php.net/manual/en/spldoublylinkedlist.count.php + * @return int the number of elements in the doubly linked list. + */ + public function count () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns whether the requested $index exists + * @link http://php.net/manual/en/spldoublylinkedlist.offsetexists.php + * @param mixed $index

+ * The index being checked. + *

+ * @return bool TRUE if the requested index exists, otherwise FALSE + */ + public function offsetExists ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the value at the specified $index + * @link http://php.net/manual/en/spldoublylinkedlist.offsetget.php + * @param mixed $index

+ * The index with the value. + *

+ * @return mixed The value at the specified index. + */ + public function offsetGet ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets the value at the specified $index to $newval + * @link http://php.net/manual/en/spldoublylinkedlist.offsetset.php + * @param mixed $index

+ * The index being set. + *

+ * @param mixed $newval

+ * The new value for the index. + *

+ * @return void No value is returned. + */ + public function offsetSet ($index, $newval) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Unsets the value at the specified $index + * @link http://php.net/manual/en/spldoublylinkedlist.offsetunset.php + * @param mixed $index

+ * The index being unset. + *

+ * @return void No value is returned. + */ + public function offsetUnset ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewind iterator back to the start + * @link http://php.net/manual/en/spldoublylinkedlist.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current array entry + * @link http://php.net/manual/en/spldoublylinkedlist.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node index + * @link http://php.net/manual/en/spldoublylinkedlist.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to next entry + * @link http://php.net/manual/en/spldoublylinkedlist.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to previous entry + * @link http://php.net/manual/en/spldoublylinkedlist.prev.php + * @return void No value is returned. + */ + public function prev () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Check whether the doubly linked list contains more nodes + * @link http://php.net/manual/en/spldoublylinkedlist.valid.php + * @return bool TRUE if the doubly linked list contains any more nodes, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.4.0)
+ * Unserializes the storage + * @link http://php.net/manual/en/spldoublylinkedlist.unserialize.php + * @param string $serialized

+ * The serialized string. + *

+ * @return void No value is returned. + */ + public function unserialize ($serialized) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Serializes the storage + * @link http://php.net/manual/en/spldoublylinkedlist.serialize.php + * @return string The serialized string. + */ + public function serialize () {} + +} + +/** + * The SplStack class provides the main functionalities of a stack implemented using a doubly linked list. + * @link http://php.net/manual/en/class.splstack.php + * @jms-builtin + */ +class SplStack extends SplDoublyLinkedList implements Serializable, ArrayAccess, Countable, Traversable, Iterator { + const IT_MODE_LIFO = 2; + const IT_MODE_FIFO = 0; + const IT_MODE_DELETE = 1; + const IT_MODE_KEEP = 0; + + + /** + * (PHP 5 >= 5.3.0)
+ * Pops a node from the end of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.pop.php + * @return mixed The value of the popped node. + */ + public function pop () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Shifts a node from the beginning of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.shift.php + * @return mixed The value of the shifted node. + */ + public function shift () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Pushes an element at the end of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.push.php + * @param mixed $value

+ * The value to push. + *

+ * @return void No value is returned. + */ + public function push ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Prepends the doubly linked list with an element + * @link http://php.net/manual/en/spldoublylinkedlist.unshift.php + * @param mixed $value

+ * The value to unshift. + *

+ * @return void No value is returned. + */ + public function unshift ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Peeks at the node from the end of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.top.php + * @return mixed The value of the last node. + */ + public function top () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Peeks at the node from the beginning of the doubly linked list + * @link http://php.net/manual/en/spldoublylinkedlist.bottom.php + * @return mixed The value of the first node. + */ + public function bottom () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks whether the doubly linked list is empty. + * @link http://php.net/manual/en/spldoublylinkedlist.isempty.php + * @return bool whether the doubly linked list is empty. + */ + public function isEmpty () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets the mode of iteration + * @link http://php.net/manual/en/spldoublylinkedlist.setiteratormode.php + * @param int $mode

+ * There are two orthogonal sets of modes that can be set: + *

+ * The direction of the iteration (either one or the other): + * SplDoublyLinkedList::IT_MODE_LIFO (Stack style) + * @return void No value is returned. + */ + public function setIteratorMode ($mode) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the mode of iteration + * @link http://php.net/manual/en/spldoublylinkedlist.getiteratormode.php + * @return int the different modes and flags that affect the iteration. + */ + public function getIteratorMode () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Counts the number of elements in the doubly linked list. + * @link http://php.net/manual/en/spldoublylinkedlist.count.php + * @return int the number of elements in the doubly linked list. + */ + public function count () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns whether the requested $index exists + * @link http://php.net/manual/en/spldoublylinkedlist.offsetexists.php + * @param mixed $index

+ * The index being checked. + *

+ * @return bool TRUE if the requested index exists, otherwise FALSE + */ + public function offsetExists ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the value at the specified $index + * @link http://php.net/manual/en/spldoublylinkedlist.offsetget.php + * @param mixed $index

+ * The index with the value. + *

+ * @return mixed The value at the specified index. + */ + public function offsetGet ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets the value at the specified $index to $newval + * @link http://php.net/manual/en/spldoublylinkedlist.offsetset.php + * @param mixed $index

+ * The index being set. + *

+ * @param mixed $newval

+ * The new value for the index. + *

+ * @return void No value is returned. + */ + public function offsetSet ($index, $newval) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Unsets the value at the specified $index + * @link http://php.net/manual/en/spldoublylinkedlist.offsetunset.php + * @param mixed $index

+ * The index being unset. + *

+ * @return void No value is returned. + */ + public function offsetUnset ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewind iterator back to the start + * @link http://php.net/manual/en/spldoublylinkedlist.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current array entry + * @link http://php.net/manual/en/spldoublylinkedlist.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node index + * @link http://php.net/manual/en/spldoublylinkedlist.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to next entry + * @link http://php.net/manual/en/spldoublylinkedlist.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to previous entry + * @link http://php.net/manual/en/spldoublylinkedlist.prev.php + * @return void No value is returned. + */ + public function prev () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Check whether the doubly linked list contains more nodes + * @link http://php.net/manual/en/spldoublylinkedlist.valid.php + * @return bool TRUE if the doubly linked list contains any more nodes, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.4.0)
+ * Unserializes the storage + * @link http://php.net/manual/en/spldoublylinkedlist.unserialize.php + * @param string $serialized

+ * The serialized string. + *

+ * @return void No value is returned. + */ + public function unserialize ($serialized) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Serializes the storage + * @link http://php.net/manual/en/spldoublylinkedlist.serialize.php + * @return string The serialized string. + */ + public function serialize () {} + +} + +/** + * The SplHeap class provides the main functionalities of a Heap. + * @link http://php.net/manual/en/class.splheap.php + * @jms-builtin + */ +class SplHeap implements Iterator, Traversable, Countable { + + /** + * (PHP 5 >= 5.3.0)
+ * Extracts a node from top of the heap and sift up. + * @link http://php.net/manual/en/splheap.extract.php + * @return mixed The value of the extracted node. + */ + public function extract () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Inserts an element in the heap by sifting it up. + * @link http://php.net/manual/en/splheap.insert.php + * @param mixed $value

+ * The value to insert. + *

+ * @return void No value is returned. + */ + public function insert ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Peeks at the node from the top of the heap + * @link http://php.net/manual/en/splheap.top.php + * @return mixed The value of the node on the top. + */ + public function top () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Counts the number of elements in the heap. + * @link http://php.net/manual/en/splheap.count.php + * @return int the number of elements in the heap. + */ + public function count () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks whether the heap is empty. + * @link http://php.net/manual/en/splheap.isempty.php + * @return bool whether the heap is empty. + */ + public function isEmpty () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewind iterator back to the start (no-op) + * @link http://php.net/manual/en/splheap.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node pointed by the iterator + * @link http://php.net/manual/en/splheap.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node index + * @link http://php.net/manual/en/splheap.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to the next node + * @link http://php.net/manual/en/splheap.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Check whether the heap contains more nodes + * @link http://php.net/manual/en/splheap.valid.php + * @return bool TRUE if the heap contains any more nodes, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Recover from the corrupted state and allow further actions on the heap. + * @link http://php.net/manual/en/splheap.recoverfromcorruption.php + * @return void No value is returned. + */ + public function recoverFromCorruption () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Compare elements in order to place them correctly in the heap while sifting up. + * @link http://php.net/manual/en/splheap.compare.php + * @param mixed $value1

+ * The value of the first node being compared. + *

+ * @param mixed $value2

+ * The value of the second node being compared. + *

+ * @return int Result of the comparison, positive integer if value1 is greater than value2, 0 if they are equal, negative integer otherwise. + *

+ *

+ * Having multiple elements with the same value in a Heap is not recommended. They will end up in an arbitrary relative position. + */ + abstract protected function compare ($value1, $value2); + +} + +/** + * The SplMinHeap class provides the main functionalities of a heap, keeping the minimum on the top. + * @link http://php.net/manual/en/class.splminheap.php + * @jms-builtin + */ +class SplMinHeap extends SplHeap implements Countable, Traversable, Iterator { + + /** + * (PHP 5 >= 5.3.0)
+ * Compare elements in order to place them correctly in the heap while sifting up. + * @link http://php.net/manual/en/splminheap.compare.php + * @param mixed $value1

+ * The value of the first node being compared. + *

+ * @param mixed $value2

+ * The value of the second node being compared. + *

+ * @return int Result of the comparison, positive integer if value1 is lower than value2, 0 if they are equal, negative integer otherwise. + *

+ *

+ * Having multiple elements with the same value in a Heap is not recommended. They will end up in an arbitrary relative position. + */ + protected function compare ($value1, $value2) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Extracts a node from top of the heap and sift up. + * @link http://php.net/manual/en/splheap.extract.php + * @return mixed The value of the extracted node. + */ + public function extract () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Inserts an element in the heap by sifting it up. + * @link http://php.net/manual/en/splheap.insert.php + * @param mixed $value

+ * The value to insert. + *

+ * @return void No value is returned. + */ + public function insert ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Peeks at the node from the top of the heap + * @link http://php.net/manual/en/splheap.top.php + * @return mixed The value of the node on the top. + */ + public function top () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Counts the number of elements in the heap. + * @link http://php.net/manual/en/splheap.count.php + * @return int the number of elements in the heap. + */ + public function count () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks whether the heap is empty. + * @link http://php.net/manual/en/splheap.isempty.php + * @return bool whether the heap is empty. + */ + public function isEmpty () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewind iterator back to the start (no-op) + * @link http://php.net/manual/en/splheap.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node pointed by the iterator + * @link http://php.net/manual/en/splheap.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node index + * @link http://php.net/manual/en/splheap.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to the next node + * @link http://php.net/manual/en/splheap.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Check whether the heap contains more nodes + * @link http://php.net/manual/en/splheap.valid.php + * @return bool TRUE if the heap contains any more nodes, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Recover from the corrupted state and allow further actions on the heap. + * @link http://php.net/manual/en/splheap.recoverfromcorruption.php + * @return void No value is returned. + */ + public function recoverFromCorruption () {} + +} + +/** + * The SplMaxHeap class provides the main functionalities of a heap, keeping the maximum on the top. + * @link http://php.net/manual/en/class.splmaxheap.php + * @jms-builtin + */ +class SplMaxHeap extends SplHeap implements Countable, Traversable, Iterator { + + /** + * (PHP 5 >= 5.3.0)
+ * Compare elements in order to place them correctly in the heap while sifting up. + * @link http://php.net/manual/en/splmaxheap.compare.php + * @param mixed $value1

+ * The value of the first node being compared. + *

+ * @param mixed $value2

+ * The value of the second node being compared. + *

+ * @return int Result of the comparison, positive integer if value1 is greater than value2, 0 if they are equal, negative integer otherwise. + *

+ *

+ * Having multiple elements with the same value in a Heap is not recommended. They will end up in an arbitrary relative position. + */ + protected function compare ($value1, $value2) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Extracts a node from top of the heap and sift up. + * @link http://php.net/manual/en/splheap.extract.php + * @return mixed The value of the extracted node. + */ + public function extract () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Inserts an element in the heap by sifting it up. + * @link http://php.net/manual/en/splheap.insert.php + * @param mixed $value

+ * The value to insert. + *

+ * @return void No value is returned. + */ + public function insert ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Peeks at the node from the top of the heap + * @link http://php.net/manual/en/splheap.top.php + * @return mixed The value of the node on the top. + */ + public function top () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Counts the number of elements in the heap. + * @link http://php.net/manual/en/splheap.count.php + * @return int the number of elements in the heap. + */ + public function count () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks whether the heap is empty. + * @link http://php.net/manual/en/splheap.isempty.php + * @return bool whether the heap is empty. + */ + public function isEmpty () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewind iterator back to the start (no-op) + * @link http://php.net/manual/en/splheap.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node pointed by the iterator + * @link http://php.net/manual/en/splheap.current.php + * @return mixed The current node value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node index + * @link http://php.net/manual/en/splheap.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to the next node + * @link http://php.net/manual/en/splheap.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Check whether the heap contains more nodes + * @link http://php.net/manual/en/splheap.valid.php + * @return bool TRUE if the heap contains any more nodes, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Recover from the corrupted state and allow further actions on the heap. + * @link http://php.net/manual/en/splheap.recoverfromcorruption.php + * @return void No value is returned. + */ + public function recoverFromCorruption () {} + +} + +/** + * The SplPriorityQueue class provides the main functionalities of an + * prioritized queue, implemented using a heap. + * @link http://php.net/manual/en/class.splpriorityqueue.php + * @jms-builtin + */ +class SplPriorityQueue implements Iterator, Traversable, Countable { + const EXTR_BOTH = 3; + const EXTR_PRIORITY = 2; + const EXTR_DATA = 1; + + + /** + * (PHP 5 >= 5.3.0)
+ * Compare priorities in order to place elements correctly in the heap while sifting up. + * @link http://php.net/manual/en/splpriorityqueue.compare.php + * @param mixed $priority1

+ * The priority of the first node being compared. + *

+ * @param mixed $priority2

+ * The priority of the second node being compared. + *

+ * @return int Result of the comparison, positive integer if priority1 is greater than priority2, 0 if they are equal, negative integer otherwise. + *

+ *

+ * Multiple elements with the same priority will get dequeued in no particular order. + */ + public function compare ($priority1, $priority2) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Inserts an element in the queue by sifting it up. + * @link http://php.net/manual/en/splpriorityqueue.insert.php + * @param mixed $value

+ * The value to insert. + *

+ * @param mixed $priority

+ * The associated priority. + *

+ * @return void No value is returned. + */ + public function insert ($value, $priority) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets the mode of extraction + * @link http://php.net/manual/en/splpriorityqueue.setextractflags.php + * @param int $flags

+ * Defines what is extracted by SplPriorityQueue::current, + * SplPriorityQueue::top and + * SplPriorityQueue::extract. + *

+ * SplPriorityQueue::EXTR_DATA (0x00000001): Extract the data + * @return void No value is returned. + */ + public function setExtractFlags ($flags) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Peeks at the node from the top of the queue + * @link http://php.net/manual/en/splpriorityqueue.top.php + * @return mixed The value or priority (or both) of the top node, depending on the extract flag. + */ + public function top () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Extracts a node from top of the heap and sift up. + * @link http://php.net/manual/en/splpriorityqueue.extract.php + * @return mixed The value or priority (or both) of the extracted node, depending on the extract flag. + */ + public function extract () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Counts the number of elements in the queue. + * @link http://php.net/manual/en/splpriorityqueue.count.php + * @return int the number of elements in the queue. + */ + public function count () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks whether the queue is empty. + * @link http://php.net/manual/en/splpriorityqueue.isempty.php + * @return bool whether the queue is empty. + */ + public function isEmpty () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewind iterator back to the start (no-op) + * @link http://php.net/manual/en/splpriorityqueue.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node pointed by the iterator + * @link http://php.net/manual/en/splpriorityqueue.current.php + * @return mixed The value or priority (or both) of the current node, depending on the extract flag. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current node index + * @link http://php.net/manual/en/splpriorityqueue.key.php + * @return mixed The current node index. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to the next node + * @link http://php.net/manual/en/splpriorityqueue.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Check whether the queue contains more nodes + * @link http://php.net/manual/en/splpriorityqueue.valid.php + * @return bool TRUE if the queue contains any more nodes, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Recover from the corrupted state and allow further actions on the queue. + * @link http://php.net/manual/en/splpriorityqueue.recoverfromcorruption.php + * @return void No value is returned. + */ + public function recoverFromCorruption () {} + +} + +/** + * The SplFixedArray class provides the main functionalities of array. The + * main differences between a SplFixedArray and a normal PHP array is that + * the SplFixedArray is of fixed length and allows only integers within + * the range as indexes. The advantage is that it allows a faster array + * implementation. + * @link http://php.net/manual/en/class.splfixedarray.php + * @jms-builtin + */ +class SplFixedArray implements Iterator, Traversable, ArrayAccess, Countable { + + /** + * (PHP 5 >= 5.3.0)
+ * Constructs a new fixed array + * @link http://php.net/manual/en/splfixedarray.construct.php + * @param $size [optional] + */ + public function __construct ($size) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the size of the array + * @link http://php.net/manual/en/splfixedarray.count.php + * @return int the size of the array. + */ + public function count () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns a PHP array from the fixed array + * @link http://php.net/manual/en/splfixedarray.toarray.php + * @return array a PHP array, similar to the fixed array. + */ + public function toArray () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Import a PHP array in a SplFixedArray instance + * @link http://php.net/manual/en/splfixedarray.fromarray.php + * @param array $array

+ * The array to import. + *

+ * @param bool $save_indexes [optional]

+ * Try to save the numeric indexes used in the original array. + *

+ * @return SplFixedArray an instance of SplFixedArray + * containing the array content. + */ + public static function fromArray (array $array, $save_indexes = true) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets the size of the array + * @link http://php.net/manual/en/splfixedarray.getsize.php + * @return int the size of the array, as an integer. + */ + public function getSize () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Change the size of an array + * @link http://php.net/manual/en/splfixedarray.setsize.php + * @param int $size

+ * The new array size. This should be a value between 0 and PHP_INT_MAX. + *

+ * @return int No value is returned. + */ + public function setSize ($size) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns whether the requested index exists + * @link http://php.net/manual/en/splfixedarray.offsetexists.php + * @param int $index

+ * The index being checked. + *

+ * @return bool TRUE if the requested index exists, otherwise FALSE + */ + public function offsetExists ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the value at the specified index + * @link http://php.net/manual/en/splfixedarray.offsetget.php + * @param int $index

+ * The index with the value. + *

+ * @return mixed The value at the specified index. + */ + public function offsetGet ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets a new value at a specified index + * @link http://php.net/manual/en/splfixedarray.offsetset.php + * @param int $index

+ * The index being set. + *

+ * @param mixed $newval

+ * The new value for the index. + *

+ * @return void No value is returned. + */ + public function offsetSet ($index, $newval) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Unsets the value at the specified $index + * @link http://php.net/manual/en/splfixedarray.offsetunset.php + * @param int $index

+ * The index being unset. + *

+ * @return void No value is returned. + */ + public function offsetUnset ($index) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewind iterator back to the start + * @link http://php.net/manual/en/splfixedarray.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current array entry + * @link http://php.net/manual/en/splfixedarray.current.php + * @return mixed The current element value. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Return current array index + * @link http://php.net/manual/en/splfixedarray.key.php + * @return int The current array index. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Move to next entry + * @link http://php.net/manual/en/splfixedarray.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Check whether the array contains more elements + * @link http://php.net/manual/en/splfixedarray.valid.php + * @return bool TRUE if the array contains any more elements, FALSE otherwise. + */ + public function valid () {} + +} + +/** + * The SplObserver interface is used alongside + * SplSubject to implement the Observer Design Pattern. + * @link http://php.net/manual/en/class.splobserver.php + */ +interface SplObserver { + + /** + * (PHP 5 >= 5.1.0)
+ * Receive update from subject + * @link http://php.net/manual/en/splobserver.update.php + * @param SplSubject $subject

+ * The SplSubject notifying the observer of an update. + *

+ * @return void No value is returned. + */ + abstract public function update (SplSubject $subject); + +} + +/** + * The SplSubject interface is used alongside + * SplObserver to implement the Observer Design Pattern. + * @link http://php.net/manual/en/class.splsubject.php + */ +interface SplSubject { + + /** + * (PHP 5 >= 5.1.0)
+ * Attach an SplObserver + * @link http://php.net/manual/en/splsubject.attach.php + * @param SplObserver $observer

+ * The SplObserver to attach. + *

+ * @return void No value is returned. + */ + abstract public function attach (SplObserver $observer); + + /** + * (PHP 5 >= 5.1.0)
+ * Detach an observer + * @link http://php.net/manual/en/splsubject.detach.php + * @param SplObserver $observer

+ * The SplObserver to detach. + *

+ * @return void No value is returned. + */ + abstract public function detach (SplObserver $observer); + + /** + * (PHP 5 >= 5.1.0)
+ * Notify an observer + * @link http://php.net/manual/en/splsubject.notify.php + * @return void No value is returned. + */ + abstract public function notify (); + +} + +/** + * The SplObjectStorage class provides a map from objects to data or, by + * ignoring data, an object set. This dual purpose can be useful in many + * cases involving the need to uniquely identify objects. + * @link http://php.net/manual/en/class.splobjectstorage.php + * @jms-builtin + */ +class SplObjectStorage implements Countable, Iterator, Traversable, Serializable, ArrayAccess { + + /** + * (PHP 5 >= 5.1.0)
+ * Adds an object in the storage + * @link http://php.net/manual/en/splobjectstorage.attach.php + * @param object $object

+ * The object to add. + *

+ * @param mixed $data [optional]

+ * The data to associate with the object. + *

+ * @return void No value is returned. + */ + public function attach ($object, $data = null) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Removes an object from the storage + * @link http://php.net/manual/en/splobjectstorage.detach.php + * @param object $object

+ * The object to remove. + *

+ * @return void No value is returned. + */ + public function detach ($object) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks if the storage contains a specific object + * @link http://php.net/manual/en/splobjectstorage.contains.php + * @param object $object

+ * The object to look for. + *

+ * @return bool TRUE if the object is in the storage, FALSE otherwise. + */ + public function contains ($object) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Adds all objects from another storage + * @link http://php.net/manual/en/splobjectstorage.addall.php + * @param SplObjectStorage $storage

+ * The storage you want to import. + *

+ * @return void No value is returned. + */ + public function addAll (SplObjectStorage $storage) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Removes objects contained in another storage from the current storage + * @link http://php.net/manual/en/splobjectstorage.removeall.php + * @param SplObjectStorage $storage

+ * The storage containing the elements to remove. + *

+ * @return void No value is returned. + */ + public function removeAll (SplObjectStorage $storage) {} + + /** + * (PHP 5 >= 5.3.6)
+ * Removes all objects except for those contained in another storage from the current storage + * @link http://php.net/manual/en/splobjectstorage.removeallexcept.php + * @param SplObjectStorage $storage

+ * The storage containing the elements to retain in the current storage. + *

+ * @return void No value is returned. + */ + public function removeAllExcept (SplObjectStorage $storage) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the data associated with the current iterator entry + * @link http://php.net/manual/en/splobjectstorage.getinfo.php + * @return mixed The data associated with the current iterator position. + */ + public function getInfo () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets the data associated with the current iterator entry + * @link http://php.net/manual/en/splobjectstorage.setinfo.php + * @param mixed $data

+ * The data to associate with the current iterator entry. + *

+ * @return void No value is returned. + */ + public function setInfo ($data) {} + + /** + * (No version information available, might only be in SVN)
+ * Calculate a unique identifier for the contained objects + * @link http://php.net/manual/en/splobjectstorage.gethash.php + * @param string $object

+ * The object whose identifier is to be calculated. + *

+ * @return string A string with the calculated identifier. An exception is + * thrown if any other type is returned. + */ + public function getHash ($object) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns the number of objects in the storage + * @link http://php.net/manual/en/splobjectstorage.count.php + * @return int The number of objects in the storage. + */ + public function count () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind the iterator to the first storage element + * @link http://php.net/manual/en/splobjectstorage.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns if the current iterator entry is valid + * @link http://php.net/manual/en/splobjectstorage.valid.php + * @return bool TRUE if the iterator entry is valid, FALSE otherwise. + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns the index at which the iterator currently is + * @link http://php.net/manual/en/splobjectstorage.key.php + * @return int The index corresponding to the position of the iterator. + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns the current storage entry + * @link http://php.net/manual/en/splobjectstorage.current.php + * @return object The object at the current iterator position. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Move to the next entry + * @link http://php.net/manual/en/splobjectstorage.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Unserializes a storage from its string representation + * @link http://php.net/manual/en/splobjectstorage.unserialize.php + * @param string $serialized

+ * The serialized representation of a storage. + *

+ * @return void No value is returned. + */ + public function unserialize ($serialized) {} + + /** + * (PHP 5 >= 5.2.2)
+ * Serializes the storage + * @link http://php.net/manual/en/splobjectstorage.serialize.php + * @return string A string representing the storage. + */ + public function serialize () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks whether an object exists in the storage + * @link http://php.net/manual/en/splobjectstorage.offsetexists.php + * @param object $object

+ * The object to look for. + *

+ * @return bool TRUE if the object exists in the storage, + * and FALSE otherwise. + */ + public function offsetExists ($object) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Associates data to an object in the storage + * @link http://php.net/manual/en/splobjectstorage.offsetset.php + * @param object $object

+ * The object to associate data with. + *

+ * @param mixed $data [optional]

+ * The data to associate with the object. + *

+ * @return void No value is returned. + */ + public function offsetSet ($object, $data = null) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Removes an object from the storage + * @link http://php.net/manual/en/splobjectstorage.offsetunset.php + * @param object $object

+ * The object to remove. + *

+ * @return void No value is returned. + */ + public function offsetUnset ($object) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the data associated with an object + * @link http://php.net/manual/en/splobjectstorage.offsetget.php + * @param object $object

+ * The object to look for. + *

+ * @return mixed The data previously associated with the object in the storage. + */ + public function offsetGet ($object) {} + +} + +/** + * An Iterator that sequentially iterates over all attached iterators + * @link http://php.net/manual/en/class.multipleiterator.php + * @jms-builtin + */ +class MultipleIterator implements Iterator, Traversable { + const MIT_NEED_ANY = 0; + const MIT_NEED_ALL = 1; + const MIT_KEYS_NUMERIC = 0; + const MIT_KEYS_ASSOC = 2; + + + /** + * (PHP 5 >= 5.3.0)
+ * Constructs a new MultipleIterator + * @link http://php.net/manual/en/multipleiterator.construct.php + * @param $flags + */ + public function __construct ($flags) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets the flag information + * @link http://php.net/manual/en/multipleiterator.getflags.php + * @return void Information about the flags, as an integer. + */ + public function getFlags () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Sets flags + * @link http://php.net/manual/en/multipleiterator.setflags.php + * @param int $flags

+ * The flags to set, according to the + * Flag Constants + *

+ * @return void No value is returned. + */ + public function setFlags ($flags) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Attaches iterator information + * @link http://php.net/manual/en/multipleiterator.attachiterator.php + * @param Iterator $iterator

+ * The new iterator to attach. + *

+ * @param string $infos [optional]

+ * The associative information for the Iterator, which must be an + * integer, a string, or NULL. + *

+ * @return void Description... + */ + public function attachIterator (Iterator $iterator, $infos = null) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Detaches an iterator + * @link http://php.net/manual/en/multipleiterator.detachiterator.php + * @param Iterator $iterator

+ * The iterator to detach. + *

+ * @return void No value is returned. + */ + public function detachIterator (Iterator $iterator) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks if an iterator is attached + * @link http://php.net/manual/en/multipleiterator.containsiterator.php + * @param Iterator $iterator

+ * The iterator to check. + *

+ * @return void TRUE on success or FALSE on failure. + */ + public function containsIterator (Iterator $iterator) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets the number of attached iterator instances + * @link http://php.net/manual/en/multipleiterator.countiterators.php + * @return void The number of attached iterator instances (as an integer). + */ + public function countIterators () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Rewinds all attached iterator instances + * @link http://php.net/manual/en/multipleiterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Checks the validity of sub iterators + * @link http://php.net/manual/en/multipleiterator.valid.php + * @return void TRUE if one or all sub iterators are valid depending on flags, + * otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets the registered iterator instances + * @link http://php.net/manual/en/multipleiterator.key.php + * @return void An array of all registered iterator instances, + * or FALSE if no sub iterator is attached. + */ + public function key () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Gets the registered iterator instances + * @link http://php.net/manual/en/multipleiterator.current.php + * @return void An array of all registered iterator instances, + * or FALSE if no sub iterator is attached. + */ + public function current () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Moves all attached iterator instances forward + * @link http://php.net/manual/en/multipleiterator.next.php + * @return void No value is returned. + */ + public function next () {} + +} + +/** + * (PHP 5)
+ * Return available SPL classes + * @link http://php.net/manual/en/function.spl-classes.php + * @return array an array containing the currently available SPL classes. + * @jms-builtin + */ +function spl_classes () {} + +/** + * (PHP 5 >= 5.1.2)
+ * Default implementation for __autoload() + * @link http://php.net/manual/en/function.spl-autoload.php + * @param string $class_name

+ * The lowercased name of the class (and namespace) being instantiated. + *

+ * @param string $file_extensions [optional]

+ * By default it checks all include paths to + * contain filenames built up by the lowercase class name appended by the + * filename extensions .inc and .php. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function spl_autoload ($class_name, $file_extensions = 'spl_autoload_extensions()') {} + +/** + * (PHP 5 >= 5.1.2)
+ * Register and return default file extensions for spl_autoload + * @link http://php.net/manual/en/function.spl-autoload-extensions.php + * @param string $file_extensions [optional]

+ * When calling without an argument, it simply returns the current list + * of extensions each separated by comma. To modify the list of file + * extensions, simply invoke the functions with the new list of file + * extensions to use in a single string with each extensions separated + * by comma. + *

+ * @return string A comma delimited list of default file extensions for + * spl_autoload. + * @jms-builtin + */ +function spl_autoload_extensions ($file_extensions = null) {} + +/** + * (PHP 5 >= 5.1.2)
+ * Register given function as __autoload() implementation + * @link http://php.net/manual/en/function.spl-autoload-register.php + * @param callable $autoload_function [optional]

+ * The autoload function being registered. + * If no parameter is provided, then the default implementation of + * spl_autoload will be registered. + *

+ * @param bool $throw [optional]

+ * This parameter specifies whether + * spl_autoload_register should throw + * exceptions when the autoload_function + * cannot be registered. + *

+ * @param bool $prepend [optional]

+ * If true, spl_autoload_register will prepend + * the autoloader on the autoload stack instead of appending it. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function spl_autoload_register (callable $autoload_function = null, $throw = true, $prepend = false) {} + +/** + * (PHP 5 >= 5.1.2)
+ * Unregister given function as __autoload() implementation + * @link http://php.net/manual/en/function.spl-autoload-unregister.php + * @param mixed $autoload_function

+ * The autoload function being unregistered. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function spl_autoload_unregister ($autoload_function) {} + +/** + * (PHP 5 >= 5.1.2)
+ * Return all registered __autoload() functions + * @link http://php.net/manual/en/function.spl-autoload-functions.php + * @return array An array of all registered __autoload functions. + * If the autoload stack is not activated then the return value is FALSE. + * If no function is registered the return value will be an empty array. + * @jms-builtin + */ +function spl_autoload_functions () {} + +/** + * (PHP 5 >= 5.1.2)
+ * Try all registered __autoload() function to load the requested class + * @link http://php.net/manual/en/function.spl-autoload-call.php + * @param string $class_name

+ * The class name being searched. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function spl_autoload_call ($class_name) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Return the parent classes of the given class + * @link http://php.net/manual/en/function.class-parents.php + * @param mixed $class

+ * An object (class instance) or a string (class name). + *

+ * @param bool $autoload [optional]

+ * Whether to allow this function to load the class automatically through + * the __autoload magic method. + *

+ * @return array An array on success, or FALSE on error. + * @jms-builtin + */ +function class_parents ($class, $autoload = true) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Return the interfaces which are implemented by the given class + * @link http://php.net/manual/en/function.class-implements.php + * @param mixed $class

+ * An object (class instance) or a string (class name). + *

+ * @param bool $autoload [optional]

+ * Whether to allow this function to load the class automatically through + * the __autoload magic method. + *

+ * @return array An array on success, or FALSE on error. + * @jms-builtin + */ +function class_implements ($class, $autoload = true) {} + +/** + * (PHP 5 >= 5.4.0)
+ * Return the traits used by the given class + * @link http://php.net/manual/en/function.class-uses.php + * @param mixed $class

+ * An object (class instance) or a string (class name). + *

+ * @param bool $autoload [optional]

+ * Whether to allow this function to load the class automatically through + * the __autoload magic method. + *

+ * @return array An array on success, or FALSE on error. + * @jms-builtin + */ +function class_uses ($class, $autoload = true) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Return hash id for given object + * @link http://php.net/manual/en/function.spl-object-hash.php + * @param object $obj + * @return string A string that is unique for each currently existing object and is always + * the same for each object. + * @jms-builtin + */ +function spl_object_hash ($obj) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Copy the iterator into an array + * @link http://php.net/manual/en/function.iterator-to-array.php + * @param Traversable $iterator

+ * The iterator being copied. + *

+ * @param bool $use_keys [optional]

+ * Whether to use the iterator element keys as index. + *

+ * @return array An array containing the elements of the iterator. + * @jms-builtin + */ +function iterator_to_array (Traversable $iterator, $use_keys = true) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Count the elements in an iterator + * @link http://php.net/manual/en/function.iterator-count.php + * @param Traversable $iterator

+ * The iterator being counted. + *

+ * @return int The number of elements in iterator. + * @jms-builtin + */ +function iterator_count (Traversable $iterator) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Call a function for every element in an iterator + * @link http://php.net/manual/en/function.iterator-apply.php + * @param Traversable $iterator

+ * The class to iterate over. + *

+ * @param callable $function

+ * The callback function to call on every element. + * The function must return TRUE in order to + * continue iterating over the iterator. + *

+ * @param array $args [optional]

+ * Arguments to pass to the callback function. + *

+ * @return int the iteration count. + * @jms-builtin + */ +function iterator_apply (Traversable $iterator, callable $function, array $args = null) {} + +// End of SPL v.0.2 +?> diff --git a/res/php-5.4-core-api/SPPLUS.php b/res/php-5.4-core-api/SPPLUS.php new file mode 100644 index 0000000..f07f896 --- /dev/null +++ b/res/php-5.4-core-api/SPPLUS.php @@ -0,0 +1,56 @@ + + * Obtain a hmac key (needs 8 arguments) + * @link http://php.net/manual/en/function.calcul-hmac.php + * @param string $clent + * @param string $siretcode + * @param string $price + * @param string $reference + * @param string $validity + * @param string $taxation + * @param string $devise + * @param string $language + * @return string Returns true on success or false on failure. + * @jms-builtin + */ +function calcul_hmac ($clent, $siretcode, $price, $reference, $validity, $taxation, $devise, $language) {} + +/** + * (PECL spplus >= 1.0.0)
+ * Obtain a nthmac key (needs 2 arguments) + * @link http://php.net/manual/en/function.nthmac.php + * @param string $clent + * @param string $data + * @return string Returns true on success or false on failure. + * @jms-builtin + */ +function nthmac ($clent, $data) {} + +/** + * (PECL spplus >= 1.0.0)
+ * Obtain the payment url (needs 2 arguments) + * @link http://php.net/manual/en/function.signeurlpaiement.php + * @param string $clent + * @param string $data + * @return string Returns true on success or false on failure. + * @jms-builtin + */ +function signeurlpaiement ($clent, $data) {} + +/** + * (PECL spplus >= 1.0.0)
+ * Obtain a hmac key (needs 2 arguments) + * @link http://php.net/manual/en/function.calculhmac.php + * @param string $clent + * @param string $data + * @return string Returns true on success or false on failure. + * @jms-builtin + */ +function calculhmac ($clent, $data) {} + +// End of SPPLUS v.3.0 +?> diff --git a/res/php-5.4-core-api/SQLite.php b/res/php-5.4-core-api/SQLite.php new file mode 100644 index 0000000..5660b43 --- /dev/null +++ b/res/php-5.4-core-api/SQLite.php @@ -0,0 +1,1089 @@ + + * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or null otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Opens an SQLite database and create the database if it does not exist + * @link http://php.net/manual/en/function.sqlite-open.php + * @param string $filename

+ * The filename of the SQLite database. If the file does not exist, SQLite + * will attempt to create it. PHP must have write permissions to the file + * if data is inserted, the database schema is modified or to create the + * database if it does not exist. + *

+ * @param int $mode [optional]

+ * The mode of the file. Intended to be used to open the database in + * read-only mode. Presently, this parameter is ignored by the sqlite + * library. The default value for mode is the octal value + * 0666 and this is the recommended value. + *

+ * @param string $error_message [optional]

+ * Passed by reference and is set to hold a descriptive error message + * explaining why the database could not be opened if there was an error. + *

+ * @return resource a resource (database handle) on success, false on error. + * @jms-builtin + */ +function sqlite_open ($filename, $mode = 0666, &$error_message = null) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Opens a persistent handle to an SQLite database and create the database if it does not exist + * @link http://php.net/manual/en/function.sqlite-popen.php + * @param string $filename

+ * The filename of the SQLite database. If the file does not exist, SQLite + * will attempt to create it. PHP must have write permissions to the file + * if data is inserted, the database schema is modified or to create the + * database if it does not exist. + *

+ * @param int $mode [optional]

+ * The mode of the file. Intended to be used to open the database in + * read-only mode. Presently, this parameter is ignored by the sqlite + * library. The default value for mode is the octal value + * 0666 and this is the recommended value. + *

+ * @param string $error_message [optional]

+ * Passed by reference and is set to hold a descriptive error message + * explaining why the database could not be opened if there was an error. + *

+ * @return resource a resource (database handle) on success, false on error. + * @jms-builtin + */ +function sqlite_popen ($filename, $mode = 0666, &$error_message = null) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Closes an open SQLite database + * @link http://php.net/manual/en/function.sqlite-close.php + * @param resource $dbhandle

+ * The SQLite Database resource; returned from sqlite_open + * when used procedurally. + *

+ * @return void + * @jms-builtin + */ +function sqlite_close ($dbhandle) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Executes a query against a given database and returns a result handle + * @link http://php.net/manual/en/function.sqlite-query.php + * @param string $query

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param int $result_type [optional] &sqlite.result-type; + * @param string $error_msg [optional]

+ * The specified variable will be filled if an error occurs. This is + * specially important because SQL syntax errors can't be fetched using + * the sqlite_last_error function. + *

+ * @return SQLiteResult This function will return a result handle&return.falseforfailure;. + * For queries that return rows, the result handle can then be used with + * functions such as sqlite_fetch_array and + * sqlite_seek. + *

+ *

+ * Regardless of the query type, this function will return false if the + * query failed. + *

+ *

+ * sqlite_query returns a buffered, seekable result + * handle. This is useful for reasonably small queries where you need to + * be able to randomly access the rows. Buffered result handles will + * allocate memory to hold the entire result and will not return until it + * has been fetched. If you only need sequential access to the data, it is + * recommended that you use the much higher performance + * sqlite_unbuffered_query instead. + * @jms-builtin + */ +function sqlite_query ($query, $result_type = 'SQLITE_BOTH', &$error_msg = null) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.3)
+ * Executes a result-less query against a given database + * @link http://php.net/manual/en/function.sqlite-exec.php + * @param string $query

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param string $error_msg [optional]

+ * The specified variable will be filled if an error occurs. This is + * specially important because SQL syntax errors can't be fetched using + * the sqlite_last_error function. + *

+ * @return bool This function will return a boolean result; true for success or false for failure. + * If you need to run a query that returns rows, see sqlite_query. + * @jms-builtin + */ +function sqlite_exec ($query, &$error_msg = null) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Execute a query against a given database and returns an array + * @link http://php.net/manual/en/function.sqlite-array-query.php + * @param string $query

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param int $result_type [optional] &sqlite.result-type; + * @param bool $decode_binary [optional] &sqlite.decode-bin; + * @return array an array of the entire result set; false otherwise. + * @jms-builtin + */ +function sqlite_array_query ($query, $result_type = 'SQLITE_BOTH', $decode_binary = true) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.1)
+ * Executes a query and returns either an array for one single column or the value of the first row + * @link http://php.net/manual/en/function.sqlite-single-query.php + * @param string $query + * @param bool $first_row_only [optional] + * @param bool $decode_binary [optional] + * @return array + * @jms-builtin + */ +function sqlite_single_query ($query, $first_row_only = null, $decode_binary = null) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Fetches the next row from a result set as an array + * @link http://php.net/manual/en/function.sqlite-fetch-array.php + * @param int $result_type [optional] &sqlite.result-type; + * @param bool $decode_binary [optional] &sqlite.decode-bin; + * @return array an array of the next row from a result set; false if the + * next position is beyond the final row. + * @jms-builtin + */ +function sqlite_fetch_array ($result_type = 'SQLITE_BOTH', $decode_binary = true) {} + +/** + * (PHP 5)
+ * Fetches the next row from a result set as an object + * @link http://php.net/manual/en/function.sqlite-fetch-object.php + * @param string $class_name [optional] + * @param array $ctor_params [optional] + * @param bool $decode_binary [optional] + * @return object + * @jms-builtin + */ +function sqlite_fetch_object ($class_name = null, array $ctor_params = null, $decode_binary = true) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.1)
+ * Fetches the first column of a result set as a string + * @link http://php.net/manual/en/function.sqlite-fetch-single.php + * @param bool $decode_binary [optional] &sqlite.decode-bin; + * @return string the first column value, as a string. + * @jms-builtin + */ +function sqlite_fetch_single ($decode_binary = true) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * &Alias; sqlite_fetch_single + * @link http://php.net/manual/en/function.sqlite-fetch-string.php + * @param $result + * @param $decode_binary [optional] + * @jms-builtin + */ +function sqlite_fetch_string ($result, $decode_binary) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Fetches all rows from a result set as an array of arrays + * @link http://php.net/manual/en/function.sqlite-fetch-all.php + * @param int $result_type [optional] &sqlite.result-type; + * @param bool $decode_binary [optional] &sqlite.decode-bin; + * @return array an array of the remaining rows in a result set. If called right + * after sqlite_query, it returns all rows. If called + * after sqlite_fetch_array, it returns the rest. If + * there are no rows in a result set, it returns an empty array. + * @jms-builtin + */ +function sqlite_fetch_all ($result_type = 'SQLITE_BOTH', $decode_binary = true) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Fetches the current row from a result set as an array + * @link http://php.net/manual/en/function.sqlite-current.php + * @param int $result_type [optional] &sqlite.result-type; + * @param bool $decode_binary [optional] &sqlite.decode-bin; + * @return array an array of the current row from a result set; false if the + * current position is beyond the final row. + * @jms-builtin + */ +function sqlite_current ($result_type = 'SQLITE_BOTH', $decode_binary = true) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Fetches a column from the current row of a result set + * @link http://php.net/manual/en/function.sqlite-column.php + * @param mixed $index_or_name

+ * The column index or name to fetch. + *

+ * @param bool $decode_binary [optional] &sqlite.decode-bin; + * @return mixed the column value. + * @jms-builtin + */ +function sqlite_column ($index_or_name, $decode_binary = true) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Returns the version of the linked SQLite library + * @link http://php.net/manual/en/function.sqlite-libversion.php + * @return string the library version, as a string. + * @jms-builtin + */ +function sqlite_libversion () {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Returns the encoding of the linked SQLite library + * @link http://php.net/manual/en/function.sqlite-libencoding.php + * @return string the library encoding. + * @jms-builtin + */ +function sqlite_libencoding () {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Returns the number of rows that were changed by the most + recent SQL statement + * @link http://php.net/manual/en/function.sqlite-changes.php + * @param $db + * @return int the number of changed rows. + * @jms-builtin + */ +function sqlite_changes ($db) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Returns the rowid of the most recently inserted row + * @link http://php.net/manual/en/function.sqlite-last-insert-rowid.php + * @param $db + * @return int the row id, as an integer. + * @jms-builtin + */ +function sqlite_last_insert_rowid ($db) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Returns the number of rows in a buffered result set + * @link http://php.net/manual/en/function.sqlite-num-rows.php + * @param $result + * @return int the number of rows, as an integer. + * @jms-builtin + */ +function sqlite_num_rows ($result) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Returns the number of fields in a result set + * @link http://php.net/manual/en/function.sqlite-num-fields.php + * @param $result + * @return int the number of fields, as an integer. + * @jms-builtin + */ +function sqlite_num_fields ($result) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Returns the name of a particular field + * @link http://php.net/manual/en/function.sqlite-field-name.php + * @param int $field_index

+ * The ordinal column number in the result set. + *

+ * @return string the name of a field in an SQLite result set, given the ordinal + * column number; false on error. + * @jms-builtin + */ +function sqlite_field_name ($field_index) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Seek to a particular row number of a buffered result set + * @link http://php.net/manual/en/function.sqlite-seek.php + * @param int $rownum

+ * The ordinal row number to seek to. The row number is zero-based (0 is + * the first row). + *

+ * &sqlite.no-unbuffered; + * @return bool false if the row does not exist, true otherwise. + * @jms-builtin + */ +function sqlite_seek ($rownum) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Seek to the first row number + * @link http://php.net/manual/en/function.sqlite-rewind.php + * @param $result + * @return bool false if there are no rows in the result set, true otherwise. + * @jms-builtin + */ +function sqlite_rewind ($result) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Seek to the next row number + * @link http://php.net/manual/en/function.sqlite-next.php + * @param $result + * @return bool true on success, or false if there are no more rows. + * @jms-builtin + */ +function sqlite_next ($result) {} + +/** + * (PHP 5)
+ * Seek to the previous row number of a result set + * @link http://php.net/manual/en/function.sqlite-prev.php + * @param $result + * @return bool true on success, or false if there are no more previous rows. + * @jms-builtin + */ +function sqlite_prev ($result) {} + +/** + * (PHP 5)
+ * Returns whether more rows are available + * @link http://php.net/manual/en/function.sqlite-valid.php + * @param $result + * @return bool true if there are more rows available from the + * result handle, or false otherwise. + * @jms-builtin + */ +function sqlite_valid ($result) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Finds whether or not more rows are available + * @link http://php.net/manual/en/function.sqlite-has-more.php + * @param resource $result

+ * The SQLite result resource. + *

+ * @return bool true if there are more rows available from the + * result handle, or false otherwise. + * @jms-builtin + */ +function sqlite_has_more ($result) {} + +/** + * (PHP 5)
+ * Returns whether or not a previous row is available + * @link http://php.net/manual/en/function.sqlite-has-prev.php + * @param $result + * @return bool true if there are more previous rows available from the + * result handle, or false otherwise. + * @jms-builtin + */ +function sqlite_has_prev ($result) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Escapes a string for use as a query parameter + * @link http://php.net/manual/en/function.sqlite-escape-string.php + * @param string $item

+ * The string being quoted. + *

+ *

+ * If the item contains a NUL + * character, or if it begins with a character whose ordinal value is + * 0x01, PHP will apply a binary encoding scheme so that + * you can safely store and retrieve binary data. + *

+ * @return string an escaped string for use in an SQLite SQL statement. + * @jms-builtin + */ +function sqlite_escape_string ($item) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Set busy timeout duration, or disable busy handlers + * @link http://php.net/manual/en/function.sqlite-busy-timeout.php + * @param int $milliseconds

+ * The number of milliseconds. When set to + * 0, busy handlers will be disabled and SQLite will + * return immediately with a SQLITE_BUSY status code + * if another process/thread has the database locked for an update. + *

+ *

+ * PHP sets the default busy timeout to be 60 seconds when the database is + * opened. + *

+ *

+ * There are one thousand (1000) milliseconds in one second. + *

+ * @return void + * @jms-builtin + */ +function sqlite_busy_timeout ($milliseconds) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Returns the error code of the last error for a database + * @link http://php.net/manual/en/function.sqlite-last-error.php + * @param $db + * @return int an error code, or 0 if no error occurred. + * @jms-builtin + */ +function sqlite_last_error ($db) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Returns the textual description of an error code + * @link http://php.net/manual/en/function.sqlite-error-string.php + * @param int $error_code

+ * The error code being used, which might be passed in from + * sqlite_last_error. + *

+ * @return string a human readable description of the error_code, + * as a string. + * @jms-builtin + */ +function sqlite_error_string ($error_code) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Execute a query that does not prefetch and buffer all data + * @link http://php.net/manual/en/function.sqlite-unbuffered-query.php + * @param string $query

+ * The query to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param int $result_type [optional] &sqlite.result-type; + * @param string $error_msg [optional]

+ * The specified variable will be filled if an error occurs. This is + * specially important because SQL syntax errors can't be fetched using + * the sqlite_last_error function. + *

+ * @return SQLiteUnbuffered a result handle&return.falseforfailure;. + *

+ *

+ * sqlite_unbuffered_query returns a sequential + * forward-only result set that can only be used to read each row, one after + * the other. + * @jms-builtin + */ +function sqlite_unbuffered_query ($query, $result_type = 'SQLITE_BOTH', &$error_msg = null) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Register an aggregating UDF for use in SQL statements + * @link http://php.net/manual/en/function.sqlite-create-aggregate.php + * @param string $function_name

+ * The name of the function used in SQL statements. + *

+ * @param callback $step_func

+ * Callback function called for each row of the result set. + * Function parameters are &$context, $value, .... + *

+ * @param callback $finalize_func

+ * Callback function to aggregate the "stepped" data from each row. + * Function parameter is &$context and the function + * should return the final result of aggregation. + *

+ * @param int $num_args [optional]

+ * Hint to the SQLite parser if the callback function accepts a + * predetermined number of arguments. + *

+ * @return void + * @jms-builtin + */ +function sqlite_create_aggregate ($function_name, $step_func, $finalize_func, $num_args = -1) {} + +/** + * (PHP 5, sqlite >= 1.0.0)
+ * Registers a "regular" User Defined Function for use in SQL statements + * @link http://php.net/manual/en/function.sqlite-create-function.php + * @param string $function_name

+ * The name of the function used in SQL statements. + *

+ * @param callback $callback

+ * Callback function to handle the defined SQL function. + *

+ * Callback functions should return a type understood by SQLite (i.e. + * scalar type). + * @param int $num_args [optional]

+ * Hint to the SQLite parser if the callback function accepts a + * predetermined number of arguments. + *

+ * @return void + * @jms-builtin + */ +function sqlite_create_function ($function_name, $callback, $num_args = -1) {} + +/** + * (PHP 5)
+ * Opens an SQLite database and returns an SQLiteDatabase object + * @link http://php.net/manual/en/function.sqlite-factory.php + * @param string $filename

+ * The filename of the SQLite database. + *

+ * @param int $mode [optional]

+ * The mode of the file. Intended to be used to open the database in + * read-only mode. Presently, this parameter is ignored by the sqlite + * library. The default value for mode is the octal value + * 0666 and this is the recommended value. + *

+ * @param string $error_message [optional]

+ * Passed by reference and is set to hold a descriptive error message + * explaining why the database could not be opened if there was an error. + *

+ * @return SQLiteDatabase an SQLiteDatabase object on success, null on error. + * @jms-builtin + */ +function sqlite_factory ($filename, $mode = 0666, &$error_message = null) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Encode binary data before returning it from an UDF + * @link http://php.net/manual/en/function.sqlite-udf-encode-binary.php + * @param string $data

+ * The string being encoded. + *

+ * @return string The encoded string. + * @jms-builtin + */ +function sqlite_udf_encode_binary ($data) {} + +/** + * (PHP 5, PECL sqlite >= 1.0.0)
+ * Decode binary data passed as parameters to an UDF + * @link http://php.net/manual/en/function.sqlite-udf-decode-binary.php + * @param string $data

+ * The encoded data that will be decoded, data that was applied by either + * sqlite_udf_encode_binary or + * sqlite_escape_string. + *

+ * @return string The decoded string. + * @jms-builtin + */ +function sqlite_udf_decode_binary ($data) {} + +/** + * (PHP 5)
+ * Return an array of column types from a particular table + * @link http://php.net/manual/en/function.sqlite-fetch-column-types.php + * @param string $table_name

+ * The table name to query. + *

+ * @param int $result_type [optional]

+ * The optional result_type parameter accepts a + * constant and determines how the returned array will be indexed. Using + * SQLITE_ASSOC will return only associative indices + * (named fields) while SQLITE_NUM will return only + * numerical indices (ordinal field numbers). + * SQLITE_ASSOC is the default for + * this function. + *

+ * @return array an array of column data types; false on error. + * @jms-builtin + */ +function sqlite_fetch_column_types ($table_name, $result_type = 'SQLITE_ASSOC') {} + + +/** + * Columns are returned into the array having both a numerical index + * and the field name as the array index. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_BOTH', 3); + +/** + * Columns are returned into the array having a numerical index to the + * fields. This index starts with 0, the first field in the result. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NUM', 2); + +/** + * Columns are returned into the array having the field name as the array + * index. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ASSOC', 1); + +/** + * Successful result. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_OK', 0); + +/** + * SQL error or missing database. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ERROR', 1); + +/** + * An internal logic error in SQLite. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_INTERNAL', 2); + +/** + * Access permission denied. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_PERM', 3); + +/** + * Callback routine requested an abort. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ABORT', 4); + +/** + * The database file is locked. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_BUSY', 5); + +/** + * A table in the database is locked. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_LOCKED', 6); + +/** + * Memory allocation failed. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOMEM', 7); + +/** + * Attempt to write a readonly database. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_READONLY', 8); + +/** + * Operation terminated internally. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_INTERRUPT', 9); + +/** + * Disk I/O error occurred. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_IOERR', 10); + +/** + * The database disk image is malformed. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_CORRUPT', 11); + +/** + * (Internal) Table or record not found. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOTFOUND', 12); + +/** + * Insertion failed because database is full. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_FULL', 13); + +/** + * Unable to open the database file. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_CANTOPEN', 14); + +/** + * Database lock protocol error. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_PROTOCOL', 15); + +/** + * (Internal) Database table is empty. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_EMPTY', 16); + +/** + * The database schema changed. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_SCHEMA', 17); + +/** + * Too much data for one row of a table. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_TOOBIG', 18); + +/** + * Abort due to constraint violation. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_CONSTRAINT', 19); + +/** + * Data type mismatch. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_MISMATCH', 20); + +/** + * Library used incorrectly. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_MISUSE', 21); + +/** + * Uses of OS features not supported on host. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOLFS', 22); + +/** + * Authorized failed. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_AUTH', 23); + +/** + * File opened that is not a database file. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_NOTADB', 26); + +/** + * Auxiliary database format error. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_FORMAT', 24); + +/** + * Internal process has another row ready. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_ROW', 100); + +/** + * Internal process has finished executing. + * @link http://php.net/manual/en/sqlite.constants.php + */ +define ('SQLITE_DONE', 101); + +// End of SQLite v.2.0-dev +?> diff --git a/res/php-5.4-core-api/SimpleXML.php b/res/php-5.4-core-api/SimpleXML.php new file mode 100644 index 0000000..6c83ce8 --- /dev/null +++ b/res/php-5.4-core-api/SimpleXML.php @@ -0,0 +1,529 @@ + + * Creates a new SimpleXMLElement object + * @link http://php.net/manual/en/simplexmlelement.construct.php + * @param $data + * @param $options [optional] + * @param $data_is_url [optional] + * @param $ns [optional] + * @param $is_prefix [optional] + */ + final public function __construct ($data, $options, $data_is_url, $ns, $is_prefix) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Return a well-formed XML string based on SimpleXML element + * @link http://php.net/manual/en/simplexmlelement.asxml.php + * @param string $filename [optional]

+ * If specified, the function writes the data to the file rather than + * returning it. + *

+ * @return mixed If the filename isn't specified, this function + * returns a string on success and FALSE on error. If the + * parameter is specified, it returns TRUE if the file was written + * successfully and FALSE otherwise. + */ + public function asXML ($filename = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Alias of SimpleXMLElement::asXML + * @link http://php.net/manual/en/simplexmlelement.savexml.php + * @param $filename [optional] + */ + public function saveXML ($filename) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Runs XPath query on XML data + * @link http://php.net/manual/en/simplexmlelement.xpath.php + * @param string $path

+ * An XPath path + *

+ * @return array an array of SimpleXMLElement objects or FALSE in + * case of an error. + */ + public function xpath ($path) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Creates a prefix/ns context for the next XPath query + * @link http://php.net/manual/en/simplexmlelement.registerxpathnamespace.php + * @param string $prefix

+ * The namespace prefix to use in the XPath query for the namespace given in + * ns. + *

+ * @param string $ns

+ * The namespace to use for the XPath query. This must match a namespace in + * use by the XML document or the XPath query using + * prefix will not return any results. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function registerXPathNamespace ($prefix, $ns) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Identifies an element's attributes + * @link http://php.net/manual/en/simplexmlelement.attributes.php + * @param string $ns [optional]

+ * An optional namespace for the retrieved attributes + *

+ * @param bool $is_prefix [optional]

+ * Default to FALSE + *

+ * @return SimpleXMLElement a SimpleXMLElement object that can be + * iterated over to loop through the attributes on the tag. + *

+ *

+ * Returns NULL if called on a SimpleXMLElement + * object that already represents an attribute and not a tag. + */ + public function attributes ($ns = null, $is_prefix = false) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Finds children of given node + * @link http://php.net/manual/en/simplexmlelement.children.php + * @param string $ns [optional]

+ * An XML namespace. + *

+ * @param bool $is_prefix [optional]

+ * If is_prefix is TRUE, + * ns will be regarded as a prefix. If FALSE, + * ns will be regarded as a namespace + * URL. + *

+ * @return SimpleXMLElement a SimpleXMLElement element, whether the node + * has children or not. + */ + public function children ($ns = null, $is_prefix = false) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Returns namespaces used in document + * @link http://php.net/manual/en/simplexmlelement.getnamespaces.php + * @param bool $recursive [optional]

+ * If specified, returns all namespaces used in parent and child nodes. + * Otherwise, returns only namespaces used in root node. + *

+ * @return array The getNamespaces method returns an array of + * namespace names with their associated URIs. + */ + public function getNamespaces ($recursive = false) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Returns namespaces declared in document + * @link http://php.net/manual/en/simplexmlelement.getdocnamespaces.php + * @param bool $recursive [optional]

+ * If specified, returns all namespaces declared in parent and child nodes. + * Otherwise, returns only namespaces declared in root node. + *

+ * @return array The getDocNamespaces method returns an array + * of namespace names with their associated URIs. + */ + public function getDocNamespaces ($recursive = false) {} + + /** + * (PHP 5 >= 5.1.3)
+ * Gets the name of the XML element + * @link http://php.net/manual/en/simplexmlelement.getname.php + * @return string The getName method returns as a string the + * name of the XML tag referenced by the SimpleXMLElement object. + */ + public function getName () {} + + /** + * (PHP 5 >= 5.1.3)
+ * Adds a child element to the XML node + * @link http://php.net/manual/en/simplexmlelement.addchild.php + * @param string $name

+ * The name of the child element to add. + *

+ * @param string $value [optional]

+ * If specified, the value of the child element. + *

+ * @param string $namespace [optional]

+ * If specified, the namespace to which the child element belongs. + *

+ * @return SimpleXMLElement The addChild method returns a SimpleXMLElement + * object representing the child added to the XML node. + */ + public function addChild ($name, $value = null, $namespace = null) {} + + /** + * (PHP 5 >= 5.1.3)
+ * Adds an attribute to the SimpleXML element + * @link http://php.net/manual/en/simplexmlelement.addattribute.php + * @param string $name

+ * The name of the attribute to add. + *

+ * @param string $value [optional]

+ * The value of the attribute. + *

+ * @param string $namespace [optional]

+ * If specified, the namespace to which the attribute belongs. + *

+ * @return void No value is returned. + */ + public function addAttribute ($name, $value = null, $namespace = null) {} + + public function __toString () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Counts the children of an element + * @link http://php.net/manual/en/simplexmlelement.count.php + * @return int the number of elements of an element. + */ + public function count () {} + +} + +/** + * The SimpleXMLIterator provides recursive iteration over all nodes of a SimpleXMLElement object. + * @link http://php.net/manual/en/class.simplexmliterator.php + * @jms-builtin + */ +class SimpleXMLIterator extends SimpleXMLElement implements Traversable, RecursiveIterator, Iterator, Countable { + + /** + * (PHP 5 >= 5.1.0)
+ * Rewind to the first element + * @link http://php.net/manual/en/simplexmliterator.rewind.php + * @return void No value is returned. + */ + public function rewind () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Check whether the current element is valid + * @link http://php.net/manual/en/simplexmliterator.valid.php + * @return bool TRUE if the current element is valid, otherwise FALSE + */ + public function valid () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns the current element + * @link http://php.net/manual/en/simplexmliterator.current.php + * @return mixed the current element as a SimpleXMLIterator object or NULL on failure. + */ + public function current () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Return current key + * @link http://php.net/manual/en/simplexmliterator.key.php + * @return mixed the XML tag name of the element referenced by the current SimpleXMLIterator object or FALSE + */ + public function key () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Move to next element + * @link http://php.net/manual/en/simplexmliterator.next.php + * @return void No value is returned. + */ + public function next () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Checks whether the current element has sub elements. + * @link http://php.net/manual/en/simplexmliterator.haschildren.php + * @return bool TRUE if the current element has sub-elements, otherwise FALSE + */ + public function hasChildren () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns the sub-elements of the current element + * @link http://php.net/manual/en/simplexmliterator.getchildren.php + * @return SimpleXMLIterator a SimpleXMLIterator object containing + * the sub-elements of the current element. + */ + public function getChildren () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Creates a new SimpleXMLElement object + * @link http://php.net/manual/en/simplexmlelement.construct.php + * @param $data + * @param $options [optional] + * @param $data_is_url [optional] + * @param $ns [optional] + * @param $is_prefix [optional] + */ + final public function __construct ($data, $options, $data_is_url, $ns, $is_prefix) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Return a well-formed XML string based on SimpleXML element + * @link http://php.net/manual/en/simplexmlelement.asxml.php + * @param string $filename [optional]

+ * If specified, the function writes the data to the file rather than + * returning it. + *

+ * @return mixed If the filename isn't specified, this function + * returns a string on success and FALSE on error. If the + * parameter is specified, it returns TRUE if the file was written + * successfully and FALSE otherwise. + */ + public function asXML ($filename = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Alias of SimpleXMLElement::asXML + * @link http://php.net/manual/en/simplexmlelement.savexml.php + * @param $filename [optional] + */ + public function saveXML ($filename) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Runs XPath query on XML data + * @link http://php.net/manual/en/simplexmlelement.xpath.php + * @param string $path

+ * An XPath path + *

+ * @return array an array of SimpleXMLElement objects or FALSE in + * case of an error. + */ + public function xpath ($path) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Creates a prefix/ns context for the next XPath query + * @link http://php.net/manual/en/simplexmlelement.registerxpathnamespace.php + * @param string $prefix

+ * The namespace prefix to use in the XPath query for the namespace given in + * ns. + *

+ * @param string $ns

+ * The namespace to use for the XPath query. This must match a namespace in + * use by the XML document or the XPath query using + * prefix will not return any results. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function registerXPathNamespace ($prefix, $ns) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Identifies an element's attributes + * @link http://php.net/manual/en/simplexmlelement.attributes.php + * @param string $ns [optional]

+ * An optional namespace for the retrieved attributes + *

+ * @param bool $is_prefix [optional]

+ * Default to FALSE + *

+ * @return SimpleXMLElement a SimpleXMLElement object that can be + * iterated over to loop through the attributes on the tag. + *

+ *

+ * Returns NULL if called on a SimpleXMLElement + * object that already represents an attribute and not a tag. + */ + public function attributes ($ns = null, $is_prefix = false) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Finds children of given node + * @link http://php.net/manual/en/simplexmlelement.children.php + * @param string $ns [optional]

+ * An XML namespace. + *

+ * @param bool $is_prefix [optional]

+ * If is_prefix is TRUE, + * ns will be regarded as a prefix. If FALSE, + * ns will be regarded as a namespace + * URL. + *

+ * @return SimpleXMLElement a SimpleXMLElement element, whether the node + * has children or not. + */ + public function children ($ns = null, $is_prefix = false) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Returns namespaces used in document + * @link http://php.net/manual/en/simplexmlelement.getnamespaces.php + * @param bool $recursive [optional]

+ * If specified, returns all namespaces used in parent and child nodes. + * Otherwise, returns only namespaces used in root node. + *

+ * @return array The getNamespaces method returns an array of + * namespace names with their associated URIs. + */ + public function getNamespaces ($recursive = false) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Returns namespaces declared in document + * @link http://php.net/manual/en/simplexmlelement.getdocnamespaces.php + * @param bool $recursive [optional]

+ * If specified, returns all namespaces declared in parent and child nodes. + * Otherwise, returns only namespaces declared in root node. + *

+ * @return array The getDocNamespaces method returns an array + * of namespace names with their associated URIs. + */ + public function getDocNamespaces ($recursive = false) {} + + /** + * (PHP 5 >= 5.1.3)
+ * Gets the name of the XML element + * @link http://php.net/manual/en/simplexmlelement.getname.php + * @return string The getName method returns as a string the + * name of the XML tag referenced by the SimpleXMLElement object. + */ + public function getName () {} + + /** + * (PHP 5 >= 5.1.3)
+ * Adds a child element to the XML node + * @link http://php.net/manual/en/simplexmlelement.addchild.php + * @param string $name

+ * The name of the child element to add. + *

+ * @param string $value [optional]

+ * If specified, the value of the child element. + *

+ * @param string $namespace [optional]

+ * If specified, the namespace to which the child element belongs. + *

+ * @return SimpleXMLElement The addChild method returns a SimpleXMLElement + * object representing the child added to the XML node. + */ + public function addChild ($name, $value = null, $namespace = null) {} + + /** + * (PHP 5 >= 5.1.3)
+ * Adds an attribute to the SimpleXML element + * @link http://php.net/manual/en/simplexmlelement.addattribute.php + * @param string $name

+ * The name of the attribute to add. + *

+ * @param string $value [optional]

+ * The value of the attribute. + *

+ * @param string $namespace [optional]

+ * If specified, the namespace to which the attribute belongs. + *

+ * @return void No value is returned. + */ + public function addAttribute ($name, $value = null, $namespace = null) {} + + public function __toString () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Counts the children of an element + * @link http://php.net/manual/en/simplexmlelement.count.php + * @return int the number of elements of an element. + */ + public function count () {} + +} + +/** + * (PHP 5)
+ * Interprets an XML file into an object + * @link http://php.net/manual/en/function.simplexml-load-file.php + * @param string $filename

+ * Path to the XML file + *

+ *

+ * Libxml 2 unescapes the URI, so if you want to pass e.g. + * b&#38;c as the URI parameter a, + * you have to call + * simplexml_load_file(rawurlencode('http://example.com/?a=' . + * urlencode('b&#38;c'))). Since PHP 5.1.0 you don't need to do + * this because PHP will do it for you. + *

+ * @param string $class_name [optional]

+ * You may use this optional parameter so that + * simplexml_load_file will return an object of + * the specified class. That class should extend the + * SimpleXMLElement class. + *

+ * @param int $options [optional]

+ * Since PHP 5.1.0 and Libxml 2.6.0, you may also use the + * options parameter to specify additional Libxml parameters. + *

+ * @param string $ns [optional]

+ * Namespace prefix or URI. + *

+ * @param bool $is_prefix [optional]

+ * TRUE if ns is a prefix, FALSE if it's a URI; + * defaults to FALSE. + *

+ * @return SimpleXMLElement an object of class SimpleXMLElement with + * properties containing the data held within the XML document, or FALSE on failure. + * @jms-builtin + */ +function simplexml_load_file ($filename, $class_name = "SimpleXMLElement", $options = 0, $ns = "", $is_prefix = false) {} + +/** + * (PHP 5)
+ * Interprets a string of XML into an object + * @link http://php.net/manual/en/function.simplexml-load-string.php + * @param string $data

+ * A well-formed XML string + *

+ * @param string $class_name [optional]

+ * You may use this optional parameter so that + * simplexml_load_string will return an object of + * the specified class. That class should extend the + * SimpleXMLElement class. + *

+ * @param int $options [optional]

+ * Since PHP 5.1.0 and Libxml 2.6.0, you may also use the + * options parameter to specify additional Libxml parameters. + *

+ * @param string $ns [optional]

+ * Namespace prefix or URI. + *

+ * @param bool $is_prefix [optional]

+ * TRUE if ns is a prefix, FALSE if it's a URI; + * defaults to FALSE. + *

+ * @return SimpleXMLElement an object of class SimpleXMLElement with + * properties containing the data held within the xml document, or FALSE on failure. + * @jms-builtin + */ +function simplexml_load_string ($data, $class_name = "SimpleXMLElement", $options = 0, $ns = "", $is_prefix = false) {} + +/** + * (PHP 5)
+ * Get a SimpleXMLElement object from a DOM node. + * @link http://php.net/manual/en/function.simplexml-import-dom.php + * @param DOMNode $node

+ * A DOM Element node + *

+ * @param string $class_name [optional]

+ * You may use this optional parameter so that + * simplexml_import_dom will return an object of + * the specified class. That class should extend the + * SimpleXMLElement class. + *

+ * @return SimpleXMLElement a SimpleXMLElement or FALSE on failure. + * @jms-builtin + */ +function simplexml_import_dom (DOMNode $node, $class_name = "SimpleXMLElement") {} + +// End of SimpleXML v.0.1 +?> diff --git a/res/php-5.4-core-api/ZendCache.php b/res/php-5.4-core-api/ZendCache.php new file mode 100644 index 0000000..ed59e09 --- /dev/null +++ b/res/php-5.4-core-api/ZendCache.php @@ -0,0 +1,30 @@ + diff --git a/res/php-5.4-core-api/ZendDebugger.php b/res/php-5.4-core-api/ZendDebugger.php new file mode 100644 index 0000000..b90536f --- /dev/null +++ b/res/php-5.4-core-api/ZendDebugger.php @@ -0,0 +1,24 @@ + diff --git a/res/php-5.4-core-api/ZendUtils.php b/res/php-5.4-core-api/ZendUtils.php new file mode 100644 index 0000000..a383146 --- /dev/null +++ b/res/php-5.4-core-api/ZendUtils.php @@ -0,0 +1,24 @@ + diff --git a/res/php-5.4-core-api/apc.php b/res/php-5.4-core-api/apc.php new file mode 100644 index 0000000..7199978 --- /dev/null +++ b/res/php-5.4-core-api/apc.php @@ -0,0 +1,391 @@ + + * Retrieves cached information from APC's data store + * @link http://php.net/manual/en/function.apc-cache-info.php + * @param string $cache_type [optional]

+ * If cache_type is "user", + * information about the user cache will be returned. + *

+ *

+ * If cache_type is "filehits", + * information about which files have been served from the bytecode cache + * for the current request will be returned. This feature must be enabled at + * compile time using --enable-filehits. + *

+ *

+ * If an invalid or no cache_type is specified, information about + * the system cache (cached files) will be returned. + *

+ * @param bool $limited [optional]

+ * If limited is TRUE, the + * return value will exclude the individual list of cache entries. This + * is useful when trying to optimize calls for statistics gathering. + *

+ * @return array Array of cached data (and meta-data) or FALSE on failure + * @jms-builtin + */ +function apc_cache_info ($cache_type = null, $limited = false) {} + +/** + * (PECL apc >= 2.0.0)
+ * Clears the APC cache + * @link http://php.net/manual/en/function.apc-clear-cache.php + * @param string $cache_type [optional]

+ * If cache_type is "user", the + * user cache will be cleared; otherwise, the system cache (cached files) + * will be cleared. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function apc_clear_cache ($cache_type = null) {} + +/** + * (PECL apc >= 2.0.0)
+ * Retrieves APC's Shared Memory Allocation information + * @link http://php.net/manual/en/function.apc-sma-info.php + * @param bool $limited [optional]

+ * When set to FALSE (default) apc_sma_info will + * return a detailed information about each segment. + *

+ * @return array Array of Shared Memory Allocation data; FALSE on failure. + * @jms-builtin + */ +function apc_sma_info ($limited = false) {} + +/** + * (PECL apc >= 3.0.0)
+ * Cache a variable in the data store + * @link http://php.net/manual/en/function.apc-store.php + * @param string $key

+ * Store the variable using this name. keys are + * cache-unique, so storing a second value with the same + * key will overwrite the original value. + *

+ * @param mixed $var

+ * The variable to store + *

+ * @param int $ttl [optional]

+ * Time To Live; store var in the cache for + * ttl seconds. After the + * ttl has passed, the stored variable will be + * expunged from the cache (on the next request). If no ttl + * is supplied (or if the ttl is + * 0), the value will persist until it is removed from + * the cache manually, or otherwise fails to exist in the cache (clear, + * restart, etc.). + *

+ * @return bool TRUE on success or FALSE on failure. + * Second syntax returns array with error keys. + * @jms-builtin + */ +function apc_store ($key, $var, $ttl = 0) {} + +/** + * (PECL apc >= 3.0.0)
+ * Fetch a stored variable from the cache + * @link http://php.net/manual/en/function.apc-fetch.php + * @param mixed $key

+ * The key used to store the value (with + * apc_store). If an array is passed then each + * element is fetched and returned. + *

+ * @param bool $success [optional]

+ * Set to TRUE in success and FALSE in failure. + *

+ * @return mixed The stored variable or array of variables on success; FALSE on failure + * @jms-builtin + */ +function apc_fetch ($key, &$success = null) {} + +/** + * (PECL apc >= 3.0.0)
+ * Removes a stored variable from the cache + * @link http://php.net/manual/en/function.apc-delete.php + * @param string $key

+ * The key used to store the value (with + * apc_store). + *

+ * @return mixed TRUE on success or FALSE on failure. + * @jms-builtin + */ +function apc_delete ($key) {} + +/** + * (PECL apc >= 3.1.1)
+ * Deletes files from the opcode cache + * @link http://php.net/manual/en/function.apc-delete-file.php + * @param mixed $keys

+ * The files to be deleted. Accepts a string, + * array of strings, or an APCIterator + * object. + *

+ * @return mixed TRUE on success or FALSE on failure. + * Or if keys is an array, then + * an empty array is returned on success, or an array of failed files + * is returned. + * @jms-builtin + */ +function apc_delete_file ($keys) {} + +/** + * (PECL apc >= 3.0.0)
+ * Defines a set of constants for retrieval and mass-definition + * @link http://php.net/manual/en/function.apc-define-constants.php + * @param string $key

+ * The key serves as the name of the constant set + * being stored. This key is used to retrieve the + * stored constants in apc_load_constants. + *

+ * @param array $constants

+ * An associative array of constant_name => value + * pairs. The constant_name must follow the normal + * constant naming rules. + * value must evaluate to a scalar value. + *

+ * @param bool $case_sensitive [optional]

+ * The default behaviour for constants is to be declared case-sensitive; + * i.e. CONSTANT and Constant + * represent different values. If this parameter evaluates to FALSE the + * constants will be declared as case-insensitive symbols. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function apc_define_constants ($key, array $constants, $case_sensitive = true) {} + +/** + * (PECL apc >= 3.0.0)
+ * Loads a set of constants from the cache + * @link http://php.net/manual/en/function.apc-load-constants.php + * @param string $key

+ * The name of the constant set (that was stored with + * apc_define_constants) to be retrieved. + *

+ * @param bool $case_sensitive [optional]

+ * The default behaviour for constants is to be declared case-sensitive; + * i.e. CONSTANT and Constant + * represent different values. If this parameter evaluates to FALSE the + * constants will be declared as case-insensitive symbols. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function apc_load_constants ($key, $case_sensitive = true) {} + +/** + * (PECL apc >= 3.0.13)
+ * Stores a file in the bytecode cache, bypassing all filters. + * @link http://php.net/manual/en/function.apc-compile-file.php + * @param string $filename

+ * Full or relative path to a PHP file that will be compiled and stored in + * the bytecode cache. + *

+ * @param bool $atomic [optional] + * @return mixed TRUE on success or FALSE on failure. + * @jms-builtin + */ +function apc_compile_file ($filename, $atomic = true) {} + +/** + * (PECL apc >= 3.0.13)
+ * Cache a new variable in the data store + * @link http://php.net/manual/en/function.apc-add.php + * @param string $key

+ * Store the variable using this name. keys are + * cache-unique, so attempting to use apc_add to + * store data with a key that already exists will not overwrite the + * existing data, and will instead return FALSE. (This is the only + * difference between apc_add and + * apc_store.) + *

+ * @param mixed $var [optional]

+ * The variable to store + *

+ * @param int $ttl [optional]

+ * Time To Live; store var in the cache for + * ttl seconds. After the + * ttl has passed, the stored variable will be + * expunged from the cache (on the next request). If no ttl + * is supplied (or if the ttl is + * 0), the value will persist until it is removed from + * the cache manually, or otherwise fails to exist in the cache (clear, + * restart, etc.). + *

+ * @return bool TRUE on success or FALSE on failure. + * Second syntax returns array with error keys. + * @jms-builtin + */ +function apc_add ($key, $var = null, $ttl = 0) {} + +/** + * (PECL apc >= 3.1.1)
+ * Increase a stored number + * @link http://php.net/manual/en/function.apc-inc.php + * @param string $key

+ * The key of the value being increased. + *

+ * @param int $step [optional]

+ * The step, or value to increase. + *

+ * @param bool $success [optional]

+ * Optionally pass the success or fail boolean value to + * this referenced variable. + *

+ * @return int the current value of key's value on success, + * or FALSE on failure + * @jms-builtin + */ +function apc_inc ($key, $step = 1, &$success = null) {} + +/** + * (PECL apc >= 3.1.1)
+ * Decrease a stored number + * @link http://php.net/manual/en/function.apc-dec.php + * @param string $key

+ * The key of the value being decreased. + *

+ * @param int $step [optional]

+ * The step, or value to decrease. + *

+ * @param bool $success [optional]

+ * Optionally pass the success or fail boolean value to + * this referenced variable. + *

+ * @return int the current value of key's value on success, + * or FALSE on failure + * @jms-builtin + */ +function apc_dec ($key, $step = 1, &$success = null) {} + +/** + * (PECL apc >= 3.1.1)
+ * Updates an old value with a new value + * @link http://php.net/manual/en/function.apc-cas.php + * @param string $key

+ * The key of the value being updated. + *

+ * @param int $old

+ * The old value (the value currently stored). + *

+ * @param int $new

+ * The new value to update to. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function apc_cas ($key, $old, $new) {} + +/** + * (PECL apc >= 3.1.4)
+ * Get a binary dump of the given files and user variables + * @link http://php.net/manual/en/function.apc-bin-dump.php + * @param array $files [optional]

+ * The files. Passing in NULL signals a dump of every entry, while + * passing in array will dump nothing. + *

+ * @param array $user_vars [optional]

+ * The user vars. Passing in NULL signals a dump of every entry, while + * passing in array will dump nothing. + *

+ * @return string a binary dump of the given files and user variables from the APC cache, + * FALSE if APC is not enabled, or NULL if an unknown error is encountered. + * @jms-builtin + */ +function apc_bin_dump (array $files = null, array $user_vars = null) {} + +/** + * (PECL apc >= 3.1.4)
+ * Load a binary dump into the APC file/user cache + * @link http://php.net/manual/en/function.apc-bin-load.php + * @param string $data

+ * The binary dump being loaded, likely from + * apc_bin_dump. + *

+ * @param int $flags [optional]

+ * Either APC_BIN_VERIFY_CRC32, APC_BIN_VERIFY_MD5, + * or both. + *

+ * @return bool TRUE if the binary dump data was loaded + * with success, otherwise FALSE is returned. FALSE is returned if APC + * is not enabled, or if the data is not a valid APC + * binary dump (e.g., unexpected size). + * @jms-builtin + */ +function apc_bin_load ($data, $flags = 0) {} + +/** + * (PECL apc >= 3.1.4)
+ * Output a binary dump of cached files and user variables to a file + * @link http://php.net/manual/en/function.apc-bin-dumpfile.php + * @param array $files

+ * The file names being dumped. + *

+ * @param array $user_vars

+ * The user variables being dumped. + *

+ * @param string $filename

+ * The filename where the dump is being saved. + *

+ * @param int $flags [optional]

+ * Flags passed to the filename stream. See the + * file_put_contents documentation for details. + *

+ * @param resource $context [optional]

+ * The context passed to the filename stream. See the + * file_put_contents documentation for details. + *

+ * @return int The number of bytes written to the file, otherwise + * FALSE if APC is not enabled, filename is an invalid file name, + * filename can't be opened, the file dump can't be completed + * (e.g., the hard drive is out of disk space), or an unknown error was encountered. + * @jms-builtin + */ +function apc_bin_dumpfile (array $files, array $user_vars, $filename, $flags = 0, $context = null) {} + +/** + * (PECL apc >= 3.1.4)
+ * Load a binary dump from a file into the APC file/user cache + * @link http://php.net/manual/en/function.apc-bin-loadfile.php + * @param string $filename

+ * The file name containing the dump, likely from + * apc_bin_dumpfile. + *

+ * @param resource $context [optional]

+ * The files context. + *

+ * @param int $flags [optional]

+ * Either APC_BIN_VERIFY_CRC32, APC_BIN_VERIFY_MD5, + * or both. + *

+ * @return bool TRUE on success, otherwise FALSE Reasons it may return FALSE include + * APC is not enabled, filename is an invalid file name or empty, + * filename can't be opened, the file dump can't be completed, or + * if the data is not a valid APC binary dump (e.g., unexpected + * size). + * @jms-builtin + */ +function apc_bin_loadfile ($filename, $context = null, $flags = null) {} + +/** + * (PECL apc >= 3.1.4)
+ * Checks if APC key exists + * @link http://php.net/manual/en/function.apc-exists.php + * @param mixed $keys

+ * A string, or an array of strings, that + * contain keys. + *

+ * @return mixed TRUE if the key exists, otherwise FALSE Or if an + * array was passed to keys, then + * an array is returned that contains all existing keys, or an empty + * array if none exist. + * @jms-builtin + */ +function apc_exists ($keys) {} + +// End of apc v.3.1.9 +?> diff --git a/res/php-5.4-core-api/basic.php b/res/php-5.4-core-api/basic.php new file mode 100644 index 0000000..b4670c0 --- /dev/null +++ b/res/php-5.4-core-api/basic.php @@ -0,0 +1,100 @@ + + * Loads a PHP extension at runtime + * @link http://php.net/manual/en/function.dl.php + * @param string $library

+ * This parameter is only the filename of the + * extension to load which also depends on your platform. For example, + * the sockets extension (if compiled + * as a shared module, not the default!) would be called + * sockets.so on Unix platforms whereas it is called + * php_sockets.dll on the Windows platform. + *

+ *

+ * The directory where the extension is loaded from depends on your + * platform: + *

+ *

+ * Windows - If not explicitly set in the php.ini, the extension is + * loaded from C:\php4\extensions\ (PHP 4) or + * C:\php5\ (PHP 5) by default. + *

+ *

+ * Unix - If not explicitly set in the php.ini, the default extension + * directory depends on + * whether PHP has been built with --enable-debug + * or not + * @return bool TRUE on success or FALSE on failure. If the functionality of loading modules is not available + * or has been disabled (either by setting + * enable_dl off or by enabling safe mode + * in php.ini) an E_ERROR is emitted + * and execution is stopped. If dl fails because the + * specified library couldn't be loaded, in addition to FALSE an + * E_WARNING message is emitted. + * @jms-builtin + */ +function dl ($library) {} + + +/** + * The full path and filename of the file. If used inside an include, + * the name of the included file is returned. + * Since PHP 4.0.2, __FILE__ always contains an + * absolute path with symlinks resolved whereas in older versions it contained relative path + * under some circumstances. + * @link http://php.net/manual/en/language.constants.php + */ +define ('__FILE__', null); + +/** + * The current line number of the file. + * @link http://php.net/manual/en/language.constants.php + */ +define ('__LINE__', null); + +/** + * The class name. (Added in PHP 4.3.0) As of PHP 5 this constant + * returns the class name as it was declared (case-sensitive). In PHP + * 4 its value is always lowercased. The class name includes the namespace + * it was declared in (e.g. Foo\Bar). + * Note that as of PHP 5.4 __CLASS__ works also in traits. When used + * in a trait method, __CLASS__ is the name of the class the trait + * is used in. + * @link http://php.net/manual/en/language.constants.php + */ +define ('__CLASS__', ""); + +/** + * The function name. (Added in PHP 4.3.0) As of PHP 5 this constant + * returns the function name as it was declared (case-sensitive). In + * PHP 4 its value is always lowercased. + * @link http://php.net/manual/en/language.constants.php + */ +define ('__FUNCTION__', null); + +/** + * The class method name. (Added in PHP 5.0.0) The method name is + * returned as it was declared (case-sensitive). + * @link http://php.net/manual/en/language.constants.php + */ +define ('__METHOD__', null); + +/** + * The directory of the file. If used inside an include, + * the directory of the included file is returned. This is equivalent + * to dirname(__FILE__). This directory name + * does not have a trailing slash unless it is the root directory. + * (Added in PHP 5.3.0.) + * @link http://php.net/manual/en/language.constants.php + */ +define ('__DIR__', null); + +/** + * The name of the current namespace (case-sensitive). This constant + * is defined in compile-time (Added in PHP 5.3.0). + * @link http://php.net/manual/en/language.constants.php + */ +define ('__NAMESPACE__', null); +?> diff --git a/res/php-5.4-core-api/bcmath.php b/res/php-5.4-core-api/bcmath.php new file mode 100644 index 0000000..79a3c14 --- /dev/null +++ b/res/php-5.4-core-api/bcmath.php @@ -0,0 +1,171 @@ + + * Add two arbitrary precision numbers + * @link http://php.net/manual/en/function.bcadd.php + * @param string $left_operand

+ * The left operand, as a string. + *

+ * @param string $right_operand

+ * The right operand, as a string. + *

+ * @param int $scale [optional] + * @return string The sum of the two operands, as a string. + * @jms-builtin + */ +function bcadd ($left_operand, $right_operand, $scale = null) {} + +/** + * (PHP 4, PHP 5)
+ * Subtract one arbitrary precision number from another + * @link http://php.net/manual/en/function.bcsub.php + * @param string $left_operand

+ * The left operand, as a string. + *

+ * @param string $right_operand

+ * The right operand, as a string. + *

+ * @param int $scale [optional] + * @return string The result of the subtraction, as a string. + * @jms-builtin + */ +function bcsub ($left_operand, $right_operand, $scale = null) {} + +/** + * (PHP 4, PHP 5)
+ * Multiply two arbitrary precision number + * @link http://php.net/manual/en/function.bcmul.php + * @param string $left_operand

+ * The left operand, as a string. + *

+ * @param string $right_operand

+ * The right operand, as a string. + *

+ * @param int $scale [optional] + * @return string the result as a string. + * @jms-builtin + */ +function bcmul ($left_operand, $right_operand, $scale = null) {} + +/** + * (PHP 4, PHP 5)
+ * Divide two arbitrary precision numbers + * @link http://php.net/manual/en/function.bcdiv.php + * @param string $left_operand

+ * The left operand, as a string. + *

+ * @param string $right_operand

+ * The right operand, as a string. + *

+ * @param int $scale [optional] + * @return string the result of the division as a string, or NULL if + * right_operand is 0. + * @jms-builtin + */ +function bcdiv ($left_operand, $right_operand, $scale = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get modulus of an arbitrary precision number + * @link http://php.net/manual/en/function.bcmod.php + * @param string $left_operand

+ * The left operand, as a string. + *

+ * @param string $modulus

+ * The modulus, as a string. + *

+ * @return string the modulus as a string, or NULL if + * modulus is 0. + * @jms-builtin + */ +function bcmod ($left_operand, $modulus) {} + +/** + * (PHP 4, PHP 5)
+ * Raise an arbitrary precision number to another + * @link http://php.net/manual/en/function.bcpow.php + * @param string $left_operand

+ * The left operand, as a string. + *

+ * @param string $right_operand

+ * The right operand, as a string. + *

+ * @param int $scale [optional] + * @return string the result as a string. + * @jms-builtin + */ +function bcpow ($left_operand, $right_operand, $scale = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get the square root of an arbitrary precision number + * @link http://php.net/manual/en/function.bcsqrt.php + * @param string $operand

+ * The operand, as a string. + *

+ * @param int $scale [optional] + * @return string the square root as a string, or NULL if + * operand is negative. + * @jms-builtin + */ +function bcsqrt ($operand, $scale = null) {} + +/** + * (PHP 4, PHP 5)
+ * Set default scale parameter for all bc math functions + * @link http://php.net/manual/en/function.bcscale.php + * @param int $scale

+ * The scale factor. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function bcscale ($scale) {} + +/** + * (PHP 4, PHP 5)
+ * Compare two arbitrary precision numbers + * @link http://php.net/manual/en/function.bccomp.php + * @param string $left_operand

+ * The left operand, as a string. + *

+ * @param string $right_operand

+ * The right operand, as a string. + *

+ * @param int $scale [optional]

+ * The optional scale parameter is used to set the + * number of digits after the decimal place which will be used in the + * comparison. + *

+ * @return int 0 if the two operands are equal, 1 if the + * left_operand is larger than the + * right_operand, -1 otherwise. + * @jms-builtin + */ +function bccomp ($left_operand, $right_operand, $scale = null) {} + +/** + * (PHP 5)
+ * Raise an arbitrary precision number to another, reduced by a specified modulus + * @link http://php.net/manual/en/function.bcpowmod.php + * @param string $left_operand

+ * The left operand, as a string. + *

+ * @param string $right_operand

+ * The right operand, as a string. + *

+ * @param string $modulus

+ * The modulus, as a string. + *

+ * @param int $scale [optional] + * @return string the result as a string, or NULL if modulus + * is 0. + * @jms-builtin + */ +function bcpowmod ($left_operand, $right_operand, $modulus, $scale = null) {} + +// End of bcmath v. +?> diff --git a/res/php-5.4-core-api/bz2.php b/res/php-5.4-core-api/bz2.php new file mode 100644 index 0000000..9385a1c --- /dev/null +++ b/res/php-5.4-core-api/bz2.php @@ -0,0 +1,177 @@ + + * Opens a bzip2 compressed file + * @link http://php.net/manual/en/function.bzopen.php + * @param string $filename

+ * The name of the file to open. + *

+ * @param string $mode

+ * Similar to the fopen function, only 'r' (read) + * and 'w' (write) are supported. Everything else will cause bzopen + * to return FALSE. + *

+ * @return resource If the open fails, bzopen returns FALSE, otherwise + * it returns a pointer to the newly opened file. + * @jms-builtin + */ +function bzopen ($filename, $mode) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Binary safe bzip2 file read + * @link http://php.net/manual/en/function.bzread.php + * @param resource $bz

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @param int $length [optional]

+ * If not specified, bzread will read 1024 + * (uncompressed) bytes at a time. A maximum of 8192 + * uncompressed bytes will be read at a time. + *

+ * @return string the uncompressed data, or FALSE on error. + * @jms-builtin + */ +function bzread ($bz, $length = 1024) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Binary safe bzip2 file write + * @link http://php.net/manual/en/function.bzwrite.php + * @param resource $bz

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @param string $data

+ * The written data. + *

+ * @param int $length [optional]

+ * If supplied, writing will stop after length + * (uncompressed) bytes have been written or the end of + * data is reached, whichever comes first. + *

+ * @return int the number of bytes written, or FALSE on error. + * @jms-builtin + */ +function bzwrite ($bz, $data, $length = null) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Force a write of all buffered data + * @link http://php.net/manual/en/function.bzflush.php + * @param resource $bz

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return int TRUE on success or FALSE on failure. + * @jms-builtin + */ +function bzflush ($bz) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Close a bzip2 file + * @link http://php.net/manual/en/function.bzclose.php + * @param resource $bz

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return int TRUE on success or FALSE on failure. + * @jms-builtin + */ +function bzclose ($bz) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Returns a bzip2 error number + * @link http://php.net/manual/en/function.bzerrno.php + * @param resource $bz

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return int the error number as an integer. + * @jms-builtin + */ +function bzerrno ($bz) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Returns a bzip2 error string + * @link http://php.net/manual/en/function.bzerrstr.php + * @param resource $bz

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return string a string containing the error message. + * @jms-builtin + */ +function bzerrstr ($bz) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Returns the bzip2 error number and error string in an array + * @link http://php.net/manual/en/function.bzerror.php + * @param resource $bz

+ * The file pointer. It must be valid and must point to a file + * successfully opened by bzopen. + *

+ * @return array an associative array, with the error code in the + * errno entry, and the error message in the + * errstr entry. + * @jms-builtin + */ +function bzerror ($bz) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Compress a string into bzip2 encoded data + * @link http://php.net/manual/en/function.bzcompress.php + * @param string $source

+ * The string to compress. + *

+ * @param int $blocksize [optional]

+ * Specifies the blocksize used during compression and should be a number + * from 1 to 9 with 9 giving the best compression, but using more + * resources to do so. + *

+ * @param int $workfactor [optional]

+ * Controls how the compression phase behaves when presented with worst + * case, highly repetitive, input data. The value can be between 0 and + * 250 with 0 being a special case. + *

+ *

+ * Regardless of the workfactor, the generated + * output is the same. + *

+ * @return mixed The compressed string, or an error number if an error occurred. + * @jms-builtin + */ +function bzcompress ($source, $blocksize = 4, $workfactor = 0) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Decompresses bzip2 encoded data + * @link http://php.net/manual/en/function.bzdecompress.php + * @param string $source

+ * The string to decompress. + *

+ * @param int $small [optional]

+ * If TRUE, an alternative decompression algorithm will be used which + * uses less memory (the maximum memory requirement drops to around 2300K) + * but works at roughly half the speed. + *

+ *

+ * See the bzip2 documentation for more + * information about this feature. + *

+ * @return mixed The decompressed string, or an error number if an error occurred. + * @jms-builtin + */ +function bzdecompress ($source, $small = 0) {} + +// End of bz2 v. +?> diff --git a/res/php-5.4-core-api/calendar.php b/res/php-5.4-core-api/calendar.php new file mode 100644 index 0000000..adc60bc --- /dev/null +++ b/res/php-5.4-core-api/calendar.php @@ -0,0 +1,336 @@ + + * Converts Julian Day Count to Gregorian date + * @link http://php.net/manual/en/function.jdtogregorian.php + * @param int $julianday

+ * A julian day number as integer + *

+ * @return string The gregorian date as a string in the form "month/day/year" + * @jms-builtin + */ +function jdtogregorian ($julianday) {} + +/** + * (PHP 4, PHP 5)
+ * Converts a Gregorian date to Julian Day Count + * @link http://php.net/manual/en/function.gregoriantojd.php + * @param int $month

+ * The month as a number from 1 (for January) to 12 (for December) + *

+ * @param int $day

+ * The day as a number from 1 to 31 + *

+ * @param int $year

+ * The year as a number between -4714 and 9999 + *

+ * @return int The julian day for the given gregorian date as an integer. + * @jms-builtin + */ +function gregoriantojd ($month, $day, $year) {} + +/** + * (PHP 4, PHP 5)
+ * Converts a Julian Day Count to a Julian Calendar Date + * @link http://php.net/manual/en/function.jdtojulian.php + * @param int $julianday

+ * A julian day number as integer + *

+ * @return string The julian date as a string in the form "month/day/year" + * @jms-builtin + */ +function jdtojulian ($julianday) {} + +/** + * (PHP 4, PHP 5)
+ * Converts a Julian Calendar date to Julian Day Count + * @link http://php.net/manual/en/function.juliantojd.php + * @param int $month

+ * The month as a number from 1 (for January) to 12 (for December) + *

+ * @param int $day

+ * The day as a number from 1 to 31 + *

+ * @param int $year

+ * The year as a number between -4713 and 9999 + *

+ * @return int The julian day for the given julian date as an integer. + * @jms-builtin + */ +function juliantojd ($month, $day, $year) {} + +/** + * (PHP 4, PHP 5)
+ * Converts a Julian day count to a Jewish calendar date + * @link http://php.net/manual/en/function.jdtojewish.php + * @param int $juliandaycount + * @param bool $hebrew [optional]

+ * If the hebrew parameter is set to TRUE, the + * fl parameter is used for Hebrew, string based, + * output format. + *

+ * @param int $fl [optional]

+ * The available formats are: + * CAL_JEWISH_ADD_ALAFIM_GERESH, + * CAL_JEWISH_ADD_ALAFIM, + * CAL_JEWISH_ADD_GERESHAYIM. + *

+ * @return string The jewish date as a string in the form "month/day/year" + * @jms-builtin + */ +function jdtojewish ($juliandaycount, $hebrew = false, $fl = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Converts a date in the Jewish Calendar to Julian Day Count + * @link http://php.net/manual/en/function.jewishtojd.php + * @param int $month

+ * The month as a number from 1 to 13 + *

+ * @param int $day

+ * The day as a number from 1 to 30 + *

+ * @param int $year

+ * The year as a number between 1 and 9999 + *

+ * @return int The julian day for the given jewish date as an integer. + * @jms-builtin + */ +function jewishtojd ($month, $day, $year) {} + +/** + * (PHP 4, PHP 5)
+ * Converts a Julian Day Count to the French Republican Calendar + * @link http://php.net/manual/en/function.jdtofrench.php + * @param int $juliandaycount + * @return string The french revolution date as a string in the form "month/day/year" + * @jms-builtin + */ +function jdtofrench ($juliandaycount) {} + +/** + * (PHP 4, PHP 5)
+ * Converts a date from the French Republican Calendar to a Julian Day Count + * @link http://php.net/manual/en/function.frenchtojd.php + * @param int $month

+ * The month as a number from 1 (for Vendémiaire) to 13 (for the period of 5-6 days at the end of each year) + *

+ * @param int $day

+ * The day as a number from 1 to 30 + *

+ * @param int $year

+ * The year as a number between 1 and 14 + *

+ * @return int The julian day for the given french revolution date as an integer. + * @jms-builtin + */ +function frenchtojd ($month, $day, $year) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the day of the week + * @link http://php.net/manual/en/function.jddayofweek.php + * @param int $julianday

+ * A julian day number as integer + *

+ * @param int $mode [optional] + * Calendar week modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ModeMeaning
0 (Default) + * Return the day number as an int (0=Sunday, 1=Monday, etc) + *
1 + * Returns string containing the day of week + * (English-Gregorian) + *
2 + * Return a string containing the abbreviated day of week + * (English-Gregorian) + *
+ * @return mixed The gregorian weekday as either an integer or string. + * @jms-builtin + */ +function jddayofweek ($julianday, $mode = 'CAL_DOW_DAYNO') {} + +/** + * (PHP 4, PHP 5)
+ * Returns a month name + * @link http://php.net/manual/en/function.jdmonthname.php + * @param int $julianday + * @param int $mode + * @return string The month name for the given Julian Day and calendar. + * @jms-builtin + */ +function jdmonthname ($julianday, $mode) {} + +/** + * (PHP 4, PHP 5)
+ * Get Unix timestamp for midnight on Easter of a given year + * @link http://php.net/manual/en/function.easter-date.php + * @param int $year [optional]

+ * The year as a number between 1970 an 2037 + *

+ * @return int The easter date as a unix timestamp. + * @jms-builtin + */ +function easter_date ($year = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get number of days after March 21 on which Easter falls for a given year + * @link http://php.net/manual/en/function.easter-days.php + * @param int $year [optional]

+ * The year as a positive number + *

+ * @param int $method [optional]

+ * Allows to calculate easter dates based + * on the Gregorian calendar during the years 1582 - 1752 when set to + * CAL_EASTER_ROMAN. See the calendar constants for more valid + * constants. + *

+ * @return int The number of days after March 21st that the Easter Sunday + * is in the given year. + * @jms-builtin + */ +function easter_days ($year = null, $method = 'CAL_EASTER_DEFAULT') {} + +/** + * (PHP 4, PHP 5)
+ * Convert Unix timestamp to Julian Day + * @link http://php.net/manual/en/function.unixtojd.php + * @param int $timestamp [optional]

+ * A unix timestamp to convert. + *

+ * @return int A julian day number as integer. + * @jms-builtin + */ +function unixtojd ($timestamp = 'time()') {} + +/** + * (PHP 4, PHP 5)
+ * Convert Julian Day to Unix timestamp + * @link http://php.net/manual/en/function.jdtounix.php + * @param int $jday

+ * A julian day number between 2440588 and 2465342. + *

+ * @return int The unix timestamp for the start of the given julian day. + * @jms-builtin + */ +function jdtounix ($jday) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Converts from a supported calendar to Julian Day Count + * @link http://php.net/manual/en/function.cal-to-jd.php + * @param int $calendar

+ * Calendar to convert from, one of + * CAL_GREGORIAN, + * CAL_JULIAN, + * CAL_JEWISH or + * CAL_FRENCH. + *

+ * @param int $month

+ * The month as a number, the valid range depends + * on the calendar + *

+ * @param int $day

+ * The day as a number, the valid range depends + * on the calendar + *

+ * @param int $year

+ * The year as a number, the valid range depends + * on the calendar + *

+ * @return int A Julian Day number. + * @jms-builtin + */ +function cal_to_jd ($calendar, $month, $day, $year) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Converts from Julian Day Count to a supported calendar + * @link http://php.net/manual/en/function.cal-from-jd.php + * @param int $jd

+ * Julian day as integer + *

+ * @param int $calendar

+ * Calendar to convert to + *

+ * @return array an array containing calendar information like month, day, year, + * day of week, abbreviated and full names of weekday and month and the + * date in string form "month/day/year". + * @jms-builtin + */ +function cal_from_jd ($jd, $calendar) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Return the number of days in a month for a given year and calendar + * @link http://php.net/manual/en/function.cal-days-in-month.php + * @param int $calendar

+ * Calendar to use for calculation + *

+ * @param int $month

+ * Month in the selected calendar + *

+ * @param int $year

+ * Year in the selected calendar + *

+ * @return int The length in days of the selected month in the given calendar + * @jms-builtin + */ +function cal_days_in_month ($calendar, $month, $year) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Returns information about a particular calendar + * @link http://php.net/manual/en/function.cal-info.php + * @param int $calendar [optional]

+ * Calendar to return information for. If no calendar is specified + * information about all calendars is returned. + *

+ * @return array + * @jms-builtin + */ +function cal_info ($calendar = -1) {} + +define ('CAL_GREGORIAN', 0); +define ('CAL_JULIAN', 1); +define ('CAL_JEWISH', 2); +define ('CAL_FRENCH', 3); +define ('CAL_NUM_CALS', 4); +define ('CAL_DOW_DAYNO', 0); +define ('CAL_DOW_SHORT', 1); +define ('CAL_DOW_LONG', 2); +define ('CAL_MONTH_GREGORIAN_SHORT', 0); +define ('CAL_MONTH_GREGORIAN_LONG', 1); +define ('CAL_MONTH_JULIAN_SHORT', 2); +define ('CAL_MONTH_JULIAN_LONG', 3); +define ('CAL_MONTH_JEWISH', 4); +define ('CAL_MONTH_FRENCH', 5); +define ('CAL_EASTER_DEFAULT', 0); +define ('CAL_EASTER_ROMAN', 1); +define ('CAL_EASTER_ALWAYS_GREGORIAN', 2); +define ('CAL_EASTER_ALWAYS_JULIAN', 3); +define ('CAL_JEWISH_ADD_ALAFIM_GERESH', 2); +define ('CAL_JEWISH_ADD_ALAFIM', 4); +define ('CAL_JEWISH_ADD_GERESHAYIM', 8); + +// End of calendar v. +?> diff --git a/res/php-5.4-core-api/ctype.php b/res/php-5.4-core-api/ctype.php new file mode 100644 index 0000000..001c915 --- /dev/null +++ b/res/php-5.4-core-api/ctype.php @@ -0,0 +1,156 @@ + + * Check for alphanumeric character(s) + * @link http://php.net/manual/en/function.ctype-alnum.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in text is either + * a letter or a digit, FALSE otherwise. + * @jms-builtin + */ +function ctype_alnum ($text) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check for alphabetic character(s) + * @link http://php.net/manual/en/function.ctype-alpha.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in text is + * a letter from the current locale, FALSE otherwise. + * @jms-builtin + */ +function ctype_alpha ($text) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check for control character(s) + * @link http://php.net/manual/en/function.ctype-cntrl.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in text is + * a control character from the current locale, FALSE otherwise. + * @jms-builtin + */ +function ctype_cntrl ($text) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check for numeric character(s) + * @link http://php.net/manual/en/function.ctype-digit.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in the string + * text is a decimal digit, FALSE otherwise. + * @jms-builtin + */ +function ctype_digit ($text) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check for lowercase character(s) + * @link http://php.net/manual/en/function.ctype-lower.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in text is + * a lowercase letter in the current locale. + * @jms-builtin + */ +function ctype_lower ($text) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check for any printable character(s) except space + * @link http://php.net/manual/en/function.ctype-graph.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in text is + * printable and actually creates visible output (no white space), FALSE + * otherwise. + * @jms-builtin + */ +function ctype_graph ($text) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check for printable character(s) + * @link http://php.net/manual/en/function.ctype-print.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in text + * will actually create output (including blanks). Returns FALSE if + * text contains control characters or characters + * that do not have any output or control function at all. + * @jms-builtin + */ +function ctype_print ($text) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check for any printable character which is not whitespace or an +alphanumeric character + * @link http://php.net/manual/en/function.ctype-punct.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in text + * is printable, but neither letter, digit or blank, FALSE otherwise. + * @jms-builtin + */ +function ctype_punct ($text) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check for whitespace character(s) + * @link http://php.net/manual/en/function.ctype-space.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in text + * creates some sort of white space, FALSE otherwise. Besides the + * blank character this also includes tab, vertical tab, line feed, + * carriage return and form feed characters. + * @jms-builtin + */ +function ctype_space ($text) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check for uppercase character(s) + * @link http://php.net/manual/en/function.ctype-upper.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in text is + * an uppercase letter in the current locale. + * @jms-builtin + */ +function ctype_upper ($text) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check for character(s) representing a hexadecimal digit + * @link http://php.net/manual/en/function.ctype-xdigit.php + * @param string $text

+ * The tested string. + *

+ * @return bool TRUE if every character in text is + * a hexadecimal 'digit', that is a decimal digit or a character from + * [A-Fa-f] , FALSE otherwise. + * @jms-builtin + */ +function ctype_xdigit ($text) {} + +// End of ctype v. +?> diff --git a/res/php-5.4-core-api/curl.php b/res/php-5.4-core-api/curl.php new file mode 100644 index 0000000..3154ec4 --- /dev/null +++ b/res/php-5.4-core-api/curl.php @@ -0,0 +1,1706 @@ + + * Initialize a cURL session + * @link http://php.net/manual/en/function.curl-init.php + * @param string $url [optional]

+ * If provided, the CURLOPT_URL option will be set + * to its value. You can manually set this using the + * curl_setopt function. + *

+ *

+ * The file protocol is disabled by cURL if + * open_basedir is set. + *

+ * @return resource a cURL handle on success, FALSE on errors. + * @jms-builtin + */ +function curl_init ($url = null) {} + +/** + * (PHP 5)
+ * Copy a cURL handle along with all of its preferences + * @link http://php.net/manual/en/function.curl-copy-handle.php + * @param resource $ch + * @return resource a new cURL handle. + * @jms-builtin + */ +function curl_copy_handle ($ch) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Gets cURL version information + * @link http://php.net/manual/en/function.curl-version.php + * @param int $age [optional] + * @return array an associative array with the following elements: + * + * Indice + * Value description + * + * + * version_number + * cURL 24 bit version number + * + * + * version + * cURL version number, as a string + * + * + * ssl_version_number + * OpenSSL 24 bit version number + * + * + * ssl_version + * OpenSSL version number, as a string + * + * + * libz_version + * zlib version number, as a string + * + * + * host + * Information about the host where cURL was built + * + * + * age + * + * + * + * features + * A bitmask of the CURL_VERSION_XXX constants + * + * + * protocols + * An array of protocols names supported by cURL + * + * @jms-builtin + */ +function curl_version ($age = 'CURLVERSION_NOW') {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Set an option for a cURL transfer + * @link http://php.net/manual/en/function.curl-setopt.php + * @param resource $ch + * @param int $option

+ * The CURLOPT_XXX option to set. + *

+ * @param mixed $value

+ * The value to be set on option. + *

+ *

+ * value should be a bool for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_AUTOREFERER + * TRUE to automatically set the Referer: field in + * requests where it follows a Location: redirect. + * + * + * + * + * CURLOPT_BINARYTRANSFER + * TRUE to return the raw output when + * CURLOPT_RETURNTRANSFER is used. + * + * + * + * + * CURLOPT_COOKIESESSION + * TRUE to mark this as a new cookie "session". It will force libcurl + * to ignore all cookies it is about to load that are "session cookies" + * from the previous session. By default, libcurl always stores and + * loads all cookies, independent if they are session cookies or not. + * Session cookies are cookies without expiry date and they are meant + * to be alive and existing for this "session" only. + * + * + * + * + * CURLOPT_CERTINFO + * TRUE to output SSL certification information to STDERR + * on secure transfers. + * + * Available since PHP 5.3.2. Requires CURLOPT_VERBOSE to be + * on to have an effect. + * + * + * + * CURLOPT_CRLF + * TRUE to convert Unix newlines to CRLF newlines + * on transfers. + * + * + * + * + * CURLOPT_DNS_USE_GLOBAL_CACHE + * TRUE to use a global DNS cache. This option is + * not thread-safe and is enabled by default. + * + * + * + * + * CURLOPT_FAILONERROR + * TRUE to fail silently if the HTTP code returned + * is greater than or equal to 400. The default behavior is to return + * the page normally, ignoring the code. + * + * + * + * + * CURLOPT_FILETIME + * TRUE to attempt to retrieve the modification + * date of the remote document. This value can be retrieved using + * the CURLINFO_FILETIME option with + * curl_getinfo. + * + * + * + * + * CURLOPT_FOLLOWLOCATION + * TRUE to follow any + * "Location: " header that the server sends as + * part of the HTTP header (note this is recursive, PHP will follow as + * many "Location: " headers that it is sent, + * unless CURLOPT_MAXREDIRS is set). + * + * + * + * + * CURLOPT_FORBID_REUSE + * TRUE to force the connection to explicitly + * close when it has finished processing, and not be pooled for reuse. + * + * + * + * + * CURLOPT_FRESH_CONNECT + * TRUE to force the use of a new connection + * instead of a cached one. + * + * + * + * + * CURLOPT_FTP_USE_EPRT + * TRUE to use EPRT (and LPRT) when doing active + * FTP downloads. Use FALSE to disable EPRT and LPRT and use PORT + * only. + * + * + * + * + * CURLOPT_FTP_USE_EPSV + * TRUE to first try an EPSV command for FTP + * transfers before reverting back to PASV. Set to FALSE + * to disable EPSV. + * + * + * + * + * CURLOPT_FTP_CREATE_MISSING_DIRS + * TRUE to create missing directories when an FTP operation + * encounters a path that currently doesn't exist. + * + * + * + * + * CURLOPT_FTPAPPEND + * TRUE to append to the remote file instead of + * overwriting it. + * + * + * + * + * CURLOPT_FTPASCII + * An alias of + * CURLOPT_TRANSFERTEXT. Use that instead. + * + * + * + * + * CURLOPT_FTPLISTONLY + * TRUE to only list the names of an FTP + * directory. + * + * + * + * + * CURLOPT_HEADER + * TRUE to include the header in the output. + * + * + * + * + * CURLINFO_HEADER_OUT + * TRUE to track the handle's request string. + * + * Available since PHP 5.1.3. The CURLINFO_ + * prefix is intentional. + * + * + * + * CURLOPT_HTTPGET + * TRUE to reset the HTTP request method to GET. + * Since GET is the default, this is only necessary if the request + * method has been changed. + * + * + * + * + * CURLOPT_HTTPPROXYTUNNEL + * TRUE to tunnel through a given HTTP proxy. + * + * + * + * + * CURLOPT_MUTE + * TRUE to be completely silent with regards to + * the cURL functions. + * + * + * + * + * CURLOPT_NETRC + * TRUE to scan the ~/.netrc + * file to find a username and password for the remote site that + * a connection is being established with. + * + * + * + * + * CURLOPT_NOBODY + * TRUE to exclude the body from the output. + * Request method is then set to HEAD. Changing this to FALSE does + * not change it to GET. + * + * + * + * + * CURLOPT_NOPROGRESS + *

+ * TRUE to disable the progress meter for cURL transfers. + *

+ * PHP automatically sets this option to TRUE, this should only be + * changed for debugging purposes. + *

+ *

+ * + * + * + * CURLOPT_NOSIGNAL + * TRUE to ignore any cURL function that causes a + * signal to be sent to the PHP process. This is turned on by default + * in multi-threaded SAPIs so timeout options can still be used. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_POST + * TRUE to do a regular HTTP POST. This POST is the + * normal application/x-www-form-urlencoded kind, + * most commonly used by HTML forms. + * + * + * + * + * CURLOPT_PUT + * TRUE to HTTP PUT a file. The file to PUT must + * be set with CURLOPT_INFILE and + * CURLOPT_INFILESIZE. + * + * + * + * + * CURLOPT_RETURNTRANSFER + * TRUE to return the transfer as a string of the + * return value of curl_exec instead of outputting + * it out directly. + * + * + * + * + * CURLOPT_SSL_VERIFYPEER + * FALSE to stop cURL from verifying the peer's + * certificate. Alternate certificates to verify against can be + * specified with the CURLOPT_CAINFO option + * or a certificate directory can be specified with the + * CURLOPT_CAPATH option. + * + * TRUE by default as of cURL 7.10. Default bundle installed as of + * cURL 7.10. + * + * + * + * CURLOPT_TRANSFERTEXT + * TRUE to use ASCII mode for FTP transfers. + * For LDAP, it retrieves data in plain text instead of HTML. On + * Windows systems, it will not set STDOUT to binary + * mode. + * + * + * + * + * CURLOPT_UNRESTRICTED_AUTH + * TRUE to keep sending the username and password + * when following locations (using + * CURLOPT_FOLLOWLOCATION), even when the + * hostname has changed. + * + * + * + * + * CURLOPT_UPLOAD + * TRUE to prepare for an upload. + * + * + * + * + * CURLOPT_VERBOSE + * TRUE to output verbose information. Writes + * output to STDERR, or the file specified using + * CURLOPT_STDERR. + * + * + * + *

+ *

+ * value should be an integer for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_BUFFERSIZE + * The size of the buffer to use for each read. There is no guarantee + * this request will be fulfilled, however. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_CLOSEPOLICY + * Either + * CURLCLOSEPOLICY_LEAST_RECENTLY_USED or + * CURLCLOSEPOLICY_OLDEST. + * There are three other CURLCLOSEPOLICY_ + * constants, but cURL does not support them yet. + * + * + * + * + * CURLOPT_CONNECTTIMEOUT + * The number of seconds to wait while trying to connect. Use 0 to + * wait indefinitely. + * + * + * + * + * CURLOPT_CONNECTTIMEOUT_MS + * The number of milliseconds to wait while trying to connect. Use 0 to + * wait indefinitely. + * If libcurl is built to use the standard system name resolver, that + * portion of the connect will still use full-second resolution for + * timeouts with a minimum timeout allowed of one second. + * + * Added in cURL 7.16.2. Available since PHP 5.2.3. + * + * + * + * CURLOPT_DNS_CACHE_TIMEOUT + * The number of seconds to keep DNS entries in memory. This + * option is set to 120 (2 minutes) by default. + * + * + * + * + * CURLOPT_FTPSSLAUTH + * The FTP authentication method (when is activated): + * CURLFTPAUTH_SSL (try SSL first), + * CURLFTPAUTH_TLS (try TLS first), or + * CURLFTPAUTH_DEFAULT (let cURL decide). + * + * Added in cURL 7.12.2. + * + * + * + * CURLOPT_HTTP_VERSION + * CURL_HTTP_VERSION_NONE (default, lets CURL + * decide which version to use), + * CURL_HTTP_VERSION_1_0 (forces HTTP/1.0), + * or CURL_HTTP_VERSION_1_1 (forces HTTP/1.1). + * + * + * + * + * CURLOPT_HTTPAUTH + *

+ * The HTTP authentication method(s) to use. The options are: + * CURLAUTH_BASIC, + * CURLAUTH_DIGEST, + * CURLAUTH_GSSNEGOTIATE, + * CURLAUTH_NTLM, + * CURLAUTH_ANY, and + * CURLAUTH_ANYSAFE. + *

+ *

+ * The bitwise | (or) operator can be used to combine + * more than one method. If this is done, cURL will poll the server to see + * what methods it supports and pick the best one. + *

+ *

+ * CURLAUTH_ANY is an alias for + * CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. + *

+ *

+ * CURLAUTH_ANYSAFE is an alias for + * CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. + *

+ * + * + * + * + * CURLOPT_INFILESIZE + * The expected size, in bytes, of the file when uploading a file to + * a remote site. Note that using this option will not stop libcurl + * from sending more data, as exactly what is sent depends on + * CURLOPT_READFUNCTION. + * + * + * + * + * CURLOPT_LOW_SPEED_LIMIT + * The transfer speed, in bytes per second, that the transfer should be + * below during the count of CURLOPT_LOW_SPEED_TIME + * seconds before PHP considers the transfer too slow and aborts. + * + * + * + * + * CURLOPT_LOW_SPEED_TIME + * The number of seconds the transfer speed should be below + * CURLOPT_LOW_SPEED_LIMIT before PHP considers + * the transfer too slow and aborts. + * + * + * + * + * CURLOPT_MAXCONNECTS + * The maximum amount of persistent connections that are allowed. + * When the limit is reached, + * CURLOPT_CLOSEPOLICY is used to determine + * which connection to close. + * + * + * + * + * CURLOPT_MAXREDIRS + * The maximum amount of HTTP redirections to follow. Use this option + * alongside CURLOPT_FOLLOWLOCATION. + * + * + * + * + * CURLOPT_PORT + * An alternative port number to connect to. + * + * + * + * + * CURLOPT_PROTOCOLS + *

+ * Bitmask of CURLPROTO_* values. If used, this bitmask + * limits what protocols libcurl may use in the transfer. This allows you to have + * a libcurl built to support a wide range of protocols but still limit specific + * transfers to only be allowed to use a subset of them. By default libcurl will + * accept all protocols it supports. + * See also CURLOPT_REDIR_PROTOCOLS. + *

+ *

+ * Valid protocol options are: + * CURLPROTO_HTTP, + * CURLPROTO_HTTPS, + * CURLPROTO_FTP, + * CURLPROTO_FTPS, + * CURLPROTO_SCP, + * CURLPROTO_SFTP, + * CURLPROTO_TELNET, + * CURLPROTO_LDAP, + * CURLPROTO_LDAPS, + * CURLPROTO_DICT, + * CURLPROTO_FILE, + * CURLPROTO_TFTP, + * CURLPROTO_ALL + *

+ * + * Added in cURL 7.19.4. + * + * + * + * CURLOPT_PROXYAUTH + * The HTTP authentication method(s) to use for the proxy connection. + * Use the same bitmasks as described in + * CURLOPT_HTTPAUTH. For proxy authentication, + * only CURLAUTH_BASIC and + * CURLAUTH_NTLM are currently supported. + * + * Added in cURL 7.10.7. + * + * + * + * CURLOPT_PROXYPORT + * The port number of the proxy to connect to. This port number can + * also be set in CURLOPT_PROXY. + * + * + * + * + * CURLOPT_PROXYTYPE + * Either CURLPROXY_HTTP (default) or + * CURLPROXY_SOCKS5. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_REDIR_PROTOCOLS + * Bitmask of CURLPROTO_* values. If used, this bitmask + * limits what protocols libcurl may use in a transfer that it follows to in + * a redirect when CURLOPT_FOLLOWLOCATION is enabled. + * This allows you to limit specific transfers to only be allowed to use a subset + * of protocols in redirections. By default libcurl will allow all protocols + * except for FILE and SCP. This is a difference compared to pre-7.19.4 versions + * which unconditionally would follow to all protocols supported. + * See also CURLOPT_PROTOCOLS for protocol constant values. + * + * Added in cURL 7.19.4. + * + * + * + * CURLOPT_RESUME_FROM + * The offset, in bytes, to resume a transfer from. + * + * + * + * + * CURLOPT_SSL_VERIFYHOST + * 1 to check the existence of a common name in the + * SSL peer certificate. 2 to check the existence of + * a common name and also verify that it matches the hostname + * provided. In production environments the value of this option + * should be kept at 2 (default value). + * + * + * + * + * CURLOPT_SSLVERSION + * The SSL version (2 or 3) to use. By default PHP will try to determine + * this itself, although in some cases this must be set manually. + * + * + * + * + * CURLOPT_TIMECONDITION + * How CURLOPT_TIMEVALUE is treated. + * Use CURL_TIMECOND_IFMODSINCE to return the + * page only if it has been modified since the time specified in + * CURLOPT_TIMEVALUE. If it hasn't been modified, + * a "304 Not Modified" header will be returned + * assuming CURLOPT_HEADER is TRUE. + * Use CURL_TIMECOND_IFUNMODSINCE for the reverse + * effect. CURL_TIMECOND_IFMODSINCE is the + * default. + * + * + * + * + * CURLOPT_TIMEOUT + * The maximum number of seconds to allow cURL functions to execute. + * + * + * + * + * CURLOPT_TIMEOUT_MS + * The maximum number of milliseconds to allow cURL functions to + * execute. + * If libcurl is built to use the standard system name resolver, that + * portion of the connect will still use full-second resolution for + * timeouts with a minimum timeout allowed of one second. + * + * Added in cURL 7.16.2. Available since PHP 5.2.3. + * + * + * + * CURLOPT_TIMEVALUE + * The time in seconds since January 1st, 1970. The time will be used + * by CURLOPT_TIMECONDITION. By default, + * CURL_TIMECOND_IFMODSINCE is used. + * + * + * + * + * CURLOPT_MAX_RECV_SPEED_LARGE + * If a download exceeds this speed (counted in bytes per second) on + * cumulative average during the transfer, the transfer will pause to + * keep the average rate less than or equal to the parameter value. + * Defaults to unlimited speed. + * + * Added in cURL 7.15.5. Available since PHP 5.4.0. + * + * + * + * CURLOPT_MAX_SEND_SPEED_LARGE + * If an upload exceeds this speed (counted in bytes per second) on + * cumulative average during the transfer, the transfer will pause to + * keep the average rate less than or equal to the parameter value. + * Defaults to unlimited speed. + * + * Added in cURL 7.15.5. Available since PHP 5.4.0. + * + * + * + * CURLOPT_SSH_AUTH_TYPES + * A bitmask consisting of one or more of + * CURLSSH_AUTH_PUBLICKEY, + * CURLSSH_AUTH_PASSWORD, + * CURLSSH_AUTH_HOST, + * CURLSSH_AUTH_KEYBOARD. Set to + * CURLSSH_AUTH_ANY to let libcurl pick one. + * + * Added in cURL 7.16.1. + * + * + *

+ *

+ * value should be a string for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_CAINFO + * The name of a file holding one or more certificates to verify the + * peer with. This only makes sense when used in combination with + * CURLOPT_SSL_VERIFYPEER. + * + * Requires absolute path. + * + * + * + * CURLOPT_CAPATH + * A directory that holds multiple CA certificates. Use this option + * alongside CURLOPT_SSL_VERIFYPEER. + * + * + * + * + * CURLOPT_COOKIE + * The contents of the "Cookie: " header to be + * used in the HTTP request. + * Note that multiple cookies are separated with a semicolon followed + * by a space (e.g., "fruit=apple; colour=red") + * + * + * + * + * CURLOPT_COOKIEFILE + * The name of the file containing the cookie data. The cookie file can + * be in Netscape format, or just plain HTTP-style headers dumped into + * a file. + * If the name is an empty string, no cookies are loaded, but cookie + * handling is still enabled. + * + * + * + * + * CURLOPT_COOKIEJAR + * The name of a file to save all internal cookies to when the handle is closed, + * e.g. after a call to curl_close. + * + * + * + * + * CURLOPT_CUSTOMREQUEST + *

+ * A custom request method to use instead of + * "GET" or "HEAD" when doing + * a HTTP request. This is useful for doing + * "DELETE" or other, more obscure HTTP requests. + * Valid values are things like "GET", + * "POST", "CONNECT" and so on; + * i.e. Do not enter a whole HTTP request line here. For instance, + * entering "GET /index.html HTTP/1.0\r\n\r\n" + * would be incorrect. + *

+ * Don't do this without making sure the server supports the custom + * request method first. + *

+ *

+ * + * + * + * CURLOPT_EGDSOCKET + * Like CURLOPT_RANDOM_FILE, except a filename + * to an Entropy Gathering Daemon socket. + * + * + * + * + * CURLOPT_ENCODING + * The contents of the "Accept-Encoding: " header. + * This enables decoding of the response. Supported encodings are + * "identity", "deflate", and + * "gzip". If an empty string, "", + * is set, a header containing all supported encoding types is sent. + * + * Added in cURL 7.10. + * + * + * + * CURLOPT_FTPPORT + * The value which will be used to get the IP address to use + * for the FTP "POST" instruction. The "POST" instruction tells + * the remote server to connect to our specified IP address. The + * string may be a plain IP address, a hostname, a network + * interface name (under Unix), or just a plain '-' to use the + * systems default IP address. + * + * + * + * + * CURLOPT_INTERFACE + * The name of the outgoing network interface to use. This can be an + * interface name, an IP address or a host name. + * + * + * + * + * CURLOPT_KEYPASSWD + * The password required to use the CURLOPT_SSLKEY + * or CURLOPT_SSH_PRIVATE_KEYFILE private key. + * + * Added in cURL 7.16.1. + * + * + * + * CURLOPT_KRB4LEVEL + * The KRB4 (Kerberos 4) security level. Any of the following values + * (in order from least to most powerful) are valid: + * "clear", + * "safe", + * "confidential", + * "private".. + * If the string does not match one of these, + * "private" is used. Setting this option to NULL + * will disable KRB4 security. Currently KRB4 security only works + * with FTP transactions. + * + * + * + * + * CURLOPT_POSTFIELDS + * The full data to post in a HTTP "POST" operation. + * To post a file, prepend a filename with @ and + * use the full path. The filetype can be explicitly specified by + * following the filename with the type in the format + * ';type=mimetype'. This parameter can either be + * passed as a urlencoded string like 'para1=val1&#38;para2=val2&#38;...' + * or as an array with the field name as key and field data as value. + * If value is an array, the + * Content-Type header will be set to + * multipart/form-data. + * As of PHP 5.2.0, value must be an array if + * files are passed to this option with the @ prefix. + * + * + * + * + * CURLOPT_PROXY + * The HTTP proxy to tunnel requests through. + * + * + * + * + * CURLOPT_PROXYUSERPWD + * A username and password formatted as + * "[username]:[password]" to use for the + * connection to the proxy. + * + * + * + * + * CURLOPT_RANDOM_FILE + * A filename to be used to seed the random number generator for SSL. + * + * + * + * + * CURLOPT_RANGE + * Range(s) of data to retrieve in the format + * "X-Y" where X or Y are optional. HTTP transfers + * also support several intervals, separated with commas in the format + * "X-Y,N-M". + * + * + * + * + * CURLOPT_REFERER + * The contents of the "Referer: " header to be used + * in a HTTP request. + * + * + * + * + * CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 + * A string containing 32 hexadecimal digits. The string should be the + * MD5 checksum of the remote host's public key, and libcurl will reject + * the connection to the host unless the md5sums match. + * This option is only for SCP and SFTP transfers. + * + * Added in cURL 7.17.1. + * + * + * + * CURLOPT_SSH_PUBLIC_KEYFILE + * The file name for your public key. If not used, libcurl defaults to + * $HOME/.ssh/id_dsa.pub if the HOME environment variable is set, + * and just "id_dsa.pub" in the current directory if HOME is not set. + * + * Added in cURL 7.16.1. + * + * + * + * CURLOPT_SSH_PRIVATE_KEYFILE + * The file name for your private key. If not used, libcurl defaults to + * $HOME/.ssh/id_dsa if the HOME environment variable is set, + * and just "id_dsa" in the current directory if HOME is not set. + * If the file is password-protected, set the password with + * CURLOPT_KEYPASSWD. + * + * Added in cURL 7.16.1. + * + * + * + * CURLOPT_SSL_CIPHER_LIST + * A list of ciphers to use for SSL. For example, + * RC4-SHA and TLSv1 are valid + * cipher lists. + * + * + * + * + * CURLOPT_SSLCERT + * The name of a file containing a PEM formatted certificate. + * + * + * + * + * CURLOPT_SSLCERTPASSWD + * The password required to use the + * CURLOPT_SSLCERT certificate. + * + * + * + * + * CURLOPT_SSLCERTTYPE + * The format of the certificate. Supported formats are + * "PEM" (default), "DER", + * and "ENG". + * + * Added in cURL 7.9.3. + * + * + * + * CURLOPT_SSLENGINE + * The identifier for the crypto engine of the private SSL key + * specified in CURLOPT_SSLKEY. + * + * + * + * + * CURLOPT_SSLENGINE_DEFAULT + * The identifier for the crypto engine used for asymmetric crypto + * operations. + * + * + * + * + * CURLOPT_SSLKEY + * The name of a file containing a private SSL key. + * + * + * + * + * CURLOPT_SSLKEYPASSWD + *

+ * The secret password needed to use the private SSL key specified in + * CURLOPT_SSLKEY. + *

+ * Since this option contains a sensitive password, remember to keep + * the PHP script it is contained within safe. + *

+ *

+ * + * + * + * CURLOPT_SSLKEYTYPE + * The key type of the private SSL key specified in + * CURLOPT_SSLKEY. Supported key types are + * "PEM" (default), "DER", + * and "ENG". + * + * + * + * + * CURLOPT_URL + * The URL to fetch. This can also be set when initializing a + * session with curl_init. + * + * + * + * + * CURLOPT_USERAGENT + * The contents of the "User-Agent: " header to be + * used in a HTTP request. + * + * + * + * + * CURLOPT_USERPWD + * A username and password formatted as + * "[username]:[password]" to use for the + * connection. + * + * + * + *

+ *

+ * value should be an array for the + * following values of the option parameter: + * + * Option + * Set value to + * Notes + * + * + * CURLOPT_HTTP200ALIASES + * An array of HTTP 200 responses that will be treated as valid + * responses and not as errors. + * + * Added in cURL 7.10.3. + * + * + * + * CURLOPT_HTTPHEADER + * An array of HTTP header fields to set, in the format + * array('Content-type: text/plain', 'Content-length: 100') + * + * + * + * + * CURLOPT_POSTQUOTE + * An array of FTP commands to execute on the server after the FTP + * request has been performed. + * + * + * + * + * CURLOPT_QUOTE + * An array of FTP commands to execute on the server prior to the FTP + * request. + * + * + * + *

+ *

+ * value should be a stream resource (using + * fopen, for example) for the following values of the + * option parameter: + * + * Option + * Set value to + * + * + * CURLOPT_FILE + * The file that the transfer should be written to. The default + * is STDOUT (the browser window). + * + * + * + * CURLOPT_INFILE + * The file that the transfer should be read from when uploading. + * + * + * + * CURLOPT_STDERR + * An alternative location to output errors to instead of + * STDERR. + * + * + * + * CURLOPT_WRITEHEADER + * The file that the header part of the transfer is written to. + * + * + *

+ *

+ * value should be a string that is the name of a valid + * callback function for the following values of the + * option parameter: + * + * Option + * Set value to + * + * + * CURLOPT_HEADERFUNCTION + * The name of a callback function where the callback function takes + * two parameters. The first is the cURL resource, the second is a + * string with the header data to be written. The header data must + * be written when using this callback function. Return the number of + * bytes written. + * + * + * + * CURLOPT_PASSWDFUNCTION + * The name of a callback function where the callback function takes + * three parameters. The first is the cURL resource, the second is a + * string containing a password prompt, and the third is the maximum + * password length. Return the string containing the password. + * + * + * + * CURLOPT_PROGRESSFUNCTION + * The name of a callback function where the callback function takes + * three parameters. The first is the cURL resource, the second is a + * file-descriptor resource, and the third is length. Return the + * string containing the data. + * + * + * + * CURLOPT_READFUNCTION + * The name of a callback function where the callback function takes + * three parameters. The first is the cURL resource, the second is a + * stream resource provided to cURL through the option + * CURLOPT_INFILE, and the third is the maximum + * amount of data to be read. The callback function must return a string + * with a length equal or smaller than the amount of data requested, + * typically by reading it from the passed stream resource. It should + * return an empty string to signal EOF. + * + * + * + * CURLOPT_WRITEFUNCTION + * The name of a callback function where the callback function takes + * two parameters. The first is the cURL resource, and the second is a + * string with the data to be written. The data must be saved by using + * this callback function. It must return the exact number of bytes written + * or the transfer will be aborted with an error. + * + * + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function curl_setopt ($ch, $option, $value) {} + +/** + * (PHP 5 >= 5.1.3)
+ * Set multiple options for a cURL transfer + * @link http://php.net/manual/en/function.curl-setopt-array.php + * @param resource $ch + * @param array $options

+ * An array specifying which options to set and their values. + * The keys should be valid curl_setopt constants or + * their integer equivalents. + *

+ * @return bool TRUE if all options were successfully set. If an option could + * not be successfully set, FALSE is immediately returned, ignoring any + * future options in the options array. + * @jms-builtin + */ +function curl_setopt_array ($ch, array $options) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Perform a cURL session + * @link http://php.net/manual/en/function.curl-exec.php + * @param resource $ch + * @return mixed TRUE on success or FALSE on failure. However, if the CURLOPT_RETURNTRANSFER + * option is set, it will return + * the result on success, FALSE on failure. + * @jms-builtin + */ +function curl_exec ($ch) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Get information regarding a specific transfer + * @link http://php.net/manual/en/function.curl-getinfo.php + * @param resource $ch + * @param int $opt [optional]

+ * This may be one of the following constants: + * CURLINFO_EFFECTIVE_URL - Last effective URL + * @return mixed If opt is given, returns its value as a string. + * Otherwise, returns an associative array with the following elements + * (which correspond to opt), or FALSE on failure: + * "url" + * "content_type" + * "http_code" + * "header_size" + * "request_size" + * "filetime" + * "ssl_verify_result" + * "redirect_count" + * "total_time" + * "namelookup_time" + * "connect_time" + * "pretransfer_time" + * "size_upload" + * "size_download" + * "speed_download" + * "speed_upload" + * "download_content_length" + * "upload_content_length" + * "starttransfer_time" + * "redirect_time" + * "certinfo" + * "request_header" (This is only set if the CURLINFO_HEADER_OUT + * is set by a previous call to curl_setopt) + * @jms-builtin + */ +function curl_getinfo ($ch, $opt = 0) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Return a string containing the last error for the current session + * @link http://php.net/manual/en/function.curl-error.php + * @param resource $ch + * @return string the error message or '' (the empty string) if no + * error occurred. + * @jms-builtin + */ +function curl_error ($ch) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Return the last error number + * @link http://php.net/manual/en/function.curl-errno.php + * @param resource $ch + * @return int the error number or 0 (zero) if no error + * occurred. + * @jms-builtin + */ +function curl_errno ($ch) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Close a cURL session + * @link http://php.net/manual/en/function.curl-close.php + * @param resource $ch + * @return void No value is returned. + * @jms-builtin + */ +function curl_close ($ch) {} + +/** + * (PHP 5)
+ * Returns a new cURL multi handle + * @link http://php.net/manual/en/function.curl-multi-init.php + * @return resource a cURL multi handle resource on success, FALSE on failure. + * @jms-builtin + */ +function curl_multi_init () {} + +/** + * (PHP 5)
+ * Add a normal cURL handle to a cURL multi handle + * @link http://php.net/manual/en/function.curl-multi-add-handle.php + * @param resource $mh + * @param resource $ch + * @return int 0 on success, or one of the CURLM_XXX errors + * code. + * @jms-builtin + */ +function curl_multi_add_handle ($mh, $ch) {} + +/** + * (PHP 5)
+ * Remove a multi handle from a set of cURL handles + * @link http://php.net/manual/en/function.curl-multi-remove-handle.php + * @param resource $mh + * @param resource $ch + * @return int 0 on success, or one of the CURLM_XXX error + * codes. + * @jms-builtin + */ +function curl_multi_remove_handle ($mh, $ch) {} + +/** + * (PHP 5)
+ * Wait for activity on any curl_multi connection + * @link http://php.net/manual/en/function.curl-multi-select.php + * @param resource $mh + * @param float $timeout [optional]

+ * Time, in seconds, to wait for a response. + *

+ * @return int On success, returns the number of descriptors contained in + * the descriptor sets. On failure, this function will return -1 on a select failure or timeout (from the underlying select system call). + * @jms-builtin + */ +function curl_multi_select ($mh, $timeout = 1.0) {} + +/** + * (PHP 5)
+ * Run the sub-connections of the current cURL handle + * @link http://php.net/manual/en/function.curl-multi-exec.php + * @param resource $mh + * @param int $still_running

+ * A reference to a flag to tell whether the operations are still running. + *

+ * @return int A cURL code defined in the cURL Predefined Constants. + *

+ *

+ * This only returns errors regarding the whole multi stack. There might still have + * occurred problems on individual transfers even when this function returns + * CURLM_OK. + * @jms-builtin + */ +function curl_multi_exec ($mh, &$still_running) {} + +/** + * (PHP 5)
+ * Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set + * @link http://php.net/manual/en/function.curl-multi-getcontent.php + * @param resource $ch + * @return string Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set. + * @jms-builtin + */ +function curl_multi_getcontent ($ch) {} + +/** + * (PHP 5)
+ * Get information about the current transfers + * @link http://php.net/manual/en/function.curl-multi-info-read.php + * @param resource $mh + * @param int $msgs_in_queue [optional]

+ * Number of messages that are still in the queue + *

+ * @return array On success, returns an associative array for the message, FALSE on failure. + *

+ *

+ * + * Contents of the returned array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Key:Value:
msgThe CURLMSG_DONE constant. Other return values + * are currently not available.
resultOne of the CURLE_* constants. If everything is + * OK, the CURLE_OK will be the result.
handleResource of type curl indicates the handle which it concerns.
+ * @jms-builtin + */ +function curl_multi_info_read ($mh, &$msgs_in_queue = null) {} + +/** + * (PHP 5)
+ * Close a set of cURL handles + * @link http://php.net/manual/en/function.curl-multi-close.php + * @param resource $mh + * @return void No value is returned. + * @jms-builtin + */ +function curl_multi_close ($mh) {} + +define ('CURLOPT_IPRESOLVE', 113); +define ('CURL_IPRESOLVE_WHATEVER', 0); +define ('CURL_IPRESOLVE_V4', 1); +define ('CURL_IPRESOLVE_V6', 2); +define ('CURLOPT_DNS_USE_GLOBAL_CACHE', 91); +define ('CURLOPT_DNS_CACHE_TIMEOUT', 92); +define ('CURLOPT_PORT', 3); +define ('CURLOPT_FILE', 10001); +define ('CURLOPT_READDATA', 10009); +define ('CURLOPT_INFILE', 10009); +define ('CURLOPT_INFILESIZE', 14); +define ('CURLOPT_URL', 10002); +define ('CURLOPT_PROXY', 10004); +define ('CURLOPT_VERBOSE', 41); +define ('CURLOPT_HEADER', 42); +define ('CURLOPT_HTTPHEADER', 10023); +define ('CURLOPT_NOPROGRESS', 43); + +/** + * Available since PHP 5.3.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_PROGRESSFUNCTION', 20056); +define ('CURLOPT_NOBODY', 44); +define ('CURLOPT_FAILONERROR', 45); +define ('CURLOPT_UPLOAD', 46); +define ('CURLOPT_POST', 47); +define ('CURLOPT_FTPLISTONLY', 48); +define ('CURLOPT_FTPAPPEND', 50); +define ('CURLOPT_NETRC', 51); + +/** + * This constant is not available when open_basedir + * or safe_mode are enabled. + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_FOLLOWLOCATION', 52); +define ('CURLOPT_PUT', 54); +define ('CURLOPT_USERPWD', 10005); +define ('CURLOPT_PROXYUSERPWD', 10006); +define ('CURLOPT_RANGE', 10007); +define ('CURLOPT_TIMEOUT', 13); +define ('CURLOPT_TIMEOUT_MS', 155); +define ('CURLOPT_POSTFIELDS', 10015); +define ('CURLOPT_REFERER', 10016); +define ('CURLOPT_USERAGENT', 10018); +define ('CURLOPT_FTPPORT', 10017); +define ('CURLOPT_FTP_USE_EPSV', 85); +define ('CURLOPT_LOW_SPEED_LIMIT', 19); +define ('CURLOPT_LOW_SPEED_TIME', 20); +define ('CURLOPT_RESUME_FROM', 21); +define ('CURLOPT_COOKIE', 10022); + +/** + * Available since PHP 5.1.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_COOKIESESSION', 96); + +/** + * Available since PHP 5.1.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_AUTOREFERER', 58); +define ('CURLOPT_SSLCERT', 10025); +define ('CURLOPT_SSLCERTPASSWD', 10026); +define ('CURLOPT_WRITEHEADER', 10029); +define ('CURLOPT_SSL_VERIFYHOST', 81); +define ('CURLOPT_COOKIEFILE', 10031); +define ('CURLOPT_SSLVERSION', 32); +define ('CURLOPT_TIMECONDITION', 33); +define ('CURLOPT_TIMEVALUE', 34); +define ('CURLOPT_CUSTOMREQUEST', 10036); +define ('CURLOPT_STDERR', 10037); +define ('CURLOPT_TRANSFERTEXT', 53); +define ('CURLOPT_RETURNTRANSFER', 19913); +define ('CURLOPT_QUOTE', 10028); +define ('CURLOPT_POSTQUOTE', 10039); +define ('CURLOPT_INTERFACE', 10062); +define ('CURLOPT_KRB4LEVEL', 10063); +define ('CURLOPT_HTTPPROXYTUNNEL', 61); +define ('CURLOPT_FILETIME', 69); +define ('CURLOPT_WRITEFUNCTION', 20011); +define ('CURLOPT_READFUNCTION', 20012); +define ('CURLOPT_HEADERFUNCTION', 20079); +define ('CURLOPT_MAXREDIRS', 68); +define ('CURLOPT_MAXCONNECTS', 71); +define ('CURLOPT_CLOSEPOLICY', 72); +define ('CURLOPT_FRESH_CONNECT', 74); +define ('CURLOPT_FORBID_REUSE', 75); +define ('CURLOPT_RANDOM_FILE', 10076); +define ('CURLOPT_EGDSOCKET', 10077); +define ('CURLOPT_CONNECTTIMEOUT', 78); +define ('CURLOPT_CONNECTTIMEOUT_MS', 156); +define ('CURLOPT_SSL_VERIFYPEER', 64); +define ('CURLOPT_CAINFO', 10065); +define ('CURLOPT_CAPATH', 10097); +define ('CURLOPT_COOKIEJAR', 10082); +define ('CURLOPT_SSL_CIPHER_LIST', 10083); +define ('CURLOPT_BINARYTRANSFER', 19914); +define ('CURLOPT_NOSIGNAL', 99); +define ('CURLOPT_PROXYTYPE', 101); +define ('CURLOPT_BUFFERSIZE', 98); +define ('CURLOPT_HTTPGET', 80); +define ('CURLOPT_HTTP_VERSION', 84); +define ('CURLOPT_SSLKEY', 10087); +define ('CURLOPT_SSLKEYTYPE', 10088); +define ('CURLOPT_SSLKEYPASSWD', 10026); +define ('CURLOPT_SSLENGINE', 10089); +define ('CURLOPT_SSLENGINE_DEFAULT', 90); +define ('CURLOPT_SSLCERTTYPE', 10086); +define ('CURLOPT_CRLF', 27); +define ('CURLOPT_ENCODING', 10102); +define ('CURLOPT_PROXYPORT', 59); +define ('CURLOPT_UNRESTRICTED_AUTH', 105); +define ('CURLOPT_FTP_USE_EPRT', 106); + +/** + * Available since PHP 5.2.1 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_TCP_NODELAY', 121); +define ('CURLOPT_HTTP200ALIASES', 10104); +define ('CURL_TIMECOND_IFMODSINCE', 1); +define ('CURL_TIMECOND_IFUNMODSINCE', 2); +define ('CURL_TIMECOND_LASTMOD', 3); + +/** + * Available since PHP 5.4.0 and cURL 7.15.5 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_MAX_RECV_SPEED_LARGE', 30146); + +/** + * Available since PHP 5.4.0 and cURL 7.15.5 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_MAX_SEND_SPEED_LARGE', 30145); +define ('CURLOPT_HTTPAUTH', 107); +define ('CURLAUTH_BASIC', 1); +define ('CURLAUTH_DIGEST', 2); +define ('CURLAUTH_GSSNEGOTIATE', 4); +define ('CURLAUTH_NTLM', 8); +define ('CURLAUTH_ANY', -17); +define ('CURLAUTH_ANYSAFE', -18); +define ('CURLOPT_PROXYAUTH', 111); +define ('CURLOPT_FTP_CREATE_MISSING_DIRS', 110); + +/** + * Available since PHP 5.2.4 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_PRIVATE', 10103); +define ('CURLCLOSEPOLICY_LEAST_RECENTLY_USED', 2); +define ('CURLCLOSEPOLICY_LEAST_TRAFFIC', 3); +define ('CURLCLOSEPOLICY_SLOWEST', 4); +define ('CURLCLOSEPOLICY_CALLBACK', 5); +define ('CURLCLOSEPOLICY_OLDEST', 1); +define ('CURLINFO_EFFECTIVE_URL', 1048577); +define ('CURLINFO_HTTP_CODE', 2097154); +define ('CURLINFO_HEADER_SIZE', 2097163); +define ('CURLINFO_REQUEST_SIZE', 2097164); +define ('CURLINFO_TOTAL_TIME', 3145731); +define ('CURLINFO_NAMELOOKUP_TIME', 3145732); +define ('CURLINFO_CONNECT_TIME', 3145733); +define ('CURLINFO_PRETRANSFER_TIME', 3145734); +define ('CURLINFO_SIZE_UPLOAD', 3145735); +define ('CURLINFO_SIZE_DOWNLOAD', 3145736); +define ('CURLINFO_SPEED_DOWNLOAD', 3145737); +define ('CURLINFO_SPEED_UPLOAD', 3145738); +define ('CURLINFO_FILETIME', 2097166); +define ('CURLINFO_SSL_VERIFYRESULT', 2097165); +define ('CURLINFO_CONTENT_LENGTH_DOWNLOAD', 3145743); +define ('CURLINFO_CONTENT_LENGTH_UPLOAD', 3145744); +define ('CURLINFO_STARTTRANSFER_TIME', 3145745); +define ('CURLINFO_CONTENT_TYPE', 1048594); +define ('CURLINFO_REDIRECT_TIME', 3145747); +define ('CURLINFO_REDIRECT_COUNT', 2097172); + +/** + * Available since PHP 5.1.3 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLINFO_HEADER_OUT', 2); + +/** + * Available since PHP 5.2.4 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLINFO_PRIVATE', 1048597); +define ('CURLINFO_CERTINFO', 4194338); +define ('CURLINFO_REDIRECT_URL', 1048607); +define ('CURL_VERSION_IPV6', 1); +define ('CURL_VERSION_KERBEROS4', 2); +define ('CURL_VERSION_SSL', 4); +define ('CURL_VERSION_LIBZ', 8); +define ('CURLVERSION_NOW', 3); +define ('CURLE_OK', 0); +define ('CURLE_UNSUPPORTED_PROTOCOL', 1); +define ('CURLE_FAILED_INIT', 2); +define ('CURLE_URL_MALFORMAT', 3); +define ('CURLE_URL_MALFORMAT_USER', 4); +define ('CURLE_COULDNT_RESOLVE_PROXY', 5); +define ('CURLE_COULDNT_RESOLVE_HOST', 6); +define ('CURLE_COULDNT_CONNECT', 7); +define ('CURLE_FTP_WEIRD_SERVER_REPLY', 8); +define ('CURLE_FTP_ACCESS_DENIED', 9); +define ('CURLE_FTP_USER_PASSWORD_INCORRECT', 10); +define ('CURLE_FTP_WEIRD_PASS_REPLY', 11); +define ('CURLE_FTP_WEIRD_USER_REPLY', 12); +define ('CURLE_FTP_WEIRD_PASV_REPLY', 13); +define ('CURLE_FTP_WEIRD_227_FORMAT', 14); +define ('CURLE_FTP_CANT_GET_HOST', 15); +define ('CURLE_FTP_CANT_RECONNECT', 16); +define ('CURLE_FTP_COULDNT_SET_BINARY', 17); +define ('CURLE_PARTIAL_FILE', 18); +define ('CURLE_FTP_COULDNT_RETR_FILE', 19); +define ('CURLE_FTP_WRITE_ERROR', 20); +define ('CURLE_FTP_QUOTE_ERROR', 21); +define ('CURLE_HTTP_NOT_FOUND', 22); +define ('CURLE_WRITE_ERROR', 23); +define ('CURLE_MALFORMAT_USER', 24); +define ('CURLE_FTP_COULDNT_STOR_FILE', 25); +define ('CURLE_READ_ERROR', 26); +define ('CURLE_OUT_OF_MEMORY', 27); +define ('CURLE_OPERATION_TIMEOUTED', 28); +define ('CURLE_FTP_COULDNT_SET_ASCII', 29); +define ('CURLE_FTP_PORT_FAILED', 30); +define ('CURLE_FTP_COULDNT_USE_REST', 31); +define ('CURLE_FTP_COULDNT_GET_SIZE', 32); +define ('CURLE_HTTP_RANGE_ERROR', 33); +define ('CURLE_HTTP_POST_ERROR', 34); +define ('CURLE_SSL_CONNECT_ERROR', 35); +define ('CURLE_FTP_BAD_DOWNLOAD_RESUME', 36); +define ('CURLE_FILE_COULDNT_READ_FILE', 37); +define ('CURLE_LDAP_CANNOT_BIND', 38); +define ('CURLE_LDAP_SEARCH_FAILED', 39); +define ('CURLE_LIBRARY_NOT_FOUND', 40); +define ('CURLE_FUNCTION_NOT_FOUND', 41); +define ('CURLE_ABORTED_BY_CALLBACK', 42); +define ('CURLE_BAD_FUNCTION_ARGUMENT', 43); +define ('CURLE_BAD_CALLING_ORDER', 44); +define ('CURLE_HTTP_PORT_FAILED', 45); +define ('CURLE_BAD_PASSWORD_ENTERED', 46); +define ('CURLE_TOO_MANY_REDIRECTS', 47); +define ('CURLE_UNKNOWN_TELNET_OPTION', 48); +define ('CURLE_TELNET_OPTION_SYNTAX', 49); +define ('CURLE_OBSOLETE', 50); +define ('CURLE_SSL_PEER_CERTIFICATE', 51); +define ('CURLE_GOT_NOTHING', 52); +define ('CURLE_SSL_ENGINE_NOTFOUND', 53); +define ('CURLE_SSL_ENGINE_SETFAILED', 54); +define ('CURLE_SEND_ERROR', 55); +define ('CURLE_RECV_ERROR', 56); +define ('CURLE_SHARE_IN_USE', 57); +define ('CURLE_SSL_CERTPROBLEM', 58); +define ('CURLE_SSL_CIPHER', 59); +define ('CURLE_SSL_CACERT', 60); +define ('CURLE_BAD_CONTENT_ENCODING', 61); +define ('CURLE_LDAP_INVALID_URL', 62); +define ('CURLE_FILESIZE_EXCEEDED', 63); +define ('CURLE_FTP_SSL_FAILED', 64); +define ('CURLPROXY_HTTP', 0); +define ('CURLPROXY_SOCKS4', 4); +define ('CURLPROXY_SOCKS5', 5); +define ('CURL_NETRC_OPTIONAL', 1); +define ('CURL_NETRC_IGNORED', 0); +define ('CURL_NETRC_REQUIRED', 2); +define ('CURL_HTTP_VERSION_NONE', 0); +define ('CURL_HTTP_VERSION_1_0', 1); +define ('CURL_HTTP_VERSION_1_1', 2); +define ('CURLM_CALL_MULTI_PERFORM', -1); +define ('CURLM_OK', 0); +define ('CURLM_BAD_HANDLE', 1); +define ('CURLM_BAD_EASY_HANDLE', 2); +define ('CURLM_OUT_OF_MEMORY', 3); +define ('CURLM_INTERNAL_ERROR', 4); +define ('CURLMSG_DONE', 1); + +/** + * Available since PHP 5.1.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_FTPSSLAUTH', 129); + +/** + * Available since PHP 5.1.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLFTPAUTH_DEFAULT', 0); + +/** + * Available since PHP 5.1.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLFTPAUTH_SSL', 1); + +/** + * Available since PHP 5.1.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLFTPAUTH_TLS', 2); + +/** + * Available since PHP 5.2.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLOPT_FTP_SSL', 119); + +/** + * Available since PHP 5.2.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_NONE', 0); + +/** + * Available since PHP 5.2.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_TRY', 1); + +/** + * Available since PHP 5.2.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_CONTROL', 2); + +/** + * Available since PHP 5.2.0 + * @link http://php.net/manual/en/curl.constants.php + */ +define ('CURLFTPSSL_ALL', 3); +define ('CURLOPT_CERTINFO', 172); +define ('CURLOPT_POSTREDIR', 161); +define ('CURLSSH_AUTH_NONE', 0); +define ('CURLSSH_AUTH_PUBLICKEY', 1); +define ('CURLSSH_AUTH_PASSWORD', 2); +define ('CURLSSH_AUTH_HOST', 4); +define ('CURLSSH_AUTH_KEYBOARD', 8); +define ('CURLSSH_AUTH_DEFAULT', -1); +define ('CURLOPT_SSH_AUTH_TYPES', 151); +define ('CURLOPT_KEYPASSWD', 10026); +define ('CURLOPT_SSH_PUBLIC_KEYFILE', 10152); +define ('CURLOPT_SSH_PRIVATE_KEYFILE', 10153); +define ('CURLOPT_SSH_HOST_PUBLIC_KEY_MD5', 10162); +define ('CURLE_SSH', 79); +define ('CURLOPT_REDIR_PROTOCOLS', 182); +define ('CURLOPT_PROTOCOLS', 181); +define ('CURLPROTO_HTTP', 1); +define ('CURLPROTO_HTTPS', 2); +define ('CURLPROTO_FTP', 4); +define ('CURLPROTO_FTPS', 8); +define ('CURLPROTO_SCP', 16); +define ('CURLPROTO_SFTP', 32); +define ('CURLPROTO_TELNET', 64); +define ('CURLPROTO_LDAP', 128); +define ('CURLPROTO_LDAPS', 256); +define ('CURLPROTO_DICT', 512); +define ('CURLPROTO_FILE', 1024); +define ('CURLPROTO_TFTP', 2048); +define ('CURLPROTO_ALL', -1); +define ('CURLOPT_FTP_FILEMETHOD', 138); +define ('CURLOPT_FTP_SKIP_PASV_IP', 137); +define ('CURLFTPMETHOD_MULTICWD', 1); +define ('CURLFTPMETHOD_NOCWD', 2); +define ('CURLFTPMETHOD_SINGLECWD', 3); + +// End of curl v. +?> diff --git a/res/php-5.4-core-api/date.php b/res/php-5.4-core-api/date.php new file mode 100644 index 0000000..7be51ad --- /dev/null +++ b/res/php-5.4-core-api/date.php @@ -0,0 +1,1641 @@ + + * Parse about any English textual datetime description into a Unix timestamp + * @link http://php.net/manual/en/function.strtotime.php + * @param string $time

A date/time string. Valid formats are explained in Date and Time Formats.

+ * @param int $now [optional]

+ * The timestamp which is used as a base for the calculation of relative + * dates. + *

+ * @return int a timestamp on success, FALSE otherwise. Previous to PHP 5.1.0, + * this function would return -1 on failure. + * @jms-builtin + */ +function strtotime ($time, $now = 'time()') {} + +/** + * (PHP 4, PHP 5)
+ * Format a local time/date + * @link http://php.net/manual/en/function.date.php + * @param string $format

+ * The format of the outputted date string. See the formatting + * options below. There are also several + * predefined date constants + * that may be used instead, so for example DATE_RSS + * contains the format string 'D, d M Y H:i:s'. + *

+ *

+ * + * The following characters are recognized in the + * format parameter string + * + * + * + * + * + * + * Day + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Week + * + * + * + * + * + * + * + * + * + * Month + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Year + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Time + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Timezone + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Full Date/Time + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
format characterDescriptionExample returned values
------
dDay of the month, 2 digits with leading zeros01 to 31
DA textual representation of a day, three lettersMon through Sun
jDay of the month without leading zeros1 to 31
l (lowercase 'L')A full textual representation of the day of the weekSunday through Saturday
NISO-8601 numeric representation of the day of the week (added in + * PHP 5.1.0)1 (for Monday) through 7 (for Sunday)
SEnglish ordinal suffix for the day of the month, 2 characters + * st, nd, rd or + * th. Works well with j + *
wNumeric representation of the day of the week0 (for Sunday) through 6 (for Saturday)
zThe day of the year (starting from 0)0 through 365
------
WISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0)Example: 42 (the 42nd week in the year)
------
FA full textual representation of a month, such as January or MarchJanuary through December
mNumeric representation of a month, with leading zeros01 through 12
MA short textual representation of a month, three lettersJan through Dec
nNumeric representation of a month, without leading zeros1 through 12
tNumber of days in the given month28 through 31
------
LWhether it's a leap year1 if it is a leap year, 0 otherwise.
oISO-8601 year number. This has the same value as + * Y, except that if the ISO week number + * (W) belongs to the previous or next year, that year + * is used instead. (added in PHP 5.1.0)Examples: 1999 or 2003
YA full numeric representation of a year, 4 digitsExamples: 1999 or 2003
yA two digit representation of a yearExamples: 99 or 03
------
aLowercase Ante meridiem and Post meridiemam or pm
AUppercase Ante meridiem and Post meridiemAM or PM
BSwatch Internet time000 through 999
g12-hour format of an hour without leading zeros1 through 12
G24-hour format of an hour without leading zeros0 through 23
h12-hour format of an hour with leading zeros01 through 12
H24-hour format of an hour with leading zeros00 through 23
iMinutes with leading zeros00 to 59
sSeconds, with leading zeros00 through 59
uMicroseconds (added in PHP 5.2.2)Example: 654321
------
eTimezone identifier (added in PHP 5.1.0)Examples: UTC, GMT, Atlantic/Azores
I (capital i)Whether or not the date is in daylight saving time1 if Daylight Saving Time, 0 otherwise.
ODifference to Greenwich time (GMT) in hoursExample: +0200
PDifference to Greenwich time (GMT) with colon between hours and minutes (added in PHP 5.1.3)Example: +02:00
TTimezone abbreviationExamples: EST, MDT ...
ZTimezone offset in seconds. The offset for timezones west of UTC is always + * negative, and for those east of UTC is always positive.-43200 through 50400
------
cISO 8601 date (added in PHP 5)2004-02-12T15:19:21+00:00
rRFC 2822 formatted dateExample: Thu, 21 Dec 2000 16:01:07 +0200
USeconds since the Unix Epoch (January 1 1970 00:00:00 GMT)See also time
+ *

+ *

+ * Unrecognized characters in the format string will be printed + * as-is. The Z format will always return + * 0 when using gmdate. + *

+ *

+ * Since this function only accepts integer timestamps the + * u format character is only useful when using the + * date_format function with user based timestamps + * created with date_create. + *

+ * @param int $timestamp [optional] + * @return string a formatted date string. If a non-numeric value is used for + * timestamp, FALSE is returned and an + * E_WARNING level error is emitted. + * @jms-builtin + */ +function date ($format, $timestamp = 'time()') {} + +/** + * (PHP 5)
+ * Format a local time/date as integer + * @link http://php.net/manual/en/function.idate.php + * @param string $format

+ * + * The following characters are recognized in the + * format parameter string + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
format characterDescription
BSwatch Beat/Internet Time
dDay of the month
hHour (12 hour format)
HHour (24 hour format)
iMinutes
I (uppercase i)returns 1 if DST is activated, + * 0 otherwise
L (uppercase l)returns 1 for leap year, + * 0 otherwise
mMonth number
sSeconds
tDays in current month
USeconds since the Unix Epoch - January 1 1970 00:00:00 UTC - + * this is the same as time
wDay of the week (0 on Sunday)
WISO-8601 week number of year, weeks starting on + * Monday
yYear (1 or 2 digits - check note below)
YYear (4 digits)
zDay of the year
ZTimezone offset in seconds
+ *

+ * @param int $timestamp [optional] + * @return int an integer. + *

+ *

+ * As idate always returns an integer and + * as they can't start with a "0", idate may return + * fewer digits than you would expect. See the example below. + * @jms-builtin + */ +function idate ($format, $timestamp = 'time()') {} + +/** + * (PHP 4, PHP 5)
+ * Format a GMT/UTC date/time + * @link http://php.net/manual/en/function.gmdate.php + * @param string $format

+ * The format of the outputted date string. See the formatting + * options for the date function. + *

+ * @param int $timestamp [optional] + * @return string a formatted date string. If a non-numeric value is used for + * timestamp, FALSE is returned and an + * E_WARNING level error is emitted. + * @jms-builtin + */ +function gmdate ($format, $timestamp = 'time()') {} + +/** + * (PHP 4, PHP 5)
+ * Get Unix timestamp for a date + * @link http://php.net/manual/en/function.mktime.php + * @param int $hour [optional]

+ * The number of the hour relative to the start of the day determined by + * month, day and year. + * Negative values reference the hour before midnight of the day in question. + * Values greater than 23 reference the appropriate hour in the following day(s). + *

+ * @param int $minute [optional]

+ * The number of the minute relative to the start of the hour. + * Negative values reference the minute in the previous hour. + * Values greater than 59 reference the appropriate minute in the following hour(s). + *

+ * @param int $second [optional]

+ * The number of seconds relative to the start of the minute. + * Negative values reference the second in the previous minute. + * Values greater than 59 reference the appropriate second in the following minute(s). + *

+ * @param int $month [optional]

+ * The number of the month relative to the end of the previous year. + * Values 1 to 12 reference the normal calendar months of the year in question. + * Values less than 1 (including negative values) reference the months in the previous year in reverse order, so 0 is December, -1 is November, etc. + * Values greater than 12 reference the appropriate month in the following year(s). + *

+ * @param int $day [optional]

+ * The number of the day relative to the end of the previous month. + * Values 1 to 28, 29, 30 or 31 (depending upon the month) reference the normal days in the relevant month. + * Values less than 1 (including negative values) reference the days in the previous month, so 0 is the last day of the previous month, -1 is the day before that, etc. + * Values greater than the number of days in the relevant month reference the appropriate day in the following month(s). + *

+ * @param int $year [optional]

+ * The number of the year, may be a two or four digit value, + * with values between 0-69 mapping to 2000-2069 and 70-100 to + * 1970-2000. On systems where time_t is a 32bit signed integer, as + * most common today, the valid range for year + * is somewhere between 1901 and 2038. However, before PHP 5.1.0 this + * range was limited from 1970 to 2038 on some systems (e.g. Windows). + *

+ * @param int $is_dst [optional]

+ * This parameter can be set to 1 if the time is during daylight savings time (DST), + * 0 if it is not, or -1 (the default) if it is unknown whether the time is within + * daylight savings time or not. If it's unknown, PHP tries to figure it out itself. + * This can cause unexpected (but not incorrect) results. + * Some times are invalid if DST is enabled on the system PHP is running on or + * is_dst is set to 1. If DST is enabled in e.g. 2:00, all times + * between 2:00 and 3:00 are invalid and mktime returns an undefined + * (usually negative) value. + * Some systems (e.g. Solaris 8) enable DST at midnight so time 0:30 of the day when DST + * is enabled is evaluated as 23:30 of the previous day. + *

+ *

+ * As of PHP 5.1.0, this parameter became deprecated. As a result, the + * new timezone handling features should be used instead. + *

+ * @return int mktime returns the Unix timestamp of the arguments + * given. + * If the arguments are invalid, the function returns FALSE (before PHP 5.1 + * it returned -1). + * @jms-builtin + */ +function mktime ($hour = 'date("H")', $minute = 'date("i")', $second = 'date("s")', $month = 'date("n")', $day = 'date("j")', $year = 'date("Y")', $is_dst = -1) {} + +/** + * (PHP 4, PHP 5)
+ * Get Unix timestamp for a GMT date + * @link http://php.net/manual/en/function.gmmktime.php + * @param int $hour [optional]

+ * The number of the hour relative to the start of the day determined by + * month, day and year. + * Negative values reference the hour before midnight of the day in question. + * Values greater than 23 reference the appropriate hour in the following day(s). + *

+ * @param int $minute [optional]

+ * The number of the minute relative to the start of the hour. + * Negative values reference the minute in the previous hour. + * Values greater than 59 reference the appropriate minute in the following hour(s). + *

+ * @param int $second [optional]

+ * The number of seconds relative to the start of the minute. + * Negative values reference the second in the previous minute. + * Values greater than 59 reference the appropriate second in the following minute(s). + *

+ * @param int $month [optional]

+ * The number of the month relative to the end of the previous year. + * Values 1 to 12 reference the normal calendar months of the year in question. + * Values less than 1 (including negative values) reference the months in the previous year in reverse order, so 0 is December, -1 is November, etc. + * Values greater than 12 reference the appropriate month in the following year(s). + *

+ * @param int $day [optional]

+ * The number of the day relative to the end of the previous month. + * Values 1 to 28, 29, 30 or 31 (depending upon the month) reference the normal days in the relevant month. + * Values less than 1 (including negative values) reference the days in the previous month, so 0 is the last day of the previous month, -1 is the day before that, etc. + * Values greater than the number of days in the relevant month reference the appropriate day in the following month(s). + *

+ * @param int $year [optional]

+ * The year + *

+ * @param int $is_dst [optional]

+ * Parameters always represent a GMT date so is_dst + * doesn't influence the result. + *

+ * @return int a integer Unix timestamp. + * @jms-builtin + */ +function gmmktime ($hour = 'gmdate("H")', $minute = 'gmdate("i")', $second = 'gmdate("s")', $month = 'gmdate("n")', $day = 'gmdate("j")', $year = 'gmdate("Y")', $is_dst = -1) {} + +/** + * (PHP 4, PHP 5)
+ * Validate a Gregorian date + * @link http://php.net/manual/en/function.checkdate.php + * @param int $month

+ * The month is between 1 and 12 inclusive. + *

+ * @param int $day

+ * The day is within the allowed number of days for the given + * month. Leap years + * are taken into consideration. + *

+ * @param int $year

+ * The year is between 1 and 32767 inclusive. + *

+ * @return bool TRUE if the date given is valid; otherwise returns FALSE. + * @jms-builtin + */ +function checkdate ($month, $day, $year) {} + +/** + * (PHP 4, PHP 5)
+ * Format a local time/date according to locale settings + * @link http://php.net/manual/en/function.strftime.php + * @param string $format

+ * + * The following characters are recognized in the + * format parameter string + * + * + * + * + * + * + * Day + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Week + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Month + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Year + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Time + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Time and Date Stamps + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Miscellaneous + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
formatDescriptionExample returned values
------
%aAn abbreviated textual representation of the daySun through Sat
%AA full textual representation of the daySunday through Saturday
%dTwo-digit day of the month (with leading zeros)01 to 31
%e + * Day of the month, with a space preceding single digits. Not + * implemented as described on Windows. See below for more information. + * 1 to 31
%jDay of the year, 3 digits with leading zeros001 to 366
%uISO-8601 numeric representation of the day of the week1 (for Monday) though 7 (for Sunday)
%wNumeric representation of the day of the week0 (for Sunday) through 6 (for Saturday)
------
%UWeek number of the given year, starting with the first + * Sunday as the first week13 (for the 13th full week of the year)
%VISO-8601:1988 week number of the given year, starting with + * the first week of the year with at least 4 weekdays, with Monday + * being the start of the week01 through 53 (where 53 + * accounts for an overlapping week)
%WA numeric representation of the week of the year, starting + * with the first Monday as the first week46 (for the 46th week of the year beginning + * with a Monday)
------
%bAbbreviated month name, based on the localeJan through Dec
%BFull month name, based on the localeJanuary through December
%hAbbreviated month name, based on the locale (an alias of %b)Jan through Dec
%mTwo digit representation of the month01 (for January) through 12 (for December)
------
%CTwo digit representation of the century (year divided by 100, truncated to an integer)19 for the 20th Century
%gTwo digit representation of the year going by ISO-8601:1988 standards (see %V)Example: 09 for the week of January 6, 2009
%GThe full four-digit version of %gExample: 2008 for the week of January 3, 2009
%yTwo digit representation of the yearExample: 09 for 2009, 79 for 1979
%YFour digit representation for the yearExample: 2038
------
%HTwo digit representation of the hour in 24-hour format00 through 23
%ITwo digit representation of the hour in 12-hour format01 through 12
%l (lower-case 'L')Hour in 12-hour format, with a space preceeding single digits 1 through 12
%MTwo digit representation of the minute00 through 59
%pUPPER-CASE 'AM' or 'PM' based on the given timeExample: AM for 00:31, PM for 22:23
%Plower-case 'am' or 'pm' based on the given timeExample: am for 00:31, pm for 22:23
%rSame as "%I:%M:%S %p"Example: 09:34:17 PM for 21:34:17
%RSame as "%H:%M"Example: 00:35 for 12:35 AM, 16:44 for 4:44 PM
%STwo digit representation of the second00 through 59
%TSame as "%H:%M:%S"Example: 21:34:17 for 09:34:17 PM
%XPreferred time representation based on locale, without the dateExample: 03:59:16 or 15:59:16
%zEither the time zone offset from UTC or the abbreviation (depends + * on operating system)Example: -0500 or EST for Eastern Time
%ZThe time zone offset/abbreviation option NOT given by %z (depends + * on operating system)Example: -0500 or EST for Eastern Time
------
%cPreferred date and time stamp based on localExample: Tue Feb 5 00:45:10 2009 for + * February 5, 2009 at 12:45:10 AM
%DSame as "%m/%d/%y"Example: 02/05/09 for February 5, 2009
%FSame as "%Y-%m-%d" (commonly used in database datestamps)Example: 2009-02-05 for February 5, 2009
%sUnix Epoch Time timestamp (same as the time + * function)Example: 305815200 for September 10, 1979 08:40:00 AM
%xPreferred date representation based on locale, without the timeExample: 02/05/09 for February 5, 2009
------
%nA newline character ("\n")---
%tA Tab character ("\t")---
%%A literal percentage character ("%")---
+ *

+ *

+ * Maximum length of this parameter is 1023 characters. + *

+ * Contrary to ISO-9899:1999, Sun Solaris starts with Sunday as 1. + * As a result, %u may not function as described in this manual. + * Windows only: The %e modifier + * is not supported in the Windows implementation of this function. To achieve + * this value, the %#d modifier can be used instead. The + * example below illustrates how to write a cross platform compatible function. + * Mac OS X only: The %P modifier + * is not supported in the Mac OS X implementation of this function. + * @param int $timestamp [optional] + * @return string a string formatted according format + * using the given timestamp or the current + * local time if no timestamp is given. Month and weekday names and + * other language-dependent strings respect the current locale set + * with setlocale. + * @jms-builtin + */ +function strftime ($format, $timestamp = 'time()') {} + +/** + * (PHP 4, PHP 5)
+ * Format a GMT/UTC time/date according to locale settings + * @link http://php.net/manual/en/function.gmstrftime.php + * @param string $format

+ * See description in strftime. + *

+ * @param int $timestamp [optional] + * @return string a string formatted according to the given format string + * using the given timestamp or the current + * local time if no timestamp is given. Month and weekday names and + * other language dependent strings respect the current locale set + * with setlocale. + * @jms-builtin + */ +function gmstrftime ($format, $timestamp = 'time()') {} + +/** + * (PHP 4, PHP 5)
+ * Return current Unix timestamp + * @link http://php.net/manual/en/function.time.php + * @return int + * @jms-builtin + */ +function time () {} + +/** + * (PHP 4, PHP 5)
+ * Get the local time + * @link http://php.net/manual/en/function.localtime.php + * @param int $timestamp [optional] + * @param bool $is_associative [optional]

+ * If set to FALSE or not supplied then the array is returned as a regular, + * numerically indexed array. If the argument is set to TRUE then + * localtime returns an associative array containing + * all the different elements of the structure returned by the C + * function call to localtime. The names of the different keys of + * the associative array are as follows: + *

+ *

+ * "tm_sec" - seconds, 0 to 59 + * @return array + * @jms-builtin + */ +function localtime ($timestamp = 'time()', $is_associative = false) {} + +/** + * (PHP 4, PHP 5)
+ * Get date/time information + * @link http://php.net/manual/en/function.getdate.php + * @param int $timestamp [optional] + * @return array an associative array of information related to + * the timestamp. Elements from the returned + * associative array are as follows: + *

+ *

+ * + * Key elements of the returned associative array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
KeyDescriptionExample returned values
"seconds"Numeric representation of seconds0 to 59
"minutes"Numeric representation of minutes0 to 59
"hours"Numeric representation of hours0 to 23
"mday"Numeric representation of the day of the month1 to 31
"wday"Numeric representation of the day of the week0 (for Sunday) through 6 (for Saturday)
"mon"Numeric representation of a month1 through 12
"year"A full numeric representation of a year, 4 digitsExamples: 1999 or 2003
"yday"Numeric representation of the day of the year0 through 365
"weekday"A full textual representation of the day of the weekSunday through Saturday
"month"A full textual representation of a month, such as January or MarchJanuary through December
0 + * Seconds since the Unix Epoch, similar to the values returned by + * time and used by date. + * + * System Dependent, typically -2147483648 through + * 2147483647. + *
+ * @jms-builtin + */ +function getdate ($timestamp = 'time()') {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTime::__construct + * @link http://php.net/manual/en/function.date-create.php + * @param $time [optional] + * @param $object [optional] + * @jms-builtin + */ +function date_create ($time, $object) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Alias of DateTime::createFromFormat + * @link http://php.net/manual/en/function.date-create-from-format.php + * @param $format + * @param $time + * @param $object [optional] + * @jms-builtin + */ +function date_create_from_format ($format, $time, $object) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Returns associative array with detailed info about given date + * @link http://php.net/manual/en/function.date-parse.php + * @param string $date

+ * Date in format accepted by strtotime. + *

+ * @return array array with information about the parsed date + * on success or FALSE on failure. + * @jms-builtin + */ +function date_parse ($date) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Get info about given date formatted according to the specified format + * @link http://php.net/manual/en/function.date-parse-from-format.php + * @param string $format

+ * Format accepted by DateTime::createFromFormat. + *

+ * @param string $date

+ * String representing the date. + *

+ * @return array associative array with detailed info about given date. + * @jms-builtin + */ +function date_parse_from_format ($format, $date) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Alias of DateTime::getLastErrors + * @link http://php.net/manual/en/function.date-get-last-errors.php + * @jms-builtin + */ +function date_get_last_errors () {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTime::format + * @link http://php.net/manual/en/function.date-format.php + * @param $object + * @param $format + * @jms-builtin + */ +function date_format ($object, $format) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTime::modify + * @link http://php.net/manual/en/function.date-modify.php + * @param $object + * @param $modify + * @jms-builtin + */ +function date_modify ($object, $modify) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Alias of DateTime::add + * @link http://php.net/manual/en/function.date-add.php + * @param $object + * @param $interval + * @jms-builtin + */ +function date_add ($object, $interval) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Alias of DateTime::sub + * @link http://php.net/manual/en/function.date-sub.php + * @param $object + * @param $interval + * @jms-builtin + */ +function date_sub ($object, $interval) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTime::getTimezone + * @link http://php.net/manual/en/function.date-timezone-get.php + * @param $object + * @jms-builtin + */ +function date_timezone_get ($object) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTime::setTimezone + * @link http://php.net/manual/en/function.date-timezone-set.php + * @param $object + * @param $timezone + * @jms-builtin + */ +function date_timezone_set ($object, $timezone) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTime::getOffset + * @link http://php.net/manual/en/function.date-offset-get.php + * @param $object + * @jms-builtin + */ +function date_offset_get ($object) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Alias of DateTime::diff + * @link http://php.net/manual/en/function.date-diff.php + * @param $object + * @param $object2 + * @param $absolute [optional] + * @jms-builtin + */ +function date_diff ($object, $object2, $absolute) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTime::setTime + * @link http://php.net/manual/en/function.date-time-set.php + * @param $object + * @param $hour + * @param $minute + * @param $second [optional] + * @jms-builtin + */ +function date_time_set ($object, $hour, $minute, $second) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTime::setDate + * @link http://php.net/manual/en/function.date-date-set.php + * @param $object + * @param $year + * @param $month + * @param $day + * @jms-builtin + */ +function date_date_set ($object, $year, $month, $day) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTime::setISODate + * @link http://php.net/manual/en/function.date-isodate-set.php + * @param $object + * @param $year + * @param $week + * @param $day [optional] + * @jms-builtin + */ +function date_isodate_set ($object, $year, $week, $day) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Alias of DateTime::setTimestamp + * @link http://php.net/manual/en/function.date-timestamp-set.php + * @param $object + * @param $unixtimestamp + * @jms-builtin + */ +function date_timestamp_set ($object, $unixtimestamp) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Alias of DateTime::getTimestamp + * @link http://php.net/manual/en/function.date-timestamp-get.php + * @param $object + * @jms-builtin + */ +function date_timestamp_get ($object) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTimeZone::__construct + * @link http://php.net/manual/en/function.timezone-open.php + * @param $timezone + * @jms-builtin + */ +function timezone_open ($timezone) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTimeZone::getName + * @link http://php.net/manual/en/function.timezone-name-get.php + * @param $object + * @jms-builtin + */ +function timezone_name_get ($object) {} + +/** + * (PHP 5 >= 5.1.3)
+ * Returns the timezone name from abbreviation + * @link http://php.net/manual/en/function.timezone-name-from-abbr.php + * @param string $abbr

+ * Time zone abbreviation. + *

+ * @param int $gmtOffset [optional]

+ * Offset from GMT in seconds. Defaults to -1 which means that first found + * time zone corresponding to abbr is returned. + * Otherwise exact offset is searched and only if not found then the first + * time zone with any offset is returned. + *

+ * @param int $isdst [optional]

+ * Daylight saving time indicator. Defaults to -1, which means that + * whether the time zone has daylight saving or not is not taken into + * consideration when searching. If this is set to 1, then the + * gmtOffset is assumed to be an offset with + * daylight saving in effect; if 0, then gmtOffset + * is assumed to be an offset without daylight saving in effect. If + * abbr doesn't exist then the time zone is + * searched solely by the gmtOffset and + * isdst. + *

+ * @return string time zone name on success or FALSE on failure. + * @jms-builtin + */ +function timezone_name_from_abbr ($abbr, $gmtOffset = -1, $isdst = -1) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTimeZone::getOffset + * @link http://php.net/manual/en/function.timezone-offset-get.php + * @param $object + * @param $datetime + * @jms-builtin + */ +function timezone_offset_get ($object, $datetime) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTimeZone::getTransitions + * @link http://php.net/manual/en/function.timezone-transitions-get.php + * @param $object + * @param $timestamp_begin [optional] + * @param $timestamp_end [optional] + * @jms-builtin + */ +function timezone_transitions_get ($object, $timestamp_begin, $timestamp_end) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Alias of DateTimeZone::getLocation + * @link http://php.net/manual/en/function.timezone-location-get.php + * @param $object + * @jms-builtin + */ +function timezone_location_get ($object) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTimeZone::listIdentifiers + * @link http://php.net/manual/en/function.timezone-identifiers-list.php + * @param $what [optional] + * @param $country [optional] + * @jms-builtin + */ +function timezone_identifiers_list ($what, $country) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Alias of DateTimeZone::listAbbreviations + * @link http://php.net/manual/en/function.timezone-abbreviations-list.php + * @jms-builtin + */ +function timezone_abbreviations_list () {} + +/** + * (PHP 5 >= 5.3.0)
+ * Gets the version of the timezonedb + * @link http://php.net/manual/en/function.timezone-version-get.php + * @return string a string. + * @jms-builtin + */ +function timezone_version_get () {} + +/** + * (PHP 5 >= 5.3.0)
+ * Alias of DateInterval::createFromDateString + * @link http://php.net/manual/en/function.date-interval-create-from-date-string.php + * @param $time + * @jms-builtin + */ +function date_interval_create_from_date_string ($time) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Alias of DateInterval::format + * @link http://php.net/manual/en/function.date-interval-format.php + * @param $object + * @param $format + * @jms-builtin + */ +function date_interval_format ($object, $format) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Sets the default timezone used by all date/time functions in a script + * @link http://php.net/manual/en/function.date-default-timezone-set.php + * @param string $timezone_identifier

+ * The timezone identifier, like UTC or + * Europe/Lisbon. The list of valid identifiers is + * available in the . + *

+ * @return bool This function returns FALSE if the + * timezone_identifier isn't valid, or TRUE + * otherwise. + * @jms-builtin + */ +function date_default_timezone_set ($timezone_identifier) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Gets the default timezone used by all date/time functions in a script + * @link http://php.net/manual/en/function.date-default-timezone-get.php + * @return string a string. + * @jms-builtin + */ +function date_default_timezone_get () {} + +/** + * (PHP 5)
+ * Returns time of sunrise for a given day and location + * @link http://php.net/manual/en/function.date-sunrise.php + * @param int $timestamp

+ * The timestamp of the day from which the sunrise + * time is taken. + *

+ * @param int $format [optional]

+ * + * format constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
constantdescriptionexample
SUNFUNCS_RET_STRINGreturns the result as string16:46
SUNFUNCS_RET_DOUBLEreturns the result as float16.78243132
SUNFUNCS_RET_TIMESTAMPreturns the result as integer (timestamp)1095034606
+ *

+ * @param float $latitude [optional]

+ * Defaults to North, pass in a negative value for South. + * See also: date.default_latitude + *

+ * @param float $longitude [optional]

+ * Defaults to East, pass in a negative value for West. + * See also: date.default_longitude + *

+ * @param float $zenith [optional]

+ * Default: date.sunrise_zenith + *

+ * @param float $gmt_offset [optional] + * @return mixed the sunrise time in a specified format on + * success or FALSE on failure. + * @jms-builtin + */ +function date_sunrise ($timestamp, $format = 'SUNFUNCS_RET_STRING', $latitude = 'ini_get("date.default_latitude")', $longitude = 'ini_get("date.default_longitude")', $zenith = 'ini_get("date.sunrise_zenith")', $gmt_offset = 0) {} + +/** + * (PHP 5)
+ * Returns time of sunset for a given day and location + * @link http://php.net/manual/en/function.date-sunset.php + * @param int $timestamp

+ * The timestamp of the day from which the sunset + * time is taken. + *

+ * @param int $format [optional]

+ * + * format constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
constantdescriptionexample
SUNFUNCS_RET_STRINGreturns the result as string16:46
SUNFUNCS_RET_DOUBLEreturns the result as float16.78243132
SUNFUNCS_RET_TIMESTAMPreturns the result as integer (timestamp)1095034606
+ *

+ * @param float $latitude [optional]

+ * Defaults to North, pass in a negative value for South. + * See also: date.default_latitude + *

+ * @param float $longitude [optional]

+ * Defaults to East, pass in a negative value for West. + * See also: date.default_longitude + *

+ * @param float $zenith [optional]

+ * Default: date.sunset_zenith + *

+ * @param float $gmt_offset [optional] + * @return mixed the sunset time in a specified format on + * success or FALSE on failure. + * @jms-builtin + */ +function date_sunset ($timestamp, $format = 'SUNFUNCS_RET_STRING', $latitude = 'ini_get("date.default_latitude")', $longitude = 'ini_get("date.default_longitude")', $zenith = 'ini_get("date.sunset_zenith")', $gmt_offset = 0) {} + +/** + * (PHP 5 >= 5.1.2)
+ * Returns an array with information about sunset/sunrise and twilight begin/end + * @link http://php.net/manual/en/function.date-sun-info.php + * @param int $time

+ * Timestamp. + *

+ * @param float $latitude

+ * Latitude in degrees. + *

+ * @param float $longitude

+ * Longitude in degrees. + *

+ * @return array array on success or FALSE on failure. + * @jms-builtin + */ +function date_sun_info ($time, $latitude, $longitude) {} + +define ('DATE_ATOM', "Y-m-d\TH:i:sP"); +define ('DATE_COOKIE', "l, d-M-y H:i:s T"); +define ('DATE_ISO8601', "Y-m-d\TH:i:sO"); +define ('DATE_RFC822', "D, d M y H:i:s O"); +define ('DATE_RFC850', "l, d-M-y H:i:s T"); +define ('DATE_RFC1036', "D, d M y H:i:s O"); +define ('DATE_RFC1123', "D, d M Y H:i:s O"); +define ('DATE_RFC2822', "D, d M Y H:i:s O"); +define ('DATE_RFC3339', "Y-m-d\TH:i:sP"); +define ('DATE_RSS', "D, d M Y H:i:s O"); +define ('DATE_W3C', "Y-m-d\TH:i:sP"); + +/** + * Timestamp + * @link http://php.net/manual/en/datetime.constants.php + */ +define ('SUNFUNCS_RET_TIMESTAMP', 0); + +/** + * Hours:minutes (example: 08:02) + * @link http://php.net/manual/en/datetime.constants.php + */ +define ('SUNFUNCS_RET_STRING', 1); + +/** + * Hours as floating point number (example 8.75) + * @link http://php.net/manual/en/datetime.constants.php + */ +define ('SUNFUNCS_RET_DOUBLE', 2); + +// End of date v.5.4.3-4~precise+1 +?> diff --git a/res/php-5.4-core-api/dba.php b/res/php-5.4-core-api/dba.php new file mode 100644 index 0000000..9dd3f6f --- /dev/null +++ b/res/php-5.4-core-api/dba.php @@ -0,0 +1,353 @@ + + * Open database + * @link http://php.net/manual/en/function.dba-open.php + * @param string $path

+ * Commonly a regular path in your filesystem. + *

+ * @param string $mode

+ * It is r for read access, w for + * read/write access to an already existing database, c + * for read/write access and database creation if it doesn't currently exist, + * and n for create, truncate and read/write access. + * The database is created in BTree mode, other modes (like Hash or Queue) + * are not supported. + *

+ *

+ * Additionally you can set the database lock method with the next char. + * Use l to lock the database with a .lck + * file or d to lock the databasefile itself. It is + * important that all of your applications do this consistently. + *

+ *

+ * If you want to test the access and do not want to wait for the lock + * you can add t as third character. When you are + * absolutely sure that you do not require database locking you can do + * so by using - instead of l or + * d. When none of d, + * l or - is used, dba will lock + * on the database file as it would with d. + *

+ *

+ * There can only be one writer for one database file. When you use dba on + * a web server and more than one request requires write operations they can + * only be done one after another. Also read during write is not allowed. + * The dba extension uses locks to prevent this. See the following table: + * + * DBA locking + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
already openmode = "rl"mode = "rlt"mode = "wl"mode = "wlt"mode = "rd"mode = "rdt"mode = "wd"mode = "wdt"
not openokokokokokokokok
mode = "rl"okokwaitfalseillegalillegalillegalillegal
mode = "wl"waitfalsewaitfalseillegalillegalillegalillegal
mode = "rd"illegalillegalillegalillegalokokwaitfalse
mode = "wd"illegalillegalillegalillegalwaitfalsewaitfalse
+ * ok: the second call will be successfull. + * wait: the second call waits until dba_close is called for the first. + * false: the second call returns false. + * illegal: you must not mix "l" and "d" modifiers for mode parameter. + *

+ * @param string $handler [optional]

+ * The name of the handler which + * shall be used for accessing path. It is passed + * all optional parameters given to dba_open and + * can act on behalf of them. + *

+ * @param mixed $_ [optional] + * @return resource a positive handle on success or FALSE on failure. + * @jms-builtin + */ +function dba_open ($path, $mode, $handler = null, $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Open database persistently + * @link http://php.net/manual/en/function.dba-popen.php + * @param string $path

+ * Commonly a regular path in your filesystem. + *

+ * @param string $mode

+ * It is r for read access, w for + * read/write access to an already existing database, c + * for read/write access and database creation if it doesn't currently exist, + * and n for create, truncate and read/write access. + *

+ * @param string $handler [optional]

+ * The name of the handler which + * shall be used for accessing path. It is passed + * all optional parameters given to dba_popen and + * can act on behalf of them. + *

+ * @param mixed $_ [optional] + * @return resource a positive handle on success or FALSE on failure. + * @jms-builtin + */ +function dba_popen ($path, $mode, $handler = null, $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Close a DBA database + * @link http://php.net/manual/en/function.dba-close.php + * @param resource $handle

+ * The database handler, returned by dba_open or + * dba_popen. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function dba_close ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Delete DBA entry specified by key + * @link http://php.net/manual/en/function.dba-delete.php + * @param string $key

+ * The key of the entry which is deleted. + *

+ * @param resource $handle

+ * The database handler, returned by dba_open or + * dba_popen. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function dba_delete ($key, $handle) {} + +/** + * (PHP 4, PHP 5)
+ * Check whether key exists + * @link http://php.net/manual/en/function.dba-exists.php + * @param string $key

+ * The key the check is performed for. + *

+ * @param resource $handle

+ * The database handler, returned by dba_open or + * dba_popen. + *

+ * @return bool TRUE if the key exists, FALSE otherwise. + * @jms-builtin + */ +function dba_exists ($key, $handle) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch data specified by key + * @link http://php.net/manual/en/function.dba-fetch.php + * @param string $key

+ * The key the data is specified by. + *

+ *

+ * When working with inifiles this function accepts arrays as keys + * where index 0 is the group and index 1 is the value name. See: + * dba_key_split. + *

+ * @param resource $handle

+ * The database handler, returned by dba_open or + * dba_popen. + *

+ * @return string the associated string if the key/data pair is found, FALSE + * otherwise. + * @jms-builtin + */ +function dba_fetch ($key, $handle) {} + +/** + * (PHP 4, PHP 5)
+ * Insert entry + * @link http://php.net/manual/en/function.dba-insert.php + * @param string $key

+ * The key of the entry to be inserted. If this key already exist in the + * database, this function will fail. Use dba_replace + * if you need to replace an existent key. + *

+ * @param string $value

+ * The value to be inserted. + *

+ * @param resource $handle

+ * The database handler, returned by dba_open or + * dba_popen. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function dba_insert ($key, $value, $handle) {} + +/** + * (PHP 4, PHP 5)
+ * Replace or insert entry + * @link http://php.net/manual/en/function.dba-replace.php + * @param string $key

+ * The key of the entry to be replaced. + *

+ * @param string $value

+ * The value to be replaced. + *

+ * @param resource $handle

+ * The database handler, returned by dba_open or + * dba_popen. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function dba_replace ($key, $value, $handle) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch first key + * @link http://php.net/manual/en/function.dba-firstkey.php + * @param resource $handle

+ * The database handler, returned by dba_open or + * dba_popen. + *

+ * @return string the key on success or FALSE on failure. + * @jms-builtin + */ +function dba_firstkey ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch next key + * @link http://php.net/manual/en/function.dba-nextkey.php + * @param resource $handle

+ * The database handler, returned by dba_open or + * dba_popen. + *

+ * @return string the key on success or FALSE on failure. + * @jms-builtin + */ +function dba_nextkey ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Optimize database + * @link http://php.net/manual/en/function.dba-optimize.php + * @param resource $handle

+ * The database handler, returned by dba_open or + * dba_popen. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function dba_optimize ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Synchronize database + * @link http://php.net/manual/en/function.dba-sync.php + * @param resource $handle

+ * The database handler, returned by dba_open or + * dba_popen. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function dba_sync ($handle) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * List all the handlers available + * @link http://php.net/manual/en/function.dba-handlers.php + * @param bool $full_info [optional]

+ * Turns on/off full information display in the result. + *

+ * @return array an array of database handlers. If full_info + * is set to TRUE, the array will be associative with the handlers names as + * keys, and their version information as value. Otherwise, the result will be + * an indexed array of handlers names. + *

+ *

+ * When the internal cdb library is used you will see + * cdb and cdb_make. + * @jms-builtin + */ +function dba_handlers ($full_info = false) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * List all open database files + * @link http://php.net/manual/en/function.dba-list.php + * @return array An associative array, in the form resourceid => filename. + * @jms-builtin + */ +function dba_list () {} + +/** + * (PHP 5)
+ * Splits a key in string representation into array representation + * @link http://php.net/manual/en/function.dba-key-split.php + * @param mixed $key

+ * The key in string representation. + *

+ * @return mixed an array of the form array(0 => group, 1 => + * value_name). This function will return FALSE if + * key is NULL or FALSE. + * @jms-builtin + */ +function dba_key_split ($key) {} + +// End of dba v. +?> diff --git a/res/php-5.4-core-api/dom.php b/res/php-5.4-core-api/dom.php new file mode 100644 index 0000000..5371c36 --- /dev/null +++ b/res/php-5.4-core-api/dom.php @@ -0,0 +1,5292 @@ + + * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class DOMStringList { + + /** + * @param $index + */ + public function item ($index) {} + +} + +/** + * @link http://php.net/manual/en/book.dom.php + * @jms-builtin + */ +class DOMNameList { + + /** + * @param $index + */ + public function getName ($index) {} + + /** + * @param $index + */ + public function getNamespaceURI ($index) {} + +} + +/** @jms-builtin */ +class DOMImplementationList { + + /** + * @param $index + */ + public function item ($index) {} + +} + +/** @jms-builtin */ +class DOMImplementationSource { + + /** + * @param $features + */ + public function getDomimplementation ($features) {} + + /** + * @param $features + */ + public function getDomimplementations ($features) {} + +} + +/** + * The DOMImplementation interface provides a number + * of methods for performing operations that are independent of any + * particular instance of the document object model. + * @link http://php.net/manual/en/class.domimplementation.php + * @jms-builtin + */ +class DOMImplementation { + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * (PHP 5)
+ * Test if the DOM implementation implements a specific feature + * @link http://php.net/manual/en/domimplementation.hasfeature.php + * @param string $feature

+ * The feature to test. + *

+ * @param string $version

+ * The version number of the feature to test. In + * level 2, this can be either 2.0 or + * 1.0. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function hasFeature ($feature, $version) {} + + /** + * (PHP 5)
+ * Creates an empty DOMDocumentType object + * @link http://php.net/manual/en/domimplementation.createdocumenttype.php + * @param string $qualifiedName [optional]

+ * The qualified name of the document type to create. + *

+ * @param string $publicId [optional]

+ * The external subset public identifier. + *

+ * @param string $systemId [optional]

+ * The external subset system identifier. + *

+ * @return DOMDocumentType A new DOMDocumentType node with its + * ownerDocument set to NULL. + */ + public function createDocumentType ($qualifiedName = null, $publicId = null, $systemId = null) {} + + /** + * (PHP 5)
+ * Creates a DOMDocument object of the specified type with its document element + * @link http://php.net/manual/en/domimplementation.createdocument.php + * @param string $namespaceURI [optional]

+ * The namespace URI of the document element to create. + *

+ * @param string $qualifiedName [optional]

+ * The qualified name of the document element to create. + *

+ * @param DOMDocumentType $doctype [optional]

+ * The type of document to create or NULL. + *

+ * @return DOMDocument A new DOMDocument object. If + * namespaceURI, qualifiedName, + * and doctype are null, the returned + * DOMDocument is empty with no document element + */ + public function createDocument ($namespaceURI = null, $qualifiedName = null, DOMDocumentType $doctype = null) {} + +} + +/** + * @link http://php.net/manual/en/class.domnode.php + * @jms-builtin + */ +class DOMNode { + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** @jms-builtin */ +class DOMNameSpaceNode { +} + +/** + * @link http://php.net/manual/en/class.domdocumentfragment.php + * @jms-builtin + */ +class DOMDocumentFragment extends DOMNode { + + public function __construct () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Append raw XML data + * @link http://php.net/manual/en/domdocumentfragment.appendxml.php + * @param string $data

+ * XML to append. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function appendXML ($data) {} + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * Represents an entire HTML or XML document; serves as the root of the + * document tree. + * @link http://php.net/manual/en/class.domdocument.php + * @jms-builtin + */ +class DOMDocument extends DOMNode { + + /** + * (PHP 5)
+ * Create new element node + * @link http://php.net/manual/en/domdocument.createelement.php + * @param string $name

+ * The tag name of the element. + *

+ * @param string $value [optional]

+ * The value of the element. By default, an empty element will be created. + * The value can also be set later with DOMElement::$nodeValue. + *

+ * @return DOMElement a new instance of class DOMElement or FALSE + * if an error occured. + */ + public function createElement ($name, $value = null) {} + + /** + * (PHP 5)
+ * Create new document fragment + * @link http://php.net/manual/en/domdocument.createdocumentfragment.php + * @return DOMDocumentFragment The new DOMDocumentFragment or FALSE if an error occured. + */ + public function createDocumentFragment () {} + + /** + * (PHP 5)
+ * Create new text node + * @link http://php.net/manual/en/domdocument.createtextnode.php + * @param string $content

+ * The content of the text. + *

+ * @return DOMText The new DOMText or FALSE if an error occured. + */ + public function createTextNode ($content) {} + + /** + * (PHP 5)
+ * Create new comment node + * @link http://php.net/manual/en/domdocument.createcomment.php + * @param string $data

+ * The content of the comment. + *

+ * @return DOMComment The new DOMComment or FALSE if an error occured. + */ + public function createComment ($data) {} + + /** + * (PHP 5)
+ * Create new cdata node + * @link http://php.net/manual/en/domdocument.createcdatasection.php + * @param string $data

+ * The content of the cdata. + *

+ * @return DOMCDATASection The new DOMCDATASection or FALSE if an error occured. + */ + public function createCDATASection ($data) {} + + /** + * (PHP 5)
+ * Creates new PI node + * @link http://php.net/manual/en/domdocument.createprocessinginstruction.php + * @param string $target

+ * The target of the processing instruction. + *

+ * @param string $data [optional]

+ * The content of the processing instruction. + *

+ * @return DOMProcessingInstruction The new DOMProcessingInstruction or FALSE if an error occured. + */ + public function createProcessingInstruction ($target, $data = null) {} + + /** + * (PHP 5)
+ * Create new attribute + * @link http://php.net/manual/en/domdocument.createattribute.php + * @param string $name

+ * The name of the attribute. + *

+ * @return DOMAttr The new DOMAttr or FALSE if an error occured. + */ + public function createAttribute ($name) {} + + /** + * (PHP 5)
+ * Create new entity reference node + * @link http://php.net/manual/en/domdocument.createentityreference.php + * @param string $name

+ * The content of the entity reference, e.g. the entity reference minus + * the leading &#38; and the trailing + * ; characters. + *

+ * @return DOMEntityReference The new DOMEntityReference or FALSE if an error + * occured. + */ + public function createEntityReference ($name) {} + + /** + * (PHP 5)
+ * Searches for all elements with given local tag name + * @link http://php.net/manual/en/domdocument.getelementsbytagname.php + * @param string $name

+ * The local name (without namespace) of the tag to match on. The special value * + * matches all tags. + *

+ * @return DOMNodeList A new DOMNodeList object containing all the matched + * elements. + */ + public function getElementsByTagName ($name) {} + + /** + * (PHP 5)
+ * Import node into current document + * @link http://php.net/manual/en/domdocument.importnode.php + * @param DOMNode $importedNode

+ * The node to import. + *

+ * @param bool $deep [optional]

+ * If set to TRUE, this method will recursively import the subtree under + * the importedNode. + *

+ *

+ * To copy the nodes attributes deep needs to be set to TRUE + *

+ * @return DOMNode The copied node or FALSE, if it cannot be copied. + */ + public function importNode (DOMNode $importedNode, $deep = null) {} + + /** + * (PHP 5)
+ * Create new element node with an associated namespace + * @link http://php.net/manual/en/domdocument.createelementns.php + * @param string $namespaceURI

+ * The URI of the namespace. + *

+ * @param string $qualifiedName

+ * The qualified name of the element, as prefix:tagname. + *

+ * @param string $value [optional]

+ * The value of the element. By default, an empty element will be created. + * You can also set the value later with DOMElement::$nodeValue. + *

+ * @return DOMElement The new DOMElement or FALSE if an error occured. + */ + public function createElementNS ($namespaceURI, $qualifiedName, $value = null) {} + + /** + * (PHP 5)
+ * Create new attribute node with an associated namespace + * @link http://php.net/manual/en/domdocument.createattributens.php + * @param string $namespaceURI

+ * The URI of the namespace. + *

+ * @param string $qualifiedName

+ * The tag name and prefix of the attribute, as prefix:tagname. + *

+ * @return DOMAttr The new DOMAttr or FALSE if an error occured. + */ + public function createAttributeNS ($namespaceURI, $qualifiedName) {} + + /** + * (PHP 5)
+ * Searches for all elements with given tag name in specified namespace + * @link http://php.net/manual/en/domdocument.getelementsbytagnamens.php + * @param string $namespaceURI

+ * The namespace URI of the elements to match on. + * The special value * matches all namespaces. + *

+ * @param string $localName

+ * The local name of the elements to match on. + * The special value * matches all local names. + *

+ * @return DOMNodeList A new DOMNodeList object containing all the matched + * elements. + */ + public function getElementsByTagNameNS ($namespaceURI, $localName) {} + + /** + * (PHP 5)
+ * Searches for an element with a certain id + * @link http://php.net/manual/en/domdocument.getelementbyid.php + * @param string $elementId

+ * The unique id value for an element. + *

+ * @return DOMElement the DOMElement or NULL if the element is + * not found. + */ + public function getElementById ($elementId) {} + + /** + * @param DOMNode $source + */ + public function adoptNode (DOMNode $source) {} + + /** + * (PHP 5)
+ * Normalizes the document + * @link http://php.net/manual/en/domdocument.normalizedocument.php + * @return void No value is returned. + */ + public function normalizeDocument () {} + + /** + * @param DOMNode $node + * @param $namespaceURI + * @param $qualifiedName + */ + public function renameNode (DOMNode $node, $namespaceURI, $qualifiedName) {} + + /** + * (PHP 5)
+ * Load XML from a file + * @link http://php.net/manual/en/domdocument.load.php + * @param string $filename

+ * The path to the XML document. + *

+ * @param int $options [optional]

+ * Bitwise OR + * of the libxml option constants. + *

+ * @return mixed TRUE on success or FALSE on failure. If called statically, returns a + * DOMDocument or FALSE on failure. + */ + public function load ($filename, $options = 0) {} + + /** + * (PHP 5)
+ * Dumps the internal XML tree back into a file + * @link http://php.net/manual/en/domdocument.save.php + * @param string $filename

+ * The path to the saved XML document. + *

+ * @param int $options [optional]

+ * Additional Options. Currently only LIBXML_NOEMPTYTAG is supported. + *

+ * @return int the number of bytes written or FALSE if an error occurred. + */ + public function save ($filename, $options = null) {} + + /** + * (PHP 5)
+ * Load XML from a string + * @link http://php.net/manual/en/domdocument.loadxml.php + * @param string $source

+ * The string containing the XML. + *

+ * @param int $options [optional]

+ * Bitwise OR + * of the libxml option constants. + *

+ * @return mixed TRUE on success or FALSE on failure. If called statically, returns a + * DOMDocument or FALSE on failure. + */ + public function loadXML ($source, $options = 0) {} + + /** + * (PHP 5)
+ * Dumps the internal XML tree back into a string + * @link http://php.net/manual/en/domdocument.savexml.php + * @param DOMNode $node [optional]

+ * Use this parameter to output only a specific node without XML declaration + * rather than the entire document. + *

+ * @param int $options [optional]

+ * Additional Options. Currently only LIBXML_NOEMPTYTAG is supported. + *

+ * @return string the XML, or FALSE if an error occurred. + */ + public function saveXML (DOMNode $node = null, $options = null) {} + + /** + * (PHP 5)
+ * Creates a new DOMDocument object + * @link http://php.net/manual/en/domdocument.construct.php + * @param string $version [optional]

+ * The version number of the document as part of the XML declaration. + *

+ * @param string $encoding [optional]

+ * The encoding of the document as part of the XML declaration. + *

+ */ + public function __construct ($version = null, $encoding = null) {} + + /** + * (PHP 5)
+ * Validates the document based on its DTD + * @link http://php.net/manual/en/domdocument.validate.php + * @return bool TRUE on success or FALSE on failure. + * If the document have no DTD attached, this method will return FALSE. + */ + public function validate () {} + + /** + * (PHP 5)
+ * Substitutes XIncludes in a DOMDocument Object + * @link http://php.net/manual/en/domdocument.xinclude.php + * @param int $options [optional]

+ * libxml parameters. Available + * since PHP 5.1.0 and Libxml 2.6.7. + *

+ * @return int the number of XIncludes in the document, -1 if some processing failed, + * or FALSE if there were no substitutions. + */ + public function xinclude ($options = null) {} + + /** + * (PHP 5)
+ * Load HTML from a string + * @link http://php.net/manual/en/domdocument.loadhtml.php + * @param string $source

+ * The HTML string. + *

+ * @return bool TRUE on success or FALSE on failure. If called statically, returns a + * DOMDocument or FALSE on failure. + */ + public function loadHTML ($source) {} + + /** + * (PHP 5)
+ * Load HTML from a file + * @link http://php.net/manual/en/domdocument.loadhtmlfile.php + * @param string $filename

+ * The path to the HTML file. + *

+ * @return bool TRUE on success or FALSE on failure. If called statically, returns a + * DOMDocument or FALSE on failure. + */ + public function loadHTMLFile ($filename) {} + + /** + * (PHP 5)
+ * Dumps the internal document into a string using HTML formatting + * @link http://php.net/manual/en/domdocument.savehtml.php + * @param DOMNode $node [optional]

+ * Optional parameter to output a subset of the document. + *

+ * @return string the HTML, or FALSE if an error occurred. + */ + public function saveHTML (DOMNode $node = NULL) {} + + /** + * (PHP 5)
+ * Dumps the internal document into a file using HTML formatting + * @link http://php.net/manual/en/domdocument.savehtmlfile.php + * @param string $filename

+ * The path to the saved HTML document. + *

+ * @return int the number of bytes written or FALSE if an error occurred. + */ + public function saveHTMLFile ($filename) {} + + /** + * (PHP 5)
+ * Validates a document based on a schema + * @link http://php.net/manual/en/domdocument.schemavalidate.php + * @param string $filename

+ * The path to the schema. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function schemaValidate ($filename) {} + + /** + * (PHP 5)
+ * Validates a document based on a schema + * @link http://php.net/manual/en/domdocument.schemavalidatesource.php + * @param string $source

+ * A string containing the schema. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function schemaValidateSource ($source) {} + + /** + * (PHP 5)
+ * Performs relaxNG validation on the document + * @link http://php.net/manual/en/domdocument.relaxngvalidate.php + * @param string $filename

+ * The RNG file. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function relaxNGValidate ($filename) {} + + /** + * (PHP 5)
+ * Performs relaxNG validation on the document + * @link http://php.net/manual/en/domdocument.relaxngvalidatesource.php + * @param string $source

+ * A string containing the RNG schema. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function relaxNGValidateSource ($source) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Register extended class used to create base node type + * @link http://php.net/manual/en/domdocument.registernodeclass.php + * @param string $baseclass

+ * The DOM class that you want to extend. You can find a list of these + * classes in the chapter introduction. + *

+ * @param string $extendedclass

+ * Your extended class name. If NULL is provided, any previously + * registered class extending baseclass will + * be removed. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function registerNodeClass ($baseclass, $extendedclass) {} + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * @link http://php.net/manual/en/class.domnodelist.php + * @jms-builtin + */ +class DOMNodeList implements Traversable { + + /** + * (PHP 5)
+ * Retrieves a node specified by index + * @link http://php.net/manual/en/domnodelist.item.php + * @param int $index

+ * Index of the node into the collection. + *

+ * @return DOMNode The node at the indexth position in the + * DOMNodeList, or NULL if that is not a valid + * index. + */ + public function item ($index) {} + +} + +/** + * @link http://php.net/manual/en/class.domnamednodemap.php + * @jms-builtin + */ +class DOMNamedNodeMap implements Traversable { + + /** + * (PHP 5)
+ * Retrieves a node specified by name + * @link http://php.net/manual/en/domnamednodemap.getnameditem.php + * @param string $name

+ * The nodeName of the node to retrieve. + *

+ * @return DOMNode A node (of any type) with the specified nodeName, or + * NULL if no node is found. + */ + public function getNamedItem ($name) {} + + /** + * @param DOMNode $arg + */ + public function setNamedItem (DOMNode $arg) {} + + /** + * @param $name [optional] + */ + public function removeNamedItem ($name) {} + + /** + * (PHP 5)
+ * Retrieves a node specified by index + * @link http://php.net/manual/en/domnamednodemap.item.php + * @param int $index

+ * Index into this map. + *

+ * @return DOMNode The node at the indexth position in the map, or NULL + * if that is not a valid index (greater than or equal to the number of nodes + * in this map). + */ + public function item ($index) {} + + /** + * (PHP 5)
+ * Retrieves a node specified by local name and namespace URI + * @link http://php.net/manual/en/domnamednodemap.getnameditemns.php + * @param string $namespaceURI

+ * The namespace URI of the node to retrieve. + *

+ * @param string $localName

+ * The local name of the node to retrieve. + *

+ * @return DOMNode A node (of any type) with the specified local name and namespace URI, or + * NULL if no node is found. + */ + public function getNamedItemNS ($namespaceURI, $localName) {} + + /** + * @param DOMNode $arg [optional] + */ + public function setNamedItemNS (DOMNode $arg) {} + + /** + * @param $namespaceURI [optional] + * @param $localName [optional] + */ + public function removeNamedItemNS ($namespaceURI, $localName) {} + +} + +/** + * Represents nodes with character data. No nodes directly correspond to + * this class, but other nodes do inherit from it. + * @link http://php.net/manual/en/class.domcharacterdata.php + * @jms-builtin + */ +class DOMCharacterData extends DOMNode { + + /** + * (PHP 5)
+ * Extracts a range of data from the node + * @link http://php.net/manual/en/domcharacterdata.substringdata.php + * @param int $offset

+ * Start offset of substring to extract. + *

+ * @param int $count

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * (PHP 5)
+ * Append the string to the end of the character data of the node + * @link http://php.net/manual/en/domcharacterdata.appenddata.php + * @param string $data

+ * The string to append. + *

+ * @return void No value is returned. + */ + public function appendData ($data) {} + + /** + * (PHP 5)
+ * Insert a string at the specified 16-bit unit offset + * @link http://php.net/manual/en/domcharacterdata.insertdata.php + * @param int $offset

+ * The character offset at which to insert. + *

+ * @param string $data

+ * The string to insert. + *

+ * @return void No value is returned. + */ + public function insertData ($offset, $data) {} + + /** + * (PHP 5)
+ * Remove a range of characters from the node + * @link http://php.net/manual/en/domcharacterdata.deletedata.php + * @param int $offset

+ * The offset from which to start removing. + *

+ * @param int $count

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void No value is returned. + */ + public function deleteData ($offset, $count) {} + + /** + * (PHP 5)
+ * Replace a substring within the DOMCharacterData node + * @link http://php.net/manual/en/domcharacterdata.replacedata.php + * @param int $offset

+ * The offset from which to start replacing. + *

+ * @param int $count

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param string $data

+ * The string with which the range must be replaced. + *

+ * @return void No value is returned. + */ + public function replaceData ($offset, $count, $data) {} + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * DOMAttr represents an attribute in the + * DOMElement object. + * @link http://php.net/manual/en/class.domattr.php + * @jms-builtin + */ +class DOMAttr extends DOMNode { + + /** + * (PHP 5)
+ * Checks if attribute is a defined ID + * @link http://php.net/manual/en/domattr.isid.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isId () {} + + /** + * (PHP 5)
+ * Creates a new DOMAttr object + * @link http://php.net/manual/en/domattr.construct.php + * @param string $name

+ * The tag name of the attribute. + *

+ * @param string $value [optional]

+ * The value of the attribute. + *

+ */ + public function __construct ($name, $value = null) {} + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * @link http://php.net/manual/en/class.domelement.php + * @jms-builtin + */ +class DOMElement extends DOMNode { + + /** + * (PHP 5)
+ * Returns value of attribute + * @link http://php.net/manual/en/domelement.getattribute.php + * @param string $name

+ * The name of the attribute. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given name is found. + */ + public function getAttribute ($name) {} + + /** + * (PHP 5)
+ * Adds new attribute + * @link http://php.net/manual/en/domelement.setattribute.php + * @param string $name

+ * The name of the attribute. + *

+ * @param string $value

+ * The value of the attribute. + *

+ * @return DOMAttr The new DOMAttr or FALSE if an error occured. + */ + public function setAttribute ($name, $value) {} + + /** + * (PHP 5)
+ * Removes attribute + * @link http://php.net/manual/en/domelement.removeattribute.php + * @param string $name

+ * The name of the attribute. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function removeAttribute ($name) {} + + /** + * (PHP 5)
+ * Returns attribute node + * @link http://php.net/manual/en/domelement.getattributenode.php + * @param string $name

+ * The name of the attribute. + *

+ * @return DOMAttr The attribute node. + */ + public function getAttributeNode ($name) {} + + /** + * (PHP 5)
+ * Adds new attribute node to element + * @link http://php.net/manual/en/domelement.setattributenode.php + * @param DOMAttr $attr

+ * The attribute node. + *

+ * @return DOMAttr old node if the attribute has been replaced or NULL. + */ + public function setAttributeNode (DOMAttr $attr) {} + + /** + * (PHP 5)
+ * Removes attribute + * @link http://php.net/manual/en/domelement.removeattributenode.php + * @param DOMAttr $oldnode

+ * The attribute node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function removeAttributeNode (DOMAttr $oldnode) {} + + /** + * (PHP 5)
+ * Gets elements by tagname + * @link http://php.net/manual/en/domelement.getelementsbytagname.php + * @param string $name

+ * The tag name. Use * to return all elements within + * the element tree. + *

+ * @return DOMNodeList This function returns a new instance of the class + * DOMNodeList of all matched elements. + */ + public function getElementsByTagName ($name) {} + + /** + * (PHP 5)
+ * Returns value of attribute + * @link http://php.net/manual/en/domelement.getattributens.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @param string $localName

+ * The local name. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given localName and namespaceURI + * is found. + */ + public function getAttributeNS ($namespaceURI, $localName) {} + + /** + * (PHP 5)
+ * Adds new attribute + * @link http://php.net/manual/en/domelement.setattributens.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @param string $qualifiedName

+ * The qualified name of the attribute, as prefix:tagname. + *

+ * @param string $value

+ * The value of the attribute. + *

+ * @return void No value is returned. + */ + public function setAttributeNS ($namespaceURI, $qualifiedName, $value) {} + + /** + * (PHP 5)
+ * Removes attribute + * @link http://php.net/manual/en/domelement.removeattributens.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @param string $localName

+ * The local name. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function removeAttributeNS ($namespaceURI, $localName) {} + + /** + * (PHP 5)
+ * Returns attribute node + * @link http://php.net/manual/en/domelement.getattributenodens.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @param string $localName

+ * The local name. + *

+ * @return DOMAttr The attribute node. + */ + public function getAttributeNodeNS ($namespaceURI, $localName) {} + + /** + * (PHP 5)
+ * Adds new attribute node to element + * @link http://php.net/manual/en/domelement.setattributenodens.php + * @param DOMAttr $attr

+ * The attribute node. + *

+ * @return DOMAttr the old node if the attribute has been replaced. + */ + public function setAttributeNodeNS (DOMAttr $attr) {} + + /** + * (PHP 5)
+ * Get elements by namespaceURI and localName + * @link http://php.net/manual/en/domelement.getelementsbytagnamens.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @param string $localName

+ * The local name. Use * to return all elements within + * the element tree. + *

+ * @return DOMNodeList This function returns a new instance of the class + * DOMNodeList of all matched elements in the order in + * which they are encountered in a preorder traversal of this element tree. + */ + public function getElementsByTagNameNS ($namespaceURI, $localName) {} + + /** + * (PHP 5)
+ * Checks to see if attribute exists + * @link http://php.net/manual/en/domelement.hasattribute.php + * @param string $name

+ * The attribute name. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttribute ($name) {} + + /** + * (PHP 5)
+ * Checks to see if attribute exists + * @link http://php.net/manual/en/domelement.hasattributens.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @param string $localName

+ * The local name. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributeNS ($namespaceURI, $localName) {} + + /** + * (PHP 5)
+ * Declares the attribute specified by name to be of type ID + * @link http://php.net/manual/en/domelement.setidattribute.php + * @param string $name

+ * The name of the attribute. + *

+ * @param bool $isId

+ * Set it to TRUE if you want name to be of type + * ID, FALSE otherwise. + *

+ * @return void No value is returned. + */ + public function setIdAttribute ($name, $isId) {} + + /** + * (PHP 5)
+ * Declares the attribute specified by local name and namespace URI to be of type ID + * @link http://php.net/manual/en/domelement.setidattributens.php + * @param string $namespaceURI

+ * The namespace URI of the attribute. + *

+ * @param string $localName

+ * The local name of the attribute, as prefix:tagname. + *

+ * @param bool $isId

+ * Set it to TRUE if you want name to be of type + * ID, FALSE otherwise. + *

+ * @return void No value is returned. + */ + public function setIdAttributeNS ($namespaceURI, $localName, $isId) {} + + /** + * (PHP 5)
+ * Declares the attribute specified by node to be of type ID + * @link http://php.net/manual/en/domelement.setidattributenode.php + * @param DOMAttr $attr

+ * The attribute node. + *

+ * @param bool $isId

+ * Set it to TRUE if you want name to be of type + * ID, FALSE otherwise. + *

+ * @return void No value is returned. + */ + public function setIdAttributeNode (DOMAttr $attr, $isId) {} + + /** + * (PHP 5)
+ * Creates a new DOMElement object + * @link http://php.net/manual/en/domelement.construct.php + * @param string $name

+ * The tag name of the element. When also passing in namespaceURI, the element name + * may take a prefix to be associated with the URI. + *

+ * @param string $value [optional]

+ * The value of the element. + *

+ * @param string $namespaceURI [optional]

+ * A namespace URI to create the element within a specific namespace. + *

+ */ + public function __construct ($name, $value = null, $namespaceURI = null) {} + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * The DOMText class inherits from + * DOMCharacterData and represents the textual + * content of a DOMElement or + * DOMAttr. + * @link http://php.net/manual/en/class.domtext.php + * @jms-builtin + */ +class DOMText extends DOMCharacterData { + + /** + * (PHP 5)
+ * Breaks this node into two nodes at the specified offset + * @link http://php.net/manual/en/domtext.splittext.php + * @param int $offset

+ * The offset at which to split, starting from 0. + *

+ * @return DOMText The new node of the same type, which contains all the content at and after the + * offset. + */ + public function splitText ($offset) {} + + /** + * (PHP 5)
+ * Indicates whether this text node contains whitespace + * @link http://php.net/manual/en/domtext.iswhitespaceinelementcontent.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isWhitespaceInElementContent () {} + + public function isElementContentWhitespace () {} + + /** + * @param $content + */ + public function replaceWholeText ($content) {} + + /** + * (PHP 5)
+ * Creates a new DOMText object + * @link http://php.net/manual/en/domtext.construct.php + * @param $value [optional] + */ + public function __construct ($value) {} + + /** + * (PHP 5)
+ * Extracts a range of data from the node + * @link http://php.net/manual/en/domcharacterdata.substringdata.php + * @param int $offset

+ * Start offset of substring to extract. + *

+ * @param int $count

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * (PHP 5)
+ * Append the string to the end of the character data of the node + * @link http://php.net/manual/en/domcharacterdata.appenddata.php + * @param string $data

+ * The string to append. + *

+ * @return void No value is returned. + */ + public function appendData ($data) {} + + /** + * (PHP 5)
+ * Insert a string at the specified 16-bit unit offset + * @link http://php.net/manual/en/domcharacterdata.insertdata.php + * @param int $offset

+ * The character offset at which to insert. + *

+ * @param string $data

+ * The string to insert. + *

+ * @return void No value is returned. + */ + public function insertData ($offset, $data) {} + + /** + * (PHP 5)
+ * Remove a range of characters from the node + * @link http://php.net/manual/en/domcharacterdata.deletedata.php + * @param int $offset

+ * The offset from which to start removing. + *

+ * @param int $count

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void No value is returned. + */ + public function deleteData ($offset, $count) {} + + /** + * (PHP 5)
+ * Replace a substring within the DOMCharacterData node + * @link http://php.net/manual/en/domcharacterdata.replacedata.php + * @param int $offset

+ * The offset from which to start replacing. + *

+ * @param int $count

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param string $data

+ * The string with which the range must be replaced. + *

+ * @return void No value is returned. + */ + public function replaceData ($offset, $count, $data) {} + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * Represents comment nodes, characters delimited by <!-- + * and -->. + * @link http://php.net/manual/en/class.domcomment.php + * @jms-builtin + */ +class DOMComment extends DOMCharacterData { + + /** + * (PHP 5)
+ * Creates a new DOMComment object + * @link http://php.net/manual/en/domcomment.construct.php + * @param string $value [optional]

+ * The value of the comment. + *

+ */ + public function __construct ($value = null) {} + + /** + * (PHP 5)
+ * Extracts a range of data from the node + * @link http://php.net/manual/en/domcharacterdata.substringdata.php + * @param int $offset

+ * Start offset of substring to extract. + *

+ * @param int $count

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * (PHP 5)
+ * Append the string to the end of the character data of the node + * @link http://php.net/manual/en/domcharacterdata.appenddata.php + * @param string $data

+ * The string to append. + *

+ * @return void No value is returned. + */ + public function appendData ($data) {} + + /** + * (PHP 5)
+ * Insert a string at the specified 16-bit unit offset + * @link http://php.net/manual/en/domcharacterdata.insertdata.php + * @param int $offset

+ * The character offset at which to insert. + *

+ * @param string $data

+ * The string to insert. + *

+ * @return void No value is returned. + */ + public function insertData ($offset, $data) {} + + /** + * (PHP 5)
+ * Remove a range of characters from the node + * @link http://php.net/manual/en/domcharacterdata.deletedata.php + * @param int $offset

+ * The offset from which to start removing. + *

+ * @param int $count

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void No value is returned. + */ + public function deleteData ($offset, $count) {} + + /** + * (PHP 5)
+ * Replace a substring within the DOMCharacterData node + * @link http://php.net/manual/en/domcharacterdata.replacedata.php + * @param int $offset

+ * The offset from which to start replacing. + *

+ * @param int $count

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param string $data

+ * The string with which the range must be replaced. + *

+ * @return void No value is returned. + */ + public function replaceData ($offset, $count, $data) {} + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** @jms-builtin */ +class DOMTypeinfo { +} + +/** @jms-builtin */ +class DOMUserDataHandler { + + public function handle () {} + +} + +/** @jms-builtin */ +class DOMDomError { +} + +/** @jms-builtin */ +class DOMErrorHandler { + + /** + * @param DOMError $error + */ + public function handleError (DOMError $error) {} + +} + +/** @jms-builtin */ +class DOMLocator { +} + +/** @jms-builtin */ +class DOMConfiguration { + + /** + * @param $name + * @param $value + */ + public function setParameter ($name, $value) {} + + /** + * @param $name [optional] + */ + public function getParameter ($name) {} + + /** + * @param $name [optional] + * @param $value [optional] + */ + public function canSetParameter ($name, $value) {} + +} + +/** + * The DOMCdataSection inherits from + * DOMText for textural representation + * of CData constructs. + * @link http://php.net/manual/en/class.domcdatasection.php + * @jms-builtin + */ +class DOMCdataSection extends DOMText { + + /** + * (PHP 5)
+ * Constructs a new DOMCdataSection object + * @link http://php.net/manual/en/domcdatasection.construct.php + * @param $value + */ + public function __construct ($value) {} + + /** + * (PHP 5)
+ * Breaks this node into two nodes at the specified offset + * @link http://php.net/manual/en/domtext.splittext.php + * @param int $offset

+ * The offset at which to split, starting from 0. + *

+ * @return DOMText The new node of the same type, which contains all the content at and after the + * offset. + */ + public function splitText ($offset) {} + + /** + * (PHP 5)
+ * Indicates whether this text node contains whitespace + * @link http://php.net/manual/en/domtext.iswhitespaceinelementcontent.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isWhitespaceInElementContent () {} + + public function isElementContentWhitespace () {} + + /** + * @param $content + */ + public function replaceWholeText ($content) {} + + /** + * (PHP 5)
+ * Extracts a range of data from the node + * @link http://php.net/manual/en/domcharacterdata.substringdata.php + * @param int $offset

+ * Start offset of substring to extract. + *

+ * @param int $count

+ * The number of characters to extract. + *

+ * @return string The specified substring. If the sum of offset + * and count exceeds the length, then all 16-bit units + * to the end of the data are returned. + */ + public function substringData ($offset, $count) {} + + /** + * (PHP 5)
+ * Append the string to the end of the character data of the node + * @link http://php.net/manual/en/domcharacterdata.appenddata.php + * @param string $data

+ * The string to append. + *

+ * @return void No value is returned. + */ + public function appendData ($data) {} + + /** + * (PHP 5)
+ * Insert a string at the specified 16-bit unit offset + * @link http://php.net/manual/en/domcharacterdata.insertdata.php + * @param int $offset

+ * The character offset at which to insert. + *

+ * @param string $data

+ * The string to insert. + *

+ * @return void No value is returned. + */ + public function insertData ($offset, $data) {} + + /** + * (PHP 5)
+ * Remove a range of characters from the node + * @link http://php.net/manual/en/domcharacterdata.deletedata.php + * @param int $offset

+ * The offset from which to start removing. + *

+ * @param int $count

+ * The number of characters to delete. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are deleted. + *

+ * @return void No value is returned. + */ + public function deleteData ($offset, $count) {} + + /** + * (PHP 5)
+ * Replace a substring within the DOMCharacterData node + * @link http://php.net/manual/en/domcharacterdata.replacedata.php + * @param int $offset

+ * The offset from which to start replacing. + *

+ * @param int $count

+ * The number of characters to replace. If the sum of + * offset and count exceeds + * the length, then all characters to the end of the data are replaced. + *

+ * @param string $data

+ * The string with which the range must be replaced. + *

+ * @return void No value is returned. + */ + public function replaceData ($offset, $count, $data) {} + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * Each DOMDocument has a doctype + * attribute whose value is either NULL or a DOMDocumentType object. + * @link http://php.net/manual/en/class.domdocumenttype.php + * @jms-builtin + */ +class DOMDocumentType extends DOMNode { + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * @link http://php.net/manual/en/class.domnotation.php + * @jms-builtin + */ +class DOMNotation extends DOMNode { + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * This interface represents a known entity, either parsed or unparsed, in an XML document. + * @link http://php.net/manual/en/class.domentity.php + * @jms-builtin + */ +class DOMEntity extends DOMNode { + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * @link http://php.net/manual/en/class.domentityreference.php + * @jms-builtin + */ +class DOMEntityReference extends DOMNode { + + /** + * (PHP 5)
+ * Creates a new DOMEntityReference object + * @link http://php.net/manual/en/domentityreference.construct.php + * @param string $name

+ * The name of the entity reference. + *

+ */ + public function __construct ($name) {} + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** + * @link http://php.net/manual/en/class.domprocessinginstruction.php + * @jms-builtin + */ +class DOMProcessingInstruction extends DOMNode { + + /** + * (PHP 5)
+ * Creates a new DOMProcessingInstruction object + * @link http://php.net/manual/en/domprocessinginstruction.construct.php + * @param string $name

+ * The tag name of the processing instruction. + *

+ * @param string $value [optional]

+ * The value of the processing instruction. + *

+ */ + public function __construct ($name, $value = null) {} + + /** + * (PHP 5)
+ * Adds a new child before a reference node + * @link http://php.net/manual/en/domnode.insertbefore.php + * @param DOMNode $newnode

+ * The new node. + *

+ * @param DOMNode $refnode [optional]

+ * The reference node. If not supplied, newnode is + * appended to the children. + *

+ * @return DOMNode The inserted node. + */ + public function insertBefore (DOMNode $newnode, DOMNode $refnode = null) {} + + /** + * (PHP 5)
+ * Replaces a child + * @link http://php.net/manual/en/domnode.replacechild.php + * @param DOMNode $newnode

+ * The new node. It must be a member of the target document, i.e. + * created by one of the DOMDocument->createXXX() methods or imported in + * the document by . + *

+ * @param DOMNode $oldnode

+ * The old node. + *

+ * @return DOMNode The old node or FALSE if an error occur. + */ + public function replaceChild (DOMNode $newnode, DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Removes child from list of children + * @link http://php.net/manual/en/domnode.removechild.php + * @param DOMNode $oldnode

+ * The removed child. + *

+ * @return DOMNode If the child could be removed the function returns the old child. + */ + public function removeChild (DOMNode $oldnode) {} + + /** + * (PHP 5)
+ * Adds new child at the end of the children + * @link http://php.net/manual/en/domnode.appendchild.php + * @param DOMNode $newnode

+ * The appended child. + *

+ * @return DOMNode The node added. + */ + public function appendChild (DOMNode $newnode) {} + + /** + * (PHP 5)
+ * Checks if node has children + * @link http://php.net/manual/en/domnode.haschildnodes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasChildNodes () {} + + /** + * (PHP 5)
+ * Clones a node + * @link http://php.net/manual/en/domnode.clonenode.php + * @param bool $deep [optional]

+ * Indicates whether to copy all descendant nodes. This parameter is + * defaulted to FALSE. + *

+ * @return DOMNode The cloned node. + */ + public function cloneNode ($deep = null) {} + + /** + * (PHP 5)
+ * Normalizes the node + * @link http://php.net/manual/en/domnode.normalize.php + * @return void No value is returned. + */ + public function normalize () {} + + /** + * (PHP 5)
+ * Checks if feature is supported for specified version + * @link http://php.net/manual/en/domnode.issupported.php + * @param string $feature

+ * The feature to test. See the example of + * DOMImplementation::hasFeature for a + * list of features. + *

+ * @param string $version

+ * The version number of the feature to test. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSupported ($feature, $version) {} + + /** + * (PHP 5)
+ * Checks if node has attributes + * @link http://php.net/manual/en/domnode.hasattributes.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasAttributes () {} + + /** + * @param DOMNode $other + */ + public function compareDocumentPosition (DOMNode $other) {} + + /** + * (PHP 5)
+ * Indicates if two nodes are the same node + * @link http://php.net/manual/en/domnode.issamenode.php + * @param DOMNode $node

+ * The compared node. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function isSameNode (DOMNode $node) {} + + /** + * (PHP 5)
+ * Gets the namespace prefix of the node based on the namespace URI + * @link http://php.net/manual/en/domnode.lookupprefix.php + * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The prefix of the namespace. + */ + public function lookupPrefix ($namespaceURI) {} + + /** + * (PHP 5)
+ * Checks if the specified namespaceURI is the default namespace or not + * @link http://php.net/manual/en/domnode.isdefaultnamespace.php + * @param string $namespaceURI

+ * The namespace URI to look for. + *

+ * @return bool Return TRUE if namespaceURI is the default + * namespace, FALSE otherwise. + */ + public function isDefaultNamespace ($namespaceURI) {} + + /** + * (PHP 5)
+ * Gets the namespace URI of the node based on the prefix + * @link http://php.net/manual/en/domnode.lookupnamespaceuri.php + * @param string $prefix

+ * The prefix of the namespace. + *

+ * @return string The namespace URI of the node. + */ + public function lookupNamespaceUri ($prefix) {} + + /** + * @param DOMNode $arg + */ + public function isEqualNode (DOMNode $arg) {} + + /** + * @param $feature + * @param $version + */ + public function getFeature ($feature, $version) {} + + /** + * @param $key + * @param $data + * @param $handler + */ + public function setUserData ($key, $data, $handler) {} + + /** + * @param $key + */ + public function getUserData ($key) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Get an XPath for a node + * @link http://php.net/manual/en/domnode.getnodepath.php + * @return string a string containing the XPath, or NULL in case of an error. + */ + public function getNodePath () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Get line number for a node + * @link http://php.net/manual/en/domnode.getlineno.php + * @return int Always returns the line number where the node was defined in. + */ + public function getLineNo () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a string + * @link http://php.net/manual/en/domnode.c14n.php + * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return string canonicalized nodes as a string or FALSE on failure + */ + public function C14N ($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Canonicalize nodes to a file + * @link http://php.net/manual/en/domnode.c14nfile.php + * @param string $uri

+ * Path to write the output to. + *

+ * @param bool $exclusive [optional]

+ * Enable exclusive parsing of only the nodes matched by the provided + * xpath or namespace prefixes. + *

+ * @param bool $with_comments [optional]

+ * Retain comments in output. + *

+ * @param array $xpath [optional]

+ * An array of xpaths to filter the nodes by. + *

+ * @param array $ns_prefixes [optional]

+ * An array of namespace prefixes to filter the nodes by. + *

+ * @return int Number of bytes written or FALSE on failure + */ + public function C14NFile ($uri, $exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) {} + +} + +/** @jms-builtin */ +class DOMStringExtend { + + /** + * @param $offset32 + */ + public function findOffset16 ($offset32) {} + + /** + * @param $offset16 + */ + public function findOffset32 ($offset16) {} + +} + +/** + * Supports XPath 1.0 + * @link http://php.net/manual/en/class.domxpath.php + * @jms-builtin + */ +class DOMXPath { + + /** + * (PHP 5)
+ * Creates a new DOMXPath object + * @link http://php.net/manual/en/domxpath.construct.php + * @param DOMDocument $doc

+ * The DOMDocument associated with the + * DOMXPath. + *

+ */ + public function __construct (DOMDocument $doc) {} + + /** + * (PHP 5)
+ * Registers the namespace with the DOMXPath object + * @link http://php.net/manual/en/domxpath.registernamespace.php + * @param string $prefix

+ * The prefix. + *

+ * @param string $namespaceURI

+ * The URI of the namespace. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function registerNamespace ($prefix, $namespaceURI) {} + + /** + * (PHP 5)
+ * Evaluates the given XPath expression + * @link http://php.net/manual/en/domxpath.query.php + * @param string $expression

+ * The XPath expression to execute. + *

+ * @param DOMNode $contextnode [optional]

+ * The optional contextnode can be specified for + * doing relative XPath queries. By default, the queries are relative to + * the root element. + *

+ * @param bool $registerNodeNS [optional]

+ * The optional registerNodeNS can be specified to + * disable automatic registration of the context node. + *

+ * @return DOMNodeList a DOMNodeList containing all nodes matching + * the given XPath expression. Any expression which + * does not return nodes will return an empty + * DOMNodeList. + *

+ *

+ * If the expression is malformed or the + * contextnode is invalid, + * DOMXPath::query returns FALSE. + */ + public function query ($expression, DOMNode $contextnode = null, $registerNodeNS = true) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Evaluates the given XPath expression and returns a typed result if possible + * @link http://php.net/manual/en/domxpath.evaluate.php + * @param string $expression

+ * The XPath expression to execute. + *

+ * @param DOMNode $contextnode [optional]

+ * The optional contextnode can be specified for + * doing relative XPath queries. By default, the queries are relative to + * the root element. + *

+ * @param bool $registerNodeNS [optional]

+ * The optional registerNodeNS can be specified to + * disable automatic registration of the context node. + *

+ * @return mixed a typed result if possible or a DOMNodeList + * containing all nodes matching the given XPath expression. + *

+ *

+ * If the expression is malformed or the + * contextnode is invalid, + * DOMXPath::evaluate returns FALSE. + */ + public function evaluate ($expression, DOMNode $contextnode = null, $registerNodeNS = true) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Register PHP functions as XPath functions + * @link http://php.net/manual/en/domxpath.registerphpfunctions.php + * @param mixed $restrict [optional]

+ * Use this parameter to only allow certain functions to be called from XPath. + *

+ *

+ * This parameter can be either a string (a function name) or + * an array of function names. + *

+ * @return void No value is returned. + */ + public function registerPhpFunctions ($restrict = null) {} + +} + +/** + * (PHP 5)
+ * Gets a DOMElement object from a +SimpleXMLElement object + * @link http://php.net/manual/en/function.dom-import-simplexml.php + * @param SimpleXMLElement $node

+ * The SimpleXMLElement node. + *

+ * @return DOMElement The DOMElement node added or FALSE if any errors occur. + * @jms-builtin + */ +function dom_import_simplexml (SimpleXMLElement $node) {} + + +/** + * Node is a DOMElement + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_ELEMENT_NODE', 1); + +/** + * Node is a DOMAttr + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_ATTRIBUTE_NODE', 2); + +/** + * Node is a DOMText + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_TEXT_NODE', 3); + +/** + * Node is a DOMCharacterData + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_CDATA_SECTION_NODE', 4); + +/** + * Node is a DOMEntityReference + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_ENTITY_REF_NODE', 5); + +/** + * Node is a DOMEntity + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_ENTITY_NODE', 6); + +/** + * Node is a DOMProcessingInstruction + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_PI_NODE', 7); + +/** + * Node is a DOMComment + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_COMMENT_NODE', 8); + +/** + * Node is a DOMDocument + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_DOCUMENT_NODE', 9); + +/** + * Node is a DOMDocumentType + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_DOCUMENT_TYPE_NODE', 10); + +/** + * Node is a DOMDocumentFragment + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_DOCUMENT_FRAG_NODE', 11); + +/** + * Node is a DOMNotation + * @link http://php.net/manual/en/dom.constants.php + */ +define ('XML_NOTATION_NODE', 12); +define ('XML_HTML_DOCUMENT_NODE', 13); +define ('XML_DTD_NODE', 14); +define ('XML_ELEMENT_DECL_NODE', 15); +define ('XML_ATTRIBUTE_DECL_NODE', 16); +define ('XML_ENTITY_DECL_NODE', 17); +define ('XML_NAMESPACE_DECL_NODE', 18); +define ('XML_LOCAL_NAMESPACE', 18); +define ('XML_ATTRIBUTE_CDATA', 1); +define ('XML_ATTRIBUTE_ID', 2); +define ('XML_ATTRIBUTE_IDREF', 3); +define ('XML_ATTRIBUTE_IDREFS', 4); +define ('XML_ATTRIBUTE_ENTITY', 6); +define ('XML_ATTRIBUTE_NMTOKEN', 7); +define ('XML_ATTRIBUTE_NMTOKENS', 8); +define ('XML_ATTRIBUTE_ENUMERATION', 9); +define ('XML_ATTRIBUTE_NOTATION', 10); + +/** + * Error code not part of the DOM specification. Meant for PHP errors. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_PHP_ERR', 0); + +/** + * If index or size is negative, or greater than the allowed value. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_INDEX_SIZE_ERR', 1); + +/** + * If the specified range of text does not fit into a + * DOMString. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOMSTRING_SIZE_ERR', 2); + +/** + * If any node is inserted somewhere it doesn't belong + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_HIERARCHY_REQUEST_ERR', 3); + +/** + * If a node is used in a different document than the one that created it. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_WRONG_DOCUMENT_ERR', 4); + +/** + * If an invalid or illegal character is specified, such as in a name. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_CHARACTER_ERR', 5); + +/** + * If data is specified for a node which does not support data. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_NO_DATA_ALLOWED_ERR', 6); + +/** + * If an attempt is made to modify an object where modifications are not allowed. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_NO_MODIFICATION_ALLOWED_ERR', 7); + +/** + * If an attempt is made to reference a node in a context where it does not exist. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_NOT_FOUND_ERR', 8); + +/** + * If the implementation does not support the requested type of object or operation. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_NOT_SUPPORTED_ERR', 9); + +/** + * If an attempt is made to add an attribute that is already in use elsewhere. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_INUSE_ATTRIBUTE_ERR', 10); + +/** + * If an attempt is made to use an object that is not, or is no longer, usable. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_STATE_ERR', 11); + +/** + * If an invalid or illegal string is specified. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_SYNTAX_ERR', 12); + +/** + * If an attempt is made to modify the type of the underlying object. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_MODIFICATION_ERR', 13); + +/** + * If an attempt is made to create or change an object in a way which is + * incorrect with regard to namespaces. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_NAMESPACE_ERR', 14); + +/** + * If a parameter or an operation is not supported by the underlying object. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_INVALID_ACCESS_ERR', 15); + +/** + * If a call to a method such as insertBefore or removeChild would make the Node + * invalid with respect to "partial validity", this exception would be raised and + * the operation would not be done. + * @link http://php.net/manual/en/dom.constants.php + */ +define ('DOM_VALIDATION_ERR', 16); + +// End of dom v.20031129 +?> diff --git a/res/php-5.4-core-api/enchant.php b/res/php-5.4-core-api/enchant.php new file mode 100644 index 0000000..d308c0a --- /dev/null +++ b/res/php-5.4-core-api/enchant.php @@ -0,0 +1,294 @@ + + * create a new broker object capable of requesting + * @link http://php.net/manual/en/function.enchant-broker-init.php + * @return resource a broker resource on success or FALSE. + * @jms-builtin + */ +function enchant_broker_init () {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * Free the broker resource and its dictionnaries + * @link http://php.net/manual/en/function.enchant-broker-free.php + * @param resource $broker

+ * Broker resource + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function enchant_broker_free ($broker) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * Returns the last error of the broker + * @link http://php.net/manual/en/function.enchant-broker-get-error.php + * @param resource $broker

+ * Broker resource. + *

+ * @return string Return the msg string if an error was found or FALSE + * @jms-builtin + */ +function enchant_broker_get_error ($broker) {} + +/** + * @param $broker + * @param $name + * @param $value + * @jms-builtin + */ +function enchant_broker_set_dict_path ($broker, $name, $value) {} + +/** + * @param $broker + * @param $name + * @jms-builtin + */ +function enchant_broker_get_dict_path ($broker, $name) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 1.0.1)
+ * Returns a list of available dictionaries + * @link http://php.net/manual/en/function.enchant-broker-list-dicts.php + * @param resource $broker

+ * Broker resource + *

+ * @return mixed TRUE on success or FALSE on failure. + * @jms-builtin + */ +function enchant_broker_list_dicts ($broker) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * create a new dictionary using a tag + * @link http://php.net/manual/en/function.enchant-broker-request-dict.php + * @param resource $broker

+ * Broker resource + *

+ * @param string $tag

+ * A tag describing the locale, for example en_US, de_DE + *

+ * @return resource a dictionary resource on success or FALSE on failure. + * @jms-builtin + */ +function enchant_broker_request_dict ($broker, $tag) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * creates a dictionary using a PWL file + * @link http://php.net/manual/en/function.enchant-broker-request-pwl-dict.php + * @param resource $broker

+ * Broker resource + *

+ * @param string $filename

+ * Path to the PWL file. + *

+ * @return resource a dictionary resource on success or FALSE on failure. + * @jms-builtin + */ +function enchant_broker_request_pwl_dict ($broker, $filename) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * Free a dictionary resource + * @link http://php.net/manual/en/function.enchant-broker-free-dict.php + * @param resource $dict

+ * Dictionary resource. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function enchant_broker_free_dict ($dict) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * Whether a dictionary exists or not. Using non-empty tag + * @link http://php.net/manual/en/function.enchant-broker-dict-exists.php + * @param resource $broker

+ * Broker resource + *

+ * @param string $tag

+ * non-empty tag in the LOCALE format, ex: us_US, ch_DE, etc. + *

+ * @return bool TRUE when the tag exist or FALSE when not. + * @jms-builtin + */ +function enchant_broker_dict_exists ($broker, $tag) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * Declares a preference of dictionaries to use for the language + * @link http://php.net/manual/en/function.enchant-broker-set-ordering.php + * @param resource $broker

+ * Broker resource + *

+ * @param string $tag

+ * Language tag. The special "*" tag can be used as a language tag + * to declare a default ordering for any language that does not + * explicitly declare an ordering. + *

+ * @param string $ordering

+ * Comma delimited list of provider names + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function enchant_broker_set_ordering ($broker, $tag, $ordering) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0)
+ * Enumerates the Enchant providers + * @link http://php.net/manual/en/function.enchant-broker-describe.php + * @param resource $broker

+ * Broker resource + *

+ * @return array TRUE on success or FALSE on failure. + * @jms-builtin + */ +function enchant_broker_describe ($broker) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * Check whether a word is correctly spelled or not + * @link http://php.net/manual/en/function.enchant-dict-check.php + * @param resource $dict

+ * Dictionary resource + *

+ * @param string $word

+ * The word to check + *

+ * @return bool TRUE if the word is spelled correctly, FALSE if not. + * @jms-builtin + */ +function enchant_dict_check ($dict, $word) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * Will return a list of values if any of those pre-conditions are not met + * @link http://php.net/manual/en/function.enchant-dict-suggest.php + * @param resource $dict

+ * Dictionary resource + *

+ * @param string $word

+ * Word to use for the suggestions. + *

+ * @return array Will returns an array of suggestions if the word is bad spelled. + * @jms-builtin + */ +function enchant_dict_suggest ($dict, $word) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * add a word to personal word list + * @link http://php.net/manual/en/function.enchant-dict-add-to-personal.php + * @param resource $dict

+ * Dictionary resource + *

+ * @param string $word

+ * The word to add + *

+ * @return void TRUE on success or FALSE on failure. + * @jms-builtin + */ +function enchant_dict_add_to_personal ($dict, $word) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * add 'word' to this spell-checking session + * @link http://php.net/manual/en/function.enchant-dict-add-to-session.php + * @param resource $dict

+ * Dictionary resource + *

+ * @param string $word

+ * The word to add + *

+ * @return void TRUE on success or FALSE on failure. + * @jms-builtin + */ +function enchant_dict_add_to_session ($dict, $word) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * whether or not 'word' exists in this spelling-session + * @link http://php.net/manual/en/function.enchant-dict-is-in-session.php + * @param resource $dict

+ * Dictionary resource + *

+ * @param string $word

+ * The word to lookup + *

+ * @return bool TRUE if the word exists or FALSE + * @jms-builtin + */ +function enchant_dict_is_in_session ($dict, $word) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * Add a correction for a word + * @link http://php.net/manual/en/function.enchant-dict-store-replacement.php + * @param resource $dict

+ * Dictionary resource + *

+ * @param string $mis

+ * The work to fix + *

+ * @param string $cor

+ * The correct word + *

+ * @return void TRUE on success or FALSE on failure. + * @jms-builtin + */ +function enchant_dict_store_replacement ($dict, $mis, $cor) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * Returns the last error of the current spelling-session + * @link http://php.net/manual/en/function.enchant-dict-get-error.php + * @param resource $dict

+ * Dictinaray resource + *

+ * @return string the error message as string or FALSE if no error occurred. + * @jms-builtin + */ +function enchant_dict_get_error ($dict) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant >= 0.1.0 )
+ * Describes an individual dictionary + * @link http://php.net/manual/en/function.enchant-dict-describe.php + * @param resource $dict

+ * Dictinaray resource + *

+ * @return mixed TRUE on success or FALSE on failure. + * @jms-builtin + */ +function enchant_dict_describe ($dict) {} + +/** + * (PHP 5 >= 5.3.0, PECL enchant:0.2.0-1.0.1)
+ * Check the word is correctly spelled and provide suggestions + * @link http://php.net/manual/en/function.enchant-dict-quick-check.php + * @param resource $dict

+ * Dictionary resource + *

+ * @param string $word

+ * The word to check + *

+ * @param array $suggestions [optional]

+ * If the word is not correctly spelled, this variable will + * contain an array of suggestions. + *

+ * @return bool TRUE if the word is correctly spelled or FALSE + * @jms-builtin + */ +function enchant_dict_quick_check ($dict, $word, array &$suggestions = null) {} + +define ('ENCHANT_MYSPELL', 1); +define ('ENCHANT_ISPELL', 2); + +// End of enchant v.1.1.0 +?> diff --git a/res/php-5.4-core-api/ereg.php b/res/php-5.4-core-api/ereg.php new file mode 100644 index 0000000..9494b73 --- /dev/null +++ b/res/php-5.4-core-api/ereg.php @@ -0,0 +1,223 @@ + + * Regular expression match + * @link http://php.net/manual/en/function.ereg.php + * @param string $pattern

+ * Case sensitive regular expression. + *

+ * @param string $string

+ * The input string. + *

+ * @param array $regs [optional]

+ * If matches are found for parenthesized substrings of + * pattern and the function is called with the + * third argument regs, the matches will be stored + * in the elements of the array regs. + *

+ *

+ * $regs[1] will contain the substring which starts at + * the first left parenthesis; $regs[2] will contain + * the substring starting at the second, and so on. + * $regs[0] will contain a copy of the complete string + * matched. + *

+ * @return int the length of the matched string if a match for + * pattern was found in string, + * or FALSE if no matches were found or an error occurred. + *

+ *

+ * If the optional parameter regs was not passed or + * the length of the matched string is 0, this function returns 1. + * @jms-builtin + */ +function ereg ($pattern, $string, array &$regs = null) {} + +/** + * (PHP 4, PHP 5)
+ * Replace regular expression + * @link http://php.net/manual/en/function.ereg-replace.php + * @param string $pattern

+ * A POSIX extended regular expression. + *

+ * @param string $replacement

+ * If pattern contains parenthesized substrings, + * replacement may contain substrings of the form + * \digit, which will be + * replaced by the text matching the digit'th parenthesized substring; + * \0 will produce the entire contents of string. + * Up to nine substrings may be used. Parentheses may be nested, in which + * case they are counted by the opening parenthesis. + *

+ * @param string $string

+ * The input string. + *

+ * @return string The modified string is returned. If no matches are found in + * string, then it will be returned unchanged. + * @jms-builtin + */ +function ereg_replace ($pattern, $replacement, $string) {} + +/** + * (PHP 4, PHP 5)
+ * Case insensitive regular expression match + * @link http://php.net/manual/en/function.eregi.php + * @param string $pattern

+ * Case insensitive regular expression. + *

+ * @param string $string

+ * The input string. + *

+ * @param array $regs [optional]

+ * If matches are found for parenthesized substrings of + * pattern and the function is called with the + * third argument regs, the matches will be stored + * in the elements of the array regs. + *

+ *

+ * $regs[1] will contain the substring which starts at the first left + * parenthesis; $regs[2] will contain the substring starting at the + * second, and so on. $regs[0] will contain a copy of the complete string + * matched. + *

+ * @return int the length of the matched string if a match for + * pattern was found in string, + * or FALSE if no matches were found or an error occurred. + *

+ *

+ * If the optional parameter regs was not passed or + * the length of the matched string is 0, this function returns 1. + * @jms-builtin + */ +function eregi ($pattern, $string, array &$regs = null) {} + +/** + * (PHP 4, PHP 5)
+ * Replace regular expression case insensitive + * @link http://php.net/manual/en/function.eregi-replace.php + * @param string $pattern

+ * A POSIX extended regular expression. + *

+ * @param string $replacement

+ * If pattern contains parenthesized substrings, + * replacement may contain substrings of the form + * \digit, which will be + * replaced by the text matching the digit'th parenthesized substring; + * \0 will produce the entire contents of string. + * Up to nine substrings may be used. Parentheses may be nested, in which + * case they are counted by the opening parenthesis. + *

+ * @param string $string

+ * The input string. + *

+ * @return string The modified string is returned. If no matches are found in + * string, then it will be returned unchanged. + * @jms-builtin + */ +function eregi_replace ($pattern, $replacement, $string) {} + +/** + * (PHP 4, PHP 5)
+ * Split string into array by regular expression + * @link http://php.net/manual/en/function.split.php + * @param string $pattern

+ * Case sensitive regular expression. + *

+ *

+ * If you want to split on any of the characters which are considered + * special by regular expressions, you'll need to escape them first. If + * you think split (or any other regex function, for + * that matter) is doing something weird, please read the file + * regex.7, included in the + * regex/ subdirectory of the PHP distribution. It's + * in manpage format, so you'll want to do something along the lines of + * man /usr/local/src/regex/regex.7 in order to read it. + *

+ * @param string $string

+ * The input string. + *

+ * @param int $limit [optional]

+ * If limit is set, the returned array will + * contain a maximum of limit elements with the + * last element containing the whole rest of + * string. + *

+ * @return array an array of strings, each of which is a substring of + * string formed by splitting it on boundaries formed + * by the case-sensitive regular expression pattern. + *

+ *

+ * If there are n occurrences of + * pattern, the returned array will contain + * n+1 items. For example, if + * there is no occurrence of pattern, an array with + * only one element will be returned. Of course, this is also true if + * string is empty. If an error occurs, + * split returns FALSE. + * @jms-builtin + */ +function split ($pattern, $string, $limit = -1) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Split string into array by regular expression case insensitive + * @link http://php.net/manual/en/function.spliti.php + * @param string $pattern

+ * Case insensitive regular expression. + *

+ *

+ * If you want to split on any of the characters which are considered + * special by regular expressions, you'll need to escape them first. If + * you think spliti (or any other regex function, for + * that matter) is doing something weird, please read the file + * regex.7, included in the + * regex/ subdirectory of the PHP distribution. It's + * in manpage format, so you'll want to do something along the lines of + * man /usr/local/src/regex/regex.7 in order to read it. + *

+ * @param string $string

+ * The input string. + *

+ * @param int $limit [optional]

+ * If limit is set, the returned array will + * contain a maximum of limit elements with the + * last element containing the whole rest of + * string. + *

+ * @return array an array of strings, each of which is a substring of + * string formed by splitting it on boundaries formed + * by the case insensitive regular expression pattern. + *

+ *

+ * If there are n occurrences of + * pattern, the returned array will contain + * n+1 items. For example, if + * there is no occurrence of pattern, an array with + * only one element will be returned. Of course, this is also true if + * string is empty. If an error occurs, + * spliti returns FALSE. + * @jms-builtin + */ +function spliti ($pattern, $string, $limit = -1) {} + +/** + * (PHP 4, PHP 5)
+ * Make regular expression for case insensitive match + * @link http://php.net/manual/en/function.sql-regcase.php + * @param string $string

+ * The input string. + *

+ * @return string a valid regular expression which will match + * string, ignoring case. This expression is + * string with each alphabetic character converted to + * a bracket expression; this bracket expression contains that character's + * uppercase and lowercase form. Other characters remain unchanged. + * @jms-builtin + */ +function sql_regcase ($string) {} + +// End of ereg v. +?> diff --git a/res/php-5.4-core-api/exif.php b/res/php-5.4-core-api/exif.php new file mode 100644 index 0000000..aed07b1 --- /dev/null +++ b/res/php-5.4-core-api/exif.php @@ -0,0 +1,147 @@ + + * Reads the EXIF headers from JPEG or TIFF + * @link http://php.net/manual/en/function.exif-read-data.php + * @param string $filename

+ * The name of the image file being read. This cannot be an + * URL. + *

+ * @param string $sections [optional]

+ * Is a comma separated list of sections that need to be present in file + * to produce a result array. If none of the requested + * sections could be found the return value is FALSE. + * + * FILE + * FileName, FileSize, FileDateTime, SectionsFound + * + * + * COMPUTED + * + * html, Width, Height, IsColor, and more if available. Height and + * Width are computed the same way getimagesize + * does so their values must not be part of any header returned. + * Also, html is a height/width text string to be used inside normal + * HTML. + * + * + * + * ANY_TAG + * Any information that has a Tag e.g. IFD0, EXIF, ... + * + * + * IFD0 + * + * All tagged data of IFD0. In normal imagefiles this contains + * image size and so forth. + * + * + * + * THUMBNAIL + * + * A file is supposed to contain a thumbnail if it has a second IFD. + * All tagged information about the embedded thumbnail is stored in + * this section. + * + * + * + * COMMENT + * Comment headers of JPEG images. + * + * + * EXIF + * + * The EXIF section is a sub section of IFD0. It contains + * more detailed information about an image. Most of these entries + * are digital camera related. + * + * + *

+ * @param bool $arrays [optional]

+ * Specifies whether or not each section becomes an array. The + * sections COMPUTED, + * THUMBNAIL, and COMMENT + * always become arrays as they may contain values whose names conflict + * with other sections. + *

+ * @param bool $thumbnail [optional]

+ * When set to TRUE the thumbnail itself is read. Otherwise, only the + * tagged data is read. + *

+ * @return array It returns an associative array where the array indexes are + * the header names and the array values are the values associated with + * those headers. If no data can be returned, + * exif_read_data will return FALSE. + * @jms-builtin + */ +function exif_read_data ($filename, $sections = null, $arrays = false, $thumbnail = false) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Alias of exif_read_data + * @link http://php.net/manual/en/function.read-exif-data.php + * @param $filename + * @param $sections_needed [optional] + * @param $sub_arrays [optional] + * @param $read_thumbnail [optional] + * @jms-builtin + */ +function read_exif_data ($filename, $sections_needed, $sub_arrays, $read_thumbnail) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get the header name for an index + * @link http://php.net/manual/en/function.exif-tagname.php + * @param int $index

+ * The Tag ID for which a Tag Name will be looked up. + *

+ * @return string the header name, or FALSE if index is + * not a defined EXIF tag id. + * @jms-builtin + */ +function exif_tagname ($index) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Retrieve the embedded thumbnail of a TIFF or JPEG image + * @link http://php.net/manual/en/function.exif-thumbnail.php + * @param string $filename

+ * The name of the image file being read. This image contains an + * embedded thumbnail. + *

+ * @param int $width [optional]

+ * The return width of the returned thumbnail. + *

+ * @param int $height [optional]

+ * The returned height of the returned thumbnail. + *

+ * @param int $imagetype [optional]

+ * The returned image type of the returned thumbnail. This is either + * TIFF or JPEG. + *

+ * @return string the embedded thumbnail, or FALSE if the image contains no + * thumbnail. + * @jms-builtin + */ +function exif_thumbnail ($filename, &$width = null, &$height = null, &$imagetype = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Determine the type of an image + * @link http://php.net/manual/en/function.exif-imagetype.php + * @param string $filename The image being checked. + * @return int When a correct signature is found, the appropriate constant value will be + * returned otherwise the return value is FALSE. The return value is the + * same value that getimagesize returns in index 2 but + * exif_imagetype is much faster. + * @jms-builtin + */ +function exif_imagetype ($filename) {} + +define ('EXIF_USE_MBSTRING', 1); + +// End of exif v.1.4 $Id$ +?> diff --git a/res/php-5.4-core-api/fileinfo.php b/res/php-5.4-core-api/fileinfo.php new file mode 100644 index 0000000..79fa6c8 --- /dev/null +++ b/res/php-5.4-core-api/fileinfo.php @@ -0,0 +1,168 @@ + + * Create a new fileinfo resource + * @link http://php.net/manual/en/function.finfo-open.php + * @param $options [optional] + * @param $arg [optional] + * @return mixed (Procedural style only) + * Returns a magic database resource on success or FALSE on failure. + * @jms-builtin + */ +function finfo_open ($options, $arg) {} + +/** + * (PHP >= 5.3.0, PECL fileinfo >= 0.1.0)
+ * Close fileinfo resource + * @link http://php.net/manual/en/function.finfo-close.php + * @param $finfo + * @return mixed TRUE on success or FALSE on failure. + * @jms-builtin + */ +function finfo_close ($finfo) {} + +/** + * (PHP >= 5.3.0, PECL fileinfo >= 0.1.0)
+ * Set libmagic configuration options + * @link http://php.net/manual/en/function.finfo-set-flags.php + * @param $finfo + * @param $options + * @return mixed TRUE on success or FALSE on failure. + * @jms-builtin + */ +function finfo_set_flags ($finfo, $options) {} + +/** + * (PHP >= 5.3.0, PECL fileinfo >= 0.1.0)
+ * Return information about a file + * @link http://php.net/manual/en/function.finfo-file.php + * @param $finfo + * @param $filename + * @param $options [optional] + * @param $context [optional] + * @return mixed a textual description of the contents of the + * filename argument, or FALSE if an error occurred. + * @jms-builtin + */ +function finfo_file ($finfo, $filename, $options, $context) {} + +/** + * (PHP 5 >= 5.3.0, PECL fileinfo >= 0.1.0)
+ * Return information about a string buffer + * @link http://php.net/manual/en/function.finfo-buffer.php + * @param $finfo + * @param $string + * @param $options [optional] + * @param $context [optional] + * @return mixed a textual description of the string + * argument, or FALSE if an error occurred. + * @jms-builtin + */ +function finfo_buffer ($finfo, $string, $options, $context) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Detect MIME Content-type for a file (deprecated) + * @link http://php.net/manual/en/function.mime-content-type.php + * @param string $filename

+ * Path to the tested file. + *

+ * @return string the content type in MIME format, like + * text/plain or application/octet-stream. + * @jms-builtin + */ +function mime_content_type ($filename) {} + + +/** + * No special handling. + * @link http://php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_NONE', 0); + +/** + * Follow symlinks. + * @link http://php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_SYMLINK', 2); + +/** + * Return the mime type and mime encoding as defined by RFC 2045. + * @link http://php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_MIME', 1040); + +/** + * Return the mime type. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_MIME_TYPE', 16); + +/** + * Return the mime encoding of the file. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_MIME_ENCODING', 1024); + +/** + * Look at the contents of blocks or character special devices. + * @link http://php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_DEVICES', 8); + +/** + * Return all matches, not just the first. + * @link http://php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_CONTINUE', 32); + +/** + * If possible preserve the original access time. + * @link http://php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_PRESERVE_ATIME', 128); + +/** + * Don't translate unprintable characters to a \ooo octal + * representation. + * @link http://php.net/manual/en/fileinfo.constants.php + */ +define ('FILEINFO_RAW', 256); + +// End of fileinfo v.1.0.5 +?> diff --git a/res/php-5.4-core-api/filter.php b/res/php-5.4-core-api/filter.php new file mode 100644 index 0000000..a47a916 --- /dev/null +++ b/res/php-5.4-core-api/filter.php @@ -0,0 +1,494 @@ + + * Gets a specific external variable by name and optionally filters it + * @link http://php.net/manual/en/function.filter-input.php + * @param int $type

+ * One of INPUT_GET, INPUT_POST, + * INPUT_COOKIE, INPUT_SERVER, or + * INPUT_ENV. + *

+ * @param string $variable_name

+ * Name of a variable to get. + *

+ * @param int $filter [optional]

+ * The ID of the filter to apply. The + * manual page lists the available filters. + *

+ * @param mixed $options [optional]

+ * Associative array of options or bitwise disjunction of flags. If filter + * accepts options, flags can be provided in "flags" field of array. + *

+ * @return mixed Value of the requested variable on success, FALSE if the filter fails, + * or NULL if the variable_name variable is not set. + * If the flag FILTER_NULL_ON_FAILURE is used, it + * returns FALSE if the variable is not set and NULL if the filter fails. + * @jms-builtin + */ +function filter_input ($type, $variable_name, $filter = 'FILTER_DEFAULT', $options = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Filters a variable with a specified filter + * @link http://php.net/manual/en/function.filter-var.php + * @param mixed $variable

+ * Value to filter. + *

+ * @param int $filter [optional]

+ * The ID of the filter to apply. The + * manual page lists the available filters. + *

+ * @param mixed $options [optional]

+ * Associative array of options or bitwise disjunction of flags. If filter + * accepts options, flags can be provided in "flags" field of array. For + * the "callback" filter, callable type should be passed. The + * callback must accept one argument, the value to be filtered, and return + * the value after filtering/sanitizing it. + *

+ *

+ * + * // for filters that accept options, use this format + * $options = array( + * 'options' => array( + * 'default' => 3, // value to return if the filter fails + * // other options here + * 'min_range' => 0 + * ), + * 'flags' => FILTER_FLAG_ALLOW_OCTAL, + * ); + * $var = filter_var('0755', FILTER_VALIDATE_INT, $options); + * // for filter that only accept flags, you can pass them directly + * $var = filter_var('oops', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + * // for filter that only accept flags, you can also pass as an array + * $var = filter_var('oops', FILTER_VALIDATE_BOOLEAN, + * array('flags' => FILTER_NULL_ON_FAILURE)); + * // callback validate filter + * function foo($value) + * { + * // Expected format: Surname, GivenNames + * if (strpos($value, ", ") === false) return false; + * list($surname, $givennames) = explode(", ", $value, 2); + * $empty = (empty($surname) || empty($givennames)); + * $notstrings = (!is_string($surname) || !is_string($givennames)); + * if ($empty || $notstrings) { + * return false; + * } else { + * return $value; + * } + * } + * $var = filter_var('Doe, Jane Sue', FILTER_CALLBACK, array('options' => 'foo')); + * + *

+ * @return mixed the filtered data, or FALSE if the filter fails. + * @jms-builtin + */ +function filter_var ($variable, $filter = 'FILTER_DEFAULT', $options = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Gets external variables and optionally filters them + * @link http://php.net/manual/en/function.filter-input-array.php + * @param int $type

+ * One of INPUT_GET, INPUT_POST, + * INPUT_COOKIE, INPUT_SERVER, or + * INPUT_ENV. + *

+ * @param mixed $definition [optional]

+ * An array defining the arguments. A valid key is a string + * containing a variable name and a valid value is either a filter type, or an array + * optionally specifying the filter, flags and options. If the value is an + * array, valid keys are filter which specifies the + * filter type, + * flags which specifies any flags that apply to the + * filter, and options which specifies any options that + * apply to the filter. See the example below for a better understanding. + *

+ *

+ * This parameter can be also an integer holding a filter constant. Then all values in the + * input array are filtered by this filter. + *

+ * @return mixed An array containing the values of the requested variables on success, or FALSE + * on failure. An array value will be FALSE if the filter fails, or NULL if + * the variable is not set. Or if the flag FILTER_NULL_ON_FAILURE + * is used, it returns FALSE if the variable is not set and NULL if the filter + * fails. + * @jms-builtin + */ +function filter_input_array ($type, $definition = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Gets multiple variables and optionally filters them + * @link http://php.net/manual/en/function.filter-var-array.php + * @param array $data

+ * An array with string keys containing the data to filter. + *

+ * @param mixed $definition [optional]

+ * An array defining the arguments. A valid key is a string + * containing a variable name and a valid value is either a + * filter type, or an + * array optionally specifying the filter, flags and options. + * If the value is an array, valid keys are filter + * which specifies the filter type, + * flags which specifies any flags that apply to the + * filter, and options which specifies any options that + * apply to the filter. See the example below for a better understanding. + *

+ *

+ * This parameter can be also an integer holding a filter constant. Then all values in the + * input array are filtered by this filter. + *

+ * @return mixed An array containing the values of the requested variables on success, or FALSE + * on failure. An array value will be FALSE if the filter fails, or NULL if + * the variable is not set. + * @jms-builtin + */ +function filter_var_array (array $data, $definition = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Returns a list of all supported filters + * @link http://php.net/manual/en/function.filter-list.php + * @return array an array of names of all supported filters, empty array if there + * are no such filters. Indexes of this array are not filter IDs, they can be + * obtained with filter_id from a name instead. + * @jms-builtin + */ +function filter_list () {} + +/** + * (PHP 5 >= 5.2.0)
+ * Checks if variable of specified type exists + * @link http://php.net/manual/en/function.filter-has-var.php + * @param int $type

+ * One of INPUT_GET, INPUT_POST, + * INPUT_COOKIE, INPUT_SERVER, or + * INPUT_ENV. + *

+ * @param string $variable_name

+ * Name of a variable to check. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function filter_has_var ($type, $variable_name) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Returns the filter ID belonging to a named filter + * @link http://php.net/manual/en/function.filter-id.php + * @param string $filtername

+ * Name of a filter to get. + *

+ * @return int ID of a filter on success or FALSE if filter doesn't exist. + * @jms-builtin + */ +function filter_id ($filtername) {} + + +/** + * POST variables. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('INPUT_POST', 0); + +/** + * GET variables. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('INPUT_GET', 1); + +/** + * COOKIE variables. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('INPUT_COOKIE', 2); + +/** + * ENV variables. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('INPUT_ENV', 4); + +/** + * SERVER variables. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('INPUT_SERVER', 5); + +/** + * SESSION variables. + * (not implemented yet) + * @link http://php.net/manual/en/filter.constants.php + */ +define ('INPUT_SESSION', 6); + +/** + * REQUEST variables. + * (not implemented yet) + * @link http://php.net/manual/en/filter.constants.php + */ +define ('INPUT_REQUEST', 99); + +/** + * No flags. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NONE', 0); + +/** + * Flag used to require scalar as input + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_REQUIRE_SCALAR', 33554432); + +/** + * Require an array as input. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_REQUIRE_ARRAY', 16777216); + +/** + * Always returns an array. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FORCE_ARRAY', 67108864); + +/** + * Use NULL instead of FALSE on failure. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_NULL_ON_FAILURE', 134217728); + +/** + * ID of "int" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_INT', 257); + +/** + * ID of "boolean" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_BOOLEAN', 258); + +/** + * ID of "float" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_FLOAT', 259); + +/** + * ID of "validate_regexp" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_REGEXP', 272); + +/** + * ID of "validate_url" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_URL', 273); + +/** + * ID of "validate_email" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_EMAIL', 274); + +/** + * ID of "validate_ip" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_VALIDATE_IP', 275); + +/** + * ID of default ("string") filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_DEFAULT', 516); + +/** + * ID of "unsafe_raw" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_UNSAFE_RAW', 516); + +/** + * ID of "string" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_STRING', 513); + +/** + * ID of "stripped" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_STRIPPED', 513); + +/** + * ID of "encoded" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_ENCODED', 514); + +/** + * ID of "special_chars" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_SPECIAL_CHARS', 515); +define ('FILTER_SANITIZE_FULL_SPECIAL_CHARS', 515); + +/** + * ID of "email" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_EMAIL', 517); + +/** + * ID of "url" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_URL', 518); + +/** + * ID of "number_int" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_NUMBER_INT', 519); + +/** + * ID of "number_float" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_NUMBER_FLOAT', 520); + +/** + * ID of "magic_quotes" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_SANITIZE_MAGIC_QUOTES', 521); + +/** + * ID of "callback" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_CALLBACK', 1024); + +/** + * Allow octal notation (0[0-7]+) in "int" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_OCTAL', 1); + +/** + * Allow hex notation (0x[0-9a-fA-F]+) in "int" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_HEX', 2); + +/** + * Strip characters with ASCII value less than 32. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_STRIP_LOW', 4); + +/** + * Strip characters with ASCII value greater than 127. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_STRIP_HIGH', 8); +define ('FILTER_FLAG_STRIP_BACKTICK', 512); + +/** + * Encode characters with ASCII value less than 32. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ENCODE_LOW', 16); + +/** + * Encode characters with ASCII value greater than 127. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ENCODE_HIGH', 32); + +/** + * Encode &#38;. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ENCODE_AMP', 64); + +/** + * Don't encode ' and ". + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NO_ENCODE_QUOTES', 128); + +/** + * (No use for now.) + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_EMPTY_STRING_NULL', 256); + +/** + * Allow fractional part in "number_float" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_FRACTION', 4096); + +/** + * Allow thousand separator (,) in "number_float" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_THOUSAND', 8192); + +/** + * Allow scientific notation (e, E) in + * "number_float" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_ALLOW_SCIENTIFIC', 16384); +define ('FILTER_FLAG_SCHEME_REQUIRED', 65536); +define ('FILTER_FLAG_HOST_REQUIRED', 131072); + +/** + * Require path in "validate_url" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_PATH_REQUIRED', 262144); + +/** + * Require query in "validate_url" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_QUERY_REQUIRED', 524288); + +/** + * Allow only IPv4 address in "validate_ip" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_IPV4', 1048576); + +/** + * Allow only IPv6 address in "validate_ip" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_IPV6', 2097152); + +/** + * Deny reserved addresses in "validate_ip" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NO_RES_RANGE', 4194304); + +/** + * Deny private addresses in "validate_ip" filter. + * @link http://php.net/manual/en/filter.constants.php + */ +define ('FILTER_FLAG_NO_PRIV_RANGE', 8388608); + +// End of filter v.0.11.0 +?> diff --git a/res/php-5.4-core-api/ftp.php b/res/php-5.4-core-api/ftp.php new file mode 100644 index 0000000..0d433ef --- /dev/null +++ b/res/php-5.4-core-api/ftp.php @@ -0,0 +1,736 @@ + + * Opens an FTP connection + * @link http://php.net/manual/en/function.ftp-connect.php + * @param string $host

+ * The FTP server address. This parameter shouldn't have any trailing + * slashes and shouldn't be prefixed with ftp://. + *

+ * @param int $port [optional]

+ * This parameter specifies an alternate port to connect to. If it is + * omitted or set to zero, then the default FTP port, 21, will be used. + *

+ * @param int $timeout [optional]

+ * This parameter specifies the timeout for all subsequent network operations. + * If omitted, the default value is 90 seconds. The timeout can be changed and + * queried at any time with ftp_set_option and + * ftp_get_option. + *

+ * @return resource a FTP stream on success or FALSE on error. + * @jms-builtin + */ +function ftp_connect ($host, $port = 21, $timeout = 90) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Opens an Secure SSL-FTP connection + * @link http://php.net/manual/en/function.ftp-ssl-connect.php + * @param string $host

+ * The FTP server address. This parameter shouldn't have any trailing + * slashes and shouldn't be prefixed with ftp://. + *

+ * @param int $port [optional]

+ * This parameter specifies an alternate port to connect to. If it is + * omitted or set to zero, then the default FTP port, 21, will be used. + *

+ * @param int $timeout [optional]

+ * This parameter specifies the timeout for all subsequent network operations. + * If omitted, the default value is 90 seconds. The timeout can be changed and + * queried at any time with ftp_set_option and + * ftp_get_option. + *

+ * @return resource a SSL-FTP stream on success or FALSE on error. + * @jms-builtin + */ +function ftp_ssl_connect ($host, $port = 21, $timeout = 90) {} + +/** + * (PHP 4, PHP 5)
+ * Logs in to an FTP connection + * @link http://php.net/manual/en/function.ftp-login.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $username

+ * The username (USER). + *

+ * @param string $password

+ * The password (PASS). + *

+ * @return bool TRUE on success or FALSE on failure. + * If login fails, PHP will also throw a warning. + * @jms-builtin + */ +function ftp_login ($ftp_stream, $username, $password) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the current directory name + * @link http://php.net/manual/en/function.ftp-pwd.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @return string the current directory name or FALSE on error. + * @jms-builtin + */ +function ftp_pwd ($ftp_stream) {} + +/** + * (PHP 4, PHP 5)
+ * Changes to the parent directory + * @link http://php.net/manual/en/function.ftp-cdup.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_cdup ($ftp_stream) {} + +/** + * (PHP 4, PHP 5)
+ * Changes the current directory on a FTP server + * @link http://php.net/manual/en/function.ftp-chdir.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $directory

+ * The target directory. + *

+ * @return bool TRUE on success or FALSE on failure. + * If changing directory fails, PHP will also throw a warning. + * @jms-builtin + */ +function ftp_chdir ($ftp_stream, $directory) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Requests execution of a command on the FTP server + * @link http://php.net/manual/en/function.ftp-exec.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $command

+ * The command to execute. + *

+ * @return bool TRUE if the command was successful (server sent response code: + * 200); otherwise returns FALSE. + * @jms-builtin + */ +function ftp_exec ($ftp_stream, $command) {} + +/** + * (PHP 5)
+ * Sends an arbitrary command to an FTP server + * @link http://php.net/manual/en/function.ftp-raw.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $command

+ * The command to execute. + *

+ * @return array the server's response as an array of strings. + * No parsing is performed on the response string, nor does + * ftp_raw determine if the command succeeded. + * @jms-builtin + */ +function ftp_raw ($ftp_stream, $command) {} + +/** + * (PHP 4, PHP 5)
+ * Creates a directory + * @link http://php.net/manual/en/function.ftp-mkdir.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $directory

+ * The name of the directory that will be created. + *

+ * @return string the newly created directory name on success or FALSE on error. + * @jms-builtin + */ +function ftp_mkdir ($ftp_stream, $directory) {} + +/** + * (PHP 4, PHP 5)
+ * Removes a directory + * @link http://php.net/manual/en/function.ftp-rmdir.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $directory

+ * The directory to delete. This must be either an absolute or relative + * path to an empty directory. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_rmdir ($ftp_stream, $directory) {} + +/** + * (PHP 5)
+ * Set permissions on a file via FTP + * @link http://php.net/manual/en/function.ftp-chmod.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param int $mode

+ * The new permissions, given as an octal value. + *

+ * @param string $filename

+ * The remote file. + *

+ * @return int the new file permissions on success or FALSE on error. + * @jms-builtin + */ +function ftp_chmod ($ftp_stream, $mode, $filename) {} + +/** + * (PHP 5)
+ * Allocates space for a file to be uploaded + * @link http://php.net/manual/en/function.ftp-alloc.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param int $filesize

+ * The number of bytes to allocate. + *

+ * @param string $result [optional]

+ * A textual representation of the servers response will be returned by + * reference in result if a variable is provided. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_alloc ($ftp_stream, $filesize, &$result = null) {} + +/** + * (PHP 4, PHP 5)
+ * Returns a list of files in the given directory + * @link http://php.net/manual/en/function.ftp-nlist.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $directory

+ * The directory to be listed. This parameter can also include arguments, eg. + * ftp_nlist($conn_id, "-la /your/dir"); + * Note that this parameter isn't escaped so there may be some issues with + * filenames containing spaces and other characters. + *

+ * @return array an array of filenames from the specified directory on success or + * FALSE on error. + * @jms-builtin + */ +function ftp_nlist ($ftp_stream, $directory) {} + +/** + * (PHP 4, PHP 5)
+ * Returns a detailed list of files in the given directory + * @link http://php.net/manual/en/function.ftp-rawlist.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $directory

+ * The directory path. May include arguments for the LIST + * command. + *

+ * @param bool $recursive [optional]

+ * If set to TRUE, the issued command will be LIST -R. + *

+ * @return array an array where each element corresponds to one line of text. + *

+ *

+ * The output is not parsed in any way. The system type identifier returned by + * ftp_systype can be used to determine how the results + * should be interpreted. + * @jms-builtin + */ +function ftp_rawlist ($ftp_stream, $directory, $recursive = false) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the system type identifier of the remote FTP server + * @link http://php.net/manual/en/function.ftp-systype.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @return string the remote system type, or FALSE on error. + * @jms-builtin + */ +function ftp_systype ($ftp_stream) {} + +/** + * (PHP 4, PHP 5)
+ * Turns passive mode on or off + * @link http://php.net/manual/en/function.ftp-pasv.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param bool $pasv

+ * If TRUE, the passive mode is turned on, else it's turned off. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_pasv ($ftp_stream, $pasv) {} + +/** + * (PHP 4, PHP 5)
+ * Downloads a file from the FTP server + * @link http://php.net/manual/en/function.ftp-get.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $local_file

+ * The local file path (will be overwritten if the file already exists). + *

+ * @param string $remote_file

+ * The remote file path. + *

+ * @param int $mode

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param int $resumepos [optional]

+ * The position in the remote file to start downloading from. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_get ($ftp_stream, $local_file, $remote_file, $mode, $resumepos = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Downloads a file from the FTP server and saves to an open file + * @link http://php.net/manual/en/function.ftp-fget.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param resource $handle

+ * An open file pointer in which we store the data. + *

+ * @param string $remote_file

+ * The remote file path. + *

+ * @param int $mode

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param int $resumepos [optional]

+ * The position in the remote file to start downloading from. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_fget ($ftp_stream, $handle, $remote_file, $mode, $resumepos = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Uploads a file to the FTP server + * @link http://php.net/manual/en/function.ftp-put.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $remote_file

+ * The remote file path. + *

+ * @param string $local_file

+ * The local file path. + *

+ * @param int $mode

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param int $startpos [optional]

The position in the remote file to start uploading to.

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_put ($ftp_stream, $remote_file, $local_file, $mode, $startpos = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Uploads from an open file to the FTP server + * @link http://php.net/manual/en/function.ftp-fput.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $remote_file

+ * The remote file path. + *

+ * @param resource $handle

+ * An open file pointer on the local file. Reading stops at end of file. + *

+ * @param int $mode

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param int $startpos [optional]

The position in the remote file to start uploading to.

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_fput ($ftp_stream, $remote_file, $handle, $mode, $startpos = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the size of the given file + * @link http://php.net/manual/en/function.ftp-size.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $remote_file

+ * The remote file. + *

+ * @return int the file size on success, or -1 on error. + * @jms-builtin + */ +function ftp_size ($ftp_stream, $remote_file) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the last modified time of the given file + * @link http://php.net/manual/en/function.ftp-mdtm.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $remote_file

+ * The file from which to extract the last modification time. + *

+ * @return int the last modified time as a Unix timestamp on success, or -1 on + * error. + * @jms-builtin + */ +function ftp_mdtm ($ftp_stream, $remote_file) {} + +/** + * (PHP 4, PHP 5)
+ * Renames a file or a directory on the FTP server + * @link http://php.net/manual/en/function.ftp-rename.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $oldname

+ * The old file/directory name. + *

+ * @param string $newname

+ * The new name. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_rename ($ftp_stream, $oldname, $newname) {} + +/** + * (PHP 4, PHP 5)
+ * Deletes a file on the FTP server + * @link http://php.net/manual/en/function.ftp-delete.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $path

+ * The file to delete. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_delete ($ftp_stream, $path) {} + +/** + * (PHP 4, PHP 5)
+ * Sends a SITE command to the server + * @link http://php.net/manual/en/function.ftp-site.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $command

+ * The SITE command. Note that this parameter isn't escaped so there may + * be some issues with filenames containing spaces and other characters. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_site ($ftp_stream, $command) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Closes an FTP connection + * @link http://php.net/manual/en/function.ftp-close.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftp_close ($ftp_stream) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Set miscellaneous runtime FTP options + * @link http://php.net/manual/en/function.ftp-set-option.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param int $option

+ * Currently, the following options are supported: + * + * Supported runtime FTP options + * + * + * + * + * + * + * + * + *
FTP_TIMEOUT_SEC + * Changes the timeout in seconds used for all network related + * functions. value must be an integer that + * is greater than 0. The default timeout is 90 seconds. + *
FTP_AUTOSEEK + * When enabled, GET or PUT requests with a + * resumepos or startpos + * parameter will first seek to the requested position within the file. + * This is enabled by default. + *
+ *

+ * @param mixed $value

+ * This parameter depends on which option is chosen + * to be altered. + *

+ * @return bool TRUE if the option could be set; FALSE if not. A warning + * message will be thrown if the option is not + * supported or the passed value doesn't match the + * expected value for the given option. + * @jms-builtin + */ +function ftp_set_option ($ftp_stream, $option, $value) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Retrieves various runtime behaviours of the current FTP stream + * @link http://php.net/manual/en/function.ftp-get-option.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param int $option

+ * Currently, the following options are supported: + * + * Supported runtime FTP options + * + * + * + * + * + * + * + * + *
FTP_TIMEOUT_SEC + * Returns the current timeout used for network related operations. + *
FTP_AUTOSEEK + * Returns TRUE if this option is on, FALSE otherwise. + *
+ *

+ * @return mixed the value on success or FALSE if the given + * option is not supported. In the latter case, a + * warning message is also thrown. + * @jms-builtin + */ +function ftp_get_option ($ftp_stream, $option) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Retrieves a file from the FTP server and writes it to an open file (non-blocking) + * @link http://php.net/manual/en/function.ftp-nb-fget.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param resource $handle

+ * An open file pointer in which we store the data. + *

+ * @param string $remote_file

+ * The remote file path. + *

+ * @param int $mode

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param int $resumepos [optional]

The position in the remote file to start downloading from.

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * @jms-builtin + */ +function ftp_nb_fget ($ftp_stream, $handle, $remote_file, $mode, $resumepos = 0) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Retrieves a file from the FTP server and writes it to a local file (non-blocking) + * @link http://php.net/manual/en/function.ftp-nb-get.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $local_file

+ * The local file path (will be overwritten if the file already exists). + *

+ * @param string $remote_file

+ * The remote file path. + *

+ * @param int $mode

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param int $resumepos [optional]

The position in the remote file to start downloading from.

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * @jms-builtin + */ +function ftp_nb_get ($ftp_stream, $local_file, $remote_file, $mode, $resumepos = 0) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Continues retrieving/sending a file (non-blocking) + * @link http://php.net/manual/en/function.ftp-nb-continue.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * @jms-builtin + */ +function ftp_nb_continue ($ftp_stream) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Stores a file on the FTP server (non-blocking) + * @link http://php.net/manual/en/function.ftp-nb-put.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $remote_file

+ * The remote file path. + *

+ * @param string $local_file

+ * The local file path. + *

+ * @param int $mode

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param int $startpos [optional]

The position in the remote file to start uploading to.

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * @jms-builtin + */ +function ftp_nb_put ($ftp_stream, $remote_file, $local_file, $mode, $startpos = 0) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Stores a file from an open file to the FTP server (non-blocking) + * @link http://php.net/manual/en/function.ftp-nb-fput.php + * @param resource $ftp_stream

+ * The link identifier of the FTP connection. + *

+ * @param string $remote_file

+ * The remote file path. + *

+ * @param resource $handle

+ * An open file pointer on the local file. Reading stops at end of file. + *

+ * @param int $mode

+ * The transfer mode. Must be either FTP_ASCII or + * FTP_BINARY. + *

+ * @param int $startpos [optional]

The position in the remote file to start uploading to.

+ * @return int FTP_FAILED or FTP_FINISHED + * or FTP_MOREDATA. + * @jms-builtin + */ +function ftp_nb_fput ($ftp_stream, $remote_file, $handle, $mode, $startpos = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of ftp_close + * @link http://php.net/manual/en/function.ftp-quit.php + * @param $ftp + * @jms-builtin + */ +function ftp_quit ($ftp) {} + + +/** + *

+ * @link http://php.net/manual/en/ftp.constants.php + */ +define ('FTP_ASCII', 1); + +/** + *

+ * @link http://php.net/manual/en/ftp.constants.php + */ +define ('FTP_TEXT', 1); + +/** + *

+ * @link http://php.net/manual/en/ftp.constants.php + */ +define ('FTP_BINARY', 2); + +/** + *

+ * @link http://php.net/manual/en/ftp.constants.php + */ +define ('FTP_IMAGE', 2); + +/** + *

+ * Automatically determine resume position and start position for GET and PUT requests + * (only works if FTP_AUTOSEEK is enabled) + *

+ * @link http://php.net/manual/en/ftp.constants.php + */ +define ('FTP_AUTORESUME', -1); + +/** + *

+ * See ftp_set_option for information. + *

+ * @link http://php.net/manual/en/ftp.constants.php + */ +define ('FTP_TIMEOUT_SEC', 0); + +/** + *

+ * See ftp_set_option for information. + *

+ * @link http://php.net/manual/en/ftp.constants.php + */ +define ('FTP_AUTOSEEK', 1); + +/** + *

+ * Asynchronous transfer has failed + *

+ * @link http://php.net/manual/en/ftp.constants.php + */ +define ('FTP_FAILED', 0); + +/** + *

+ * Asynchronous transfer has finished + *

+ * @link http://php.net/manual/en/ftp.constants.php + */ +define ('FTP_FINISHED', 1); + +/** + *

+ * Asynchronous transfer is still active + *

+ * @link http://php.net/manual/en/ftp.constants.php + */ +define ('FTP_MOREDATA', 2); + +// End of ftp v. +?> diff --git a/res/php-5.4-core-api/gd.php b/res/php-5.4-core-api/gd.php new file mode 100644 index 0000000..44db2b0 --- /dev/null +++ b/res/php-5.4-core-api/gd.php @@ -0,0 +1,2192 @@ + + * Retrieve information about the currently installed GD library + * @link http://php.net/manual/en/function.gd-info.php + * @return array an associative array. + *

+ *

+ * + * Elements of array returned by gd_info + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
AttributeMeaning
GD Versionstring value describing the installed + * libgd version.
FreeType Supportboolean value. TRUE + * if FreeType Support is installed.
FreeType Linkagestring value describing the way in which + * FreeType was linked. Expected values are: 'with freetype', + * 'with TTF library', and 'with unknown library'. This element will + * only be defined if FreeType Support evaluated to + * TRUE.
T1Lib Supportboolean value. TRUE + * if T1Lib support is included.
GIF Read Supportboolean value. TRUE + * if support for reading GIF + * images is included.
GIF Create Supportboolean value. TRUE + * if support for creating GIF + * images is included.
JPEG Supportboolean value. TRUE + * if JPEG support is included.
PNG Supportboolean value. TRUE + * if PNG support is included.
WBMP Supportboolean value. TRUE + * if WBMP support is included.
XBM Supportboolean value. TRUE + * if XBM support is included.
+ *

+ *

+ * Previous to PHP 5.3.0, the JPEG Support attribute was named + * JPG Support. + * @jms-builtin + */ +function gd_info () {} + +/** + * (PHP 4, PHP 5)
+ * Draws an arc + * @link http://php.net/manual/en/function.imagearc.php + * @param resource $image + * @param int $cx

+ * x-coordinate of the center. + *

+ * @param int $cy

+ * y-coordinate of the center. + *

+ * @param int $width

+ * The arc width. + *

+ * @param int $height

+ * The arc height. + *

+ * @param int $start

+ * The arc start angle, in degrees. + *

+ * @param int $end

+ * The arc end angle, in degrees. + * 0° is located at the three-o'clock position, and the arc is drawn + * clockwise. + *

+ * @param int $color

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagearc ($image, $cx, $cy, $width, $height, $start, $end, $color) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Draw an ellipse + * @link http://php.net/manual/en/function.imageellipse.php + * @param resource $image + * @param int $cx

+ * x-coordinate of the center. + *

+ * @param int $cy

+ * y-coordinate of the center. + *

+ * @param int $width

+ * The ellipse width. + *

+ * @param int $height

+ * The ellipse height. + *

+ * @param int $color

+ * The color of the ellipse. A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imageellipse ($image, $cx, $cy, $width, $height, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Draw a character horizontally + * @link http://php.net/manual/en/function.imagechar.php + * @param resource $image + * @param int $font + * @param int $x

+ * x-coordinate of the start. + *

+ * @param int $y

+ * y-coordinate of the start. + *

+ * @param string $c

+ * The character to draw. + *

+ * @param int $color

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagechar ($image, $font, $x, $y, $c, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Draw a character vertically + * @link http://php.net/manual/en/function.imagecharup.php + * @param resource $image + * @param int $font + * @param int $x

+ * x-coordinate of the start. + *

+ * @param int $y

+ * y-coordinate of the start. + *

+ * @param string $c

+ * The character to draw. + *

+ * @param int $color

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagecharup ($image, $font, $x, $y, $c, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Get the index of the color of a pixel + * @link http://php.net/manual/en/function.imagecolorat.php + * @param resource $image + * @param int $x

+ * x-coordinate of the point. + *

+ * @param int $y

+ * y-coordinate of the point. + *

+ * @return int the index of the color. + * @jms-builtin + */ +function imagecolorat ($image, $x, $y) {} + +/** + * (PHP 4, PHP 5)
+ * Allocate a color for an image + * @link http://php.net/manual/en/function.imagecolorallocate.php + * @param resource $image + * @param int $red

Value of red component.

+ * @param int $green

Value of green component.

+ * @param int $blue

Value of blue component.

+ * @return int A color identifier or FALSE if the allocation failed. + * @jms-builtin + */ +function imagecolorallocate ($image, $red, $green, $blue) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Copy the palette from one image to another + * @link http://php.net/manual/en/function.imagepalettecopy.php + * @param resource $destination

+ * The destination image resource. + *

+ * @param resource $source

+ * The source image resource. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function imagepalettecopy ($destination, $source) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Create a new image from the image stream in the string + * @link http://php.net/manual/en/function.imagecreatefromstring.php + * @param string $image

+ * A string containing the image data. + *

+ * @return resource An image resource will be returned on success. FALSE is returned if + * the image type is unsupported, the data is not in a recognised format, + * or the image is corrupt and cannot be loaded. + * @jms-builtin + */ +function imagecreatefromstring ($image) {} + +/** + * (PHP 4, PHP 5)
+ * Get the index of the closest color to the specified color + * @link http://php.net/manual/en/function.imagecolorclosest.php + * @param resource $image + * @param int $red

Value of red component.

+ * @param int $green

Value of green component.

+ * @param int $blue

Value of blue component.

+ * @return int the index of the closest color, in the palette of the image, to + * the specified one + * @jms-builtin + */ +function imagecolorclosest ($image, $red, $green, $blue) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Get the index of the color which has the hue, white and blackness + * @link http://php.net/manual/en/function.imagecolorclosesthwb.php + * @param resource $image + * @param int $red

Value of red component.

+ * @param int $green

Value of green component.

+ * @param int $blue

Value of blue component.

+ * @return int an integer with the index of the color which has + * the hue, white and blackness nearest the given color. + * @jms-builtin + */ +function imagecolorclosesthwb ($image, $red, $green, $blue) {} + +/** + * (PHP 4, PHP 5)
+ * De-allocate a color for an image + * @link http://php.net/manual/en/function.imagecolordeallocate.php + * @param resource $image + * @param int $color

+ * The color identifier. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagecolordeallocate ($image, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Get the index of the specified color or its closest possible alternative + * @link http://php.net/manual/en/function.imagecolorresolve.php + * @param resource $image + * @param int $red

Value of red component.

+ * @param int $green

Value of green component.

+ * @param int $blue

Value of blue component.

+ * @return int a color index. + * @jms-builtin + */ +function imagecolorresolve ($image, $red, $green, $blue) {} + +/** + * (PHP 4, PHP 5)
+ * Get the index of the specified color + * @link http://php.net/manual/en/function.imagecolorexact.php + * @param resource $image + * @param int $red

Value of red component.

+ * @param int $green

Value of green component.

+ * @param int $blue

Value of blue component.

+ * @return int the index of the specified color in the palette, or -1 if the + * color does not exist. + * @jms-builtin + */ +function imagecolorexact ($image, $red, $green, $blue) {} + +/** + * (PHP 4, PHP 5)
+ * Set the color for the specified palette index + * @link http://php.net/manual/en/function.imagecolorset.php + * @param resource $image + * @param int $index

+ * An index in the palette. + *

+ * @param int $red

Value of red component.

+ * @param int $green

Value of green component.

+ * @param int $blue

Value of blue component.

+ * @param int $alpha [optional]

+ * Value of alpha component. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function imagecolorset ($image, $index, $red, $green, $blue, $alpha = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Define a color as transparent + * @link http://php.net/manual/en/function.imagecolortransparent.php + * @param resource $image + * @param int $color [optional]

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return int The identifier of the new (or current, if none is specified) + * transparent color is returned. + * @jms-builtin + */ +function imagecolortransparent ($image, $color = null) {} + +/** + * (PHP 4, PHP 5)
+ * Find out the number of colors in an image's palette + * @link http://php.net/manual/en/function.imagecolorstotal.php + * @param resource $image

+ * An image resource, returned by one of the image creation functions, such + * as imagecreatefromgif. + *

+ * @return int the number of colors in the specified image's palette or 0 for + * truecolor images. + * @jms-builtin + */ +function imagecolorstotal ($image) {} + +/** + * (PHP 4, PHP 5)
+ * Get the colors for an index + * @link http://php.net/manual/en/function.imagecolorsforindex.php + * @param resource $image + * @param int $index

+ * The color index. + *

+ * @return array an associative array with red, green, blue and alpha keys that + * contain the appropriate values for the specified color index. + * @jms-builtin + */ +function imagecolorsforindex ($image, $index) {} + +/** + * (PHP 4, PHP 5)
+ * Copy part of an image + * @link http://php.net/manual/en/function.imagecopy.php + * @param resource $dst_im

Destination image link resource.

+ * @param resource $src_im

Source image link resource.

+ * @param int $dst_x

+ * x-coordinate of destination point. + *

+ * @param int $dst_y

+ * y-coordinate of destination point. + *

+ * @param int $src_x

+ * x-coordinate of source point. + *

+ * @param int $src_y

+ * y-coordinate of source point. + *

+ * @param int $src_w

Source width.

+ * @param int $src_h

Source height.

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagecopy ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Copy and merge part of an image + * @link http://php.net/manual/en/function.imagecopymerge.php + * @param resource $dst_im

Destination image link resource.

+ * @param resource $src_im

Source image link resource.

+ * @param int $dst_x

+ * x-coordinate of destination point. + *

+ * @param int $dst_y

+ * y-coordinate of destination point. + *

+ * @param int $src_x

+ * x-coordinate of source point. + *

+ * @param int $src_y

+ * y-coordinate of source point. + *

+ * @param int $src_w

Source width.

+ * @param int $src_h

Source height.

+ * @param int $pct

+ * The two images will be merged according to pct + * which can range from 0 to 100. When pct = 0, + * no action is taken, when 100 this function behaves identically + * to imagecopy for pallete images, while it + * implements alpha transparency for true colour images. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagecopymerge ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Copy and merge part of an image with gray scale + * @link http://php.net/manual/en/function.imagecopymergegray.php + * @param resource $dst_im

Destination image link resource.

+ * @param resource $src_im

Source image link resource.

+ * @param int $dst_x

+ * x-coordinate of destination point. + *

+ * @param int $dst_y

+ * y-coordinate of destination point. + *

+ * @param int $src_x

+ * x-coordinate of source point. + *

+ * @param int $src_y

+ * y-coordinate of source point. + *

+ * @param int $src_w

Source width.

+ * @param int $src_h

Source height.

+ * @param int $pct

+ * The src_im will be changed to grayscale according + * to pct where 0 is fully grayscale and 100 is + * unchanged. When pct = 100 this function behaves + * identically to imagecopy for pallete images, while + * it implements alpha transparency for true colour images. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagecopymergegray ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) {} + +/** + * (PHP 4, PHP 5)
+ * Copy and resize part of an image + * @link http://php.net/manual/en/function.imagecopyresized.php + * @param resource $dst_image

Destination image link resource.

+ * @param resource $src_image

Source image link resource.

+ * @param int $dst_x

+ * x-coordinate of destination point. + *

+ * @param int $dst_y

+ * y-coordinate of destination point. + *

+ * @param int $src_x

+ * x-coordinate of source point. + *

+ * @param int $src_y

+ * y-coordinate of source point. + *

+ * @param int $dst_w

+ * Destination width. + *

+ * @param int $dst_h

+ * Destination height. + *

+ * @param int $src_w

Source width.

+ * @param int $src_h

Source height.

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagecopyresized ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) {} + +/** + * (PHP 4, PHP 5)
+ * Create a new palette based image + * @link http://php.net/manual/en/function.imagecreate.php + * @param int $width

+ * The image width. + *

+ * @param int $height

+ * The image height. + *

+ * @return resource an image resource identifier on success, FALSE on errors. + * @jms-builtin + */ +function imagecreate ($width, $height) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Create a new true color image + * @link http://php.net/manual/en/function.imagecreatetruecolor.php + * @param int $width

+ * Image width. + *

+ * @param int $height

+ * Image height. + *

+ * @return resource an image resource identifier on success, FALSE on errors. + * @jms-builtin + */ +function imagecreatetruecolor ($width, $height) {} + +/** + * (PHP 4 >= 4.3.2, PHP 5)
+ * Finds whether an image is a truecolor image + * @link http://php.net/manual/en/function.imageistruecolor.php + * @param resource $image + * @return bool TRUE if the image is truecolor, FALSE + * otherwise. + * @jms-builtin + */ +function imageistruecolor ($image) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Convert a true color image to a palette image + * @link http://php.net/manual/en/function.imagetruecolortopalette.php + * @param resource $image + * @param bool $dither

+ * Indicates if the image should be dithered - if it is TRUE then + * dithering will be used which will result in a more speckled image but + * with better color approximation. + *

+ * @param int $ncolors

+ * Sets the maximum number of colors that should be retained in the palette. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagetruecolortopalette ($image, $dither, $ncolors) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Set the thickness for line drawing + * @link http://php.net/manual/en/function.imagesetthickness.php + * @param resource $image + * @param int $thickness

+ * Thickness, in pixels. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagesetthickness ($image, $thickness) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Draw a partial arc and fill it + * @link http://php.net/manual/en/function.imagefilledarc.php + * @param resource $image + * @param int $cx

+ * x-coordinate of the center. + *

+ * @param int $cy

+ * y-coordinate of the center. + *

+ * @param int $width

+ * The arc width. + *

+ * @param int $height

+ * The arc height. + *

+ * @param int $start

+ * The arc start angle, in degrees. + *

+ * @param int $end

+ * The arc end angle, in degrees. + * 0° is located at the three-o'clock position, and the arc is drawn + * clockwise. + *

+ * @param int $color

+ * A color identifier created with + * imagecolorallocate. + *

+ * @param int $style

+ * A bitwise OR of the following possibilities: + * IMG_ARC_PIE + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagefilledarc ($image, $cx, $cy, $width, $height, $start, $end, $color, $style) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Draw a filled ellipse + * @link http://php.net/manual/en/function.imagefilledellipse.php + * @param resource $image + * @param int $cx

+ * x-coordinate of the center. + *

+ * @param int $cy

+ * y-coordinate of the center. + *

+ * @param int $width

+ * The ellipse width. + *

+ * @param int $height

+ * The ellipse height. + *

+ * @param int $color

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagefilledellipse ($image, $cx, $cy, $width, $height, $color) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Set the blending mode for an image + * @link http://php.net/manual/en/function.imagealphablending.php + * @param resource $image + * @param bool $blendmode

+ * Whether to enable the blending mode or not. On true color images + * the default value is TRUE otherwise the default value is FALSE + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagealphablending ($image, $blendmode) {} + +/** + * (PHP 4 >= 4.3.2, PHP 5)
+ * Set the flag to save full alpha channel information (as opposed to single-color transparency) when saving PNG images + * @link http://php.net/manual/en/function.imagesavealpha.php + * @param resource $image + * @param bool $saveflag

+ * Whether to save the alpha channel or not. Default to FALSE. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagesavealpha ($image, $saveflag) {} + +/** + * (PHP 4 >= 4.3.2, PHP 5)
+ * Allocate a color for an image + * @link http://php.net/manual/en/function.imagecolorallocatealpha.php + * @param resource $image + * @param int $red

Value of red component.

+ * @param int $green

Value of green component.

+ * @param int $blue

Value of blue component.

+ * @param int $alpha

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int A color identifier or FALSE if the allocation failed. + * @jms-builtin + */ +function imagecolorallocatealpha ($image, $red, $green, $blue, $alpha) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Get the index of the specified color + alpha or its closest possible alternative + * @link http://php.net/manual/en/function.imagecolorresolvealpha.php + * @param resource $image + * @param int $red

Value of red component.

+ * @param int $green

Value of green component.

+ * @param int $blue

Value of blue component.

+ * @param int $alpha

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int a color index. + * @jms-builtin + */ +function imagecolorresolvealpha ($image, $red, $green, $blue, $alpha) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Get the index of the closest color to the specified color + alpha + * @link http://php.net/manual/en/function.imagecolorclosestalpha.php + * @param resource $image + * @param int $red

Value of red component.

+ * @param int $green

Value of green component.

+ * @param int $blue

Value of blue component.

+ * @param int $alpha

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int the index of the closest color in the palette. + * @jms-builtin + */ +function imagecolorclosestalpha ($image, $red, $green, $blue, $alpha) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Get the index of the specified color + alpha + * @link http://php.net/manual/en/function.imagecolorexactalpha.php + * @param resource $image + * @param int $red

Value of red component.

+ * @param int $green

Value of green component.

+ * @param int $blue

Value of blue component.

+ * @param int $alpha

+ * A value between 0 and 127. + * 0 indicates completely opaque while + * 127 indicates completely transparent. + *

+ * @return int the index of the specified color+alpha in the palette of the + * image, or -1 if the color does not exist in the image's palette. + * @jms-builtin + */ +function imagecolorexactalpha ($image, $red, $green, $blue, $alpha) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Copy and resize part of an image with resampling + * @link http://php.net/manual/en/function.imagecopyresampled.php + * @param resource $dst_image

Destination image link resource.

+ * @param resource $src_image

Source image link resource.

+ * @param int $dst_x

+ * x-coordinate of destination point. + *

+ * @param int $dst_y

+ * y-coordinate of destination point. + *

+ * @param int $src_x

+ * x-coordinate of source point. + *

+ * @param int $src_y

+ * y-coordinate of source point. + *

+ * @param int $dst_w

+ * Destination width. + *

+ * @param int $dst_h

+ * Destination height. + *

+ * @param int $src_w

Source width.

+ * @param int $src_h

Source height.

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagecopyresampled ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Rotate an image with a given angle + * @link http://php.net/manual/en/function.imagerotate.php + * @param resource $image + * @param float $angle

+ * Rotation angle, in degrees. The rotation angle is interpreted as the + * number of degrees to rotate the image anticlockwise. + *

+ * @param int $bgd_color

+ * Specifies the color of the uncovered zone after the rotation + *

+ * @param int $ignore_transparent [optional]

+ * If set and non-zero, transparent colors are ignored (otherwise kept). + *

+ * @return resource an image resource for the rotated image, or FALSE on failure. + * @jms-builtin + */ +function imagerotate ($image, $angle, $bgd_color, $ignore_transparent = 0) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Set the tile image for filling + * @link http://php.net/manual/en/function.imagesettile.php + * @param resource $image + * @param resource $tile

+ * The image resource to be used as a tile. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagesettile ($image, $tile) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Set the brush image for line drawing + * @link http://php.net/manual/en/function.imagesetbrush.php + * @param resource $image + * @param resource $brush

+ * An image resource. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagesetbrush ($image, $brush) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Set the style for line drawing + * @link http://php.net/manual/en/function.imagesetstyle.php + * @param resource $image + * @param array $style

+ * An array of pixel colors. You can use the + * IMG_COLOR_TRANSPARENT constant to add a + * transparent pixel. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagesetstyle ($image, array $style) {} + +/** + * (PHP 4, PHP 5)
+ * Create a new image from file or URL + * @link http://php.net/manual/en/function.imagecreatefrompng.php + * @param string $filename

+ * Path to the PNG image. + *

+ * @return resource an image resource identifier on success, FALSE on errors. + * @jms-builtin + */ +function imagecreatefrompng ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Create a new image from file or URL + * @link http://php.net/manual/en/function.imagecreatefromgif.php + * @param string $filename

+ * Path to the GIF image. + *

+ * @return resource an image resource identifier on success, FALSE on errors. + * @jms-builtin + */ +function imagecreatefromgif ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Create a new image from file or URL + * @link http://php.net/manual/en/function.imagecreatefromjpeg.php + * @param string $filename

+ * Path to the JPEG image. + *

+ * @return resource an image resource identifier on success, FALSE on errors. + * @jms-builtin + */ +function imagecreatefromjpeg ($filename) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Create a new image from file or URL + * @link http://php.net/manual/en/function.imagecreatefromwbmp.php + * @param string $filename

+ * Path to the WBMP image. + *

+ * @return resource an image resource identifier on success, FALSE on errors. + * @jms-builtin + */ +function imagecreatefromwbmp ($filename) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * Create a new image from GD file or URL + * @link http://php.net/manual/en/function.imagecreatefromgd.php + * @param string $filename

+ * Path to the GD file. + *

+ * @return resource an image resource identifier on success, FALSE on errors. + * @jms-builtin + */ +function imagecreatefromgd ($filename) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * Create a new image from GD2 file or URL + * @link http://php.net/manual/en/function.imagecreatefromgd2.php + * @param string $filename

+ * Path to the GD2 image. + *

+ * @return resource an image resource identifier on success, FALSE on errors. + * @jms-builtin + */ +function imagecreatefromgd2 ($filename) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * Create a new image from a given part of GD2 file or URL + * @link http://php.net/manual/en/function.imagecreatefromgd2part.php + * @param string $filename

+ * Path to the GD2 image. + *

+ * @param int $srcX

+ * x-coordinate of source point. + *

+ * @param int $srcY

+ * y-coordinate of source point. + *

+ * @param int $width

Source width.

+ * @param int $height

Source height.

+ * @return resource an image resource identifier on success, FALSE on errors. + * @jms-builtin + */ +function imagecreatefromgd2part ($filename, $srcX, $srcY, $width, $height) {} + +/** + * (PHP 4, PHP 5)
+ * Output a PNG image to either the browser or a file + * @link http://php.net/manual/en/function.imagepng.php + * @param resource $image + * @param string $filename [optional]

The path to save the file to. If not set or NULL, the raw image stream will be outputted directly.

+ *

+ * NULL is invalid if the quality and + * filters arguments are not used. + *

+ * @param int $quality [optional]

+ * Compression level: from 0 (no compression) to 9. + *

+ * @param int $filters [optional]

+ * Allows reducing the PNG file size. It is a bitmask field which may be + * set to any combination of the PNG_FILTER_XXX + * constants. PNG_NO_FILTER or + * PNG_ALL_FILTERS may also be used to respectively + * disable or activate all filters. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagepng ($image, $filename = null, $quality = null, $filters = null) {} + +/** + * (PHP 4, PHP 5)
+ * Output image to browser or file + * @link http://php.net/manual/en/function.imagegif.php + * @param resource $image + * @param string $filename [optional]

The path to save the file to. If not set or NULL, the raw image stream will be outputted directly.

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagegif ($image, $filename = null) {} + +/** + * (PHP 4, PHP 5)
+ * Output image to browser or file + * @link http://php.net/manual/en/function.imagejpeg.php + * @param resource $image + * @param string $filename [optional]

The path to save the file to. If not set or NULL, the raw image stream will be outputted directly.

+ *

+ * To skip this argument in order to provide the + * quality parameter, use NULL. + *

+ * @param int $quality [optional]

+ * quality is optional, and ranges from 0 (worst + * quality, smaller file) to 100 (best quality, biggest file). The + * default is the default IJG quality value (about 75). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagejpeg ($image, $filename = null, $quality = null) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Output image to browser or file + * @link http://php.net/manual/en/function.imagewbmp.php + * @param resource $image + * @param string $filename [optional]

The path to save the file to. If not set or NULL, the raw image stream will be outputted directly.

+ * @param int $foreground [optional]

+ * You can set the foreground color with this parameter by setting an + * identifier obtained from imagecolorallocate. + * The default foreground color is black. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagewbmp ($image, $filename = null, $foreground = null) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * Output GD image to browser or file + * @link http://php.net/manual/en/function.imagegd.php + * @param resource $image + * @param string $filename [optional]

The path to save the file to. If not set or NULL, the raw image stream will be outputted directly.

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagegd ($image, $filename = null) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * Output GD2 image to browser or file + * @link http://php.net/manual/en/function.imagegd2.php + * @param resource $image + * @param string $filename [optional]

The path to save the file to. If not set or NULL, the raw image stream will be outputted directly.

+ * @param int $chunk_size [optional]

+ * Chunk size. + *

+ * @param int $type [optional]

+ * Either IMG_GD2_RAW or + * IMG_GD2_COMPRESSED. Default is + * IMG_GD2_RAW. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagegd2 ($image, $filename = null, $chunk_size = null, $type = 'IMG_GD2_RAW') {} + +/** + * (PHP 4, PHP 5)
+ * Destroy an image + * @link http://php.net/manual/en/function.imagedestroy.php + * @param resource $image + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagedestroy ($image) {} + +/** + * (PHP 4, PHP 5)
+ * Apply a gamma correction to a GD image + * @link http://php.net/manual/en/function.imagegammacorrect.php + * @param resource $image + * @param float $inputgamma

+ * The input gamma. + *

+ * @param float $outputgamma

+ * The output gamma. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagegammacorrect ($image, $inputgamma, $outputgamma) {} + +/** + * (PHP 4, PHP 5)
+ * Flood fill + * @link http://php.net/manual/en/function.imagefill.php + * @param resource $image + * @param int $x

+ * x-coordinate of start point. + *

+ * @param int $y

+ * y-coordinate of start point. + *

+ * @param int $color

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagefill ($image, $x, $y, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Draw a filled polygon + * @link http://php.net/manual/en/function.imagefilledpolygon.php + * @param resource $image + * @param array $points

+ * An array containing the x and y + * coordinates of the polygons vertices consecutively. + *

+ * @param int $num_points

+ * Total number of vertices, which must be at least 3. + *

+ * @param int $color

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagefilledpolygon ($image, array $points, $num_points, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Draw a filled rectangle + * @link http://php.net/manual/en/function.imagefilledrectangle.php + * @param resource $image + * @param int $x1

+ * x-coordinate for point 1. + *

+ * @param int $y1

+ * y-coordinate for point 1. + *

+ * @param int $x2

+ * x-coordinate for point 2. + *

+ * @param int $y2

+ * y-coordinate for point 2. + *

+ * @param int $color

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagefilledrectangle ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Flood fill to specific color + * @link http://php.net/manual/en/function.imagefilltoborder.php + * @param resource $image + * @param int $x

+ * x-coordinate of start. + *

+ * @param int $y

+ * y-coordinate of start. + *

+ * @param int $border

+ * The border color. A color identifier created with + * imagecolorallocate. + *

+ * @param int $color

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagefilltoborder ($image, $x, $y, $border, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Get font width + * @link http://php.net/manual/en/function.imagefontwidth.php + * @param int $font + * @return int the width of the pixel + * @jms-builtin + */ +function imagefontwidth ($font) {} + +/** + * (PHP 4, PHP 5)
+ * Get font height + * @link http://php.net/manual/en/function.imagefontheight.php + * @param int $font + * @return int the height of the pixel. + * @jms-builtin + */ +function imagefontheight ($font) {} + +/** + * (PHP 4, PHP 5)
+ * Enable or disable interlace + * @link http://php.net/manual/en/function.imageinterlace.php + * @param resource $image + * @param int $interlace [optional]

+ * If non-zero, the image will be interlaced, else the interlace bit is + * turned off. + *

+ * @return int 1 if the interlace bit is set for the image, 0 otherwise. + * @jms-builtin + */ +function imageinterlace ($image, $interlace = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Draw a line + * @link http://php.net/manual/en/function.imageline.php + * @param resource $image + * @param int $x1

+ * x-coordinate for first point. + *

+ * @param int $y1

+ * y-coordinate for first point. + *

+ * @param int $x2

+ * x-coordinate for second point. + *

+ * @param int $y2

+ * y-coordinate for second point. + *

+ * @param int $color

+ * The line color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imageline ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Load a new font + * @link http://php.net/manual/en/function.imageloadfont.php + * @param string $file

+ * The font file format is currently binary and architecture + * dependent. This means you should generate the font files on the + * same type of CPU as the machine you are running PHP on. + *

+ *

+ * + * Font file format + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
byte positionC data typedescription
byte 0-3intnumber of characters in the font
byte 4-7int + * value of first character in the font (often 32 for space) + *
byte 8-11intpixel width of each character
byte 12-15intpixel height of each character
byte 16-char + * array with character data, one byte per pixel in each + * character, for a total of (nchars*width*height) bytes. + *
+ *

+ * @return int The font identifier which is always bigger than 5 to avoid conflicts with + * built-in fonts or FALSE on errors. + * @jms-builtin + */ +function imageloadfont ($file) {} + +/** + * (PHP 4, PHP 5)
+ * Draws a polygon + * @link http://php.net/manual/en/function.imagepolygon.php + * @param resource $image + * @param array $points

+ * An array containing the polygon's vertices, e.g.: + * + * points[0] + * = x0 + * + * + * points[1] + * = y0 + * + * + * points[2] + * = x1 + * + * + * points[3] + * = y1 + * + *

+ * @param int $num_points

+ * Total number of points (vertices). + *

+ * @param int $color

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagepolygon ($image, array $points, $num_points, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Draw a rectangle + * @link http://php.net/manual/en/function.imagerectangle.php + * @param resource $image + * @param int $x1

+ * Upper left x coordinate. + *

+ * @param int $y1

+ * Upper left y coordinate + * 0, 0 is the top left corner of the image. + *

+ * @param int $x2

+ * Bottom right x coordinate. + *

+ * @param int $y2

+ * Bottom right y coordinate. + *

+ * @param int $color

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagerectangle ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Set a single pixel + * @link http://php.net/manual/en/function.imagesetpixel.php + * @param resource $image + * @param int $x

+ * x-coordinate. + *

+ * @param int $y

+ * y-coordinate. + *

+ * @param int $color

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagesetpixel ($image, $x, $y, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Draw a string horizontally + * @link http://php.net/manual/en/function.imagestring.php + * @param resource $image + * @param int $font + * @param int $x

+ * x-coordinate of the upper left corner. + *

+ * @param int $y

+ * y-coordinate of the upper left corner. + *

+ * @param string $string

+ * The string to be written. + *

+ * @param int $color

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagestring ($image, $font, $x, $y, $string, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Draw a string vertically + * @link http://php.net/manual/en/function.imagestringup.php + * @param resource $image + * @param int $font + * @param int $x

+ * x-coordinate of the bottom left corner. + *

+ * @param int $y

+ * y-coordinate of the bottom left corner. + *

+ * @param string $string

+ * The string to be written. + *

+ * @param int $color

+ * A color identifier created with + * imagecolorallocate. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagestringup ($image, $font, $x, $y, $string, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Get image width + * @link http://php.net/manual/en/function.imagesx.php + * @param resource $image + * @return int Return the width of the image or FALSE on + * errors. + * @jms-builtin + */ +function imagesx ($image) {} + +/** + * (PHP 4, PHP 5)
+ * Get image height + * @link http://php.net/manual/en/function.imagesy.php + * @param resource $image + * @return int Return the height of the image or FALSE on + * errors. + * @jms-builtin + */ +function imagesy ($image) {} + +/** + * (PHP 4, PHP 5)
+ * Draw a dashed line + * @link http://php.net/manual/en/function.imagedashedline.php + * @param resource $image + * @param int $x1

+ * Upper left x coordinate. + *

+ * @param int $y1

+ * Upper left y coordinate 0, 0 is the top left corner of the image. + *

+ * @param int $x2

+ * Bottom right x coordinate. + *

+ * @param int $y2

+ * Bottom right y coordinate. + *

+ * @param int $color

+ * The fill color. A color identifier created with + * imagecolorallocate. + *

+ * @return bool Always returns true + * @jms-builtin + */ +function imagedashedline ($image, $x1, $y1, $x2, $y2, $color) {} + +/** + * (PHP 4, PHP 5)
+ * Give the bounding box of a text using TrueType fonts + * @link http://php.net/manual/en/function.imagettfbbox.php + * @param float $size

+ * The font size. + * In GD 1, this is measured in pixels. In GD 2, this is measured in + * points. + *

+ * @param float $angle

+ * Angle in degrees in which text will be measured. + *

+ * @param string $fontfile

+ * The name of the TrueType font file (can be a URL). Depending on + * which version of the GD library that PHP is using, it may attempt to + * search for files that do not begin with a leading '/' by appending + * '.ttf' to the filename and searching along a library-defined font path. + *

+ * @param string $text

+ * The string to be measured. + *

+ * @return array imagettfbbox returns an array with 8 + * elements representing four points making the bounding box of the + * text on success and FALSE on error. + * + * key + * contents + * + * + * 0 + * lower left corner, X position + * + * + * 1 + * lower left corner, Y position + * + * + * 2 + * lower right corner, X position + * + * + * 3 + * lower right corner, Y position + * + * + * 4 + * upper right corner, X position + * + * + * 5 + * upper right corner, Y position + * + * + * 6 + * upper left corner, X position + * + * + * 7 + * upper left corner, Y position + * + *

+ *

+ * The points are relative to the text regardless of the + * angle, so "upper left" means in the top left-hand + * corner seeing the text horizontally. + * @jms-builtin + */ +function imagettfbbox ($size, $angle, $fontfile, $text) {} + +/** + * (PHP 4, PHP 5)
+ * Write text to the image using TrueType fonts + * @link http://php.net/manual/en/function.imagettftext.php + * @param resource $image + * @param float $size

The font size. Depending on your version of GD, this should be specified as the pixel size (GD1) or point size (GD2).

+ * @param float $angle

+ * The angle in degrees, with 0 degrees being left-to-right reading text. + * Higher values represent a counter-clockwise rotation. For example, a + * value of 90 would result in bottom-to-top reading text. + *

+ * @param int $x

+ * The coordinates given by x and + * y will define the basepoint of the first + * character (roughly the lower-left corner of the character). This + * is different from the imagestring, where + * x and y define the + * upper-left corner of the first character. For example, "top left" + * is 0, 0. + *

+ * @param int $y

+ * The y-ordinate. This sets the position of the fonts baseline, not the + * very bottom of the character. + *

+ * @param int $color

+ * The color index. Using the negative of a color index has the effect of + * turning off antialiasing. See imagecolorallocate. + *

+ * @param string $fontfile

+ * The path to the TrueType font you wish to use. + *

+ *

+ * Depending on which version of the GD library PHP is using, when + * fontfile does not begin with a leading + * / then .ttf will be appended + * to the filename and the library will attempt to search for that + * filename along a library-defined font path. + *

+ *

+ * When using versions of the GD library lower than 2.0.18, a space character, + * rather than a semicolon, was used as the 'path separator' for different font files. + * Unintentional use of this feature will result in the warning message: + * Warning: Could not find/open font. For these affected versions, the + * only solution is moving the font to a path which does not contain spaces. + *

+ *

+ * In many cases where a font resides in the same directory as the script using it + * the following trick will alleviate any include problems. + * + * // Set the enviroment variable for GD + * putenv('GDFONTPATH=' . realpath('.')); + * // Name the font to be used (note the lack of the .ttf extension) + * $font = 'SomeFont'; + * + *

+ * @param string $text

+ * The text string in UTF-8 encoding. + *

+ *

+ * May include decimal numeric character references (of the form: + * &#38;#8364;) to access characters in a font beyond position 127. + * The hexadecimal format (like &#38;#xA9;) is supported. + * Strings in UTF-8 encoding can be passed directly. + *

+ *

+ * Named entities, such as &#38;copy;, are not supported. Consider using + * html_entity_decode + * to decode these named entities into UTF-8 strings (html_entity_decode() + * supports this as of PHP 5.0.0). + *

+ *

+ * If a character is used in the string which is not supported by the + * font, a hollow rectangle will replace the character. + *

+ * @return array an array with 8 elements representing four points making the + * bounding box of the text. The order of the points is lower left, lower + * right, upper right, upper left. The points are relative to the text + * regardless of the angle, so "upper left" means in the top left-hand + * corner when you see the text horizontally. + * Returns FALSE on error. + * @jms-builtin + */ +function imagettftext ($image, $size, $angle, $x, $y, $color, $fontfile, $text) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * Give the bounding box of a text using fonts via freetype2 + * @link http://php.net/manual/en/function.imageftbbox.php + * @param float $size

The font size. Depending on your version of GD, this should be specified as the pixel size (GD1) or point size (GD2).

+ * @param float $angle

+ * Angle in degrees in which text will be + * measured. + *

+ * @param string $fontfile

+ * The name of the TrueType font file (can be a URL). Depending on + * which version of the GD library that PHP is using, it may attempt to + * search for files that do not begin with a leading '/' by appending + * '.ttf' to the filename and searching along a library-defined font path. + *

+ * @param string $text

+ * The string to be measured. + *

+ * @param array $extrainfo [optional]

+ * + * Possible array indexes for extrainfo + * + * + * + * + * + * + * + * + * + * + *
KeyTypeMeaning
linespacingfloatDefines drawing linespacing
+ *

+ * @return array imageftbbox returns an array with 8 + * elements representing four points making the bounding box of the + * text: + * + * 0 + * lower left corner, X position + * + * + * 1 + * lower left corner, Y position + * + * + * 2 + * lower right corner, X position + * + * + * 3 + * lower right corner, Y position + * + * + * 4 + * upper right corner, X position + * + * + * 5 + * upper right corner, Y position + * + * + * 6 + * upper left corner, X position + * + * + * 7 + * upper left corner, Y position + * + *

+ *

+ * The points are relative to the text regardless of the + * angle, so "upper left" means in the top left-hand + * corner seeing the text horizontally. + * @jms-builtin + */ +function imageftbbox ($size, $angle, $fontfile, $text, array $extrainfo = null) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * Write text to the image using fonts using FreeType 2 + * @link http://php.net/manual/en/function.imagefttext.php + * @param resource $image + * @param float $size

+ * The font size to use in points. + *

+ * @param float $angle

+ * The angle in degrees, with 0 degrees being left-to-right reading text. + * Higher values represent a counter-clockwise rotation. For example, a + * value of 90 would result in bottom-to-top reading text. + *

+ * @param int $x

+ * The coordinates given by x and + * y will define the basepoint of the first + * character (roughly the lower-left corner of the character). This + * is different from the imagestring, where + * x and y define the + * upper-left corner of the first character. For example, "top left" + * is 0, 0. + *

+ * @param int $y

+ * The y-ordinate. This sets the position of the fonts baseline, not the + * very bottom of the character. + *

+ * @param int $color

+ * The index of the desired color for the text, see + * imagecolorexact. + *

+ * @param string $fontfile

+ * The path to the TrueType font you wish to use. + *

+ *

+ * Depending on which version of the GD library PHP is using, when + * fontfile does not begin with a leading + * / then .ttf will be appended + * to the filename and the library will attempt to search for that + * filename along a library-defined font path. + *

+ *

+ * When using versions of the GD library lower than 2.0.18, a space character, + * rather than a semicolon, was used as the 'path separator' for different font files. + * Unintentional use of this feature will result in the warning message: + * Warning: Could not find/open font. For these affected versions, the + * only solution is moving the font to a path which does not contain spaces. + *

+ *

+ * In many cases where a font resides in the same directory as the script using it + * the following trick will alleviate any include problems. + * + * // Set the enviroment variable for GD + * putenv('GDFONTPATH=' . realpath('.')); + * // Name the font to be used (note the lack of the .ttf extension) + * $font = 'SomeFont'; + * + *

+ * @param string $text

+ * Text to be inserted into image. + *

+ * @param array $extrainfo [optional]

+ * + * Possible array indexes for extrainfo + * + * + * + * + * + * + * + * + * + * + *
KeyTypeMeaning
linespacingfloatDefines drawing linespacing
+ *

+ * @return array This function returns an array defining the four points of the box, starting in the lower left and moving counter-clockwise: + * + * 0 + * lower left x-coordinate + * + * + * 1 + * lower left y-coordinate + * + * + * 2 + * lower right x-coordinate + * + * + * 3 + * lower right y-coordinate + * + * + * 4 + * upper right x-coordinate + * + * + * 5 + * upper right y-coordinate + * + * + * 6 + * upper left x-coordinate + * + * + * 7 + * upper left y-coordinate + * + * @jms-builtin + */ +function imagefttext ($image, $size, $angle, $x, $y, $color, $fontfile, $text, array $extrainfo = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Return the image types supported by this PHP build + * @link http://php.net/manual/en/function.imagetypes.php + * @return int a bit-field corresponding to the image formats supported by the + * version of GD linked into PHP. The following bits are returned, + * IMG_GIF | IMG_JPG | + * IMG_PNG | IMG_WBMP | + * IMG_XPM. + * @jms-builtin + */ +function imagetypes () {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Convert JPEG image file to WBMP image file + * @link http://php.net/manual/en/function.jpeg2wbmp.php + * @param string $jpegname

+ * Path to JPEG file. + *

+ * @param string $wbmpname

+ * Path to destination WBMP file. + *

+ * @param int $dest_height

+ * Destination image height. + *

+ * @param int $dest_width

+ * Destination image width. + *

+ * @param int $threshold

+ * Threshold value, between 0 and 8 (inclusive). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function jpeg2wbmp ($jpegname, $wbmpname, $dest_height, $dest_width, $threshold) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Convert PNG image file to WBMP image file + * @link http://php.net/manual/en/function.png2wbmp.php + * @param string $pngname

+ * Path to PNG file. + *

+ * @param string $wbmpname

+ * Path to destination WBMP file. + *

+ * @param int $dest_height

+ * Destination image height. + *

+ * @param int $dest_width

+ * Destination image width. + *

+ * @param int $threshold

+ * Threshold value, between 0 and 8 (inclusive). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function png2wbmp ($pngname, $wbmpname, $dest_height, $dest_width, $threshold) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Output image to browser or file + * @link http://php.net/manual/en/function.image2wbmp.php + * @param resource $image + * @param string $filename [optional]

+ * Path to the saved file. If not given, the raw image stream will be + * outputted directly. + *

+ * @param int $threshold [optional]

+ * Threshold value, between 0 and 255 (inclusive). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function image2wbmp ($image, $filename = null, $threshold = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Makes the colors of the palette version of an image more closely match the true color version + * @link http://php.net/manual/en/function.imagecolormatch.php + * @param resource $image1

+ * A truecolor image link resource. + *

+ * @param resource $image2

+ * A palette image link resource pointing to an image that has the same + * size as image1. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagecolormatch ($image1, $image2) {} + +/** + * (PHP 5)
+ * Applies a filter to an image + * @link http://php.net/manual/en/function.imagefilter.php + * @param resource $image + * @param int $filtertype

+ * filtertype can be one of the following: + * IMG_FILTER_NEGATE: Reverses all colors of + * the image. + * @param int $arg1 [optional]

+ * IMG_FILTER_BRIGHTNESS: Brightness level. + * @param int $arg2 [optional]

+ * IMG_FILTER_COLORIZE: Value of green component. + * @param int $arg3 [optional]

+ * IMG_FILTER_COLORIZE: Value of blue component. + * @param int $arg4 [optional]

+ * IMG_FILTER_COLORIZE: Alpha channel, A value + * between 0 and 127. 0 indicates completely opaque while 127 indicates + * completely transparent. + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imagefilter ($image, $filtertype, $arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Apply a 3x3 convolution matrix, using coefficient and offset + * @link http://php.net/manual/en/function.imageconvolution.php + * @param resource $image + * @param array $matrix

+ * A 3x3 matrix: an array of three arrays of three floats. + *

+ * @param float $div

+ * The divisor of the result of the convolution, used for normalization. + *

+ * @param float $offset

+ * Color offset. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imageconvolution ($image, array $matrix, $div, $offset) {} + + +/** + * Used as a return value by imagetypes + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_GIF', 1); + +/** + * Used as a return value by imagetypes + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_JPG', 2); + +/** + * Used as a return value by imagetypes + *

+ * This constant has the same value as IMG_JPG + *

+ * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_JPEG', 2); + +/** + * Used as a return value by imagetypes + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_PNG', 4); + +/** + * Used as a return value by imagetypes + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_WBMP', 8); + +/** + * Used as a return value by imagetypes + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_XPM', 16); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_TILED', -5); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_STYLED', -2); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_BRUSHED', -3); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_STYLEDBRUSHED', -4); + +/** + * Special color option which can be used in stead of color allocated with + * imagecolorallocate or + * imagecolorallocatealpha + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_COLOR_TRANSPARENT', -6); + +/** + * A style constant used by the imagefilledarc function. + *

+ * This constant has the same value as IMG_ARC_PIE + *

+ * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_ROUNDED', 0); + +/** + * A style constant used by the imagefilledarc function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_PIE', 0); + +/** + * A style constant used by the imagefilledarc function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_CHORD', 1); + +/** + * A style constant used by the imagefilledarc function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_NOFILL', 2); + +/** + * A style constant used by the imagefilledarc function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_ARC_EDGED', 4); + +/** + * A type constant used by the imagegd2 function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_GD2_RAW', 1); + +/** + * A type constant used by the imagegd2 function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_GD2_COMPRESSED', 2); + +/** + * When the bundled version of GD is used this is 1 otherwise + * its set to 0. + * @link http://php.net/manual/en/image.constants.php + */ +define ('GD_BUNDLED', 0); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_NEGATE', 0); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_GRAYSCALE', 1); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_BRIGHTNESS', 2); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_CONTRAST', 3); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_COLORIZE', 4); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_EDGEDETECT', 5); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_GAUSSIAN_BLUR', 7); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_SELECTIVE_BLUR', 8); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_EMBOSS', 6); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_MEAN_REMOVAL', 9); + +/** + * Special GD filter used by the imagefilter function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_SMOOTH', 10); + +/** + * Special GD filter used by the imagefilter function. + * (Available as of PHP 5.3.0) + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMG_FILTER_PIXELATE', 11); + +/** + * The GD version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://php.net/manual/en/image.constants.php + */ +define ('GD_VERSION', "2.0.36"); + +/** + * The GD major version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://php.net/manual/en/image.constants.php + */ +define ('GD_MAJOR_VERSION', 2); + +/** + * The GD minor version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://php.net/manual/en/image.constants.php + */ +define ('GD_MINOR_VERSION', 0); + +/** + * The GD release version PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://php.net/manual/en/image.constants.php + */ +define ('GD_RELEASE_VERSION', 36); + +/** + * The GD "extra" version (beta/rc..) PHP was compiled against. + * (Available as of PHP 5.2.4) + * @link http://php.net/manual/en/image.constants.php + */ +define ('GD_EXTRA_VERSION', ""); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('PNG_NO_FILTER', 0); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_NONE', 8); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_SUB', 16); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_UP', 32); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_AVG', 64); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('PNG_FILTER_PAETH', 128); + +/** + * A special PNG filter, used by the imagepng function. + * @link http://php.net/manual/en/image.constants.php + */ +define ('PNG_ALL_FILTERS', 248); + +// End of gd v. +?> diff --git a/res/php-5.4-core-api/geoip.php b/res/php-5.4-core-api/geoip.php new file mode 100644 index 0000000..43ed216 --- /dev/null +++ b/res/php-5.4-core-api/geoip.php @@ -0,0 +1,225 @@ + + * Get GeoIP Database information + * @link http://php.net/manual/en/function.geoip-database-info.php + * @param int $database [optional]

+ * The database type as an integer. You can use the + * various constants defined with + * this extension (ie: GEOIP_*_EDITION). + *

+ * @return string the corresponding database version, or null on error. + * @jms-builtin + */ +function geoip_database_info ($database = 'GEOIP_COUNTRY_EDITION') {} + +/** + * (PECL geoip >= 0.2.0)
+ * Get the two letter country code + * @link http://php.net/manual/en/function.geoip-country-code-by-name.php + * @param string $hostname

+ * The hostname or IP address whose location is to be looked-up. + *

+ * @return string the two letter ISO country code on success, or false + * if the address cannot be found in the database. + * @jms-builtin + */ +function geoip_country_code_by_name ($hostname) {} + +/** + * (PECL geoip >= 0.2.0)
+ * Get the three letter country code + * @link http://php.net/manual/en/function.geoip-country-code3-by-name.php + * @param string $hostname

+ * The hostname or IP address whose location is to be looked-up. + *

+ * @return string the three letter country code on success, or false + * if the address cannot be found in the database. + * @jms-builtin + */ +function geoip_country_code3_by_name ($hostname) {} + +/** + * (PECL geoip >= 0.2.0)
+ * Get the full country name + * @link http://php.net/manual/en/function.geoip-country-name-by-name.php + * @param string $hostname

+ * The hostname or IP address whose location is to be looked-up. + *

+ * @return string the country name on success, or false if the address cannot + * be found in the database. + * @jms-builtin + */ +function geoip_country_name_by_name ($hostname) {} + +/** + * (PECL geoip >= 1.0.3)
+ * Get the two letter continent code + * @link http://php.net/manual/en/function.geoip-continent-code-by-name.php + * @param string $hostname

+ * The hostname or IP address whose location is to be looked-up. + *

+ * @return string the two letter continent code on success, or false if the + * address cannot be found in the database. + * @jms-builtin + */ +function geoip_continent_code_by_name ($hostname) {} + +/** + * (PECL geoip >= 0.2.0)
+ * Get the organization name + * @link http://php.net/manual/en/function.geoip-org-by-name.php + * @param string $hostname

+ * The hostname or IP address. + *

+ * @return string the organization name on success, or false if the address + * cannot be found in the database. + * @jms-builtin + */ +function geoip_org_by_name ($hostname) {} + +/** + * (PECL geoip >= 0.2.0)
+ * Returns the detailed City information found in the GeoIP Database + * @link http://php.net/manual/en/function.geoip-record-by-name.php + * @param string $hostname

+ * The hostname or IP address whose record is to be looked-up. + *

+ * @return array the associative array on success, or false if the address + * cannot be found in the database. + * @jms-builtin + */ +function geoip_record_by_name ($hostname) {} + +/** + * (PECL geoip >= 0.2.0)
+ * Get the Internet connection type + * @link http://php.net/manual/en/function.geoip-id-by-name.php + * @param string $hostname

+ * The hostname or IP address whose connection type is to be looked-up. + *

+ * @return int the connection type. + * @jms-builtin + */ +function geoip_id_by_name ($hostname) {} + +/** + * (PECL geoip >= 0.2.0)
+ * Get the country code and region + * @link http://php.net/manual/en/function.geoip-region-by-name.php + * @param string $hostname

+ * The hostname or IP address whose region is to be looked-up. + *

+ * @return array the associative array on success, or false if the address + * cannot be found in the database. + * @jms-builtin + */ +function geoip_region_by_name ($hostname) {} + +/** + * (PECL geoip >= 1.0.2)
+ * Get the Internet Service Provider (ISP) name + * @link http://php.net/manual/en/function.geoip-isp-by-name.php + * @param string $hostname

+ * The hostname or IP address. + *

+ * @return string the ISP name on success, or false if the address + * cannot be found in the database. + * @jms-builtin + */ +function geoip_isp_by_name ($hostname) {} + +/** + * (PECL geoip >= 1.0.1)
+ * Determine if GeoIP Database is available + * @link http://php.net/manual/en/function.geoip-db-avail.php + * @param int $database

+ * The database type as an integer. You can use the + * various constants defined with + * this extension (ie: GEOIP_*_EDITION). + *

+ * @return bool true is database exists, false if not found, or null on error. + * @jms-builtin + */ +function geoip_db_avail ($database) {} + +/** + * (PECL geoip >= 1.0.1)
+ * Returns detailed information about all GeoIP database types + * @link http://php.net/manual/en/function.geoip-db-get-all-info.php + * @return array the associative array. + * @jms-builtin + */ +function geoip_db_get_all_info () {} + +/** + * (PECL geoip >= 1.0.1)
+ * Returns the filename of the corresponding GeoIP Database + * @link http://php.net/manual/en/function.geoip-db-filename.php + * @param int $database

+ * The database type as an integer. You can use the + * various constants defined with + * this extension (ie: GEOIP_*_EDITION). + *

+ * @return string the filename of the corresponding database, or null on error. + * @jms-builtin + */ +function geoip_db_filename ($database) {} + +/** + * (PECL geoip >= 1.0.4)
+ * Returns the region name for some country and region code combo + * @link http://php.net/manual/en/function.geoip-region-name-by-code.php + * @param string $country_code

+ * The two-letter country code (see + * geoip_country_code_by_name) + *

+ * @param string $region_code

+ * The two-letter (or digit) region code (see + * geoip_region_by_name) + *

+ * @return string the region name on success, or false if the country and region code + * combo cannot be found. + * @jms-builtin + */ +function geoip_region_name_by_code ($country_code, $region_code) {} + +/** + * (PECL geoip >= 1.0.4)
+ * Returns the time zone for some country and region code combo + * @link http://php.net/manual/en/function.geoip-time-zone-by-country-and-region.php + * @param string $country_code

+ * The two-letter country code (see + * geoip_country_code_by_name) + *

+ * @param string $region_code [optional]

+ * The two-letter (or digit) region code (see + * geoip_region_by_name) + *

+ * @return string the time zone on success, or false if the country and region code + * combo cannot be found. + * @jms-builtin + */ +function geoip_time_zone_by_country_and_region ($country_code, $region_code = null) {} + +define ('GEOIP_COUNTRY_EDITION', 1); +define ('GEOIP_REGION_EDITION_REV0', 7); +define ('GEOIP_CITY_EDITION_REV0', 6); +define ('GEOIP_ORG_EDITION', 5); +define ('GEOIP_ISP_EDITION', 4); +define ('GEOIP_CITY_EDITION_REV1', 2); +define ('GEOIP_REGION_EDITION_REV1', 3); +define ('GEOIP_PROXY_EDITION', 8); +define ('GEOIP_ASNUM_EDITION', 9); +define ('GEOIP_NETSPEED_EDITION', 10); +define ('GEOIP_DOMAIN_EDITION', 11); +define ('GEOIP_UNKNOWN_SPEED', 0); +define ('GEOIP_DIALUP_SPEED', 1); +define ('GEOIP_CABLEDSL_SPEED', 2); +define ('GEOIP_CORPORATE_SPEED', 3); + +// End of geoip v.1.0.7 +?> diff --git a/res/php-5.4-core-api/gettext.php b/res/php-5.4-core-api/gettext.php new file mode 100644 index 0000000..8b813e4 --- /dev/null +++ b/res/php-5.4-core-api/gettext.php @@ -0,0 +1,147 @@ + + * Sets the default domain + * @link http://php.net/manual/en/function.textdomain.php + * @param string $text_domain

+ * The new message domain, or NULL to get the current setting without + * changing it + *

+ * @return string If successful, this function returns the current message + * domain, after possibly changing it. + * @jms-builtin + */ +function textdomain ($text_domain) {} + +/** + * (PHP 4, PHP 5)
+ * Lookup a message in the current domain + * @link http://php.net/manual/en/function.gettext.php + * @param string $message

+ * The message being translated. + *

+ * @return string a translated string if one is found in the + * translation table, or the submitted message if not found. + * @jms-builtin + */ +function gettext ($message) {} + +/** + * @param $msgid + * @jms-builtin + */ +function _ ($msgid) {} + +/** + * (PHP 4, PHP 5)
+ * Override the current domain + * @link http://php.net/manual/en/function.dgettext.php + * @param string $domain

+ * The domain + *

+ * @param string $message

+ * The message + *

+ * @return string A string on success. + * @jms-builtin + */ +function dgettext ($domain, $message) {} + +/** + * (PHP 4, PHP 5)
+ * Overrides the domain for a single lookup + * @link http://php.net/manual/en/function.dcgettext.php + * @param string $domain

+ * The domain + *

+ * @param string $message

+ * The message + *

+ * @param int $category

+ * The category + *

+ * @return string A string on success. + * @jms-builtin + */ +function dcgettext ($domain, $message, $category) {} + +/** + * (PHP 4, PHP 5)
+ * Sets the path for a domain + * @link http://php.net/manual/en/function.bindtextdomain.php + * @param string $domain

+ * The domain + *

+ * @param string $directory

+ * The directory path + *

+ * @return string The full pathname for the domain currently being set. + * @jms-builtin + */ +function bindtextdomain ($domain, $directory) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Plural version of gettext + * @link http://php.net/manual/en/function.ngettext.php + * @param string $msgid1 + * @param string $msgid2 + * @param int $n + * @return string correct plural form of message identified by + * msgid1 and msgid2 + * for count n. + * @jms-builtin + */ +function ngettext ($msgid1, $msgid2, $n) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Plural version of dgettext + * @link http://php.net/manual/en/function.dngettext.php + * @param string $domain

+ * The domain + *

+ * @param string $msgid1 + * @param string $msgid2 + * @param int $n + * @return string A string on success. + * @jms-builtin + */ +function dngettext ($domain, $msgid1, $msgid2, $n) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Plural version of dcgettext + * @link http://php.net/manual/en/function.dcngettext.php + * @param string $domain

+ * The domain + *

+ * @param string $msgid1 + * @param string $msgid2 + * @param int $n + * @param int $category + * @return string A string on success. + * @jms-builtin + */ +function dcngettext ($domain, $msgid1, $msgid2, $n, $category) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Specify the character encoding in which the messages from the DOMAIN message catalog will be returned + * @link http://php.net/manual/en/function.bind-textdomain-codeset.php + * @param string $domain

+ * The domain + *

+ * @param string $codeset

+ * The code set + *

+ * @return string A string on success. + * @jms-builtin + */ +function bind_textdomain_codeset ($domain, $codeset) {} + +// End of gettext v. +?> diff --git a/res/php-5.4-core-api/gmp.php b/res/php-5.4-core-api/gmp.php new file mode 100644 index 0000000..17a4be0 --- /dev/null +++ b/res/php-5.4-core-api/gmp.php @@ -0,0 +1,682 @@ + + * Create GMP number + * @link http://php.net/manual/en/function.gmp-init.php + * @param mixed $number

+ * An integer or a string. The string representation can be decimal, + * hexadecimal or octal. + *

+ * @param int $base [optional]

+ * The base. + *

+ *

+ * The base may vary from 2 to 36. If base is 0 (default value), the + * actual base is determined from the leading characters: if the first + * two characters are 0x or 0X, + * hexadecimal is assumed, otherwise if the first character is "0", + * octal is assumed, otherwise decimal is assumed. + *

+ * @return resource A GMP number resource. + * @jms-builtin + */ +function gmp_init ($number, $base = 0) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Convert GMP number to integer + * @link http://php.net/manual/en/function.gmp-intval.php + * @param resource $gmpnumber

+ * A GMP number. + *

+ * @return int An integer value of gmpnumber. + * @jms-builtin + */ +function gmp_intval ($gmpnumber) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Convert GMP number to string + * @link http://php.net/manual/en/function.gmp-strval.php + * @param resource $gmpnumber

+ * The GMP number that will be converted to a string. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $base [optional]

+ * The base of the returned number. The default base is 10. + * Allowed values for the base are from 2 to 62 and -2 to -36. + *

+ * @return string The number, as a string. + * @jms-builtin + */ +function gmp_strval ($gmpnumber, $base = 10) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Add numbers + * @link http://php.net/manual/en/function.gmp-add.php + * @param resource $a

+ * A number that will be added. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b

+ * A number that will be added. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A GMP number representing the sum of the arguments. + * @jms-builtin + */ +function gmp_add ($a, $b) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Subtract numbers + * @link http://php.net/manual/en/function.gmp-sub.php + * @param resource $a

+ * The number being subtracted from. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b

+ * The number subtracted from a. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A GMP number resource. + * @jms-builtin + */ +function gmp_sub ($a, $b) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Multiply numbers + * @link http://php.net/manual/en/function.gmp-mul.php + * @param resource $a

+ * A number that will be multiplied by b. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b

+ * A number that will be multiplied by a. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A GMP number resource. + * @jms-builtin + */ +function gmp_mul ($a, $b) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Divide numbers and get quotient and remainder + * @link http://php.net/manual/en/function.gmp-div-qr.php + * @param resource $n

+ * The number being divided. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $d

+ * The number that n is being divided by. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $round [optional]

+ * See the gmp_div_q function for description + * of the round argument. + *

+ * @return array an array, with the first + * element being [n/d] (the integer result of the + * division) and the second being (n - [n/d] * d) + * (the remainder of the division). + * @jms-builtin + */ +function gmp_div_qr ($n, $d, $round = 'GMP_ROUND_ZERO') {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Divide numbers + * @link http://php.net/manual/en/function.gmp-div-q.php + * @param resource $a

+ * The number being divided. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b

+ * The number that a is being divided by. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $round [optional]

+ * The result rounding is defined by the + * round, which can have the following + * values: + * GMP_ROUND_ZERO: The result is truncated + * towards 0. + * @return resource A GMP number resource. + * @jms-builtin + */ +function gmp_div_q ($a, $b, $round = 'GMP_ROUND_ZERO') {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Remainder of the division of numbers + * @link http://php.net/manual/en/function.gmp-div-r.php + * @param resource $n

+ * The number being divided. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $d

+ * The number that n is being divided by. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $round [optional]

+ * See the gmp_div_q function for description + * of the round argument. + *

+ * @return resource The remainder, as a GMP number. + * @jms-builtin + */ +function gmp_div_r ($n, $d, $round = 'GMP_ROUND_ZERO') {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Alias of gmp_div_q + * @link http://php.net/manual/en/function.gmp-div.php + * @param $a + * @param $b + * @param $round [optional] + * @jms-builtin + */ +function gmp_div ($a, $b, $round) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Modulo operation + * @link http://php.net/manual/en/function.gmp-mod.php + * @param resource $n It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $d

+ * The modulo that is being evaluated. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A GMP number resource. + * @jms-builtin + */ +function gmp_mod ($n, $d) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Exact division of numbers + * @link http://php.net/manual/en/function.gmp-divexact.php + * @param resource $n

+ * The number being divided. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $d

+ * The number that a is being divided by. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A GMP number resource. + * @jms-builtin + */ +function gmp_divexact ($n, $d) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Negate number + * @link http://php.net/manual/en/function.gmp-neg.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource -a, as a GMP number. + * @jms-builtin + */ +function gmp_neg ($a) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Absolute value + * @link http://php.net/manual/en/function.gmp-abs.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource the absolute value of a, as a GMP number. + * @jms-builtin + */ +function gmp_abs ($a) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Factorial + * @link http://php.net/manual/en/function.gmp-fact.php + * @param mixed $a

+ * The factorial number. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A GMP number resource. + * @jms-builtin + */ +function gmp_fact ($a) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Calculate square root + * @link http://php.net/manual/en/function.gmp-sqrt.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource The integer portion of the square root, as a GMP number. + * @jms-builtin + */ +function gmp_sqrt ($a) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Square root with remainder + * @link http://php.net/manual/en/function.gmp-sqrtrem.php + * @param resource $a

+ * The number being square rooted. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return array array where first element is the integer square root of + * a and the second is the remainder + * (i.e., the difference between a and the + * first element squared). + * @jms-builtin + */ +function gmp_sqrtrem ($a) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Raise number into power + * @link http://php.net/manual/en/function.gmp-pow.php + * @param resource $base

+ * The base number. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $exp

+ * The positive power to raise the base. + *

+ * @return resource The new (raised) number, as a GMP number. The case of + * 0^0 yields 1. + * @jms-builtin + */ +function gmp_pow ($base, $exp) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Raise number into power with modulo + * @link http://php.net/manual/en/function.gmp-powm.php + * @param resource $base

+ * The base number. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $exp

+ * The positive power to raise the base. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $mod

+ * The modulo. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource The new (raised) number, as a GMP number. + * @jms-builtin + */ +function gmp_powm ($base, $exp, $mod) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Perfect square check + * @link http://php.net/manual/en/function.gmp-perfect-square.php + * @param resource $a

+ * The number being checked as a perfect square. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return bool TRUE if a is a perfect square, + * FALSE otherwise. + * @jms-builtin + */ +function gmp_perfect_square ($a) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Check if number is "probably prime" + * @link http://php.net/manual/en/function.gmp-prob-prime.php + * @param resource $a

+ * The number being checked as a prime. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $reps [optional]

+ * Reasonable values + * of reps vary from 5 to 10 (default being + * 10); a higher value lowers the probability for a non-prime to + * pass as a "probable" prime. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return int If this function returns 0, a is + * definitely not prime. If it returns 1, then + * a is "probably" prime. If it returns 2, + * then a is surely prime. + * @jms-builtin + */ +function gmp_prob_prime ($a, $reps = 10) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Calculate GCD + * @link http://php.net/manual/en/function.gmp-gcd.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A positive GMP number that divides into both + * a and b. + * @jms-builtin + */ +function gmp_gcd ($a, $b) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Calculate GCD and multipliers + * @link http://php.net/manual/en/function.gmp-gcdext.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return array An array of GMP numbers. + * @jms-builtin + */ +function gmp_gcdext ($a, $b) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Inverse by modulo + * @link http://php.net/manual/en/function.gmp-invert.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A GMP number on success or FALSE if an inverse does not exist. + * @jms-builtin + */ +function gmp_invert ($a, $b) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Jacobi symbol + * @link http://php.net/manual/en/function.gmp-jacobi.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $p It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ *

+ * Should be odd and must be positive. + *

+ * @return int A GMP number resource. + * @jms-builtin + */ +function gmp_jacobi ($a, $p) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Legendre symbol + * @link http://php.net/manual/en/function.gmp-legendre.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $p It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ *

+ * Should be odd and must be positive. + *

+ * @return int A GMP number resource. + * @jms-builtin + */ +function gmp_legendre ($a, $p) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Compare numbers + * @link http://php.net/manual/en/function.gmp-cmp.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return int a positive value if a > b, zero if + * a = b and a negative value if a < + * b. + * @jms-builtin + */ +function gmp_cmp ($a, $b) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Sign of number + * @link http://php.net/manual/en/function.gmp-sign.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return int 1 if a is positive, + * -1 if a is negative, + * and 0 if a is zero. + * @jms-builtin + */ +function gmp_sign ($a) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Random number + * @link http://php.net/manual/en/function.gmp-random.php + * @param int $limiter [optional]

+ * The limiter. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A random GMP number. + * @jms-builtin + */ +function gmp_random ($limiter = 20) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Bitwise AND + * @link http://php.net/manual/en/function.gmp-and.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A GMP number representing the bitwise AND comparison. + * @jms-builtin + */ +function gmp_and ($a, $b) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Bitwise OR + * @link http://php.net/manual/en/function.gmp-or.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A GMP number resource. + * @jms-builtin + */ +function gmp_or ($a, $b) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Calculates one's complement + * @link http://php.net/manual/en/function.gmp-com.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource the one's complement of a, as a GMP number. + * @jms-builtin + */ +function gmp_com ($a) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Bitwise XOR + * @link http://php.net/manual/en/function.gmp-xor.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param resource $b It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource A GMP number resource. + * @jms-builtin + */ +function gmp_xor ($a, $b) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Set bit + * @link http://php.net/manual/en/function.gmp-setbit.php + * @param resource $a

+ * The number being set to. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $index

+ * The set bit. + *

+ * @param bool $set_clear [optional]

+ * Defines if the bit is set to 0 or 1. By default the bit is set to + * 1. Index starts at 0. + *

+ * @return void A GMP number resource. + * @jms-builtin + */ +function gmp_setbit ($a, $index, $set_clear = true) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Clear bit + * @link http://php.net/manual/en/function.gmp-clrbit.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $index It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return void A GMP number resource. + * @jms-builtin + */ +function gmp_clrbit ($a, $index) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Scan for 0 + * @link http://php.net/manual/en/function.gmp-scan0.php + * @param resource $a

+ * The number to scan. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $start

+ * The starting bit. + *

+ * @return int the index of the found bit, as an integer. The + * index starts from 0. + * @jms-builtin + */ +function gmp_scan0 ($a, $start) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Scan for 1 + * @link http://php.net/manual/en/function.gmp-scan1.php + * @param resource $a

+ * The number to scan. + *

+ * It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $start

+ * The starting bit. + *

+ * @return int the index of the found bit, as an integer. + * If no set bit is found, -1 is returned. + * @jms-builtin + */ +function gmp_scan1 ($a, $start) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Tests if a bit is set + * @link http://php.net/manual/en/function.gmp-testbit.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @param int $index

+ * The bit to test + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function gmp_testbit ($a, $index) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Population count + * @link http://php.net/manual/en/function.gmp-popcount.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return int The population count of a, as an integer. + * @jms-builtin + */ +function gmp_popcount ($a) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Hamming distance + * @link http://php.net/manual/en/function.gmp-hamdist.php + * @param resource $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ *

+ * It should be positive. + *

+ * @param resource $b It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ *

+ * It should be positive. + *

+ * @return int A GMP number resource. + * @jms-builtin + */ +function gmp_hamdist ($a, $b) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Find next prime number + * @link http://php.net/manual/en/function.gmp-nextprime.php + * @param int $a It can be either a GMP number resource, or a + * numeric string given that it is possible to convert the latter to a number.

+ * @return resource Return the next prime number greater than a, + * as a GMP number. + * @jms-builtin + */ +function gmp_nextprime ($a) {} + +define ('GMP_ROUND_ZERO', 0); +define ('GMP_ROUND_PLUSINF', 1); +define ('GMP_ROUND_MINUSINF', 2); + +/** + * The GMP library version + * @link http://php.net/manual/en/gmp.constants.php + */ +define ('GMP_VERSION', "5.0.2"); + +// End of gmp v. +?> diff --git a/res/php-5.4-core-api/hash.php b/res/php-5.4-core-api/hash.php new file mode 100644 index 0000000..a0c9975 --- /dev/null +++ b/res/php-5.4-core-api/hash.php @@ -0,0 +1,333 @@ + + * Generate a hash value (message digest) + * @link http://php.net/manual/en/function.hash.php + * @param string $algo

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) + *

+ * @param string $data

+ * Message to be hashed. + *

+ * @param bool $raw_output [optional]

+ * When set to TRUE, outputs raw binary data. + * FALSE outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * @jms-builtin + */ +function hash ($algo, $data, $raw_output = false) {} + +/** + * (PHP 5 >= 5.1.2, PECL hash >= 1.1)
+ * Generate a hash value using the contents of a given file + * @link http://php.net/manual/en/function.hash-file.php + * @param string $algo

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) + *

+ * @param string $filename

+ * URL describing location of file to be hashed; Supports fopen wrappers. + *

+ * @param bool $raw_output [optional]

+ * When set to TRUE, outputs raw binary data. + * FALSE outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * @jms-builtin + */ +function hash_file ($algo, $filename, $raw_output = false) {} + +/** + * (PHP 5 >= 5.1.2, PECL hash >= 1.1)
+ * Generate a keyed hash value using the HMAC method + * @link http://php.net/manual/en/function.hash-hmac.php + * @param string $algo

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) See hash_algos for a list of supported algorithms. + *

+ * @param string $data

+ * Message to be hashed. + *

+ * @param string $key

+ * Shared secret key used for generating the HMAC variant of the message digest. + *

+ * @param bool $raw_output [optional]

+ * When set to TRUE, outputs raw binary data. + * FALSE outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * @jms-builtin + */ +function hash_hmac ($algo, $data, $key, $raw_output = false) {} + +/** + * (PHP 5 >= 5.1.2, PECL hash >= 1.1)
+ * Generate a keyed hash value using the HMAC method and the contents of a given file + * @link http://php.net/manual/en/function.hash-hmac-file.php + * @param string $algo

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) See hash_algos for a list of supported algorithms. + *

+ * @param string $filename

+ * URL describing location of file to be hashed; Supports fopen wrappers. + *

+ * @param string $key

+ * Shared secret key used for generating the HMAC variant of the message digest. + *

+ * @param bool $raw_output [optional]

+ * When set to TRUE, outputs raw binary data. + * FALSE outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * @jms-builtin + */ +function hash_hmac_file ($algo, $filename, $key, $raw_output = false) {} + +/** + * (PHP 5 >= 5.1.2, PECL hash >= 1.1)
+ * Initialize an incremental hashing context + * @link http://php.net/manual/en/function.hash-init.php + * @param string $algo

+ * Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) + *

+ * @param int $options [optional]

+ * Optional settings for hash generation, currently supports only one option: + * HASH_HMAC. When specified, the key + * must be specified. + *

+ * @param string $key [optional]

+ * When HASH_HMAC is specified for options, + * a shared secret key to be used with the HMAC hashing method must be supplied in this + * parameter. + *

+ * @return resource a Hashing Context resource for use with hash_update, + * hash_update_stream, hash_update_file, + * and hash_final. + * @jms-builtin + */ +function hash_init ($algo, $options = 0, $key = null) {} + +/** + * (PHP 5 >= 5.1.2, PECL hash >= 1.1)
+ * Pump data into an active hashing context + * @link http://php.net/manual/en/function.hash-update.php + * @param resource $context

+ * Hashing context returned by hash_init. + *

+ * @param string $data

+ * Message to be included in the hash digest. + *

+ * @return bool TRUE. + * @jms-builtin + */ +function hash_update ($context, $data) {} + +/** + * (PHP 5 >= 5.1.2, PECL hash >= 1.1)
+ * Pump data into an active hashing context from an open stream + * @link http://php.net/manual/en/function.hash-update-stream.php + * @param resource $context

+ * Hashing context returned by hash_init. + *

+ * @param resource $handle

+ * Open file handle as returned by any stream creation function. + *

+ * @param int $length [optional]

+ * Maximum number of characters to copy from handle + * into the hashing context. + *

+ * @return int Actual number of bytes added to the hashing context from handle. + * @jms-builtin + */ +function hash_update_stream ($context, $handle, $length = -1) {} + +/** + * (PHP 5 >= 5.1.2, PECL hash >= 1.1)
+ * Pump data into an active hashing context from a file + * @link http://php.net/manual/en/function.hash-update-file.php + * @param resource $context

+ * Stream context as returned by stream_context_create. + *

+ * @param string $filename

+ * URL describing location of file to be hashed; Supports fopen wrappers. + *

+ * @param resource $context [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function hash_update_file ($context, $filename, $context = null) {} + +/** + * (PHP 5 >= 5.1.2, PECL hash >= 1.1)
+ * Finalize an incremental hash and return resulting digest + * @link http://php.net/manual/en/function.hash-final.php + * @param resource $context

+ * Hashing context returned by hash_init. + *

+ * @param bool $raw_output [optional]

+ * When set to TRUE, outputs raw binary data. + * FALSE outputs lowercase hexits. + *

+ * @return string a string containing the calculated message digest as lowercase hexits + * unless raw_output is set to true in which case the raw + * binary representation of the message digest is returned. + * @jms-builtin + */ +function hash_final ($context, $raw_output = false) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Copy hashing context + * @link http://php.net/manual/en/function.hash-copy.php + * @param resource $context

+ * Hashing context returned by hash_init. + *

+ * @return resource a copy of Hashing Context resource. + * @jms-builtin + */ +function hash_copy ($context) {} + +/** + * (PHP 5 >= 5.1.2, PECL hash >= 1.1)
+ * Return a list of registered hashing algorithms + * @link http://php.net/manual/en/function.hash-algos.php + * @return array a numerically indexed array containing the list of supported + * hashing algorithms. + * @jms-builtin + */ +function hash_algos () {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Generates a key + * @link http://php.net/manual/en/function.mhash-keygen-s2k.php + * @param int $hash

+ * The hash ID used to create the key. + * One of the MHASH_hashname constants. + *

+ * @param string $password

+ * An user supplied password. + *

+ * @param string $salt

+ * Must be different and random enough for every key you generate in + * order to create different keys. Because salt + * must be known when you check the keys, it is a good idea to append + * the key to it. Salt has a fixed length of 8 bytes and will be padded + * with zeros if you supply less bytes. + *

+ * @param int $bytes

+ * The key length, in bytes. + *

+ * @return string the generated key as a string, or FALSE on error. + * @jms-builtin + */ +function mhash_keygen_s2k ($hash, $password, $salt, $bytes) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the block size of the specified hash + * @link http://php.net/manual/en/function.mhash-get-block-size.php + * @param int $hash

+ * The hash ID. One of the MHASH_hashname constants. + *

+ * @return int the size in bytes or FALSE, if the hash + * does not exist. + * @jms-builtin + */ +function mhash_get_block_size ($hash) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the name of the specified hash + * @link http://php.net/manual/en/function.mhash-get-hash-name.php + * @param int $hash

+ * The hash ID. One of the MHASH_hashname constants. + *

+ * @return string the name of the hash or FALSE, if the hash does not exist. + * @jms-builtin + */ +function mhash_get_hash_name ($hash) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the highest available hash ID + * @link http://php.net/manual/en/function.mhash-count.php + * @return int the highest available hash ID. Hashes are numbered from 0 to this + * hash ID. + * @jms-builtin + */ +function mhash_count () {} + +/** + * (PHP 4, PHP 5)
+ * Computes hash + * @link http://php.net/manual/en/function.mhash.php + * @param int $hash

+ * The hash ID. One of the MHASH_hashname constants. + *

+ * @param string $data

+ * The user input, as a string. + *

+ * @param string $key [optional]

+ * If specified, the function will return the resulting HMAC instead. + * HMAC is keyed hashing for message authentication, or simply a message + * digest that depends on the specified key. Not all algorithms + * supported in mhash can be used in HMAC mode. + *

+ * @return string the resulting hash (also called digest) or HMAC as a string, or + * FALSE on error. + * @jms-builtin + */ +function mhash ($hash, $data, $key = null) {} + + +/** + * Optional flag for hash_init. + * Indicates that the HMAC digest-keying algorithm should be + * applied to the current hashing context. + * @link http://php.net/manual/en/hash.constants.php + */ +define ('HASH_HMAC', 1); +define ('MHASH_CRC32', 0); +define ('MHASH_MD5', 1); +define ('MHASH_SHA1', 2); +define ('MHASH_HAVAL256', 3); +define ('MHASH_RIPEMD160', 5); +define ('MHASH_TIGER', 7); +define ('MHASH_GOST', 8); +define ('MHASH_CRC32B', 9); +define ('MHASH_HAVAL224', 10); +define ('MHASH_HAVAL192', 11); +define ('MHASH_HAVAL160', 12); +define ('MHASH_HAVAL128', 13); +define ('MHASH_TIGER128', 14); +define ('MHASH_TIGER160', 15); +define ('MHASH_MD4', 16); +define ('MHASH_SHA256', 17); +define ('MHASH_ADLER32', 18); +define ('MHASH_SHA224', 19); +define ('MHASH_SHA512', 20); +define ('MHASH_SHA384', 21); +define ('MHASH_WHIRLPOOL', 22); +define ('MHASH_RIPEMD128', 23); +define ('MHASH_RIPEMD256', 24); +define ('MHASH_RIPEMD320', 25); +define ('MHASH_SNEFRU256', 27); +define ('MHASH_MD2', 28); +define ('MHASH_FNV132', 29); +define ('MHASH_FNV1A32', 30); +define ('MHASH_FNV164', 31); +define ('MHASH_FNV1A64', 32); +define ('MHASH_JOAAT', 33); + +// End of hash v.1.0 +?> diff --git a/res/php-5.4-core-api/http.php b/res/php-5.4-core-api/http.php new file mode 100644 index 0000000..b7118ac --- /dev/null +++ b/res/php-5.4-core-api/http.php @@ -0,0 +1,4484 @@ + + * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpRuntimeException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpInvalidParamException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpHeaderException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpMalformedHeadersException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpRequestMethodException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpMessageTypeException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpEncodingException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpRequestException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpRequestPoolException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpSocketException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpResponseException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpUrlException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** @jms-builtin */ +class HttpQueryStringException extends HttpException { + protected $message; + protected $code; + protected $file; + protected $line; + public $innerException; + + + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return int the Exception code as a integer. + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was thrown. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was thrown. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or &null; otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** + * @link http://php.net/manual/en/class.httpdeflatestream.php + * @jms-builtin + */ +class HttpDeflateStream { + const TYPE_GZIP = 16; + const TYPE_ZLIB = 0; + const TYPE_RAW = 32; + const LEVEL_DEF = 0; + const LEVEL_MIN = 1; + const LEVEL_MAX = 9; + const STRATEGY_DEF = 0; + const STRATEGY_FILT = 256; + const STRATEGY_HUFF = 512; + const STRATEGY_RLE = 768; + const STRATEGY_FIXED = 1024; + const FLUSH_NONE = 0; + const FLUSH_SYNC = 1048576; + const FLUSH_FULL = 2097152; + + + /** + * (PECL pecl_http >= 0.21.0)
+ * HttpDeflateStream class constructor + * @link http://php.net/manual/en/function.httpdeflatestream-construct.php + * @param int $flags [optional]

+ * initialization flags + *

+ * @return void + */ + public function __construct ($flags = null) {} + + /** + * (PECL pecl_http >= 0.21.0)
+ * Update deflate stream + * @link http://php.net/manual/en/function.httpdeflatestream-update.php + * @param string $data

+ * data to deflate + *

+ * @return string deflated data on success&return.falseforfailure;. + */ + public function update ($data) {} + + /** + * (PECL pecl_http >= 0.21.0)
+ * Flush deflate stream + * @link http://php.net/manual/en/function.httpdeflatestream-flush.php + * @param string $data [optional]

+ * more data to deflate + *

+ * @return string some deflated data as string on success&return.falseforfailure;. + */ + public function flush ($data = null) {} + + /** + * (PECL pecl_http >= 0.21.0)
+ * Finalize deflate stream + * @link http://php.net/manual/en/function.httpdeflatestream-finish.php + * @param string $data [optional]

+ * data to deflate + *

+ * @return string the final part of deflated data. + */ + public function finish ($data = null) {} + + /** + * (PECL pecl_http >= 1.4.0)
+ * HttpDeflateStream class factory + * @link http://php.net/manual/en/function.httpdeflatestream-factory.php + * @param int $flags [optional]

+ * initialization flags + *

+ * @param string $class_name [optional]

+ * name of a subclass of HttpDeflateStream + *

+ * @return HttpDeflateStream + */ + public static function factory ($flags = null, $class_name = null) {} + +} + +/** + * @link http://php.net/manual/en/class.httpinflatestream.php + * @jms-builtin + */ +class HttpInflateStream { + const FLUSH_NONE = 0; + const FLUSH_SYNC = 1048576; + const FLUSH_FULL = 2097152; + + + /** + * (PECL pecl_http >= 1.0.0)
+ * HttpInflateStream class constructor + * @link http://php.net/manual/en/function.httpinflatestream-construct.php + * @param int $flags [optional]

+ * initialization flags + *

+ * @return void + */ + public function __construct ($flags = null) {} + + /** + * (PECL pecl_http >= 0.21.0)
+ * Update inflate stream + * @link http://php.net/manual/en/function.httpinflatestream-update.php + * @param string $data

+ * data to inflate + *

+ * @return string inflated data on success&return.falseforfailure;. + */ + public function update ($data) {} + + /** + * (PECL pecl_http >= 0.21.0)
+ * Flush inflate stream + * @link http://php.net/manual/en/function.httpinflatestream-flush.php + * @param string $data [optional]

+ * more data to inflate + *

+ * @return string some inflated data as string on success&return.falseforfailure;. + */ + public function flush ($data = null) {} + + /** + * (PECL pecl_http >= 0.21.0)
+ * Finalize inflate stream + * @link http://php.net/manual/en/function.httpinflatestream-finish.php + * @param string $data [optional]

+ * data to inflate + *

+ * @return string the final part of inflated data. + */ + public function finish ($data = null) {} + + /** + * (PECL pecl_http >= 1.4.0)
+ * HttpInflateStream class factory + * @link http://php.net/manual/en/function.httpinflatestream-factory.php + * @param int $flags [optional]

+ * initialization flags + *

+ * @param string $class_name [optional]

+ * name of a subclass of HttpInflateStream + *

+ * @return HttpInflateStream + */ + public static function factory ($flags = null, $class_name = null) {} + +} + +/** + * @link http://php.net/manual/en/class.httpmessage.php + * @jms-builtin + */ +class HttpMessage implements Countable, Serializable, Iterator, Traversable { + const TYPE_NONE = 0; + const TYPE_REQUEST = 1; + const TYPE_RESPONSE = 2; + + protected $type; + protected $body; + protected $requestMethod; + protected $requestUrl; + protected $responseStatus; + protected $responseCode; + protected $httpVersion; + protected $headers; + protected $parentMessage; + + + /** + * (PECL pecl_http >= 0.10.0)
+ * HttpMessage constructor + * @link http://php.net/manual/en/function.httpmessage-construct.php + * @param string $message [optional]

+ * a single or several consecutive HTTP messages + *

+ * @return void + */ + public function __construct ($message = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get message body + * @link http://php.net/manual/en/function.httpmessage-getbody.php + * @return string the message body as string. + */ + public function getBody () {} + + /** + * (PECL pecl_http >= 0.14.0)
+ * Set message body + * @link http://php.net/manual/en/function.httpmessage-setbody.php + * @param string $body

+ * the new body of the message + *

+ * @return void + */ + public function setBody ($body) {} + + /** + * (PECL pecl_http >= 1.1.0)
+ * Get header + * @link http://php.net/manual/en/function.httpmessage-getheader.php + * @param string $header

+ * header name + *

+ * @return string the header value on success or NULL if the header does not exist. + */ + public function getHeader ($header) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get message headers + * @link http://php.net/manual/en/function.httpmessage-getheaders.php + * @return array an associative array containing the messages HTTP headers. + */ + public function getHeaders () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set headers + * @link http://php.net/manual/en/function.httpmessage-setheaders.php + * @param array $headers

+ * associative array containing the new HTTP headers, which will replace all previous HTTP headers of the message + *

+ * @return void + */ + public function setHeaders ($headersarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Add headers + * @link http://php.net/manual/en/function.httpmessage-addheaders.php + * @param array $headers

+ * associative array containing the additional HTTP headers to add to the messages existing headers + *

+ * @param bool $append [optional]

+ * if true, and a header with the same name of one to add exists already, this respective + * header will be converted to an array containing both header values, otherwise + * it will be overwritten with the new header value + *

+ * @return void Returns true on success or false on failure. + */ + public function addHeaders ($headersarray , $append = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get message type + * @link http://php.net/manual/en/function.httpmessage-gettype.php + * @return int the HttpMessage::TYPE. + */ + public function getType () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set message type + * @link http://php.net/manual/en/function.httpmessage-settype.php + * @param int $type

+ * the HttpMessage::TYPE + *

+ * @return void + */ + public function setType ($type) {} + + public function getInfo () {} + + /** + * @param $http_info + */ + public function setInfo ($http_info) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get response code + * @link http://php.net/manual/en/function.httpmessage-getresponsecode.php + * @return int the HTTP response code if the message is of type HttpMessage::TYPE_RESPONSE, else FALSE. + */ + public function getResponseCode () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set response code + * @link http://php.net/manual/en/function.httpmessage-setresponsecode.php + * @param int $code

+ * HTTP response code + *

+ * @return bool TRUE on success, or FALSE if the message is not of type + * HttpMessage::TYPE_RESPONSE or the response code is out of range (100-510). + */ + public function setResponseCode ($code) {} + + /** + * (PECL pecl_http >= 0.23.0)
+ * Get response status + * @link http://php.net/manual/en/function.httpmessage-getresponsestatus.php + * @return string the HTTP response status string if the message is of type + * HttpMessage::TYPE_RESPONSE, else FALSE. + */ + public function getResponseStatus () {} + + /** + * (PECL pecl_http >= 0.23.0)
+ * Set response status + * @link http://php.net/manual/en/function.httpmessage-setresponsestatus.php + * @param string $status

+ * the response status text + *

+ * @return bool TRUE on success or FALSE if the message is not of type + * HttpMessage::TYPE_RESPONSE. + */ + public function setResponseStatus ($status) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get request method + * @link http://php.net/manual/en/function.httpmessage-getrequestmethod.php + * @return string the request method name on success, or FALSE if the message is + * not of type HttpMessage::TYPE_REQUEST. + */ + public function getRequestMethod () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set request method + * @link http://php.net/manual/en/function.httpmessage-setrequestmethod.php + * @param string $method

+ * the request method name + *

+ * @return bool TRUE on success, or FALSE if the message is not of type + * HttpMessage::TYPE_REQUEST or an invalid request method was supplied. + */ + public function setRequestMethod ($method) {} + + /** + * (PECL pecl_http >= 0.21.0)
+ * Get request URL + * @link http://php.net/manual/en/function.httpmessage-getrequesturl.php + * @return string the request URL as string on success, or FALSE if the message + * is not of type HttpMessage::TYPE_REQUEST. + */ + public function getRequestUrl () {} + + /** + * (PECL pecl_http >= 0.21.0)
+ * Set request URL + * @link http://php.net/manual/en/function.httpmessage-setrequesturl.php + * @param string $url

+ * the request URL + *

+ * @return bool TRUE on success, or FALSE if the message is not of type + * HttpMessage::TYPE_REQUEST or supplied URL was empty. + */ + public function setRequestUrl ($url) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get HTTP version + * @link http://php.net/manual/en/function.httpmessage-gethttpversion.php + * @return string the HTTP protocol version as string. + */ + public function getHttpVersion () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set HTTP version + * @link http://php.net/manual/en/function.httpmessage-sethttpversion.php + * @param string $version

+ * the HTTP protocol version + *

+ * @return bool TRUE on success, or FALSE if supplied version is out of range (1.0/1.1). + */ + public function setHttpVersion ($version) {} + + /** + * (PECL pecl_http >= 1.0.0)
+ * Guess content type + * @link http://php.net/manual/en/function.httpmessage-guesscontenttype.php + * @param string $magic_file

+ * the magic.mime database to use + *

+ * @param int $magic_mode [optional]

+ * flags for libmagic + *

+ * @return string the guessed content type on success&return.falseforfailure;. + */ + public function guessContentType ($magic_file, $magic_mode = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get parent message + * @link http://php.net/manual/en/function.httpmessage-getparentmessage.php + * @return HttpMessage the parent HttpMessage object. + */ + public function getParentMessage () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Send message + * @link http://php.net/manual/en/function.httpmessage-send.php + * @return bool Returns true on success or false on failure. + */ + public function send () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get string representation + * @link http://php.net/manual/en/function.httpmessage-tostring.php + * @param bool $include_parent [optional]

+ * specifies whether the returned string should also contain any parent messages + *

+ * @return string the message as string. + */ + public function toString ($include_parent = null) {} + + /** + * (PECL pecl_http >= 0.22.0)
+ * Create HTTP object regarding message type + * @link http://php.net/manual/en/function.httpmessage-tomessagetypeobject.php + * @return HttpRequest|HttpResponse either an HttpRequest or HttpResponse object on success, or NULL on failure. + */ + public function toMessageTypeObject () {} + + public function count () {} + + public function serialize () {} + + /** + * @param $serialized + */ + public function unserialize ($serialized) {} + + public function rewind () {} + + public function valid () {} + + public function current () {} + + public function key () {} + + public function next () {} + + public function __toString () {} + + /** + * (PECL pecl_http >= 1.4.0)
+ * Create HttpMessage from string + * @link http://php.net/manual/en/function.httpmessage-factory.php + * @param string $raw_message [optional]

+ * a single or several consecutive HTTP messages + *

+ * @param string $class_name [optional]

+ * a class extending HttpMessage + *

+ * @return HttpMessage an HttpMessage object on success or NULL on failure. + */ + public static function factory ($raw_message = null, $class_name = null) {} + + /** + * (PECL pecl_http 0.10.0-1.3.3)
+ * Create HttpMessage from string + * @link http://php.net/manual/en/function.httpmessage-fromstring.php + * @param string $raw_message [optional]

+ * a single or several consecutive HTTP messages + *

+ * @param string $class_name [optional]

+ * a class extending HttpMessage + *

+ * @return HttpMessage an HttpMessage object on success or NULL on failure. + */ + public static function fromString ($raw_message = null, $class_name = null) {} + + /** + * (PECL pecl_http >= 1.5.0)
+ * Create HttpMessage from environment + * @link http://php.net/manual/en/function.httpmessage-fromenv.php + * @param int $message_type

+ * The message type. See HttpMessage type constants. + *

+ * @param string $class_name [optional]

+ * a class extending HttpMessage + *

+ * @return HttpMessage an HttpMessage object on success or NULL on failure. + */ + public static function fromEnv ($message_type, $class_name = null) {} + + /** + * (PECL pecl_http >= 0.22.0)
+ * Detach HttpMessage + * @link http://php.net/manual/en/function.httpmessage-detach.php + * @return HttpMessage detached HttpMessage object copy. + */ + public function detach () {} + + /** + * (PECL pecl_http >= 0.22.0)
+ * Prepend message(s) + * @link http://php.net/manual/en/function.httpmessage-prepend.php + * @param HttpMessage $message

+ * HttpMessage object to prepend + *

+ * @param bool $top [optional]

+ * whether to prepend to the top most or right this message + *

+ * @return void + */ + public function prepend ($messageHttpMessage , $top = null) {} + + /** + * (PECL pecl_http >= 0.23.0)
+ * Reverse message chain + * @link http://php.net/manual/en/function.httpmessage-reverse.php + * @return HttpMessage the most parent HttpMessage object. + */ + public function reverse () {} + +} + +/** + * @link http://php.net/manual/en/class.httpquerystring.php + * @jms-builtin + */ +class HttpQueryString implements Serializable, ArrayAccess { + const TYPE_BOOL = 3; + const TYPE_INT = 1; + const TYPE_FLOAT = 2; + const TYPE_STRING = 6; + const TYPE_ARRAY = 4; + const TYPE_OBJECT = 5; + + private static $instance; + private $queryArray; + private $queryString; + + + /** + * (PECL pecl_http >= 0.22.0)
+ * HttpQueryString constructor + * @link http://php.net/manual/en/function.httpquerystring-construct.php + * @param bool $global [optional]

+ * whether to operate on $_GET and + * $_SERVER['QUERY_STRING'] + *

+ * @param mixed $add [optional]

+ * additional/initial query string parameters + *

+ * @return void + */ + final public function __construct ($global = null, $add = null) {} + + /** + * (PECL pecl_http >= 0.22.0)
+ * Get query string as array + * @link http://php.net/manual/en/function.httpquerystring-toarray.php + * @return array the array representation of the query string. + */ + public function toArray () {} + + /** + * (PECL pecl_http >= 0.22.0)
+ * Get query string + * @link http://php.net/manual/en/function.httpquerystring-tostring.php + * @return string the string representation of the query string. + */ + public function toString () {} + + public function __toString () {} + + /** + * (PECL pecl_http >= 0.22.0)
+ * Get (part of) query string + * @link http://php.net/manual/en/function.httpquerystring-get.php + * @param string $key [optional]

+ * key of the query string param to retrieve + *

+ * @param mixed $type [optional]

+ * which variable type to enforce + *

+ * @param mixed $defval [optional]

+ * default value if key does not exist + *

+ * @param bool $delete [optional]

+ * whether to remove the key/value pair from the query string + *

+ * @return mixed the value of the query string param or the whole query string if no key was specified on success or defval if key does not exist. + */ + public function get ($key = null, $type = null, $defval = null, $delete = null) {} + + /** + * (PECL pecl_http >= 0.22.0)
+ * Set query string params + * @link http://php.net/manual/en/function.httpquerystring-set.php + * @param mixed $params

+ * query string params to add + *

+ * @return string the current query string. + */ + public function set ($params) {} + + /** + * (PECL pecl_http >= 1.1.0)
+ * Modifiy query string copy + * @link http://php.net/manual/en/function.httpquerystring-mod.php + * @param mixed $params

+ * query string params to add + *

+ * @return HttpQueryString a new HttpQueryString object + */ + public function mod ($params) {} + + /** + * @param $name + * @param $defval [optional] + * @param $delete [optional] + */ + public function getBool ($name, $defval, $delete) {} + + /** + * @param $name + * @param $defval [optional] + * @param $delete [optional] + */ + public function getInt ($name, $defval, $delete) {} + + /** + * @param $name + * @param $defval [optional] + * @param $delete [optional] + */ + public function getFloat ($name, $defval, $delete) {} + + /** + * @param $name + * @param $defval [optional] + * @param $delete [optional] + */ + public function getString ($name, $defval, $delete) {} + + /** + * @param $name + * @param $defval [optional] + * @param $delete [optional] + */ + public function getArray ($name, $defval, $delete) {} + + /** + * @param $name + * @param $defval [optional] + * @param $delete [optional] + */ + public function getObject ($name, $defval, $delete) {} + + /** + * @param $global [optional] + * @param $params [optional] + * @param $class_name [optional] + */ + public static function factory ($global, $params, $class_name) {} + + /** + * (PECL pecl_http >= 0.25.0)
+ * HttpQueryString singleton + * @link http://php.net/manual/en/function.httpquerystring-singleton.php + * @param bool $global [optional]

+ * whether to operate on $_GET and + * $_SERVER['QUERY_STRING'] + *

+ * @return HttpQueryString always the same HttpQueryString instance regarding the global setting. + */ + public static function singleton ($global = null) {} + + /** + * (PECL pecl_http >= 0.25.0)
+ * Change query strings charset + * @link http://php.net/manual/en/function.httpquerystring-xlate.php + * @param string $ie

+ * input encoding + *

+ * @param string $oe

+ * output encoding + *

+ * @return bool Returns true on success or false on failure. + */ + public function xlate ($ie, $oe) {} + + public function serialize () {} + + /** + * @param $serialized + */ + public function unserialize ($serialized) {} + + /** + * @param $offset + */ + public function offsetGet ($offset) {} + + /** + * @param $offset + * @param $value + */ + public function offsetSet ($offset, $value) {} + + /** + * @param $offset + */ + public function offsetExists ($offset) {} + + /** + * @param $offset + */ + public function offsetUnset ($offset) {} + +} + +/** + * @link http://php.net/manual/en/class.httprequest.php + * @jms-builtin + */ +class HttpRequest { + const METH_GET = 1; + const METH_HEAD = 2; + const METH_POST = 3; + const METH_PUT = 4; + const METH_DELETE = 5; + const METH_OPTIONS = 6; + const METH_TRACE = 7; + const METH_CONNECT = 8; + const METH_PROPFIND = 9; + const METH_PROPPATCH = 10; + const METH_MKCOL = 11; + const METH_COPY = 12; + const METH_MOVE = 13; + const METH_LOCK = 14; + const METH_UNLOCK = 15; + const METH_VERSION_CONTROL = 16; + const METH_REPORT = 17; + const METH_CHECKOUT = 18; + const METH_CHECKIN = 19; + const METH_UNCHECKOUT = 20; + const METH_MKWORKSPACE = 21; + const METH_UPDATE = 22; + const METH_LABEL = 23; + const METH_MERGE = 24; + const METH_BASELINE_CONTROL = 25; + const METH_MKACTIVITY = 26; + const METH_ACL = 27; + const VERSION_1_0 = 1; + const VERSION_1_1 = 2; + const VERSION_NONE = 0; + const VERSION_ANY = 0; + const SSL_VERSION_TLSv1 = 1; + const SSL_VERSION_SSLv2 = 2; + const SSL_VERSION_SSLv3 = 3; + const SSL_VERSION_ANY = 0; + const IPRESOLVE_V4 = 1; + const IPRESOLVE_V6 = 2; + const IPRESOLVE_ANY = 0; + const AUTH_BASIC = 1; + const AUTH_DIGEST = 2; + const AUTH_NTLM = 8; + const AUTH_GSSNEG = 4; + const AUTH_ANY = -1; + const PROXY_SOCKS4 = 4; + const PROXY_SOCKS5 = 5; + const PROXY_HTTP = 0; + + private $options; + private $postFields; + private $postFiles; + private $responseInfo; + private $responseMessage; + private $responseCode; + private $responseStatus; + private $method; + private $url; + private $contentType; + private $requestBody; + private $queryData; + private $putFile; + private $putData; + private $history; + public $recordHistory; + + + /** + * (PECL pecl_http >= 0.10.0)
+ * HttpRequest constructor + * @link http://php.net/manual/en/function.httprequest-construct.php + * @param string $url [optional]

+ * the target request url + *

+ * @param int $request_method [optional]

+ * the request method to use + *

+ * @param array $options [optional]

+ * an associative array with request options + *

+ * @return void + */ + public function __construct ($url = null, $request_method = null, $options = nullarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set options + * @link http://php.net/manual/en/function.httprequest-setoptions.php + * @param array $options [optional]

+ * an associative array, which values will overwrite the + * currently set request options; + * if empty or omitted, the options of the HttpRequest object will be reset + *

+ * @return bool Returns true on success or false on failure. + */ + public function setOptions ($options = nullarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get options + * @link http://php.net/manual/en/function.httprequest-getoptions.php + * @return array an associative array containing currently set options. + */ + public function getOptions () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set ssl options + * @link http://php.net/manual/en/function.httprequest-setssloptions.php + * @param array $options [optional]

+ * an associative array containing any SSL specific options; + * if empty or omitted, the SSL options will be reset + *

+ * @return bool Returns true on success or false on failure. + */ + public function setSslOptions ($options = nullarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get ssl options + * @link http://php.net/manual/en/function.httprequest-getssloptions.php + * @return array an associative array containing any previously set SSL options. + */ + public function getSslOptions () {} + + /** + * (PECL pecl_http >= 0.12.0)
+ * Add ssl options + * @link http://php.net/manual/en/function.httprequest-addssloptions.php + * @param array $options

+ * an associative array as parameter containing additional SSL specific options + *

+ * @return bool Returns true on success or false on failure. + */ + public function addSslOptions ($optionsarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Add headers + * @link http://php.net/manual/en/function.httprequest-addheaders.php + * @param array $headers

+ * an associative array as parameter containing additional header name/value pairs + *

+ * @return bool Returns true on success or false on failure. + */ + public function addHeaders ($headersarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get headers + * @link http://php.net/manual/en/function.httprequest-getheaders.php + * @return array an associative array containing all currently set headers. + */ + public function getHeaders () {} + + /** + * (PECL pecl_http >= 0.12.0)
+ * Set headers + * @link http://php.net/manual/en/function.httprequest-setheaders.php + * @param array $headers [optional]

+ * an associative array as parameter containing header name/value pairs; + * if empty or omitted, all previously set headers will be unset + *

+ * @return bool Returns true on success or false on failure. + */ + public function setHeaders ($headers = nullarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Add cookies + * @link http://php.net/manual/en/function.httprequest-addcookies.php + * @param array $cookies

+ * an associative array containing any cookie name/value pairs to add + *

+ * @return bool Returns true on success or false on failure. + */ + public function addCookies ($cookiesarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get cookies + * @link http://php.net/manual/en/function.httprequest-getcookies.php + * @return array an associative array containing any previously set cookies. + */ + public function getCookies () {} + + /** + * (PECL pecl_http >= 0.12.0)
+ * Set cookies + * @link http://php.net/manual/en/function.httprequest-setcookies.php + * @param array $cookies [optional]

+ * an associative array as parameter containing cookie name/value pairs; + * if empty or omitted, all previously set cookies will be unset + *

+ * @return bool Returns true on success or false on failure. + */ + public function setCookies ($cookies = nullarray ) {} + + /** + * (PECL pecl_http >= 1.0.0)
+ * Enable cookies + * @link http://php.net/manual/en/function.httprequest-enablecookies.php + * @return bool Returns true on success or false on failure. + */ + public function enableCookies () {} + + /** + * (PECL pecl_http >= 1.0.0)
+ * Reset cookies + * @link http://php.net/manual/en/function.httprequest-resetcookies.php + * @param bool $session_only [optional]

+ * whether only session cookies should be reset (needs libcurl >= v7.15.4, else libcurl >= v7.14.1) + *

+ * @return bool Returns true on success or false on failure. + */ + public function resetCookies ($session_only = null) {} + + public function flushCookies () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set method + * @link http://php.net/manual/en/function.httprequest-setmethod.php + * @param int $request_method

+ * the request method to use + *

+ * @return bool Returns true on success or false on failure. + */ + public function setMethod ($request_method) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get method + * @link http://php.net/manual/en/function.httprequest-getmethod.php + * @return int the currently set request method. + */ + public function getMethod () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set URL + * @link http://php.net/manual/en/function.httprequest-seturl.php + * @param string $url

+ * the request url + *

+ * @return bool Returns true on success or false on failure. + */ + public function setUrl ($url) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get url + * @link http://php.net/manual/en/function.httprequest-geturl.php + * @return string the currently set request url as string. + */ + public function getUrl () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set content type + * @link http://php.net/manual/en/function.httprequest-setcontenttype.php + * @param string $content_type

+ * the content type of the request (primary/secondary) + *

+ * @return bool TRUE on success, or FALSE if the content type does not seem to + * contain a primary and a secondary part. + */ + public function setContentType ($content_type) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get content type + * @link http://php.net/manual/en/function.httprequest-getcontenttype.php + * @return string the previously set content type as string. + */ + public function getContentType () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set query data + * @link http://php.net/manual/en/function.httprequest-setquerydata.php + * @param mixed $query_data

+ * a string or associative array parameter containing the pre-encoded + * query string or to be encoded query fields; + * if empty, the query data will be unset + *

+ * @return bool Returns true on success or false on failure. + */ + public function setQueryData ($query_data) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get query data + * @link http://php.net/manual/en/function.httprequest-getquerydata.php + * @return string a string containing the urlencoded query. + */ + public function getQueryData () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Add query data + * @link http://php.net/manual/en/function.httprequest-addquerydata.php + * @param array $query_params

+ * an associative array as parameter containing the query fields to add + *

+ * @return bool Returns true on success or false on failure. + */ + public function addQueryData ($query_paramsarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set post fields + * @link http://php.net/manual/en/function.httprequest-setpostfields.php + * @param array $post_data

+ * an associative array containing the post fields; + * if empty, the post data will be unset + *

+ * @return bool Returns true on success or false on failure. + */ + public function setPostFields ($post_dataarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get post fields + * @link http://php.net/manual/en/function.httprequest-getpostfields.php + * @return array the currently set post fields as associative array. + */ + public function getPostFields () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Add post fields + * @link http://php.net/manual/en/function.httprequest-addpostfields.php + * @param array $post_data

+ * an associative array as parameter containing the post fields + *

+ * @return bool Returns true on success or false on failure. + */ + public function addPostFields ($post_dataarray ) {} + + /** + * @param $request_body_data [optional] + */ + public function setBody ($request_body_data) {} + + public function getBody () {} + + /** + * @param $request_body_data + */ + public function addBody ($request_body_data) {} + + /** + * (PECL pecl_http 0.14.0-1.4.1)
+ * Set raw post data + * @link http://php.net/manual/en/function.httprequest-setrawpostdata.php + * @param string $raw_post_data [optional]

+ * raw post data + *

+ * @return bool Returns true on success or false on failure. + */ + public function setRawPostData ($raw_post_data = null) {} + + /** + * (PECL pecl_http 0.14.0-1.4.1)
+ * Get raw post data + * @link http://php.net/manual/en/function.httprequest-getrawpostdata.php + * @return string a string containing the currently set raw post data. + */ + public function getRawPostData () {} + + /** + * (PECL pecl_http 0.14.0-1.4.1)
+ * Add raw post data + * @link http://php.net/manual/en/function.httprequest-addrawpostdata.php + * @param string $raw_post_data

+ * the raw post data to concatenate + *

+ * @return bool Returns true on success or false on failure. + */ + public function addRawPostData ($raw_post_data) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set post files + * @link http://php.net/manual/en/function.httprequest-setpostfiles.php + * @param array $post_files

+ * an array containing the files to post; + * if empty, the post files will be unset + *

+ * @return bool Returns true on success or false on failure. + */ + public function setPostFiles ($post_filesarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Add post file + * @link http://php.net/manual/en/function.httprequest-addpostfile.php + * @param string $name

+ * the form element name + *

+ * @param string $file

+ * the path to the file + *

+ * @param string $content_type [optional]

+ * the content type of the file + *

+ * @return bool TRUE on success, or FALSE if the content type seems not to contain a + * primary and a secondary content type part. + */ + public function addPostFile ($name, $file, $content_type = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get post files + * @link http://php.net/manual/en/function.httprequest-getpostfiles.php + * @return array an array containing currently set post files. + */ + public function getPostFiles () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set put file + * @link http://php.net/manual/en/function.httprequest-setputfile.php + * @param string $file [optional]

+ * the path to the file to send; + * if empty or omitted the put file will be unset + *

+ * @return bool Returns true on success or false on failure. + */ + public function setPutFile ($file = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get put file + * @link http://php.net/manual/en/function.httprequest-getputfile.php + * @return string a string containing the path to the currently set put file. + */ + public function getPutFile () {} + + /** + * (PECL pecl_http >= 0.25.0)
+ * Set put data + * @link http://php.net/manual/en/function.httprequest-setputdata.php + * @param string $put_data [optional]

+ * the data to upload + *

+ * @return bool Returns true on success or false on failure. + */ + public function setPutData ($put_data = null) {} + + /** + * (PECL pecl_http >= 0.25.0)
+ * Get put data + * @link http://php.net/manual/en/function.httprequest-getputdata.php + * @return string a string containing the currently set PUT data. + */ + public function getPutData () {} + + /** + * (PECL pecl_http >= 0.25.0)
+ * Add put data + * @link http://php.net/manual/en/function.httprequest-addputdata.php + * @param string $put_data

+ * the data to concatenate + *

+ * @return bool Returns true on success or false on failure. + */ + public function addPutData ($put_data) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Send request + * @link http://php.net/manual/en/function.httprequest-send.php + * @return HttpMessage the received response as HttpMessage object. + */ + public function send () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get response data + * @link http://php.net/manual/en/function.httprequest-getresponsedata.php + * @return array an associative array with the key "headers" containing an associative + * array holding all response headers, as well as the key "body" containing a + * string with the response body. + */ + public function getResponseData () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get response header(s) + * @link http://php.net/manual/en/function.httprequest-getresponseheader.php + * @param string $name [optional]

+ * header to read; if empty, all response headers will be returned + *

+ * @return mixed either a string with the value of the header matching name if requested, + * FALSE on failure, or an associative array containing all response headers. + */ + public function getResponseHeader ($name = null) {} + + /** + * (PECL pecl_http >= 0.23.0)
+ * Get response cookie(s) + * @link http://php.net/manual/en/function.httprequest-getresponsecookies.php + * @param int $flags [optional]

+ * http_parse_cookie flags + *

+ * @param array $allowed_extras [optional]

+ * allowed keys treated as extra information instead of cookie names + *

+ * @return array an array of stdClass objects like http_parse_cookie would return. + */ + public function getResponseCookies ($flags = null, $allowed_extras = nullarray ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get response code + * @link http://php.net/manual/en/function.httprequest-getresponsecode.php + * @return int an int representing the response code. + */ + public function getResponseCode () {} + + /** + * (PECL pecl_http >= 0.23.0)
+ * Get response status + * @link http://php.net/manual/en/function.httprequest-getresponsestatus.php + * @return string a string containing the response status text. + */ + public function getResponseStatus () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get response body + * @link http://php.net/manual/en/function.httprequest-getresponsebody.php + * @return string a string containing the response body. + */ + public function getResponseBody () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get response info + * @link http://php.net/manual/en/function.httprequest-getresponseinfo.php + * @param string $name [optional]

+ * the info to read; if empty or omitted, an associative array containing + * all available info will be returned + *

+ * @return mixed either a scalar containing the value of the info matching name if + * requested, FALSE on failure, or an associative array containing all + * available info. + */ + public function getResponseInfo ($name = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get response message + * @link http://php.net/manual/en/function.httprequest-getresponsemessage.php + * @return HttpMessage an HttpMessage object of the response. + */ + public function getResponseMessage () {} + + /** + * (PECL pecl_http >= 0.21.0)
+ * Get raw response message + * @link http://php.net/manual/en/function.httprequest-getrawresponsemessage.php + * @return string the complete web server response, including the headers in a form of a string. + */ + public function getRawResponseMessage () {} + + /** + * (PECL pecl_http >= 0.11.0)
+ * Get request message + * @link http://php.net/manual/en/function.httprequest-getrequestmessage.php + * @return HttpMessage an HttpMessage object representing the sent request. + */ + public function getRequestMessage () {} + + /** + * (PECL pecl_http >= 0.21.0)
+ * Get raw request message + * @link http://php.net/manual/en/function.httprequest-getrawrequestmessage.php + * @return string an HttpMessage in a form of a string. + */ + public function getRawRequestMessage () {} + + /** + * (PECL pecl_http >= 0.15.0)
+ * Get history + * @link http://php.net/manual/en/function.httprequest-gethistory.php + * @return HttpMessage an HttpMessage object representing the complete request/response history. + */ + public function getHistory () {} + + /** + * (PECL pecl_http >= 0.15.0)
+ * Clear history + * @link http://php.net/manual/en/function.httprequest-clearhistory.php + * @return void + */ + public function clearHistory () {} + + /** + * @param $url [optional] + * @param $method [optional] + * @param $options [optional] + * @param $class_name [optional] + */ + public static function factory ($url, $method, $options, $class_name) {} + + /** + * @param $url + * @param $options [optional] + * @param $info [optional] + */ + public static function get ($url, $options, &$info) {} + + /** + * @param $url + * @param $options [optional] + * @param $info [optional] + */ + public static function head ($url, $options, &$info) {} + + /** + * @param $url + * @param $data + * @param $options [optional] + * @param $info [optional] + */ + public static function postData ($url, $data, $options, &$info) {} + + /** + * @param $url + * @param $data + * @param $options [optional] + * @param $info [optional] + */ + public static function postFields ($url, $data, $options, &$info) {} + + /** + * @param $url + * @param $data + * @param $options [optional] + * @param $info [optional] + */ + public static function putData ($url, $data, $options, &$info) {} + + /** + * @param $url + * @param $file + * @param $options [optional] + * @param $info [optional] + */ + public static function putFile ($url, $file, $options, &$info) {} + + /** + * @param $url + * @param $stream + * @param $options [optional] + * @param $info [optional] + */ + public static function putStream ($url, $stream, $options, &$info) {} + + /** + * @param $method_name + */ + public static function methodRegister ($method_name) {} + + /** + * @param $method + */ + public static function methodUnregister ($method) {} + + /** + * @param $method_id + */ + public static function methodName ($method_id) {} + + /** + * @param $method + */ + public static function methodExists ($method) {} + + /** + * @param $fields + * @param $files + */ + public static function encodeBody ($fields, $files) {} + +} + +/** @jms-builtin */ +class HttpRequestDataShare implements Countable { + private static $instance; + public $cookie; + public $dns; + public $ssl; + public $connect; + + + public function __destruct () {} + + public function count () {} + + /** + * @param HttpRequest $request + */ + public function attach (HttpRequest $request) {} + + /** + * @param HttpRequest $request + */ + public function detach (HttpRequest $request) {} + + public function reset () {} + + /** + * @param $global [optional] + * @param $class_name [optional] + */ + public static function factory ($global, $class_name) {} + + /** + * @param $global [optional] + */ + public static function singleton ($global) {} + +} + +/** + * @link http://php.net/manual/en/class.httprequestpool.php + * @jms-builtin + */ +class HttpRequestPool implements Countable, Iterator, Traversable { + + /** + * (PECL pecl_http >= 0.10.0)
+ * HttpRequestPool constructor + * @link http://php.net/manual/en/function.httprequestpool-construct.php + * @param HttpRequest $request [optional]

+ * HttpRequest object to attach + *

+ * @return void + */ + public function __construct ($request = nullHttpRequest ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * HttpRequestPool destructor + * @link http://php.net/manual/en/function.httprequestpool-destruct.php + * @return void + */ + public function __destruct () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Attach HttpRequest + * @link http://php.net/manual/en/function.httprequestpool-attach.php + * @param HttpRequest $request

+ * an HttpRequest object not already attached to any HttpRequestPool object + *

+ * @return bool Returns true on success or false on failure. + */ + public function attach ($requestHttpRequest ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Detach HttpRequest + * @link http://php.net/manual/en/function.httprequestpool-detach.php + * @param HttpRequest $request

+ * an HttpRequest object attached to this HttpRequestPool object + *

+ * @return bool Returns true on success or false on failure. + */ + public function detach ($requestHttpRequest ) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Send all requests + * @link http://php.net/manual/en/function.httprequestpool-send.php + * @return bool Returns true on success or false on failure. + */ + public function send () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Reset request pool + * @link http://php.net/manual/en/function.httprequestpool-reset.php + * @return void + */ + public function reset () {} + + /** + * (PECL pecl_http >= 0.15.0)
+ * Perform socket actions + * @link http://php.net/manual/en/function.httprequestpool-socketperform.php + * @return bool TRUE until each request has finished its transaction. + */ + protected function socketPerform () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Perform socket select + * @link http://php.net/manual/en/function.httprequestpool-socketselect.php + * @return bool Returns true on success or false on failure. + */ + protected function socketSelect () {} + + public function valid () {} + + public function current () {} + + public function key () {} + + public function next () {} + + public function rewind () {} + + public function count () {} + + /** + * (PECL pecl_http >= 0.16.0)
+ * Get attached requests + * @link http://php.net/manual/en/function.httprequestpool-getattachedrequests.php + * @return array an array containing all currently attached HttpRequest objects. + */ + public function getAttachedRequests () {} + + /** + * (PECL pecl_http >= 0.16.0)
+ * Get finished requests + * @link http://php.net/manual/en/function.httprequestpool-getfinishedrequests.php + * @return array an array containing all attached HttpRequest objects that already have finished their work. + */ + public function getFinishedRequests () {} + + /** + * @param $enable [optional] + */ + public function enablePipelining ($enable) {} + + /** + * @param $enable [optional] + */ + public function enableEvents ($enable) {} + +} + +/** + * @link http://php.net/manual/en/class.httpresponse.php + * @jms-builtin + */ +class HttpResponse { + const REDIRECT = 0; + const REDIRECT_PERM = 301; + const REDIRECT_FOUND = 302; + const REDIRECT_POST = 303; + const REDIRECT_PROXY = 305; + const REDIRECT_TEMP = 307; + + private static $sent; + private static $catch; + private static $mode; + private static $stream; + private static $file; + private static $data; + protected static $cache; + protected static $gzip; + protected static $eTag; + protected static $lastModified; + protected static $cacheControl; + protected static $contentType; + protected static $contentDisposition; + protected static $bufferSize; + protected static $throttleDelay; + + + /** + * (PECL pecl_http >= 0.12.0)
+ * Set header + * @link http://php.net/manual/en/function.httpresponse-setheader.php + * @param string $name

+ * the name of the header + *

+ * @param mixed $value [optional]

+ * the value of the header; + * if not set, no header with this name will be sent + *

+ * @param bool $replace [optional]

+ * whether an existing header should be replaced + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setHeader ($name, $value = null, $replace = null) {} + + /** + * (PECL pecl_http >= 0.12.0)
+ * Get header + * @link http://php.net/manual/en/function.httpresponse-getheader.php + * @param string $name [optional]

+ * specifies the name of the header to read; + * if empty or omitted, an associative array with all headers will be returned + *

+ * @return mixed either a string containing the value of the header matching name, + * false on failure, or an associative array with all headers. + */ + public static function getHeader ($name = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set ETag + * @link http://php.net/manual/en/function.httpresponse-setetag.php + * @param string $etag

+ * unquoted string as parameter containing the ETag + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setETag ($etag) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get ETag + * @link http://php.net/manual/en/function.httpresponse-getetag.php + * @return string the calculated or previously set ETag as unquoted string. + */ + public static function getETag () {} + + /** + * (PECL pecl_http >= 0.12.0)
+ * Set last modified + * @link http://php.net/manual/en/function.httpresponse-setlastmodified.php + * @param int $timestamp

+ * Unix timestamp representing the last modification time of the sent entity + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setLastModified ($timestamp) {} + + /** + * (PECL pecl_http >= 0.12.0)
+ * Get last modified + * @link http://php.net/manual/en/function.httpresponse-getlastmodified.php + * @return int the calculated or previously set Unix timestamp. + */ + public static function getLastModified () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set content disposition + * @link http://php.net/manual/en/function.httpresponse-setcontentdisposition.php + * @param string $filename

+ * the file name the "Save as..." dialog should display + *

+ * @param bool $inline [optional]

+ * if set to true and the user agent knows how to handle the content type, + * it will probably not cause the popup window to be shown + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setContentDisposition ($filename, $inline = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get content disposition + * @link http://php.net/manual/en/function.httpresponse-getcontentdisposition.php + * @return string the current content disposition as string like sent in a header. + */ + public static function getContentDisposition () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set content type + * @link http://php.net/manual/en/function.httpresponse-setcontenttype.php + * @param string $content_type

+ * the content type of the sent entity (primary/secondary) + *

+ * @return bool true on success, or false if the content type does not seem to + * contain a primary and secondary content type part. + */ + public static function setContentType ($content_type) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get content type + * @link http://php.net/manual/en/function.httpresponse-getcontenttype.php + * @return string the currently set content type as string. + */ + public static function getContentType () {} + + /** + * (PECL pecl_http >= 0.13.0)
+ * Guess content type + * @link http://php.net/manual/en/function.httpresponse-guesscontenttype.php + * @param string $magic_file

+ * specifies the magic.mime database to use + *

+ * @param int $magic_mode [optional]

+ * flags for libmagic + *

+ * @return string the guessed content type on success&return.falseforfailure;. + */ + public static function guessContentType ($magic_file, $magic_mode = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set cache + * @link http://php.net/manual/en/function.httpresponse-setcache.php + * @param bool $cache

+ * whether caching should be attempted + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setCache ($cache) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get cache + * @link http://php.net/manual/en/function.httpresponse-getcache.php + * @return bool true if caching should be attempted, else false. + */ + public static function getCache () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set cache control + * @link http://php.net/manual/en/function.httpresponse-setcachecontrol.php + * @param string $control

+ * the primary cache control setting + *

+ * @param int $max_age [optional]

+ * the max-age in seconds, suggesting how long the cache entry is valid on the client side + *

+ * @param bool $must_revalidate [optional]

+ * whether the cached entity should be revalidated by the client for every request + *

+ * @return bool true on success, or false if control does not match one of public, private or no-cache. + */ + public static function setCacheControl ($control, $max_age = null, $must_revalidate = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get cache control + * @link http://php.net/manual/en/function.httpresponse-getcachecontrol.php + * @return string the current cache control setting as a string like sent in a header. + */ + public static function getCacheControl () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set gzip + * @link http://php.net/manual/en/function.httpresponse-setgzip.php + * @param bool $gzip

+ * whether GZip compression should be enabled + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setGzip ($gzip) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get gzip + * @link http://php.net/manual/en/function.httpresponse-getgzip.php + * @return bool true if GZip compression is enabled, else false. + */ + public static function getGzip () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set throttle delay + * @link http://php.net/manual/en/function.httpresponse-setthrottledelay.php + * @param float $seconds

+ * seconds to sleep after each chunk sent + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setThrottleDelay ($seconds) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get throttle delay + * @link http://php.net/manual/en/function.httpresponse-getthrottledelay.php + * @return double a double representing the throttle delay in seconds. + */ + public static function getThrottleDelay () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set buffer size + * @link http://php.net/manual/en/function.httpresponse-setbuffersize.php + * @param int $bytes

+ * the chunk size in bytes + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setBufferSize ($bytes) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get buffer size + * @link http://php.net/manual/en/function.httpresponse-getbuffersize.php + * @return int an int representing the current buffer size in bytes. + */ + public static function getBufferSize () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set data + * @link http://php.net/manual/en/function.httpresponse-setdata.php + * @param mixed $data

+ * data to send + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setData ($data) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get data + * @link http://php.net/manual/en/function.httpresponse-getdata.php + * @return string a string containing the previously set data to send. + */ + public static function getData () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set file + * @link http://php.net/manual/en/function.httpresponse-setfile.php + * @param string $file

+ * the path to the file to send + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setFile ($file) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get file + * @link http://php.net/manual/en/function.httpresponse-getfile.php + * @return string the previously set path to the file to send as string. + */ + public static function getFile () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Set stream + * @link http://php.net/manual/en/function.httpresponse-setstream.php + * @param resource $stream

+ * already opened stream from which the data to send will be read + *

+ * @return bool Returns true on success or false on failure. + */ + public static function setStream ($stream) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get Stream + * @link http://php.net/manual/en/function.httpresponse-getstream.php + * @return resource the previously set resource. + */ + public static function getStream () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Send response + * @link http://php.net/manual/en/function.httpresponse-send.php + * @param bool $clean_ob [optional]

+ * whether to destroy all previously started output handlers and their buffers + *

+ * @return bool Returns true on success or false on failure. + */ + public static function send ($clean_ob = null) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Capture script output + * @link http://php.net/manual/en/function.httpresponse-capture.php + * @return void + */ + public static function capture () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Redirect + * @link http://php.net/manual/en/function.httpresponse-redirect.php + * @param string $url [optional] + * @param array $params [optional] + * @param bool $session [optional] + * @param int $status [optional] + * @return void + */ + public static function redirect ($url = null, $params = nullarray , $session = null, $status = null) {} + + /** + * (PECL pecl_http >= 0.12.0)
+ * Send HTTP response status + * @link http://php.net/manual/en/function.httpresponse-status.php + * @param int $status + * @return bool + */ + public static function status ($status) {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get request headers + * @link http://php.net/manual/en/function.httpresponse-getrequestheaders.php + * @return array + */ + public static function getRequestHeaders () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get request body + * @link http://php.net/manual/en/function.httpresponse-getrequestbody.php + * @return string + */ + public static function getRequestBody () {} + + /** + * (PECL pecl_http >= 0.10.0)
+ * Get request body stream + * @link http://php.net/manual/en/function.httpresponse-getrequestbodystream.php + * @return resource + */ + public static function getRequestBodyStream () {} + +} + +/** @jms-builtin */ +class HttpUtil { + + /** + * @param $timestamp [optional] + */ + public static function date ($timestamp) {} + + /** + * @param $url + * @param $parts [optional] + * @param $flags [optional] + * @param $composed [optional] + */ + public static function buildUrl ($url, $parts, $flags, &$composed) {} + + /** + * @param $query + * @param $prefix [optional] + * @param $arg_sep [optional] + */ + public static function buildStr ($query, $prefix, $arg_sep) {} + + /** + * @param $supported + * @param $result [optional] + */ + public static function negotiateLanguage ($supported, &$result) {} + + /** + * @param $supported + * @param $result [optional] + */ + public static function negotiateCharset ($supported, &$result) {} + + /** + * @param $supported + * @param $result [optional] + */ + public static function negotiateContentType ($supported, &$result) {} + + /** + * @param $last_modified + * @param $for_range [optional] + */ + public static function matchModified ($last_modified, $for_range) {} + + /** + * @param $plain_etag + * @param $for_range [optional] + */ + public static function matchEtag ($plain_etag, $for_range) {} + + /** + * @param $header_name + * @param $header_value + * @param $case_sensitive [optional] + */ + public static function matchRequestHeader ($header_name, $header_value, $case_sensitive) {} + + /** + * @param $message_string + */ + public static function parseMessage ($message_string) {} + + /** + * @param $headers_string + */ + public static function parseHeaders ($headers_string) {} + + /** + * @param $cookie_string + */ + public static function parseCookie ($cookie_string) {} + + /** + * @param $cookie_array + */ + public static function buildCookie ($cookie_array) {} + + /** + * @param $param_string + * @param $flags [optional] + */ + public static function parseParams ($param_string, $flags) {} + + /** + * @param $encoded_string + */ + public static function chunkedDecode ($encoded_string) {} + + /** + * @param $plain + * @param $flags [optional] + */ + public static function deflate ($plain, $flags) {} + + /** + * @param $encoded + */ + public static function inflate ($encoded) {} + + /** + * @param $feature [optional] + */ + public static function support ($feature) {} + +} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Compose HTTP RFC compliant date + * @link http://php.net/manual/en/function.http-date.php + * @param int $timestamp [optional]

+ * Unix timestamp; current time if omitted + *

+ * @return string the HTTP date as string. + * @jms-builtin + */ +function http_date ($timestamp = null) {} + +/** + * (PECL pecl_http >= 0.21.0)
+ * Build an URL + * @link http://php.net/manual/en/function.http-build-url.php + * @param mixed $url [optional]

+ * (part(s) of) an URL in form of a string or associative array like parse_url returns + *

+ * @param mixed $parts [optional]

+ * same as the first argument + *

+ * @param int $flags [optional]

+ * a bitmask of binary or'ed HTTP_URL constants; + * HTTP_URL_REPLACE is the default + *

+ * @param array $new_url [optional]

+ * if set, it will be filled with the parts of the composed url like parse_url would return + *

+ * @return string the new URL as string on success&return.falseforfailure;. + * @jms-builtin + */ +function http_build_url ($url = null, $parts = null, $flags = null, &$new_url = nullarray ) {} + +/** + * (PECL pecl_http >= 0.23.0)
+ * Build query string + * @link http://php.net/manual/en/function.http-build-str.php + * @param array $query

+ * associative array of query string parameters + *

+ * @param string $prefix [optional]

+ * top level prefix + *

+ * @param string $arg_separator [optional]

+ * argument separator to use (by default the INI setting arg_separator.output will be used, or "&" if neither is set + *

+ * @return string the built query as string on success&return.falseforfailure;. + * @jms-builtin + */ +function http_build_str ($queryarray , $prefix = null, $arg_separator = null) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Negotiate clients preferred language + * @link http://php.net/manual/en/function.http-negotiate-language.php + * @param array $supported

+ * array containing the supported languages as values + *

+ * @param array $result [optional]

+ * will be filled with an array containing the negotiation results + *

+ * @return string the negotiated language or the default language (i.e. first array entry) if none match. + * @jms-builtin + */ +function http_negotiate_language ($supportedarray , &$result = nullarray ) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Negotiate clients preferred character set + * @link http://php.net/manual/en/function.http-negotiate-charset.php + * @param array $supported

+ * array containing the supported charsets as values + *

+ * @param array $result [optional]

+ * will be filled with an array containing the negotiation results + *

+ * @return string the negotiated charset or the default charset (i.e. first array entry) if none match. + * @jms-builtin + */ +function http_negotiate_charset ($supportedarray , &$result = nullarray ) {} + +/** + * (PECL pecl_http >= 0.19.0)
+ * Negotiate clients preferred content type + * @link http://php.net/manual/en/function.http-negotiate-content-type.php + * @param array $supported

+ * array containing the supported content types as values + *

+ * @param array $result [optional]

+ * will be filled with an array containing the negotiation results + *

+ * @return string the negotiated content type or the default content type (i.e. first array entry) if none match. + * @jms-builtin + */ +function http_negotiate_content_type ($supportedarray , &$result = nullarray ) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Issue HTTP redirect + * @link http://php.net/manual/en/function.http-redirect.php + * @param string $url [optional]

+ * the URL to redirect to + *

+ * @param array $params [optional]

+ * associative array of query parameters + *

+ * @param bool $session [optional]

+ * whether to append session information + *

+ * @param int $status [optional]

+ * custom response status code + *

+ * @return void &returns.http.false.orexits; with the specified redirection status code. + * &see.http.configuration.force_exit; + * @jms-builtin + */ +function http_redirect ($url = null, $params = nullarray , $session = null, $status = null) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * HTTP throttling + * @link http://php.net/manual/en/function.http-throttle.php + * @param float $sec [optional]

+ * seconds to sleep after each chunk sent + *

+ * @param int $bytes [optional]

+ * the chunk size in bytes + *

+ * @return void + * @jms-builtin + */ +function http_throttle ($sec = null, $bytes = null) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Send HTTP response status + * @link http://php.net/manual/en/function.http-send-status.php + * @param int $status

+ * HTTP status code (100-599) + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function http_send_status ($status) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Send Last-Modified + * @link http://php.net/manual/en/function.http-send-last-modified.php + * @param int $timestamp [optional]

+ * a Unix timestamp, converted to a valid HTTP date; + * if omitted, the current time will be sent + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function http_send_last_modified ($timestamp = null) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Send Content-Type + * @link http://php.net/manual/en/function.http-send-content-type.php + * @param string $content_type [optional]

+ * the desired content type (primary/secondary) + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function http_send_content_type ($content_type = null) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Send Content-Disposition + * @link http://php.net/manual/en/function.http-send-content-disposition.php + * @param string $filename

+ * the file name the "Save as..." dialog should display + *

+ * @param bool $inline [optional]

+ * if set to true and the user agent knows how to handle the content type, + * it will probably not cause the popup window to be shown + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function http_send_content_disposition ($filename, $inline = null) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Match last modification + * @link http://php.net/manual/en/function.http-match-modified.php + * @param int $timestamp [optional]

+ * Unix timestamp; current time, if omitted + *

+ * @param bool $for_range [optional]

+ * if set to true, the header usually used to validate HTTP ranges will be checked + *

+ * @return bool true if timestamp represents an earlier date than the header, else false. + * @jms-builtin + */ +function http_match_modified ($timestamp = null, $for_range = null) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Match ETag + * @link http://php.net/manual/en/function.http-match-etag.php + * @param string $etag

+ * the ETag to match + *

+ * @param bool $for_range [optional]

+ * if set to true, the header usually used to validate HTTP ranges will be checked + *

+ * @return bool true if ETag matches or the header contained the asterisk ("*"), else false. + * @jms-builtin + */ +function http_match_etag ($etag, $for_range = null) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Caching by last modification + * @link http://php.net/manual/en/function.http-cache-last-modified.php + * @param int $timestamp_or_expires [optional]

+ * Unix timestamp + *

+ * @return bool &returns.http.false.orexits; with 304 Not Modified if the entity is cached. + * &see.http.configuration.force_exit; + * @jms-builtin + */ +function http_cache_last_modified ($timestamp_or_expires = null) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Caching by ETag + * @link http://php.net/manual/en/function.http-cache-etag.php + * @param string $etag [optional]

+ * custom ETag + *

+ * @return bool &returns.http.false.orexits; with 304 Not Modified if the entity is cached. + * &see.http.configuration.force_exit; + * @jms-builtin + */ +function http_cache_etag ($etag = null) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Send arbitrary data + * @link http://php.net/manual/en/function.http-send-data.php + * @param string $data

+ * data to send + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function http_send_data ($data) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Send file + * @link http://php.net/manual/en/function.http-send-file.php + * @param string $file

+ * the file to send + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function http_send_file ($file) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Send stream + * @link http://php.net/manual/en/function.http-send-stream.php + * @param resource $stream

+ * stream to read from (must be seekable) + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function http_send_stream ($stream) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Decode chunked-encoded data + * @link http://php.net/manual/en/function.http-chunked-decode.php + * @param string $encoded

+ * chunked encoded string + *

+ * @return string the decoded string on success&return.falseforfailure;. + * @jms-builtin + */ +function http_chunked_decode ($encoded) {} + +/** + * (PECL pecl_http >= 0.12.0)
+ * Parse HTTP messages + * @link http://php.net/manual/en/function.http-parse-message.php + * @param string $message

+ * string containing a single HTTP message or several consecutive HTTP messages + *

+ * @return object a hierarchical object structure of the parsed messages. + * @jms-builtin + */ +function http_parse_message ($message) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Parse HTTP headers + * @link http://php.net/manual/en/function.http-parse-headers.php + * @param string $header

+ * string containing HTTP headers + *

+ * @return array an array on success&return.falseforfailure;. + * @jms-builtin + */ +function http_parse_headers ($header) {} + +/** + * (PECL pecl_http >= 0.20.0)
+ * Parse HTTP cookie + * @link http://php.net/manual/en/function.http-parse-cookie.php + * @param string $cookie

+ * string containing the value of a Set-Cookie response header + *

+ * @param int $flags [optional]

+ * parse flags (HTTP_COOKIE_PARSE_RAW) + *

+ * @param array $allowed_extras [optional]

+ * array containing recognized extra keys; + * by default all unknown keys will be treated as cookie names + *

+ * @return object a stdClass object on success&return.falseforfailure;. + * @jms-builtin + */ +function http_parse_cookie ($cookie, $flags = null, $allowed_extras = nullarray ) {} + +/** + * (PECL pecl_http >= 1.2.0)
+ * Build cookie string + * @link http://php.net/manual/en/function.http-build-cookie.php + * @param array $cookie

+ * a cookie list like returned from http_parse_cookie + *

+ * @return string the cookie(s) as string. + * @jms-builtin + */ +function http_build_cookie ($cookiearray ) {} + +/** + * (PECL pecl_http >= 1.0.0)
+ * Parse parameter list + * @link http://php.net/manual/en/function.http-parse-params.php + * @param string $param

+ * Parameters + *

+ * @param int $flags [optional]

+ * Parse flags + *

+ * @return object parameter list as stdClass object. + * @jms-builtin + */ +function http_parse_params ($param, $flags = null) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Get request headers as array + * @link http://php.net/manual/en/function.http-get-request-headers.php + * @return array an associative array of incoming request headers. + * @jms-builtin + */ +function http_get_request_headers () {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Get request body as string + * @link http://php.net/manual/en/function.http-get-request-body.php + * @return string the raw request body as string on success or NULL on failure. + * @jms-builtin + */ +function http_get_request_body () {} + +/** + * (PECL pecl_http >= 0.22.0)
+ * Get request body as stream + * @link http://php.net/manual/en/function.http-get-request-body-stream.php + * @return resource the raw request body as stream on success or NULL on failure. + * @jms-builtin + */ +function http_get_request_body_stream () {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Match any header + * @link http://php.net/manual/en/function.http-match-request-header.php + * @param string $header

+ * the header name (case-insensitive) + *

+ * @param string $value

+ * the header value that should be compared + *

+ * @param bool $match_case [optional]

+ * whether the value should be compared case sensitively + *

+ * @return bool true if header value matches, else false. + * @jms-builtin + */ +function http_match_request_header ($header, $value, $match_case = null) {} + +/** + * (PECL pecl_http >= 1.5.0)
+ * Stat persistent handles + * @link http://php.net/manual/en/function.http-persistent-handles-count.php + * @return object persistent handles statistics as stdClass object on success&return.falseforfailure;. + * @jms-builtin + */ +function http_persistent_handles_count () {} + +/** + * (PECL pecl_http >= 1.5.0)
+ * Clean up persistent handles + * @link http://php.net/manual/en/function.http-persistent-handles-clean.php + * @param string $ident [optional] + * @return string + * @jms-builtin + */ +function http_persistent_handles_clean ($ident = null) {} + +/** + * (PECL pecl_http >= 1.5.0)
+ * Get/set ident of persistent handles + * @link http://php.net/manual/en/function.http-persistent-handles-ident.php + * @param string $ident

+ * the identification string + *

+ * @return string the prior ident as string on success&return.falseforfailure;. + * @jms-builtin + */ +function http_persistent_handles_ident ($ident) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Perform GET request + * @link http://php.net/manual/en/function.http-get.php + * @param string $url

+ * URL + *

+ * @param array $options [optional]

+ * &link.http.request.options; + *

+ * @param array $info [optional]

+ * Will be filled with request/response information + *

+ * @return string &returns.http.response; + * @jms-builtin + */ +function http_get ($url, $options = nullarray , &$info = nullarray ) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Perform HEAD request + * @link http://php.net/manual/en/function.http-head.php + * @param string $url [optional]

+ * URL + *

+ * @param array $options [optional]

+ * &link.http.request.options; + *

+ * @param array $info [optional]

+ * &link.http.request.info; + *

+ * @return string &returns.http.response; + * @jms-builtin + */ +function http_head ($url = null, $options = nullarray , &$info = nullarray ) {} + +/** + * (PECL pecl_http >= 0.1.0)
+ * Perform POST request with pre-encoded data + * @link http://php.net/manual/en/function.http-post-data.php + * @param string $url

+ * URL + *

+ * @param string $data [optional]

+ * String containing the pre-encoded post data + *

+ * @param array $options [optional]

+ * &link.http.request.options; + *

+ * @param array $info [optional]

+ * &link.http.request.info; + *

+ * @return string &returns.http.response; + * @jms-builtin + */ +function http_post_data ($url, $data = null, $options = nullarray , &$info = nullarray ) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Perform POST request with data to be encoded + * @link http://php.net/manual/en/function.http-post-fields.php + * @param string $url

+ * URL + *

+ * @param array $data [optional]

+ * Associative array of POST values + *

+ * @param array $files [optional]

+ * Array of files to post + *

+ * @param array $options [optional]

+ * &link.http.request.options; + *

+ * @param array $info [optional]

+ * &link.http.request.info; + *

+ * @return string &returns.http.response; + * @jms-builtin + */ +function http_post_fields ($url, $data = nullarray , $files = nullarray , $options = nullarray , &$info = nullarray ) {} + +/** + * (PECL pecl_http >= 0.25.0)
+ * Perform PUT request with data + * @link http://php.net/manual/en/function.http-put-data.php + * @param string $url

+ * URL + *

+ * @param string $data [optional]

+ * PUT request body + *

+ * @param array $options [optional]

+ * &link.http.request.options; + *

+ * @param array $info [optional]

+ * &link.http.request.info; + *

+ * @return string &returns.http.response; + * @jms-builtin + */ +function http_put_data ($url, $data = null, $options = nullarray , &$info = nullarray ) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Perform PUT request with file + * @link http://php.net/manual/en/function.http-put-file.php + * @param string $url

+ * URL + *

+ * @param string $file [optional]

+ * The file to put + *

+ * @param array $options [optional]

+ * &link.http.request.options; + *

+ * @param array $info [optional]

+ * &link.http.request.info; + *

+ * @return string &returns.http.response; + * @jms-builtin + */ +function http_put_file ($url, $file = null, $options = nullarray , &$info = nullarray ) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Perform PUT request with stream + * @link http://php.net/manual/en/function.http-put-stream.php + * @param string $url

+ * URL + *

+ * @param resource $stream [optional]

+ * The stream to read the PUT request body from + *

+ * @param array $options [optional]

+ * &link.http.request.options; + *

+ * @param array $info [optional]

+ * &link.http.request.info; + *

+ * @return string &returns.http.response; + * @jms-builtin + */ +function http_put_stream ($url, $stream = null, $options = nullarray , &$info = nullarray ) {} + +/** + * (PECL pecl_http >= 1.0.0)
+ * Perform custom request + * @link http://php.net/manual/en/function.http-request.php + * @param int $method

+ * Request method + *

+ * @param string $url [optional]

+ * URL + *

+ * @param string $body [optional]

+ * Request body + *

+ * @param array $options [optional]

+ * &link.http.request.options; + *

+ * @param array $info [optional]

+ * &link.http.request.info; + *

+ * @return string &returns.http.response; + * @jms-builtin + */ +function http_request ($method, $url = null, $body = null, $options = nullarray , &$info = nullarray ) {} + +/** + * (PECL pecl_http >= 1.0.0)
+ * Encode request body + * @link http://php.net/manual/en/function.http-request-body-encode.php + * @param array $fields

+ * POST fields + *

+ * @param array $files

+ * POST files + *

+ * @return string encoded string on success&return.falseforfailure;. + * @jms-builtin + */ +function http_request_body_encode ($fieldsarray , $filesarray ) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Register request method + * @link http://php.net/manual/en/function.http-request-method-register.php + * @param string $method

+ * the request method name to register + *

+ * @return int the ID of the request method on success&return.falseforfailure;. + * @jms-builtin + */ +function http_request_method_register ($method) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Unregister request method + * @link http://php.net/manual/en/function.http-request-method-unregister.php + * @param mixed $method

+ * The request method name or ID + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function http_request_method_unregister ($method) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Check whether request method exists + * @link http://php.net/manual/en/function.http-request-method-exists.php + * @param mixed $method

+ * request method name or ID + *

+ * @return int true if the request method is known, else false. + * @jms-builtin + */ +function http_request_method_exists ($method) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * Get request method name + * @link http://php.net/manual/en/function.http-request-method-name.php + * @param int $method

+ * request method ID + *

+ * @return string the request method name as string on success&return.falseforfailure;. + * @jms-builtin + */ +function http_request_method_name ($method) {} + +/** + * (PECL pecl_http >= 0.10.0)
+ * ETag output handler + * @link http://php.net/manual/en/function.ob-etaghandler.php + * @param string $data + * @param int $mode + * @return string + * @jms-builtin + */ +function ob_etaghandler ($data, $mode) {} + +/** + * (PECL pecl_http >= 0.15.0)
+ * Deflate data + * @link http://php.net/manual/en/function.http-deflate.php + * @param string $data

+ * String containing the data that should be encoded + *

+ * @param int $flags [optional]

+ * deflate options + *

+ * @return string the encoded string on success, or NULL on failure. + * @jms-builtin + */ +function http_deflate ($data, $flags = null) {} + +/** + * (PECL pecl_http >= 0.15.0)
+ * Inflate data + * @link http://php.net/manual/en/function.http-inflate.php + * @param string $data

+ * string containing the compressed data + *

+ * @return string the decoded string on success, or NULL on failure. + * @jms-builtin + */ +function http_inflate ($data) {} + +/** + * (PECL pecl_http >= 0.21.0)
+ * Deflate output handler + * @link http://php.net/manual/en/function.ob-deflatehandler.php + * @param string $data + * @param int $mode + * @return string + * @jms-builtin + */ +function ob_deflatehandler ($data, $mode) {} + +/** + * (PECL pecl_http >= 0.21.0)
+ * Inflate output handler + * @link http://php.net/manual/en/function.ob-inflatehandler.php + * @param string $data + * @param int $mode + * @return string + * @jms-builtin + */ +function ob_inflatehandler ($data, $mode) {} + +/** + * (PECL pecl_http >= 0.15.0)
+ * Check built-in HTTP support + * @link http://php.net/manual/en/function.http-support.php + * @param int $feature [optional]

+ * feature to probe for + *

+ * @return int integer, whether requested feature is supported, + * or a bitmask with all supported features if feature was omitted. + * @jms-builtin + */ +function http_support ($feature = null) {} + + +/** + * don't urldecode values + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_COOKIE_PARSE_RAW', 1); + +/** + * whether "secure" was found in the cookie's parameters list + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_COOKIE_SECURE', 16); + +/** + * whether "httpOnly" was found in the cookie's parameter list + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_COOKIE_HTTPONLY', 32); +define ('HTTP_DEFLATE_LEVEL_DEF', 0); +define ('HTTP_DEFLATE_LEVEL_MIN', 1); +define ('HTTP_DEFLATE_LEVEL_MAX', 9); +define ('HTTP_DEFLATE_TYPE_ZLIB', 0); +define ('HTTP_DEFLATE_TYPE_GZIP', 16); +define ('HTTP_DEFLATE_TYPE_RAW', 32); +define ('HTTP_DEFLATE_STRATEGY_DEF', 0); +define ('HTTP_DEFLATE_STRATEGY_FILT', 256); +define ('HTTP_DEFLATE_STRATEGY_HUFF', 512); +define ('HTTP_DEFLATE_STRATEGY_RLE', 768); +define ('HTTP_DEFLATE_STRATEGY_FIXED', 1024); + +/** + * don't flush + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_ENCODING_STREAM_FLUSH_NONE', 0); + +/** + * synchronized flush only + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_ENCODING_STREAM_FLUSH_SYNC', 1048576); + +/** + * full data flush + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_ENCODING_STREAM_FLUSH_FULL', 2097152); + +/** + * use "basic" authentication + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_AUTH_BASIC', 1); + +/** + * use "digest" authentication + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_AUTH_DIGEST', 2); + +/** + * use "NTLM" authentication + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_AUTH_NTLM', 8); + +/** + * use "GSS-NEGOTIATE" authentication + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_AUTH_GSSNEG', 4); + +/** + * try any authentication scheme + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_AUTH_ANY', -1); +define ('HTTP_VERSION_NONE', 0); + +/** + * HTTP version 1.0 + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_VERSION_1_0', 1); + +/** + * HTTP version 1.1 + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_VERSION_1_1', 2); + +/** + * no specific HTTP protocol version + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_VERSION_ANY', 0); + +/** + * use TLSv1 only + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_SSL_VERSION_TLSv1', 1); + +/** + * use SSLv2 only + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_SSL_VERSION_SSLv2', 2); + +/** + * use SSLv3 only + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_SSL_VERSION_SSLv3', 3); + +/** + * no specific SSL protocol version + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_SSL_VERSION_ANY', 0); + +/** + * use IPv4 only for name lookups + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_IPRESOLVE_V4', 1); + +/** + * use IPv6 only for name lookups + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_IPRESOLVE_V6', 2); + +/** + * use any IP mechanism only for name lookups + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_IPRESOLVE_ANY', 0); + +/** + * the proxy is a SOCKS4 type proxy + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_PROXY_SOCKS4', 4); + +/** + * the proxy is a SOCKS5 type proxy + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_PROXY_SOCKS5', 5); + +/** + * standard HTTP proxy + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_PROXY_HTTP', 0); +define ('HTTP_METH_GET', 1); +define ('HTTP_METH_HEAD', 2); +define ('HTTP_METH_POST', 3); +define ('HTTP_METH_PUT', 4); +define ('HTTP_METH_DELETE', 5); +define ('HTTP_METH_OPTIONS', 6); +define ('HTTP_METH_TRACE', 7); +define ('HTTP_METH_CONNECT', 8); +define ('HTTP_METH_PROPFIND', 9); +define ('HTTP_METH_PROPPATCH', 10); +define ('HTTP_METH_MKCOL', 11); +define ('HTTP_METH_COPY', 12); +define ('HTTP_METH_MOVE', 13); +define ('HTTP_METH_LOCK', 14); +define ('HTTP_METH_UNLOCK', 15); +define ('HTTP_METH_VERSION_CONTROL', 16); +define ('HTTP_METH_REPORT', 17); +define ('HTTP_METH_CHECKOUT', 18); +define ('HTTP_METH_CHECKIN', 19); +define ('HTTP_METH_UNCHECKOUT', 20); +define ('HTTP_METH_MKWORKSPACE', 21); +define ('HTTP_METH_UPDATE', 22); +define ('HTTP_METH_LABEL', 23); +define ('HTTP_METH_MERGE', 24); +define ('HTTP_METH_BASELINE_CONTROL', 25); +define ('HTTP_METH_MKACTIVITY', 26); +define ('HTTP_METH_ACL', 27); + +/** + * guess applicable redirect method + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_REDIRECT', 0); + +/** + * permanent redirect (301 Moved permanently) + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_REDIRECT_PERM', 301); + +/** + * standard redirect (302 Found) + * RFC 1945 and RFC 2068 specify that the client is not allowed + * to change the method on the redirected request. However, most + * existing user agent implementations treat 302 as if it were a 303 + * response, performing a GET on the Location field-value regardless + * of the original request method. The status codes 303 and 307 have + * been added for servers that wish to make unambiguously clear which + * kind of reaction is expected of the client. + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_REDIRECT_FOUND', 302); + +/** + * redirect applicable to POST requests (303 See other) + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_REDIRECT_POST', 303); + +/** + * proxy redirect (305 Use proxy) + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_REDIRECT_PROXY', 305); + +/** + * temporary redirect (307 Temporary Redirect) + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_REDIRECT_TEMP', 307); + +/** + * querying for this constant will always return true + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_SUPPORT', 1); + +/** + * whether support to issue HTTP requests is given, ie. libcurl support was compiled in + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_SUPPORT_REQUESTS', 2); + +/** + * whether support to guess the Content-Type of HTTP messages is given, ie. libmagic support was compiled in + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_SUPPORT_MAGICMIME', 4); + +/** + * whether support for zlib encodings is given, ie. libz support was compiled in + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_SUPPORT_ENCODINGS', 8); + +/** + * whether support to issue HTTP requests over SSL is given, ie. linked libcurl was built with SSL support + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_SUPPORT_SSLREQUESTS', 32); +define ('HTTP_SUPPORT_EVENTS', 128); + +/** + * allow commands additionally to semicolons as separator + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_PARAMS_ALLOW_COMMA', 1); + +/** + * continue parsing after an error occurred + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_PARAMS_ALLOW_FAILURE', 2); + +/** + * raise PHP warnings on parse errors + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_PARAMS_RAISE_ERROR', 4); + +/** + * all three values above, bitwise or'ed + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_PARAMS_DEFAULT', 7); + +/** + * replace every part of the first URL when there's one of the second URL + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_REPLACE', 0); + +/** + * join relative paths + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_JOIN_PATH', 1); + +/** + * join query strings + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_JOIN_QUERY', 2); + +/** + * strip any user authentication information + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_STRIP_USER', 4); + +/** + * strip any password authentication information + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_STRIP_PASS', 8); + +/** + * strip any authentication information + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_STRIP_AUTH', 12); + +/** + * strip explicit port numbers + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_STRIP_PORT', 32); + +/** + * strip complete path + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_STRIP_PATH', 64); + +/** + * strip query string + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_STRIP_QUERY', 128); + +/** + * strip any fragments (#identifier) + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_STRIP_FRAGMENT', 256); + +/** + * strip anything but scheme and host + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_URL_STRIP_ALL', 492); +define ('HTTP_URL_FROM_ENV', 4096); + +/** + * runtime error + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_RUNTIME', 1); + +/** + * an invalid parameter was passed + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_INVALID_PARAM', 2); + +/** + * header() or similar operation failed + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_HEADER', 3); + +/** + * HTTP header parse error + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_MALFORMED_HEADERS', 4); + +/** + * unknown/invalid request method + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_REQUEST_METHOD', 5); + +/** + * with operation incompatible message type + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_MESSAGE_TYPE', 6); + +/** + * encoding/decoding error + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_ENCODING', 7); + +/** + * request failure + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_REQUEST', 8); + +/** + * request pool failure + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_REQUEST_POOL', 9); + +/** + * socket exception + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_SOCKET', 10); + +/** + * response failure + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_RESPONSE', 11); + +/** + * invalid URL + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_URL', 12); + +/** + * querystring operation failure + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_E_QUERYSTRING', 13); + +/** + * the message is of no specific type + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_MSG_NONE', 0); + +/** + * request style message + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_MSG_REQUEST', 1); + +/** + * response style message + * @link http://php.net/manual/en/http.constants.php + */ +define ('HTTP_MSG_RESPONSE', 2); +define ('HTTP_QUERYSTRING_TYPE_BOOL', 3); +define ('HTTP_QUERYSTRING_TYPE_INT', 1); +define ('HTTP_QUERYSTRING_TYPE_FLOAT', 2); +define ('HTTP_QUERYSTRING_TYPE_STRING', 6); +define ('HTTP_QUERYSTRING_TYPE_ARRAY', 4); +define ('HTTP_QUERYSTRING_TYPE_OBJECT', 5); + +// End of http v.1.6.6 +?> diff --git a/res/php-5.4-core-api/iconv.php b/res/php-5.4-core-api/iconv.php new file mode 100644 index 0000000..4ba88af --- /dev/null +++ b/res/php-5.4-core-api/iconv.php @@ -0,0 +1,443 @@ + + * Convert string to requested character encoding + * @link http://php.net/manual/en/function.iconv.php + * @param string $in_charset

+ * The input charset. + *

+ * @param string $out_charset

+ * The output charset. + *

+ *

+ * If you append the string //TRANSLIT to + * out_charset transliteration is activated. This + * means that when a character can't be represented in the target charset, + * it can be approximated through one or several similarly looking + * characters. If you append the string //IGNORE, + * characters that cannot be represented in the target charset are silently + * discarded. Otherwise, str is cut from the first + * illegal character and an E_NOTICE is generated. + *

+ * @param string $str

+ * The string to be converted. + *

+ * @return string the converted string or FALSE on failure. + * @jms-builtin + */ +function iconv ($in_charset, $out_charset, $str) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Retrieve internal configuration variables of iconv extension + * @link http://php.net/manual/en/function.iconv-get-encoding.php + * @param string $type [optional]

+ * The value of the optional type can be: + * all + * input_encoding + * output_encoding + * internal_encoding + *

+ * @return mixed the current value of the internal configuration variable if + * successful or FALSE on failure. + *

+ *

+ * If type is omitted or set to "all", + * iconv_get_encoding returns an array that + * stores all these variables. + * @jms-builtin + */ +function iconv_get_encoding ($type = "all") {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Set current setting for character encoding conversion + * @link http://php.net/manual/en/function.iconv-set-encoding.php + * @param string $type

+ * The value of type can be any one of these: + * input_encoding + * output_encoding + * internal_encoding + *

+ * @param string $charset

+ * The character set. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function iconv_set_encoding ($type, $charset) {} + +/** + * (PHP 5)
+ * Returns the character count of string + * @link http://php.net/manual/en/function.iconv-strlen.php + * @param string $str

+ * The string. + *

+ * @param string $charset [optional]

+ * If charset parameter is omitted, + * str is assumed to be encoded in + * iconv.internal_encoding. + *

+ * @return int the character count of str, as an integer. + * @jms-builtin + */ +function iconv_strlen ($str, $charset = 'ini_get("iconv.internal_encoding")') {} + +/** + * (PHP 5)
+ * Cut out part of a string + * @link http://php.net/manual/en/function.iconv-substr.php + * @param string $str

+ * The original string. + *

+ * @param int $offset

+ * If offset is non-negative, + * iconv_substr cuts the portion out of + * str beginning at offset'th + * character, counting from zero. + *

+ *

+ * If offset is negative, + * iconv_substr cuts out the portion beginning + * at the position, offset characters + * away from the end of str. + *

+ * @param int $length [optional]

+ * If length is given and is positive, the return + * value will contain at most length characters + * of the portion that begins at offset + * (depending on the length of string). + *

+ *

+ * If negative length is passed, + * iconv_substr cuts the portion out of + * str from the offset'th + * character up to the character that is + * length characters away from the end of the string. + * In case offset is also negative, the start position + * is calculated beforehand according to the rule explained above. + *

+ * @param string $charset [optional]

+ * If charset parameter is omitted, + * string are assumed to be encoded in + * iconv.internal_encoding. + *

+ *

+ * Note that offset and length + * parameters are always deemed to represent offsets that are + * calculated on the basis of the character set determined by + * charset, whilst the counterpart + * substr always takes these for byte offsets. + *

+ * @return string the portion of str specified by the + * offset and length parameters. + *

+ *

+ * If str is shorter than offset + * characters long, FALSE will be returned. + * @jms-builtin + */ +function iconv_substr ($str, $offset, $length = 'iconv_strlen($str, $charset)', $charset = 'ini_get("iconv.internal_encoding")') {} + +/** + * (PHP 5)
+ * Finds position of first occurrence of a needle within a haystack + * @link http://php.net/manual/en/function.iconv-strpos.php + * @param string $haystack

+ * The entire string. + *

+ * @param string $needle

+ * The searched substring. + *

+ * @param int $offset [optional]

+ * The optional offset parameter specifies + * the position from which the search should be performed. + *

+ * @param string $charset [optional]

+ * If charset parameter is omitted, + * string are assumed to be encoded in + * iconv.internal_encoding. + *

+ * @return int the numeric position of the first occurrence of + * needle in haystack. + *

+ *

+ * If needle is not found, + * iconv_strpos will return FALSE. + * @jms-builtin + */ +function iconv_strpos ($haystack, $needle, $offset = 0, $charset = 'ini_get("iconv.internal_encoding")') {} + +/** + * (PHP 5)
+ * Finds the last occurrence of a needle within a haystack + * @link http://php.net/manual/en/function.iconv-strrpos.php + * @param string $haystack

+ * The entire string. + *

+ * @param string $needle

+ * The searched substring. + *

+ * @param string $charset [optional]

+ * If charset parameter is omitted, + * string are assumed to be encoded in + * iconv.internal_encoding. + *

+ * @return int the numeric position of the last occurrence of + * needle in haystack. + *

+ *

+ * If needle is not found, + * iconv_strrpos will return FALSE. + * @jms-builtin + */ +function iconv_strrpos ($haystack, $needle, $charset = 'ini_get("iconv.internal_encoding")') {} + +/** + * (PHP 5)
+ * Composes a MIME header field + * @link http://php.net/manual/en/function.iconv-mime-encode.php + * @param string $field_name

+ * The field name. + *

+ * @param string $field_value

+ * The field value. + *

+ * @param array $preferences [optional]

+ * You can control the behaviour of iconv_mime_encode + * by specifying an associative array that contains configuration items + * to the optional third parameter preferences. + * The items supported by iconv_mime_encode are + * listed below. Note that item names are treated case-sensitive. + * + * Configuration items supported by iconv_mime_encode + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ItemTypeDescriptionDefault valueExample
schemestring + * Specifies the method to encode a field value by. The value of + * this item may be either "B" or "Q", where "B" stands for + * base64 encoding scheme and "Q" stands for + * quoted-printable encoding scheme. + * BB
input-charsetstring + * Specifies the character set in which the first parameter + * field_name and the second parameter + * field_value are presented. If not given, + * iconv_mime_encode assumes those parameters + * are presented to it in the + * iconv.internal_encoding + * ini setting. + * + * iconv.internal_encoding + * ISO-8859-1
output-charsetstring + * Specifies the character set to use to compose the + * MIME header. + * + * iconv.internal_encoding + * UTF-8
line-lengthinteger + * Specifies the maximum length of the header lines. The resulting + * header is "folded" to a set of multiple lines in case + * the resulting header field would be longer than the value of this + * parameter, according to + * RFC2822 - Internet Message Format. + * If not given, the length will be limited to 76 characters. + * 76996
line-break-charsstring + * Specifies the sequence of characters to append to each line + * as an end-of-line sign when "folding" is performed on a long header + * field. If not given, this defaults to "\r\n" + * (CR LF). Note that + * this parameter is always treated as an ASCII string regardless + * of the value of input-charset. + * \r\n\n
+ *

+ * @return string an encoded MIME field on success, + * or FALSE if an error occurs during the encoding. + * @jms-builtin + */ +function iconv_mime_encode ($field_name, $field_value, array $preferences = null) {} + +/** + * (PHP 5)
+ * Decodes a MIME header field + * @link http://php.net/manual/en/function.iconv-mime-decode.php + * @param string $encoded_header

+ * The encoded header, as a string. + *

+ * @param int $mode [optional]

+ * mode determines the behaviour in the event + * iconv_mime_decode encounters a malformed + * MIME header field. You can specify any combination + * of the following bitmasks. + * + * Bitmasks acceptable to iconv_mime_decode + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueConstantDescription
1ICONV_MIME_DECODE_STRICT + * If set, the given header is decoded in full conformance with the + * standards defined in RFC2047. + * This option is disabled by default because there are a lot of + * broken mail user agents that don't follow the specification and don't + * produce correct MIME headers. + *
2ICONV_MIME_DECODE_CONTINUE_ON_ERROR + * If set, iconv_mime_decode_headers + * attempts to ignore any grammatical errors and continue to process + * a given header. + *
+ *

+ * @param string $charset [optional]

+ * The optional charset parameter specifies the + * character set to represent the result by. If omitted, + * iconv.internal_encoding + * will be used. + *

+ * @return string a decoded MIME field on success, + * or FALSE if an error occurs during the decoding. + * @jms-builtin + */ +function iconv_mime_decode ($encoded_header, $mode = 0, $charset = 'ini_get("iconv.internal_encoding")') {} + +/** + * (PHP 5)
+ * Decodes multiple MIME header fields at once + * @link http://php.net/manual/en/function.iconv-mime-decode-headers.php + * @param string $encoded_headers

+ * The encoded headers, as a string. + *

+ * @param int $mode [optional]

+ * mode determines the behaviour in the event + * iconv_mime_decode_headers encounters a malformed + * MIME header field. You can specify any combination + * of the following bitmasks. + * + * Bitmasks acceptable to iconv_mime_decode_headers + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueConstantDescription
1ICONV_MIME_DECODE_STRICT + * If set, the given header is decoded in full conformance with the + * standards defined in RFC2047. + * This option is disabled by default because there are a lot of + * broken mail user agents that don't follow the specification and don't + * produce correct MIME headers. + *
2ICONV_MIME_DECODE_CONTINUE_ON_ERROR + * If set, iconv_mime_decode_headers + * attempts to ignore any grammatical errors and continue to process + * a given header. + *
+ *

+ * @param string $charset [optional]

+ * The optional charset parameter specifies the + * character set to represent the result by. If omitted, + * iconv.internal_encoding + * will be used. + *

+ * @return array an associative array that holds a whole set of + * MIME header fields specified by + * encoded_headers on success, or FALSE + * if an error occurs during the decoding. + *

+ *

+ * Each key of the return value represents an individual + * field name and the corresponding element represents a field value. + * If more than one field of the same name are present, + * iconv_mime_decode_headers automatically incorporates + * them into a numerically indexed array in the order of occurrence. + * @jms-builtin + */ +function iconv_mime_decode_headers ($encoded_headers, $mode = 0, $charset = 'ini_get("iconv.internal_encoding")') {} + + +/** + * string + * @link http://php.net/manual/en/iconv.constants.php + */ +define ('ICONV_IMPL', "glibc"); + +/** + * string + * @link http://php.net/manual/en/iconv.constants.php + */ +define ('ICONV_VERSION', 2.15); + +/** + * integer + * @link http://php.net/manual/en/iconv.constants.php + */ +define ('ICONV_MIME_DECODE_STRICT', 1); + +/** + * integer + * @link http://php.net/manual/en/iconv.constants.php + */ +define ('ICONV_MIME_DECODE_CONTINUE_ON_ERROR', 2); + +// End of iconv v. +?> diff --git a/res/php-5.4-core-api/imagick.php b/res/php-5.4-core-api/imagick.php new file mode 100644 index 0000000..b83d260 --- /dev/null +++ b/res/php-5.4-core-api/imagick.php @@ -0,0 +1,6364 @@ + + * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or null otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class ImagickDrawException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or null otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class ImagickPixelIteratorException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or null otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class ImagickPixelException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or null otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * @link http://php.net/manual/en/class.imagick.php + * @jms-builtin + */ +class Imagick implements Iterator, Traversable { + const COLOR_BLACK = 11; + const COLOR_BLUE = 12; + const COLOR_CYAN = 13; + const COLOR_GREEN = 14; + const COLOR_RED = 15; + const COLOR_YELLOW = 16; + const COLOR_MAGENTA = 17; + const COLOR_OPACITY = 18; + const COLOR_ALPHA = 19; + const COLOR_FUZZ = 20; + const IMAGICK_EXTNUM = 30001; + const IMAGICK_EXTVER = "3.0.1"; + const COMPOSITE_DEFAULT = 40; + const COMPOSITE_UNDEFINED = 0; + const COMPOSITE_NO = 1; + const COMPOSITE_ADD = 2; + const COMPOSITE_ATOP = 3; + const COMPOSITE_BLEND = 4; + const COMPOSITE_BUMPMAP = 5; + const COMPOSITE_CLEAR = 7; + const COMPOSITE_COLORBURN = 8; + const COMPOSITE_COLORDODGE = 9; + const COMPOSITE_COLORIZE = 10; + const COMPOSITE_COPYBLACK = 11; + const COMPOSITE_COPYBLUE = 12; + const COMPOSITE_COPY = 13; + const COMPOSITE_COPYCYAN = 14; + const COMPOSITE_COPYGREEN = 15; + const COMPOSITE_COPYMAGENTA = 16; + const COMPOSITE_COPYOPACITY = 17; + const COMPOSITE_COPYRED = 18; + const COMPOSITE_COPYYELLOW = 19; + const COMPOSITE_DARKEN = 20; + const COMPOSITE_DSTATOP = 21; + const COMPOSITE_DST = 22; + const COMPOSITE_DSTIN = 23; + const COMPOSITE_DSTOUT = 24; + const COMPOSITE_DSTOVER = 25; + const COMPOSITE_DIFFERENCE = 26; + const COMPOSITE_DISPLACE = 27; + const COMPOSITE_DISSOLVE = 28; + const COMPOSITE_EXCLUSION = 29; + const COMPOSITE_HARDLIGHT = 30; + const COMPOSITE_HUE = 31; + const COMPOSITE_IN = 32; + const COMPOSITE_LIGHTEN = 33; + const COMPOSITE_LUMINIZE = 35; + const COMPOSITE_MINUS = 36; + const COMPOSITE_MODULATE = 37; + const COMPOSITE_MULTIPLY = 38; + const COMPOSITE_OUT = 39; + const COMPOSITE_OVER = 40; + const COMPOSITE_OVERLAY = 41; + const COMPOSITE_PLUS = 42; + const COMPOSITE_REPLACE = 43; + const COMPOSITE_SATURATE = 44; + const COMPOSITE_SCREEN = 45; + const COMPOSITE_SOFTLIGHT = 46; + const COMPOSITE_SRCATOP = 47; + const COMPOSITE_SRC = 48; + const COMPOSITE_SRCIN = 49; + const COMPOSITE_SRCOUT = 50; + const COMPOSITE_SRCOVER = 51; + const COMPOSITE_SUBTRACT = 52; + const COMPOSITE_THRESHOLD = 53; + const COMPOSITE_XOR = 54; + const MONTAGEMODE_FRAME = 1; + const MONTAGEMODE_UNFRAME = 2; + const MONTAGEMODE_CONCATENATE = 3; + const STYLE_NORMAL = 1; + const STYLE_ITALIC = 2; + const STYLE_OBLIQUE = 3; + const STYLE_ANY = 4; + const FILTER_UNDEFINED = 0; + const FILTER_POINT = 1; + const FILTER_BOX = 2; + const FILTER_TRIANGLE = 3; + const FILTER_HERMITE = 4; + const FILTER_HANNING = 5; + const FILTER_HAMMING = 6; + const FILTER_BLACKMAN = 7; + const FILTER_GAUSSIAN = 8; + const FILTER_QUADRATIC = 9; + const FILTER_CUBIC = 10; + const FILTER_CATROM = 11; + const FILTER_MITCHELL = 12; + const FILTER_LANCZOS = 13; + const FILTER_BESSEL = 14; + const FILTER_SINC = 15; + const IMGTYPE_UNDEFINED = 0; + const IMGTYPE_BILEVEL = 1; + const IMGTYPE_GRAYSCALE = 2; + const IMGTYPE_GRAYSCALEMATTE = 3; + const IMGTYPE_PALETTE = 4; + const IMGTYPE_PALETTEMATTE = 5; + const IMGTYPE_TRUECOLOR = 6; + const IMGTYPE_TRUECOLORMATTE = 7; + const IMGTYPE_COLORSEPARATION = 8; + const IMGTYPE_COLORSEPARATIONMATTE = 9; + const IMGTYPE_OPTIMIZE = 10; + const RESOLUTION_UNDEFINED = 0; + const RESOLUTION_PIXELSPERINCH = 1; + const RESOLUTION_PIXELSPERCENTIMETER = 2; + const COMPRESSION_UNDEFINED = 0; + const COMPRESSION_NO = 1; + const COMPRESSION_BZIP = 2; + const COMPRESSION_FAX = 6; + const COMPRESSION_GROUP4 = 7; + const COMPRESSION_JPEG = 8; + const COMPRESSION_JPEG2000 = 9; + const COMPRESSION_LOSSLESSJPEG = 10; + const COMPRESSION_LZW = 11; + const COMPRESSION_RLE = 12; + const COMPRESSION_ZIP = 13; + const COMPRESSION_DXT1 = 3; + const COMPRESSION_DXT3 = 4; + const COMPRESSION_DXT5 = 5; + const PAINT_POINT = 1; + const PAINT_REPLACE = 2; + const PAINT_FLOODFILL = 3; + const PAINT_FILLTOBORDER = 4; + const PAINT_RESET = 5; + const GRAVITY_NORTHWEST = 1; + const GRAVITY_NORTH = 2; + const GRAVITY_NORTHEAST = 3; + const GRAVITY_WEST = 4; + const GRAVITY_CENTER = 5; + const GRAVITY_EAST = 6; + const GRAVITY_SOUTHWEST = 7; + const GRAVITY_SOUTH = 8; + const GRAVITY_SOUTHEAST = 9; + const STRETCH_NORMAL = 1; + const STRETCH_ULTRACONDENSED = 2; + const STRETCH_CONDENSED = 4; + const STRETCH_SEMICONDENSED = 5; + const STRETCH_SEMIEXPANDED = 6; + const STRETCH_EXPANDED = 7; + const STRETCH_EXTRAEXPANDED = 8; + const STRETCH_ULTRAEXPANDED = 9; + const STRETCH_ANY = 10; + const ALIGN_UNDEFINED = 0; + const ALIGN_LEFT = 1; + const ALIGN_CENTER = 2; + const ALIGN_RIGHT = 3; + const DECORATION_NO = 1; + const DECORATION_UNDERLINE = 2; + const DECORATION_OVERLINE = 3; + const DECORATION_LINETROUGH = 4; + const NOISE_UNIFORM = 1; + const NOISE_GAUSSIAN = 2; + const NOISE_MULTIPLICATIVEGAUSSIAN = 3; + const NOISE_IMPULSE = 4; + const NOISE_LAPLACIAN = 5; + const NOISE_POISSON = 6; + const NOISE_RANDOM = 7; + const CHANNEL_UNDEFINED = 0; + const CHANNEL_RED = 1; + const CHANNEL_GRAY = 1; + const CHANNEL_CYAN = 1; + const CHANNEL_GREEN = 2; + const CHANNEL_MAGENTA = 2; + const CHANNEL_BLUE = 4; + const CHANNEL_YELLOW = 4; + const CHANNEL_ALPHA = 8; + const CHANNEL_OPACITY = 8; + const CHANNEL_MATTE = 8; + const CHANNEL_BLACK = 32; + const CHANNEL_INDEX = 32; + const CHANNEL_ALL = 47; + const CHANNEL_DEFAULT = 39; + const METRIC_UNDEFINED = 0; + const METRIC_MEANABSOLUTEERROR = 2; + const METRIC_MEANSQUAREERROR = 4; + const METRIC_PEAKABSOLUTEERROR = 5; + const METRIC_PEAKSIGNALTONOISERATIO = 6; + const METRIC_ROOTMEANSQUAREDERROR = 7; + const PIXEL_CHAR = 1; + const PIXEL_DOUBLE = 2; + const PIXEL_FLOAT = 3; + const PIXEL_INTEGER = 4; + const PIXEL_LONG = 5; + const PIXEL_QUANTUM = 6; + const PIXEL_SHORT = 7; + const EVALUATE_UNDEFINED = 0; + const EVALUATE_ADD = 1; + const EVALUATE_AND = 2; + const EVALUATE_DIVIDE = 3; + const EVALUATE_LEFTSHIFT = 4; + const EVALUATE_MAX = 5; + const EVALUATE_MIN = 6; + const EVALUATE_MULTIPLY = 7; + const EVALUATE_OR = 8; + const EVALUATE_RIGHTSHIFT = 9; + const EVALUATE_SET = 10; + const EVALUATE_SUBTRACT = 11; + const EVALUATE_XOR = 12; + const EVALUATE_POW = 13; + const EVALUATE_LOG = 14; + const EVALUATE_THRESHOLD = 15; + const EVALUATE_THRESHOLDBLACK = 16; + const EVALUATE_THRESHOLDWHITE = 17; + const EVALUATE_GAUSSIANNOISE = 18; + const EVALUATE_IMPULSENOISE = 19; + const EVALUATE_LAPLACIANNOISE = 20; + const EVALUATE_MULTIPLICATIVENOISE = 21; + const EVALUATE_POISSONNOISE = 22; + const EVALUATE_UNIFORMNOISE = 23; + const EVALUATE_COSINE = 24; + const EVALUATE_SINE = 25; + const EVALUATE_ADDMODULUS = 26; + const COLORSPACE_UNDEFINED = 0; + const COLORSPACE_RGB = 1; + const COLORSPACE_GRAY = 2; + const COLORSPACE_TRANSPARENT = 3; + const COLORSPACE_OHTA = 4; + const COLORSPACE_LAB = 5; + const COLORSPACE_XYZ = 6; + const COLORSPACE_YCBCR = 7; + const COLORSPACE_YCC = 8; + const COLORSPACE_YIQ = 9; + const COLORSPACE_YPBPR = 10; + const COLORSPACE_YUV = 11; + const COLORSPACE_CMYK = 12; + const COLORSPACE_SRGB = 13; + const COLORSPACE_HSB = 14; + const COLORSPACE_HSL = 15; + const COLORSPACE_HWB = 16; + const COLORSPACE_REC601LUMA = 17; + const COLORSPACE_REC709LUMA = 19; + const COLORSPACE_LOG = 21; + const COLORSPACE_CMY = 22; + const VIRTUALPIXELMETHOD_UNDEFINED = 0; + const VIRTUALPIXELMETHOD_BACKGROUND = 1; + const VIRTUALPIXELMETHOD_CONSTANT = 2; + const VIRTUALPIXELMETHOD_EDGE = 4; + const VIRTUALPIXELMETHOD_MIRROR = 5; + const VIRTUALPIXELMETHOD_TILE = 7; + const VIRTUALPIXELMETHOD_TRANSPARENT = 8; + const VIRTUALPIXELMETHOD_MASK = 9; + const VIRTUALPIXELMETHOD_BLACK = 10; + const VIRTUALPIXELMETHOD_GRAY = 11; + const VIRTUALPIXELMETHOD_WHITE = 12; + const VIRTUALPIXELMETHOD_HORIZONTALTILE = 13; + const VIRTUALPIXELMETHOD_VERTICALTILE = 14; + const PREVIEW_UNDEFINED = 0; + const PREVIEW_ROTATE = 1; + const PREVIEW_SHEAR = 2; + const PREVIEW_ROLL = 3; + const PREVIEW_HUE = 4; + const PREVIEW_SATURATION = 5; + const PREVIEW_BRIGHTNESS = 6; + const PREVIEW_GAMMA = 7; + const PREVIEW_SPIFF = 8; + const PREVIEW_DULL = 9; + const PREVIEW_GRAYSCALE = 10; + const PREVIEW_QUANTIZE = 11; + const PREVIEW_DESPECKLE = 12; + const PREVIEW_REDUCENOISE = 13; + const PREVIEW_ADDNOISE = 14; + const PREVIEW_SHARPEN = 15; + const PREVIEW_BLUR = 16; + const PREVIEW_THRESHOLD = 17; + const PREVIEW_EDGEDETECT = 18; + const PREVIEW_SPREAD = 19; + const PREVIEW_SOLARIZE = 20; + const PREVIEW_SHADE = 21; + const PREVIEW_RAISE = 22; + const PREVIEW_SEGMENT = 23; + const PREVIEW_SWIRL = 24; + const PREVIEW_IMPLODE = 25; + const PREVIEW_WAVE = 26; + const PREVIEW_OILPAINT = 27; + const PREVIEW_CHARCOALDRAWING = 28; + const PREVIEW_JPEG = 29; + const RENDERINGINTENT_UNDEFINED = 0; + const RENDERINGINTENT_SATURATION = 1; + const RENDERINGINTENT_PERCEPTUAL = 2; + const RENDERINGINTENT_ABSOLUTE = 3; + const RENDERINGINTENT_RELATIVE = 4; + const INTERLACE_UNDEFINED = 0; + const INTERLACE_NO = 1; + const INTERLACE_LINE = 2; + const INTERLACE_PLANE = 3; + const INTERLACE_PARTITION = 4; + const INTERLACE_GIF = 5; + const INTERLACE_JPEG = 6; + const INTERLACE_PNG = 7; + const FILLRULE_UNDEFINED = 0; + const FILLRULE_EVENODD = 1; + const FILLRULE_NONZERO = 2; + const PATHUNITS_UNDEFINED = 0; + const PATHUNITS_USERSPACE = 1; + const PATHUNITS_USERSPACEONUSE = 2; + const PATHUNITS_OBJECTBOUNDINGBOX = 3; + const LINECAP_UNDEFINED = 0; + const LINECAP_BUTT = 1; + const LINECAP_ROUND = 2; + const LINECAP_SQUARE = 3; + const LINEJOIN_UNDEFINED = 0; + const LINEJOIN_MITER = 1; + const LINEJOIN_ROUND = 2; + const LINEJOIN_BEVEL = 3; + const RESOURCETYPE_UNDEFINED = 0; + const RESOURCETYPE_AREA = 1; + const RESOURCETYPE_DISK = 2; + const RESOURCETYPE_FILE = 3; + const RESOURCETYPE_MAP = 4; + const RESOURCETYPE_MEMORY = 5; + const DISPOSE_UNRECOGNIZED = 0; + const DISPOSE_UNDEFINED = 0; + const DISPOSE_NONE = 1; + const DISPOSE_BACKGROUND = 2; + const DISPOSE_PREVIOUS = 3; + const INTERPOLATE_UNDEFINED = 0; + const INTERPOLATE_AVERAGE = 1; + const INTERPOLATE_BICUBIC = 2; + const INTERPOLATE_BILINEAR = 3; + const INTERPOLATE_FILTER = 4; + const INTERPOLATE_INTEGER = 5; + const INTERPOLATE_MESH = 6; + const INTERPOLATE_NEARESTNEIGHBOR = 7; + const INTERPOLATE_SPLINE = 8; + const LAYERMETHOD_UNDEFINED = 0; + const LAYERMETHOD_COALESCE = 1; + const LAYERMETHOD_COMPAREANY = 2; + const LAYERMETHOD_COMPARECLEAR = 3; + const LAYERMETHOD_COMPAREOVERLAY = 4; + const LAYERMETHOD_DISPOSE = 5; + const LAYERMETHOD_OPTIMIZE = 6; + const LAYERMETHOD_OPTIMIZEPLUS = 8; + const LAYERMETHOD_OPTIMIZETRANS = 9; + const LAYERMETHOD_COMPOSITE = 12; + const LAYERMETHOD_OPTIMIZEIMAGE = 7; + const LAYERMETHOD_REMOVEDUPS = 10; + const LAYERMETHOD_REMOVEZERO = 11; + const ORIENTATION_UNDEFINED = 0; + const ORIENTATION_TOPLEFT = 1; + const ORIENTATION_TOPRIGHT = 2; + const ORIENTATION_BOTTOMRIGHT = 3; + const ORIENTATION_BOTTOMLEFT = 4; + const ORIENTATION_LEFTTOP = 5; + const ORIENTATION_RIGHTTOP = 6; + const ORIENTATION_RIGHTBOTTOM = 7; + const ORIENTATION_LEFTBOTTOM = 8; + const DISTORTION_UNDEFINED = 0; + const DISTORTION_AFFINE = 1; + const DISTORTION_AFFINEPROJECTION = 2; + const DISTORTION_ARC = 9; + const DISTORTION_BILINEAR = 6; + const DISTORTION_PERSPECTIVE = 4; + const DISTORTION_PERSPECTIVEPROJECTION = 5; + const DISTORTION_SCALEROTATETRANSLATE = 3; + const DISTORTION_POLYNOMIAL = 8; + const DISTORTION_POLAR = 10; + const DISTORTION_DEPOLAR = 11; + const DISTORTION_BARREL = 12; + const DISTORTION_BARRELINVERSE = 13; + const DISTORTION_SHEPARDS = 14; + const DISTORTION_SENTINEL = 15; + const LAYERMETHOD_MERGE = 13; + const LAYERMETHOD_FLATTEN = 14; + const LAYERMETHOD_MOSAIC = 15; + const ALPHACHANNEL_ACTIVATE = 1; + const ALPHACHANNEL_DEACTIVATE = 4; + const ALPHACHANNEL_RESET = 7; + const ALPHACHANNEL_SET = 8; + const ALPHACHANNEL_UNDEFINED = 0; + const ALPHACHANNEL_COPY = 3; + const ALPHACHANNEL_EXTRACT = 5; + const ALPHACHANNEL_OPAQUE = 6; + const ALPHACHANNEL_SHAPE = 9; + const ALPHACHANNEL_TRANSPARENT = 10; + const SPARSECOLORMETHOD_UNDEFINED = 0; + const SPARSECOLORMETHOD_BARYCENTRIC = 1; + const SPARSECOLORMETHOD_BILINEAR = 7; + const SPARSECOLORMETHOD_POLYNOMIAL = 8; + const SPARSECOLORMETHOD_SPEPARDS = 14; + const SPARSECOLORMETHOD_VORONOI = 15; + const DITHERMETHOD_UNDEFINED = 0; + const DITHERMETHOD_NO = 1; + const DITHERMETHOD_RIEMERSMA = 2; + const DITHERMETHOD_FLOYDSTEINBERG = 3; + const FUNCTION_UNDEFINED = 0; + const FUNCTION_POLYNOMIAL = 1; + const FUNCTION_SINUSOID = 2; + + + /** + * (PECL imagick 2.0.0)
+ * Removes repeated portions of images to optimize + * @link http://php.net/manual/en/function.imagick-optimizeimagelayers.php + * @return bool &imagick.return.success; + */ + public function optimizeimagelayers () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the maximum bounding region between images + * @link http://php.net/manual/en/function.imagick-compareimagelayers.php + * @param int $method

+ * One of the layer method constants. + *

+ * @return Imagick &imagick.return.success; + */ + public function compareimagelayers ($method) {} + + /** + * (PECL imagick 2.0.0)
+ * Quickly fetch attributes + * @link http://php.net/manual/en/function.imagick-pingimageblob.php + * @param string $image

+ * A string containing the image. + *

+ * @return bool &imagick.return.success; + */ + public function pingimageblob ($image) {} + + /** + * (PECL imagick 2.0.0)
+ * Get basic image attributes in a lightweight manner + * @link http://php.net/manual/en/function.imagick-pingimagefile.php + * @param resource $filehandle

+ * An open filehandle to the image. + *

+ * @param string $fileName [optional]

+ * Optional filename for this image. + *

+ * @return bool &imagick.return.success; + */ + public function pingimagefile ($filehandle, $fileName = null) {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a vertical mirror image + * @link http://php.net/manual/en/function.imagick-transposeimage.php + * @return bool &imagick.return.success; + */ + public function transposeimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a horizontal mirror image + * @link http://php.net/manual/en/function.imagick-transverseimage.php + * @return bool &imagick.return.success; + */ + public function transverseimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Remove edges from the image + * @link http://php.net/manual/en/function.imagick-trimimage.php + * @param float $fuzz

+ * By default target must match a particular pixel color exactly. + * However, in many cases two colors may differ by a small amount. + * The fuzz member of image defines how much tolerance is acceptable + * to consider two colors as the same. This parameter represents the variation + * on the quantum range. + *

+ * @return bool &imagick.return.success; + */ + public function trimimage ($fuzz) {} + + /** + * (PECL imagick 2.0.0)
+ * Applies wave filter to the image + * @link http://php.net/manual/en/function.imagick-waveimage.php + * @param float $amplitude

+ * The amplitude of the wave. + *

+ * @param float $length

+ * The length of the wave. + *

+ * @return bool &imagick.return.success; + */ + public function waveimage ($amplitude, $length) {} + + /** + * (PECL imagick 2.0.0)
+ * Adds vignette filter to the image + * @link http://php.net/manual/en/function.imagick-vignetteimage.php + * @param float $blackPoint

+ * The black point. + *

+ * @param float $whitePoint

+ * The white point + *

+ * @param int $x

+ * X offset of the ellipse + *

+ * @param int $y

+ * Y offset of the ellipse + *

+ * @return bool &imagick.return.success; + */ + public function vignetteimage ($blackPoint, $whitePoint, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Discards all but one of any pixel color + * @link http://php.net/manual/en/function.imagick-uniqueimagecolors.php + * @return bool &imagick.return.success; + */ + public function uniqueimagecolors () {} + + /** + * (PECL imagick 2.0.0)
+ * Return if the image has a matte channel + * @link http://php.net/manual/en/function.imagick-getimagematte.php + * @return bool true on success or false on failure. + */ + public function getimagematte () {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image matte channel + * @link http://php.net/manual/en/function.imagick-setimagematte.php + * @param bool $matte

+ * True activates the matte channel and false disables it. + *

+ * @return bool &imagick.return.success; + */ + public function setimagematte ($matte) {} + + /** + * (PECL imagick 2.0.0)
+ * Adaptively resize image with data dependent triangulation + * @link http://php.net/manual/en/function.imagick-adaptiveresizeimage.php + * @param int $columns

+ * The number of columns in the scaled image. + *

+ * @param int $rows

+ * The number of rows in the scaled image. + *

+ * @param bool $bestfit [optional]

+ * Whether to fit the image inside a bounding box. + *

+ * @return bool &imagick.return.success; + */ + public function adaptiveresizeimage ($columns, $rows, $bestfit = false) {} + + /** + * (PECL imagick 2.0.0)
+ * Simulates a pencil sketch + * @link http://php.net/manual/en/function.imagick-sketchimage.php + * @param float $radius

+ * The radius of the Gaussian, in pixels, not counting the center pixel + *

+ * @param float $sigma

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param float $angle

+ * Apply the effect along this angle. + *

+ * @return bool &imagick.return.success; + */ + public function sketchimage ($radius, $sigma, $angle) {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a 3D effect + * @link http://php.net/manual/en/function.imagick-shadeimage.php + * @param bool $gray

+ * A value other than zero shades the intensity of each pixel. + *

+ * @param float $azimuth

+ * Defines the light source direction. + *

+ * @param float $elevation

+ * Defines the light source direction. + *

+ * @return bool &imagick.return.success; + */ + public function shadeimage ($gray, $azimuth, $elevation) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the size offset + * @link http://php.net/manual/en/function.imagick-getsizeoffset.php + * @return int the size offset associated with the Imagick object. + * &imagick.imagickexception.throw; + */ + public function getsizeoffset () {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the size and offset of the Imagick object + * @link http://php.net/manual/en/function.imagick-setsizeoffset.php + * @param int $columns

+ * The width in pixels. + *

+ * @param int $rows

+ * The height in pixels. + *

+ * @param int $offset

+ * The image offset. + *

+ * @return bool &imagick.return.success; + */ + public function setsizeoffset ($columns, $rows, $offset) {} + + /** + * (PECL imagick 2.0.0)
+ * Adds adaptive blur filter to image + * @link http://php.net/manual/en/function.imagick-adaptiveblurimage.php + * @param float $radius

+ * The radius of the Gaussian, in pixels, not counting the center pixel. + * Provide a value of 0 and the radius will be chosen automagically. + *

+ * @param float $sigma

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param int $channel [optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function adaptiveblurimage ($radius, $sigma, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (PECL imagick 2.0.0)
+ * Enhances the contrast of a color image + * @link http://php.net/manual/en/function.imagick-contraststretchimage.php + * @param float $black_point

+ * The black point. + *

+ * @param float $white_point

+ * The white point. + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Imagick::CHANNEL_ALL. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function contraststretchimage ($black_point, $white_point, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Adaptively sharpen the image + * @link http://php.net/manual/en/function.imagick-adaptivesharpenimage.php + * @param float $radius

+ * The radius of the Gaussian, in pixels, not counting the center pixel. Use 0 for auto-select. + *

+ * @param float $sigma

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param int $channel [optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function adaptivesharpenimage ($radius, $sigma, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a high-contrast, two-color image + * @link http://php.net/manual/en/function.imagick-randomthresholdimage.php + * @param float $low

+ * The low point + *

+ * @param float $high

+ * The high point + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function randomthresholdimage ($low, $high, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * @param $xRounding + * @param $yRounding + * @param $strokeWidth [optional] + * @param $displace [optional] + * @param $sizeCorrection [optional] + */ + public function roundcornersimage ($xRounding, $yRounding, $strokeWidth, $displace, $sizeCorrection) {} + + /** + * (PECL imagick 2.0.0)
+ * Rounds image corners + * @link http://php.net/manual/en/function.imagick-roundcorners.php + * @param float $x_rounding

+ * x rounding + *

+ * @param float $y_rounding

+ * y rounding + *

+ * @param float $stroke_width [optional]

+ * stroke width + *

+ * @param float $displace [optional]

+ * image displace + *

+ * @param float $size_correction [optional]

+ * size correction + *

+ * @return bool &imagick.return.success; + */ + public function roundcorners ($x_rounding, $y_rounding, $stroke_width = 10, $displace = 5, $size_correction = -6) {} + + /** + * (PECL imagick 2.0.0)
+ * Set the iterator position + * @link http://php.net/manual/en/function.imagick-setiteratorindex.php + * @param int $index

+ * The position to set the iterator to + *

+ * @return bool &imagick.return.success; + */ + public function setiteratorindex ($index) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the index of the current active image + * @link http://php.net/manual/en/function.imagick-getiteratorindex.php + * @return int an integer containing the index of the image in the stack. + * &imagick.imagickexception.throw; + */ + public function getiteratorindex () {} + + /** + * (PECL imagick 2.0.0)
+ * Convenience method for setting crop size and the image geometry + * @link http://php.net/manual/en/function.imagick-transformimage.php + * @param string $crop

+ * A crop geometry string. This geometry defines a subregion of the image to crop. + *

+ * @param string $geometry

+ * An image geometry string. This geometry defines the final size of the image. + *

+ * @return Imagick &imagick.return.success; + */ + public function transformimage ($crop, $geometry) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image opacity level + * @link http://php.net/manual/en/function.imagick-setimageopacity.php + * @param float $opacity

+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully + * transparent. + *

+ * @return bool &imagick.return.success; + */ + public function setimageopacity ($opacity) {} + + /** + * (PECL imagick 2.2.2)
+ * Performs an ordered dither + * @link http://php.net/manual/en/function.imagick-orderedposterizeimage.php + * @param string $threshold_map

+ * A string containing the name of the threshold dither map to use + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function orderedposterizeimage ($threshold_map, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Simulates a Polaroid picture + * @link http://php.net/manual/en/function.imagick-polaroidimage.php + * @param ImagickDraw $properties

+ * The polaroid properties + *

+ * @param float $angle

+ * The polaroid angle + *

+ * @return bool &imagick.return.success; + */ + public function polaroidimage (ImagickDraw $properties, $angle) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the named image property + * @link http://php.net/manual/en/function.imagick-getimageproperty.php + * @param string $name

+ * name of the property (for example Exif:DateTime) + *

+ * @return string a string containing the image property, false if a + * property with the given name does not exist. + */ + public function getimageproperty ($name) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets an image property + * @link http://php.net/manual/en/function.imagick-setimageproperty.php + * @param string $name + * @param string $value + * @return bool &imagick.return.success; + */ + public function setimageproperty ($name, $value) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image interpolate pixel method + * @link http://php.net/manual/en/function.imagick-setimageinterpolatemethod.php + * @param int $method

+ * The method is one of the Imagick::INTERPOLATE_* constants + *

+ * @return bool &imagick.return.success; + */ + public function setimageinterpolatemethod ($method) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the interpolation method + * @link http://php.net/manual/en/function.imagick-getimageinterpolatemethod.php + * @return int the interpolate method on success. + * &imagick.imagickexception.throw; + */ + public function getimageinterpolatemethod () {} + + /** + * (PECL imagick 2.0.0)
+ * Stretches with saturation the image intensity + * @link http://php.net/manual/en/function.imagick-linearstretchimage.php + * @param float $blackPoint

+ * The image black point + *

+ * @param float $whitePoint

+ * The image white point + *

+ * @return bool &imagick.return.success; + */ + public function linearstretchimage ($blackPoint, $whitePoint) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the image length in bytes + * @link http://php.net/manual/en/function.imagick-getimagelength.php + * @return int an int containing the current image size. + */ + public function getimagelength () {} + + /** + * (No version information available, might only be in SVN)
+ * Set image size + * @link http://php.net/manual/en/function.imagick-extentimage.php + * @param int $width

+ * The new width + *

+ * @param int $height

+ * The new height + *

+ * @param int $x

+ * X position for the new size + *

+ * @param int $y

+ * Y position for the new size + *

+ * @return bool &imagick.return.success; + */ + public function extentimage ($width, $height, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image orientation + * @link http://php.net/manual/en/function.imagick-getimageorientation.php + * @return int an int on success. + * &imagick.imagickexception.throw; + */ + public function getimageorientation () {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image orientation + * @link http://php.net/manual/en/function.imagick-setimageorientation.php + * @param int $orientation

+ * One of the orientation constants + *

+ * @return bool &imagick.return.success; + */ + public function setimageorientation ($orientation) {} + + /** + * (PECL imagick 2.1.0)
+ * Changes the color value of any pixel that matches target + * @link http://php.net/manual/en/function.imagick-paintfloodfillimage.php + * @param mixed $fill

+ * ImagickPixel object or a string containing the fill color + *

+ * @param float $fuzz

+ * The amount of fuzz. For example, set fuzz to 10 and the color red at + * intensities of 100 and 102 respectively are now interpreted as the + * same color for the purposes of the floodfill. + *

+ * @param mixed $bordercolor

+ * ImagickPixel object or a string containing the border color + *

+ * @param int $x

+ * X start position of the floodfill + *

+ * @param int $y

+ * Y start position of the floodfill + *

+ * @param int $channel [optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function paintfloodfillimage ($fill, $fuzz, $bordercolor, $x, $y, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Replaces colors in the image + * @link http://php.net/manual/en/function.imagick-clutimage.php + * @param Imagick $lookup_table

+ * Imagick object containing the color lookup table + *

+ * @param float $channel [optional]

+ * The Channeltype + * constant. When not supplied, default channels are replaced. + *

+ * @return bool &imagick.return.success; + */ + public function clutimage (Imagick $lookup_table, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the image properties + * @link http://php.net/manual/en/function.imagick-getimageproperties.php + * @param string $pattern [optional]

+ * The pattern for property names. + *

+ * @param bool $only_names [optional]

+ * Whether to return only property names. If false then also the values are returned + *

+ * @return array an array containing the image properties or property names. + */ + public function getimageproperties ($pattern = "*", $only_names = true) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the image profiles + * @link http://php.net/manual/en/function.imagick-getimageprofiles.php + * @param string $pattern [optional]

+ * The pattern for profile names. + *

+ * @param bool $only_names [optional]

+ * Whether to return only profile names. If false then values are returned as well + *

+ * @return array an array containing the image profiles or profile names. + */ + public function getimageprofiles ($pattern = "*", $only_names = true) {} + + /** + * (PECL imagick 2.0.1)
+ * Distorts an image using various distortion methods + * @link http://php.net/manual/en/function.imagick-distortimage.php + * @param int $method

+ * The method of image distortion. See distortion constants + *

+ * @param array $arguments

+ * The arguments for this distortion method + *

+ * @param bool $bestfit

+ * Attempt to resize destination to fit distorted source + *

+ * @return bool &imagick.return.success; + */ + public function distortimage ($method, array $arguments, $bestfit) {} + + /** + * (No version information available, might only be in SVN)
+ * Writes an image to a filehandle + * @link http://php.net/manual/en/function.imagick-writeimagefile.php + * @param resource $filehandle

+ * Filehandle where to write the image + *

+ * @return bool &imagick.return.success; + */ + public function writeimagefile ($filehandle) {} + + /** + * (No version information available, might only be in SVN)
+ * Writes frames to a filehandle + * @link http://php.net/manual/en/function.imagick-writeimagesfile.php + * @param resource $filehandle

+ * Filehandle where to write the images + *

+ * @return bool &imagick.return.success; + */ + public function writeimagesfile ($filehandle) {} + + /** + * (No version information available, might only be in SVN)
+ * Reset image page + * @link http://php.net/manual/en/function.imagick-resetimagepage.php + * @param string $page

+ * The page definition. For example 7168x5147+0+0 + *

+ * @return bool &imagick.return.success; + */ + public function resetimagepage ($page) {} + + /** + * (No version information available, might only be in SVN)
+ * Sets image clip mask + * @link http://php.net/manual/en/function.imagick-setimageclipmask.php + * @param Imagick $clip_mask

+ * The Imagick object containing the clip mask + *

+ * @return bool &imagick.return.success; + */ + public function setimageclipmask (Imagick $clip_mask) {} + + /** + * (No version information available, might only be in SVN)
+ * Gets image clip mask + * @link http://php.net/manual/en/function.imagick-getimageclipmask.php + * @return Imagick an Imagick object containing the clip mask. + * &imagick.imagickexception.throw; + */ + public function getimageclipmask () {} + + /** + * (No version information available, might only be in SVN)
+ * Animates an image or images + * @link http://php.net/manual/en/function.imagick-animateimages.php + * @param string $x_server

+ * X server address + *

+ * @return bool &imagick.return.success; + */ + public function animateimages ($x_server) {} + + /** + * (No version information available, might only be in SVN)
+ * Recolors image + * @link http://php.net/manual/en/function.imagick-recolorimage.php + * @param array $matrix

+ * The matrix containing the color values + *

+ * @return bool &imagick.return.success; + */ + public function recolorimage (array $matrix) {} + + /** + * (PECL imagick 2.1.0)
+ * Sets font + * @link http://php.net/manual/en/function.imagick-setfont.php + * @param string $font

+ * Font name or a filename + *

+ * @return bool &imagick.return.success; + */ + public function setfont ($font) {} + + /** + * (PECL imagick 2.1.0)
+ * Gets font + * @link http://php.net/manual/en/function.imagick-getfont.php + * @return string the string containing the font name or false if not font is set. + */ + public function getfont () {} + + /** + * (PECL imagick 2.1.0)
+ * Sets point size + * @link http://php.net/manual/en/function.imagick-setpointsize.php + * @param float $point_size

+ * Point size + *

+ * @return bool &imagick.return.success; + */ + public function setpointsize ($point_size) {} + + /** + * (No version information available, might only be in SVN)
+ * Gets point size + * @link http://php.net/manual/en/function.imagick-getpointsize.php + * @return float a &float; containing the point size. + */ + public function getpointsize () {} + + /** + * (PECL imagick 2.1.0)
+ * Merges image layers + * @link http://php.net/manual/en/function.imagick-mergeimagelayers.php + * @param int $layer_method

+ * One of the Imagick::LAYERMETHOD_* constants + *

+ * @return bool &imagick.return.success; + */ + public function mergeimagelayers ($layer_method) {} + + /** + * (No version information available, might only be in SVN)
+ * Sets image alpha channel + * @link http://php.net/manual/en/function.imagick-setimagealphachannel.php + * @param int $mode

+ * One of the Imagick::ALPHACHANNEL_* constants + *

+ * @return bool &imagick.return.success; + */ + public function setimagealphachannel ($mode) {} + + /** + * (No version information available, might only be in SVN)
+ * Changes the color value of any pixel that matches target + * @link http://php.net/manual/en/function.imagick-floodfillpaintimage.php + * @param mixed $fill

+ * ImagickPixel object or a string containing the fill color + *

+ * @param float $fuzz

+ * &imagick.parameter.fuzz; + *

+ * @param mixed $target

+ * ImagickPixel object or a string containing the target color to paint + *

+ * @param int $x

+ * X start position of the floodfill + *

+ * @param int $y

+ * Y start position of the floodfill + *

+ * @param bool $invert

+ * If true paints any pixel that does not match the target color. + *

+ * @param int $channel [optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function floodfillpaintimage ($fill, $fuzz, $target, $x, $y, $invert, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (No version information available, might only be in SVN)
+ * Changes the color value of any pixel that matches target + * @link http://php.net/manual/en/function.imagick-opaquepaintimage.php + * @param mixed $target

+ * ImagickPixel object or a string containing the color to change + *

+ * @param mixed $fill

+ * The replacement color + *

+ * @param float $fuzz

+ * &imagick.parameter.fuzz; + *

+ * @param bool $invert

+ * If true paints any pixel that does not match the target color. + *

+ * @param int $channel [optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function opaquepaintimage ($target, $fill, $fuzz, $invert, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (No version information available, might only be in SVN)
+ * Paints pixels transparent + * @link http://php.net/manual/en/function.imagick-transparentpaintimage.php + * @param mixed $target

+ * The target color to paint + *

+ * @param float $alpha

+ * &imagick.parameter.alpha; + *

+ * @param float $fuzz

+ * &imagick.parameter.fuzz; + *

+ * @param bool $invert

+ * If true paints any pixel that does not match the target color. + *

+ * @return bool &imagick.return.success; + */ + public function transparentpaintimage ($target, $alpha, $fuzz, $invert) {} + + /** + * (No version information available, might only be in SVN)
+ * Animates an image or images + * @link http://php.net/manual/en/function.imagick-liquidrescaleimage.php + * @param int $width

+ * The width of the target size + *

+ * @param int $height

+ * The height of the target size + *

+ * @param float $delta_x

+ * How much the seam can traverse on x-axis. + * Passing 0 causes the seams to be straight. + *

+ * @param float $rigidity

+ * Introduces a bias for non-straight seams. This parameter is + * typically 0. + *

+ * @return bool &imagick.return.success; + */ + public function liquidrescaleimage ($width, $height, $delta_x, $rigidity) {} + + /** + * (No version information available, might only be in SVN)
+ * Enciphers an image + * @link http://php.net/manual/en/function.imagick-encipherimage.php + * @param string $passphrase

+ * The passphrase + *

+ * @return bool &imagick.return.success; + */ + public function encipherimage ($passphrase) {} + + /** + * (No version information available, might only be in SVN)
+ * Deciphers an image + * @link http://php.net/manual/en/function.imagick-decipherimage.php + * @param string $passphrase

+ * The passphrase + *

+ * @return bool &imagick.return.success; + */ + public function decipherimage ($passphrase) {} + + /** + * (No version information available, might only be in SVN)
+ * Sets the gravity + * @link http://php.net/manual/en/function.imagick-setgravity.php + * @param int $gravity

+ * The gravity property. Refer to the list of + * gravity constants. + *

+ * @return bool + */ + public function setgravity ($gravity) {} + + /** + * (No version information available, might only be in SVN)
+ * Gets the gravity + * @link http://php.net/manual/en/function.imagick-getgravity.php + * @return int the gravity property. Refer to the list of + * gravity constants. + */ + public function getgravity () {} + + /** + * (PECL imagick 2.2.1)
+ * Gets channel range + * @link http://php.net/manual/en/function.imagick-getimagechannelrange.php + * @param int $channel

+ * &imagick.parameter.channel; + *

+ * @return array an array containing minima and maxima values of the channel(s). + */ + public function getimagechannelrange ($channel) {} + + /** + * (No version information available, might only be in SVN)
+ * Gets the image alpha channel + * @link http://php.net/manual/en/function.imagick-getimagealphachannel.php + * @return int a constant defining the current alpha channel value. Refer to this + * list of alpha channel constants. + */ + public function getimagealphachannel () {} + + /** + * (No version information available, might only be in SVN)
+ * Gets channel distortions + * @link http://php.net/manual/en/function.imagick-getimagechanneldistortions.php + * @param Imagick $reference

+ * Imagick object containing the reference image + *

+ * @param int $metric

+ * Refer to this list of metric type constants. + *

+ * @param int $channel [optional]

+ * &imagick.parameter.channel; + *

+ * @return float a double describing the channel distortion. + */ + public function getimagechanneldistortions (Imagick $reference, $metric, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (No version information available, might only be in SVN)
+ * Sets the image gravity + * @link http://php.net/manual/en/function.imagick-setimagegravity.php + * @param int $gravity

+ * The gravity property. Refer to the list of + * gravity constants. + *

+ * @return bool + */ + public function setimagegravity ($gravity) {} + + /** + * (No version information available, might only be in SVN)
+ * Gets the image gravity + * @link http://php.net/manual/en/function.imagick-getimagegravity.php + * @return int the images gravity property. Refer to the list of + * gravity constants. + */ + public function getimagegravity () {} + + /** + * (No version information available, might only be in SVN)
+ * Imports image pixels + * @link http://php.net/manual/en/imagick.importimagepixels.php + * @param int $x

+ * The image x position + *

+ * @param int $y

+ * The image y position + *

+ * @param int $width

+ * The image width + *

+ * @param int $height

+ * The image height + *

+ * @param string $map

+ * Map of pixel ordering as a string. This can be for example RGB. + * The value can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent), + * O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad. + *

+ * @param int $storage

+ * The pixel storage method. + * Refer to this list of pixel constants. + *

+ * @param array $pixels

+ * The array of pixels + *

+ * @return bool &imagick.return.success; + */ + public function importimagepixels ($x, $y, $width, $height, $map, $storage, array $pixels) {} + + /** + * (No version information available, might only be in SVN)
+ * Removes skew from the image + * @link http://php.net/manual/en/imagick.deskewimage.php + * @param float $threshold

+ * Deskew threshold + *

+ * @return bool + */ + public function deskewimage ($threshold) {} + + /** + * (No version information available, might only be in SVN)
+ * Segments an image + * @link http://php.net/manual/en/imagick.segmentimage.php + * @param int $COLORSPACE

+ * One of the COLORSPACE constants. + *

+ * @param float $cluster_threshold

+ * A percentage describing minimum number of pixels + * contained in hexedra before it is considered valid. + *

+ * @param float $smooth_threshold

+ * Eliminates noise from the histogram. + *

+ * @param bool $verbose [optional]

+ * Whether to output detailed information about recognised classes. + *

+ * @return bool + */ + public function segmentimage ($COLORSPACE, $cluster_threshold, $smooth_threshold, $verbose = false) {} + + /** + * (No version information available, might only be in SVN)
+ * Interpolates colors + * @link http://php.net/manual/en/imagick.sparsecolorimage.php + * @param int $SPARSE_METHOD

+ * Refer to this list of sparse method constants + *

+ * @param array $arguments

+ * An array containing the coordinates. + * The array is in format array(1,1, 2,45) + *

+ * @param int $channel [optional] + * @return bool &imagick.return.success; + */ + public function sparsecolorimage ($SPARSE_METHOD, array $arguments, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (No version information available, might only be in SVN)
+ * Remaps image colors + * @link http://php.net/manual/en/imagick.remapimage.php + * @param Imagick $replacement

+ * An Imagick object containing the replacement colors + *

+ * @param int $DITHER

+ * Refer to this list of dither method constants + *

+ * @return bool &imagick.return.success; + */ + public function remapimage (Imagick $replacement, $DITHER) {} + + /** + * (No version information available, might only be in SVN)
+ * Exports raw image pixels + * @link http://php.net/manual/en/imagick.exportimagepixels.php + * @param int $x

+ * X-coordinate of the exported area + *

+ * @param int $y

+ * Y-coordinate of the exported area + *

+ * @param int $width

+ * Width of the exported aread + *

+ * @param int $height

+ * Height of the exported area + *

+ * @param string $map

+ * Ordering of the exported pixels. For example "RGB". + * Valid characters for the map are R, G, B, A, O, C, Y, M, K, I and P. + *

+ * @param int $STORAGE

+ * Refer to this list of pixel type constants + *

+ * @return array an array containing the pixels values. + */ + public function exportimagepixels ($x, $y, $width, $height, $map, $STORAGE) {} + + /** + * (No version information available, might only be in SVN)
+ * The getImageChannelKurtosis purpose + * @link http://php.net/manual/en/imagick.getimagechannelkurtosis.php + * @param int $channel [optional]

+ * &imagick.parameter.channel; + *

+ * @return array an array with kurtosis and skewness + * members. + */ + public function getimagechannelkurtosis ($channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (No version information available, might only be in SVN)
+ * Applies a function on the image + * @link http://php.net/manual/en/imagick.functionimage.php + * @param int $function

+ * Refer to this list of function constants + *

+ * @param array $arguments

+ * Array of arguments to pass to this function. + *

+ * @param int $channel [optional] + * @return bool &imagick.return.success; + */ + public function functionimage ($function, array $arguments, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * @param $COLORSPACE + */ + public function transformimagecolorspace ($COLORSPACE) {} + + /** + * (No version information available, might only be in SVN)
+ * Replaces colors in the image + * @link http://php.net/manual/en/imagick.haldclutimage.php + * @param Imagick $clut

+ * Imagick object containing the Hald lookup image. + *

+ * @param int $channel [optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function haldclutimage (Imagick $clut, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (No version information available, might only be in SVN)
+ * Get image artifact + * @link http://php.net/manual/en/function.imagick-getimageartifact.php + * @param string $artifact

+ * The name of the artifact + *

+ * @return string the artifact value on success. + * &imagick.imagickexception.throw; + */ + public function getimageartifact ($artifact) {} + + /** + * (No version information available, might only be in SVN)
+ * Set image artifact + * @link http://php.net/manual/en/function.imagick-setimageartifact.php + * @param string $artifact

+ * The name of the artifact + *

+ * @param string $value

+ * The value of the artifact + *

+ * @return bool &imagick.return.success; + */ + public function setimageartifact ($artifact, $value) {} + + /** + * (No version information available, might only be in SVN)
+ * Delete image artifact + * @link http://php.net/manual/en/function.imagick-deleteimageartifact.php + * @param string $artifact

+ * The name of the artifact + *

+ * @return bool &imagick.return.success; + */ + public function deleteimageartifact ($artifact) {} + + /** + * (PECL imagick 0.9.10-0.9.9)
+ * Gets the colorspace + * @link http://php.net/manual/en/function.imagick-getcolorspace.php + * @return int an integer which can be compared against COLORSPACE constants. + */ + public function getcolorspace () {} + + /** + * (No version information available, might only be in SVN)
+ * Set colorspace + * @link http://php.net/manual/en/function.imagick-setcolorspace.php + * @param int $COLORSPACE

+ * One of the COLORSPACE constants + *

+ * @return bool &imagick.return.success; + */ + public function setcolorspace ($COLORSPACE) {} + + /** + * (PECL imagick 2.0.0)
+ * The Imagick constructor + * @link http://php.net/manual/en/function.imagick-construct.php + * @param mixed $files [optional]

+ * The path to an image to load or array of paths + *

+ */ + public function __construct ($files = null) {} + + public function __tostring () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns a MagickPixelIterator + * @link http://php.net/manual/en/function.imagick-getpixeliterator.php + * @return ImagickPixelIterator an ImagickPixelIterator on success. + * &imagick.imagickexception.throw; + */ + public function getpixeliterator () {} + + /** + * (PECL imagick 2.0.0)
+ * Get an ImagickPixelIterator for an image section + * @link http://php.net/manual/en/function.imagick-getpixelregioniterator.php + * @param int $x

+ * The x-coordinate of the region. + *

+ * @param int $y

+ * The y-coordinate of the region. + *

+ * @param int $columns

+ * The width of the region. + *

+ * @param int $rows

+ * The height of the region. + *

+ * @return ImagickPixelIterator an ImagickPixelIterator for an image section. + * &imagick.imagickexception.throw; + */ + public function getpixelregioniterator ($x, $y, $columns, $rows) {} + + /** + * (PECL imagick 0.9.0-0.9.9)
+ * Reads image from filename + * @link http://php.net/manual/en/function.imagick-readimage.php + * @param string $filename + * @return bool &imagick.return.success; + */ + public function readimage ($filename) {} + + /** + * @param $filenames + */ + public function readimages ($filenames) {} + + /** + * (PECL imagick 2.0.0)
+ * Reads image from a binary string + * @link http://php.net/manual/en/function.imagick-readimageblob.php + * @param string $image + * @param string $filename [optional] + * @return bool &imagick.return.success; + */ + public function readimageblob ($image, $filename = null) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the format of a particular image + * @link http://php.net/manual/en/function.imagick-setimageformat.php + * @param string $format

+ * String presentation of the image format. Format support + * depends on the ImageMagick installation. + *

+ * @return bool &imagick.return.success; + */ + public function setimageformat ($format) {} + + /** + * (PECL imagick 2.0.0)
+ * Scales the size of an image + * @link http://php.net/manual/en/function.imagick-scaleimage.php + * @param int $cols + * @param int $rows + * @param bool $bestfit [optional] + * @return bool &imagick.return.success; + */ + public function scaleimage ($cols, $rows, $bestfit = false) {} + + /** + * (PECL imagick 0.9.0-0.9.9)
+ * Writes an image to the specified filename + * @link http://php.net/manual/en/function.imagick-writeimage.php + * @param string $filename [optional] + * @return bool &imagick.return.success; + */ + public function writeimage ($filename = null) {} + + /** + * (PECL imagick 0.9.0-0.9.9)
+ * Writes an image or image sequence + * @link http://php.net/manual/en/function.imagick-writeimages.php + * @param string $filename + * @param bool $adjoin + * @return bool &imagick.return.success; + */ + public function writeimages ($filename, $adjoin) {} + + /** + * (PECL imagick 2.0.0)
+ * Adds blur filter to image + * @link http://php.net/manual/en/function.imagick-blurimage.php + * @param float $radius

+ * Blur radius + *

+ * @param float $sigma

+ * Standard deviation + *

+ * @param int $channel [optional]

+ * The Channeltype + * constant. When not supplied, all channels are blurred. + *

+ * @return bool &imagick.return.success; + */ + public function blurimage ($radius, $sigma, $channel = null) {} + + /** + * (PECL imagick 2.0.0)
+ * Changes the size of an image + * @link http://php.net/manual/en/function.imagick-thumbnailimage.php + * @param int $columns

+ * Image width + *

+ * @param int $rows

+ * Image height + *

+ * @param bool $bestfit [optional]

+ * Whether to force maximum values + *

+ * @param bool $fill [optional] + * @return bool &imagick.return.success; + */ + public function thumbnailimage ($columns, $rows, $bestfit = false, $fill = false) {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a crop thumbnail + * @link http://php.net/manual/en/function.imagick-cropthumbnailimage.php + * @param int $width

+ * The width of the thumbnail + *

+ * @param int $height

+ * The Height of the thumbnail + *

+ * @return bool &imagick.return.success; + */ + public function cropthumbnailimage ($width, $height) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the filename of a particular image in a sequence + * @link http://php.net/manual/en/function.imagick-getimagefilename.php + * @return string a string with the filename of the image. + * &imagick.imagickexception.throw; + */ + public function getimagefilename () {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the filename of a particular image + * @link http://php.net/manual/en/function.imagick-setimagefilename.php + * @param string $filename + * @return bool &imagick.return.success; + */ + public function setimagefilename ($filename) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the format of a particular image in a sequence + * @link http://php.net/manual/en/function.imagick-getimageformat.php + * @return string a string containing the image format on success. + * &imagick.imagickexception.throw; + */ + public function getimageformat () {} + + public function getimagemimetype () {} + + /** + * (PECL imagick 2.0.0)
+ * Removes an image from the image list + * @link http://php.net/manual/en/function.imagick-removeimage.php + * @return bool &imagick.return.success; + */ + public function removeimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Destroys the Imagick object + * @link http://php.net/manual/en/function.imagick-destroy.php + * @return bool &imagick.return.success; + */ + public function destroy () {} + + /** + * (PECL imagick 2.0.0)
+ * Clears all resources associated to Imagick object + * @link http://php.net/manual/en/function.imagick-clear.php + * @return bool &imagick.return.success; + */ + public function clear () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the image length in bytes + * @link http://php.net/manual/en/function.imagick-getimagesize.php + * @return int an int containing the current image size. + */ + public function getimagesize () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the image sequence as a blob + * @link http://php.net/manual/en/function.imagick-getimageblob.php + * @return string a string containing the image. + * &imagick.imagickexception.throw; + */ + public function getimageblob () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns all image sequences as a blob + * @link http://php.net/manual/en/function.imagick-getimagesblob.php + * @return string a string containing the images. On failure, throws + * ImagickException. + */ + public function getimagesblob () {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the Imagick iterator to the first image + * @link http://php.net/manual/en/function.imagick-setfirstiterator.php + * @return bool &imagick.return.success; + */ + public function setfirstiterator () {} + + /** + * (PECL imagick 2.0.1)
+ * Sets the Imagick iterator to the last image + * @link http://php.net/manual/en/function.imagick-setlastiterator.php + * @return bool &imagick.return.success; + */ + public function setlastiterator () {} + + public function resetiterator () {} + + /** + * (PECL imagick 2.0.0)
+ * Move to the previous image in the object + * @link http://php.net/manual/en/function.imagick-previousimage.php + * @return bool &imagick.return.success; + */ + public function previousimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Moves to the next image + * @link http://php.net/manual/en/function.imagick-nextimage.php + * @return bool &imagick.return.success; + */ + public function nextimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Checks if the object has a previous image + * @link http://php.net/manual/en/function.imagick-haspreviousimage.php + * @return bool true if the object has more images when traversing the list in the + * reverse direction, returns false if there are none. + */ + public function haspreviousimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Checks if the object has more images + * @link http://php.net/manual/en/function.imagick-hasnextimage.php + * @return bool true if the object has more images when traversing the list in the + * forward direction, returns false if there are none. + */ + public function hasnextimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Set the iterator position + * @link http://php.net/manual/en/function.imagick-setimageindex.php + * @param int $index

+ * The position to set the iterator to + *

+ * @return bool &imagick.return.success; + */ + public function setimageindex ($index) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the index of the current active image + * @link http://php.net/manual/en/function.imagick-getimageindex.php + * @return int an integer containing the index of the image in the stack. + * &imagick.imagickexception.throw; + */ + public function getimageindex () {} + + /** + * (PECL imagick 2.0.0)
+ * Adds a comment to your image + * @link http://php.net/manual/en/function.imagick-commentimage.php + * @param string $comment

+ * The comment to add + *

+ * @return bool &imagick.return.success; + */ + public function commentimage ($comment) {} + + /** + * (PECL imagick 2.0.0)
+ * Extracts a region of the image + * @link http://php.net/manual/en/function.imagick-cropimage.php + * @param int $width

+ * The width of the crop + *

+ * @param int $height

+ * The height of the crop + *

+ * @param int $x

+ * The X coordinate of the cropped region's top left corner + *

+ * @param int $y

+ * The Y coordinate of the cropped region's top left corner + *

+ * @return bool &imagick.return.success; + */ + public function cropimage ($width, $height, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Adds a label to an image + * @link http://php.net/manual/en/function.imagick-labelimage.php + * @param string $label

+ * The label to add + *

+ * @return bool &imagick.return.success; + */ + public function labelimage ($label) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the width and height as an associative array + * @link http://php.net/manual/en/function.imagick-getimagegeometry.php + * @return array an array with the width/height of the image. + * &imagick.imagickexception.throw; + */ + public function getimagegeometry () {} + + /** + * (PECL imagick 2.0.0)
+ * Renders the ImagickDraw object on the current image + * @link http://php.net/manual/en/function.imagick-drawimage.php + * @param ImagickDraw $draw

+ * The drawing operations to render on the image. + *

+ * @return bool &imagick.return.success; + */ + public function drawimage (ImagickDraw $draw) {} + + /** + * (No version information available, might only be in SVN)
+ * Sets the image compression quality + * @link http://php.net/manual/en/function.imagick-setimagecompressionquality.php + * @param int $quality

+ * The image compression quality as an integer + *

+ * @return bool &imagick.return.success; + */ + public function setimagecompressionquality ($quality) {} + + /** + * (PECL imagick 2.2.2)
+ * Gets the current image's compression quality + * @link http://php.net/manual/en/function.imagick-getimagecompressionquality.php + * @return int integer describing the images compression quality + */ + public function getimagecompressionquality () {} + + /** + * (PECL imagick 2.0.0)
+ * Annotates an image with text + * @link http://php.net/manual/en/function.imagick-annotateimage.php + * @param ImagickDraw $draw_settings

+ * The ImagickDraw object that contains settings for drawing the text + *

+ * @param float $x

+ * Horizontal offset in pixels to the left of text + *

+ * @param float $y

+ * Vertical offset in pixels to the baseline of text + *

+ * @param float $angle

+ * The angle at which to write the text + *

+ * @param string $text

+ * The string to draw + *

+ * @return bool &imagick.return.success; + */ + public function annotateimage (ImagickDraw $draw_settings, $x, $y, $angle, $text) {} + + /** + * (PECL imagick 2.0.0)
+ * Composite one image onto another + * @link http://php.net/manual/en/function.imagick-compositeimage.php + * @param Imagick $composite_object

+ * Imagick object which holds the composite image + *

+ * @param int $composite + * @param int $x

+ * The column offset of the composited image + *

+ * @param int $y

+ * The row offset of the composited image + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function compositeimage (Imagick $composite_object, $composite, $x, $y, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Control the brightness, saturation, and hue + * @link http://php.net/manual/en/function.imagick-modulateimage.php + * @param float $brightness + * @param float $saturation + * @param float $hue + * @return bool &imagick.return.success; + */ + public function modulateimage ($brightness, $saturation, $hue) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the number of unique colors in the image + * @link http://php.net/manual/en/function.imagick-getimagecolors.php + * @return int &imagick.return.success; + */ + public function getimagecolors () {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a composite image + * @link http://php.net/manual/en/function.imagick-montageimage.php + * @param ImagickDraw $draw

+ * The font name, size, and color are obtained from this object. + *

+ * @param string $tile_geometry

+ * The number of tiles per row and page (e.g. 6x4+0+0). + *

+ * @param string $thumbnail_geometry

+ * Preferred image size and border size of each thumbnail + * (e.g. 120x120+4+3>). + *

+ * @param int $mode

+ * Thumbnail framing mode, see Montage Mode constants. + *

+ * @param string $frame

+ * Surround the image with an ornamental border (e.g. 15x15+3+3). The + * frame color is that of the thumbnail's matte color. + *

+ * @return Imagick &imagick.return.success; + */ + public function montageimage (ImagickDraw $draw, $tile_geometry, $thumbnail_geometry, $mode, $frame) {} + + /** + * (PECL imagick 2.0.0)
+ * Identifies an image and fetches attributes + * @link http://php.net/manual/en/function.imagick-identifyimage.php + * @param bool $appendRawOutput [optional] + * @return array Identifies an image and returns the attributes. Attributes include + * the image width, height, size, and others. + * &imagick.imagickexception.throw; + */ + public function identifyimage ($appendRawOutput = false) {} + + /** + * (PECL imagick 2.0.0)
+ * Changes the value of individual pixels based on a threshold + * @link http://php.net/manual/en/function.imagick-thresholdimage.php + * @param float $threshold + * @param int $channel [optional] + * @return bool &imagick.return.success; + */ + public function thresholdimage ($threshold, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Selects a threshold for each pixel based on a range of intensity + * @link http://php.net/manual/en/function.imagick-adaptivethresholdimage.php + * @param int $width

+ * Width of the local neighborhood. + *

+ * @param int $height

+ * Height of the local neighborhood. + *

+ * @param int $offset

+ * The mean offset + *

+ * @return bool &imagick.return.success; + */ + public function adaptivethresholdimage ($width, $height, $offset) {} + + /** + * (PECL imagick 2.0.0)
+ * Forces all pixels below the threshold into black + * @link http://php.net/manual/en/function.imagick-blackthresholdimage.php + * @param mixed $threshold

+ * The threshold below which everything turns black + *

+ * @return bool &imagick.return.success; + */ + public function blackthresholdimage ($threshold) {} + + /** + * (PECL imagick 2.0.0)
+ * Force all pixels above the threshold into white + * @link http://php.net/manual/en/function.imagick-whitethresholdimage.php + * @param mixed $threshold + * @return bool &imagick.return.success; + */ + public function whitethresholdimage ($threshold) {} + + /** + * (PECL imagick 2.0.0)
+ * Append a set of images + * @link http://php.net/manual/en/function.imagick-appendimages.php + * @param bool $stack [optional]

+ * Whether to stack the images vertically. + * By default (or if false is specified) images are stacked left-to-right. + * If stack is true, images are stacked top-to-bottom. + *

+ * @return Imagick Imagick instance on success. + * &imagick.imagickexception.throw; + */ + public function appendimages ($stack = false) {} + + /** + * (PECL imagick 2.0.0)
+ * Simulates a charcoal drawing + * @link http://php.net/manual/en/function.imagick-charcoalimage.php + * @param float $radius

+ * The radius of the Gaussian, in pixels, not counting the center pixel + *

+ * @param float $sigma

+ * The standard deviation of the Gaussian, in pixels + *

+ * @return bool &imagick.return.success; + */ + public function charcoalimage ($radius, $sigma) {} + + /** + * (PECL imagick 2.0.0)
+ * Enhances the contrast of a color image + * @link http://php.net/manual/en/function.imagick-normalizeimage.php + * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function normalizeimage ($channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Simulates an oil painting + * @link http://php.net/manual/en/function.imagick-oilpaintimage.php + * @param float $radius

+ * The radius of the circular neighborhood. + *

+ * @return bool &imagick.return.success; + */ + public function oilpaintimage ($radius) {} + + /** + * (PECL imagick 2.0.0)
+ * Reduces the image to a limited number of color level + * @link http://php.net/manual/en/function.imagick-posterizeimage.php + * @param int $levels + * @param bool $dither + * @return bool &imagick.return.success; + */ + public function posterizeimage ($levels, $dither) {} + + /** + * (PECL imagick 2.0.0)
+ * Radial blurs an image + * @link http://php.net/manual/en/function.imagick-radialblurimage.php + * @param float $angle + * @param int $channel [optional] + * @return bool &imagick.return.success; + */ + public function radialblurimage ($angle, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a simulated 3d button-like effect + * @link http://php.net/manual/en/function.imagick-raiseimage.php + * @param int $width + * @param int $height + * @param int $x + * @param int $y + * @param bool $raise + * @return bool &imagick.return.success; + */ + public function raiseimage ($width, $height, $x, $y, $raise) {} + + /** + * (PECL imagick 2.0.0)
+ * Resample image to desired resolution + * @link http://php.net/manual/en/function.imagick-resampleimage.php + * @param float $x_resolution + * @param float $y_resolution + * @param int $filter + * @param float $blur + * @return bool &imagick.return.success; + */ + public function resampleimage ($x_resolution, $y_resolution, $filter, $blur) {} + + /** + * (PECL imagick 2.0.0)
+ * Scales an image + * @link http://php.net/manual/en/function.imagick-resizeimage.php + * @param int $columns

+ * Width of the image + *

+ * @param int $rows

+ * Height of the image + *

+ * @param int $filter

+ * Refer to the list of filter constants. + *

+ * @param float $blur

+ * The blur factor where > 1 is blurry, < 1 is sharp. + *

+ * @param bool $bestfit [optional]

+ * Optional fit parameter. + *

+ * @return bool &imagick.return.success; + */ + public function resizeimage ($columns, $rows, $filter, $blur, $bestfit = false) {} + + /** + * (PECL imagick 2.0.0)
+ * Offsets an image + * @link http://php.net/manual/en/function.imagick-rollimage.php + * @param int $x

+ * The X offset. + *

+ * @param int $y

+ * The Y offset. + *

+ * @return bool &imagick.return.success; + */ + public function rollimage ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Rotates an image + * @link http://php.net/manual/en/function.imagick-rotateimage.php + * @param mixed $background

+ * The background color + *

+ * @param float $degrees

+ * The number of degrees to rotate the image + *

+ * @return bool &imagick.return.success; + */ + public function rotateimage ($background, $degrees) {} + + /** + * (PECL imagick 2.0.0)
+ * Scales an image with pixel sampling + * @link http://php.net/manual/en/function.imagick-sampleimage.php + * @param int $columns + * @param int $rows + * @return bool &imagick.return.success; + */ + public function sampleimage ($columns, $rows) {} + + /** + * (PECL imagick 2.0.0)
+ * Applies a solarizing effect to the image + * @link http://php.net/manual/en/function.imagick-solarizeimage.php + * @param int $threshold + * @return bool &imagick.return.success; + */ + public function solarizeimage ($threshold) {} + + /** + * (PECL imagick 2.0.0)
+ * Simulates an image shadow + * @link http://php.net/manual/en/function.imagick-shadowimage.php + * @param float $opacity + * @param float $sigma + * @param int $x + * @param int $y + * @return bool &imagick.return.success; + */ + public function shadowimage ($opacity, $sigma, $x, $y) {} + + /** + * @param $key + * @param $value + */ + public function setimageattribute ($key, $value) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image background color + * @link http://php.net/manual/en/function.imagick-setimagebackgroundcolor.php + * @param mixed $background + * @return bool &imagick.return.success; + */ + public function setimagebackgroundcolor ($background) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image composite operator + * @link http://php.net/manual/en/function.imagick-setimagecompose.php + * @param int $compose + * @return bool &imagick.return.success; + */ + public function setimagecompose ($compose) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image compression + * @link http://php.net/manual/en/function.imagick-setimagecompression.php + * @param int $compression

+ * One of the COMPRESSION constants + *

+ * @return bool &imagick.return.success; + */ + public function setimagecompression ($compression) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image delay + * @link http://php.net/manual/en/function.imagick-setimagedelay.php + * @param int $delay + * @return bool &imagick.return.success; + */ + public function setimagedelay ($delay) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image depth + * @link http://php.net/manual/en/function.imagick-setimagedepth.php + * @param int $depth + * @return bool &imagick.return.success; + */ + public function setimagedepth ($depth) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image gamma + * @link http://php.net/manual/en/function.imagick-setimagegamma.php + * @param float $gamma + * @return bool &imagick.return.success; + */ + public function setimagegamma ($gamma) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image iterations + * @link http://php.net/manual/en/function.imagick-setimageiterations.php + * @param int $iterations + * @return bool &imagick.return.success; + */ + public function setimageiterations ($iterations) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image matte color + * @link http://php.net/manual/en/function.imagick-setimagemattecolor.php + * @param mixed $matte + * @return bool &imagick.return.success; + */ + public function setimagemattecolor ($matte) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the page geometry of the image + * @link http://php.net/manual/en/function.imagick-setimagepage.php + * @param int $width + * @param int $height + * @param int $x + * @param int $y + * @return bool &imagick.return.success; + */ + public function setimagepage ($width, $height, $x, $y) {} + + /** + * @param $filename + */ + public function setimageprogressmonitor ($filename) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image resolution + * @link http://php.net/manual/en/function.imagick-setimageresolution.php + * @param float $x_resolution + * @param float $y_resolution + * @return bool &imagick.return.success; + */ + public function setimageresolution ($x_resolution, $y_resolution) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image scene + * @link http://php.net/manual/en/function.imagick-setimagescene.php + * @param int $scene + * @return bool &imagick.return.success; + */ + public function setimagescene ($scene) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image ticks-per-second + * @link http://php.net/manual/en/function.imagick-setimagetickspersecond.php + * @param int $ticks_per_second + * @return bool &imagick.return.success; + */ + public function setimagetickspersecond ($ticks_per_second) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image type + * @link http://php.net/manual/en/function.imagick-setimagetype.php + * @param int $image_type + * @return bool &imagick.return.success; + */ + public function setimagetype ($image_type) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image units of resolution + * @link http://php.net/manual/en/function.imagick-setimageunits.php + * @param int $units + * @return bool &imagick.return.success; + */ + public function setimageunits ($units) {} + + /** + * (PECL imagick 2.0.0)
+ * Sharpens an image + * @link http://php.net/manual/en/function.imagick-sharpenimage.php + * @param float $radius + * @param float $sigma + * @param int $channel [optional] + * @return bool &imagick.return.success; + */ + public function sharpenimage ($radius, $sigma, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Shaves pixels from the image edges + * @link http://php.net/manual/en/function.imagick-shaveimage.php + * @param int $columns + * @param int $rows + * @return bool &imagick.return.success; + */ + public function shaveimage ($columns, $rows) {} + + /** + * (PECL imagick 2.0.0)
+ * Creating a parallelogram + * @link http://php.net/manual/en/function.imagick-shearimage.php + * @param mixed $background

+ * The background color + *

+ * @param float $x_shear

+ * The number of degrees to shear on the x axis + *

+ * @param float $y_shear

+ * The number of degrees to shear on the y axis + *

+ * @return bool &imagick.return.success; + */ + public function shearimage ($background, $x_shear, $y_shear) {} + + /** + * (PECL imagick 2.0.0)
+ * Splices a solid color into the image + * @link http://php.net/manual/en/function.imagick-spliceimage.php + * @param int $width + * @param int $height + * @param int $x + * @param int $y + * @return bool &imagick.return.success; + */ + public function spliceimage ($width, $height, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Fetch basic attributes about the image + * @link http://php.net/manual/en/function.imagick-pingimage.php + * @param string $filename

+ * The filename to read the information from. + *

+ * @return bool &imagick.return.success; + */ + public function pingimage ($filename) {} + + /** + * (PECL imagick 2.0.0)
+ * Reads image from open filehandle + * @link http://php.net/manual/en/function.imagick-readimagefile.php + * @param resource $filehandle + * @param string $fileName [optional] + * @return bool &imagick.return.success; + */ + public function readimagefile ($filehandle, $fileName = null) {} + + /** + * (PECL imagick 2.0.0)
+ * Displays an image + * @link http://php.net/manual/en/function.imagick-displayimage.php + * @param string $servername

+ * The X server name + *

+ * @return bool &imagick.return.success; + */ + public function displayimage ($servername) {} + + /** + * (PECL imagick 2.0.0)
+ * Displays an image or image sequence + * @link http://php.net/manual/en/function.imagick-displayimages.php + * @param string $servername

+ * The X server name + *

+ * @return bool &imagick.return.success; + */ + public function displayimages ($servername) {} + + /** + * (PECL imagick 2.0.0)
+ * Randomly displaces each pixel in a block + * @link http://php.net/manual/en/function.imagick-spreadimage.php + * @param float $radius + * @return bool &imagick.return.success; + */ + public function spreadimage ($radius) {} + + /** + * (PECL imagick 2.0.0)
+ * Swirls the pixels about the center of the image + * @link http://php.net/manual/en/function.imagick-swirlimage.php + * @param float $degrees + * @return bool &imagick.return.success; + */ + public function swirlimage ($degrees) {} + + /** + * (PECL imagick 2.0.0)
+ * Strips an image of all profiles and comments + * @link http://php.net/manual/en/function.imagick-stripimage.php + * @return bool &imagick.return.success; + */ + public function stripimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns formats supported by Imagick + * @link http://php.net/manual/en/function.imagick-queryformats.php + * @param string $pattern [optional] + * @return array an array containing the formats supported by Imagick. + * &imagick.imagickexception.throw; + */ + public function queryformats ($pattern = "*") {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the configured fonts + * @link http://php.net/manual/en/function.imagick-queryfonts.php + * @param string $pattern [optional]

+ * The query pattern + *

+ * @return array an array containing the configured fonts. + * &imagick.imagickexception.throw; + */ + public function queryfonts ($pattern = "*") {} + + /** + * (PECL imagick 2.0.0)
+ * Returns an array representing the font metrics + * @link http://php.net/manual/en/function.imagick-queryfontmetrics.php + * @param ImagickDraw $properties

+ * ImagickDraw object containing font properties + *

+ * @param string $text

+ * The text + *

+ * @param bool $multiline [optional]

+ * Multiline parameter. If left empty it is autodetected + *

+ * @return array a multi-dimensional array representing the font metrics. + * &imagick.imagickexception.throw; + */ + public function queryfontmetrics (ImagickDraw $properties, $text, $multiline = null) {} + + /** + * (PECL imagick 2.0.0)
+ * Hides a digital watermark within the image + * @link http://php.net/manual/en/function.imagick-steganoimage.php + * @param Imagick $watermark_wand + * @param int $offset + * @return Imagick &imagick.return.success; + */ + public function steganoimage (Imagick $watermark_wand, $offset) {} + + /** + * (PECL imagick 2.0.0)
+ * Adds random noise to the image + * @link http://php.net/manual/en/function.imagick-addnoiseimage.php + * @param int $noise_type

+ * The type of the noise. Refer to this list of + * noise constants. + *

+ * @param int $channel [optional]

+ * &imagick.parameter.channel; + *

+ * @return bool &imagick.return.success; + */ + public function addnoiseimage ($noise_type, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (PECL imagick 2.0.0)
+ * Simulates motion blur + * @link http://php.net/manual/en/function.imagick-motionblurimage.php + * @param float $radius

+ * The radius of the Gaussian, in pixels, not counting the center pixel. + *

+ * @param float $sigma

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param float $angle

+ * Apply the effect along this angle. + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + * The channel argument affects only if Imagick is compiled against ImageMagick version + * 6.4.4 or greater. + *

+ * @return bool &imagick.return.success; + */ + public function motionblurimage ($radius, $sigma, $angle, $channel = 'Imagick::CHANNEL_DEFAULT') {} + + /** + * (PECL imagick 2.0.0)
+ * Forms a mosaic from images + * @link http://php.net/manual/en/function.imagick-mosaicimages.php + * @return Imagick &imagick.return.success; + */ + public function mosaicimages () {} + + /** + * (PECL imagick 2.0.0)
+ * Method morphs a set of images + * @link http://php.net/manual/en/function.imagick-morphimages.php + * @param int $number_frames

+ * The number of in-between images to generate. + *

+ * @return Imagick This method returns a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function morphimages ($number_frames) {} + + /** + * (PECL imagick 2.0.0)
+ * Scales an image proportionally to half its size + * @link http://php.net/manual/en/function.imagick-minifyimage.php + * @return bool &imagick.return.success; + */ + public function minifyimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Transforms an image + * @link http://php.net/manual/en/function.imagick-affinetransformimage.php + * @param ImagickDraw $matrix

+ * The affine matrix + *

+ * @return bool &imagick.return.success; + */ + public function affinetransformimage (ImagickDraw $matrix) {} + + /** + * (PECL imagick 2.0.0)
+ * Average a set of images + * @link http://php.net/manual/en/function.imagick-averageimages.php + * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function averageimages () {} + + /** + * (PECL imagick 2.0.0)
+ * Surrounds the image with a border + * @link http://php.net/manual/en/function.imagick-borderimage.php + * @param mixed $bordercolor

+ * ImagickPixel object or a string containing the border color + *

+ * @param int $width

+ * Border width + *

+ * @param int $height

+ * Border height + *

+ * @return bool &imagick.return.success; + */ + public function borderimage ($bordercolor, $width, $height) {} + + /** + * (PECL imagick 2.0.0)
+ * Removes a region of an image and trims + * @link http://php.net/manual/en/function.imagick-chopimage.php + * @param int $width

+ * Width of the chopped area + *

+ * @param int $height

+ * Height of the chopped area + *

+ * @param int $x

+ * X origo of the chopped area + *

+ * @param int $y

+ * Y origo of the chopped area + *

+ * @return bool &imagick.return.success; + */ + public function chopimage ($width, $height, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Clips along the first path from the 8BIM profile + * @link http://php.net/manual/en/function.imagick-clipimage.php + * @return bool &imagick.return.success; + */ + public function clipimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Clips along the named paths from the 8BIM profile + * @link http://php.net/manual/en/function.imagick-clippathimage.php + * @param string $pathname

+ * The name of the path + *

+ * @param bool $inside

+ * If true later operations take effect inside clipping path. + * Otherwise later operations take effect outside clipping path. + *

+ * @return bool &imagick.return.success; + */ + public function clippathimage ($pathname, $inside) {} + + /** + * @param $pathname + * @param $inside + */ + public function clipimagepath ($pathname, $inside) {} + + /** + * (PECL imagick 2.0.0)
+ * Composites a set of images + * @link http://php.net/manual/en/function.imagick-coalesceimages.php + * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function coalesceimages () {} + + /** + * (PECL imagick 2.0.0)
+ * Changes the color value of any pixel that matches target + * @link http://php.net/manual/en/function.imagick-colorfloodfillimage.php + * @param mixed $fill

+ * ImagickPixel object containing the fill color + *

+ * @param float $fuzz

+ * The amount of fuzz. For example, set fuzz to 10 and the color red at + * intensities of 100 and 102 respectively are now interpreted as the + * same color for the purposes of the floodfill. + *

+ * @param mixed $bordercolor

+ * ImagickPixel object containing the border color + *

+ * @param int $x

+ * X start position of the floodfill + *

+ * @param int $y

+ * Y start position of the floodfill + *

+ * @return bool &imagick.return.success; + */ + public function colorfloodfillimage ($fill, $fuzz, $bordercolor, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Blends the fill color with the image + * @link http://php.net/manual/en/function.imagick-colorizeimage.php + * @param mixed $colorize

+ * ImagickPixel object or a string containing the colorize color + *

+ * @param mixed $opacity

+ * ImagickPixel object or an float containing the opacity value. + * 1.0 is fully opaque and 0.0 is fully transparent. + *

+ * @return bool &imagick.return.success; + */ + public function colorizeimage ($colorize, $opacity) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the difference in one or more images + * @link http://php.net/manual/en/function.imagick-compareimagechannels.php + * @param Imagick $image

+ * Imagick object containing the image to compare. + *

+ * @param int $channelType

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @param int $metricType

+ * One of the metric type constants. + *

+ * @return array Array consisting of new_wand and + * distortion. + */ + public function compareimagechannels (Imagick $image, $channelType, $metricType) {} + + /** + * (PECL imagick 2.0.0)
+ * Compares an image to a reconstructed image + * @link http://php.net/manual/en/function.imagick-compareimages.php + * @param Imagick $compare

+ * An image to compare to. + *

+ * @param int $metric

+ * Provide a valid metric type constant. Refer to this + * list of metric constants. + *

+ * @return array &imagick.return.success; + */ + public function compareimages (Imagick $compare, $metric) {} + + /** + * (PECL imagick 2.0.0)
+ * Change the contrast of the image + * @link http://php.net/manual/en/function.imagick-contrastimage.php + * @param bool $sharpen

+ * The sharpen value + *

+ * @return bool &imagick.return.success; + */ + public function contrastimage ($sharpen) {} + + /** + * (PECL imagick 2.0.0)
+ * Combines one or more images into a single image + * @link http://php.net/manual/en/function.imagick-combineimages.php + * @param int $channelType

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return Imagick &imagick.return.success; + */ + public function combineimages ($channelType) {} + + /** + * (PECL imagick 2.0.0)
+ * Applies a custom convolution kernel to the image + * @link http://php.net/manual/en/function.imagick-convolveimage.php + * @param array $kernel

+ * The convolution kernel + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function convolveimage (array $kernel, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Displaces an image's colormap + * @link http://php.net/manual/en/function.imagick-cyclecolormapimage.php + * @param int $displace

+ * The amount to displace the colormap. + *

+ * @return bool &imagick.return.success; + */ + public function cyclecolormapimage ($displace) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns certain pixel differences between images + * @link http://php.net/manual/en/function.imagick-deconstructimages.php + * @return Imagick a new Imagick object on success. + * &imagick.imagickexception.throw; + */ + public function deconstructimages () {} + + /** + * (PECL imagick 2.0.0)
+ * Reduces the speckle noise in an image + * @link http://php.net/manual/en/function.imagick-despeckleimage.php + * @return bool &imagick.return.success; + */ + public function despeckleimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Enhance edges within the image + * @link http://php.net/manual/en/function.imagick-edgeimage.php + * @param float $radius

+ * The radius of the operation. + *

+ * @return bool &imagick.return.success; + */ + public function edgeimage ($radius) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns a grayscale image with a three-dimensional effect + * @link http://php.net/manual/en/function.imagick-embossimage.php + * @param float $radius

+ * The radius of the effect + *

+ * @param float $sigma

+ * The sigma of the effect + *

+ * @return bool &imagick.return.success; + */ + public function embossimage ($radius, $sigma) {} + + /** + * (PECL imagick 2.0.0)
+ * Improves the quality of a noisy image + * @link http://php.net/manual/en/function.imagick-enhanceimage.php + * @return bool &imagick.return.success; + */ + public function enhanceimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Equalizes the image histogram + * @link http://php.net/manual/en/function.imagick-equalizeimage.php + * @return bool &imagick.return.success; + */ + public function equalizeimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Applies an expression to an image + * @link http://php.net/manual/en/function.imagick-evaluateimage.php + * @param int $op

+ * The evaluation operator + *

+ * @param float $constant

+ * The value of the operator + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function evaluateimage ($op, $constant, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Merges a sequence of images + * @link http://php.net/manual/en/function.imagick-flattenimages.php + * @return Imagick &imagick.return.success; + */ + public function flattenimages () {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a vertical mirror image + * @link http://php.net/manual/en/function.imagick-flipimage.php + * @return bool &imagick.return.success; + */ + public function flipimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a horizontal mirror image + * @link http://php.net/manual/en/function.imagick-flopimage.php + * @return bool &imagick.return.success; + */ + public function flopimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Adds a simulated three-dimensional border + * @link http://php.net/manual/en/function.imagick-frameimage.php + * @param mixed $matte_color

+ * ImagickPixel object or a string representing the matte color + *

+ * @param int $width

+ * The width of the border + *

+ * @param int $height

+ * The height of the border + *

+ * @param int $inner_bevel

+ * The inner bevel width + *

+ * @param int $outer_bevel

+ * The outer bevel width + *

+ * @return bool &imagick.return.success; + */ + public function frameimage ($matte_color, $width, $height, $inner_bevel, $outer_bevel) {} + + /** + * (PECL imagick 2.0.0)
+ * Evaluate expression for each pixel in the image + * @link http://php.net/manual/en/function.imagick-fximage.php + * @param string $expression

+ * The expression. + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return Imagick &imagick.return.success; + */ + public function fximage ($expression, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Gamma-corrects an image + * @link http://php.net/manual/en/function.imagick-gammaimage.php + * @param float $gamma

+ * The amount of gamma-correction. + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function gammaimage ($gamma, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Blurs an image + * @link http://php.net/manual/en/function.imagick-gaussianblurimage.php + * @param float $radius

+ * The radius of the Gaussian, in pixels, not counting the center pixel. + *

+ * @param float $sigma

+ * The standard deviation of the Gaussian, in pixels. + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function gaussianblurimage ($radius, $sigma, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * @param $key + */ + public function getimageattribute ($key) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the image background color + * @link http://php.net/manual/en/function.imagick-getimagebackgroundcolor.php + * @return ImagickPixel an ImagickPixel set to the background color of the image. + * &imagick.imagickexception.throw; + */ + public function getimagebackgroundcolor () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the chromaticy blue primary point + * @link http://php.net/manual/en/function.imagick-getimageblueprimary.php + * @return array Array consisting of "x" and "y" coordinates of point. + */ + public function getimageblueprimary () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the image border color + * @link http://php.net/manual/en/function.imagick-getimagebordercolor.php + * @return ImagickPixel &imagick.return.success; + */ + public function getimagebordercolor () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the depth for a particular image channel + * @link http://php.net/manual/en/function.imagick-getimagechanneldepth.php + * @param int $channel

+ * &imagick.parameter.channel; + *

+ * @return int &imagick.return.success; + */ + public function getimagechanneldepth ($channel) {} + + /** + * (PECL imagick 2.0.0)
+ * Compares image channels of an image to a reconstructed image + * @link http://php.net/manual/en/function.imagick-getimagechanneldistortion.php + * @param Imagick $reference

+ * Imagick object to compare to. + *

+ * @param int $channel

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @param int $metric

+ * One of the metric type constants. + *

+ * @return float &imagick.return.success; + */ + public function getimagechanneldistortion (Imagick $reference, $channel, $metric) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the extrema for one or more image channels + * @link http://php.net/manual/en/function.imagick-getimagechannelextrema.php + * @param int $channel

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return array &imagick.return.success; + */ + public function getimagechannelextrema ($channel) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the mean and standard deviation + * @link http://php.net/manual/en/function.imagick-getimagechannelmean.php + * @param int $channel

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return array &imagick.return.success; + */ + public function getimagechannelmean ($channel) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns statistics for each channel in the image + * @link http://php.net/manual/en/function.imagick-getimagechannelstatistics.php + * @return array &imagick.return.success; + */ + public function getimagechannelstatistics () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the color of the specified colormap index + * @link http://php.net/manual/en/function.imagick-getimagecolormapcolor.php + * @param int $index

+ * The offset into the image colormap. + *

+ * @return ImagickPixel &imagick.return.success; + */ + public function getimagecolormapcolor ($index) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image colorspace + * @link http://php.net/manual/en/function.imagick-getimagecolorspace.php + * @return int &imagick.return.success; + */ + public function getimagecolorspace () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the composite operator associated with the image + * @link http://php.net/manual/en/function.imagick-getimagecompose.php + * @return int &imagick.return.success; + */ + public function getimagecompose () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image delay + * @link http://php.net/manual/en/function.imagick-getimagedelay.php + * @return int the image delay. + * &imagick.imagickexception.throw; + */ + public function getimagedelay () {} + + /** + * (PECL imagick 0.9.1-0.9.9)
+ * Gets the image depth + * @link http://php.net/manual/en/function.imagick-getimagedepth.php + * @return int The image depth. + */ + public function getimagedepth () {} + + /** + * (PECL imagick 2.0.0)
+ * Compares an image to a reconstructed image + * @link http://php.net/manual/en/function.imagick-getimagedistortion.php + * @param MagickWand $reference

+ * Imagick object to compare to. + *

+ * @param int $metric

+ * One of the metric type constants. + *

+ * @return float the distortion metric used on the image (or the best guess + * thereof). + * &imagick.imagickexception.throw; + */ + public function getimagedistortion (MagickWand $reference, $metric) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the extrema for the image + * @link http://php.net/manual/en/function.imagick-getimageextrema.php + * @return array an associative array with the keys "min" and "max". + * &imagick.imagickexception.throw; + */ + public function getimageextrema () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image disposal method + * @link http://php.net/manual/en/function.imagick-getimagedispose.php + * @return int the dispose method on success. + * &imagick.imagickexception.throw; + */ + public function getimagedispose () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image gamma + * @link http://php.net/manual/en/function.imagick-getimagegamma.php + * @return float the image gamma on success. + * &imagick.imagickexception.throw; + */ + public function getimagegamma () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the chromaticy green primary point + * @link http://php.net/manual/en/function.imagick-getimagegreenprimary.php + * @return array an array with the keys "x" and "y" on success, throws an + * ImagickException on failure. + */ + public function getimagegreenprimary () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the image height + * @link http://php.net/manual/en/function.imagick-getimageheight.php + * @return int the image height in pixels. + * &imagick.imagickexception.throw; + */ + public function getimageheight () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image histogram + * @link http://php.net/manual/en/function.imagick-getimagehistogram.php + * @return array the image histogram as an array of ImagickPixel objects. + * &imagick.imagickexception.throw; + */ + public function getimagehistogram () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image interlace scheme + * @link http://php.net/manual/en/function.imagick-getimageinterlacescheme.php + * @return int the interlace scheme as an integer on success. + * &imagick.imagickexception.throw; + */ + public function getimageinterlacescheme () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image iterations + * @link http://php.net/manual/en/function.imagick-getimageiterations.php + * @return int the image iterations as an integer. + * &imagick.imagickexception.throw; + */ + public function getimageiterations () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the image matte color + * @link http://php.net/manual/en/function.imagick-getimagemattecolor.php + * @return ImagickPixel ImagickPixel object on success. + * &imagick.imagickexception.throw; + */ + public function getimagemattecolor () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the page geometry + * @link http://php.net/manual/en/function.imagick-getimagepage.php + * @return array the page geometry associated with the image in an array with the + * keys "width", "height", "x", and "y". + */ + public function getimagepage () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the color of the specified pixel + * @link http://php.net/manual/en/function.imagick-getimagepixelcolor.php + * @param int $x

+ * The x-coordinate of the pixel + *

+ * @param int $y

+ * The y-coordinate of the pixel + *

+ * @return ImagickPixel an ImagickPixel instance for the color at the coordinates given. + * &imagick.imagickexception.throw; + */ + public function getimagepixelcolor ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the named image profile + * @link http://php.net/manual/en/function.imagick-getimageprofile.php + * @param string $name

+ * The name of the profile to return. + *

+ * @return string a string containing the image profile. + * &imagick.imagickexception.throw; + */ + public function getimageprofile ($name) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the chromaticity red primary point + * @link http://php.net/manual/en/function.imagick-getimageredprimary.php + * @return array the chromaticity red primary point as an array with the keys "x" + * and "y". + * &imagick.imagickexception.throw; + */ + public function getimageredprimary () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image rendering intent + * @link http://php.net/manual/en/function.imagick-getimagerenderingintent.php + * @return int the image rendering intent. + * &imagick.imagickexception.throw; + */ + public function getimagerenderingintent () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image X and Y resolution + * @link http://php.net/manual/en/function.imagick-getimageresolution.php + * @return array the resolution as an array. + * &imagick.imagickexception.throw; + */ + public function getimageresolution () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image scene + * @link http://php.net/manual/en/function.imagick-getimagescene.php + * @return int the image scene. + * &imagick.imagickexception.throw; + */ + public function getimagescene () {} + + /** + * (PECL imagick 2.0.0)
+ * Generates an SHA-256 message digest + * @link http://php.net/manual/en/function.imagick-getimagesignature.php + * @return string a string containing the SHA-256 hash of the file. + * &imagick.imagickexception.throw; + */ + public function getimagesignature () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image ticks-per-second + * @link http://php.net/manual/en/function.imagick-getimagetickspersecond.php + * @return int the image ticks-per-second. + * &imagick.imagickexception.throw; + */ + public function getimagetickspersecond () {} + + /** + * (PECL imagick 0.9.10-0.9.9)
+ * Gets the potential image type + * @link http://php.net/manual/en/function.imagick-getimagetype.php + * @return int the potential image type. + * &imagick.imagickexception.throw; + */ + public function getimagetype () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image units of resolution + * @link http://php.net/manual/en/function.imagick-getimageunits.php + * @return int the image units of resolution. + * &imagick.imagickexception.throw; + */ + public function getimageunits () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the virtual pixel method + * @link http://php.net/manual/en/function.imagick-getimagevirtualpixelmethod.php + * @return int the virtual pixel method on success. + * &imagick.imagickexception.throw; + */ + public function getimagevirtualpixelmethod () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the chromaticity white point + * @link http://php.net/manual/en/function.imagick-getimagewhitepoint.php + * @return array the chromaticity white point as an associative array with the keys + * "x" and "y". + * &imagick.imagickexception.throw; + */ + public function getimagewhitepoint () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the image width + * @link http://php.net/manual/en/function.imagick-getimagewidth.php + * @return int the image width. + * &imagick.imagickexception.throw; + */ + public function getimagewidth () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the number of images in the object + * @link http://php.net/manual/en/function.imagick-getnumberimages.php + * @return int the number of images associated with Imagick object. + * &imagick.imagickexception.throw; + */ + public function getnumberimages () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the image total ink density + * @link http://php.net/manual/en/function.imagick-getimagetotalinkdensity.php + * @return float the image total ink density of the image. + * &imagick.imagickexception.throw; + */ + public function getimagetotalinkdensity () {} + + /** + * (PECL imagick 2.0.0)
+ * Extracts a region of the image + * @link http://php.net/manual/en/function.imagick-getimageregion.php + * @param int $width

+ * The width of the extracted region. + *

+ * @param int $height

+ * The height of the extracted region. + *

+ * @param int $x

+ * X-coordinate of the top-left corner of the extracted region. + *

+ * @param int $y

+ * Y-coordinate of the top-left corner of the extracted region. + *

+ * @return Imagick Extracts a region of the image and returns it as a new wand. + * &imagick.imagickexception.throw; + */ + public function getimageregion ($width, $height, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a new image as a copy + * @link http://php.net/manual/en/function.imagick-implodeimage.php + * @param float $radius

+ * The radius of the implode + *

+ * @return bool &imagick.return.success; + */ + public function implodeimage ($radius) {} + + /** + * (PECL imagick 2.0.0)
+ * Adjusts the levels of an image + * @link http://php.net/manual/en/function.imagick-levelimage.php + * @param float $blackPoint

+ * The image black point + *

+ * @param float $gamma

+ * The gamma value + *

+ * @param float $whitePoint

+ * The image white point + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function levelimage ($blackPoint, $gamma, $whitePoint, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Scales an image proportionally 2x + * @link http://php.net/manual/en/function.imagick-magnifyimage.php + * @return bool &imagick.return.success; + */ + public function magnifyimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Replaces the colors of an image with the closest color from a reference image. + * @link http://php.net/manual/en/function.imagick-mapimage.php + * @param Imagick $map + * @param bool $dither + * @return bool &imagick.return.success; + */ + public function mapimage (Imagick $map, $dither) {} + + /** + * (PECL imagick 2.0.0)
+ * Changes the transparency value of a color + * @link http://php.net/manual/en/function.imagick-mattefloodfillimage.php + * @param float $alpha

+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully + * transparent. + *

+ * @param float $fuzz

+ * The fuzz member of image defines how much tolerance is acceptable to + * consider two colors as the same. + *

+ * @param mixed $bordercolor

+ * An ImagickPixel object or string representing the border color. + *

+ * @param int $x

+ * The starting x coordinate of the operation. + *

+ * @param int $y

+ * The starting y coordinate of the operation. + *

+ * @return bool &imagick.return.success; + */ + public function mattefloodfillimage ($alpha, $fuzz, $bordercolor, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Applies a digital filter + * @link http://php.net/manual/en/function.imagick-medianfilterimage.php + * @param float $radius

+ * The radius of the pixel neighborhood. + *

+ * @return bool &imagick.return.success; + */ + public function medianfilterimage ($radius) {} + + /** + * (PECL imagick 2.0.0)
+ * Negates the colors in the reference image + * @link http://php.net/manual/en/function.imagick-negateimage.php + * @param bool $gray

+ * Whether to only negate grayscale pixels within the image. + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function negateimage ($gray, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Change any pixel that matches color + * @link http://php.net/manual/en/function.imagick-paintopaqueimage.php + * @param mixed $target

+ * Change this target color to the fill color within the image. An + * ImagickPixel object or a string representing the target color. + *

+ * @param mixed $fill

+ * An ImagickPixel object or a string representing the fill color. + *

+ * @param float $fuzz

+ * The fuzz member of image defines how much tolerance is acceptable to + * consider two colors as the same. + *

+ * @param int $channel [optional]

+ * Provide any channel constant that is valid for your channel mode. To + * apply to more than one channel, combine channeltype constants using + * bitwise operators. Refer to this + * list of channel constants. + *

+ * @return bool &imagick.return.success; + */ + public function paintopaqueimage ($target, $fill, $fuzz, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Changes any pixel that matches color with the color defined by fill + * @link http://php.net/manual/en/function.imagick-painttransparentimage.php + * @param mixed $target

+ * Change this target color to specified opacity value within the image. + *

+ * @param float $alpha

+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully + * transparent. + *

+ * @param float $fuzz

+ * The fuzz member of image defines how much tolerance is acceptable to + * consider two colors as the same. + *

+ * @return bool &imagick.return.success; + */ + public function painttransparentimage ($target, $alpha, $fuzz) {} + + /** + * (PECL imagick 2.0.0)
+ * Quickly pin-point appropriate parameters for image processing + * @link http://php.net/manual/en/function.imagick-previewimages.php + * @param int $preview

+ * Preview type. See Preview type constants + *

+ * @return bool &imagick.return.success; + */ + public function previewimages ($preview) {} + + /** + * (PECL imagick 2.0.0)
+ * Adds or removes a profile from an image + * @link http://php.net/manual/en/function.imagick-profileimage.php + * @param string $name + * @param string $profile + * @return bool &imagick.return.success; + */ + public function profileimage ($name, $profile) {} + + /** + * (PECL imagick 2.0.0)
+ * Analyzes the colors within a reference image + * @link http://php.net/manual/en/function.imagick-quantizeimage.php + * @param int $numberColors + * @param int $colorspace + * @param int $treedepth + * @param bool $dither + * @param bool $measureError + * @return bool &imagick.return.success; + */ + public function quantizeimage ($numberColors, $colorspace, $treedepth, $dither, $measureError) {} + + /** + * (PECL imagick 2.0.0)
+ * Analyzes the colors within a sequence of images + * @link http://php.net/manual/en/function.imagick-quantizeimages.php + * @param int $numberColors + * @param int $colorspace + * @param int $treedepth + * @param bool $dither + * @param bool $measureError + * @return bool &imagick.return.success; + */ + public function quantizeimages ($numberColors, $colorspace, $treedepth, $dither, $measureError) {} + + /** + * (PECL imagick 2.0.0)
+ * Smooths the contours of an image + * @link http://php.net/manual/en/function.imagick-reducenoiseimage.php + * @param float $radius + * @return bool &imagick.return.success; + */ + public function reducenoiseimage ($radius) {} + + /** + * (PECL imagick 2.0.0)
+ * Removes the named image profile and returns it + * @link http://php.net/manual/en/function.imagick-removeimageprofile.php + * @param string $name + * @return string a string containing the profile of the image. + * &imagick.imagickexception.throw; + */ + public function removeimageprofile ($name) {} + + /** + * (PECL imagick 2.0.0)
+ * Separates a channel from the image + * @link http://php.net/manual/en/function.imagick-separateimagechannel.php + * @param int $channel + * @return bool &imagick.return.success; + */ + public function separateimagechannel ($channel) {} + + /** + * (PECL imagick 2.0.0)
+ * Sepia tones an image + * @link http://php.net/manual/en/function.imagick-sepiatoneimage.php + * @param float $threshold + * @return bool &imagick.return.success; + */ + public function sepiatoneimage ($threshold) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image bias for any method that convolves an image + * @link http://php.net/manual/en/function.imagick-setimagebias.php + * @param float $bias + * @return bool &imagick.return.success; + */ + public function setimagebias ($bias) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image chromaticity blue primary point + * @link http://php.net/manual/en/function.imagick-setimageblueprimary.php + * @param float $x + * @param float $y + * @return bool &imagick.return.success; + */ + public function setimageblueprimary ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image border color + * @link http://php.net/manual/en/function.imagick-setimagebordercolor.php + * @param mixed $border

+ * The border color + *

+ * @return bool &imagick.return.success; + */ + public function setimagebordercolor ($border) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the depth of a particular image channel + * @link http://php.net/manual/en/function.imagick-setimagechanneldepth.php + * @param int $channel + * @param int $depth + * @return bool &imagick.return.success; + */ + public function setimagechanneldepth ($channel, $depth) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the color of the specified colormap index + * @link http://php.net/manual/en/function.imagick-setimagecolormapcolor.php + * @param int $index + * @param ImagickPixel $color + * @return bool &imagick.return.success; + */ + public function setimagecolormapcolor ($index, ImagickPixel $color) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image colorspace + * @link http://php.net/manual/en/function.imagick-setimagecolorspace.php + * @param int $colorspace + * @return bool &imagick.return.success; + */ + public function setimagecolorspace ($colorspace) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image disposal method + * @link http://php.net/manual/en/function.imagick-setimagedispose.php + * @param int $dispose + * @return bool &imagick.return.success; + */ + public function setimagedispose ($dispose) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image size + * @link http://php.net/manual/en/function.imagick-setimageextent.php + * @param int $columns + * @param int $rows + * @return bool &imagick.return.success; + */ + public function setimageextent ($columns, $rows) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image chromaticity green primary point + * @link http://php.net/manual/en/function.imagick-setimagegreenprimary.php + * @param float $x + * @param float $y + * @return bool &imagick.return.success; + */ + public function setimagegreenprimary ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image compression + * @link http://php.net/manual/en/function.imagick-setimageinterlacescheme.php + * @param int $interlace_scheme + * @return bool &imagick.return.success; + */ + public function setimageinterlacescheme ($interlace_scheme) {} + + /** + * (PECL imagick 2.0.0)
+ * Adds a named profile to the Imagick object + * @link http://php.net/manual/en/function.imagick-setimageprofile.php + * @param string $name + * @param string $profile + * @return bool &imagick.return.success; + */ + public function setimageprofile ($name, $profile) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image chromaticity red primary point + * @link http://php.net/manual/en/function.imagick-setimageredprimary.php + * @param float $x + * @param float $y + * @return bool &imagick.return.success; + */ + public function setimageredprimary ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image rendering intent + * @link http://php.net/manual/en/function.imagick-setimagerenderingintent.php + * @param int $rendering_intent + * @return bool &imagick.return.success; + */ + public function setimagerenderingintent ($rendering_intent) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image virtual pixel method + * @link http://php.net/manual/en/function.imagick-setimagevirtualpixelmethod.php + * @param int $method + * @return bool &imagick.return.success; + */ + public function setimagevirtualpixelmethod ($method) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image chromaticity white point + * @link http://php.net/manual/en/function.imagick-setimagewhitepoint.php + * @param float $x + * @param float $y + * @return bool &imagick.return.success; + */ + public function setimagewhitepoint ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Adjusts the contrast of an image + * @link http://php.net/manual/en/function.imagick-sigmoidalcontrastimage.php + * @param bool $sharpen + * @param float $alpha + * @param float $beta + * @param int $channel [optional] + * @return bool &imagick.return.success; + */ + public function sigmoidalcontrastimage ($sharpen, $alpha, $beta, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Composites two images + * @link http://php.net/manual/en/function.imagick-stereoimage.php + * @param Imagick $offset_wand + * @return bool &imagick.return.success; + */ + public function stereoimage (Imagick $offset_wand) {} + + /** + * (PECL imagick 2.0.0)
+ * Repeatedly tiles the texture image + * @link http://php.net/manual/en/function.imagick-textureimage.php + * @param Imagick $texture_wand + * @return bool &imagick.return.success; + */ + public function textureimage (Imagick $texture_wand) {} + + /** + * (PECL imagick 2.0.0)
+ * Applies a color vector to each pixel in the image + * @link http://php.net/manual/en/function.imagick-tintimage.php + * @param mixed $tint + * @param mixed $opacity + * @return bool &imagick.return.success; + */ + public function tintimage ($tint, $opacity) {} + + /** + * (PECL imagick 2.0.0)
+ * Sharpens an image + * @link http://php.net/manual/en/function.imagick-unsharpmaskimage.php + * @param float $radius + * @param float $sigma + * @param float $amount + * @param float $threshold + * @param int $channel [optional] + * @return bool &imagick.return.success; + */ + public function unsharpmaskimage ($radius, $sigma, $amount, $threshold, $channel = 'Imagick::CHANNEL_ALL') {} + + /** + * (PECL imagick 2.0.0)
+ * Returns a new Imagick object + * @link http://php.net/manual/en/function.imagick-getimage.php + * @return Imagick a new Imagick object with the current image sequence. + * &imagick.imagickexception.throw; + */ + public function getimage () {} + + /** + * (PECL imagick 2.0.0)
+ * Adds new image to Imagick object image list + * @link http://php.net/manual/en/function.imagick-addimage.php + * @param Imagick $source

+ * The source Imagick object + *

+ * @return bool &imagick.return.success; + */ + public function addimage (Imagick $source) {} + + /** + * (PECL imagick 2.0.0)
+ * Replaces image in the object + * @link http://php.net/manual/en/function.imagick-setimage.php + * @param Imagick $replace

+ * The replace Imagick object + *

+ * @return bool &imagick.return.success; + */ + public function setimage (Imagick $replace) {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a new image + * @link http://php.net/manual/en/function.imagick-newimage.php + * @param int $cols

+ * Columns in the new image + *

+ * @param int $rows

+ * Rows in the new image + *

+ * @param mixed $background

+ * The background color used for this image + *

+ * @param string $format [optional]

+ * Image format. This parameter was added in Imagick version 2.0.1. + *

+ * @return bool &imagick.return.success; + */ + public function newimage ($cols, $rows, $background, $format = null) {} + + /** + * (PECL imagick 2.0.0)
+ * Creates a new image + * @link http://php.net/manual/en/function.imagick-newpseudoimage.php + * @param int $columns

+ * columns in the new image + *

+ * @param int $rows

+ * rows in the new image + *

+ * @param string $pseudoString

+ * string containing pseudo image definition. + *

+ * @return bool &imagick.return.success; + */ + public function newpseudoimage ($columns, $rows, $pseudoString) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the object compression type + * @link http://php.net/manual/en/function.imagick-getcompression.php + * @return int the compression constant + */ + public function getcompression () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the object compression quality + * @link http://php.net/manual/en/function.imagick-getcompressionquality.php + * @return int integer describing the compression quality + */ + public function getcompressionquality () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the ImageMagick API copyright as a string + * @link http://php.net/manual/en/function.imagick-getcopyright.php + * @return string a string containing the copyright notice of Imagemagick and + * Magickwand C API. + */ + public function getcopyright () {} + + /** + * (PECL imagick 2.0.0)
+ * The filename associated with an image sequence + * @link http://php.net/manual/en/function.imagick-getfilename.php + * @return string a string on success. + * &imagick.imagickexception.throw; + */ + public function getfilename () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the format of the Imagick object + * @link http://php.net/manual/en/function.imagick-getformat.php + * @return string the format of the image. + * &imagick.imagickexception.throw; + */ + public function getformat () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the ImageMagick home URL + * @link http://php.net/manual/en/function.imagick-gethomeurl.php + * @return string a link to the imagemagick homepage. + */ + public function gethomeurl () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the object interlace scheme + * @link http://php.net/manual/en/function.imagick-getinterlacescheme.php + * @return int Gets the wand interlace + * scheme. + * &imagick.imagickexception.throw; + */ + public function getinterlacescheme () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns a value associated with the specified key + * @link http://php.net/manual/en/function.imagick-getoption.php + * @param string $key

+ * The name of the option + *

+ * @return string a value associated with a wand and the specified key. + * &imagick.imagickexception.throw; + */ + public function getoption ($key) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the ImageMagick package name + * @link http://php.net/manual/en/function.imagick-getpackagename.php + * @return string the ImageMagick package name as a string. + * &imagick.imagickexception.throw; + */ + public function getpackagename () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the page geometry + * @link http://php.net/manual/en/function.imagick-getpage.php + * @return array the page geometry associated with the Imagick object in + * an associative array with the keys "width", "height", "x", and "y", + * throwing ImagickException on error. + */ + public function getpage () {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the quantum depth + * @link http://php.net/manual/en/function.imagick-getquantumdepth.php + * @return array the Imagick quantum depth as a string. + * &imagick.imagickexception.throw; + */ + public function getquantumdepth () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the Imagick quantum range + * @link http://php.net/manual/en/function.imagick-getquantumrange.php + * @return array the Imagick quantum range as a string. + * &imagick.imagickexception.throw; + */ + public function getquantumrange () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the ImageMagick release date + * @link http://php.net/manual/en/function.imagick-getreleasedate.php + * @return string the ImageMagick release date as a string. + * &imagick.imagickexception.throw; + */ + public function getreleasedate () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the specified resource's memory usage + * @link http://php.net/manual/en/function.imagick-getresource.php + * @param int $type

+ * Refer to the list of resourcetype constants. + *

+ * @return int the specified resource's memory usage in megabytes. + * &imagick.imagickexception.throw; + */ + public function getresource ($type) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the specified resource limit + * @link http://php.net/manual/en/function.imagick-getresourcelimit.php + * @param int $type

+ * Refer to the list of resourcetype constants. + *

+ * @return int the specified resource limit in megabytes. + * &imagick.imagickexception.throw; + */ + public function getresourcelimit ($type) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the horizontal and vertical sampling factor + * @link http://php.net/manual/en/function.imagick-getsamplingfactors.php + * @return array an associative array with the horizontal and vertical sampling + * factors of the image. + * &imagick.imagickexception.throw; + */ + public function getsamplingfactors () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the size associated with the Imagick object + * @link http://php.net/manual/en/function.imagick-getsize.php + * @return array the size associated with the Imagick object as an array with the + * keys "columns" and "rows". + */ + public function getsize () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the ImageMagick API version + * @link http://php.net/manual/en/function.imagick-getversion.php + * @return array the ImageMagick API version as a string and as a number. + * &imagick.imagickexception.throw; + */ + public function getversion () {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the object's default background color + * @link http://php.net/manual/en/function.imagick-setbackgroundcolor.php + * @param mixed $background + * @return bool &imagick.return.success; + */ + public function setbackgroundcolor ($background) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the object's default compression type + * @link http://php.net/manual/en/function.imagick-setcompression.php + * @param int $compression + * @return bool &imagick.return.success; + */ + public function setcompression ($compression) {} + + /** + * (PECL imagick 0.9.10-0.9.9)
+ * Sets the object's default compression quality + * @link http://php.net/manual/en/function.imagick-setcompressionquality.php + * @param int $quality + * @return bool &imagick.return.success; + */ + public function setcompressionquality ($quality) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the filename before you read or write the image + * @link http://php.net/manual/en/function.imagick-setfilename.php + * @param string $filename + * @return bool &imagick.return.success; + */ + public function setfilename ($filename) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the format of the Imagick object + * @link http://php.net/manual/en/function.imagick-setformat.php + * @param string $format + * @return bool &imagick.return.success; + */ + public function setformat ($format) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image compression + * @link http://php.net/manual/en/function.imagick-setinterlacescheme.php + * @param int $interlace_scheme + * @return bool &imagick.return.success; + */ + public function setinterlacescheme ($interlace_scheme) {} + + /** + * (PECL imagick 2.0.0)
+ * Set an option + * @link http://php.net/manual/en/function.imagick-setoption.php + * @param string $key + * @param string $value + * @return bool &imagick.return.success; + */ + public function setoption ($key, $value) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the page geometry of the Imagick object + * @link http://php.net/manual/en/function.imagick-setpage.php + * @param int $width + * @param int $height + * @param int $x + * @param int $y + * @return bool &imagick.return.success; + */ + public function setpage ($width, $height, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the limit for a particular resource in megabytes + * @link http://php.net/manual/en/function.imagick-setresourcelimit.php + * @param int $type + * @param int $limit + * @return bool &imagick.return.success; + */ + public function setresourcelimit ($type, $limit) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image resolution + * @link http://php.net/manual/en/function.imagick-setresolution.php + * @param float $x_resolution + * @param float $y_resolution + * @return bool &imagick.return.success; + */ + public function setresolution ($x_resolution, $y_resolution) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image sampling factors + * @link http://php.net/manual/en/function.imagick-setsamplingfactors.php + * @param array $factors + * @return bool &imagick.return.success; + */ + public function setsamplingfactors (array $factors) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the size of the Imagick object + * @link http://php.net/manual/en/function.imagick-setsize.php + * @param int $columns + * @param int $rows + * @return bool &imagick.return.success; + */ + public function setsize ($columns, $rows) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the image type attribute + * @link http://php.net/manual/en/function.imagick-settype.php + * @param int $image_type + * @return bool &imagick.return.success; + */ + public function settype ($image_type) {} + + public function key () {} + + public function next () {} + + public function rewind () {} + + /** + * (PECL imagick 2.0.0)
+ * Checks if the current item is valid + * @link http://php.net/manual/en/function.imagick-valid.php + * @return bool &imagick.return.success; + */ + public function valid () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns a reference to the current Imagick object + * @link http://php.net/manual/en/function.imagick-current.php + * @return Imagick self on success. + * &imagick.imagickexception.throw; + */ + public function current () {} + +} + +/** + * @link http://php.net/manual/en/class.imagickdraw.php + * @jms-builtin + */ +class ImagickDraw { + + public function resetvectorgraphics () {} + + public function gettextkerning () {} + + /** + * @param $kerning + */ + public function settextkerning ($kerning) {} + + public function gettextinterwordspacing () {} + + /** + * @param $spacing + */ + public function settextinterwordspacing ($spacing) {} + + /** + * (PECL imagick 2.0.0)
+ * The ImagickDraw constructor + * @link http://php.net/manual/en/function.imagickdraw-construct.php + */ + public function __construct () {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the fill color to be used for drawing filled objects + * @link http://php.net/manual/en/function.imagickdraw-setfillcolor.php + * @param ImagickPixel $fill_pixel

+ * ImagickPixel to use to set the color + *

+ * @return bool + */ + public function setfillcolor (ImagickPixel $fill_pixel) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the opacity to use when drawing using the fill color or fill texture + * @link http://php.net/manual/en/function.imagickdraw-setfillalpha.php + * @param float $opacity

+ * fill alpha + *

+ * @return bool + */ + public function setfillalpha ($opacity) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the color used for stroking object outlines + * @link http://php.net/manual/en/function.imagickdraw-setstrokecolor.php + * @param ImagickPixel $stroke_pixel

+ * the stroke color + *

+ * @return bool + */ + public function setstrokecolor (ImagickPixel $stroke_pixel) {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies the opacity of stroked object outlines + * @link http://php.net/manual/en/function.imagickdraw-setstrokealpha.php + * @param float $opacity

+ * opacity + *

+ * @return bool + */ + public function setstrokealpha ($opacity) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the width of the stroke used to draw object outlines + * @link http://php.net/manual/en/function.imagickdraw-setstrokewidth.php + * @param float $stroke_width

+ * stroke width + *

+ * @return bool + */ + public function setstrokewidth ($stroke_width) {} + + /** + * (PECL imagick 2.0.0)
+ * Clears the ImagickDraw + * @link http://php.net/manual/en/function.imagickdraw-clear.php + * @return bool an ImagickDraw object. + */ + public function clear () {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a circle + * @link http://php.net/manual/en/function.imagickdraw-circle.php + * @param float $ox

+ * origin x coordinate + *

+ * @param float $oy

+ * origin y coordinate + *

+ * @param float $px

+ * perimeter x coordinate + *

+ * @param float $py

+ * perimeter y coordinate + *

+ * @return bool + */ + public function circle ($ox, $oy, $px, $py) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws text on the image + * @link http://php.net/manual/en/function.imagickdraw-annotation.php + * @param float $x

+ * The x coordinate where text is drawn + *

+ * @param float $y

+ * The y coordinate where text is drawn + *

+ * @param string $text

+ * The text to draw on the image + *

+ * @return bool + */ + public function annotation ($x, $y, $text) {} + + /** + * (PECL imagick 2.0.0)
+ * Controls whether text is antialiased + * @link http://php.net/manual/en/function.imagickdraw-settextantialias.php + * @param bool $antiAlias + * @return bool + */ + public function settextantialias ($antiAlias) {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies specifies the text code set + * @link http://php.net/manual/en/function.imagickdraw-settextencoding.php + * @param string $encoding

+ * the encoding name + *

+ * @return bool + */ + public function settextencoding ($encoding) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the fully-specified font to use when annotating with text + * @link http://php.net/manual/en/function.imagickdraw-setfont.php + * @param string $font_name + * @return bool &imagick.return.success; + */ + public function setfont ($font_name) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the font family to use when annotating with text + * @link http://php.net/manual/en/function.imagickdraw-setfontfamily.php + * @param string $font_family

+ * the font family + *

+ * @return bool &imagick.return.success; + */ + public function setfontfamily ($font_family) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the font pointsize to use when annotating with text + * @link http://php.net/manual/en/function.imagickdraw-setfontsize.php + * @param float $pointsize

+ * the point size + *

+ * @return bool + */ + public function setfontsize ($pointsize) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the font style to use when annotating with text + * @link http://php.net/manual/en/function.imagickdraw-setfontstyle.php + * @param int $style

+ * STYLETYPE_ constant + *

+ * @return bool + */ + public function setfontstyle ($style) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the font weight + * @link http://php.net/manual/en/function.imagickdraw-setfontweight.php + * @param int $font_weight + * @return bool + */ + public function setfontweight ($font_weight) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the font + * @link http://php.net/manual/en/function.imagickdraw-getfont.php + * @return string a string on success and false if no font is set. + */ + public function getfont () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the font family + * @link http://php.net/manual/en/function.imagickdraw-getfontfamily.php + * @return string the font family currently selected or false if font family is not set. + */ + public function getfontfamily () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the font pointsize + * @link http://php.net/manual/en/function.imagickdraw-getfontsize.php + * @return float the font size associated with the current ImagickDraw object. + */ + public function getfontsize () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the font style + * @link http://php.net/manual/en/function.imagickdraw-getfontstyle.php + * @return int the font style constant (STYLE_) associated with the ImagickDraw object + * or 0 if no style is set. + */ + public function getfontstyle () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the font weight + * @link http://php.net/manual/en/function.imagickdraw-getfontweight.php + * @return int an int on success and 0 if no weight is set. + */ + public function getfontweight () {} + + /** + * (PECL imagick 2.0.0)
+ * Frees all associated resources + * @link http://php.net/manual/en/function.imagickdraw-destroy.php + * @return bool + */ + public function destroy () {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a rectangle + * @link http://php.net/manual/en/function.imagickdraw-rectangle.php + * @param float $x1

+ * x coordinate of the top left corner + *

+ * @param float $y1

+ * y coordinate of the top left corner + *

+ * @param float $x2

+ * x coordinate of the bottom right corner + *

+ * @param float $y2

+ * y coordinate of the bottom right corner + *

+ * @return bool + */ + public function rectangle ($x1, $y1, $x2, $y2) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a rounded rectangle + * @link http://php.net/manual/en/function.imagickdraw-roundrectangle.php + * @param float $x1

+ * x coordinate of the top left corner + *

+ * @param float $y1

+ * y coordinate of the top left corner + *

+ * @param float $x2

+ * x coordinate of the bottom right + *

+ * @param float $y2

+ * y coordinate of the bottom right + *

+ * @param float $rx

+ * x rounding + *

+ * @param float $ry

+ * y rounding + *

+ * @return bool + */ + public function roundrectangle ($x1, $y1, $x2, $y2, $rx, $ry) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws an ellipse on the image + * @link http://php.net/manual/en/function.imagickdraw-ellipse.php + * @param float $ox + * @param float $oy + * @param float $rx + * @param float $ry + * @param float $start + * @param float $end + * @return bool + */ + public function ellipse ($ox, $oy, $rx, $ry, $start, $end) {} + + /** + * (PECL imagick 2.0.0)
+ * Skews the current coordinate system in the horizontal direction + * @link http://php.net/manual/en/function.imagickdraw-skewx.php + * @param float $degrees

+ * degrees to skew + *

+ * @return bool + */ + public function skewx ($degrees) {} + + /** + * (PECL imagick 2.0.0)
+ * Skews the current coordinate system in the vertical direction + * @link http://php.net/manual/en/function.imagickdraw-skewy.php + * @param float $degrees

+ * degrees to skew + *

+ * @return bool + */ + public function skewy ($degrees) {} + + /** + * (PECL imagick 2.0.0)
+ * Applies a translation to the current coordinate system + * @link http://php.net/manual/en/function.imagickdraw-translate.php + * @param float $x

+ * horizontal translation + *

+ * @param float $y

+ * vertical translation + *

+ * @return bool + */ + public function translate ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a line + * @link http://php.net/manual/en/function.imagickdraw-line.php + * @param float $sx

+ * starting x coordinate + *

+ * @param float $sy

+ * starting y coordinate + *

+ * @param float $ex

+ * ending x coordinate + *

+ * @param float $ey

+ * ending y coordinate + *

+ * @return bool + */ + public function line ($sx, $sy, $ex, $ey) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws an arc + * @link http://php.net/manual/en/function.imagickdraw-arc.php + * @param float $sx

+ * Starting x ordinate of bounding rectangle + *

+ * @param float $sy

+ * starting y ordinate of bounding rectangle + *

+ * @param float $ex

+ * ending x ordinate of bounding rectangle + *

+ * @param float $ey

+ * ending y ordinate of bounding rectangle + *

+ * @param float $sd

+ * starting degrees of rotation + *

+ * @param float $ed

+ * ending degrees of rotation + *

+ * @return bool + */ + public function arc ($sx, $sy, $ex, $ey, $sd, $ed) {} + + /** + * (PECL imagick 2.0.0)
+ * Paints on the image's opacity channel + * @link http://php.net/manual/en/function.imagickdraw-matte.php + * @param float $x

+ * x coordinate of the matte + *

+ * @param float $y

+ * y coordinate of the matte + *

+ * @param int $paintMethod

+ * PAINT_ constant + *

+ * @return bool true on success or false on failure. + */ + public function matte ($x, $y, $paintMethod) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a polygon + * @link http://php.net/manual/en/function.imagickdraw-polygon.php + * @param array $coordinates

+ * multidimensional array like array( array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 ) ); + *

+ * @return bool &imagick.return.success; + */ + public function polygon (array $coordinates) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a point + * @link http://php.net/manual/en/function.imagickdraw-point.php + * @param float $x

+ * point's x coordinate + *

+ * @param float $y

+ * point's y coordinate + *

+ * @return bool + */ + public function point ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the text decoration + * @link http://php.net/manual/en/function.imagickdraw-gettextdecoration.php + * @return int one of the DECORATION_ constants + * and 0 if no decoration is set. + */ + public function gettextdecoration () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the code set used for text annotations + * @link http://php.net/manual/en/function.imagickdraw-gettextencoding.php + * @return string a string specifying the code set + * or false if text encoding is not set. + */ + public function gettextencoding () {} + + public function getfontstretch () {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the font stretch to use when annotating with text + * @link http://php.net/manual/en/function.imagickdraw-setfontstretch.php + * @param int $fontStretch

+ * STRETCH_ constant + *

+ * @return bool + */ + public function setfontstretch ($fontStretch) {} + + /** + * (PECL imagick 2.0.0)
+ * Controls whether stroked outlines are antialiased + * @link http://php.net/manual/en/function.imagickdraw-setstrokeantialias.php + * @param bool $stroke_antialias

+ * the antialias setting + *

+ * @return bool + */ + public function setstrokeantialias ($stroke_antialias) {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies a text alignment + * @link http://php.net/manual/en/function.imagickdraw-settextalignment.php + * @param int $alignment

+ * ALIGN_ constant + *

+ * @return bool + */ + public function settextalignment ($alignment) {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies a decoration + * @link http://php.net/manual/en/function.imagickdraw-settextdecoration.php + * @param int $decoration

+ * DECORATION_ constant + *

+ * @return bool + */ + public function settextdecoration ($decoration) {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies the color of a background rectangle + * @link http://php.net/manual/en/function.imagickdraw-settextundercolor.php + * @param ImagickPixel $under_color

+ * the under color + *

+ * @return bool + */ + public function settextundercolor (ImagickPixel $under_color) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the overall canvas size + * @link http://php.net/manual/en/function.imagickdraw-setviewbox.php + * @param int $x1

+ * left x coordinate + *

+ * @param int $y1

+ * left y coordinate + *

+ * @param int $x2

+ * right x coordinate + *

+ * @param int $y2

+ * right y coordinate + *

+ * @return bool + */ + public function setviewbox ($x1, $y1, $x2, $y2) {} + + /** + * (PECL imagick 2.0.0)
+ * Adjusts the current affine transformation matrix + * @link http://php.net/manual/en/function.imagickdraw-affine.php + * @param array $affine

+ * Affine matrix parameters + *

+ * @return bool + */ + public function affine (array $affine) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a bezier curve + * @link http://php.net/manual/en/function.imagickdraw-bezier.php + * @param array $coordinates

+ * Multidimensional array like array( array( 'x' => 1, 'y' => 2 ), + * array( 'x' => 3, 'y' => 4 ) ) + *

+ * @return bool + */ + public function bezier (array $coordinates) {} + + /** + * (PECL imagick 2.0.0)
+ * Composites an image onto the current image + * @link http://php.net/manual/en/function.imagickdraw-composite.php + * @param int $compose

+ * composition operator. One of COMPOSITE_ constants + *

+ * @param float $x

+ * x coordinate of the top left corner + *

+ * @param float $y

+ * y coordinate of the top left corner + *

+ * @param float $width

+ * width of the composition image + *

+ * @param float $height

+ * height of the composition image + *

+ * @param Imagick $compositeWand

+ * the Imagick object where composition image is taken from + *

+ * @return bool &imagick.return.success; + */ + public function composite ($compose, $x, $y, $width, $height, Imagick $compositeWand) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws color on image + * @link http://php.net/manual/en/function.imagickdraw-color.php + * @param float $x

+ * x coordinate of the paint + *

+ * @param float $y

+ * y coordinate of the paint + *

+ * @param int $paintMethod

+ * one of the PAINT_ constants + *

+ * @return bool + */ + public function color ($x, $y, $paintMethod) {} + + /** + * (PECL imagick 2.0.0)
+ * Adds a comment + * @link http://php.net/manual/en/function.imagickdraw-comment.php + * @param string $comment

+ * The comment string to add to vector output stream + *

+ * @return bool + */ + public function comment ($comment) {} + + /** + * (PECL imagick 2.0.0)
+ * Obtains the current clipping path ID + * @link http://php.net/manual/en/function.imagickdraw-getclippath.php + * @return string a string containing the clip path ID or false if no clip path exists. + */ + public function getclippath () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the current polygon fill rule + * @link http://php.net/manual/en/function.imagickdraw-getcliprule.php + * @return int one of the FILLRULE_ constants. + */ + public function getcliprule () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the interpretation of clip path units + * @link http://php.net/manual/en/function.imagickdraw-getclipunits.php + * @return int an int on success. + */ + public function getclipunits () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the fill color + * @link http://php.net/manual/en/function.imagickdraw-getfillcolor.php + * @return ImagickPixel an ImagickPixel object. + */ + public function getfillcolor () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the opacity used when drawing + * @link http://php.net/manual/en/function.imagickdraw-getfillopacity.php + * @return float The opacity. + */ + public function getfillopacity () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the fill rule + * @link http://php.net/manual/en/function.imagickdraw-getfillrule.php + * @return int a FILLRULE_ constant + */ + public function getfillrule () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the text placement gravity + * @link http://php.net/manual/en/function.imagickdraw-getgravity.php + * @return int a GRAVITY_ constant on success and 0 if no gravity is set. + */ + public function getgravity () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the current stroke antialias setting + * @link http://php.net/manual/en/function.imagickdraw-getstrokeantialias.php + * @return bool true if antialiasing is on and false if it is off. + */ + public function getstrokeantialias () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the color used for stroking object outlines + * @link http://php.net/manual/en/function.imagickdraw-getstrokecolor.php + * @return ImagickPixel an ImagickPixel object which describes the color. + */ + public function getstrokecolor () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns an array representing the pattern of dashes and gaps used to stroke paths + * @link http://php.net/manual/en/function.imagickdraw-getstrokedasharray.php + * @return array an array on success and empty array if not set. + */ + public function getstrokedasharray () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the offset into the dash pattern to start the dash + * @link http://php.net/manual/en/function.imagickdraw-getstrokedashoffset.php + * @return float a float representing the offset and 0 if it's not set. + */ + public function getstrokedashoffset () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the shape to be used at the end of open subpaths when they are stroked + * @link http://php.net/manual/en/function.imagickdraw-getstrokelinecap.php + * @return int one of the LINECAP_ constants or 0 if stroke linecap is not set. + */ + public function getstrokelinecap () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the shape to be used at the corners of paths when they are stroked + * @link http://php.net/manual/en/function.imagickdraw-getstrokelinejoin.php + * @return int one of the LINEJOIN_ constants or 0 if stroke line join is not set. + */ + public function getstrokelinejoin () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the stroke miter limit + * @link http://php.net/manual/en/function.imagickdraw-getstrokemiterlimit.php + * @return int an int describing the miter limit + * and 0 if no miter limit is set. + */ + public function getstrokemiterlimit () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the opacity of stroked object outlines + * @link http://php.net/manual/en/function.imagickdraw-getstrokeopacity.php + * @return float a double describing the opacity. + */ + public function getstrokeopacity () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the width of the stroke used to draw object outlines + * @link http://php.net/manual/en/function.imagickdraw-getstrokewidth.php + * @return float a double describing the stroke width. + */ + public function getstrokewidth () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the text alignment + * @link http://php.net/manual/en/function.imagickdraw-gettextalignment.php + * @return int one of the ALIGN_ constants and 0 if no align is set. + */ + public function gettextalignment () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the current text antialias setting + * @link http://php.net/manual/en/function.imagickdraw-gettextantialias.php + * @return bool true if text is antialiased and false if not. + */ + public function gettextantialias () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns a string containing vector graphics + * @link http://php.net/manual/en/function.imagickdraw-getvectorgraphics.php + * @return string a string containing the vector graphics. + */ + public function getvectorgraphics () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the text under color + * @link http://php.net/manual/en/function.imagickdraw-gettextundercolor.php + * @return ImagickPixel an ImagickPixel object describing the color. + */ + public function gettextundercolor () {} + + /** + * (PECL imagick 2.0.0)
+ * Adds a path element to the current path + * @link http://php.net/manual/en/function.imagickdraw-pathclose.php + * @return bool + */ + public function pathclose () {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a cubic Bezier curve + * @link http://php.net/manual/en/function.imagickdraw-pathcurvetoabsolute.php + * @param float $x1

+ * x coordinate of the first control point + *

+ * @param float $y1

+ * y coordinate of the first control point + *

+ * @param float $x2

+ * x coordinate of the second control point + *

+ * @param float $y2

+ * y coordinate of the first control point + *

+ * @param float $x

+ * x coordinate of the curve end + *

+ * @param float $y

+ * y coordinate of the curve end + *

+ * @return bool + */ + public function pathcurvetoabsolute ($x1, $y1, $x2, $y2, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a cubic Bezier curve + * @link http://php.net/manual/en/function.imagickdraw-pathcurvetorelative.php + * @param float $x1

+ * x coordinate of starting control point + *

+ * @param float $y1

+ * y coordinate of starting control point + *

+ * @param float $x2

+ * x coordinate of ending control point + *

+ * @param float $y2

+ * y coordinate of ending control point + *

+ * @param float $x

+ * ending x coordinate + *

+ * @param float $y

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetorelative ($x1, $y1, $x2, $y2, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a quadratic Bezier curve + * @link http://php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbezierabsolute.php + * @param float $x1

+ * x coordinate of the control point + *

+ * @param float $y1

+ * y coordinate of the control point + *

+ * @param float $x

+ * x coordinate of the end point + *

+ * @param float $y

+ * y coordinate of the end point + *

+ * @return bool + */ + public function pathcurvetoquadraticbezierabsolute ($x1, $y1, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a quadratic Bezier curve + * @link http://php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbezierrelative.php + * @param float $x1

+ * starting x coordinate + *

+ * @param float $y1

+ * starting y coordinate + *

+ * @param float $x

+ * ending x coordinate + *

+ * @param float $y

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetoquadraticbezierrelative ($x1, $y1, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a quadratic Bezier curve + * @link http://php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbeziersmoothabsolute.php + * @param float $x

+ * ending x coordinate + *

+ * @param float $y

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetoquadraticbeziersmoothabsolute ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a quadratic Bezier curve + * @link http://php.net/manual/en/function.imagickdraw-pathcurvetoquadraticbeziersmoothrelative.php + * @param float $x

+ * ending x coordinate + *

+ * @param float $y

+ * ending y coordinate + *

+ * @return bool + */ + public function pathcurvetoquadraticbeziersmoothrelative ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a cubic Bezier curve + * @link http://php.net/manual/en/function.imagickdraw-pathcurvetosmoothabsolute.php + * @param float $x2

+ * x coordinate of the second control point + *

+ * @param float $y2

+ * y coordinate of the second control point + *

+ * @param float $x

+ * x coordinate of the ending point + *

+ * @param float $y

+ * y coordinate of the ending point + *

+ * @return bool + */ + public function pathcurvetosmoothabsolute ($x2, $y2, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a cubic Bezier curve + * @link http://php.net/manual/en/function.imagickdraw-pathcurvetosmoothrelative.php + * @param float $x2

+ * x coordinate of the second control point + *

+ * @param float $y2

+ * y coordinate of the second control point + *

+ * @param float $x

+ * x coordinate of the ending point + *

+ * @param float $y

+ * y coordinate of the ending point + *

+ * @return bool + */ + public function pathcurvetosmoothrelative ($x2, $y2, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws an elliptical arc + * @link http://php.net/manual/en/function.imagickdraw-pathellipticarcabsolute.php + * @param float $rx

+ * x radius + *

+ * @param float $ry

+ * y radius + *

+ * @param float $x_axis_rotation

+ * x axis rotation + *

+ * @param bool $large_arc_flag

+ * large arc flag + *

+ * @param bool $sweep_flag

+ * sweep flag + *

+ * @param float $x

+ * x coordinate + *

+ * @param float $y

+ * y coordinate + *

+ * @return bool + */ + public function pathellipticarcabsolute ($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws an elliptical arc + * @link http://php.net/manual/en/function.imagickdraw-pathellipticarcrelative.php + * @param float $rx

+ * x radius + *

+ * @param float $ry

+ * y radius + *

+ * @param float $x_axis_rotation

+ * x axis rotation + *

+ * @param bool $large_arc_flag

+ * large arc flag + *

+ * @param bool $sweep_flag

+ * sweep flag + *

+ * @param float $x

+ * x coordinate + *

+ * @param float $y

+ * y coordinate + *

+ * @return bool + */ + public function pathellipticarcrelative ($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Terminates the current path + * @link http://php.net/manual/en/function.imagickdraw-pathfinish.php + * @return bool + */ + public function pathfinish () {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a line path + * @link http://php.net/manual/en/function.imagickdraw-pathlinetoabsolute.php + * @param float $x

+ * starting x coordinate + *

+ * @param float $y

+ * ending x coordinate + *

+ * @return bool + */ + public function pathlinetoabsolute ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a line path + * @link http://php.net/manual/en/function.imagickdraw-pathlinetorelative.php + * @param float $x

+ * starting x coordinate + *

+ * @param float $y

+ * starting y coordinate + *

+ * @return bool + */ + public function pathlinetorelative ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a horizontal line path + * @link http://php.net/manual/en/function.imagickdraw-pathlinetohorizontalabsolute.php + * @param float $x

+ * x coordinate + *

+ * @return bool + */ + public function pathlinetohorizontalabsolute ($x) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a horizontal line + * @link http://php.net/manual/en/function.imagickdraw-pathlinetohorizontalrelative.php + * @param float $x

+ * x coordinate + *

+ * @return bool + */ + public function pathlinetohorizontalrelative ($x) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a vertical line + * @link http://php.net/manual/en/function.imagickdraw-pathlinetoverticalabsolute.php + * @param float $y

+ * y coordinate + *

+ * @return bool + */ + public function pathlinetoverticalabsolute ($y) {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a vertical line path + * @link http://php.net/manual/en/function.imagickdraw-pathlinetoverticalrelative.php + * @param float $y

+ * y coordinate + *

+ * @return bool + */ + public function pathlinetoverticalrelative ($y) {} + + /** + * (PECL imagick 2.0.0)
+ * Starts a new sub-path + * @link http://php.net/manual/en/function.imagickdraw-pathmovetoabsolute.php + * @param float $x

+ * x coordinate of the starting point + *

+ * @param float $y

+ * y coordinate of the starting point + *

+ * @return bool + */ + public function pathmovetoabsolute ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Starts a new sub-path + * @link http://php.net/manual/en/function.imagickdraw-pathmovetorelative.php + * @param float $x

+ * target x coordinate + *

+ * @param float $y

+ * target y coordinate + *

+ * @return bool + */ + public function pathmovetorelative ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Declares the start of a path drawing list + * @link http://php.net/manual/en/function.imagickdraw-pathstart.php + * @return bool + */ + public function pathstart () {} + + /** + * (PECL imagick 2.0.0)
+ * Draws a polyline + * @link http://php.net/manual/en/function.imagickdraw-polyline.php + * @param array $coordinates

+ * array of x and y coordinates: array( array( 'x' => 4, 'y' => 6 ), array( 'x' => 8, 'y' => 10 ) ) + *

+ * @return bool &imagick.return.success; + */ + public function polyline (array $coordinates) {} + + /** + * (PECL imagick 2.0.0)
+ * Terminates a clip path definition + * @link http://php.net/manual/en/function.imagickdraw-popclippath.php + * @return bool + */ + public function popclippath () {} + + /** + * (PECL imagick 2.0.0)
+ * Terminates a definition list + * @link http://php.net/manual/en/function.imagickdraw-popdefs.php + * @return bool + */ + public function popdefs () {} + + /** + * (PECL imagick 2.0.0)
+ * Terminates a pattern definition + * @link http://php.net/manual/en/function.imagickdraw-poppattern.php + * @return bool true on success or false on failure. + */ + public function poppattern () {} + + /** + * (PECL imagick 2.0.0)
+ * Starts a clip path definition + * @link http://php.net/manual/en/function.imagickdraw-pushclippath.php + * @param string $clip_mask_id

+ * Clip mask Id + *

+ * @return bool + */ + public function pushclippath ($clip_mask_id) {} + + /** + * (PECL imagick 2.0.0)
+ * Indicates that following commands create named elements for early processing + * @link http://php.net/manual/en/function.imagickdraw-pushdefs.php + * @return bool + */ + public function pushdefs () {} + + /** + * (PECL imagick 2.0.0)
+ * Indicates that subsequent commands up to a ImagickDraw::opPattern() command comprise the definition of a named pattern + * @link http://php.net/manual/en/function.imagickdraw-pushpattern.php + * @param string $pattern_id

+ * the pattern Id + *

+ * @param float $x

+ * x coordinate of the top-left corner + *

+ * @param float $y

+ * y coordinate of the top-left corner + *

+ * @param float $width

+ * width of the pattern + *

+ * @param float $height

+ * height of the pattern + *

+ * @return bool true on success or false on failure. + */ + public function pushpattern ($pattern_id, $x, $y, $width, $height) {} + + /** + * (PECL imagick 2.0.0)
+ * Renders all preceding drawing commands onto the image + * @link http://php.net/manual/en/function.imagickdraw-render.php + * @return bool true on success or false on failure. + */ + public function render () {} + + /** + * (PECL imagick 2.0.0)
+ * Applies the specified rotation to the current coordinate space + * @link http://php.net/manual/en/function.imagickdraw-rotate.php + * @param float $degrees

+ * degrees to rotate + *

+ * @return bool + */ + public function rotate ($degrees) {} + + /** + * (PECL imagick 2.0.0)
+ * Adjusts the scaling factor + * @link http://php.net/manual/en/function.imagickdraw-scale.php + * @param float $x

+ * horizontal factor + *

+ * @param float $y

+ * vertical factor + *

+ * @return bool + */ + public function scale ($x, $y) {} + + /** + * (PECL imagick 2.0.0)
+ * Associates a named clipping path with the image + * @link http://php.net/manual/en/function.imagickdraw-setclippath.php + * @param string $clip_mask

+ * the clipping path name + *

+ * @return bool + */ + public function setclippath ($clip_mask) {} + + /** + * (PECL imagick 2.0.0)
+ * Set the polygon fill rule to be used by the clipping path + * @link http://php.net/manual/en/function.imagickdraw-setcliprule.php + * @param int $fill_rule

+ * FILLRULE_ constant + *

+ * @return bool + */ + public function setcliprule ($fill_rule) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the interpretation of clip path units + * @link http://php.net/manual/en/function.imagickdraw-setclipunits.php + * @param int $clip_units

+ * the number of clip units + *

+ * @return bool + */ + public function setclipunits ($clip_units) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the opacity to use when drawing using the fill color or fill texture + * @link http://php.net/manual/en/function.imagickdraw-setfillopacity.php + * @param float $fillOpacity

+ * the fill opacity + *

+ * @return bool + */ + public function setfillopacity ($fillOpacity) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the URL to use as a fill pattern for filling objects + * @link http://php.net/manual/en/function.imagickdraw-setfillpatternurl.php + * @param string $fill_url

+ * URL to use to obtain fill pattern. + *

+ * @return bool true on success or false on failure. + */ + public function setfillpatternurl ($fill_url) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the fill rule to use while drawing polygons + * @link http://php.net/manual/en/function.imagickdraw-setfillrule.php + * @param int $fill_rule

+ * FILLRULE_ constant + *

+ * @return bool + */ + public function setfillrule ($fill_rule) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the text placement gravity + * @link http://php.net/manual/en/function.imagickdraw-setgravity.php + * @param int $gravity

+ * GRAVITY_ constant + *

+ * @return bool + */ + public function setgravity ($gravity) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the pattern used for stroking object outlines + * @link http://php.net/manual/en/function.imagickdraw-setstrokepatternurl.php + * @param string $stroke_url

+ * stroke URL + *

+ * @return bool imagick.imagickdraw.return.success; + */ + public function setstrokepatternurl ($stroke_url) {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies the offset into the dash pattern to start the dash + * @link http://php.net/manual/en/function.imagickdraw-setstrokedashoffset.php + * @param float $dash_offset

+ * dash offset + *

+ * @return bool + */ + public function setstrokedashoffset ($dash_offset) {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies the shape to be used at the end of open subpaths when they are stroked + * @link http://php.net/manual/en/function.imagickdraw-setstrokelinecap.php + * @param int $linecap

+ * LINECAP_ constant + *

+ * @return bool + */ + public function setstrokelinecap ($linecap) {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies the shape to be used at the corners of paths when they are stroked + * @link http://php.net/manual/en/function.imagickdraw-setstrokelinejoin.php + * @param int $linejoin

+ * LINEJOIN_ constant + *

+ * @return bool + */ + public function setstrokelinejoin ($linejoin) {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies the miter limit + * @link http://php.net/manual/en/function.imagickdraw-setstrokemiterlimit.php + * @param int $miterlimit

+ * the miter limit + *

+ * @return bool + */ + public function setstrokemiterlimit ($miterlimit) {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies the opacity of stroked object outlines + * @link http://php.net/manual/en/function.imagickdraw-setstrokeopacity.php + * @param float $stroke_opacity

+ * stroke opacity. 1.0 is fully opaque + *

+ * @return bool + */ + public function setstrokeopacity ($stroke_opacity) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the vector graphics + * @link http://php.net/manual/en/function.imagickdraw-setvectorgraphics.php + * @param string $xml

+ * xml containing the vector graphics + *

+ * @return bool true on success or false on failure. + */ + public function setvectorgraphics ($xml) {} + + /** + * (PECL imagick 2.0.0)
+ * Destroys the current ImagickDraw in the stack, and returns to the previously pushed ImagickDraw + * @link http://php.net/manual/en/function.imagickdraw-pop.php + * @return bool true on success and false on failure. + */ + public function pop () {} + + /** + * (PECL imagick 2.0.0)
+ * Clones the current ImagickDraw and pushes it to the stack + * @link http://php.net/manual/en/function.imagickdraw-push.php + * @return bool true on success or false on failure. + */ + public function push () {} + + /** + * (PECL imagick 2.0.0)
+ * Specifies the pattern of dashes and gaps used to stroke paths + * @link http://php.net/manual/en/function.imagickdraw-setstrokedasharray.php + * @param array $dashArray

+ * array of floats + *

+ * @return bool &imagick.return.success; + */ + public function setstrokedasharray (array $dashArray) {} + +} + +/** + * @link http://php.net/manual/en/class.imagickpixeliterator.php + * @jms-builtin + */ +class ImagickPixelIterator implements Iterator, Traversable { + + /** + * (PECL imagick 2.0.0)
+ * The ImagickPixelIterator constructor + * @link http://php.net/manual/en/function.imagickpixeliterator-construct.php + * @param Imagick $wand + */ + public function __construct (Imagick $wand) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns a new pixel iterator + * @link http://php.net/manual/en/function.imagickpixeliterator-newpixeliterator.php + * @param Imagick $wand + * @return bool &imagick.return.success; Throwing ImagickPixelIteratorException. + */ + public function newpixeliterator (Imagick $wand) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns a new pixel iterator + * @link http://php.net/manual/en/function.imagickpixeliterator-newpixelregioniterator.php + * @param Imagick $wand + * @param int $x + * @param int $y + * @param int $columns + * @param int $rows + * @return bool a new ImagickPixelIterator on success; on failure, throws + * ImagickPixelIteratorException. + */ + public function newpixelregioniterator (Imagick $wand, $x, $y, $columns, $rows) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the current pixel iterator row + * @link http://php.net/manual/en/function.imagickpixeliterator-getiteratorrow.php + * @return int the integer offset of the row, throwing + * ImagickPixelIteratorException on error. + */ + public function getiteratorrow () {} + + /** + * (PECL imagick 2.0.0)
+ * Set the pixel iterator row + * @link http://php.net/manual/en/function.imagickpixeliterator-setiteratorrow.php + * @param int $row + * @return bool &imagick.return.success; + */ + public function setiteratorrow ($row) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the pixel iterator to the first pixel row + * @link http://php.net/manual/en/function.imagickpixeliterator-setiteratorfirstrow.php + * @return bool &imagick.return.success; + */ + public function setiteratorfirstrow () {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the pixel iterator to the last pixel row + * @link http://php.net/manual/en/function.imagickpixeliterator-setiteratorlastrow.php + * @return bool &imagick.return.success; + */ + public function setiteratorlastrow () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the previous row + * @link http://php.net/manual/en/function.imagickpixeliterator-getpreviousiteratorrow.php + * @return array the previous row as an array of ImagickPixelWand objects from the + * ImagickPixelIterator, throwing ImagickPixelIteratorException on error. + */ + public function getpreviousiteratorrow () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the current row of ImagickPixel objects + * @link http://php.net/manual/en/function.imagickpixeliterator-getcurrentiteratorrow.php + * @return array a row as an array of ImagickPixel objects that can themselves be iterated. + */ + public function getcurrentiteratorrow () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the next row of the pixel iterator + * @link http://php.net/manual/en/function.imagickpixeliterator-getnextiteratorrow.php + * @return array the next row as an array of ImagickPixel objects, throwing + * ImagickPixelIteratorException on error. + */ + public function getnextiteratorrow () {} + + /** + * (PECL imagick 2.0.0)
+ * Resets the pixel iterator + * @link http://php.net/manual/en/function.imagickpixeliterator-resetiterator.php + * @return bool &imagick.return.success; + */ + public function resetiterator () {} + + /** + * (PECL imagick 2.0.0)
+ * Syncs the pixel iterator + * @link http://php.net/manual/en/function.imagickpixeliterator-synciterator.php + * @return bool &imagick.return.success; + */ + public function synciterator () {} + + /** + * (PECL imagick 2.0.0)
+ * Deallocates resources associated with a PixelIterator + * @link http://php.net/manual/en/function.imagickpixeliterator-destroy.php + * @return bool &imagick.return.success; + */ + public function destroy () {} + + /** + * (PECL imagick 2.0.0)
+ * Clear resources associated with a PixelIterator + * @link http://php.net/manual/en/function.imagickpixeliterator-clear.php + * @return bool &imagick.return.success; + */ + public function clear () {} + + public function key () {} + + public function next () {} + + public function rewind () {} + + public function current () {} + + public function valid () {} + +} + +/** + * @link http://php.net/manual/en/class.imagickpixel.php + * @jms-builtin + */ +class ImagickPixel { + + /** + * (PECL imagick 2.0.0)
+ * Returns the normalized HSL color of the ImagickPixel object + * @link http://php.net/manual/en/function.imagickpixel-gethsl.php + * @return array the HSL value in an array with the keys "hue", + * "saturation", and "luminosity". Throws ImagickPixelException on failure. + */ + public function gethsl () {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the normalized HSL color + * @link http://php.net/manual/en/function.imagickpixel-sethsl.php + * @param float $hue

+ * The normalized value for hue, described as a fractional arc + * (between 0 and 1) of the hue circle, where the zero value is + * red. + *

+ * @param float $saturation

+ * The normalized value for saturation, with 1 as full saturation. + *

+ * @param float $luminosity

+ * The normalized value for luminosity, on a scale from black at + * 0 to white at 1, with the full HS value at 0.5 luminosity. + *

+ * @return bool &imagick.return.success; + */ + public function sethsl ($hue, $saturation, $luminosity) {} + + public function getcolorvaluequantum () {} + + /** + * @param $color_value + */ + public function setcolorvaluequantum ($color_value) {} + + public function getindex () {} + + /** + * @param $index + */ + public function setindex ($index) {} + + /** + * (PECL imagick 2.0.0)
+ * The ImagickPixel constructor + * @link http://php.net/manual/en/function.imagickpixel-construct.php + * @param string $color [optional]

+ * The optional color string to use as the initial value of this object. + *

+ */ + public function __construct ($color = null) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the color + * @link http://php.net/manual/en/function.imagickpixel-setcolor.php + * @param string $color

+ * The color definition to use in order to initialise the + * ImagickPixel object. + *

+ * @return bool true if the specified color was set, false otherwise. + */ + public function setcolor ($color) {} + + /** + * (PECL imagick 2.0.0)
+ * Sets the normalized value of one of the channels + * @link http://php.net/manual/en/function.imagickpixel-setcolorvalue.php + * @param int $color

+ * One of the Imagick channel color constants. + *

+ * @param float $value

+ * The value to set this channel to, ranging from 0 to 1. + *

+ * @return bool &imagick.return.success; + */ + public function setcolorvalue ($color, $value) {} + + /** + * (PECL imagick 2.0.0)
+ * Gets the normalized value of the provided color channel + * @link http://php.net/manual/en/function.imagickpixel-getcolorvalue.php + * @param int $color

+ * The channel to check, specified as one of the Imagick channel constants. + *

+ * @return float The value of the channel, as a normalized floating-point number, throwing + * ImagickPixelException on error. + */ + public function getcolorvalue ($color) {} + + /** + * (PECL imagick 2.0.0)
+ * Clears resources associated with this object + * @link http://php.net/manual/en/function.imagickpixel-clear.php + * @return bool &imagick.return.success; + */ + public function clear () {} + + /** + * (PECL imagick 2.0.0)
+ * Deallocates resources associated with this object + * @link http://php.net/manual/en/function.imagickpixel-destroy.php + * @return bool &imagick.return.success; + */ + public function destroy () {} + + /** + * (PECL imagick 2.0.0)
+ * Check the distance between this color and another + * @link http://php.net/manual/en/function.imagickpixel-issimilar.php + * @param ImagickPixel $color

+ * The ImagickPixel object to compare this object against. + *

+ * @param float $fuzz

+ * The maximum distance within which to consider these colors as similar. + * The theoretical maximum for this value is the square root of three + * (1.732). + *

+ * @return bool &imagick.return.success; + */ + public function issimilar (ImagickPixel $color, $fuzz) {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the color + * @link http://php.net/manual/en/function.imagickpixel-getcolor.php + * @param bool $normalized [optional]

+ * Normalize the color values + *

+ * @return array An array of channel values, each normalized if true is given as param. Throws + * ImagickPixelException on error. + */ + public function getcolor ($normalized = false) {} + + /** + * (PECL imagick 2.1.0)
+ * Returns the color as a string + * @link http://php.net/manual/en/function.imagickpixel-getcolorasstring.php + * @return string the color of the ImagickPixel object as a string. + */ + public function getcolorasstring () {} + + /** + * (PECL imagick 2.0.0)
+ * Returns the color count associated with this color + * @link http://php.net/manual/en/function.imagickpixel-getcolorcount.php + * @return int the color count as an integer on success, throws + * ImagickPixelException on failure. + */ + public function getcolorcount () {} + + /** + * @param $colorCount + */ + public function setcolorcount ($colorCount) {} + +} +// End of imagick v.3.0.1 +?> diff --git a/res/php-5.4-core-api/imap.php b/res/php-5.4-core-api/imap.php new file mode 100644 index 0000000..d1e2d48 --- /dev/null +++ b/res/php-5.4-core-api/imap.php @@ -0,0 +1,1799 @@ + + * Open an IMAP stream to a mailbox + * @link http://php.net/manual/en/function.imap-open.php + * @param string $mailbox

+ * A mailbox name consists of a server and a mailbox path on this server. + * The special name INBOX stands for the current users + * personal mailbox. Mailbox names that contain international characters + * besides those in the printable ASCII space have to be encoded width + * imap_utf7_encode. + *

+ *

+ * The server part, which is enclosed in '{' and '}', consists of the servers + * name or ip address, an optional port (prefixed by ':'), and an optional + * protocol specification (prefixed by '/'). + *

+ *

+ * The server part is mandatory in all mailbox + * parameters. + *

+ *

+ * All names which start with { are remote names, and are + * in the form "{" remote_system_name [":" port] [flags] "}" + * [mailbox_name] where: + * remote_system_name - Internet domain name or + * bracketed IP address of server. + * @param string $username

+ * The user name + *

+ * @param string $password

+ * The password associated with the username + *

+ * @param int $options [optional]

+ * The options are a bit mask with one or more of + * the following: + * OP_READONLY - Open mailbox read-only + * @param int $n_retries [optional]

+ * Number of maximum connect attempts + *

+ * @param array $params [optional]

+ * Connection parameters, the following (string) keys maybe used + * to set one or more connection parameters: + * DISABLE_AUTHENTICATOR - Disable authentication properties + * @return resource an IMAP stream on success or FALSE on error. + * @jms-builtin + */ +function imap_open ($mailbox, $username, $password, $options = 'NIL', $n_retries = 0, array $params = null) {} + +/** + * (PHP 4, PHP 5)
+ * Reopen IMAP stream to new mailbox + * @link http://php.net/manual/en/function.imap-reopen.php + * @param resource $imap_stream + * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @param int $options [optional]

+ * The options are a bit mask with one or more of + * the following: + * OP_READONLY - Open mailbox read-only + * @param int $n_retries [optional]

+ * Number of maximum connect attempts + *

+ * @return bool TRUE if the stream is reopened, FALSE otherwise. + * @jms-builtin + */ +function imap_reopen ($imap_stream, $mailbox, $options = 0, $n_retries = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Close an IMAP stream + * @link http://php.net/manual/en/function.imap-close.php + * @param resource $imap_stream + * @param int $flag [optional]

+ * If set to CL_EXPUNGE, the function will silently + * expunge the mailbox before closing, removing all messages marked for + * deletion. You can achieve the same thing by using + * imap_expunge + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_close ($imap_stream, $flag = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the number of messages in the current mailbox + * @link http://php.net/manual/en/function.imap-num-msg.php + * @param resource $imap_stream + * @return int Return the number of messages in the current mailbox, as an integer. + * @jms-builtin + */ +function imap_num_msg ($imap_stream) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the number of recent messages in current mailbox + * @link http://php.net/manual/en/function.imap-num-recent.php + * @param resource $imap_stream + * @return int the number of recent messages in the current mailbox, as an + * integer. + * @jms-builtin + */ +function imap_num_recent ($imap_stream) {} + +/** + * (PHP 4, PHP 5)
+ * Returns headers for all messages in a mailbox + * @link http://php.net/manual/en/function.imap-headers.php + * @param resource $imap_stream + * @return array an array of string formatted with header info. One + * element per mail message. + * @jms-builtin + */ +function imap_headers ($imap_stream) {} + +/** + * (PHP 4, PHP 5)
+ * Read the header of the message + * @link http://php.net/manual/en/function.imap-headerinfo.php + * @param resource $imap_stream + * @param int $msg_number

+ * The message number + *

+ * @param int $fromlength [optional]

+ * Number of characters for the fetchfrom property. + * Must be greater than or equal to zero. + *

+ * @param int $subjectlength [optional]

+ * Number of characters for the fetchsubject property + * Must be greater than or equal to zero. + *

+ * @param string $defaulthost [optional] + * @return object the information in an object with following properties: + * toaddress - full to: line, up to 1024 characters + * to - an array of objects from the To: line, with the following + * properties: personal, adl, + * mailbox, and host + * fromaddress - full from: line, up to 1024 characters + * from - an array of objects from the From: line, with the following + * properties: personal, adl, + * mailbox, and host + * ccaddress - full cc: line, up to 1024 characters + * cc - an array of objects from the Cc: line, with the following + * properties: personal, adl, + * mailbox, and host + * bccaddress - full bcc: line, up to 1024 characters + * bcc - an array of objects from the Bcc: line, with the following + * properties: personal, adl, + * mailbox, and host + * reply_toaddress - full Reply-To: line, up to 1024 characters + * reply_to - an array of objects from the Reply-To: line, with the following + * properties: personal, adl, + * mailbox, and host + * senderaddress - full sender: line, up to 1024 characters + * sender - an array of objects from the Sender: line, with the following + * properties: personal, adl, + * mailbox, and host + * return_pathaddress - full Return-Path: line, up to 1024 characters + * return_path - an array of objects from the Return-Path: line, with the + * following properties: personal, + * adl, mailbox, and + * host + * remail - + * date - The message date as found in its headers + * Date - Same as date + * subject - The message subject + * Subject - Same a subject + * in_reply_to - + * message_id - + * newsgroups - + * followup_to - + * references - + * Recent - R if recent and seen, N + * if recent and not seen, ' ' if not recent. + * Unseen - U if not seen AND not recent, ' ' if seen + * OR not seen and recent + * Flagged - F if flagged, ' ' if not flagged + * Answered - A if answered, ' ' if unanswered + * Deleted - D if deleted, ' ' if not deleted + * Draft - X if draft, ' ' if not draft + * Msgno - The message number + * MailDate - + * Size - The message size + * udate - mail message date in Unix time + * fetchfrom - from line formatted to fit fromlength + * characters + * fetchsubject - subject line formatted to fit + * subjectlength characters + * @jms-builtin + */ +function imap_headerinfo ($imap_stream, $msg_number, $fromlength = 0, $subjectlength = 0, $defaulthost = null) {} + +/** + * (PHP 4, PHP 5)
+ * Parse mail headers from a string + * @link http://php.net/manual/en/function.imap-rfc822-parse-headers.php + * @param string $headers

+ * The parsed headers data + *

+ * @param string $defaulthost [optional]

+ * The default host name + *

+ * @return object an object similar to the one returned by + * imap_header, except for the flags and other + * properties that come from the IMAP server. + * @jms-builtin + */ +function imap_rfc822_parse_headers ($headers, $defaulthost = "UNKNOWN") {} + +/** + * (PHP 4, PHP 5)
+ * Returns a properly formatted email address given the mailbox, host, and personal info + * @link http://php.net/manual/en/function.imap-rfc822-write-address.php + * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @param string $host

+ * The email host part + *

+ * @param string $personal

+ * The name of the account owner + *

+ * @return string a string properly formatted email address as defined in RFC2822. + * @jms-builtin + */ +function imap_rfc822_write_address ($mailbox, $host, $personal) {} + +/** + * (PHP 4, PHP 5)
+ * Parses an address string + * @link http://php.net/manual/en/function.imap-rfc822-parse-adrlist.php + * @param string $address

+ * A string containing addresses + *

+ * @param string $default_host

+ * The default host name + *

+ * @return array an array of objects. The objects properties are: + *

+ *

+ * mailbox - the mailbox name (username) + * host - the host name + * personal - the personal name + * adl - at domain source route + * @jms-builtin + */ +function imap_rfc822_parse_adrlist ($address, $default_host) {} + +/** + * (PHP 4, PHP 5)
+ * Read the message body + * @link http://php.net/manual/en/function.imap-body.php + * @param resource $imap_stream + * @param int $msg_number

+ * The message number + *

+ * @param int $options [optional]

+ * The optional options are a bit mask + * with one or more of the following: + * FT_UID - The msg_number is a UID + * @return string the body of the specified message, as a string. + * @jms-builtin + */ +function imap_body ($imap_stream, $msg_number, $options = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Read the structure of a specified body section of a specific message + * @link http://php.net/manual/en/function.imap-bodystruct.php + * @param resource $imap_stream + * @param int $msg_number

+ * The message number + *

+ * @param string $section

+ * The body section to read + *

+ * @return object the information in an object, for a detailed description + * of the object structure and properties see + * imap_fetchstructure. + * @jms-builtin + */ +function imap_bodystruct ($imap_stream, $msg_number, $section) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch a particular section of the body of the message + * @link http://php.net/manual/en/function.imap-fetchbody.php + * @param resource $imap_stream + * @param int $msg_number

+ * The message number + *

+ * @param string $section

+ * The part number. It is a string of integers delimited by period which + * index into a body part list as per the IMAP4 specification + *

+ * @param int $options [optional]

+ * A bitmask with one or more of the following: + * FT_UID - The msg_number is a UID + * @return string a particular section of the body of the specified messages as a + * text string. + * @jms-builtin + */ +function imap_fetchbody ($imap_stream, $msg_number, $section, $options = 0) {} + +/** + * (PHP 5 >= 5.3.6)
+ * Fetch MIME headers for a particular section of the message + * @link http://php.net/manual/en/function.imap-fetchmime.php + * @param resource $imap_stream + * @param int $msg_number

+ * The message number + *

+ * @param string $section

+ * The part number. It is a string of integers delimited by period which + * index into a body part list as per the IMAP4 specification + *

+ * @param int $options [optional]

+ * A bitmask with one or more of the following: + * FT_UID - The msg_number is a UID + * @return string the MIME headers of a particular section of the body of the specified messages as a + * text string. + * @jms-builtin + */ +function imap_fetchmime ($imap_stream, $msg_number, $section, $options = 0) {} + +/** + * (PHP 5 >= 5.1.3)
+ * Save a specific body section to a file + * @link http://php.net/manual/en/function.imap-savebody.php + * @param resource $imap_stream + * @param mixed $file

+ * The path to the saved file as a string, or a valid file descriptor + * returned by fopen. + *

+ * @param int $msg_number

+ * The message number + *

+ * @param string $part_number [optional]

+ * The part number. It is a string of integers delimited by period which + * index into a body part list as per the IMAP4 specification + *

+ * @param int $options [optional]

+ * A bitmask with one or more of the following: + * FT_UID - The msg_number is a UID + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_savebody ($imap_stream, $file, $msg_number, $part_number = "", $options = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Returns header for a message + * @link http://php.net/manual/en/function.imap-fetchheader.php + * @param resource $imap_stream + * @param int $msg_number

+ * The message number + *

+ * @param int $options [optional]

+ * The possible options are: + * FT_UID - The msgno + * argument is a UID + * @return string the header of the specified message as a text string. + * @jms-builtin + */ +function imap_fetchheader ($imap_stream, $msg_number, $options = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Read the structure of a particular message + * @link http://php.net/manual/en/function.imap-fetchstructure.php + * @param resource $imap_stream + * @param int $msg_number

+ * The message number + *

+ * @param int $options [optional]

+ * This optional parameter only has a single option, + * FT_UID, which tells the function to treat the + * msg_number argument as a + * UID. + *

+ * @return object an object includes the envelope, internal date, size, flags and + * body structure along with a similar object for each mime attachment. The + * structure of the returned objects is as follows: + *

+ *

+ * + * Returned Objects for imap_fetchstructure + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
typePrimary body type
encodingBody transfer encoding
ifsubtypeTRUE if there is a subtype string
subtypeMIME subtype
ifdescriptionTRUE if there is a description string
descriptionContent description string
ifidTRUE if there is an identification string
idIdentification string
linesNumber of lines
bytesNumber of bytes
ifdispositionTRUE if there is a disposition string
dispositionDisposition string
ifdparametersTRUE if the dparameters array exists
dparametersAn array of objects where each object has an + * "attribute" and a "value" + * property corresponding to the parameters on the + * Content-disposition MIME + * header.
ifparametersTRUE if the parameters array exists
parametersAn array of objects where each object has an + * "attribute" and a "value" + * property.
partsAn array of objects identical in structure to the top-level + * object, each of which corresponds to a MIME body + * part.
+ *

+ *

+ * + * Primary body type (may vary with used library) + * + * + * + * + * + * + * + * + *
0text
1multipart
2message
3application
4audio
5image
6video
7other
+ *

+ *

+ * + * Transfer encodings (may vary with used library) + * + * + * + * + * + * + *
07BIT
18BIT
2BINARY
3BASE64
4QUOTED-PRINTABLE
5OTHER
+ * @jms-builtin + */ +function imap_fetchstructure ($imap_stream, $msg_number, $options = 0) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Clears IMAP cache + * @link http://php.net/manual/en/function.imap-gc.php + * @param resource $imap_stream + * @param int $caches

+ * Specifies the cache to purge. It may one or a combination + * of the following constants: + * IMAP_GC_ELT (message cache elements), + * IMAP_GC_ENV (enveloppe and bodies), + * IMAP_GC_TEXTS (texts). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_gc ($imap_stream, $caches) {} + +/** + * (PHP 4, PHP 5)
+ * Delete all messages marked for deletion + * @link http://php.net/manual/en/function.imap-expunge.php + * @param resource $imap_stream + * @return bool TRUE. + * @jms-builtin + */ +function imap_expunge ($imap_stream) {} + +/** + * (PHP 4, PHP 5)
+ * Mark a message for deletion from current mailbox + * @link http://php.net/manual/en/function.imap-delete.php + * @param resource $imap_stream + * @param int $msg_number

+ * The message number + *

+ * @param int $options [optional]

+ * You can set the FT_UID which tells the function + * to treat the msg_number argument as an + * UID. + *

+ * @return bool TRUE. + * @jms-builtin + */ +function imap_delete ($imap_stream, $msg_number, $options = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Unmark the message which is marked deleted + * @link http://php.net/manual/en/function.imap-undelete.php + * @param resource $imap_stream + * @param int $msg_number

+ * The message number + *

+ * @param int $flags [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_undelete ($imap_stream, $msg_number, $flags = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Check current mailbox + * @link http://php.net/manual/en/function.imap-check.php + * @param resource $imap_stream + * @return object the information in an object with following properties: + * Date - current system time formatted according to RFC2822 + * Driver - protocol used to access this mailbox: + * POP3, IMAP, NNTP + * Mailbox - the mailbox name + * Nmsgs - number of messages in the mailbox + * Recent - number of recent messages in the mailbox + *

+ *

+ * Returns FALSE on failure. + * @jms-builtin + */ +function imap_check ($imap_stream) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the list of mailboxes that matches the given text + * @link http://php.net/manual/en/function.imap-listscan.php + * @param resource $imap_stream + * @param string $ref

+ * ref should normally be just the server + * specification as described in imap_open + *

+ * @param string $pattern Specifies where in the mailbox hierarchy + * to start searching.

There are two special characters you can + * pass as part of the pattern: + * '*' and '%'. + * '*' means to return all mailboxes. If you pass + * pattern as '*', you will + * get a list of the entire mailbox hierarchy. + * '%' + * means to return the current level only. + * '%' as the pattern + * parameter will return only the top level + * mailboxes; '~/mail/%' on UW_IMAPD will return every mailbox in the ~/mail directory, but none in subfolders of that directory.

+ * @param string $content

+ * The searched string + *

+ * @return array an array containing the names of the mailboxes that have + * content in the text of the mailbox. + * @jms-builtin + */ +function imap_listscan ($imap_stream, $ref, $pattern, $content) {} + +/** + * (PHP 4, PHP 5)
+ * Copy specified messages to a mailbox + * @link http://php.net/manual/en/function.imap-mail-copy.php + * @param resource $imap_stream + * @param string $msglist

+ * msglist is a range not just message + * numbers (as described in RFC2060). + *

+ * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @param int $options [optional]

+ * options is a bitmask of one or more of + * CP_UID - the sequence numbers contain UIDS + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_mail_copy ($imap_stream, $msglist, $mailbox, $options = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Move specified messages to a mailbox + * @link http://php.net/manual/en/function.imap-mail-move.php + * @param resource $imap_stream + * @param string $msglist

+ * msglist is a range not just message numbers + * (as described in RFC2060). + *

+ * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @param int $options [optional]

+ * options is a bitmask and may contain the single option: + * CP_UID - the sequence numbers contain UIDS + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_mail_move ($imap_stream, $msglist, $mailbox, $options = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Create a MIME message based on given envelope and body sections + * @link http://php.net/manual/en/function.imap-mail-compose.php + * @param array $envelope

+ * An associative array of headers fields. Valid keys are: "remail", + * "return_path", "date", "from", "reply_to", "in_reply_to", "subject", + * "to", "cc", "bcc", "message_id" and "custom_headers" (which contains + * associative array of other headers). + *

+ * @param array $body

+ * An indexed array of bodies + *

+ *

+ * A body is an associative array which can consist of the following keys: + * "type", "encoding", "charset", "type.parameters", "subtype", "id", + * "description", "disposition.type", "disposition", "contents.data", + * "lines", "bytes" and "md5". + *

+ * @return string the MIME message. + * @jms-builtin + */ +function imap_mail_compose (array $envelope, array $body) {} + +/** + * (PHP 4, PHP 5)
+ * Create a new mailbox + * @link http://php.net/manual/en/function.imap-createmailbox.php + * @param resource $imap_stream + * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information. Names containing international characters should be + * encoded by imap_utf7_encode + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_createmailbox ($imap_stream, $mailbox) {} + +/** + * (PHP 4, PHP 5)
+ * Rename an old mailbox to new mailbox + * @link http://php.net/manual/en/function.imap-renamemailbox.php + * @param resource $imap_stream + * @param string $old_mbox

+ * The old mailbox name, see imap_open for more + * information + *

+ * @param string $new_mbox

+ * The new mailbox name, see imap_open for more + * information + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_renamemailbox ($imap_stream, $old_mbox, $new_mbox) {} + +/** + * (PHP 4, PHP 5)
+ * Delete a mailbox + * @link http://php.net/manual/en/function.imap-deletemailbox.php + * @param resource $imap_stream + * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_deletemailbox ($imap_stream, $mailbox) {} + +/** + * (PHP 4, PHP 5)
+ * Subscribe to a mailbox + * @link http://php.net/manual/en/function.imap-subscribe.php + * @param resource $imap_stream + * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_subscribe ($imap_stream, $mailbox) {} + +/** + * (PHP 4, PHP 5)
+ * Unsubscribe from a mailbox + * @link http://php.net/manual/en/function.imap-unsubscribe.php + * @param resource $imap_stream + * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_unsubscribe ($imap_stream, $mailbox) {} + +/** + * (PHP 4, PHP 5)
+ * Append a string message to a specified mailbox + * @link http://php.net/manual/en/function.imap-append.php + * @param resource $imap_stream + * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @param string $message

+ * The message to be append, as a string + *

+ *

+ * When talking to the Cyrus IMAP server, you must use "\r\n" as + * your end-of-line terminator instead of "\n" or the operation will + * fail + *

+ * @param string $options [optional]

+ * If provided, the options will also be written + * to the mailbox + *

+ * @param string $internal_date [optional]

+ * If this parameter is set, it will set the INTERNALDATE on the appended message. The parameter should be a date string that conforms to the rfc2060 specifications for a date_time value. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_append ($imap_stream, $mailbox, $message, $options = null, $internal_date = null) {} + +/** + * (PHP 4, PHP 5)
+ * Check if the IMAP stream is still active + * @link http://php.net/manual/en/function.imap-ping.php + * @param resource $imap_stream + * @return bool TRUE if the stream is still alive, FALSE otherwise. + * @jms-builtin + */ +function imap_ping ($imap_stream) {} + +/** + * (PHP 4, PHP 5)
+ * Decode BASE64 encoded text + * @link http://php.net/manual/en/function.imap-base64.php + * @param string $text

+ * The encoded text + *

+ * @return string the decoded message as a string. + * @jms-builtin + */ +function imap_base64 ($text) {} + +/** + * (PHP 4, PHP 5)
+ * Convert a quoted-printable string to an 8 bit string + * @link http://php.net/manual/en/function.imap-qprint.php + * @param string $string

+ * A quoted-printable string + *

+ * @return string an 8 bits string. + * @jms-builtin + */ +function imap_qprint ($string) {} + +/** + * (PHP 4, PHP 5)
+ * Convert an 8bit string to a quoted-printable string + * @link http://php.net/manual/en/function.imap-8bit.php + * @param string $string

+ * The 8bit string to convert + *

+ * @return string a quoted-printable string. + * @jms-builtin + */ +function imap_8bit ($string) {} + +/** + * (PHP 4, PHP 5)
+ * Convert an 8bit string to a base64 string + * @link http://php.net/manual/en/function.imap-binary.php + * @param string $string

+ * The 8bit string + *

+ * @return string a base64 encoded string. + * @jms-builtin + */ +function imap_binary ($string) {} + +/** + * (PHP 4, PHP 5)
+ * Converts MIME-encoded text to UTF-8 + * @link http://php.net/manual/en/function.imap-utf8.php + * @param string $mime_encoded_text

+ * A MIME encoded string. MIME encoding method and the UTF-8 + * specification are described in RFC2047 and RFC2044 respectively. + *

+ * @return string an UTF-8 encoded string. + * @jms-builtin + */ +function imap_utf8 ($mime_encoded_text) {} + +/** + * (PHP 4, PHP 5)
+ * Returns status information on a mailbox + * @link http://php.net/manual/en/function.imap-status.php + * @param resource $imap_stream + * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @param int $options

+ * Valid flags are: + * SA_MESSAGES - set $status->messages to the + * number of messages in the mailbox + * @return object This function returns an object containing status information. + * The object has the following properties: messages, + * recent, unseen, + * uidnext, and uidvalidity. + *

+ *

+ * flags is also set, which contains a bitmask which can + * be checked against any of the above constants. + * @jms-builtin + */ +function imap_status ($imap_stream, $mailbox, $options) {} + +/** + * (PHP 4, PHP 5)
+ * Get information about the current mailbox + * @link http://php.net/manual/en/function.imap-mailboxmsginfo.php + * @param resource $imap_stream + * @return object the information in an object with following properties: + * + * Mailbox properties + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Datedate of last change (current datetime)
Driverdriver
Mailboxname of the mailbox
Nmsgsnumber of messages
Recentnumber of recent messages
Unreadnumber of unread messages
Deletednumber of deleted messages
Sizemailbox size
+ *

+ *

+ * Returns FALSE on failure. + * @jms-builtin + */ +function imap_mailboxmsginfo ($imap_stream) {} + +/** + * (PHP 4, PHP 5)
+ * Sets flags on messages + * @link http://php.net/manual/en/function.imap-setflag-full.php + * @param resource $imap_stream + * @param string $sequence

+ * A sequence of message numbers. You can enumerate desired messages + * with the X,Y syntax, or retrieve all messages + * within an interval with the X:Y syntax + *

+ * @param string $flag

+ * The flags which you can set are \Seen, + * \Answered, \Flagged, + * \Deleted, and \Draft as + * defined by RFC2060. + *

+ * @param int $options [optional]

+ * A bit mask that may contain the single option: + * ST_UID - The sequence argument contains UIDs + * instead of sequence numbers + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_setflag_full ($imap_stream, $sequence, $flag, $options = 'NIL') {} + +/** + * (PHP 4, PHP 5)
+ * Clears flags on messages + * @link http://php.net/manual/en/function.imap-clearflag-full.php + * @param resource $imap_stream + * @param string $sequence

+ * A sequence of message numbers. You can enumerate desired messages + * with the X,Y syntax, or retrieve all messages + * within an interval with the X:Y syntax + *

+ * @param string $flag

+ * The flags which you can unset are "\\Seen", "\\Answered", "\\Flagged", + * "\\Deleted", and "\\Draft" (as defined by RFC2060) + *

+ * @param int $options [optional]

+ * options are a bit mask and may contain + * the single option: + * ST_UID - The sequence argument contains UIDs + * instead of sequence numbers + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_clearflag_full ($imap_stream, $sequence, $flag, $options = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Gets and sort messages + * @link http://php.net/manual/en/function.imap-sort.php + * @param resource $imap_stream + * @param int $criteria

+ * Criteria can be one (and only one) of the following: + * SORTDATE - message Date + * @param int $reverse

+ * Set this to 1 for reverse sorting + *

+ * @param int $options [optional]

+ * The options are a bitmask of one or more of the + * following: + * SE_UID - Return UIDs instead of sequence numbers + * @param string $search_criteria [optional] + * @param string $charset [optional] + * @return array an array of message numbers sorted by the given + * parameters. + * @jms-builtin + */ +function imap_sort ($imap_stream, $criteria, $reverse, $options = 0, $search_criteria = null, $charset = 'NIL') {} + +/** + * (PHP 4, PHP 5)
+ * This function returns the UID for the given message sequence number + * @link http://php.net/manual/en/function.imap-uid.php + * @param resource $imap_stream + * @param int $msg_number

+ * The message number. + *

+ * @return int The UID of the given message. + * @jms-builtin + */ +function imap_uid ($imap_stream, $msg_number) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the message sequence number for the given UID + * @link http://php.net/manual/en/function.imap-msgno.php + * @param resource $imap_stream + * @param int $uid

+ * The message UID + *

+ * @return int the message sequence number for the given + * uid. + * @jms-builtin + */ +function imap_msgno ($imap_stream, $uid) {} + +/** + * (PHP 4, PHP 5)
+ * Read the list of mailboxes + * @link http://php.net/manual/en/function.imap-list.php + * @param resource $imap_stream + * @param string $ref

+ * ref should normally be just the server + * specification as described in imap_open. + *

+ * @param string $pattern Specifies where in the mailbox hierarchy + * to start searching.

There are two special characters you can + * pass as part of the pattern: + * '*' and '%'. + * '*' means to return all mailboxes. If you pass + * pattern as '*', you will + * get a list of the entire mailbox hierarchy. + * '%' + * means to return the current level only. + * '%' as the pattern + * parameter will return only the top level + * mailboxes; '~/mail/%' on UW_IMAPD will return every mailbox in the ~/mail directory, but none in subfolders of that directory.

+ * @return array an array containing the names of the mailboxes. + * @jms-builtin + */ +function imap_list ($imap_stream, $ref, $pattern) {} + +/** + * (PHP 4, PHP 5)
+ * List all the subscribed mailboxes + * @link http://php.net/manual/en/function.imap-lsub.php + * @param resource $imap_stream + * @param string $ref

+ * ref should normally be just the server + * specification as described in imap_open + *

+ * @param string $pattern Specifies where in the mailbox hierarchy + * to start searching.

There are two special characters you can + * pass as part of the pattern: + * '*' and '%'. + * '*' means to return all mailboxes. If you pass + * pattern as '*', you will + * get a list of the entire mailbox hierarchy. + * '%' + * means to return the current level only. + * '%' as the pattern + * parameter will return only the top level + * mailboxes; '~/mail/%' on UW_IMAPD will return every mailbox in the ~/mail directory, but none in subfolders of that directory.

+ * @return array an array of all the subscribed mailboxes. + * @jms-builtin + */ +function imap_lsub ($imap_stream, $ref, $pattern) {} + +/** + * (PHP 4, PHP 5)
+ * Read an overview of the information in the headers of the given message + * @link http://php.net/manual/en/function.imap-fetch-overview.php + * @param resource $imap_stream + * @param string $sequence

+ * A message sequence description. You can enumerate desired messages + * with the X,Y syntax, or retrieve all messages + * within an interval with the X:Y syntax + *

+ * @param int $options [optional]

+ * sequence will contain a sequence of message + * indices or UIDs, if this parameter is set to + * FT_UID. + *

+ * @return array an array of objects describing one message header each. + * The object will only define a property if it exists. The possible + * properties are: + * subject - the messages subject + * from - who sent it + * to - recipient + * date - when was it sent + * message_id - Message-ID + * references - is a reference to this message id + * in_reply_to - is a reply to this message id + * size - size in bytes + * uid - UID the message has in the mailbox + * msgno - message sequence number in the mailbox + * recent - this message is flagged as recent + * flagged - this message is flagged + * answered - this message is flagged as answered + * deleted - this message is flagged for deletion + * seen - this message is flagged as already read + * draft - this message is flagged as being a draft + * @jms-builtin + */ +function imap_fetch_overview ($imap_stream, $sequence, $options = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Returns all IMAP alert messages that have occurred + * @link http://php.net/manual/en/function.imap-alerts.php + * @return array an array of all of the IMAP alert messages generated or FALSE if + * no alert messages are available. + * @jms-builtin + */ +function imap_alerts () {} + +/** + * (PHP 4, PHP 5)
+ * Returns all of the IMAP errors that have occured + * @link http://php.net/manual/en/function.imap-errors.php + * @return array This function returns an array of all of the IMAP error messages + * generated since the last imap_errors call, + * or the beginning of the page. Returns FALSE if no error messages are + * available. + * @jms-builtin + */ +function imap_errors () {} + +/** + * (PHP 4, PHP 5)
+ * Gets the last IMAP error that occurred during this page request + * @link http://php.net/manual/en/function.imap-last-error.php + * @return string the full text of the last IMAP error message that occurred on the + * current page. Returns FALSE if no error messages are available. + * @jms-builtin + */ +function imap_last_error () {} + +/** + * (PHP 4, PHP 5)
+ * This function returns an array of messages matching the given search criteria + * @link http://php.net/manual/en/function.imap-search.php + * @param resource $imap_stream + * @param string $criteria

+ * A string, delimited by spaces, in which the following keywords are + * allowed. Any multi-word arguments (e.g. + * FROM "joey smith") must be quoted. Results will match + * all criteria entries. + * ALL - return all messages matching the rest of the criteria + * @param int $options [optional]

+ * Valid values for options are + * SE_UID, which causes the returned array to + * contain UIDs instead of messages sequence numbers. + *

+ * @param string $charset [optional] + * @return array an array of message numbers or UIDs. + *

+ *

+ * Return FALSE if it does not understand the search + * criteria or no messages have been found. + * @jms-builtin + */ +function imap_search ($imap_stream, $criteria, $options = 'SE_FREE', $charset = 'NIL') {} + +/** + * (PHP 4, PHP 5)
+ * Decodes a modified UTF-7 encoded string + * @link http://php.net/manual/en/function.imap-utf7-decode.php + * @param string $text

+ * A modified UTF-7 encoding string, as defined in RFC 2060, section 5.1.3 (original UTF-7 + * was defined in RFC1642). + *

+ * @return string a string that is encoded in ISO-8859-1 and consists of the same + * sequence of characters in text, or FALSE + * if text contains invalid modified UTF-7 sequence + * or text contains a character that is not part of + * ISO-8859-1 character set. + * @jms-builtin + */ +function imap_utf7_decode ($text) {} + +/** + * (PHP 4, PHP 5)
+ * Converts ISO-8859-1 string to modified UTF-7 text + * @link http://php.net/manual/en/function.imap-utf7-encode.php + * @param string $data

+ * An ISO-8859-1 string. + *

+ * @return string data encoded with the modified UTF-7 + * encoding as defined in RFC 2060, + * section 5.1.3 (original UTF-7 was defined in RFC1642). + * @jms-builtin + */ +function imap_utf7_encode ($data) {} + +/** + * (PHP 4, PHP 5)
+ * Decode MIME header elements + * @link http://php.net/manual/en/function.imap-mime-header-decode.php + * @param string $text

+ * The MIME text + *

+ * @return array The decoded elements are returned in an array of objects, where each + * object has two properties, charset and + * text. + *

+ *

+ * If the element hasn't been encoded, and in other words is in + * plain US-ASCII, the charset property of that element is + * set to default. + * @jms-builtin + */ +function imap_mime_header_decode ($text) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * Returns a tree of threaded message + * @link http://php.net/manual/en/function.imap-thread.php + * @param resource $imap_stream + * @param int $options [optional] + * @return array imap_thread returns an associative array containing + * a tree of messages threaded by REFERENCES, or FALSE + * on error. + *

+ *

+ * Every message in the current mailbox will be represented by three entries + * in the resulting array: + *

+ * $thread["XX.num"] - current message number + *

+ *

+ * $thread["XX.next"] + *

+ *

+ * $thread["XX.branch"] + *

+ * @jms-builtin + */ +function imap_thread ($imap_stream, $options = 'SE_FREE') {} + +/** + * (PHP 4 >= 4.3.3, PHP 5)
+ * Set or fetch imap timeout + * @link http://php.net/manual/en/function.imap-timeout.php + * @param int $timeout_type

+ * One of the following: + * IMAP_OPENTIMEOUT, + * IMAP_READTIMEOUT, + * IMAP_WRITETIMEOUT, or + * IMAP_CLOSETIMEOUT. + *

+ * @param int $timeout [optional]

+ * The timeout, in seconds. + *

+ * @return mixed If the timeout parameter is set, this function + * returns TRUE on success and FALSE on failure. + *

+ *

+ * If timeout is not provided or evaluates to -1, + * the current timeout value of timeout_type is + * returned as an integer. + * @jms-builtin + */ +function imap_timeout ($timeout_type, $timeout = -1) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Retrieve the quota level settings, and usage statics per mailbox + * @link http://php.net/manual/en/function.imap-get-quota.php + * @param resource $imap_stream + * @param string $quota_root

+ * quota_root should normally be in the form of + * user.name where name is the mailbox you wish to + * retrieve information about. + *

+ * @return array an array with integer values limit and usage for the given + * mailbox. The value of limit represents the total amount of space + * allowed for this mailbox. The usage value represents the mailboxes + * current level of capacity. Will return FALSE in the case of failure. + *

+ *

+ * As of PHP 4.3, the function more properly reflects the + * functionality as dictated by the RFC2087. + * The array return value has changed to support an unlimited number of returned + * resources (i.e. messages, or sub-folders) with each named resource receiving + * an individual array key. Each key value then contains an another array with + * the usage and limit values within it. + *

+ *

+ * For backwards compatibility reasons, the original access methods are + * still available for use, although it is suggested to update. + * @jms-builtin + */ +function imap_get_quota ($imap_stream, $quota_root) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Retrieve the quota settings per user + * @link http://php.net/manual/en/function.imap-get-quotaroot.php + * @param resource $imap_stream + * @param string $quota_root

+ * quota_root should normally be in the form of + * which mailbox (i.e. INBOX). + *

+ * @return array an array of integer values pertaining to the specified user + * mailbox. All values contain a key based upon the resource name, and a + * corresponding array with the usage and limit values within. + *

+ *

+ * This function will return FALSE in the case of call failure, and an + * array of information about the connection upon an un-parsable response + * from the server. + * @jms-builtin + */ +function imap_get_quotaroot ($imap_stream, $quota_root) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Sets a quota for a given mailbox + * @link http://php.net/manual/en/function.imap-set-quota.php + * @param resource $imap_stream + * @param string $quota_root

+ * The mailbox to have a quota set. This should follow the IMAP standard + * format for a mailbox: user.name. + *

+ * @param int $quota_limit

+ * The maximum size (in KB) for the quota_root + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_set_quota ($imap_stream, $quota_root, $quota_limit) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * Sets the ACL for a giving mailbox + * @link http://php.net/manual/en/function.imap-setacl.php + * @param resource $imap_stream + * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @param string $id

+ * The user to give the rights to. + *

+ * @param string $rights

+ * The rights to give to the user. Passing an empty string will delete + * acl. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_setacl ($imap_stream, $mailbox, $id, $rights) {} + +/** + * (PHP 5)
+ * Gets the ACL for a given mailbox + * @link http://php.net/manual/en/function.imap-getacl.php + * @param resource $imap_stream + * @param string $mailbox

+ * The mailbox name, see imap_open for more + * information + *

+ * @return array an associative array of "folder" => "acl" pairs. + * @jms-builtin + */ +function imap_getacl ($imap_stream, $mailbox) {} + +/** + * (PHP 4, PHP 5)
+ * Send an email message + * @link http://php.net/manual/en/function.imap-mail.php + * @param string $to

+ * The receiver + *

+ * @param string $subject

+ * The mail subject + *

+ * @param string $message

+ * The mail body + *

+ * @param string $additional_headers [optional]

+ * As string with additional headers to be set on the mail + *

+ * @param string $cc [optional] + * @param string $bcc [optional]

+ * The receivers specified in bcc will get the + * mail, but are excluded from the headers. + *

+ * @param string $rpath [optional]

+ * Use this parameter to specify return path upon mail delivery failure. + * This is useful when using PHP as a mail client for multiple users. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function imap_mail ($to, $subject, $message, $additional_headers = null, $cc = null, $bcc = null, $rpath = null) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of imap_headerinfo + * @link http://php.net/manual/en/function.imap-header.php + * @param $stream_id + * @param $msg_no + * @param $from_length [optional] + * @param $subject_length [optional] + * @param $default_host [optional] + * @jms-builtin + */ +function imap_header ($stream_id, $msg_no, $from_length, $subject_length, $default_host) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of imap_list + * @link http://php.net/manual/en/function.imap-listmailbox.php + * @param $stream_id + * @param $ref + * @param $pattern + * @jms-builtin + */ +function imap_listmailbox ($stream_id, $ref, $pattern) {} + +/** + * (PHP 4, PHP 5)
+ * Read the list of mailboxes, returning detailed information on each one + * @link http://php.net/manual/en/function.imap-getmailboxes.php + * @param resource $imap_stream + * @param string $ref

+ * ref should normally be just the server + * specification as described in imap_open + *

+ * @param string $pattern Specifies where in the mailbox hierarchy + * to start searching.

There are two special characters you can + * pass as part of the pattern: + * '*' and '%'. + * '*' means to return all mailboxes. If you pass + * pattern as '*', you will + * get a list of the entire mailbox hierarchy. + * '%' + * means to return the current level only. + * '%' as the pattern + * parameter will return only the top level + * mailboxes; '~/mail/%' on UW_IMAPD will return every mailbox in the ~/mail directory, but none in subfolders of that directory.

+ * @return array an array of objects containing mailbox information. Each + * object has the attributes name, specifying + * the full name of the mailbox; delimiter, + * which is the hierarchy delimiter for the part of the hierarchy + * this mailbox is in; and + * attributes. Attributes + * is a bitmask that can be tested against: + *

+ * LATT_NOINFERIORS - This mailbox contains, and may not contain any + * "children" (there are no mailboxes below this one). Calling + * imap_createmailbox will not work on this mailbox. + *

+ *

+ * LATT_NOSELECT - This is only a container, + * not a mailbox - you cannot open it. + *

+ *

+ * LATT_MARKED - This mailbox is marked. This means that it may + * contain new messages since the last time it was checked. Not provided by all IMAP + * servers. + *

+ *

+ * LATT_UNMARKED - This mailbox is not marked, does not contain new + * messages. If either MARKED or UNMARKED is + * provided, you can assume the IMAP server supports this feature for this mailbox. + *

+ * @jms-builtin + */ +function imap_getmailboxes ($imap_stream, $ref, $pattern) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of imap_listscan + * @link http://php.net/manual/en/function.imap-scanmailbox.php + * @param $stream_id + * @param $ref + * @param $pattern + * @param $content + * @jms-builtin + */ +function imap_scanmailbox ($stream_id, $ref, $pattern, $content) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of imap_lsub + * @link http://php.net/manual/en/function.imap-listsubscribed.php + * @param $stream_id + * @param $ref + * @param $pattern + * @jms-builtin + */ +function imap_listsubscribed ($stream_id, $ref, $pattern) {} + +/** + * (PHP 4, PHP 5)
+ * List all the subscribed mailboxes + * @link http://php.net/manual/en/function.imap-getsubscribed.php + * @param resource $imap_stream + * @param string $ref

+ * ref should normally be just the server + * specification as described in imap_open + *

+ * @param string $pattern Specifies where in the mailbox hierarchy + * to start searching.

There are two special characters you can + * pass as part of the pattern: + * '*' and '%'. + * '*' means to return all mailboxes. If you pass + * pattern as '*', you will + * get a list of the entire mailbox hierarchy. + * '%' + * means to return the current level only. + * '%' as the pattern + * parameter will return only the top level + * mailboxes; '~/mail/%' on UW_IMAPD will return every mailbox in the ~/mail directory, but none in subfolders of that directory.

+ * @return array an array of objects containing mailbox information. Each + * object has the attributes name, specifying + * the full name of the mailbox; delimiter, + * which is the hierarchy delimiter for the part of the hierarchy + * this mailbox is in; and + * attributes. Attributes + * is a bitmask that can be tested against: + * LATT_NOINFERIORS - This mailbox has no + * "children" (there are no mailboxes below this one). + * LATT_NOSELECT - This is only a container, + * not a mailbox - you cannot open it. + * LATT_MARKED - This mailbox is marked. + * Only used by UW-IMAPD. + * LATT_UNMARKED - This mailbox is not marked. + * Only used by UW-IMAPD. + * @jms-builtin + */ +function imap_getsubscribed ($imap_stream, $ref, $pattern) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of imap_body + * @link http://php.net/manual/en/function.imap-fetchtext.php + * @param $stream_id + * @param $msg_no + * @param $options [optional] + * @jms-builtin + */ +function imap_fetchtext ($stream_id, $msg_no, $options) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of imap_listscan + * @link http://php.net/manual/en/function.imap-scan.php + * @param $stream_id + * @param $ref + * @param $pattern + * @param $content + * @jms-builtin + */ +function imap_scan ($stream_id, $ref, $pattern, $content) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of imap_createmailbox + * @link http://php.net/manual/en/function.imap-create.php + * @param $stream_id + * @param $mailbox + * @jms-builtin + */ +function imap_create ($stream_id, $mailbox) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of imap_renamemailbox + * @link http://php.net/manual/en/function.imap-rename.php + * @param $stream_id + * @param $old_name + * @param $new_name + * @jms-builtin + */ +function imap_rename ($stream_id, $old_name, $new_name) {} + +define ('NIL', 0); +define ('IMAP_OPENTIMEOUT', 1); +define ('IMAP_READTIMEOUT', 2); +define ('IMAP_WRITETIMEOUT', 3); +define ('IMAP_CLOSETIMEOUT', 4); +define ('OP_DEBUG', 1); + +/** + * Open mailbox read-only + * @link http://php.net/manual/en/imap.constants.php + */ +define ('OP_READONLY', 2); + +/** + * Don't use or update a .newsrc for news + * (NNTP only) + * @link http://php.net/manual/en/imap.constants.php + */ +define ('OP_ANONYMOUS', 4); +define ('OP_SHORTCACHE', 8); +define ('OP_SILENT', 16); +define ('OP_PROTOTYPE', 32); + +/** + * For IMAP and NNTP + * names, open a connection but don't open a mailbox. + * @link http://php.net/manual/en/imap.constants.php + */ +define ('OP_HALFOPEN', 64); +define ('OP_EXPUNGE', 128); +define ('OP_SECURE', 256); + +/** + * silently expunge the mailbox before closing when + * calling imap_close + * @link http://php.net/manual/en/imap.constants.php + */ +define ('CL_EXPUNGE', 32768); + +/** + * The parameter is a UID + * @link http://php.net/manual/en/imap.constants.php + */ +define ('FT_UID', 1); + +/** + * Do not set the \Seen flag if not already set + * @link http://php.net/manual/en/imap.constants.php + */ +define ('FT_PEEK', 2); +define ('FT_NOT', 4); + +/** + * The return string is in internal format, will not canonicalize to CRLF. + * @link http://php.net/manual/en/imap.constants.php + */ +define ('FT_INTERNAL', 8); +define ('FT_PREFETCHTEXT', 32); + +/** + * The sequence argument contains UIDs instead of sequence numbers + * @link http://php.net/manual/en/imap.constants.php + */ +define ('ST_UID', 1); +define ('ST_SILENT', 2); +define ('ST_SET', 4); + +/** + * the sequence numbers contain UIDS + * @link http://php.net/manual/en/imap.constants.php + */ +define ('CP_UID', 1); + +/** + * Delete the messages from the current mailbox after copying + * with imap_mail_copy + * @link http://php.net/manual/en/imap.constants.php + */ +define ('CP_MOVE', 2); + +/** + * Return UIDs instead of sequence numbers + * @link http://php.net/manual/en/imap.constants.php + */ +define ('SE_UID', 1); +define ('SE_FREE', 2); + +/** + * Don't prefetch searched messages + * @link http://php.net/manual/en/imap.constants.php + */ +define ('SE_NOPREFETCH', 4); +define ('SO_FREE', 8); +define ('SO_NOSERVER', 16); +define ('SA_MESSAGES', 1); +define ('SA_RECENT', 2); +define ('SA_UNSEEN', 4); +define ('SA_UIDNEXT', 8); +define ('SA_UIDVALIDITY', 16); +define ('SA_ALL', 31); + +/** + * This mailbox has no "children" (there are no + * mailboxes below this one). + * @link http://php.net/manual/en/imap.constants.php + */ +define ('LATT_NOINFERIORS', 1); + +/** + * This is only a container, not a mailbox - you + * cannot open it. + * @link http://php.net/manual/en/imap.constants.php + */ +define ('LATT_NOSELECT', 2); + +/** + * This mailbox is marked. Only used by UW-IMAPD. + * @link http://php.net/manual/en/imap.constants.php + */ +define ('LATT_MARKED', 4); + +/** + * This mailbox is not marked. Only used by + * UW-IMAPD. + * @link http://php.net/manual/en/imap.constants.php + */ +define ('LATT_UNMARKED', 8); +define ('LATT_REFERRAL', 16); +define ('LATT_HASCHILDREN', 32); +define ('LATT_HASNOCHILDREN', 64); + +/** + * Sort criteria for imap_sort: + * message Date + * @link http://php.net/manual/en/imap.constants.php + */ +define ('SORTDATE', 0); + +/** + * Sort criteria for imap_sort: + * arrival date + * @link http://php.net/manual/en/imap.constants.php + */ +define ('SORTARRIVAL', 1); + +/** + * Sort criteria for imap_sort: + * mailbox in first From address + * @link http://php.net/manual/en/imap.constants.php + */ +define ('SORTFROM', 2); + +/** + * Sort criteria for imap_sort: + * message subject + * @link http://php.net/manual/en/imap.constants.php + */ +define ('SORTSUBJECT', 3); + +/** + * Sort criteria for imap_sort: + * mailbox in first To address + * @link http://php.net/manual/en/imap.constants.php + */ +define ('SORTTO', 4); + +/** + * Sort criteria for imap_sort: + * mailbox in first cc address + * @link http://php.net/manual/en/imap.constants.php + */ +define ('SORTCC', 5); + +/** + * Sort criteria for imap_sort: + * size of message in octets + * @link http://php.net/manual/en/imap.constants.php + */ +define ('SORTSIZE', 6); +define ('TYPETEXT', 0); +define ('TYPEMULTIPART', 1); +define ('TYPEMESSAGE', 2); +define ('TYPEAPPLICATION', 3); +define ('TYPEAUDIO', 4); +define ('TYPEIMAGE', 5); +define ('TYPEVIDEO', 6); +define ('TYPEMODEL', 7); +define ('TYPEOTHER', 8); +define ('ENC7BIT', 0); +define ('ENC8BIT', 1); +define ('ENCBINARY', 2); +define ('ENCBASE64', 3); +define ('ENCQUOTEDPRINTABLE', 4); +define ('ENCOTHER', 5); + +/** + * Garbage collector, clear message cache elements. + * @link http://php.net/manual/en/imap.constants.php + */ +define ('IMAP_GC_ELT', 1); + +/** + * Garbage collector, clear envelopes and bodies. + * @link http://php.net/manual/en/imap.constants.php + */ +define ('IMAP_GC_ENV', 2); + +/** + * Garbage collector, clear texts. + * @link http://php.net/manual/en/imap.constants.php + */ +define ('IMAP_GC_TEXTS', 4); + +// End of imap v. +?> diff --git a/res/php-5.4-core-api/interbase.php b/res/php-5.4-core-api/interbase.php new file mode 100644 index 0000000..f0ed7b8 --- /dev/null +++ b/res/php-5.4-core-api/interbase.php @@ -0,0 +1,1243 @@ + + * Open a connection to an InterBase database + * @link http://php.net/manual/en/function.ibase-connect.php + * @param string $database [optional]

+ * The database argument has to be a valid path to + * database file on the server it resides on. If the server is not local, + * it must be prefixed with either 'hostname:' (TCP/IP), '//hostname/' + * (NetBEUI) or 'hostname@' (IPX/SPX), depending on the connection + * protocol used. + *

+ * @param string $username [optional]

+ * The user name. Can be set with the + * ibase.default_user php.ini directive. + *

+ * @param string $password [optional]

+ * The password for username. Can be set with the + * ibase.default_password php.ini directive. + *

+ * @param string $charset [optional]

+ * charset is the default character set for a + * database. + *

+ * @param int $buffers [optional]

+ * buffers is the number of database buffers to + * allocate for the server-side cache. If 0 or omitted, server chooses + * its own default. + *

+ * @param int $dialect [optional]

+ * dialect selects the default SQL dialect for any + * statement executed within a connection, and it defaults to the highest + * one supported by client libraries. Functional only with InterBase 6 + * and up. + *

+ * @param string $role [optional]

+ * Functional only with InterBase 5 and up. + *

+ * @param int $sync [optional] + * @return resource an InterBase link identifier on success, or FALSE on error. + * @jms-builtin + */ +function ibase_connect ($database = null, $username = null, $password = null, $charset = null, $buffers = null, $dialect = null, $role = null, $sync = null) {} + +/** + * (PHP 4, PHP 5)
+ * Open a persistent connection to an InterBase database + * @link http://php.net/manual/en/function.ibase-pconnect.php + * @param string $database [optional]

+ * The database argument has to be a valid path to + * database file on the server it resides on. If the server is not local, + * it must be prefixed with either 'hostname:' (TCP/IP), '//hostname/' + * (NetBEUI) or 'hostname@' (IPX/SPX), depending on the connection + * protocol used. + *

+ * @param string $username [optional]

+ * The user name. Can be set with the + * ibase.default_user php.ini directive. + *

+ * @param string $password [optional]

+ * The password for username. Can be set with the + * ibase.default_password php.ini directive. + *

+ * @param string $charset [optional]

+ * charset is the default character set for a + * database. + *

+ * @param int $buffers [optional]

+ * buffers is the number of database buffers to + * allocate for the server-side cache. If 0 or omitted, server chooses + * its own default. + *

+ * @param int $dialect [optional]

+ * dialect selects the default SQL dialect for any + * statement executed within a connection, and it defaults to the highest + * one supported by client libraries. Functional only with InterBase 6 + * and up. + *

+ * @param string $role [optional]

+ * Functional only with InterBase 5 and up. + *

+ * @param int $sync [optional] + * @return resource an InterBase link identifier on success, or FALSE on error. + * @jms-builtin + */ +function ibase_pconnect ($database = null, $username = null, $password = null, $charset = null, $buffers = null, $dialect = null, $role = null, $sync = null) {} + +/** + * (PHP 4, PHP 5)
+ * Close a connection to an InterBase database + * @link http://php.net/manual/en/function.ibase-close.php + * @param resource $connection_id [optional]

+ * An InterBase link identifier returned from + * ibase_connect. If omitted, the last opened link + * is assumed. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_close ($connection_id = null) {} + +/** + * (PHP 5)
+ * Drops a database + * @link http://php.net/manual/en/function.ibase-drop-db.php + * @param resource $connection [optional]

+ * An InterBase link identifier. If omitted, the last opened link is + * assumed. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_drop_db ($connection = null) {} + +/** + * (PHP 4, PHP 5)
+ * Execute a query on an InterBase database + * @link http://php.net/manual/en/function.ibase-query.php + * @param resource $link_identifier [optional]

+ * An InterBase link identifier. If omitted, the last opened link is + * assumed. + *

+ * @param string $query

+ * An InterBase query. + *

+ * @param int $bind_args [optional] + * @return resource If the query raises an error, returns FALSE. If it is successful and + * there is a (possibly empty) result set (such as with a SELECT query), + * returns a result identifier. If the query was successful and there were + * no results, returns TRUE. + *

+ *

+ * In PHP 5.0.0 and up, this function will return the number of rows + * affected by the query for INSERT, UPDATE and DELETE statements. In order + * to retain backward compatibility, it will return TRUE for these + * statements if the query succeeded without affecting any rows. + * @jms-builtin + */ +function ibase_query ($link_identifier = null, $query, $bind_args = null) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch a row from an InterBase database + * @link http://php.net/manual/en/function.ibase-fetch-row.php + * @param resource $result_identifier

+ * An InterBase result identifier. + *

+ * @param int $fetch_flag [optional]

+ * fetch_flag is a combination of the constants + * IBASE_TEXT and IBASE_UNIXTIME + * ORed together. Passing IBASE_TEXT will cause this + * function to return BLOB contents instead of BLOB ids. Passing + * IBASE_UNIXTIME will cause this function to return + * date/time values as Unix timestamps instead of as formatted strings. + *

+ * @return array an array that corresponds to the fetched row, or FALSE if there + * are no more rows. Each result column is stored in an array offset, + * starting at offset 0. + * @jms-builtin + */ +function ibase_fetch_row ($result_identifier, $fetch_flag = 0) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Fetch a result row from a query as an associative array + * @link http://php.net/manual/en/function.ibase-fetch-assoc.php + * @param resource $result

+ * The result handle. + *

+ * @param int $fetch_flag [optional]

+ * fetch_flag is a combination of the constants + * IBASE_TEXT and IBASE_UNIXTIME + * ORed together. Passing IBASE_TEXT will cause this + * function to return BLOB contents instead of BLOB ids. Passing + * IBASE_UNIXTIME will cause this function to return + * date/time values as Unix timestamps instead of as formatted strings. + *

+ * @return array an associative array that corresponds to the fetched row. + * Subsequent calls will return the next row in the result set, or FALSE if + * there are no more rows. + * @jms-builtin + */ +function ibase_fetch_assoc ($result, $fetch_flag = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Get an object from a InterBase database + * @link http://php.net/manual/en/function.ibase-fetch-object.php + * @param resource $result_id

+ * An InterBase result identifier obtained either by + * ibase_query or ibase_execute. + *

+ * @param int $fetch_flag [optional]

+ * fetch_flag is a combination of the constants + * IBASE_TEXT and IBASE_UNIXTIME + * ORed together. Passing IBASE_TEXT will cause this + * function to return BLOB contents instead of BLOB ids. Passing + * IBASE_UNIXTIME will cause this function to return + * date/time values as Unix timestamps instead of as formatted strings. + *

+ * @return object an object with the next row information, or FALSE if there are + * no more rows. + * @jms-builtin + */ +function ibase_fetch_object ($result_id, $fetch_flag = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Free a result set + * @link http://php.net/manual/en/function.ibase-free-result.php + * @param resource $result_identifier

+ * A result set created by ibase_query or + * ibase_execute. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_free_result ($result_identifier) {} + +/** + * (PHP 5)
+ * Assigns a name to a result set + * @link http://php.net/manual/en/function.ibase-name-result.php + * @param resource $result

+ * An InterBase result set. + *

+ * @param string $name

+ * The name to be assigned. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_name_result ($result, $name) {} + +/** + * (PHP 4, PHP 5)
+ * Prepare a query for later binding of parameter placeholders and execution + * @link http://php.net/manual/en/function.ibase-prepare.php + * @param string $query

+ * An InterBase query. + *

+ * @return resource a prepared query handle, or FALSE on error. + * @jms-builtin + */ +function ibase_prepare ($query) {} + +/** + * (PHP 4, PHP 5)
+ * Execute a previously prepared query + * @link http://php.net/manual/en/function.ibase-execute.php + * @param resource $query

+ * An InterBase query prepared by ibase_prepare. + *

+ * @param mixed $bind_arg [optional] + * @param mixed $_ [optional] + * @return resource If the query raises an error, returns FALSE. If it is successful and + * there is a (possibly empty) result set (such as with a SELECT query), + * returns a result identifier. If the query was successful and there were + * no results, returns TRUE. + *

+ *

+ * In PHP 5.0.0 and up, this function returns the number of rows affected by + * the query (if > 0 and applicable to the statement type). A query that + * succeeded, but did not affect any rows (e.g. an UPDATE of a non-existent + * record) will return TRUE. + * @jms-builtin + */ +function ibase_execute ($query, $bind_arg = null, $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Free memory allocated by a prepared query + * @link http://php.net/manual/en/function.ibase-free-query.php + * @param resource $query

+ * A query prepared with ibase_prepare. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_free_query ($query) {} + +/** + * (PHP 5)
+ * Increments the named generator and returns its new value + * @link http://php.net/manual/en/function.ibase-gen-id.php + * @param string $generator + * @param int $increment [optional] + * @param resource $link_identifier [optional] + * @return mixed new generator value as integer, or as string if the value is too big. + * @jms-builtin + */ +function ibase_gen_id ($generator, $increment = 1, $link_identifier = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get the number of fields in a result set + * @link http://php.net/manual/en/function.ibase-num-fields.php + * @param resource $result_id

+ * An InterBase result identifier. + *

+ * @return int the number of fields as an integer. + * @jms-builtin + */ +function ibase_num_fields ($result_id) {} + +/** + * (PHP 5)
+ * Return the number of parameters in a prepared query + * @link http://php.net/manual/en/function.ibase-num-params.php + * @param resource $query

+ * The prepared query handle. + *

+ * @return int the number of parameters as an integer. + * @jms-builtin + */ +function ibase_num_params ($query) {} + +/** + * (PHP 5)
+ * Return the number of rows that were affected by the previous query + * @link http://php.net/manual/en/function.ibase-affected-rows.php + * @param resource $link_identifier [optional]

+ * A transaction context. If link_identifier is a + * connection resource, its default transaction is used. + *

+ * @return int the number of rows as an integer. + * @jms-builtin + */ +function ibase_affected_rows ($link_identifier = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get information about a field + * @link http://php.net/manual/en/function.ibase-field-info.php + * @param resource $result

+ * An InterBase result identifier. + *

+ * @param int $field_number

+ * Field offset. + *

+ * @return array an array with the following keys: name, + * alias, relation, + * length and type. + * @jms-builtin + */ +function ibase_field_info ($result, $field_number) {} + +/** + * (PHP 5)
+ * Return information about a parameter in a prepared query + * @link http://php.net/manual/en/function.ibase-param-info.php + * @param resource $query

+ * An InterBase prepared query handle. + *

+ * @param int $param_number

+ * Parameter offset. + *

+ * @return array an array with the following keys: name, + * alias, relation, + * length and type. + * @jms-builtin + */ +function ibase_param_info ($query, $param_number) {} + +/** + * (PHP 4, PHP 5)
+ * Begin a transaction + * @link http://php.net/manual/en/function.ibase-trans.php + * @param int $trans_args [optional]

+ * trans_args can be a combination of + * IBASE_READ, + * IBASE_WRITE, + * IBASE_COMMITTED, + * IBASE_CONSISTENCY, + * IBASE_CONCURRENCY, + * IBASE_REC_VERSION, + * IBASE_REC_NO_VERSION, + * IBASE_WAIT and + * IBASE_NOWAIT. + *

+ * @param resource $link_identifier [optional]

+ * An InterBase link identifier. If omitted, the last opened link is + * assumed. + *

+ * @return resource a transaction handle, or FALSE on error. + * @jms-builtin + */ +function ibase_trans ($trans_args = null, $link_identifier = null) {} + +/** + * (PHP 4, PHP 5)
+ * Commit a transaction + * @link http://php.net/manual/en/function.ibase-commit.php + * @param resource $link_or_trans_identifier [optional]

+ * If called without an argument, this function commits the default + * transaction of the default link. If the argument is a connection + * identifier, the default transaction of the corresponding connection + * will be committed. If the argument is a transaction identifier, the + * corresponding transaction will be committed. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_commit ($link_or_trans_identifier = null) {} + +/** + * (PHP 4, PHP 5)
+ * Roll back a transaction + * @link http://php.net/manual/en/function.ibase-rollback.php + * @param resource $link_or_trans_identifier [optional]

+ * If called without an argument, this function rolls back the default + * transaction of the default link. If the argument is a connection + * identifier, the default transaction of the corresponding connection + * will be rolled back. If the argument is a transaction identifier, the + * corresponding transaction will be rolled back. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_rollback ($link_or_trans_identifier = null) {} + +/** + * (PHP 5)
+ * Commit a transaction without closing it + * @link http://php.net/manual/en/function.ibase-commit-ret.php + * @param resource $link_or_trans_identifier [optional]

+ * If called without an argument, this function commits the default + * transaction of the default link. If the argument is a connection + * identifier, the default transaction of the corresponding connection + * will be committed. If the argument is a transaction identifier, the + * corresponding transaction will be committed. The transaction context + * will be retained, so statements executed from within this transaction + * will not be invalidated. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_commit_ret ($link_or_trans_identifier = null) {} + +/** + * (PHP 5)
+ * Roll back a transaction without closing it + * @link http://php.net/manual/en/function.ibase-rollback-ret.php + * @param resource $link_or_trans_identifier [optional]

+ * If called without an argument, this function rolls back the default + * transaction of the default link. If the argument is a connection + * identifier, the default transaction of the corresponding connection + * will be rolled back. If the argument is a transaction identifier, the + * corresponding transaction will be rolled back. The transaction context + * will be retained, so statements executed from within this transaction + * will not be invalidated. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_rollback_ret ($link_or_trans_identifier = null) {} + +/** + * (PHP 4, PHP 5)
+ * Return blob length and other useful info + * @link http://php.net/manual/en/function.ibase-blob-info.php + * @param resource $link_identifier

+ * An InterBase link identifier. If omitted, the last opened link is + * assumed. + *

+ * @param string $blob_id

+ * A BLOB id. + *

+ * @return array an array containing information about a BLOB. The information returned + * consists of the length of the BLOB, the number of segments it contains, the size + * of the largest segment, and whether it is a stream BLOB or a segmented BLOB. + * @jms-builtin + */ +function ibase_blob_info ($link_identifier, $blob_id) {} + +/** + * (PHP 4, PHP 5)
+ * Create a new blob for adding data + * @link http://php.net/manual/en/function.ibase-blob-create.php + * @param resource $link_identifier [optional]

+ * An InterBase link identifier. If omitted, the last opened link is + * assumed. + *

+ * @return resource a BLOB handle for later use with + * ibase_blob_add or FALSE on failure. + * @jms-builtin + */ +function ibase_blob_create ($link_identifier = null) {} + +/** + * (PHP 4, PHP 5)
+ * Add data into a newly created blob + * @link http://php.net/manual/en/function.ibase-blob-add.php + * @param resource $blob_handle

+ * A blob handle opened with ibase_blob_create. + *

+ * @param string $data

+ * The data to be added. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function ibase_blob_add ($blob_handle, $data) {} + +/** + * (PHP 4, PHP 5)
+ * Cancel creating blob + * @link http://php.net/manual/en/function.ibase-blob-cancel.php + * @param resource $blob_handle

+ * A BLOB handle opened with ibase_blob_create. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_blob_cancel ($blob_handle) {} + +/** + * (PHP 4, PHP 5)
+ * Close blob + * @link http://php.net/manual/en/function.ibase-blob-close.php + * @param resource $blob_handle

+ * A BLOB handle opened with ibase_blob_create or + * ibase_blob_open. + *

+ * @return mixed If the BLOB was being read, this function returns TRUE on success, if + * the BLOB was being written to, this function returns a string containing + * the BLOB id that has been assigned to it by the database. On failure, this + * function returns FALSE. + * @jms-builtin + */ +function ibase_blob_close ($blob_handle) {} + +/** + * (PHP 4, PHP 5)
+ * Open blob for retrieving data parts + * @link http://php.net/manual/en/function.ibase-blob-open.php + * @param resource $link_identifier

+ * An InterBase link identifier. If omitted, the last opened link is + * assumed. + *

+ * @param string $blob_id

+ * A BLOB id. + *

+ * @return resource a BLOB handle for later use with + * ibase_blob_get or FALSE on failure. + * @jms-builtin + */ +function ibase_blob_open ($link_identifier, $blob_id) {} + +/** + * (PHP 4, PHP 5)
+ * Get len bytes data from open blob + * @link http://php.net/manual/en/function.ibase-blob-get.php + * @param resource $blob_handle

+ * A BLOB handle opened with ibase_blob_open. + *

+ * @param int $len

+ * Size of returned data. + *

+ * @return string at most len bytes from the BLOB, or FALSE + * on failure. + * @jms-builtin + */ +function ibase_blob_get ($blob_handle, $len) {} + +/** + * (PHP 4, PHP 5)
+ * Output blob contents to browser + * @link http://php.net/manual/en/function.ibase-blob-echo.php + * @param string $blob_id + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_blob_echo ($blob_id) {} + +/** + * (PHP 4, PHP 5)
+ * Create blob, copy file in it, and close it + * @link http://php.net/manual/en/function.ibase-blob-import.php + * @param resource $link_identifier

+ * An InterBase link identifier. If omitted, the last opened link is + * assumed. + *

+ * @param resource $file_handle

+ * The file handle is a handle returned by fopen. + *

+ * @return string the BLOB id on success, or FALSE on error. + * @jms-builtin + */ +function ibase_blob_import ($link_identifier, $file_handle) {} + +/** + * (PHP 4, PHP 5)
+ * Return error messages + * @link http://php.net/manual/en/function.ibase-errmsg.php + * @return string the error message as a string, or FALSE if no error occurred. + * @jms-builtin + */ +function ibase_errmsg () {} + +/** + * (PHP 5)
+ * Return an error code + * @link http://php.net/manual/en/function.ibase-errcode.php + * @return int the error code as an integer, or FALSE if no error occurred. + * @jms-builtin + */ +function ibase_errcode () {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Add a user to a security database (only for IB6 or later) + * @link http://php.net/manual/en/function.ibase-add-user.php + * @param resource $service_handle + * @param string $user_name + * @param string $password + * @param string $first_name [optional] + * @param string $middle_name [optional] + * @param string $last_name [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_add_user ($service_handle, $user_name, $password, $first_name = null, $middle_name = null, $last_name = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Modify a user to a security database (only for IB6 or later) + * @link http://php.net/manual/en/function.ibase-modify-user.php + * @param resource $service_handle + * @param string $user_name + * @param string $password + * @param string $first_name [optional] + * @param string $middle_name [optional] + * @param string $last_name [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_modify_user ($service_handle, $user_name, $password, $first_name = null, $middle_name = null, $last_name = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Delete a user from a security database (only for IB6 or later) + * @link http://php.net/manual/en/function.ibase-delete-user.php + * @param resource $service_handle + * @param string $user_name + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_delete_user ($service_handle, $user_name) {} + +/** + * (PHP 5)
+ * Connect to the service manager + * @link http://php.net/manual/en/function.ibase-service-attach.php + * @param string $host + * @param string $dba_username + * @param string $dba_password + * @return resource + * @jms-builtin + */ +function ibase_service_attach ($host, $dba_username, $dba_password) {} + +/** + * (PHP 5)
+ * Disconnect from the service manager + * @link http://php.net/manual/en/function.ibase-service-detach.php + * @param resource $service_handle + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_service_detach ($service_handle) {} + +/** + * (PHP 5)
+ * Initiates a backup task in the service manager and returns immediately + * @link http://php.net/manual/en/function.ibase-backup.php + * @param resource $service_handle + * @param string $source_db + * @param string $dest_file + * @param int $options [optional] + * @param bool $verbose [optional] + * @return mixed + * @jms-builtin + */ +function ibase_backup ($service_handle, $source_db, $dest_file, $options = 0, $verbose = false) {} + +/** + * (PHP 5)
+ * Initiates a restore task in the service manager and returns immediately + * @link http://php.net/manual/en/function.ibase-restore.php + * @param resource $service_handle + * @param string $source_file + * @param string $dest_db + * @param int $options [optional] + * @param bool $verbose [optional] + * @return mixed + * @jms-builtin + */ +function ibase_restore ($service_handle, $source_file, $dest_db, $options = 0, $verbose = false) {} + +/** + * (PHP 5)
+ * Execute a maintenance command on the database server + * @link http://php.net/manual/en/function.ibase-maintain-db.php + * @param resource $service_handle + * @param string $db + * @param int $action + * @param int $argument [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_maintain_db ($service_handle, $db, $action, $argument = 0) {} + +/** + * (PHP 5)
+ * Request statistics about a database + * @link http://php.net/manual/en/function.ibase-db-info.php + * @param resource $service_handle + * @param string $db + * @param int $action + * @param int $argument [optional] + * @return string + * @jms-builtin + */ +function ibase_db_info ($service_handle, $db, $action, $argument = 0) {} + +/** + * (PHP 5)
+ * Request information about a database server + * @link http://php.net/manual/en/function.ibase-server-info.php + * @param resource $service_handle + * @param int $action + * @return string + * @jms-builtin + */ +function ibase_server_info ($service_handle, $action) {} + +/** + * (PHP 5)
+ * Wait for an event to be posted by the database + * @link http://php.net/manual/en/function.ibase-wait-event.php + * @param string $event_name1

+ * The event name. + *

+ * @param string $event_name2 [optional] + * @param string $_ [optional] + * @return string the name of the event that was posted. + * @jms-builtin + */ +function ibase_wait_event ($event_name1, $event_name2 = null, $_ = null) {} + +/** + * (PHP 5)
+ * Register a callback function to be called when events are posted + * @link http://php.net/manual/en/function.ibase-set-event-handler.php + * @param callable $event_handler

+ * The callback is called with the event name and the link resource as + * arguments whenever one of the specified events is posted by the + * database. + *

+ *

+ * The callback must return FALSE if the event handler should be + * canceled. Any other return value is ignored. This function accepts up + * to 15 event arguments. + *

+ * @param string $event_name1

+ * An event name. + *

+ * @param string $event_name2 [optional]

+ * At most 15 events allowed. + *

+ * @param string $_ [optional] + * @return resource The return value is an event resource. This resource can be used to free + * the event handler using ibase_free_event_handler. + * @jms-builtin + */ +function ibase_set_event_handler (callable $event_handler, $event_name1, $event_name2 = null, $_ = null) {} + +/** + * (PHP 5)
+ * Cancels a registered event handler + * @link http://php.net/manual/en/function.ibase-free-event-handler.php + * @param resource $event

+ * An event resource, created by + * ibase_set_event_handler. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ibase_free_event_handler ($event) {} + +/** + * @param $database + * @param $username [optional] + * @param $password [optional] + * @param $charset [optional] + * @param $buffers [optional] + * @param $dialect [optional] + * @param $role [optional] + * @jms-builtin + */ +function fbird_connect ($database, $username, $password, $charset, $buffers, $dialect, $role) {} + +/** + * @param $database + * @param $username [optional] + * @param $password [optional] + * @param $charset [optional] + * @param $buffers [optional] + * @param $dialect [optional] + * @param $role [optional] + * @jms-builtin + */ +function fbird_pconnect ($database, $username, $password, $charset, $buffers, $dialect, $role) {} + +/** + * @param $link_identifier [optional] + * @jms-builtin + */ +function fbird_close ($link_identifier) {} + +/** + * @param $link_identifier [optional] + * @jms-builtin + */ +function fbird_drop_db ($link_identifier) {} + +/** + * @param $link_identifier [optional] + * @param $link_identifier [optional] + * @param $query [optional] + * @param $bind_arg [optional] + * @param $bind_arg [optional] + * @jms-builtin + */ +function fbird_query ($link_identifier, $link_identifier, $query, $bind_arg, $bind_arg) {} + +/** + * @param $result + * @param $fetch_flags [optional] + * @jms-builtin + */ +function fbird_fetch_row ($result, $fetch_flags) {} + +/** + * @param $result + * @param $fetch_flags [optional] + * @jms-builtin + */ +function fbird_fetch_assoc ($result, $fetch_flags) {} + +/** + * @param $result + * @param $fetch_flags [optional] + * @jms-builtin + */ +function fbird_fetch_object ($result, $fetch_flags) {} + +/** + * @param $result + * @jms-builtin + */ +function fbird_free_result ($result) {} + +/** + * @param $result + * @param $name + * @jms-builtin + */ +function fbird_name_result ($result, $name) {} + +/** + * @param $link_identifier [optional] + * @param $query [optional] + * @jms-builtin + */ +function fbird_prepare ($link_identifier, $query) {} + +/** + * @param $query + * @param $bind_arg [optional] + * @param $bind_arg [optional] + * @jms-builtin + */ +function fbird_execute ($query, $bind_arg, $bind_arg) {} + +/** + * @param $query + * @jms-builtin + */ +function fbird_free_query ($query) {} + +/** + * @param $generator + * @param $increment [optional] + * @param $link_identifier [optional] + * @jms-builtin + */ +function fbird_gen_id ($generator, $increment, $link_identifier) {} + +/** + * @param $query_result + * @jms-builtin + */ +function fbird_num_fields ($query_result) {} + +/** + * @param $query + * @jms-builtin + */ +function fbird_num_params ($query) {} + +/** + * @param $link_identifier [optional] + * @jms-builtin + */ +function fbird_affected_rows ($link_identifier) {} + +/** + * @param $query_result + * @param $field_number + * @jms-builtin + */ +function fbird_field_info ($query_result, $field_number) {} + +/** + * @param $query + * @param $field_number + * @jms-builtin + */ +function fbird_param_info ($query, $field_number) {} + +/** + * @param $trans_args [optional] + * @param $link_identifier [optional] + * @param $trans_args [optional] + * @param $link_identifier [optional] + * @jms-builtin + */ +function fbird_trans ($trans_args, $link_identifier, $trans_args, $link_identifier) {} + +/** + * @param $link_identifier + * @jms-builtin + */ +function fbird_commit ($link_identifier) {} + +/** + * @param $link_identifier + * @jms-builtin + */ +function fbird_rollback ($link_identifier) {} + +/** + * @param $link_identifier + * @jms-builtin + */ +function fbird_commit_ret ($link_identifier) {} + +/** + * @param $link_identifier + * @jms-builtin + */ +function fbird_rollback_ret ($link_identifier) {} + +/** + * @param $link_identifier [optional] + * @param $blob_id [optional] + * @jms-builtin + */ +function fbird_blob_info ($link_identifier, $blob_id) {} + +/** + * @param $link_identifier [optional] + * @jms-builtin + */ +function fbird_blob_create ($link_identifier) {} + +/** + * @param $blob_handle + * @param $data + * @jms-builtin + */ +function fbird_blob_add ($blob_handle, $data) {} + +/** + * @param $blob_handle + * @jms-builtin + */ +function fbird_blob_cancel ($blob_handle) {} + +/** + * @param $blob_handle + * @jms-builtin + */ +function fbird_blob_close ($blob_handle) {} + +/** + * @param $link_identifier [optional] + * @param $blob_id [optional] + * @jms-builtin + */ +function fbird_blob_open ($link_identifier, $blob_id) {} + +/** + * @param $blob_handle + * @param $len + * @jms-builtin + */ +function fbird_blob_get ($blob_handle, $len) {} + +/** + * @param $link_identifier [optional] + * @param $blob_id [optional] + * @jms-builtin + */ +function fbird_blob_echo ($link_identifier, $blob_id) {} + +/** + * @param $link_identifier [optional] + * @param $file [optional] + * @jms-builtin + */ +function fbird_blob_import ($link_identifier, $file) {} + +/** @jms-builtin */ +function fbird_errmsg () {} + +/** @jms-builtin */ +function fbird_errcode () {} + +/** + * @param $service_handle + * @param $user_name + * @param $password + * @param $first_name [optional] + * @param $middle_name [optional] + * @param $last_name [optional] + * @jms-builtin + */ +function fbird_add_user ($service_handle, $user_name, $password, $first_name, $middle_name, $last_name) {} + +/** + * @param $service_handle + * @param $user_name + * @param $password + * @param $first_name [optional] + * @param $middle_name [optional] + * @param $last_name [optional] + * @jms-builtin + */ +function fbird_modify_user ($service_handle, $user_name, $password, $first_name, $middle_name, $last_name) {} + +/** + * @param $service_handle + * @param $user_name + * @param $password + * @param $first_name [optional] + * @param $middle_name [optional] + * @param $last_name [optional] + * @jms-builtin + */ +function fbird_delete_user ($service_handle, $user_name, $password, $first_name, $middle_name, $last_name) {} + +/** + * @param $host + * @param $dba_username + * @param $dba_password + * @jms-builtin + */ +function fbird_service_attach ($host, $dba_username, $dba_password) {} + +/** + * @param $service_handle + * @jms-builtin + */ +function fbird_service_detach ($service_handle) {} + +/** + * @param $service_handle + * @param $source_db + * @param $dest_file + * @param $options [optional] + * @param $verbose [optional] + * @jms-builtin + */ +function fbird_backup ($service_handle, $source_db, $dest_file, $options, $verbose) {} + +/** + * @param $service_handle + * @param $source_file + * @param $dest_db + * @param $options [optional] + * @param $verbose [optional] + * @jms-builtin + */ +function fbird_restore ($service_handle, $source_file, $dest_db, $options, $verbose) {} + +/** + * @param $service_handle + * @param $db + * @param $action + * @param $argument [optional] + * @jms-builtin + */ +function fbird_maintain_db ($service_handle, $db, $action, $argument) {} + +/** + * @param $service_handle + * @param $db + * @param $action + * @param $argument [optional] + * @jms-builtin + */ +function fbird_db_info ($service_handle, $db, $action, $argument) {} + +/** + * @param $service_handle + * @param $action + * @jms-builtin + */ +function fbird_server_info ($service_handle, $action) {} + +/** + * @param $link_identifier + * @param $event [optional] + * @param $event2 [optional] + * @jms-builtin + */ +function fbird_wait_event ($link_identifier, $event, $event2) {} + +/** + * @param $link_identifier + * @param $handler + * @param $event [optional] + * @param $event2 [optional] + * @jms-builtin + */ +function fbird_set_event_handler ($link_identifier, $handler, $event, $event2) {} + +/** + * @param $event + * @jms-builtin + */ +function fbird_free_event_handler ($event) {} + +define ('IBASE_DEFAULT', 0); +define ('IBASE_CREATE', 0); +define ('IBASE_TEXT', 1); +define ('IBASE_FETCH_BLOBS', 1); +define ('IBASE_FETCH_ARRAYS', 2); +define ('IBASE_UNIXTIME', 4); +define ('IBASE_WRITE', 1); +define ('IBASE_READ', 2); +define ('IBASE_COMMITTED', 8); +define ('IBASE_CONSISTENCY', 16); +define ('IBASE_CONCURRENCY', 4); +define ('IBASE_REC_VERSION', 64); +define ('IBASE_REC_NO_VERSION', 32); +define ('IBASE_NOWAIT', 256); +define ('IBASE_WAIT', 128); +define ('IBASE_BKP_IGNORE_CHECKSUMS', 1); +define ('IBASE_BKP_IGNORE_LIMBO', 2); +define ('IBASE_BKP_METADATA_ONLY', 4); +define ('IBASE_BKP_NO_GARBAGE_COLLECT', 8); +define ('IBASE_BKP_OLD_DESCRIPTIONS', 16); +define ('IBASE_BKP_NON_TRANSPORTABLE', 32); + +/** + * Options to ibase_backup + * @link http://php.net/manual/en/ibase.constants.php + */ +define ('IBASE_BKP_CONVERT', 64); +define ('IBASE_RES_DEACTIVATE_IDX', 256); +define ('IBASE_RES_NO_SHADOW', 512); +define ('IBASE_RES_NO_VALIDITY', 1024); +define ('IBASE_RES_ONE_AT_A_TIME', 2048); +define ('IBASE_RES_REPLACE', 4096); +define ('IBASE_RES_CREATE', 8192); + +/** + * Options to ibase_restore + * @link http://php.net/manual/en/ibase.constants.php + */ +define ('IBASE_RES_USE_ALL_SPACE', 16384); +define ('IBASE_PRP_PAGE_BUFFERS', 5); +define ('IBASE_PRP_SWEEP_INTERVAL', 6); +define ('IBASE_PRP_SHUTDOWN_DB', 7); +define ('IBASE_PRP_DENY_NEW_TRANSACTIONS', 10); +define ('IBASE_PRP_DENY_NEW_ATTACHMENTS', 9); +define ('IBASE_PRP_RESERVE_SPACE', 11); +define ('IBASE_PRP_RES_USE_FULL', 35); +define ('IBASE_PRP_RES', 36); +define ('IBASE_PRP_WRITE_MODE', 12); +define ('IBASE_PRP_WM_ASYNC', 37); +define ('IBASE_PRP_WM_SYNC', 38); +define ('IBASE_PRP_ACCESS_MODE', 13); +define ('IBASE_PRP_AM_READONLY', 39); +define ('IBASE_PRP_AM_READWRITE', 40); +define ('IBASE_PRP_SET_SQL_DIALECT', 14); +define ('IBASE_PRP_ACTIVATE', 256); +define ('IBASE_PRP_DB_ONLINE', 512); +define ('IBASE_RPR_CHECK_DB', 16); +define ('IBASE_RPR_IGNORE_CHECKSUM', 32); +define ('IBASE_RPR_KILL_SHADOWS', 64); +define ('IBASE_RPR_MEND_DB', 4); +define ('IBASE_RPR_VALIDATE_DB', 1); +define ('IBASE_RPR_FULL', 128); + +/** + * Options to ibase_maintain_db + * @link http://php.net/manual/en/ibase.constants.php + */ +define ('IBASE_RPR_SWEEP_DB', 2); +define ('IBASE_STS_DATA_PAGES', 1); +define ('IBASE_STS_DB_LOG', 2); +define ('IBASE_STS_HDR_PAGES', 4); +define ('IBASE_STS_IDX_PAGES', 8); + +/** + * Options to ibase_db_info + * @link http://php.net/manual/en/ibase.constants.php + */ +define ('IBASE_STS_SYS_RELATIONS', 16); +define ('IBASE_SVC_SERVER_VERSION', 55); +define ('IBASE_SVC_IMPLEMENTATION', 56); +define ('IBASE_SVC_GET_ENV', 59); +define ('IBASE_SVC_GET_ENV_LOCK', 60); +define ('IBASE_SVC_GET_ENV_MSG', 61); +define ('IBASE_SVC_USER_DBPATH', 58); +define ('IBASE_SVC_SVR_DB_INFO', 50); + +/** + * Options to ibase_server_info + * @link http://php.net/manual/en/ibase.constants.php + */ +define ('IBASE_SVC_GET_USERS', 68); + +// End of interbase v. +?> diff --git a/res/php-5.4-core-api/intl.php b/res/php-5.4-core-api/intl.php new file mode 100644 index 0000000..5d42af5 --- /dev/null +++ b/res/php-5.4-core-api/intl.php @@ -0,0 +1,2974 @@ + + * Sort strings with different accents from the back of the string. This + * attribute is automatically set to + * On + * for the French locales and a few others. Users normally would not need + * to explicitly set this attribute. There is a string comparison + * performance cost when it is set On, + * but sort key length is unaffected. Possible values are: + * Collator::ON + * Collator::OFFCollator::DEFAULT_VALUE + *

+ *

+ * FRENCH_COLLATION rules + *

+ * F=OFF cote < coté < côte < côté + * F=ON cote < côte < coté < côté + *

+ *

+ * @link http://php.net/manual/en/intl.collator-constants.php + */ + const FRENCH_COLLATION = 0; + + /** + *

+ * The Alternate attribute is used to control the handling of the so called + * variable characters in the UCA: whitespace, punctuation and symbols. If + * Alternate is set to NonIgnorable + * (N), then differences among these characters are of the same importance + * as differences among letters. If Alternate is set to + * Shifted + * (S), then these characters are of only minor importance. The + * Shifted value is often used in combination with + * Strength + * set to Quaternary. In such a case, whitespace, punctuation, and symbols + * are considered when comparing strings, but only if all other aspects of + * the strings (base letters, accents, and case) are identical. If + * Alternate is not set to Shifted, then there is no difference between a + * Strength of 3 and a Strength of 4. For more information and examples, + * see Variable_Weighting in the + * UCA. + * The reason the Alternate values are not simply + * On and Off + * is that additional Alternate values may be added in the future. The UCA + * option Blanked is expressed with Strength set to 3, and Alternate set to + * Shifted. The default for most locales is NonIgnorable. If Shifted is + * selected, it may be slower if there are many strings that are the same + * except for punctuation; sort key length will not be affected unless the + * strength level is also increased. + *

+ *

+ * Possible values are: + * Collator::NON_IGNORABLECollator::SHIFTED + * Collator::DEFAULT_VALUE + *

+ *

+ * ALTERNATE_HANDLING rules + *

+ * S=3, A=N di Silva < Di Silva < diSilva < U.S.A. < USA + * S=3, A=S di Silva = diSilva < Di Silva < U.S.A. = USA + * S=4, A=S di Silva < diSilva < Di Silva < U.S.A. < USA + *

+ *

+ * @link http://php.net/manual/en/intl.collator-constants.php + */ + const ALTERNATE_HANDLING = 1; + + /** + *

+ * The Case_First attribute is used to control whether uppercase letters + * come before lowercase letters or vice versa, in the absence of other + * differences in the strings. The possible values are + * Uppercase_First + * (U) and Lowercase_First + * (L), plus the standard Default + * and Off. + * There is almost no difference between the Off and Lowercase_First + * options in terms of results, so typically users will not use + * Lowercase_First: only Off or Uppercase_First. (People interested in the + * detailed differences between X and L should consult the Collation + * Customization). Specifying either L or U won't affect string comparison + * performance, but will affect the sort key length. + *

+ *

+ * Possible values are: + * Collator::OFFCollator::LOWER_FIRST + * Collator::UPPER_FIRST + * Collator:DEFAULT + *

+ *

+ * CASE_FIRST rules + *

+ * C=X or C=L "china" < "China" < "denmark" < "Denmark" + * C=U "China" < "china" < "Denmark" < "denmark" + *

+ *

+ * @link http://php.net/manual/en/intl.collator-constants.php + */ + const CASE_FIRST = 2; + + /** + *

+ * The Case_Level attribute is used when ignoring accents but not case. In + * such a situation, set Strength to be Primary, + * and Case_Level to be On. + * In most locales, this setting is Off by default. There is a small + * string comparison performance and sort key impact if this attribute is + * set to be On. + *

+ *

+ * Possible values are: + * Collator::OFFCollator::ON + * Collator::DEFAULT_VALUE + *

+ *

+ * CASE_LEVEL rules + *

+ * S=1, E=X role = Role = rôle + * S=1, E=O role = rôle < Role + *

+ *

+ * @link http://php.net/manual/en/intl.collator-constants.php + */ + const CASE_LEVEL = 3; + + /** + *

+ * The Normalization setting determines whether text is thoroughly + * normalized or not in comparison. Even if the setting is off (which is + * the default for many locales), text as represented in common usage will + * compare correctly (for details, see UTN #5). Only if the accent marks + * are in noncanonical order will there be a problem. If the setting is + * On, + * then the best results are guaranteed for all possible text input. + * There is a medium string comparison performance cost if this attribute + * is On, + * depending on the frequency of sequences that require normalization. + * There is no significant effect on sort key length. If the input text is + * known to be in NFD or NFKD normalization forms, there is no need to + * enable this Normalization option. + *

+ *

+ * Possible values are: + * Collator::OFFCollator::ON + * Collator::DEFAULT_VALUE + *

+ * @link http://php.net/manual/en/intl.collator-constants.php + */ + const NORMALIZATION_MODE = 4; + + /** + *

+ * The ICU Collation Service supports many levels of comparison (named + * "Levels", but also known as "Strengths"). Having these categories + * enables ICU to sort strings precisely according to local conventions. + * However, by allowing the levels to be selectively employed, searching + * for a string in text can be performed with various matching conditions. + * For more detailed information, see + * collator_set_strength chapter. + *

+ *

+ * Possible values are: + * Collator::PRIMARY + * Collator::SECONDARY + * Collator::TERTIARYCollator::QUATERNARY + * Collator::IDENTICAL + * Collator::DEFAULT_VALUE + *

+ * @link http://php.net/manual/en/intl.collator-constants.php + */ + const STRENGTH = 5; + + /** + *

+ * Compatibility with JIS x 4061 requires the introduction of an additional + * level to distinguish Hiragana and Katakana characters. If compatibility + * with that standard is required, then this attribute should be set + * On, + * and the strength set to Quaternary. This will affect sort key length + * and string comparison string comparison performance. + *

+ *

+ * Possible values are: + * Collator::OFFCollator::ON + * Collator::DEFAULT_VALUE + *

+ * @link http://php.net/manual/en/intl.collator-constants.php + */ + const HIRAGANA_QUATERNARY_MODE = 6; + + /** + *

+ * When turned on, this attribute generates a collation key for the numeric + * value of substrings of digits. This is a way to get '100' to sort AFTER + * '2'. + *

+ *

+ * Possible values are: + * Collator::OFFCollator::ON + * Collator::DEFAULT_VALUE + *

+ * @link http://php.net/manual/en/intl.collator-constants.php + */ + const NUMERIC_COLLATION = 7; + const SORT_REGULAR = 0; + const SORT_STRING = 1; + const SORT_NUMERIC = 2; + + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Create a collator + * @link http://php.net/manual/en/collator.construct.php + * @param $arg1 + */ + public function __construct ($arg1) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Create a collator + * @link http://php.net/manual/en/collator.create.php + * @param string $locale

+ * The locale containing the required collation rules. Special values for + * locales can be passed in - if null is passed for the locale, the + * default locale collation rules will be used. If empty string ("") or + * "root" are passed, UCA rules will be used. + *

+ * @return Collator Return new instance of Collator object, or null + * on error. + */ + public static function create ($locale) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Compare two Unicode strings + * @link http://php.net/manual/en/collator.compare.php + * @param string $str1

+ * The first string to compare. + *

+ * @param string $str2

+ * The second string to compare. + *

+ * @return int Return comparison result:

+ *

+ *

+ * 1 if str1 is greater than + * str2 ; + *

+ *

+ * 0 if str1 is equal to + * str2; + *

+ *

+ * -1 if str1 is less than + * str2 . + *

+ * On error + * boolean + * false + * is returned. + */ + public function compare ($str1, $str2) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Sort array using specified collator + * @link http://php.net/manual/en/collator.sort.php + * @param array $arr

+ * Array of strings to sort. + *

+ * @param int $sort_flag [optional]

+ * Optional sorting type, one of the following: + *

+ *

+ *

+ * Collator::SORT_REGULAR + * - compare items normally (don't change types) + *

+ * @return bool true on success or false on failure. + */ + public function sort (array &$arr, $sort_flag = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Sort array using specified collator and sort keys + * @link http://php.net/manual/en/collator.sortwithsortkeys.php + * @param array $arr

Array of strings to sort

+ * @return bool true on success or false on failure. + */ + public function sortWithSortKeys (array &$arr) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Sort array maintaining index association + * @link http://php.net/manual/en/collator.asort.php + * @param array $arr

Array of strings to sort.

+ * @param int $sort_flag [optional]

+ * Optional sorting type, one of the following: + *

+ * Collator::SORT_REGULAR + * - compare items normally (don't change types) + *

+ * @return bool true on success or false on failure. + */ + public function asort (array &$arr, $sort_flag = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get collation attribute value + * @link http://php.net/manual/en/collator.getattribute.php + * @param int $attr

+ * Attribute to get value for. + *

+ * @return int Attribute value, or boolean false on error. + */ + public function getAttribute ($attr) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Set collation attribute + * @link http://php.net/manual/en/collator.setattribute.php + * @param int $attr

Attribute.

+ * @param int $val

+ * Attribute value. + *

+ * @return bool true on success or false on failure. + */ + public function setAttribute ($attr, $val) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get current collation strength + * @link http://php.net/manual/en/collator.getstrength.php + * @return int current collation strength, or boolean false on error. + */ + public function getStrength () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Set collation strength + * @link http://php.net/manual/en/collator.setstrength.php + * @param int $strength

Strength to set.

+ *

+ * Possible values are: + *

+ * Collator::PRIMARY + *

+ * @return bool true on success or false on failure. + */ + public function setStrength ($strength) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the locale name of the collator + * @link http://php.net/manual/en/collator.getlocale.php + * @param int $type [optional]

+ * You can choose between valid and actual locale ( + * Locale::VALID_LOCALE and + * Locale::ACTUAL_LOCALE, + * respectively). The default is the actual locale. + *

+ * @return string Real locale name from which the collation data comes. If the collator was + * instantiated from rules or an error occurred, returns + * boolean false. + */ + public function getLocale ($type = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get collator's last error code + * @link http://php.net/manual/en/collator.geterrorcode.php + * @return int Error code returned by the last Collator API function call. + */ + public function getErrorCode () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get text for collator's last error code + * @link http://php.net/manual/en/collator.geterrormessage.php + * @return string Description of an error occurred in the last Collator API function call. + */ + public function getErrorMessage () {} + + /** + * (No version information available, might only be in SVN)
+ * Get sorting key for a string + * @link http://php.net/manual/en/collator.getsortkey.php + * @param string $str

+ * The string to produce the key from. + *

+ * @return string the collation key for the string. Collation keys can be compared directly instead of strings. + */ + public function getSortKey ($str) {} + +} + +/** @jms-builtin */ +class NumberFormatter { + + /** + * Decimal format defined by pattern + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PATTERN_DECIMAL = 0; + + /** + * Decimal format + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const DECIMAL = 1; + + /** + * Currency format + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const CURRENCY = 2; + + /** + * Percent format + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PERCENT = 3; + + /** + * Scientific format + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const SCIENTIFIC = 4; + + /** + * Spellout rule-based format + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const SPELLOUT = 5; + + /** + * Ordinal rule-based format + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ORDINAL = 6; + + /** + * Duration rule-based format + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const DURATION = 7; + + /** + * Rule-based format defined by pattern + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PATTERN_RULEBASED = 9; + + /** + * Alias for PATTERN_DECIMAL + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const IGNORE = 0; + + /** + * Default format for the locale + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const DEFAULT_STYLE = 1; + + /** + * Rounding mode to round towards positive infinity. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ROUND_CEILING = 0; + + /** + * Rounding mode to round towards negative infinity. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ROUND_FLOOR = 1; + + /** + * Rounding mode to round towards zero. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ROUND_DOWN = 2; + + /** + * Rounding mode to round away from zero. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ROUND_UP = 3; + + /** + * Rounding mode to round towards the "nearest neighbor" unless both + * neighbors are equidistant, in which case, round towards the even + * neighbor. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ROUND_HALFEVEN = 4; + + /** + * Rounding mode to round towards "nearest neighbor" unless both neighbors + * are equidistant, in which case round down. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ROUND_HALFDOWN = 5; + + /** + * Rounding mode to round towards "nearest neighbor" unless both neighbors + * are equidistant, in which case round up. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ROUND_HALFUP = 6; + + /** + * Pad characters inserted before the prefix. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PAD_BEFORE_PREFIX = 0; + + /** + * Pad characters inserted after the prefix. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PAD_AFTER_PREFIX = 1; + + /** + * Pad characters inserted before the suffix. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PAD_BEFORE_SUFFIX = 2; + + /** + * Pad characters inserted after the suffix. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PAD_AFTER_SUFFIX = 3; + + /** + * Parse integers only. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PARSE_INT_ONLY = 0; + + /** + * Use grouping separator. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const GROUPING_USED = 1; + + /** + * Always show decimal point. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const DECIMAL_ALWAYS_SHOWN = 2; + + /** + * Maximum integer digits. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const MAX_INTEGER_DIGITS = 3; + + /** + * Minimum integer digits. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const MIN_INTEGER_DIGITS = 4; + + /** + * Integer digits. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const INTEGER_DIGITS = 5; + + /** + * Maximum fraction digits. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const MAX_FRACTION_DIGITS = 6; + + /** + * Minimum fraction digits. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const MIN_FRACTION_DIGITS = 7; + + /** + * Fraction digits. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const FRACTION_DIGITS = 8; + + /** + * Multiplier. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const MULTIPLIER = 9; + + /** + * Grouping size. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const GROUPING_SIZE = 10; + + /** + * Rounding Mode. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ROUNDING_MODE = 11; + + /** + * Rounding increment. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ROUNDING_INCREMENT = 12; + + /** + * The width to which the output of format() is padded. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const FORMAT_WIDTH = 13; + + /** + * The position at which padding will take place. See pad position + * constants for possible argument values. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PADDING_POSITION = 14; + + /** + * Secondary grouping size. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const SECONDARY_GROUPING_SIZE = 15; + + /** + * Use significant digits. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const SIGNIFICANT_DIGITS_USED = 16; + + /** + * Minimum significant digits. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const MIN_SIGNIFICANT_DIGITS = 17; + + /** + * Maximum significant digits. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const MAX_SIGNIFICANT_DIGITS = 18; + + /** + * Lenient parse mode used by rule-based formats. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const LENIENT_PARSE = 19; + + /** + * Positive prefix. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const POSITIVE_PREFIX = 0; + + /** + * Positive suffix. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const POSITIVE_SUFFIX = 1; + + /** + * Negative prefix. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const NEGATIVE_PREFIX = 2; + + /** + * Negative suffix. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const NEGATIVE_SUFFIX = 3; + + /** + * The character used to pad to the format width. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PADDING_CHARACTER = 4; + + /** + * The ISO currency code. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const CURRENCY_CODE = 5; + + /** + * The default rule set. This is only available with rule-based + * formatters. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const DEFAULT_RULESET = 6; + + /** + * The public rule sets. This is only available with rule-based + * formatters. This is a read-only attribute. The public rulesets are + * returned as a single string, with each ruleset name delimited by ';' + * (semicolon). + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PUBLIC_RULESETS = 7; + + /** + * The decimal separator. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const DECIMAL_SEPARATOR_SYMBOL = 0; + + /** + * The grouping separator. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const GROUPING_SEPARATOR_SYMBOL = 1; + + /** + * The pattern separator. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PATTERN_SEPARATOR_SYMBOL = 2; + + /** + * The percent sign. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PERCENT_SYMBOL = 3; + + /** + * Zero. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const ZERO_DIGIT_SYMBOL = 4; + + /** + * Character representing a digit in the pattern. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const DIGIT_SYMBOL = 5; + + /** + * The minus sign. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const MINUS_SIGN_SYMBOL = 6; + + /** + * The plus sign. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PLUS_SIGN_SYMBOL = 7; + + /** + * The currency symbol. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const CURRENCY_SYMBOL = 8; + + /** + * The international currency symbol. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const INTL_CURRENCY_SYMBOL = 9; + + /** + * The monetary separator. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const MONETARY_SEPARATOR_SYMBOL = 10; + + /** + * The exponential symbol. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const EXPONENTIAL_SYMBOL = 11; + + /** + * Per mill symbol. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PERMILL_SYMBOL = 12; + + /** + * Escape padding character. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const PAD_ESCAPE_SYMBOL = 13; + + /** + * Infinity symbol. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const INFINITY_SYMBOL = 14; + + /** + * Not-a-number symbol. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const NAN_SYMBOL = 15; + + /** + * Significant digit symbol. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const SIGNIFICANT_DIGIT_SYMBOL = 16; + + /** + * The monetary grouping separator. + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const MONETARY_GROUPING_SEPARATOR_SYMBOL = 17; + + /** + * Derive the type from variable type + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const TYPE_DEFAULT = 0; + + /** + * Format/parse as 32-bit integer + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const TYPE_INT32 = 1; + + /** + * Format/parse as 64-bit integer + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const TYPE_INT64 = 2; + + /** + * Format/parse as floating point value + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const TYPE_DOUBLE = 3; + + /** + * Format/parse as currency value + * @link http://php.net/manual/en/intl.numberformatter-constants.php + */ + const TYPE_CURRENCY = 4; + + + /** + * @param $locale + * @param $style + * @param $pattern [optional] + */ + public function __construct ($locale, $style, $pattern) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Create a number formatter + * @link http://php.net/manual/en/numberformatter.create.php + * @param string $locale

+ * Locale in which the number would be formatted (locale name, e.g. en_CA). + *

+ * @param int $style

+ * Style of the formatting, one of the + * format style constants. If + * NumberFormatter::PATTERN_DECIMAL + * or NumberFormatter::PATTERN_RULEBASED + * is passed then the number format is opened using the given pattern, + * which must conform to the syntax described in + * ICU DecimalFormat + * documentation or + * ICU RuleBasedNumberFormat + * documentation, respectively. + *

+ * @param string $pattern [optional]

+ * Pattern string if the chosen style requires a pattern. + *

+ * @return NumberFormatter NumberFormatter object or false on error. + */ + public static function create ($locale, $style, $pattern = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Format a number + * @link http://php.net/manual/en/numberformatter.format.php + * @param number $value

+ * The value to format. Can be integer or double, + * other values will be converted to a numeric value. + *

+ * @param int $type [optional]

+ * The + * formatting type to use. + *

+ * @return string the string containing formatted value, or false on error. + */ + public function format ($value, $type = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Parse a number + * @link http://php.net/manual/en/numberformatter.parse.php + * @param string $value + * @param int $type [optional]

+ * The + * formatting type to use. By default, + * NumberFormatter::TYPE_DOUBLE is used. + *

+ * @param int $position [optional]

+ * Offset in the string at which to begin parsing. On return, this value + * will hold the offset at which parsing ended. + *

+ * @return mixed The value of the parsed number or false on error. + */ + public function parse ($value, $type = null, &$position = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Format a currency value + * @link http://php.net/manual/en/numberformatter.formatcurrency.php + * @param float $value

+ * The numeric currency value. + *

+ * @param string $currency

+ * The 3-letter ISO 4217 currency code indicating the currency to use. + *

+ * @return string String representing the formatted currency value. + */ + public function formatCurrency ($value, $currency) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Parse a currency number + * @link http://php.net/manual/en/numberformatter.parsecurrency.php + * @param string $value + * @param string $currency

+ * Parameter to receive the currency name (3-letter ISO 4217 currency + * code). + *

+ * @param int $position [optional]

+ * Offset in the string at which to begin parsing. On return, this value + * will hold the offset at which parsing ended. + *

+ * @return float The parsed numeric value or false on error. + */ + public function parseCurrency ($value, &$currency, &$position = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Set an attribute + * @link http://php.net/manual/en/numberformatter.setattribute.php + * @param int $attr

+ * Attribute specifier - one of the + * numeric attribute constants. + *

+ * @param int $value

+ * The attribute value. + *

+ * @return bool true on success or false on failure. + */ + public function setAttribute ($attr, $value) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get an attribute + * @link http://php.net/manual/en/numberformatter.getattribute.php + * @param int $attr

+ * Attribute specifier - one of the + * numeric attribute constants. + *

+ * @return int Return attribute value on success, or false on error. + */ + public function getAttribute ($attr) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Set a text attribute + * @link http://php.net/manual/en/numberformatter.settextattribute.php + * @param int $attr

+ * Attribute specifier - one of the + * text attribute + * constants. + *

+ * @param string $value

+ * Text for the attribute value. + *

+ * @return bool true on success or false on failure. + */ + public function setTextAttribute ($attr, $value) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get a text attribute + * @link http://php.net/manual/en/numberformatter.gettextattribute.php + * @param int $attr

+ * Attribute specifier - one of the + * text attribute constants. + *

+ * @return string Return attribute value on success, or false on error. + */ + public function getTextAttribute ($attr) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Set a symbol value + * @link http://php.net/manual/en/numberformatter.setsymbol.php + * @param int $attr

+ * Symbol specifier, one of the + * format symbol constants. + *

+ * @param string $value

+ * Text for the symbol. + *

+ * @return bool true on success or false on failure. + */ + public function setSymbol ($attr, $value) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get a symbol value + * @link http://php.net/manual/en/numberformatter.getsymbol.php + * @param int $attr

+ * Symbol specifier, one of the + * format symbol constants. + *

+ * @return string The symbol string or false on error. + */ + public function getSymbol ($attr) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Set formatter pattern + * @link http://php.net/manual/en/numberformatter.setpattern.php + * @param string $pattern

+ * Pattern in syntax described in + * ICU DecimalFormat + * documentation. + *

+ * @return bool true on success or false on failure. + */ + public function setPattern ($pattern) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get formatter pattern + * @link http://php.net/manual/en/numberformatter.getpattern.php + * @return string Pattern string that is used by the formatter, or false if an error happens. + */ + public function getPattern () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get formatter locale + * @link http://php.net/manual/en/numberformatter.getlocale.php + * @param int $type [optional]

+ * You can choose between valid and actual locale ( + * Locale::VALID_LOCALE, + * Locale::ACTUAL_LOCALE, + * respectively). The default is the actual locale. + *

+ * @return string The locale name used to create the formatter. + */ + public function getLocale ($type = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get formatter's last error code. + * @link http://php.net/manual/en/numberformatter.geterrorcode.php + * @return int error code from last formatter call. + */ + public function getErrorCode () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get formatter's last error message. + * @link http://php.net/manual/en/numberformatter.geterrormessage.php + * @return string error message from last formatter call. + */ + public function getErrorMessage () {} + +} + +/** @jms-builtin */ +class Normalizer { + + /** + * No decomposition/composition + * @link http://php.net/manual/en/intl.normalizer-constants.php + */ + const NONE = 1; + + /** + * Normalization Form D (NFD) - Canonical Decomposition + * @link http://php.net/manual/en/intl.normalizer-constants.php + */ + const FORM_D = 2; + const NFD = 2; + + /** + * Normalization Form KD (NFKD) - Compatibility Decomposition + * @link http://php.net/manual/en/intl.normalizer-constants.php + */ + const FORM_KD = 3; + const NFKD = 3; + + /** + * Normalization Form C (NFC) - Canonical Decomposition followed by + * Canonical Composition + * @link http://php.net/manual/en/intl.normalizer-constants.php + */ + const FORM_C = 4; + const NFC = 4; + + /** + * Normalization Form KC (NFKC) - Compatibility Decomposition, followed by + * Canonical Composition + * @link http://php.net/manual/en/intl.normalizer-constants.php + */ + const FORM_KC = 5; + const NFKC = 5; + + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Normalizes the input provided and returns the normalized string + * @link http://php.net/manual/en/normalizer.normalize.php + * @param string $input

The input string to normalize

+ * @param string $form [optional]

One of the normalization forms.

+ * @return string The normalized string or null if an error occurred. + */ + public static function normalize ($input, $form = 'Normalizer::FORM_C') {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Checks if the provided string is already in the specified normalization +form. + * @link http://php.net/manual/en/normalizer.isnormalized.php + * @param string $input

The input string to normalize

+ * @param string $form [optional]

+ * One of the normalization forms. + *

+ * @return bool true if normalized, false otherwise or if there an error + */ + public static function isNormalized ($input, $form = 'Normalizer::FORM_C') {} + +} + +/** @jms-builtin */ +class Locale { + + /** + * This is locale the data actually comes from. + * @link http://php.net/manual/en/intl.locale-constants.php + */ + const ACTUAL_LOCALE = 0; + + /** + * This is the most specific locale supported by ICU. + * @link http://php.net/manual/en/intl.locale-constants.php + */ + const VALID_LOCALE = 1; + + /** + * Used as locale parameter with the methods of the various locale affected classes, + * such as NumberFormatter. This constant would make the methods to use default + * locale. + * @link http://php.net/manual/en/intl.locale-constants.php + */ + const DEFAULT_LOCALE = null; + + /** + * Language subtag + * @link http://php.net/manual/en/intl.locale-constants.php + */ + const LANG_TAG = "language"; + + /** + * Extended language subtag + * @link http://php.net/manual/en/intl.locale-constants.php + */ + const EXTLANG_TAG = "extlang"; + + /** + * Script subtag + * @link http://php.net/manual/en/intl.locale-constants.php + */ + const SCRIPT_TAG = "script"; + + /** + * Region subtag + * @link http://php.net/manual/en/intl.locale-constants.php + */ + const REGION_TAG = "region"; + + /** + * Variant subtag + * @link http://php.net/manual/en/intl.locale-constants.php + */ + const VARIANT_TAG = "variant"; + + /** + * Grandfathered Language subtag + * @link http://php.net/manual/en/intl.locale-constants.php + */ + const GRANDFATHERED_LANG_TAG = "grandfathered"; + + /** + * Private subtag + * @link http://php.net/manual/en/intl.locale-constants.php + */ + const PRIVATE_TAG = "private"; + + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Gets the default locale value from the INTL global 'default_locale' + * @link http://php.net/manual/en/locale.getdefault.php + * @return string The current runtime locale + */ + public static function getDefault () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * sets the default runtime locale + * @link http://php.net/manual/en/locale.setdefault.php + * @param string $locale

+ * Is a BCP 47 compliant language tag containing the + *

+ * @return bool true on success or false on failure. + */ + public static function setDefault ($locale) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Gets the primary language for the input locale + * @link http://php.net/manual/en/locale.getprimarylanguage.php + * @param string $locale

+ * The locale to extract the primary language code from + *

+ * @return string The language code associated with the language or null in case of error. + */ + public static function getPrimaryLanguage ($locale) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Gets the script for the input locale + * @link http://php.net/manual/en/locale.getscript.php + * @param string $locale

+ * The locale to extract the script code from + *

+ * @return string The script subtag for the locale or null if not present + */ + public static function getScript ($locale) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Gets the region for the input locale + * @link http://php.net/manual/en/locale.getregion.php + * @param string $locale

+ * The locale to extract the region code from + *

+ * @return string The region subtag for the locale or null if not present + */ + public static function getRegion ($locale) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Gets the keywords for the input locale + * @link http://php.net/manual/en/locale.getkeywords.php + * @param string $locale

+ * The locale to extract the keywords from + *

+ * @return array Associative array containing the keyword-value pairs for this locale + */ + public static function getKeywords ($locale) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Returns an appropriately localized display name for script of the input locale + * @link http://php.net/manual/en/locale.getdisplayscript.php + * @param string $locale

+ * The locale to return a display script for + *

+ * @param string $in_locale [optional]

+ * Optional format locale to use to display the script name + *

+ * @return string Display name of the script for the $locale in the format appropriate for + * $in_locale. + */ + public static function getDisplayScript ($locale, $in_locale = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Returns an appropriately localized display name for region of the input locale + * @link http://php.net/manual/en/locale.getdisplayregion.php + * @param string $locale

+ * The locale to return a display region for. + *

+ * @param string $in_locale [optional]

+ * Optional format locale to use to display the region name + *

+ * @return string display name of the region for the $locale in the format appropriate for + * $in_locale. + */ + public static function getDisplayRegion ($locale, $in_locale = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Returns an appropriately localized display name for the input locale + * @link http://php.net/manual/en/locale.getdisplayname.php + * @param string $locale

+ * The locale to return a display name for. + *

+ * @param string $in_locale [optional]

optional format locale

+ * @return string Display name of the locale in the format appropriate for $in_locale. + */ + public static function getDisplayName ($locale, $in_locale = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Returns an appropriately localized display name for language of the inputlocale + * @link http://php.net/manual/en/locale.getdisplaylanguage.php + * @param string $locale

+ * The locale to return a display language for + *

+ * @param string $in_locale [optional]

+ * Optional format locale to use to display the language name + *

+ * @return string display name of the language for the $locale in the format appropriate for + * $in_locale. + */ + public static function getDisplayLanguage ($locale, $in_locale = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Returns an appropriately localized display name for variants of the input locale + * @link http://php.net/manual/en/locale.getdisplayvariant.php + * @param string $locale

+ * The locale to return a display variant for + *

+ * @param string $in_locale [optional]

+ * Optional format locale to use to display the variant name + *

+ * @return string Display name of the variant for the $locale in the format appropriate for + * $in_locale. + */ + public static function getDisplayVariant ($locale, $in_locale = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Returns a correctly ordered and delimited locale ID + * @link http://php.net/manual/en/locale.composelocale.php + * @param array $subtags

+ * an array containing a list of key-value pairs, where the keys identify + * the particular locale ID subtags, and the values are the associated + * subtag values. + *

+ * The 'variant' and 'private' subtags can take maximum 15 values + * whereas 'extlang' can take maximum 3 values.e.g. Variants are allowed + * with the suffix ranging from 0-14. Hence the keys for the input array + * can be variant0, variant1, ...,variant14. In the returned locale id, + * the subtag is ordered by suffix resulting in variant0 followed by + * variant1 followed by variant2 and so on. + *

+ *

+ * The 'variant', 'private' and 'extlang' multiple values can be specified both + * as array under specific key (e.g. 'variant') and as multiple numbered keys + * (e.g. 'variant0', 'variant1', etc.). + *

+ *

+ * @return string The corresponding locale identifier. + */ + public static function composeLocale (array $subtags) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Returns a key-value array of locale ID subtag elements. + * @link http://php.net/manual/en/locale.parselocale.php + * @param string $locale

+ * The locale to extract the subtag array from. Note: The 'variant' and + * 'private' subtags can take maximum 15 values whereas 'extlang' can take + * maximum 3 values. + *

+ * @return array an array containing a list of key-value pairs, where the keys + * identify the particular locale ID subtags, and the values are the + * associated subtag values. The array will be ordered as the locale id + * subtags e.g. in the locale id if variants are '-varX-varY-varZ' then the + * returned array will have variant0=>varX , variant1=>varY , + * variant2=>varZ + */ + public static function parseLocale ($locale) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Gets the variants for the input locale + * @link http://php.net/manual/en/locale.getallvariants.php + * @param string $locale

+ * The locale to extract the variants from + *

+ * @return array The array containing the list of all variants subtag for the locale + * or null if not present + */ + public static function getAllVariants ($locale) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Checks if a language tag filter matches with locale + * @link http://php.net/manual/en/locale.filtermatches.php + * @param string $langtag

+ * The language tag to check + *

+ * @param string $locale

+ * The language range to check against + *

+ * @param bool $canonicalize [optional]

+ * If true, the arguments will be converted to canonical form before + * matching. + *

+ * @return bool true if $locale matches $langtag false otherwise. + */ + public static function filterMatches ($langtag, $locale, $canonicalize = false) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Searches the language tag list for the best match to the language + * @link http://php.net/manual/en/locale.lookup.php + * @param array $langtag

+ * An array containing a list of language tags to compare to + * locale. Maximum 100 items allowed. + *

+ * @param string $locale

+ * The locale to use as the language range when matching. + *

+ * @param bool $canonicalize [optional]

+ * If true, the arguments will be converted to canonical form before + * matching. + *

+ * @param string $default [optional]

+ * The locale to use if no match is found. + *

+ * @return string The closest matching language tag or default value. + */ + public static function lookup (array $langtag, $locale, $canonicalize = false, $default = null) {} + + /** + * @param $arg1 + */ + public static function canonicalize ($arg1) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Tries to find out best available locale based on HTTP "Accept-Language" header + * @link http://php.net/manual/en/locale.acceptfromhttp.php + * @param string $header

+ * The string containing the "Accept-Language" header according to format in RFC 2616. + *

+ * @return string The corresponding locale identifier. + */ + public static function acceptFromHttp ($header) {} + +} + +/** @jms-builtin */ +class MessageFormatter { + + /** + * @param $locale + * @param $pattern + */ + public function __construct ($locale, $pattern) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Constructs a new Message Formatter + * @link http://php.net/manual/en/messageformatter.create.php + * @param string $locale

+ * The locale to use when formatting arguments + *

+ * @param string $pattern

+ * The pattern string to stick arguments into. + * The pattern uses an 'apostrophe-friendly' syntax; it is run through + * umsg_autoQuoteApostrophe + * before being interpreted. + *

+ * @return MessageFormatter The formatter object + */ + public static function create ($locale, $pattern) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Format the message + * @link http://php.net/manual/en/messageformatter.format.php + * @param array $args

+ * Arguments to insert into the format string + *

+ * @return string The formatted string, or false if an error occurred + */ + public function format (array $args) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Quick format message + * @link http://php.net/manual/en/messageformatter.formatmessage.php + * @param string $locale

+ * The locale to use for formatting locale-dependent parts + *

+ * @param string $pattern

+ * The pattern string to insert things into. + * The pattern uses an 'apostrophe-friendly' syntax; it is run through + * umsg_autoQuoteApostrophe + * before being interpreted. + *

+ * @param array $args

+ * The array of values to insert into the format string + *

+ * @return string The formatted pattern string or false if an error occurred + */ + public static function formatMessage ($locale, $pattern, array $args) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Parse input string according to pattern + * @link http://php.net/manual/en/messageformatter.parse.php + * @param string $value

+ * The string to parse + *

+ * @return array An array containing the items extracted, or false on error + */ + public function parse ($value) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Quick parse input string + * @link http://php.net/manual/en/messageformatter.parsemessage.php + * @param string $locale

+ * The locale to use for parsing locale-dependent parts + *

+ * @param string $pattern

+ * The pattern with which to parse the value. + *

+ * @param string $source

+ * The string to parse, conforming to the pattern. + *

+ * @return array An array containing items extracted, or false on error + */ + public static function parseMessage ($locale, $pattern, $source) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Set the pattern used by the formatter + * @link http://php.net/manual/en/messageformatter.setpattern.php + * @param string $pattern

+ * The pattern string to use in this message formatter. + * The pattern uses an 'apostrophe-friendly' syntax; it is run through + * umsg_autoQuoteApostrophe + * before being interpreted. + *

+ * @return bool true on success or false on failure. + */ + public function setPattern ($pattern) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the pattern used by the formatter + * @link http://php.net/manual/en/messageformatter.getpattern.php + * @return string The pattern string for this message formatter + */ + public function getPattern () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the locale for which the formatter was created. + * @link http://php.net/manual/en/messageformatter.getlocale.php + * @return string The locale name + */ + public function getLocale () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the error code from last operation + * @link http://php.net/manual/en/messageformatter.geterrorcode.php + * @return int The error code, one of UErrorCode values. Initial value is U_ZERO_ERROR. + */ + public function getErrorCode () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the error text from the last operation + * @link http://php.net/manual/en/messageformatter.geterrormessage.php + * @return string Description of the last error. + */ + public function getErrorMessage () {} + +} + +/** @jms-builtin */ +class IntlDateFormatter { + + /** + * Completely specified style (Tuesday, April 12, 1952 AD or 3:30:42pm PST) + * @link http://php.net/manual/en/intl.intldateformatter-constants.php + */ + const FULL = 0; + + /** + * Long style (January 12, 1952 or 3:30:32pm) + * @link http://php.net/manual/en/intl.intldateformatter-constants.php + */ + const LONG = 1; + + /** + * Medium style (Jan 12, 1952) + * @link http://php.net/manual/en/intl.intldateformatter-constants.php + */ + const MEDIUM = 2; + + /** + * Most abbreviated style, only essential data (12/13/52 or 3:30pm) + * @link http://php.net/manual/en/intl.intldateformatter-constants.php + */ + const SHORT = 3; + + /** + * Do not include this element + * @link http://php.net/manual/en/intl.intldateformatter-constants.php + */ + const NONE = -1; + + /** + * Gregorian Calendar + * @link http://php.net/manual/en/intl.intldateformatter-constants.php + */ + const GREGORIAN = 1; + + /** + * Non-Gregorian Calendar + * @link http://php.net/manual/en/intl.intldateformatter-constants.php + */ + const TRADITIONAL = 0; + + + /** + * @param $locale + * @param $datetype + * @param $timetype + * @param $timezone [optional] + * @param $calendar [optional] + * @param $pattern [optional] + */ + public function __construct ($locale, $datetype, $timetype, $timezone, $calendar, $pattern) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Create a date formatter + * @link http://php.net/manual/en/intldateformatter.create.php + * @param string $locale

+ * Locale to use when formatting or parsing. + *

+ * @param int $datetype

+ * Date type to use (none, + * short, medium, + * long, full). + * This is one of the + * IntlDateFormatter constants. + *

+ * @param int $timetype

+ * Time type to use (none, + * short, medium, + * long, full). + * This is one of the + * IntlDateFormatter constants. + *

+ * @param string $timezone [optional]

+ * Time zone ID, default is system default. + *

+ * @param int $calendar [optional]

+ * Calendar to use for formatting or parsing; default is Gregorian. + * This is one of the + * IntlDateFormatter calendar constants. + *

+ * @param string $pattern [optional]

+ * Optional pattern to use when formatting or parsing. + * Possible patterns are documented at &url.icu.datepattern;. + *

+ * @return IntlDateFormatter + */ + public static function create ($locale, $datetype, $timetype, $timezone = null, $calendar = null, $pattern = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the datetype used for the IntlDateFormatter + * @link http://php.net/manual/en/intldateformatter.getdatetype.php + * @return int The current date type value of the formatter. + */ + public function getDateType () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the timetype used for the IntlDateFormatter + * @link http://php.net/manual/en/intldateformatter.gettimetype.php + * @return int The current date type value of the formatter. + */ + public function getTimeType () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the calendar used for the IntlDateFormatter + * @link http://php.net/manual/en/intldateformatter.getcalendar.php + * @return int The calendar being used by the formatter. + */ + public function getCalendar () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * sets the calendar used to the appropriate calendar, which must be + * @link http://php.net/manual/en/intldateformatter.setcalendar.php + * @param int $which

+ * The calendar to use. + * Default is IntlDateFormatter::GREGORIAN. + *

+ * @return bool true on success or false on failure. + */ + public function setCalendar ($which) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the timezone-id used for the IntlDateFormatter + * @link http://php.net/manual/en/intldateformatter.gettimezoneid.php + * @return string ID string for the time zone used by this formatter. + */ + public function getTimeZoneId () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Sets the time zone to use + * @link http://php.net/manual/en/intldateformatter.settimezoneid.php + * @param string $zone

+ * The time zone ID string of the time zone to use. + * If null or the empty string, the default time zone for the runtime is used. + *

+ * @return bool true on success or false on failure. + */ + public function setTimeZoneId ($zone) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Set the pattern used for the IntlDateFormatter + * @link http://php.net/manual/en/intldateformatter.setpattern.php + * @param string $pattern

+ * New pattern string to use. + * Possible patterns are documented at &url.icu.datepattern;. + *

+ * @return bool true on success or false on failure. + * Bad formatstrings are usually the cause of the failure. + */ + public function setPattern ($pattern) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the pattern used for the IntlDateFormatter + * @link http://php.net/manual/en/intldateformatter.getpattern.php + * @return string The pattern string being used to format/parse. + */ + public function getPattern () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the locale used by formatter + * @link http://php.net/manual/en/intldateformatter.getlocale.php + * @param int $which [optional] + * @return string the locale of this formatter or 'false' if error + */ + public function getLocale ($which = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Set the leniency of the parser + * @link http://php.net/manual/en/intldateformatter.setlenient.php + * @param bool $lenient

+ * Sets whether the parser is lenient or not, default is false (strict). + *

+ * @return bool true on success or false on failure. + */ + public function setLenient ($lenient) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the lenient used for the IntlDateFormatter + * @link http://php.net/manual/en/intldateformatter.islenient.php + * @return bool true if parser is lenient, false if parser is strict. By default the parser is strict. + */ + public function isLenient () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Format the date/time value as a string + * @link http://php.net/manual/en/intldateformatter.format.php + * @param mixed $value

+ * Value to format. This may be a DateTime object, + * an integer representing a Unix timestamp value (seconds + * since epoch, UTC) or an array in the format output by + * localtime. + *

+ * @return string The formatted string or, if an error occurred, false. + */ + public function format ($value) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Parse string to a timestamp value + * @link http://php.net/manual/en/intldateformatter.parse.php + * @param string $value

+ * string to convert to a time + *

+ * @param int $position [optional]

+ * Position at which to start the parsing in $value (zero-based). + * If no error occurs before $value is consumed, $parse_pos will contain -1 + * otherwise it will contain the position at which parsing ended (and the error occurred). + * This variable will contain the end position if the parse fails. + * If $parse_pos > strlen($value), the parse fails immediately. + *

+ * @return int timestamp parsed value + */ + public function parse ($value, &$position = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Parse string to a field-based time value + * @link http://php.net/manual/en/intldateformatter.localtime.php + * @param string $value

+ * string to convert to a time + *

+ * @param int $position [optional]

+ * Position at which to start the parsing in $value (zero-based). + * If no error occurs before $value is consumed, $parse_pos will contain -1 + * otherwise it will contain the position at which parsing ended . + * If $parse_pos > strlen($value), the parse fails immediately. + *

+ * @return array Localtime compatible array of integers : contains 24 hour clock value in tm_hour field + */ + public function localtime ($value, &$position = null) {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the error code from last operation + * @link http://php.net/manual/en/intldateformatter.geterrorcode.php + * @return int The error code, one of UErrorCode values. Initial value is U_ZERO_ERROR. + */ + public function getErrorCode () {} + + /** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the error text from the last operation. + * @link http://php.net/manual/en/intldateformatter.geterrormessage.php + * @return string Description of the last error. + */ + public function getErrorMessage () {} + +} + +/** @jms-builtin */ +class ResourceBundle { + + /** + * @param $locale + * @param $bundlename + * @param $fallback [optional] + */ + public function __construct ($locale, $bundlename, $fallback) {} + + /** + * (No version information available, might only be in SVN)
+ * Create a resource bundle + * @link http://php.net/manual/en/resourcebundle.create.php + * @param string $locale

+ * Locale for which the resources should be loaded (locale name, e.g. en_CA). + *

+ * @param string $bundlename

+ * The directory where the data is stored or the name of the .dat file. + *

+ * @param bool $fallback [optional]

+ * Whether locale should match exactly or fallback to parent locale is allowed. + *

+ * @return ResourceBundle ResourceBundle object or false on error. + */ + public static function create ($locale, $bundlename, $fallback = null) {} + + /** + * (No version information available, might only be in SVN)
+ * Get data from the bundle + * @link http://php.net/manual/en/resourcebundle.get.php + * @param string|int $index

+ * Data index, must be string or integer. + *

+ * @return mixed the data located at the index or null on error. Strings, integers and binary data strings + * are returned as corresponding PHP types, integer array is returned as PHP array. Complex types are + * returned as ResourceBundle object. + */ + public function get ($index) {} + + /** + * (No version information available, might only be in SVN)
+ * Get number of elements in the bundle + * @link http://php.net/manual/en/resourcebundle.count.php + * @return int number of elements in the bundle. + */ + public function count () {} + + /** + * (No version information available, might only be in SVN)
+ * Get supported locales + * @link http://php.net/manual/en/resourcebundle.locales.php + * @param $bundlename + * @return array the list of locales supported by the bundle. + */ + public static function getLocales ($bundlename) {} + + /** + * (No version information available, might only be in SVN)
+ * Get bundle's last error code. + * @link http://php.net/manual/en/resourcebundle.geterrorcode.php + * @return int error code from last bundle object call. + */ + public function getErrorCode () {} + + /** + * (No version information available, might only be in SVN)
+ * Get bundle's last error message. + * @link http://php.net/manual/en/resourcebundle.geterrormessage.php + * @return string error message from last bundle object's call. + */ + public function getErrorMessage () {} + +} + +/** + * @param $arg1 + * @jms-builtin + */ +function collator_create ($arg1) {} + +/** + * @param Collator $object + * @param $arg1 + * @param $arg2 + * @jms-builtin + */ +function collator_compare (Collator $object, $arg1, $arg2) {} + +/** + * @param Collator $object + * @param $arg1 + * @jms-builtin + */ +function collator_get_attribute (Collator $object, $arg1) {} + +/** + * @param Collator $object + * @param $arg1 + * @param $arg2 + * @jms-builtin + */ +function collator_set_attribute (Collator $object, $arg1, $arg2) {} + +/** + * @param Collator $object + * @jms-builtin + */ +function collator_get_strength (Collator $object) {} + +/** + * @param Collator $object + * @param $arg1 + * @jms-builtin + */ +function collator_set_strength (Collator $object, $arg1) {} + +/** + * @param Collator $object + * @param $arr + * @param $sort_flags [optional] + * @jms-builtin + */ +function collator_sort (Collator $objectarray , &$arr, $sort_flags) {} + +/** + * @param Collator $object + * @param $arr + * @param $sort_flags [optional] + * @jms-builtin + */ +function collator_sort_with_sort_keys (Collator $objectarray , &$arr, $sort_flags) {} + +/** + * @param Collator $object + * @param $arr + * @param $sort_flags [optional] + * @jms-builtin + */ +function collator_asort (Collator $objectarray , &$arr, $sort_flags) {} + +/** + * @param Collator $object + * @param $arg1 + * @jms-builtin + */ +function collator_get_locale (Collator $object, $arg1) {} + +/** + * @param Collator $object + * @jms-builtin + */ +function collator_get_error_code (Collator $object) {} + +/** + * @param Collator $object + * @jms-builtin + */ +function collator_get_error_message (Collator $object) {} + +/** + * @param Collator $object + * @param $arg1 + * @param $arg2 + * @jms-builtin + */ +function collator_get_sort_key (Collator $object, $arg1, $arg2) {} + +/** + * @param $locale + * @param $style + * @param $pattern [optional] + * @jms-builtin + */ +function numfmt_create ($locale, $style, $pattern) {} + +/** + * @param $nf + * @param $num + * @param $type [optional] + * @jms-builtin + */ +function numfmt_format ($nf, $num, $type) {} + +/** + * @param $formatter + * @param $string + * @param $type [optional] + * @param $position [optional] + * @jms-builtin + */ +function numfmt_parse ($formatter, $string, $type, &$position) {} + +/** + * @param $nf + * @param $num + * @param $currency + * @jms-builtin + */ +function numfmt_format_currency ($nf, $num, $currency) {} + +/** + * @param $formatter + * @param $string + * @param $currency + * @param $position [optional] + * @jms-builtin + */ +function numfmt_parse_currency ($formatter, $string, &$currency, &$position) {} + +/** + * @param $nf + * @param $attr + * @param $value + * @jms-builtin + */ +function numfmt_set_attribute ($nf, $attr, $value) {} + +/** + * @param $nf + * @param $attr + * @jms-builtin + */ +function numfmt_get_attribute ($nf, $attr) {} + +/** + * @param $nf + * @param $attr + * @param $value + * @jms-builtin + */ +function numfmt_set_text_attribute ($nf, $attr, $value) {} + +/** + * @param $nf + * @param $attr + * @jms-builtin + */ +function numfmt_get_text_attribute ($nf, $attr) {} + +/** + * @param $nf + * @param $attr + * @param $symbol + * @jms-builtin + */ +function numfmt_set_symbol ($nf, $attr, $symbol) {} + +/** + * @param $nf + * @param $attr + * @jms-builtin + */ +function numfmt_get_symbol ($nf, $attr) {} + +/** + * @param $nf + * @param $pattern + * @jms-builtin + */ +function numfmt_set_pattern ($nf, $pattern) {} + +/** + * @param $nf + * @jms-builtin + */ +function numfmt_get_pattern ($nf) {} + +/** + * @param $nf + * @param $type [optional] + * @jms-builtin + */ +function numfmt_get_locale ($nf, $type) {} + +/** + * @param $nf + * @jms-builtin + */ +function numfmt_get_error_code ($nf) {} + +/** + * @param $nf + * @jms-builtin + */ +function numfmt_get_error_message ($nf) {} + +/** + * @param $input + * @param $form [optional] + * @jms-builtin + */ +function normalizer_normalize ($input, $form) {} + +/** + * @param $input + * @param $form [optional] + * @jms-builtin + */ +function normalizer_is_normalized ($input, $form) {} + +/** + * Get the default Locale + * @link http://php.net/manual/en/function.locale-get-default.php + * @return string a string with the current Locale. + * @jms-builtin + */ +function locale_get_default () {} + +/** + * Set the default Locale + * @link http://php.net/manual/en/function.locale-set-default.php + * @param string $name

+ * The new Locale name. A comprehensive list of the supported locales is + * available at . + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function locale_set_default ($name) {} + +/** + * @param $arg1 + * @jms-builtin + */ +function locale_get_primary_language ($arg1) {} + +/** + * @param $arg1 + * @jms-builtin + */ +function locale_get_script ($arg1) {} + +/** + * @param $arg1 + * @jms-builtin + */ +function locale_get_region ($arg1) {} + +/** + * @param $arg1 + * @jms-builtin + */ +function locale_get_keywords ($arg1) {} + +/** + * @param $arg1 + * @param $arg2 + * @jms-builtin + */ +function locale_get_display_script ($arg1, $arg2) {} + +/** + * @param $arg1 + * @param $arg2 + * @jms-builtin + */ +function locale_get_display_region ($arg1, $arg2) {} + +/** + * @param $arg1 + * @param $arg2 + * @jms-builtin + */ +function locale_get_display_name ($arg1, $arg2) {} + +/** + * @param $arg1 + * @param $arg2 + * @jms-builtin + */ +function locale_get_display_language ($arg1, $arg2) {} + +/** + * @param $arg1 + * @param $arg2 + * @jms-builtin + */ +function locale_get_display_variant ($arg1, $arg2) {} + +/** + * @param $arg1 + * @jms-builtin + */ +function locale_compose ($arg1) {} + +/** + * @param $arg1 + * @jms-builtin + */ +function locale_parse ($arg1) {} + +/** + * @param $arg1 + * @jms-builtin + */ +function locale_get_all_variants ($arg1) {} + +/** + * @param $arg1 + * @param $arg2 + * @param $arg3 + * @jms-builtin + */ +function locale_filter_matches ($arg1, $arg2, $arg3) {} + +/** + * @param $arg1 + * @jms-builtin + */ +function locale_canonicalize ($arg1) {} + +/** + * @param $arg1 + * @param $arg2 + * @param $arg3 + * @param $arg4 + * @jms-builtin + */ +function locale_lookup ($arg1, $arg2, $arg3, $arg4) {} + +/** + * @param $arg1 + * @jms-builtin + */ +function locale_accept_from_http ($arg1) {} + +/** + * @param $locale + * @param $pattern + * @jms-builtin + */ +function msgfmt_create ($locale, $pattern) {} + +/** + * @param $nf + * @param $args + * @jms-builtin + */ +function msgfmt_format ($nf, $args) {} + +/** + * @param $locale + * @param $pattern + * @param $args + * @jms-builtin + */ +function msgfmt_format_message ($locale, $pattern, $args) {} + +/** + * @param $nf + * @param $source + * @jms-builtin + */ +function msgfmt_parse ($nf, $source) {} + +/** + * @param $locale + * @param $pattern + * @param $source + * @jms-builtin + */ +function msgfmt_parse_message ($locale, $pattern, $source) {} + +/** + * @param $mf + * @param $pattern + * @jms-builtin + */ +function msgfmt_set_pattern ($mf, $pattern) {} + +/** + * @param $mf + * @jms-builtin + */ +function msgfmt_get_pattern ($mf) {} + +/** + * @param $mf + * @jms-builtin + */ +function msgfmt_get_locale ($mf) {} + +/** + * @param $nf + * @jms-builtin + */ +function msgfmt_get_error_code ($nf) {} + +/** + * @param $coll + * @jms-builtin + */ +function msgfmt_get_error_message ($coll) {} + +/** + * @param $locale + * @param $date_type + * @param $time_type + * @param $timezone_str [optional] + * @param $calendar [optional] + * @param $pattern [optional] + * @jms-builtin + */ +function datefmt_create ($locale, $date_type, $time_type, $timezone_str, $calendar, $pattern) {} + +/** + * @param $mf + * @jms-builtin + */ +function datefmt_get_datetype ($mf) {} + +/** + * @param $mf + * @jms-builtin + */ +function datefmt_get_timetype ($mf) {} + +/** + * @param $mf + * @jms-builtin + */ +function datefmt_get_calendar ($mf) {} + +/** + * @param $mf + * @param $calendar + * @jms-builtin + */ +function datefmt_set_calendar ($mf, $calendar) {} + +/** + * @param $mf + * @jms-builtin + */ +function datefmt_get_locale ($mf) {} + +/** + * @param $mf + * @jms-builtin + */ +function datefmt_get_timezone_id ($mf) {} + +/** + * @param $mf + * @jms-builtin + */ +function datefmt_set_timezone_id ($mf) {} + +/** + * @param $mf + * @jms-builtin + */ +function datefmt_get_pattern ($mf) {} + +/** + * @param $mf + * @param $pattern + * @jms-builtin + */ +function datefmt_set_pattern ($mf, $pattern) {} + +/** + * @param $mf + * @jms-builtin + */ +function datefmt_is_lenient ($mf) {} + +/** + * @param $mf + * @jms-builtin + */ +function datefmt_set_lenient ($mf) {} + +/** + * @param $args [optional] + * @param $array [optional] + * @jms-builtin + */ +function datefmt_format ($args, $array) {} + +/** + * @param $formatter + * @param $string + * @param $position [optional] + * @jms-builtin + */ +function datefmt_parse ($formatter, $string, &$position) {} + +/** + * @param $formatter + * @param $string + * @param $position [optional] + * @jms-builtin + */ +function datefmt_localtime ($formatter, $string, &$position) {} + +/** + * @param $nf + * @jms-builtin + */ +function datefmt_get_error_code ($nf) {} + +/** + * @param $coll + * @jms-builtin + */ +function datefmt_get_error_message ($coll) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get string length in grapheme units + * @link http://php.net/manual/en/function.grapheme-strlen.php + * @param string $input

+ * The string being measured for length. It must be a valid UTF-8 string. + *

+ * @return int The length of the string on success, and 0 if the string is empty. + * @jms-builtin + */ +function grapheme_strlen ($input) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Find position (in grapheme units) of first occurrence of a string + * @link http://php.net/manual/en/function.grapheme-strpos.php + * @param string $haystack

+ * The string to look in. Must be valid UTF-8. + *

+ * @param string $needle

+ * The string to look for. Must be valid UTF-8. + *

+ * @param int $offset [optional]

+ * The optional $offset parameter allows you to specify where in $haystack to + * start searching as an offset in grapheme units (not bytes or characters). + * The position returned is still relative to the beginning of haystack + * regardless of the value of $offset. + *

+ * @return int the position as an integer. If needle is not found, strpos() will return boolean FALSE. + * @jms-builtin + */ +function grapheme_strpos ($haystack, $needle, $offset = 0) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Find position (in grapheme units) of first occurrence of a case-insensitive string + * @link http://php.net/manual/en/function.grapheme-stripos.php + * @param string $haystack

+ * The string to look in. Must be valid UTF-8. + *

+ * @param string $needle

+ * The string to look for. Must be valid UTF-8. + *

+ * @param int $offset [optional]

+ * The optional $offset parameter allows you to specify where in haystack to + * start searching as an offset in grapheme units (not bytes or characters). + * The position returned is still relative to the beginning of haystack + * regardless of the value of $offset. + *

+ * @return int the position as an integer. If needle is not found, grapheme_stripos() will return boolean FALSE. + * @jms-builtin + */ +function grapheme_stripos ($haystack, $needle, $offset = 0) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Find position (in grapheme units) of last occurrence of a string + * @link http://php.net/manual/en/function.grapheme-strrpos.php + * @param string $haystack

+ * The string to look in. Must be valid UTF-8. + *

+ * @param string $needle

+ * The string to look for. Must be valid UTF-8. + *

+ * @param int $offset [optional]

+ * The optional $offset parameter allows you to specify where in $haystack to + * start searching as an offset in grapheme units (not bytes or characters). + * The position returned is still relative to the beginning of haystack + * regardless of the value of $offset. + *

+ * @return int the position as an integer. If needle is not found, grapheme_strrpos() will return boolean FALSE. + * @jms-builtin + */ +function grapheme_strrpos ($haystack, $needle, $offset = 0) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Find position (in grapheme units) of last occurrence of a case-insensitive string + * @link http://php.net/manual/en/function.grapheme-strripos.php + * @param string $haystack

+ * The string to look in. Must be valid UTF-8. + *

+ * @param string $needle

+ * The string to look for. Must be valid UTF-8. + *

+ * @param int $offset [optional]

+ * The optional $offset parameter allows you to specify where in $haystack to + * start searching as an offset in grapheme units (not bytes or characters). + * The position returned is still relative to the beginning of haystack + * regardless of the value of $offset. + *

+ * @return int the position as an integer. If needle is not found, grapheme_strripos() will return boolean FALSE. + * @jms-builtin + */ +function grapheme_strripos ($haystack, $needle, $offset = 0) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Return part of a string + * @link http://php.net/manual/en/function.grapheme-substr.php + * @param string $string

+ * The input string. Must be valid UTF-8. + *

+ * @param int $start

+ * Start position in default grapheme units. + * If $start is non-negative, the returned string will start at the + * $start'th position in $string, counting from zero. If $start is negative, + * the returned string will start at the $start'th grapheme unit from the + * end of string. + *

+ * @param int $length [optional]

+ * Length in grapheme units. + * If $length is given and is positive, the string returned will contain + * at most $length grapheme units beginning from $start (depending on the + * length of string). If $length is given and is negative, then + * that many grapheme units will be omitted from the end of string (after the + * start position has been calculated when a start is negative). If $start + * denotes a position beyond this truncation, false will be returned. + *

+ * @return int the extracted part of $string. + * @jms-builtin + */ +function grapheme_substr ($string, $start, $length = null) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Returns part of haystack string from the first occurrence of needle to the end of haystack. + * @link http://php.net/manual/en/function.grapheme-strstr.php + * @param string $haystack

+ * The input string. Must be valid UTF-8. + *

+ * @param string $needle

+ * The string to look for. Must be valid UTF-8. + *

+ * @param bool $before_needle [optional]

+ * If true, grapheme_strstr() returns the part of the + * haystack before the first occurrence of the needle. + *

+ * @return string the portion of string, or FALSE if needle is not found. + * @jms-builtin + */ +function grapheme_strstr ($haystack, $needle, $before_needle = false) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack. + * @link http://php.net/manual/en/function.grapheme-stristr.php + * @param string $haystack

+ * The input string. Must be valid UTF-8. + *

+ * @param string $needle

+ * The string to look for. Must be valid UTF-8. + *

+ * @param bool $before_needle [optional]

+ * If true, grapheme_strstr() returns the part of the + * haystack before the first occurrence of the needle. + *

+ * @return string the portion of $haystack, or FALSE if $needle is not found. + * @jms-builtin + */ +function grapheme_stristr ($haystack, $needle, $before_needle = false) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Function to extract a sequence of default grapheme clusters from a text buffer, which must be encoded in UTF-8. + * @link http://php.net/manual/en/function.grapheme-extract.php + * @param string $haystack

+ * String to search. + *

+ * @param int $size

+ * Maximum number items - based on the $extract_type - to return. + *

+ * @param int $extract_type [optional]

+ * Defines the type of units referred to by the $size parameter: + *

+ *

+ * GRAPHEME_EXTR_COUNT (default) - $size is the number of default + * grapheme clusters to extract. + * GRAPHEME_EXTR_MAXBYTES - $size is the maximum number of bytes + * returned. + * GRAPHEME_EXTR_MAXCHARS - $size is the maximum number of UTF-8 + * characters returned. + *

+ * @param int $start [optional]

+ * Starting position in $haystack in bytes - if given, it must be zero or a + * positive value that is less than or equal to the length of $haystack in + * bytes. If $start does not point to the first byte of a UTF-8 + * character, the start position is moved to the next character boundary. + *

+ * @param int $next [optional]

+ * Reference to a value that will be set to the next starting position. + * When the call returns, this may point to the first byte position past the end of the string. + *

+ * @return string A string starting at offset $start and ending on a default grapheme cluster + * boundary that conforms to the $size and $extract_type specified. + * @jms-builtin + */ +function grapheme_extract ($haystack, $size, $extract_type = null, $start = 0, &$next = null) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.2, PECL idn >= 0.1)
+ * Convert domain name to IDNA ASCII form. + * @link http://php.net/manual/en/function.idn-to-ascii.php + * @param string $domain

+ * Domain to convert. In PHP 5 must be UTF-8 encoded. + *

+ * @param int $options [optional]

+ * Conversion options - combination of IDNA_* constants. + *

+ * @return string Domain name encoded in ASCII-compatible form. or false on failure + * @jms-builtin + */ +function idn_to_ascii ($domain, $options = null) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.2, PECL idn >= 0.1)
+ * Convert domain name from IDNA ASCII to Unicode. + * @link http://php.net/manual/en/function.idn-to-utf8.php + * @param string $domain

+ * Domain to convert in IDNA ASCII-compatible format. + *

+ * @param int $options [optional]

+ * Conversion options - combination of IDNA_* constants. + *

+ * @return string Domain name in Unicode. In PHP 5, domain name will be in UTF-8. or false on failure + * @jms-builtin + */ +function idn_to_utf8 ($domain, $options = null) {} + +/** + * @param $locale + * @param $bundlename + * @param $fallback [optional] + * @jms-builtin + */ +function resourcebundle_create ($locale, $bundlename, $fallback) {} + +/** + * @param $bundle + * @param $index + * @param $fallback [optional] + * @jms-builtin + */ +function resourcebundle_get ($bundle, $index, $fallback) {} + +/** + * @param $bundle + * @jms-builtin + */ +function resourcebundle_count ($bundle) {} + +/** + * @param $bundlename + * @jms-builtin + */ +function resourcebundle_locales ($bundlename) {} + +/** + * @param $bundle + * @jms-builtin + */ +function resourcebundle_get_error_code ($bundle) {} + +/** + * @param $bundle + * @jms-builtin + */ +function resourcebundle_get_error_message ($bundle) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get the last error code + * @link http://php.net/manual/en/function.intl-get-error-code.php + * @return int Error code returned by the last API function call. + * @jms-builtin + */ +function intl_get_error_code () {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get description of the last error + * @link http://php.net/manual/en/function.intl-get-error-message.php + * @return string Description of an error occurred in the last API function call. + * @jms-builtin + */ +function intl_get_error_message () {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Check whether the given error code indicates failure + * @link http://php.net/manual/en/function.intl-is-failure.php + * @param int $error_code

+ * is a value that returned by functions: + * intl_get_error_code, + * collator_get_error_code . + *

+ * @return bool true if it the code indicates some failure, and false + * in case of success or a warning. + * @jms-builtin + */ +function intl_is_failure ($error_code) {} + +/** + * (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
+ * Get symbolic name for a given error code + * @link http://php.net/manual/en/function.intl-error-name.php + * @param int $error_code

+ * ICU error code. + *

+ * @return string The returned string will be the same as the name of the error code + * constant. + * @jms-builtin + */ +function intl_error_name ($error_code) {} + + +/** + * Limit on locale length, set to 80 in PHP code. Locale names longer + * than this limit will not be accepted. + * @link http://php.net/manual/en/intl.constants.php + */ +define ('INTL_MAX_LOCALE_LEN', 80); +define ('ULOC_ACTUAL_LOCALE', 0); +define ('ULOC_VALID_LOCALE', 1); +define ('GRAPHEME_EXTR_COUNT', 0); +define ('GRAPHEME_EXTR_MAXBYTES', 1); +define ('GRAPHEME_EXTR_MAXCHARS', 2); +define ('U_USING_FALLBACK_WARNING', -128); +define ('U_ERROR_WARNING_START', -128); +define ('U_USING_DEFAULT_WARNING', -127); +define ('U_SAFECLONE_ALLOCATED_WARNING', -126); +define ('U_STATE_OLD_WARNING', -125); +define ('U_STRING_NOT_TERMINATED_WARNING', -124); +define ('U_SORT_KEY_TOO_SHORT_WARNING', -123); +define ('U_AMBIGUOUS_ALIAS_WARNING', -122); +define ('U_DIFFERENT_UCA_VERSION', -121); +define ('U_ERROR_WARNING_LIMIT', -119); +define ('U_ZERO_ERROR', 0); +define ('U_ILLEGAL_ARGUMENT_ERROR', 1); +define ('U_MISSING_RESOURCE_ERROR', 2); +define ('U_INVALID_FORMAT_ERROR', 3); +define ('U_FILE_ACCESS_ERROR', 4); +define ('U_INTERNAL_PROGRAM_ERROR', 5); +define ('U_MESSAGE_PARSE_ERROR', 6); +define ('U_MEMORY_ALLOCATION_ERROR', 7); +define ('U_INDEX_OUTOFBOUNDS_ERROR', 8); +define ('U_PARSE_ERROR', 9); +define ('U_INVALID_CHAR_FOUND', 10); +define ('U_TRUNCATED_CHAR_FOUND', 11); +define ('U_ILLEGAL_CHAR_FOUND', 12); +define ('U_INVALID_TABLE_FORMAT', 13); +define ('U_INVALID_TABLE_FILE', 14); +define ('U_BUFFER_OVERFLOW_ERROR', 15); +define ('U_UNSUPPORTED_ERROR', 16); +define ('U_RESOURCE_TYPE_MISMATCH', 17); +define ('U_ILLEGAL_ESCAPE_SEQUENCE', 18); +define ('U_UNSUPPORTED_ESCAPE_SEQUENCE', 19); +define ('U_NO_SPACE_AVAILABLE', 20); +define ('U_CE_NOT_FOUND_ERROR', 21); +define ('U_PRIMARY_TOO_LONG_ERROR', 22); +define ('U_STATE_TOO_OLD_ERROR', 23); +define ('U_TOO_MANY_ALIASES_ERROR', 24); +define ('U_ENUM_OUT_OF_SYNC_ERROR', 25); +define ('U_INVARIANT_CONVERSION_ERROR', 26); +define ('U_INVALID_STATE_ERROR', 27); +define ('U_COLLATOR_VERSION_MISMATCH', 28); +define ('U_USELESS_COLLATOR_ERROR', 29); +define ('U_NO_WRITE_PERMISSION', 30); +define ('U_STANDARD_ERROR_LIMIT', 31); +define ('U_BAD_VARIABLE_DEFINITION', 65536); +define ('U_PARSE_ERROR_START', 65536); +define ('U_MALFORMED_RULE', 65537); +define ('U_MALFORMED_SET', 65538); +define ('U_MALFORMED_SYMBOL_REFERENCE', 65539); +define ('U_MALFORMED_UNICODE_ESCAPE', 65540); +define ('U_MALFORMED_VARIABLE_DEFINITION', 65541); +define ('U_MALFORMED_VARIABLE_REFERENCE', 65542); +define ('U_MISMATCHED_SEGMENT_DELIMITERS', 65543); +define ('U_MISPLACED_ANCHOR_START', 65544); +define ('U_MISPLACED_CURSOR_OFFSET', 65545); +define ('U_MISPLACED_QUANTIFIER', 65546); +define ('U_MISSING_OPERATOR', 65547); +define ('U_MISSING_SEGMENT_CLOSE', 65548); +define ('U_MULTIPLE_ANTE_CONTEXTS', 65549); +define ('U_MULTIPLE_CURSORS', 65550); +define ('U_MULTIPLE_POST_CONTEXTS', 65551); +define ('U_TRAILING_BACKSLASH', 65552); +define ('U_UNDEFINED_SEGMENT_REFERENCE', 65553); +define ('U_UNDEFINED_VARIABLE', 65554); +define ('U_UNQUOTED_SPECIAL', 65555); +define ('U_UNTERMINATED_QUOTE', 65556); +define ('U_RULE_MASK_ERROR', 65557); +define ('U_MISPLACED_COMPOUND_FILTER', 65558); +define ('U_MULTIPLE_COMPOUND_FILTERS', 65559); +define ('U_INVALID_RBT_SYNTAX', 65560); +define ('U_INVALID_PROPERTY_PATTERN', 65561); +define ('U_MALFORMED_PRAGMA', 65562); +define ('U_UNCLOSED_SEGMENT', 65563); +define ('U_ILLEGAL_CHAR_IN_SEGMENT', 65564); +define ('U_VARIABLE_RANGE_EXHAUSTED', 65565); +define ('U_VARIABLE_RANGE_OVERLAP', 65566); +define ('U_ILLEGAL_CHARACTER', 65567); +define ('U_INTERNAL_TRANSLITERATOR_ERROR', 65568); +define ('U_INVALID_ID', 65569); +define ('U_INVALID_FUNCTION', 65570); +define ('U_PARSE_ERROR_LIMIT', 65571); +define ('U_UNEXPECTED_TOKEN', 65792); +define ('U_FMT_PARSE_ERROR_START', 65792); +define ('U_MULTIPLE_DECIMAL_SEPARATORS', 65793); +define ('U_MULTIPLE_DECIMAL_SEPERATORS', 65793); +define ('U_MULTIPLE_EXPONENTIAL_SYMBOLS', 65794); +define ('U_MALFORMED_EXPONENTIAL_PATTERN', 65795); +define ('U_MULTIPLE_PERCENT_SYMBOLS', 65796); +define ('U_MULTIPLE_PERMILL_SYMBOLS', 65797); +define ('U_MULTIPLE_PAD_SPECIFIERS', 65798); +define ('U_PATTERN_SYNTAX_ERROR', 65799); +define ('U_ILLEGAL_PAD_POSITION', 65800); +define ('U_UNMATCHED_BRACES', 65801); +define ('U_UNSUPPORTED_PROPERTY', 65802); +define ('U_UNSUPPORTED_ATTRIBUTE', 65803); +define ('U_FMT_PARSE_ERROR_LIMIT', 65809); +define ('U_BRK_INTERNAL_ERROR', 66048); +define ('U_BRK_ERROR_START', 66048); +define ('U_BRK_HEX_DIGITS_EXPECTED', 66049); +define ('U_BRK_SEMICOLON_EXPECTED', 66050); +define ('U_BRK_RULE_SYNTAX', 66051); +define ('U_BRK_UNCLOSED_SET', 66052); +define ('U_BRK_ASSIGN_ERROR', 66053); +define ('U_BRK_VARIABLE_REDFINITION', 66054); +define ('U_BRK_MISMATCHED_PAREN', 66055); +define ('U_BRK_NEW_LINE_IN_QUOTED_STRING', 66056); +define ('U_BRK_UNDEFINED_VARIABLE', 66057); +define ('U_BRK_INIT_ERROR', 66058); +define ('U_BRK_RULE_EMPTY_SET', 66059); +define ('U_BRK_UNRECOGNIZED_OPTION', 66060); +define ('U_BRK_MALFORMED_RULE_TAG', 66061); +define ('U_BRK_ERROR_LIMIT', 66062); +define ('U_REGEX_INTERNAL_ERROR', 66304); +define ('U_REGEX_ERROR_START', 66304); +define ('U_REGEX_RULE_SYNTAX', 66305); +define ('U_REGEX_INVALID_STATE', 66306); +define ('U_REGEX_BAD_ESCAPE_SEQUENCE', 66307); +define ('U_REGEX_PROPERTY_SYNTAX', 66308); +define ('U_REGEX_UNIMPLEMENTED', 66309); +define ('U_REGEX_MISMATCHED_PAREN', 66310); +define ('U_REGEX_NUMBER_TOO_BIG', 66311); +define ('U_REGEX_BAD_INTERVAL', 66312); +define ('U_REGEX_MAX_LT_MIN', 66313); +define ('U_REGEX_INVALID_BACK_REF', 66314); +define ('U_REGEX_INVALID_FLAG', 66315); +define ('U_REGEX_LOOK_BEHIND_LIMIT', 66316); +define ('U_REGEX_SET_CONTAINS_STRING', 66317); +define ('U_REGEX_ERROR_LIMIT', 66324); +define ('U_STRINGPREP_PROHIBITED_ERROR', 66560); +define ('U_STRINGPREP_UNASSIGNED_ERROR', 66561); +define ('U_STRINGPREP_CHECK_BIDI_ERROR', 66562); +define ('U_ERROR_LIMIT', 66818); + +/** + * Prohibit processing of unassigned codepoints in the input for IDN + * functions and do not check if the input conforms to domain name ASCII rules. + * @link http://php.net/manual/en/intl.constants.php + */ +define ('IDNA_DEFAULT', 0); + +/** + * Allow processing of unassigned codepoints in the input for IDN functions. + * @link http://php.net/manual/en/intl.constants.php + */ +define ('IDNA_ALLOW_UNASSIGNED', 1); + +/** + * Check if the input for IDN functions conforms to domain name ASCII rules. + * @link http://php.net/manual/en/intl.constants.php + */ +define ('IDNA_USE_STD3_RULES', 2); + +// End of intl v.1.1.0 +?> diff --git a/res/php-5.4-core-api/json.php b/res/php-5.4-core-api/json.php new file mode 100644 index 0000000..684e947 --- /dev/null +++ b/res/php-5.4-core-api/json.php @@ -0,0 +1,209 @@ +json_encode. + * @link http://php.net/manual/en/class.jsonserializable.php + */ +interface JsonSerializable { + + /** + * (PHP 5 >= 5.4.0)
+ * Specify data which should be serialized to JSON + * @link http://php.net/manual/en/jsonserializable.jsonserialize.php + * @return mixed Return data which should be serialized by json_encode. + */ + abstract public function jsonSerialize (); + +} + +/** + * (PHP 5 >= 5.2.0, PECL json >= 1.2.0)
+ * Returns the JSON representation of a value + * @link http://php.net/manual/en/function.json-encode.php + * @param mixed $value

+ * The value being encoded. Can be any type except + * a resource. + *

+ *

+ * This function only works with UTF-8 encoded data. + *

+ * @param int $options [optional]

+ * Bitmask consisting of JSON_HEX_QUOT, + * JSON_HEX_TAG, + * JSON_HEX_AMP, + * JSON_HEX_APOS, + * JSON_NUMERIC_CHECK, + * JSON_PRETTY_PRINT, + * JSON_UNESCAPED_SLASHES, + * JSON_FORCE_OBJECT, + * JSON_UNESCAPED_UNICODE. + *

+ * @return string a JSON encoded string on success or FALSE on failure. + * @jms-builtin + */ +function json_encode ($value, $options = 0) {} + +/** + * (PHP 5 >= 5.2.0, PECL json >= 1.2.0)
+ * Decodes a JSON string + * @link http://php.net/manual/en/function.json-decode.php + * @param string $json

+ * The json string being decoded. + *

+ *

+ * This function only works with UTF-8 encoded data. + *

+ * @param bool $assoc [optional]

+ * When TRUE, returned objects will be converted into + * associative arrays. + *

+ * @param int $depth [optional]

+ * User specified recursion depth. + *

+ * @param int $options [optional]

+ * Bitmask of JSON decode options. Currently only + * JSON_BIGINT_AS_STRING + * is supported (default is to cast large integers as floats) + *

+ * @return mixed the value encoded in json in appropriate + * PHP type. Values true, false and + * null (case-insensitive) are returned as TRUE, FALSE + * and NULL respectively. NULL is returned if the + * json cannot be decoded or if the encoded + * data is deeper than the recursion limit. + * @jms-builtin + */ +function json_decode ($json, $assoc = false, $depth = 512, $options = 0) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Returns the last error occurred + * @link http://php.net/manual/en/function.json-last-error.php + * @return int an integer, the value can be one of the following + * constants: + * @jms-builtin + */ +function json_last_error () {} + + +/** + * All < and > are converted to \u003C and \u003E. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_HEX_TAG', 1); + +/** + * All &#38;s are converted to \u0026. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_HEX_AMP', 2); + +/** + * All ' are converted to \u0027. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_HEX_APOS', 4); + +/** + * All " are converted to \u0022. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_HEX_QUOT', 8); + +/** + * Outputs an object rather than an array when a non-associative array is + * used. Especially useful when the recipient of the output is expecting + * an object and the array is empty. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_FORCE_OBJECT', 16); + +/** + * Encodes numeric strings as numbers. + * Available since PHP 5.3.3. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_NUMERIC_CHECK', 32); + +/** + * Don't escape /. + * Available since PHP 5.4.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_UNESCAPED_SLASHES', 64); + +/** + * Use whitespace in returned data to format it. + * Available since PHP 5.4.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_PRETTY_PRINT', 128); + +/** + * Encode multibyte Unicode characters literally (default is to escape as \uXXXX). + * Available since PHP 5.4.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_UNESCAPED_UNICODE', 256); + +/** + * No error has occurred. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_ERROR_NONE', 0); + +/** + * The maximum stack depth has been exceeded. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_ERROR_DEPTH', 1); + +/** + * Occurs with underflow or with the modes mismatch. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_ERROR_STATE_MISMATCH', 2); + +/** + * Control character error, possibly incorrectly encoded. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_ERROR_CTRL_CHAR', 3); + +/** + * Syntax error. + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_ERROR_SYNTAX', 4); + +/** + * Malformed UTF-8 characters, possibly incorrectly encoded. This + * constant is available as of PHP 5.3.1. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_ERROR_UTF8', 5); +define ('JSON_OBJECT_AS_ARRAY', 1); + +/** + * Encodes large integers as their original string value. + * Available since PHP 5.4.0. + * @link http://php.net/manual/en/json.constants.php + */ +define ('JSON_BIGINT_AS_STRING', 2); + +// End of json v.1.2.1 +?> diff --git a/res/php-5.4-core-api/ldap.php b/res/php-5.4-core-api/ldap.php new file mode 100644 index 0000000..54394f2 --- /dev/null +++ b/res/php-5.4-core-api/ldap.php @@ -0,0 +1,1063 @@ + + * Connect to an LDAP server + * @link http://php.net/manual/en/function.ldap-connect.php + * @param string $hostname [optional]

+ * If you are using OpenLDAP 2.x.x you can specify a URL instead of the + * hostname. To use LDAP with SSL, compile OpenLDAP 2.x.x with SSL + * support, configure PHP with SSL, and set this parameter as + * ldaps://hostname/. + *

+ * @param int $port [optional]

+ * The port to connect to. Not used when using URLs. + *

+ * @return resource a positive LDAP link identifier on success, or FALSE on error. + * When OpenLDAP 2.x.x is used, ldap_connect will always + * return a resource as it does not actually connect but just + * initializes the connecting parameters. The actual connect happens with + * the next calls to ldap_* funcs, usually with + * ldap_bind. + *

+ *

+ * If no arguments are specified then the link identifier of the already + * opened link will be returned. + * @jms-builtin + */ +function ldap_connect ($hostname = null, $port = 389) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of ldap_unbind + * @link http://php.net/manual/en/function.ldap-close.php + * @param $link_identifier + * @jms-builtin + */ +function ldap_close ($link_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Bind to LDAP directory + * @link http://php.net/manual/en/function.ldap-bind.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $bind_rdn [optional] + * @param string $bind_password [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_bind ($link_identifier, $bind_rdn = null, $bind_password = null) {} + +/** + * (PHP 5)
+ * Bind to LDAP directory using SASL + * @link http://php.net/manual/en/function.ldap-sasl-bind.php + * @param resource $link + * @param string $binddn [optional] + * @param string $password [optional] + * @param string $sasl_mech [optional] + * @param string $sasl_realm [optional] + * @param string $sasl_authc_id [optional] + * @param string $sasl_authz_id [optional] + * @param string $props [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_sasl_bind ($link, $binddn = null, $password = null, $sasl_mech = null, $sasl_realm = null, $sasl_authc_id = null, $sasl_authz_id = null, $props = null) {} + +/** + * (PHP 4, PHP 5)
+ * Unbind from LDAP directory + * @link http://php.net/manual/en/function.ldap-unbind.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_unbind ($link_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Read an entry + * @link http://php.net/manual/en/function.ldap-read.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $base_dn

+ * The base DN for the directory. + *

+ * @param string $filter

+ * An empty filter is not allowed. If you want to retrieve absolutely all + * information for this entry, use a filter of + * objectClass=*. If you know which entry types are + * used on the directory server, you might use an appropriate filter such + * as objectClass=inetOrgPerson. + *

+ * @param array $attributes [optional]

+ * An array of the required attributes, e.g. array("mail", "sn", "cn"). + * Note that the "dn" is always returned irrespective of which attributes + * types are requested. + *

+ *

+ * Using this parameter is much more efficient than the default action + * (which is to return all attributes and their associated values). + * The use of this parameter should therefore be considered good + * practice. + *

+ * @param int $attrsonly [optional]

+ * Should be set to 1 if only attribute types are wanted. If set to 0 + * both attributes types and attribute values are fetched which is the + * default behaviour. + *

+ * @param int $sizelimit [optional]

+ * Enables you to limit the count of entries fetched. Setting this to 0 + * means no limit. + *

+ *

+ * This parameter can NOT override server-side preset sizelimit. You can + * set it lower though. + *

+ *

+ * Some directory server hosts will be configured to return no more than + * a preset number of entries. If this occurs, the server will indicate + * that it has only returned a partial results set. This also occurs if + * you use this parameter to limit the count of fetched entries. + *

+ * @param int $timelimit [optional]

+ * Sets the number of seconds how long is spend on the search. Setting + * this to 0 means no limit. + *

+ *

+ * This parameter can NOT override server-side preset timelimit. You can + * set it lower though. + *

+ * @param int $deref [optional]

+ * Specifies how aliases should be handled during the search. It can be + * one of the following: + * LDAP_DEREF_NEVER - (default) aliases are never + * dereferenced. + * @return resource a search result identifier or FALSE on error. + * @jms-builtin + */ +function ldap_read ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) {} + +/** + * (PHP 4, PHP 5)
+ * Single-level search + * @link http://php.net/manual/en/function.ldap-list.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $base_dn

+ * The base DN for the directory. + *

+ * @param string $filter + * @param array $attributes [optional]

+ * An array of the required attributes, e.g. array("mail", "sn", "cn"). + * Note that the "dn" is always returned irrespective of which attributes + * types are requested. + *

+ *

+ * Using this parameter is much more efficient than the default action + * (which is to return all attributes and their associated values). + * The use of this parameter should therefore be considered good + * practice. + *

+ * @param int $attrsonly [optional]

+ * Should be set to 1 if only attribute types are wanted. If set to 0 + * both attributes types and attribute values are fetched which is the + * default behaviour. + *

+ * @param int $sizelimit [optional]

+ * Enables you to limit the count of entries fetched. Setting this to 0 + * means no limit. + *

+ *

+ * This parameter can NOT override server-side preset sizelimit. You can + * set it lower though. + *

+ *

+ * Some directory server hosts will be configured to return no more than + * a preset number of entries. If this occurs, the server will indicate + * that it has only returned a partial results set. This also occurs if + * you use this parameter to limit the count of fetched entries. + *

+ * @param int $timelimit [optional]

+ * Sets the number of seconds how long is spend on the search. Setting + * this to 0 means no limit. + *

+ *

+ * This parameter can NOT override server-side preset timelimit. You can + * set it lower though. + *

+ * @param int $deref [optional]

+ * Specifies how aliases should be handled during the search. It can be + * one of the following: + * LDAP_DEREF_NEVER - (default) aliases are never + * dereferenced. + * @return resource a search result identifier or FALSE on error. + * @jms-builtin + */ +function ldap_list ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) {} + +/** + * (PHP 4, PHP 5)
+ * Search LDAP tree + * @link http://php.net/manual/en/function.ldap-search.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $base_dn

+ * The base DN for the directory. + *

+ * @param string $filter

+ * The search filter can be simple or advanced, using boolean operators in + * the format described in the LDAP documentation (see the Netscape Directory SDK for full + * information on filters). + *

+ * @param array $attributes [optional]

+ * An array of the required attributes, e.g. array("mail", "sn", "cn"). + * Note that the "dn" is always returned irrespective of which attributes + * types are requested. + *

+ *

+ * Using this parameter is much more efficient than the default action + * (which is to return all attributes and their associated values). + * The use of this parameter should therefore be considered good + * practice. + *

+ * @param int $attrsonly [optional]

+ * Should be set to 1 if only attribute types are wanted. If set to 0 + * both attributes types and attribute values are fetched which is the + * default behaviour. + *

+ * @param int $sizelimit [optional]

+ * Enables you to limit the count of entries fetched. Setting this to 0 + * means no limit. + *

+ *

+ * This parameter can NOT override server-side preset sizelimit. You can + * set it lower though. + *

+ *

+ * Some directory server hosts will be configured to return no more than + * a preset number of entries. If this occurs, the server will indicate + * that it has only returned a partial results set. This also occurs if + * you use this parameter to limit the count of fetched entries. + *

+ * @param int $timelimit [optional]

+ * Sets the number of seconds how long is spend on the search. Setting + * this to 0 means no limit. + *

+ *

+ * This parameter can NOT override server-side preset timelimit. You can + * set it lower though. + *

+ * @param int $deref [optional]

+ * Specifies how aliases should be handled during the search. It can be + * one of the following: + * LDAP_DEREF_NEVER - (default) aliases are never + * dereferenced. + * @return resource a search result identifier or FALSE on error. + * @jms-builtin + */ +function ldap_search ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) {} + +/** + * (PHP 4, PHP 5)
+ * Free result memory + * @link http://php.net/manual/en/function.ldap-free-result.php + * @param resource $result_identifier + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_free_result ($result_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Count the number of entries in a search + * @link http://php.net/manual/en/function.ldap-count-entries.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result_identifier

+ * The internal LDAP result. + *

+ * @return int number of entries in the result or FALSE on error. + * @jms-builtin + */ +function ldap_count_entries ($link_identifier, $result_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Return first result id + * @link http://php.net/manual/en/function.ldap-first-entry.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result_identifier + * @return resource the result entry identifier for the first entry on success and + * FALSE on error. + * @jms-builtin + */ +function ldap_first_entry ($link_identifier, $result_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Get next result entry + * @link http://php.net/manual/en/function.ldap-next-entry.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result_entry_identifier + * @return resource entry identifier for the next entry in the result whose entries + * are being read starting with ldap_first_entry. If + * there are no more entries in the result then it returns FALSE. + * @jms-builtin + */ +function ldap_next_entry ($link_identifier, $result_entry_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Get all result entries + * @link http://php.net/manual/en/function.ldap-get-entries.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result_identifier + * @return array a complete result information in a multi-dimensional array on + * success and FALSE on error. + *

+ *

+ * The structure of the array is as follows. + * The attribute index is converted to lowercase. (Attributes are + * case-insensitive for directory servers, but not when used as + * array indices.) + *

+ * return_value["count"] = number of entries in the result
+ * return_value[0] : refers to the details of first entry
+ * return_value[i]["dn"] = DN of the ith entry in the result
+ * return_value[i]["count"] = number of attributes in ith entry
+ * return_value[i][j] = NAME of the jth attribute in the ith entry in the result
+ * return_value[i]["attribute"]["count"] = number of values for
+ * attribute in ith entry
+ * return_value[i]["attribute"][j] = jth value of attribute in ith entry
+ * 
+ * @jms-builtin + */ +function ldap_get_entries ($link_identifier, $result_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Return first attribute + * @link http://php.net/manual/en/function.ldap-first-attribute.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result_entry_identifier + * @return string the first attribute in the entry on success and FALSE on + * error. + * @jms-builtin + */ +function ldap_first_attribute ($link_identifier, $result_entry_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Get the next attribute in result + * @link http://php.net/manual/en/function.ldap-next-attribute.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result_entry_identifier + * @return string the next attribute in an entry on success and FALSE on + * error. + * @jms-builtin + */ +function ldap_next_attribute ($link_identifier, $result_entry_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Get attributes from a search result entry + * @link http://php.net/manual/en/function.ldap-get-attributes.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result_entry_identifier + * @return array a complete entry information in a multi-dimensional array + * on success and FALSE on error. + * @jms-builtin + */ +function ldap_get_attributes ($link_identifier, $result_entry_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Get all values from a result entry + * @link http://php.net/manual/en/function.ldap-get-values.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result_entry_identifier + * @param string $attribute + * @return array an array of values for the attribute on success and FALSE on + * error. The number of values can be found by indexing "count" in the + * resultant array. Individual values are accessed by integer index in the + * array. The first index is 0. + *

+ *

+ * LDAP allows more than one entry for an attribute, so it can, for example, + * store a number of email addresses for one person's directory entry all + * labeled with the attribute "mail" + * return_value["count"] = number of values for attribute + * return_value[0] = first value of attribute + * return_value[i] = ith value of attribute + * @jms-builtin + */ +function ldap_get_values ($link_identifier, $result_entry_identifier, $attribute) {} + +/** + * (PHP 4, PHP 5)
+ * Get all binary values from a result entry + * @link http://php.net/manual/en/function.ldap-get-values-len.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result_entry_identifier + * @param string $attribute + * @return array an array of values for the attribute on success and FALSE on + * error. Individual values are accessed by integer index in the array. The + * first index is 0. The number of values can be found by indexing "count" + * in the resultant array. + * @jms-builtin + */ +function ldap_get_values_len ($link_identifier, $result_entry_identifier, $attribute) {} + +/** + * (PHP 4, PHP 5)
+ * Get the DN of a result entry + * @link http://php.net/manual/en/function.ldap-get-dn.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result_entry_identifier + * @return string the DN of the result entry and FALSE on error. + * @jms-builtin + */ +function ldap_get_dn ($link_identifier, $result_entry_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Splits DN into its component parts + * @link http://php.net/manual/en/function.ldap-explode-dn.php + * @param string $dn

+ * The distinguished name of an LDAP entity. + *

+ * @param int $with_attrib

+ * Used to request if the RDNs are returned with only values or their + * attributes as well. To get RDNs with the attributes (i.e. in + * attribute=value format) set with_attrib to 0 + * and to get only values set it to 1. + *

+ * @return array an array of all DN components. + * The first element in this array has count key and + * represents the number of returned values, next elements are numerically + * indexed DN components. + * @jms-builtin + */ +function ldap_explode_dn ($dn, $with_attrib) {} + +/** + * (PHP 4, PHP 5)
+ * Convert DN to User Friendly Naming format + * @link http://php.net/manual/en/function.ldap-dn2ufn.php + * @param string $dn

+ * The distinguished name of an LDAP entity. + *

+ * @return string the user friendly name. + * @jms-builtin + */ +function ldap_dn2ufn ($dn) {} + +/** + * (PHP 4, PHP 5)
+ * Add entries to LDAP directory + * @link http://php.net/manual/en/function.ldap-add.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $dn

+ * The distinguished name of an LDAP entity. + *

+ * @param array $entry

+ * An array that specifies the information about the entry. The values in + * the entries are indexed by individual attributes. + * In case of multiple values for an attribute, they are indexed using + * integers starting with 0. + * + * $entree["attribut1"] = "value"; + * $entree["attribut2"][0] = "value1"; + * $entree["attribut2"][1] = "value2"; + * + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_add ($link_identifier, $dn, array $entry) {} + +/** + * (PHP 4, PHP 5)
+ * Delete an entry from a directory + * @link http://php.net/manual/en/function.ldap-delete.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $dn

+ * The distinguished name of an LDAP entity. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_delete ($link_identifier, $dn) {} + +/** + * (PHP 4, PHP 5)
+ * Modify an LDAP entry + * @link http://php.net/manual/en/function.ldap-modify.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $dn

+ * The distinguished name of an LDAP entity. + *

+ * @param array $entry + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_modify ($link_identifier, $dn, array $entry) {} + +/** + * (PHP 4, PHP 5)
+ * Add attribute values to current attributes + * @link http://php.net/manual/en/function.ldap-mod-add.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $dn

+ * The distinguished name of an LDAP entity. + *

+ * @param array $entry + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_mod_add ($link_identifier, $dn, array $entry) {} + +/** + * (PHP 4, PHP 5)
+ * Replace attribute values with new ones + * @link http://php.net/manual/en/function.ldap-mod-replace.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $dn

+ * The distinguished name of an LDAP entity. + *

+ * @param array $entry + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_mod_replace ($link_identifier, $dn, array $entry) {} + +/** + * (PHP 4, PHP 5)
+ * Delete attribute values from current attributes + * @link http://php.net/manual/en/function.ldap-mod-del.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $dn

+ * The distinguished name of an LDAP entity. + *

+ * @param array $entry + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_mod_del ($link_identifier, $dn, array $entry) {} + +/** + * (PHP 4, PHP 5)
+ * Return the LDAP error number of the last LDAP command + * @link http://php.net/manual/en/function.ldap-errno.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @return int Return the LDAP error number of the last LDAP command for this + * link. + * @jms-builtin + */ +function ldap_errno ($link_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Convert LDAP error number into string error message + * @link http://php.net/manual/en/function.ldap-err2str.php + * @param int $errno

+ * The error number. + *

+ * @return string the error message, as a string. + * @jms-builtin + */ +function ldap_err2str ($errno) {} + +/** + * (PHP 4, PHP 5)
+ * Return the LDAP error message of the last LDAP command + * @link http://php.net/manual/en/function.ldap-error.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @return string string error message. + * @jms-builtin + */ +function ldap_error ($link_identifier) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Compare value of attribute found in entry specified with DN + * @link http://php.net/manual/en/function.ldap-compare.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $dn

+ * The distinguished name of an LDAP entity. + *

+ * @param string $attribute

+ * The attribute name. + *

+ * @param string $value

+ * The compared value. + *

+ * @return mixed TRUE if value matches otherwise returns + * FALSE. Returns -1 on error. + * @jms-builtin + */ +function ldap_compare ($link_identifier, $dn, $attribute, $value) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Sort LDAP result entries + * @link http://php.net/manual/en/function.ldap-sort.php + * @param resource $link

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result

+ * An search result identifier, returned by + * ldap_search. + *

+ * @param string $sortfilter

+ * The attribute to use as a key in the sort. + *

+ * @return bool + * @jms-builtin + */ +function ldap_sort ($link, $result, $sortfilter) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Modify the name of an entry + * @link http://php.net/manual/en/function.ldap-rename.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param string $dn

+ * The distinguished name of an LDAP entity. + *

+ * @param string $newrdn

+ * The new RDN. + *

+ * @param string $newparent

+ * The new parent/superior entry. + *

+ * @param bool $deleteoldrdn

+ * If TRUE the old RDN value(s) is removed, else the old RDN value(s) + * is retained as non-distinguished values of the entry. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_rename ($link_identifier, $dn, $newrdn, $newparent, $deleteoldrdn) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Get the current value for given option + * @link http://php.net/manual/en/function.ldap-get-option.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param int $option

+ * The parameter option can be one of: + * + * Option + * Type + * + * + * LDAP_OPT_DEREF + * integer + * + * + * LDAP_OPT_SIZELIMIT + * integer + * + * + * LDAP_OPT_TIMELIMIT + * integer + * + * + * LDAP_OPT_NETWORK_TIMEOUT + * integer + * + * + * LDAP_OPT_PROTOCOL_VERSION + * integer + * + * + * LDAP_OPT_ERROR_NUMBER + * integer + * + * + * LDAP_OPT_REFERRALS + * bool + * + * + * LDAP_OPT_RESTART + * bool + * + * + * LDAP_OPT_HOST_NAME + * string + * + * + * LDAP_OPT_ERROR_STRING + * string + * + * + * LDAP_OPT_MATCHED_DN + * string + * + * + * LDAP_OPT_SERVER_CONTROLS + * array + * + * + * LDAP_OPT_CLIENT_CONTROLS + * array + * + *

+ * @param mixed $retval

+ * This will be set to the option value. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_get_option ($link_identifier, $option, &$retval) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Set the value of the given option + * @link http://php.net/manual/en/function.ldap-set-option.php + * @param resource $link_identifier

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param int $option

+ * The parameter option can be one of: + * + * Option + * Type + * Available since + * + * + * LDAP_OPT_DEREF + * integer + * + * + * + * LDAP_OPT_SIZELIMIT + * integer + * + * + * + * LDAP_OPT_TIMELIMIT + * integer + * + * + * + * LDAP_OPT_NETWORK_TIMEOUT + * integer + * PHP 5.3.0 + * + * + * LDAP_OPT_PROTOCOL_VERSION + * integer + * + * + * + * LDAP_OPT_ERROR_NUMBER + * integer + * + * + * + * LDAP_OPT_REFERRALS + * bool + * + * + * + * LDAP_OPT_RESTART + * bool + * + * + * + * LDAP_OPT_HOST_NAME + * string + * + * + * + * LDAP_OPT_ERROR_STRING + * string + * + * + * + * LDAP_OPT_MATCHED_DN + * string + * + * + * + * LDAP_OPT_SERVER_CONTROLS + * array + * + * + * + * LDAP_OPT_CLIENT_CONTROLS + * array + * + * + *

+ *

+ * LDAP_OPT_SERVER_CONTROLS and + * LDAP_OPT_CLIENT_CONTROLS require a list of + * controls, this means that the value must be an array of controls. A + * control consists of an oid identifying the control, + * an optional value, and an optional flag for + * criticality. In PHP a control is given by an + * array containing an element with the key oid + * and string value, and two optional elements. The optional + * elements are key value with string value + * and key iscritical with boolean value. + * iscritical defaults to FALSE + * if not supplied. See draft-ietf-ldapext-ldap-c-api-xx.txt + * for details. See also the second example below. + *

+ * @param mixed $newval

+ * The new value for the specified option. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_set_option ($link_identifier, $option, $newval) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Return first reference + * @link http://php.net/manual/en/function.ldap-first-reference.php + * @param resource $link + * @param resource $result + * @return resource + * @jms-builtin + */ +function ldap_first_reference ($link, $result) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Get next reference + * @link http://php.net/manual/en/function.ldap-next-reference.php + * @param resource $link + * @param resource $entry + * @return resource + * @jms-builtin + */ +function ldap_next_reference ($link, $entry) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Extract information from reference entry + * @link http://php.net/manual/en/function.ldap-parse-reference.php + * @param resource $link + * @param resource $entry + * @param array $referrals + * @return bool + * @jms-builtin + */ +function ldap_parse_reference ($link, $entry, array &$referrals) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Extract information from result + * @link http://php.net/manual/en/function.ldap-parse-result.php + * @param resource $link + * @param resource $result + * @param int $errcode + * @param string $matcheddn [optional] + * @param string $errmsg [optional] + * @param array $referrals [optional] + * @return bool + * @jms-builtin + */ +function ldap_parse_result ($link, $result, &$errcode, &$matcheddn = null, &$errmsg = null, array &$referrals = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Start TLS + * @link http://php.net/manual/en/function.ldap-start-tls.php + * @param resource $link + * @return bool + * @jms-builtin + */ +function ldap_start_tls ($link) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Set a callback function to do re-binds on referral chasing + * @link http://php.net/manual/en/function.ldap-set-rebind-proc.php + * @param resource $link + * @param callable $callback + * @return bool + * @jms-builtin + */ +function ldap_set_rebind_proc ($link, callable $callback) {} + +/** + * (PHP 5 >= 5.4.0)
+ * Send LDAP pagination control + * @link http://php.net/manual/en/function.ldap-control-paged-result.php + * @param resource $link

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param int $pagesize

+ * The number of entries by page. + *

+ * @param bool $iscritical [optional]

+ * Indicates whether the pagination is critical of not. + * If true and if the server doesn't support pagination, the search + * will return no result. + *

+ * @param string $cookie [optional]

+ * An opaque structure sent by the server + * (ldap_control_paged_result_response). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_control_paged_result ($link, $pagesize, $iscritical = null, $cookie = null) {} + +/** + * (PHP 5 >= 5.4.0)
+ * Retrieve the LDAP pagination cookie + * @link http://php.net/manual/en/function.ldap-control-paged-result-response.php + * @param resource $link

+ * An LDAP link identifier, returned by ldap_connect. + *

+ * @param resource $result + * @param string $cookie [optional]

+ * An opaque structure sent by the server. + *

+ * @param int $estimated [optional]

+ * The estimated number of entries to retrieve. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ldap_control_paged_result_response ($link, $result, &$cookie = null, &$estimated = null) {} + +define ('LDAP_DEREF_NEVER', 0); +define ('LDAP_DEREF_SEARCHING', 1); +define ('LDAP_DEREF_FINDING', 2); +define ('LDAP_DEREF_ALWAYS', 3); + +/** + * Specifies alternative rules for following aliases at the server. + * @link http://php.net/manual/en/ldap.constants.php + */ +define ('LDAP_OPT_DEREF', 2); + +/** + *

+ * Specifies the maximum number of entries that can be + * returned on a search operation. + *

+ * The actual size limit for operations is also bounded + * by the server's configured maximum number of return entries. + * The lesser of these two settings is the actual size limit. + * @link http://php.net/manual/en/ldap.constants.php + */ +define ('LDAP_OPT_SIZELIMIT', 3); + +/** + * Specifies the number of seconds to wait for search results. + * The actual time limit for operations is also bounded + * by the server's configured maximum time. + * The lesser of these two settings is the actual time limit. + * @link http://php.net/manual/en/ldap.constants.php + */ +define ('LDAP_OPT_TIMELIMIT', 4); + +/** + * Option for ldap_set_option to allow setting network timeout. + * (Available as of PHP 5.3.0) + * @link http://php.net/manual/en/ldap.constants.php + */ +define ('LDAP_OPT_NETWORK_TIMEOUT', 20485); + +/** + * Specifies the LDAP protocol to be used (V2 or V3). + * @link http://php.net/manual/en/ldap.constants.php + */ +define ('LDAP_OPT_PROTOCOL_VERSION', 17); +define ('LDAP_OPT_ERROR_NUMBER', 49); + +/** + * Specifies whether to automatically follow referrals returned + * by the LDAP server. + * @link http://php.net/manual/en/ldap.constants.php + */ +define ('LDAP_OPT_REFERRALS', 8); +define ('LDAP_OPT_RESTART', 9); +define ('LDAP_OPT_HOST_NAME', 48); +define ('LDAP_OPT_ERROR_STRING', 50); +define ('LDAP_OPT_MATCHED_DN', 51); + +/** + * Specifies a default list of server controls to be sent with each request. + * @link http://php.net/manual/en/ldap.constants.php + */ +define ('LDAP_OPT_SERVER_CONTROLS', 18); + +/** + * Specifies a default list of client controls to be processed with each request. + * @link http://php.net/manual/en/ldap.constants.php + */ +define ('LDAP_OPT_CLIENT_CONTROLS', 19); + +/** + * Specifies a bitwise level for debug traces. + * @link http://php.net/manual/en/ldap.constants.php + */ +define ('LDAP_OPT_DEBUG_LEVEL', 20481); +define ('LDAP_OPT_X_SASL_MECH', 24832); +define ('LDAP_OPT_X_SASL_REALM', 24833); +define ('LDAP_OPT_X_SASL_AUTHCID', 24834); +define ('LDAP_OPT_X_SASL_AUTHZID', 24835); + +// End of ldap v. +?> diff --git a/res/php-5.4-core-api/libxml.php b/res/php-5.4-core-api/libxml.php new file mode 100644 index 0000000..b411691 --- /dev/null +++ b/res/php-5.4-core-api/libxml.php @@ -0,0 +1,266 @@ + + * Set the streams context for the next libxml document load or write + * @link http://php.net/manual/en/function.libxml-set-streams-context.php + * @param resource $streams_context

+ * The stream context resource (created with + * stream_context_create) + *

+ * @return void No value is returned. + * @jms-builtin + */ +function libxml_set_streams_context ($streams_context) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Disable libxml errors and allow user to fetch error information as needed + * @link http://php.net/manual/en/function.libxml-use-internal-errors.php + * @param bool $use_errors [optional]

+ * Enable (TRUE) user error handling or disable (FALSE) user error handling. Disabling will also clear any existing libxml errors. + *

+ * @return bool This function returns the previous value of + * use_errors. + * @jms-builtin + */ +function libxml_use_internal_errors ($use_errors = false) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Retrieve last error from libxml + * @link http://php.net/manual/en/function.libxml-get-last-error.php + * @return LibXMLError a LibXMLError object if there is any error in the + * buffer, FALSE otherwise. + * @jms-builtin + */ +function libxml_get_last_error () {} + +/** + * (PHP 5 >= 5.1.0)
+ * Clear libxml error buffer + * @link http://php.net/manual/en/function.libxml-clear-errors.php + * @return void No value is returned. + * @jms-builtin + */ +function libxml_clear_errors () {} + +/** + * (PHP 5 >= 5.1.0)
+ * Retrieve array of errors + * @link http://php.net/manual/en/function.libxml-get-errors.php + * @return array an array with LibXMLError objects if there are any + * errors in the buffer, or an empty array otherwise. + * @jms-builtin + */ +function libxml_get_errors () {} + +/** + * (PHP 5 >= 5.2.11)
+ * Disable the ability to load external entities + * @link http://php.net/manual/en/function.libxml-disable-entity-loader.php + * @param bool $disable [optional]

+ * Disable (TRUE) or enable (FALSE) libxml extensions (such as + * , + * and ) to load external entities. + *

+ * @return bool the previous value. + * @jms-builtin + */ +function libxml_disable_entity_loader ($disable = true) {} + +/** + * (PHP 5 >= 5.4.0)
+ * Changes the default external entity loader + * @link http://php.net/manual/en/function.libxml-set-external-entity-loader.php + * @param callable $resolver_function

+ * A callable that takes three arguments. Two strings, a public id + * and system id, and a context (an array with four keys) as the third argument. + * This callback should return a resource, a string from which a resource can be + * opened, or NULL. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function libxml_set_external_entity_loader (callable $resolver_function) {} + + +/** + * libxml version like 20605 or 20617 + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_VERSION', 20708); + +/** + * libxml version like 2.6.5 or 2.6.17 + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DOTTED_VERSION', "2.7.8"); +define ('LIBXML_LOADED_VERSION', 20708); + +/** + * Substitute entities + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOENT', 2); + +/** + * Load the external subset + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DTDLOAD', 4); + +/** + * Default DTD attributes + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DTDATTR', 8); + +/** + * Validate with the DTD + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_DTDVALID', 16); + +/** + * Suppress error reports + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOERROR', 32); + +/** + * Suppress warning reports + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOWARNING', 64); + +/** + * Remove blank nodes + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOBLANKS', 256); + +/** + * Implement XInclude substitution + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_XINCLUDE', 1024); + +/** + * Remove redundant namespaces declarations + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NSCLEAN', 8192); + +/** + * Merge CDATA as text nodes + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOCDATA', 16384); + +/** + * Disable network access when loading documents + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NONET', 2048); +define ('LIBXML_PEDANTIC', 128); + +/** + * Activate small nodes allocation optimization. This may speed up your + * application without needing to change the code. + *

+ * Only available in Libxml >= 2.6.21 + *

+ * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_COMPACT', 65536); + +/** + * Drop the XML declaration when saving a document + *

+ * Only available in Libxml >= 2.6.21 + *

+ * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOXMLDECL', 2); + +/** + * Sets XML_PARSE_HUGE flag, which relaxes any hardcoded limit from the parser. This affects + * limits like maximum depth of a document or the entity recursion, as well as limits of the + * size of text nodes. + *

+ * Only available in Libxml >= 2.7.0 (as of PHP >= 5.3.2 and PHP >= 5.2.12) + *

+ * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_PARSEHUGE', 524288); + +/** + * Expand empty tags (e.g. <br/> to + * <br></br>) + *

+ * This option is currently just available in the + * and + * functions. + *

+ * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_NOEMPTYTAG', 4); +define ('LIBXML_HTML_NOIMPLIED', 8192); +define ('LIBXML_HTML_NODEFDTD', 4); + +/** + * No errors + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_NONE', 0); + +/** + * A simple warning + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_WARNING', 1); + +/** + * A recoverable error + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_ERROR', 2); + +/** + * A fatal error + * @link http://php.net/manual/en/libxml.constants.php + */ +define ('LIBXML_ERR_FATAL', 3); + +// End of libxml v. +?> diff --git a/res/php-5.4-core-api/mbstring.php b/res/php-5.4-core-api/mbstring.php new file mode 100644 index 0000000..890dc17 --- /dev/null +++ b/res/php-5.4-core-api/mbstring.php @@ -0,0 +1,1445 @@ + + * Perform case folding on a string + * @link http://php.net/manual/en/function.mb-convert-case.php + * @param string $str

+ * The string being converted. + *

+ * @param int $mode [optional]

+ * The mode of the conversion. It can be one of + * MB_CASE_UPPER, + * MB_CASE_LOWER, or + * MB_CASE_TITLE. + *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return string A case folded version of string converted in the + * way specified by mode. + * @jms-builtin + */ +function mb_convert_case ($str, $mode = 'MB_CASE_UPPER', $encoding = 'mb_internal_encoding()') {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Make a string uppercase + * @link http://php.net/manual/en/function.mb-strtoupper.php + * @param string $str

+ * The string being uppercased. + *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return string str with all alphabetic characters converted to uppercase. + * @jms-builtin + */ +function mb_strtoupper ($str, $encoding = 'mb_internal_encoding()') {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Make a string lowercase + * @link http://php.net/manual/en/function.mb-strtolower.php + * @param string $str

+ * The string being lowercased. + *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return string str with all alphabetic characters converted to lowercase. + * @jms-builtin + */ +function mb_strtolower ($str, $encoding = 'mb_internal_encoding()') {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Set/Get current language + * @link http://php.net/manual/en/function.mb-language.php + * @param string $language [optional]

+ * Used for encoding + * e-mail messages. Valid languages are "Japanese", + * "ja","English","en" and "uni" + * (UTF-8). mb_send_mail uses this setting to + * encode e-mail. + *

+ *

+ * Language and its setting is ISO-2022-JP/Base64 for + * Japanese, UTF-8/Base64 for uni, ISO-8859-1/quoted printable for + * English. + *

+ * @return mixed If language is set and + * language is valid, it returns + * TRUE. Otherwise, it returns FALSE. + * When language is omitted, it returns the language + * name as a string. If no language is set previously, it then returns + * FALSE. + * @jms-builtin + */ +function mb_language ($language = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Set/Get internal character encoding + * @link http://php.net/manual/en/function.mb-internal-encoding.php + * @param string $encoding [optional]

+ * encoding is the character encoding name + * used for the HTTP input character encoding conversion, HTTP output + * character encoding conversion, and the default character encoding + * for string functions defined by the mbstring module. + *

+ * @return mixed If encoding is set, then + * Returns TRUE on success or FALSE on failure. + * If encoding is omitted, then + * the current character encoding name is returned. + * @jms-builtin + */ +function mb_internal_encoding ($encoding = 'mb_internal_encoding()') {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Detect HTTP input character encoding + * @link http://php.net/manual/en/function.mb-http-input.php + * @param string $type [optional]

+ * Input string specifies the input type. + * "G" for GET, "P" for POST, "C" for COOKIE, "S" for string, "L" for list, and + * "I" for the whole list (will return array). + * If type is omitted, it returns the last input type processed. + *

+ * @return mixed The character encoding name, as per the type. + * If mb_http_input does not process specified + * HTTP input, it returns FALSE. + * @jms-builtin + */ +function mb_http_input ($type = "") {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Set/Get HTTP output character encoding + * @link http://php.net/manual/en/function.mb-http-output.php + * @param string $encoding [optional]

+ * If encoding is set, + * mb_http_output sets the HTTP output character + * encoding to encoding. + *

+ *

+ * If encoding is omitted, + * mb_http_output returns the current HTTP output + * character encoding. + *

+ * @return mixed If encoding is omitted, + * mb_http_output returns the current HTTP output + * character encoding. Otherwise, + * Returns TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mb_http_output ($encoding = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Set/Get character encoding detection order + * @link http://php.net/manual/en/function.mb-detect-order.php + * @param mixed $encoding_list [optional]

+ * encoding_list is an array or + * comma separated list of character encoding. See supported encodings. + *

+ *

+ * If encoding_list is omitted, it returns + * the current character encoding detection order as array. + *

+ *

+ * This setting affects mb_detect_encoding and + * mb_send_mail. + *

+ *

+ * mbstring currently implements the following + * encoding detection filters. If there is an invalid byte sequence + * for the following encodings, encoding detection will fail. + *

+ * UTF-8, UTF-7, + * ASCII, + * EUC-JP,SJIS, + * eucJP-win, SJIS-win, + * JIS, ISO-2022-JP + *

+ * For ISO-8859-*, mbstring + * always detects as ISO-8859-*. + *

+ *

+ * For UTF-16, UTF-32, + * UCS2 and UCS4, encoding + * detection will fail always. + *

+ *

+ * Useless detect order example + *

+ * ; Always detect as ISO-8859-1
+ * detect_order = ISO-8859-1, UTF-8
+ * ; Always detect as UTF-8, since ASCII/UTF-7 values are
+ * ; valid for UTF-8
+ * detect_order = UTF-8, ASCII, UTF-7
+ * 
+ *

+ * @return mixed TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mb_detect_order ($encoding_list = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Set/Get substitution character + * @link http://php.net/manual/en/function.mb-substitute-character.php + * @param mixed $substrchar [optional]

+ * Specify the Unicode value as an integer, + * or as one of the following strings: + * "none" : no output + * @return mixed If substchar is set, it returns TRUE for success, + * otherwise returns FALSE. + * If substchar is not set, it returns the Unicode value, + * or "none" or "long". + * @jms-builtin + */ +function mb_substitute_character ($substrchar = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Parse GET/POST/COOKIE data and set global variable + * @link http://php.net/manual/en/function.mb-parse-str.php + * @param string $encoded_string

+ * The URL encoded data. + *

+ * @param array $result [optional]

+ * An array containing decoded and character encoded converted values. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mb_parse_str ($encoded_string, array &$result = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Callback function converts character encoding in output buffer + * @link http://php.net/manual/en/function.mb-output-handler.php + * @param string $contents

+ * The contents of the output buffer. + *

+ * @param int $status

+ * The status of the output buffer. + *

+ * @return string The converted string. + * @jms-builtin + */ +function mb_output_handler ($contents, $status) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Get MIME charset string + * @link http://php.net/manual/en/function.mb-preferred-mime-name.php + * @param string $encoding

+ * The encoding being checked. + *

+ * @return string The MIME charset string for character encoding + * encoding. + * @jms-builtin + */ +function mb_preferred_mime_name ($encoding) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Get string length + * @link http://php.net/manual/en/function.mb-strlen.php + * @param string $str

+ * The string being checked for length. + *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return int the number of characters in + * string str having character encoding + * encoding. A multi-byte character is + * counted as 1. + * @jms-builtin + */ +function mb_strlen ($str, $encoding = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Find position of first occurrence of string in a string + * @link http://php.net/manual/en/function.mb-strpos.php + * @param string $haystack

+ * The string being checked. + *

+ * @param string $needle

+ * The string to find in haystack. In contrast + * with strpos, numeric values are not applied + * as the ordinal value of a character. + *

+ * @param int $offset [optional]

+ * The search offset. If it is not specified, 0 is used. + *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return int the numeric position of + * the first occurrence of needle in the + * haystack string. If + * needle is not found, it returns FALSE. + * @jms-builtin + */ +function mb_strpos ($haystack, $needle, $offset = 0, $encoding = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Find position of last occurrence of a string in a string + * @link http://php.net/manual/en/function.mb-strrpos.php + * @param string $haystack

+ * The string being checked, for the last occurrence + * of needle + *

+ * @param string $needle

+ * The string to find in haystack. + *

+ * @param int $offset [optional] May be specified to begin searching an arbitrary number of characters into + * the string. Negative values will stop searching at an arbitrary point + * prior to the end of the string. + * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return int the numeric position of + * the last occurrence of needle in the + * haystack string. If + * needle is not found, it returns FALSE. + * @jms-builtin + */ +function mb_strrpos ($haystack, $needle, $offset = 0, $encoding = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Finds position of first occurrence of a string within another, case insensitive + * @link http://php.net/manual/en/function.mb-stripos.php + * @param string $haystack

+ * The string from which to get the position of the first occurrence + * of needle + *

+ * @param string $needle

+ * The string to find in haystack + *

+ * @param int $offset [optional]

+ * The position in haystack + * to start searching + *

+ * @param string $encoding [optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return int Return the numeric position of the first occurrence of + * needle in the haystack + * string, or FALSE if needle is not found. + * @jms-builtin + */ +function mb_stripos ($haystack, $needle, $offset = null, $encoding = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Finds position of last occurrence of a string within another, case insensitive + * @link http://php.net/manual/en/function.mb-strripos.php + * @param string $haystack

+ * The string from which to get the position of the last occurrence + * of needle + *

+ * @param string $needle

+ * The string to find in haystack + *

+ * @param int $offset [optional]

+ * The position in haystack + * to start searching + *

+ * @param string $encoding [optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return int Return the numeric position of + * the last occurrence of needle in the + * haystack string, or FALSE + * if needle is not found. + * @jms-builtin + */ +function mb_strripos ($haystack, $needle, $offset = 0, $encoding = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Finds first occurrence of a string within another + * @link http://php.net/manual/en/function.mb-strstr.php + * @param string $haystack

+ * The string from which to get the first occurrence + * of needle + *

+ * @param string $needle

+ * The string to find in haystack + *

+ * @param bool $before_needle [optional]

+ * Determines which portion of haystack + * this function returns. + * If set to TRUE, it returns all of haystack + * from the beginning to the first occurrence of needle (excluding needle). + * If set to FALSE, it returns all of haystack + * from the first occurrence of needle to the end (including needle). + *

+ * @param string $encoding [optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack, + * or FALSE if needle is not found. + * @jms-builtin + */ +function mb_strstr ($haystack, $needle, $before_needle = false, $encoding = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Finds the last occurrence of a character in a string within another + * @link http://php.net/manual/en/function.mb-strrchr.php + * @param string $haystack

+ * The string from which to get the last occurrence + * of needle + *

+ * @param string $needle

+ * The string to find in haystack + *

+ * @param bool $part [optional]

+ * Determines which portion of haystack + * this function returns. + * If set to TRUE, it returns all of haystack + * from the beginning to the last occurrence of needle. + * If set to FALSE, it returns all of haystack + * from the last occurrence of needle to the end, + *

+ * @param string $encoding [optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack. + * or FALSE if needle is not found. + * @jms-builtin + */ +function mb_strrchr ($haystack, $needle, $part = false, $encoding = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Finds first occurrence of a string within another, case insensitive + * @link http://php.net/manual/en/function.mb-stristr.php + * @param string $haystack

+ * The string from which to get the first occurrence + * of needle + *

+ * @param string $needle

+ * The string to find in haystack + *

+ * @param bool $before_needle [optional]

+ * Determines which portion of haystack + * this function returns. + * If set to TRUE, it returns all of haystack + * from the beginning to the first occurrence of needle (including needle). + * If set to FALSE, it returns all of haystack + * from the first occurrence of needle to the end (excluding needle). + *

+ * @param string $encoding [optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack, + * or FALSE if needle is not found. + * @jms-builtin + */ +function mb_stristr ($haystack, $needle, $before_needle = false, $encoding = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Finds the last occurrence of a character in a string within another, case insensitive + * @link http://php.net/manual/en/function.mb-strrichr.php + * @param string $haystack

+ * The string from which to get the last occurrence + * of needle + *

+ * @param string $needle

+ * The string to find in haystack + *

+ * @param bool $part [optional]

+ * Determines which portion of haystack + * this function returns. + * If set to TRUE, it returns all of haystack + * from the beginning to the last occurrence of needle. + * If set to FALSE, it returns all of haystack + * from the last occurrence of needle to the end, + *

+ * @param string $encoding [optional]

+ * Character encoding name to use. + * If it is omitted, internal character encoding is used. + *

+ * @return string the portion of haystack. + * or FALSE if needle is not found. + * @jms-builtin + */ +function mb_strrichr ($haystack, $needle, $part = false, $encoding = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Count the number of substring occurrences + * @link http://php.net/manual/en/function.mb-substr-count.php + * @param string $haystack

+ * The string being checked. + *

+ * @param string $needle

+ * The string being found. + *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return int The number of times the + * needle substring occurs in the + * haystack string. + * @jms-builtin + */ +function mb_substr_count ($haystack, $needle, $encoding = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Get part of string + * @link http://php.net/manual/en/function.mb-substr.php + * @param string $str

+ * The string to extract the substring from. + *

+ * @param int $start

+ * Position of first character to use from str. + *

+ * @param int $length [optional]

+ * Maximum number of characters to use from str. + *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return string mb_substr returns the portion of + * str specified by the + * start and + * length parameters. + * @jms-builtin + */ +function mb_substr ($str, $start, $length = null, $encoding = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Get part of string + * @link http://php.net/manual/en/function.mb-strcut.php + * @param string $str

+ * The string being cut. + *

+ * @param int $start

+ * Starting position in bytes. + *

+ * @param int $length [optional]

+ * Length in bytes. + *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return string mb_strcut returns the portion of + * str specified by the + * start and + * length parameters. + * @jms-builtin + */ +function mb_strcut ($str, $start, $length = null, $encoding = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Return width of string + * @link http://php.net/manual/en/function.mb-strwidth.php + * @param string $str

+ * The string being decoded. + *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return int The width of string str. + * @jms-builtin + */ +function mb_strwidth ($str, $encoding = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Get truncated string with specified width + * @link http://php.net/manual/en/function.mb-strimwidth.php + * @param string $str

+ * The string being decoded. + *

+ * @param int $start

+ * The start position offset. Number of + * characters from the beginning of string. (First character is 0) + *

+ * @param int $width

+ * The width of the desired trim. + *

+ * @param string $trimmarker [optional]

+ * A string that is added to the end of string + * when string is truncated. + *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return string The truncated string. If trimmarker is set, + * trimmarker is appended to the return value. + * @jms-builtin + */ +function mb_strimwidth ($str, $start, $width, $trimmarker = null, $encoding = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Convert character encoding + * @link http://php.net/manual/en/function.mb-convert-encoding.php + * @param string $str

+ * The string being encoded. + *

+ * @param string $to_encoding

+ * The type of encoding that str is being converted to. + *

+ * @param mixed $from_encoding [optional]

+ * Is specified by character code names before conversion. It is either + * an array, or a comma separated enumerated list. + * If from_encoding is not specified, the internal + * encoding will be used. + *

+ *

+ * See supported + * encodings. + *

+ * @return string The encoded string. + * @jms-builtin + */ +function mb_convert_encoding ($str, $to_encoding, $from_encoding = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Detect character encoding + * @link http://php.net/manual/en/function.mb-detect-encoding.php + * @param string $str

+ * The string being detected. + *

+ * @param mixed $encoding_list [optional]

+ * encoding_list is list of character + * encoding. Encoding order may be specified by array or comma + * separated list string. + *

+ *

+ * If encoding_list is omitted, + * detect_order is used. + *

+ * @param bool $strict [optional]

+ * strict specifies whether to use + * the strict encoding detection or not. + * Default is FALSE. + *

+ * @return string The detected character encoding or FALSE if the encoding cannot be + * detected from the given string. + * @jms-builtin + */ +function mb_detect_encoding ($str, $encoding_list = 'mb_detect_order()', $strict = false) {} + +/** + * (PHP 5)
+ * Returns an array of all supported encodings + * @link http://php.net/manual/en/function.mb-list-encodings.php + * @return array a numerically indexed array. + * @jms-builtin + */ +function mb_list_encodings () {} + +/** + * (PHP 5 >= 5.3.0)
+ * Get aliases of a known encoding type + * @link http://php.net/manual/en/function.mb-encoding-aliases.php + * @param string $encoding

+ * The encoding type being checked, for aliases. + *

+ * @return array a numerically indexed array of encoding aliases on success, + * or FALSE on failure + * @jms-builtin + */ +function mb_encoding_aliases ($encoding) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Convert "kana" one from another ("zen-kaku", "han-kaku" and more) + * @link http://php.net/manual/en/function.mb-convert-kana.php + * @param string $str

+ * The string being converted. + *

+ * @param string $option [optional]

+ * The conversion option. + *

+ *

+ * Specify with a combination of following options. + * + * Applicable Conversion Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionMeaning
r + * Convert "zen-kaku" alphabets to "han-kaku" + *
R + * Convert "han-kaku" alphabets to "zen-kaku" + *
n + * Convert "zen-kaku" numbers to "han-kaku" + *
N + * Convert "han-kaku" numbers to "zen-kaku" + *
a + * Convert "zen-kaku" alphabets and numbers to "han-kaku" + *
A + * Convert "han-kaku" alphabets and numbers to "zen-kaku" + * (Characters included in "a", "A" options are + * U+0021 - U+007E excluding U+0022, U+0027, U+005C, U+007E) + *
s + * Convert "zen-kaku" space to "han-kaku" (U+3000 -> U+0020) + *
S + * Convert "han-kaku" space to "zen-kaku" (U+0020 -> U+3000) + *
k + * Convert "zen-kaku kata-kana" to "han-kaku kata-kana" + *
K + * Convert "han-kaku kata-kana" to "zen-kaku kata-kana" + *
h + * Convert "zen-kaku hira-gana" to "han-kaku kata-kana" + *
H + * Convert "han-kaku kata-kana" to "zen-kaku hira-gana" + *
c + * Convert "zen-kaku kata-kana" to "zen-kaku hira-gana" + *
C + * Convert "zen-kaku hira-gana" to "zen-kaku kata-kana" + *
V + * Collapse voiced sound notation and convert them into a character. Use with "K","H" + *
+ *

+ * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return string The converted string. + * @jms-builtin + */ +function mb_convert_kana ($str, $option = "KV", $encoding = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Encode string for MIME header + * @link http://php.net/manual/en/function.mb-encode-mimeheader.php + * @param string $str

+ * The string being encoded. + *

+ * @param string $charset [optional]

+ * charset specifies the name of the character set + * in which str is represented in. The default value + * is determined by the current NLS setting (mbstring.language). + * mb_internal_encoding should be set to same encoding. + *

+ * @param string $transfer_encoding [optional]

+ * transfer_encoding specifies the scheme of MIME + * encoding. It should be either "B" (Base64) or + * "Q" (Quoted-Printable). Falls back to + * "B" if not given. + *

+ * @param string $linefeed [optional]

+ * linefeed specifies the EOL (end-of-line) marker + * with which mb_encode_mimeheader performs + * line-folding (a RFC term, + * the act of breaking a line longer than a certain length into multiple + * lines. The length is currently hard-coded to 74 characters). + * Falls back to "\r\n" (CRLF) if not given. + *

+ * @param int $indent [optional]

+ * Indentation of the first line (number of characters in the header + * before str). + *

+ * @return string A converted version of the string represented in ASCII. + * @jms-builtin + */ +function mb_encode_mimeheader ($str, $charset = null, $transfer_encoding = null, $linefeed = '"\r\n"', $indent = 0) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Decode string in MIME header field + * @link http://php.net/manual/en/function.mb-decode-mimeheader.php + * @param string $str

+ * The string being decoded. + *

+ * @return string The decoded string in internal character encoding. + * @jms-builtin + */ +function mb_decode_mimeheader ($str) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Convert character code in variable(s) + * @link http://php.net/manual/en/function.mb-convert-variables.php + * @param string $to_encoding

+ * The encoding that the string is being converted to. + *

+ * @param mixed $from_encoding

+ * from_encoding is specified as an array + * or comma separated string, it tries to detect encoding from + * from-coding. When from_encoding + * is omitted, detect_order is used. + *

+ * @param mixed $vars

+ * vars is the reference to the + * variable being converted. String, Array and Object are accepted. + * mb_convert_variables assumes all parameters + * have the same encoding. + *

+ * @param mixed $_ [optional]

+ * Additional vars. + *

+ * @return string The character encoding before conversion for success, + * or FALSE for failure. + * @jms-builtin + */ +function mb_convert_variables ($to_encoding, $from_encoding, &$vars, &$_ = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Encode character to HTML numeric string reference + * @link http://php.net/manual/en/function.mb-encode-numericentity.php + * @param string $str

+ * The string being encoded. + *

+ * @param array $convmap

+ * convmap is array specifies code area to + * convert. + *

+ * @param string $encoding The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return string The converted string. + * @jms-builtin + */ +function mb_encode_numericentity ($str, array $convmap, $encoding) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Decode HTML numeric string reference to character + * @link http://php.net/manual/en/function.mb-decode-numericentity.php + * @param string $str

+ * The string being decoded. + *

+ * @param array $convmap

+ * convmap is an array that specifies + * the code area to convert. + *

+ * @param string $encoding The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return string The converted string. + * @jms-builtin + */ +function mb_decode_numericentity ($str, array $convmap, $encoding) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Send encoded mail + * @link http://php.net/manual/en/function.mb-send-mail.php + * @param string $to

+ * The mail addresses being sent to. Multiple + * recipients may be specified by putting a comma between each + * address in to. + * This parameter is not automatically encoded. + *

+ * @param string $subject

+ * The subject of the mail. + *

+ * @param string $message

+ * The message of the mail. + *

+ * @param string $additional_headers [optional]

+ * additional_headers is inserted at + * the end of the header. This is typically used to add extra + * headers. Multiple extra headers are separated with a + * newline ("\n"). + *

+ * @param string $additional_parameter [optional]

+ * additional_parameter is a MTA command line + * parameter. It is useful when setting the correct Return-Path + * header when using sendmail. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mb_send_mail ($to, $subject, $message, $additional_headers = null, $additional_parameter = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get internal settings of mbstring + * @link http://php.net/manual/en/function.mb-get-info.php + * @param string $type [optional]

+ * If type isn't specified or is specified to + * "all", an array having the elements "internal_encoding", + * "http_output", "http_input", "func_overload", "mail_charset", + * "mail_header_encoding", "mail_body_encoding" will be returned. + *

+ *

+ * If type is specified as "http_output", + * "http_input", "internal_encoding", "func_overload", + * the specified setting parameter will be returned. + *

+ * @return mixed An array of type information if type + * is not specified, otherwise a specific type. + * @jms-builtin + */ +function mb_get_info ($type = "all") {} + +/** + * (PHP 4 >= 4.4.3, PHP 5 >= 5.1.3)
+ * Check if the string is valid for the specified encoding + * @link http://php.net/manual/en/function.mb-check-encoding.php + * @param string $var [optional]

+ * The byte stream to check. If it is omitted, this function checks + * all the input from the beginning of the request. + *

+ * @param string $encoding [optional]

+ * The expected encoding. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mb_check_encoding ($var = null, $encoding = 'mb_internal_encoding()') {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns current encoding for multibyte regex as string + * @link http://php.net/manual/en/function.mb-regex-encoding.php + * @param string $encoding [optional] The encoding + * parameter is the character encoding. If it is omitted, the internal character + * encoding value will be used.

+ * @return mixed + * @jms-builtin + */ +function mb_regex_encoding ($encoding = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Set/Get the default options for mbregex functions + * @link http://php.net/manual/en/function.mb-regex-set-options.php + * @param string $options [optional]

+ * The options to set. This is a a string where each + * character is an option. To set a mode, the mode + * character must be the last one set, however there + * can only be set one mode but multiple options. + *

+ * + * Regex options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionMeaning
iAmbiguity match on
xEnables extended pattern form
m'.' matches with newlines
s'^' -> '\A', '$' -> '\Z'
pSame as both the m and s options
lFinds longest matches
nIgnores empty matches
eeval resulting code
+ * + * Regex syntax modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ModeMeaning
jJava (Sun java.util.regex)
uGNU regex
ggrep
cEmacs
rRuby
zPerl
bPOSIX Basic regex
dPOSIX Extended regex
+ * @return string The previous options. If options is omitted, + * it returns the string that describes the current options. + * @jms-builtin + */ +function mb_regex_set_options ($options = "msr") {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Regular expression match with multibyte support + * @link http://php.net/manual/en/function.mb-ereg.php + * @param string $pattern

+ * The search pattern. + *

+ * @param string $string

+ * The search string. + *

+ * @param array $regs [optional]

+ * Contains a substring of the matched string. + *

+ * @return int + * @jms-builtin + */ +function mb_ereg ($pattern, $string, array $regs = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Regular expression match ignoring case with multibyte support + * @link http://php.net/manual/en/function.mb-eregi.php + * @param string $pattern

+ * The regular expression pattern. + *

+ * @param string $string

+ * The string being searched. + *

+ * @param array $regs [optional]

+ * Contains a substring of the matched string. + *

+ * @return int + * @jms-builtin + */ +function mb_eregi ($pattern, $string, array $regs = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Replace regular expression with multibyte support + * @link http://php.net/manual/en/function.mb-ereg-replace.php + * @param string $pattern

+ * The regular expression pattern. + *

+ *

+ * Multibyte characters may be used in pattern. + *

+ * @param string $replacement

+ * The replacement text. + *

+ * @param string $string

+ * The string being checked. + *

+ * @param string $option [optional] Matching condition can be set by option + * parameter. If i is specified for this + * parameter, the case will be ignored. If x is + * specified, white space will be ignored. If m + * is specified, match will be executed in multiline mode and line + * break will be included in '.'. If p is + * specified, match will be executed in POSIX mode, line break + * will be considered as normal character. If e + * is specified, replacement string will be + * evaluated as PHP expression. + * @return string The resultant string on success, or FALSE on error. + * @jms-builtin + */ +function mb_ereg_replace ($pattern, $replacement, $string, $option = "msr") {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Replace regular expression with multibyte support ignoring case + * @link http://php.net/manual/en/function.mb-eregi-replace.php + * @param string $pattern

+ * The regular expression pattern. Multibyte characters may be used. The case will be ignored. + *

+ * @param string $replace

+ * The replacement text. + *

+ * @param string $string

+ * The searched string. + *

+ * @param string $option [optional] option has the same meaning as in + * mb_ereg_replace. + * @return string The resultant string or FALSE on error. + * @jms-builtin + */ +function mb_eregi_replace ($pattern, $replace, $string, $option = "msri") {} + +/** + * (No version information available, might only be in SVN)
+ * Perform a regular expresssion seach and replace with multibyte support using a callback + * @link http://php.net/manual/en/function.mb-ereg-replace-callback.php + * @param string $pattern

+ * The regular expression pattern. + *

+ *

+ * Multibyte characters may be used in pattern. + *

+ * @param callable $callback

+ * A callback that will be called and passed an array of matched elements + * in the subject string. The callback should + * return the replacement string. + *

+ *

+ * You'll often need the callback function + * for a mb_ereg_replace_callback in just one place. + * In this case you can use an + * anonymous function (since + * PHP 5.3.0) or create_function to + * declare an anonymous function as callback within the call to + * mb_ereg_replace_callback. By doing it this way + * you have all information for the call in one place and do not + * clutter the function namespace with a callback function's name + * not used anywhere else. + *

+ * @param string $string

+ * The string being checked. + *

+ * @param string $option [optional]

+ * Matching condition can be set by option + * parameter. If i is specified for this + * parameter, the case will be ignored. If x is + * specified, white space will be ignored. If m + * is specified, match will be executed in multiline mode and line + * break will be included in '.'. If p is + * specified, match will be executed in POSIX mode, line break + * will be considered as normal character. Note that e + * cannot be used for mb_ereg_replace_callback. + *

+ * @return string The resultant string on success, or FALSE on error. + * @jms-builtin + */ +function mb_ereg_replace_callback ($pattern, callable $callback, $string, $option = "msr") {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Split multibyte string using regular expression + * @link http://php.net/manual/en/function.mb-split.php + * @param string $pattern

+ * The regular expression pattern. + *

+ * @param string $string

+ * The string being split. + *

+ * @param int $limit [optional] If optional parameter limit is specified, + * it will be split in limit elements as + * maximum. + * @return array The result as an array. + * @jms-builtin + */ +function mb_split ($pattern, $string, $limit = -1) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Regular expression match for multibyte string + * @link http://php.net/manual/en/function.mb-ereg-match.php + * @param string $pattern

+ * The regular expression pattern. + *

+ * @param string $string

+ * The string being evaluated. + *

+ * @param string $option [optional]

+ *

+ * @return bool + * @jms-builtin + */ +function mb_ereg_match ($pattern, $string, $option = "msr") {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Multibyte regular expression match for predefined multibyte string + * @link http://php.net/manual/en/function.mb-ereg-search.php + * @param string $pattern [optional]

+ * The search pattern. + *

+ * @param string $option [optional]

+ * The search option. + *

+ * @return bool + * @jms-builtin + */ +function mb_ereg_search ($pattern = null, $option = "ms") {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns position and length of a matched part of the multibyte regular expression for a predefined multibyte string + * @link http://php.net/manual/en/function.mb-ereg-search-pos.php + * @param string $pattern [optional]

+ * The search pattern. + *

+ * @param string $option [optional]

+ * The search option. + *

+ * @return array + * @jms-builtin + */ +function mb_ereg_search_pos ($pattern = null, $option = "ms") {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns the matched part of a multibyte regular expression + * @link http://php.net/manual/en/function.mb-ereg-search-regs.php + * @param string $pattern [optional]

+ * The search pattern. + *

+ * @param string $option [optional]

+ * The search option. + *

+ * @return array + * @jms-builtin + */ +function mb_ereg_search_regs ($pattern = null, $option = "ms") {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Setup string and regular expression for a multibyte regular expression match + * @link http://php.net/manual/en/function.mb-ereg-search-init.php + * @param string $string

+ * The search string. + *

+ * @param string $pattern [optional]

+ * The search pattern. + *

+ * @param string $option [optional]

+ * The search option. + *

+ * @return bool + * @jms-builtin + */ +function mb_ereg_search_init ($string, $pattern = null, $option = "msr") {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Retrieve the result from the last multibyte regular expression match + * @link http://php.net/manual/en/function.mb-ereg-search-getregs.php + * @return array + * @jms-builtin + */ +function mb_ereg_search_getregs () {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns start point for next regular expression match + * @link http://php.net/manual/en/function.mb-ereg-search-getpos.php + * @return int + * @jms-builtin + */ +function mb_ereg_search_getpos () {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Set start point of next regular expression match + * @link http://php.net/manual/en/function.mb-ereg-search-setpos.php + * @param int $position

+ * The position to set. + *

+ * @return bool + * @jms-builtin + */ +function mb_ereg_search_setpos ($position) {} + +/** + * @param $encoding [optional] + * @jms-builtin + */ +function mbregex_encoding ($encoding) {} + +/** + * @param $pattern + * @param $string + * @param $registers [optional] + * @jms-builtin + */ +function mbereg ($pattern, $string, &$registers) {} + +/** + * @param $pattern + * @param $string + * @param $registers [optional] + * @jms-builtin + */ +function mberegi ($pattern, $string, &$registers) {} + +/** + * @param $pattern + * @param $replacement + * @param $string + * @param $option [optional] + * @jms-builtin + */ +function mbereg_replace ($pattern, $replacement, $string, $option) {} + +/** + * @param $pattern + * @param $replacement + * @param $string + * @jms-builtin + */ +function mberegi_replace ($pattern, $replacement, $string) {} + +/** + * @param $pattern + * @param $string + * @param $limit [optional] + * @jms-builtin + */ +function mbsplit ($pattern, $string, $limit) {} + +/** + * @param $pattern + * @param $string + * @param $option [optional] + * @jms-builtin + */ +function mbereg_match ($pattern, $string, $option) {} + +/** + * @param $pattern [optional] + * @param $option [optional] + * @jms-builtin + */ +function mbereg_search ($pattern, $option) {} + +/** + * @param $pattern [optional] + * @param $option [optional] + * @jms-builtin + */ +function mbereg_search_pos ($pattern, $option) {} + +/** + * @param $pattern [optional] + * @param $option [optional] + * @jms-builtin + */ +function mbereg_search_regs ($pattern, $option) {} + +/** + * @param $string + * @param $pattern [optional] + * @param $option [optional] + * @jms-builtin + */ +function mbereg_search_init ($string, $pattern, $option) {} + +/** @jms-builtin */ +function mbereg_search_getregs () {} + +/** @jms-builtin */ +function mbereg_search_getpos () {} + +/** + * @param $position + * @jms-builtin + */ +function mbereg_search_setpos ($position) {} + +define ('MB_OVERLOAD_MAIL', 1); +define ('MB_OVERLOAD_STRING', 2); +define ('MB_OVERLOAD_REGEX', 4); +define ('MB_CASE_UPPER', 0); +define ('MB_CASE_LOWER', 1); +define ('MB_CASE_TITLE', 2); + +// End of mbstring v. +?> diff --git a/res/php-5.4-core-api/mcrypt.php b/res/php-5.4-core-api/mcrypt.php new file mode 100644 index 0000000..de4f837 --- /dev/null +++ b/res/php-5.4-core-api/mcrypt.php @@ -0,0 +1,671 @@ + + * Deprecated: Encrypts/decrypts data in ECB mode + * @link http://php.net/manual/en/function.mcrypt-ecb.php + * @param int $cipher + * @param string $key + * @param string $data + * @param int $mode + * @return string + * @jms-builtin + */ +function mcrypt_ecb ($cipher, $key, $data, $mode) {} + +/** + * (PHP 4, PHP 5)
+ * Encrypts/decrypts data in CBC mode + * @link http://php.net/manual/en/function.mcrypt-cbc.php + * @param int $cipher + * @param string $key + * @param string $data + * @param int $mode + * @param string $iv [optional] + * @return string + * @jms-builtin + */ +function mcrypt_cbc ($cipher, $key, $data, $mode, $iv = null) {} + +/** + * (PHP 4, PHP 5)
+ * Encrypts/decrypts data in CFB mode + * @link http://php.net/manual/en/function.mcrypt-cfb.php + * @param int $cipher + * @param string $key + * @param string $data + * @param int $mode + * @param string $iv + * @return string + * @jms-builtin + */ +function mcrypt_cfb ($cipher, $key, $data, $mode, $iv) {} + +/** + * (PHP 4, PHP 5)
+ * Encrypts/decrypts data in OFB mode + * @link http://php.net/manual/en/function.mcrypt-ofb.php + * @param int $cipher + * @param string $key + * @param string $data + * @param int $mode + * @param string $iv + * @return string + * @jms-builtin + */ +function mcrypt_ofb ($cipher, $key, $data, $mode, $iv) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the key size of the specified cipher + * @link http://php.net/manual/en/function.mcrypt-get-key-size.php + * @param int $cipher + * @return int + * @jms-builtin + */ +function mcrypt_get_key_size ($cipher) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the block size of the specified cipher + * @link http://php.net/manual/en/function.mcrypt-get-block-size.php + * @param int $cipher

+ * One of the MCRYPT_ciphername constants or the name + * of the algorithm as string. + *

+ * @return int Gets the block size, as an integer. + * @jms-builtin + */ +function mcrypt_get_block_size ($cipher) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the name of the specified cipher + * @link http://php.net/manual/en/function.mcrypt-get-cipher-name.php + * @param int $cipher

+ * One of the MCRYPT_ciphername constants or the name + * of the algorithm as string. + *

+ * @return string This function returns the name of the cipher or FALSE, if the cipher does + * not exist. + * @jms-builtin + */ +function mcrypt_get_cipher_name ($cipher) {} + +/** + * (PHP 4, PHP 5)
+ * Creates an initialization vector (IV) from a random source + * @link http://php.net/manual/en/function.mcrypt-create-iv.php + * @param int $size

+ * The size of the IV. + *

+ * @param int $source [optional]

+ * The source of the IV. The source can be + * MCRYPT_RAND (system random number generator), + * MCRYPT_DEV_RANDOM (read data from + * /dev/random) and + * MCRYPT_DEV_URANDOM (read data from + * /dev/urandom). Prior to 5.3.0, + * MCRYPT_RAND was the only one supported on Windows. + *

+ * @return string the initialization vector, or FALSE on error. + * @jms-builtin + */ +function mcrypt_create_iv ($size, $source = 'MCRYPT_DEV_RANDOM') {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Gets an array of all supported ciphers + * @link http://php.net/manual/en/function.mcrypt-list-algorithms.php + * @param string $lib_dir [optional]

+ * Specifies the directory where all algorithms are located. If not + * specified, the value of the mcrypt.algorithms_dir + * php.ini directive is used. + *

+ * @return array an array with all the supported algorithms. + * @jms-builtin + */ +function mcrypt_list_algorithms ($lib_dir = 'ini_get("mcrypt.algorithms_dir")') {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Gets an array of all supported modes + * @link http://php.net/manual/en/function.mcrypt-list-modes.php + * @param string $lib_dir [optional]

+ * Specifies the directory where all modes are located. If not + * specified, the value of the mcrypt.modes_dir + * php.ini directive is used. + *

+ * @return array an array with all the supported modes. + * @jms-builtin + */ +function mcrypt_list_modes ($lib_dir = 'ini_get("mcrypt.modes_dir")') {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns the size of the IV belonging to a specific cipher/mode combination + * @link http://php.net/manual/en/function.mcrypt-get-iv-size.php + * @param string $cipher

+ * One of the MCRYPT_ciphername constants, or the name + * of the algorithm as string. + *

+ * @param string $mode

+ * One of the MCRYPT_MODE_modename constants, or one of + * the following strings: "ecb", "cbc", "cfb", "ofb", "nofb" or "stream". + * The IV is ignored in ECB mode as this mode does not require it. You will + * need to have the same IV (think: starting point) both at encryption and + * decryption stages, otherwise your encryption will fail. + *

+ * @return int the size of the Initialization Vector (IV) in bytes. On error the + * function returns FALSE. If the IV is ignored in the specified cipher/mode + * combination zero is returned. + * @jms-builtin + */ +function mcrypt_get_iv_size ($cipher, $mode) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Encrypts plaintext with given parameters + * @link http://php.net/manual/en/function.mcrypt-encrypt.php + * @param string $cipher

+ * One of the MCRYPT_ciphername + * constants, or the name of the algorithm as string. + *

+ * @param string $key

+ * The key with which the data will be encrypted. If it's smaller than + * the required keysize, it is padded with '\0'. It is + * better not to use ASCII strings for keys. + *

+ *

+ * It is recommended to use the mhash functions to create a key from a + * string. + *

+ * @param string $data

+ * The data that will be encrypted with the given cipher + * and mode. If the size of the data is not n * blocksize, + * the data will be padded with '\0'. + *

+ *

+ * The returned crypttext can be larger than the size of the data that was + * given by data. + *

+ * @param string $mode

+ * One of the MCRYPT_MODE_modename constants, + * or one of the following strings: "ecb", "cbc", "cfb", "ofb", + * "nofb" or "stream". + *

+ * @param string $iv [optional]

+ * Used for the initialization in CBC, CFB, OFB modes, and in some + * algorithms in STREAM mode. If you do not supply an IV, while it is + * needed for an algorithm, the function issues a warning and uses an + * IV with all its bytes set to '\0'. + *

+ * @return string the encrypted data, as a string. + * @jms-builtin + */ +function mcrypt_encrypt ($cipher, $key, $data, $mode, $iv = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Decrypts crypttext with given parameters + * @link http://php.net/manual/en/function.mcrypt-decrypt.php + * @param string $cipher

+ * One of the MCRYPT_ciphername constants, + * or the name of the algorithm as string. + *

+ * @param string $key

+ * The key with which the data was encrypted. If it's smaller + * than the required keysize, it is padded with + * '\0'. + *

+ * @param string $data

+ * The data that will be decrypted with the given cipher + * and mode. If the size of the data is not n * blocksize, + * the data will be padded with '\0'. + *

+ * @param string $mode

+ * One of the MCRYPT_MODE_modename constants, + * or one of the following strings: "ecb", "cbc", "cfb", "ofb", + * "nofb" or "stream". + *

+ * @param string $iv [optional]

+ * The iv parameter is used for the initialization + * in CBC, CFB, OFB modes, and in some algorithms in STREAM mode. If you + * do not supply an IV, while it is needed for an algorithm, the function + * issues a warning and uses an IV with all its bytes set to + * '\0'. + *

+ * @return string the decrypted data as a string. + * @jms-builtin + */ +function mcrypt_decrypt ($cipher, $key, $data, $mode, $iv = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Opens the module of the algorithm and the mode to be used + * @link http://php.net/manual/en/function.mcrypt-module-open.php + * @param string $algorithm

+ * The algorithm to be used. + *

+ * @param string $algorithm_directory

+ * The algorithm_directory parameter is used to locate + * the encryption module. When you supply a directory name, it is used. When + * you set it to an empty string (""), the value set by the + * mcrypt.algorithms_dir php.ini directive is used. When + * it is not set, the default directory that is used is the one that was compiled + * into libmcrypt (usually /usr/local/lib/libmcrypt). + *

+ * @param string $mode

+ * The mode to be used. + *

+ * @param string $mode_directory

+ * The mode_directory parameter is used to locate + * the encryption module. When you supply a directory name, it is used. When + * you set it to an empty string (""), the value set by the + * mcrypt.modes_dir php.ini directive is used. When + * it is not set, the default directory that is used is the one that was compiled-in + * into libmcrypt (usually /usr/local/lib/libmcrypt). + *

+ * @return resource Normally it returns an encryption descriptor, or FALSE on error. + * @jms-builtin + */ +function mcrypt_module_open ($algorithm, $algorithm_directory, $mode, $mode_directory) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * This function initializes all buffers needed for encryption + * @link http://php.net/manual/en/function.mcrypt-generic-init.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @param string $key

+ * The maximum length of the key should be the one obtained by calling + * mcrypt_enc_get_key_size and every value smaller + * than this is legal. + *

+ * @param string $iv

+ * The IV should normally have the size of the algorithms block size, but + * you must obtain the size by calling + * mcrypt_enc_get_iv_size. IV is ignored in ECB. IV + * MUST exist in CFB, CBC, STREAM, nOFB and OFB modes. It needs to be + * random and unique (but not secret). The same IV must be used for + * encryption/decryption. If you do not want to use it you should set it + * to zeros, but this is not recommended. + *

+ * @return int The function returns a negative value on error: -3 when the key length + * was incorrect, -4 when there was a memory allocation problem and any + * other return value is an unknown error. If an error occurs a warning will + * be displayed accordingly. FALSE is returned if incorrect parameters + * were passed. + * @jms-builtin + */ +function mcrypt_generic_init ($td, $key, $iv) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * This function encrypts data + * @link http://php.net/manual/en/function.mcrypt-generic.php + * @param resource $td

+ * The encryption descriptor. + *

+ *

+ * The encryption handle should always be initialized with + * mcrypt_generic_init with a key and an IV before + * calling this function. Where the encryption is done, you should free the + * encryption buffers by calling mcrypt_generic_deinit. + * See mcrypt_module_open for an example. + *

+ * @param string $data

+ * The data to encrypt. + *

+ * @return string the encrypted data. + * @jms-builtin + */ +function mcrypt_generic ($td, $data) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Decrypts data + * @link http://php.net/manual/en/function.mdecrypt-generic.php + * @param resource $td

+ * An encryption descriptor returned by + * mcrypt_module_open + *

+ * @param string $data

+ * Encrypted data. + *

+ * @return string + * @jms-builtin + */ +function mdecrypt_generic ($td, $data) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5 <= 5.1.6)
+ * This function terminates encryption + * @link http://php.net/manual/en/function.mcrypt-generic-end.php + * @param resource $td + * @return bool + * @jms-builtin + */ +function mcrypt_generic_end ($td) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * This function deinitializes an encryption module + * @link http://php.net/manual/en/function.mcrypt-generic-deinit.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mcrypt_generic_deinit ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Runs a self test on the opened module + * @link http://php.net/manual/en/function.mcrypt-enc-self-test.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return int If the self test succeeds it returns FALSE. In case of an error, it + * returns TRUE. + * @jms-builtin + */ +function mcrypt_enc_self_test ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Checks whether the encryption of the opened mode works on blocks + * @link http://php.net/manual/en/function.mcrypt-enc-is-block-algorithm-mode.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return bool TRUE if the mode is for use with block algorithms, otherwise it + * returns FALSE. + * @jms-builtin + */ +function mcrypt_enc_is_block_algorithm_mode ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Checks whether the algorithm of the opened mode is a block algorithm + * @link http://php.net/manual/en/function.mcrypt-enc-is-block-algorithm.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return bool TRUE if the algorithm is a block algorithm or FALSE if it is + * a stream one. + * @jms-builtin + */ +function mcrypt_enc_is_block_algorithm ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Checks whether the opened mode outputs blocks + * @link http://php.net/manual/en/function.mcrypt-enc-is-block-mode.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return bool TRUE if the mode outputs blocks of bytes, + * or FALSE if it outputs just bytes. + * @jms-builtin + */ +function mcrypt_enc_is_block_mode ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns the blocksize of the opened algorithm + * @link http://php.net/manual/en/function.mcrypt-enc-get-block-size.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return int the block size of the specified algorithm in bytes. + * @jms-builtin + */ +function mcrypt_enc_get_block_size ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns the maximum supported keysize of the opened mode + * @link http://php.net/manual/en/function.mcrypt-enc-get-key-size.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return int the maximum supported key size of the algorithm in bytes. + * @jms-builtin + */ +function mcrypt_enc_get_key_size ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns an array with the supported keysizes of the opened algorithm + * @link http://php.net/manual/en/function.mcrypt-enc-get-supported-key-sizes.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return array an array with the key sizes supported by the algorithm + * specified by the encryption descriptor. If it returns an empty + * array then all key sizes between 1 and + * mcrypt_enc_get_key_size are supported by the + * algorithm. + * @jms-builtin + */ +function mcrypt_enc_get_supported_key_sizes ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns the size of the IV of the opened algorithm + * @link http://php.net/manual/en/function.mcrypt-enc-get-iv-size.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return int the size of the IV, or 0 if the IV is ignored by the algorithm. + * @jms-builtin + */ +function mcrypt_enc_get_iv_size ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns the name of the opened algorithm + * @link http://php.net/manual/en/function.mcrypt-enc-get-algorithms-name.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return string the name of the opened algorithm as a string. + * @jms-builtin + */ +function mcrypt_enc_get_algorithms_name ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns the name of the opened mode + * @link http://php.net/manual/en/function.mcrypt-enc-get-modes-name.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return string the name as a string. + * @jms-builtin + */ +function mcrypt_enc_get_modes_name ($td) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * This function runs a self test on the specified module + * @link http://php.net/manual/en/function.mcrypt-module-self-test.php + * @param string $algorithm

+ * The algorithm to test. + *

+ * @param string $lib_dir [optional]

+ * The optional lib_dir parameter can contain the + * location where the algorithm module is on the system. + *

+ * @return bool The function returns TRUE if the self test succeeds, or FALSE when it + * fails. + * @jms-builtin + */ +function mcrypt_module_self_test ($algorithm, $lib_dir = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns if the specified module is a block algorithm or not + * @link http://php.net/manual/en/function.mcrypt-module-is-block-algorithm-mode.php + * @param string $mode

+ * The mode to check. + *

+ * @param string $lib_dir [optional]

+ * The optional lib_dir parameter can contain the + * location where the algorithm module is on the system. + *

+ * @return bool This function returns TRUE if the mode is for use with block + * algorithms, otherwise it returns FALSE. (e.g. FALSE for stream, and + * TRUE for cbc, cfb, ofb). + * @jms-builtin + */ +function mcrypt_module_is_block_algorithm_mode ($mode, $lib_dir = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * This function checks whether the specified algorithm is a block algorithm + * @link http://php.net/manual/en/function.mcrypt-module-is-block-algorithm.php + * @param string $algorithm

+ * The algorithm to check. + *

+ * @param string $lib_dir [optional]

+ * The optional lib_dir parameter can contain the + * location where the algorithm module is on the system. + *

+ * @return bool This function returns TRUE if the specified algorithm is a block + * algorithm, or FALSE if it is a stream one. + * @jms-builtin + */ +function mcrypt_module_is_block_algorithm ($algorithm, $lib_dir = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns if the specified mode outputs blocks or not + * @link http://php.net/manual/en/function.mcrypt-module-is-block-mode.php + * @param string $mode

+ * The mode to check. + *

+ * @param string $lib_dir [optional]

+ * The optional lib_dir parameter can contain the + * location where the algorithm module is on the system. + *

+ * @return bool This function returns TRUE if the mode outputs blocks of bytes or + * FALSE if it outputs just bytes. (e.g. TRUE for cbc and ecb, and + * FALSE for cfb and stream). + * @jms-builtin + */ +function mcrypt_module_is_block_mode ($mode, $lib_dir = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns the blocksize of the specified algorithm + * @link http://php.net/manual/en/function.mcrypt-module-get-algo-block-size.php + * @param string $algorithm

+ * The algorithm name. + *

+ * @param string $lib_dir [optional]

+ * This optional parameter can contain the location where the mode module + * is on the system. + *

+ * @return int the block size of the algorithm specified in bytes. + * @jms-builtin + */ +function mcrypt_module_get_algo_block_size ($algorithm, $lib_dir = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns the maximum supported keysize of the opened mode + * @link http://php.net/manual/en/function.mcrypt-module-get-algo-key-size.php + * @param string $algorithm

+ * The algorithm name. + *

+ * @param string $lib_dir [optional]

+ * This optional parameter can contain the location where the mode module + * is on the system. + *

+ * @return int This function returns the maximum supported key size of the + * algorithm specified in bytes. + * @jms-builtin + */ +function mcrypt_module_get_algo_key_size ($algorithm, $lib_dir = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns an array with the supported keysizes of the opened algorithm + * @link http://php.net/manual/en/function.mcrypt-module-get-supported-key-sizes.php + * @param string $algorithm

+ * The algorithm to be used. + *

+ * @param string $lib_dir [optional]

+ * The optional lib_dir parameter can contain the + * location where the algorithm module is on the system. + *

+ * @return array an array with the key sizes supported by the specified algorithm. + * If it returns an empty array then all key sizes between 1 and + * mcrypt_module_get_algo_key_size are supported by the + * algorithm. + * @jms-builtin + */ +function mcrypt_module_get_supported_key_sizes ($algorithm, $lib_dir = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Closes the mcrypt module + * @link http://php.net/manual/en/function.mcrypt-module-close.php + * @param resource $td

+ * The encryption descriptor. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mcrypt_module_close ($td) {} + +define ('MCRYPT_ENCRYPT', 0); +define ('MCRYPT_DECRYPT', 1); +define ('MCRYPT_DEV_RANDOM', 0); +define ('MCRYPT_DEV_URANDOM', 1); +define ('MCRYPT_RAND', 2); +define ('MCRYPT_3DES', "tripledes"); +define ('MCRYPT_ARCFOUR_IV', "arcfour-iv"); +define ('MCRYPT_ARCFOUR', "arcfour"); +define ('MCRYPT_BLOWFISH', "blowfish"); +define ('MCRYPT_BLOWFISH_COMPAT', "blowfish-compat"); +define ('MCRYPT_CAST_128', "cast-128"); +define ('MCRYPT_CAST_256', "cast-256"); +define ('MCRYPT_CRYPT', "crypt"); +define ('MCRYPT_DES', "des"); +define ('MCRYPT_ENIGNA', "crypt"); +define ('MCRYPT_GOST', "gost"); +define ('MCRYPT_LOKI97', "loki97"); +define ('MCRYPT_PANAMA', "panama"); +define ('MCRYPT_RC2', "rc2"); +define ('MCRYPT_RIJNDAEL_128', "rijndael-128"); +define ('MCRYPT_RIJNDAEL_192', "rijndael-192"); +define ('MCRYPT_RIJNDAEL_256', "rijndael-256"); +define ('MCRYPT_SAFER64', "safer-sk64"); +define ('MCRYPT_SAFER128', "safer-sk128"); +define ('MCRYPT_SAFERPLUS', "saferplus"); +define ('MCRYPT_SERPENT', "serpent"); +define ('MCRYPT_THREEWAY', "threeway"); +define ('MCRYPT_TRIPLEDES', "tripledes"); +define ('MCRYPT_TWOFISH', "twofish"); +define ('MCRYPT_WAKE', "wake"); +define ('MCRYPT_XTEA', "xtea"); +define ('MCRYPT_IDEA', "idea"); +define ('MCRYPT_MARS', "mars"); +define ('MCRYPT_RC6', "rc6"); +define ('MCRYPT_SKIPJACK', "skipjack"); +define ('MCRYPT_MODE_CBC', "cbc"); +define ('MCRYPT_MODE_CFB', "cfb"); +define ('MCRYPT_MODE_ECB', "ecb"); +define ('MCRYPT_MODE_NOFB', "nofb"); +define ('MCRYPT_MODE_OFB', "ofb"); +define ('MCRYPT_MODE_STREAM', "stream"); + +// End of mcrypt v. +?> diff --git a/res/php-5.4-core-api/memcache.php b/res/php-5.4-core-api/memcache.php new file mode 100644 index 0000000..7e3c47c --- /dev/null +++ b/res/php-5.4-core-api/memcache.php @@ -0,0 +1,294 @@ + + * Open memcached server connection + * @link http://php.net/manual/en/memcache.connect.php + * @param string $host

+ * Point to the host where memcached is listening for connections. This parameter + * may also specify other transports like unix:///path/to/memcached.sock + * to use UNIX domain sockets, in this case port must also + * be set to 0. + *

+ * @param int $port [optional]

+ * Point to the port where memcached is listening for connections. Set this + * parameter to 0 when using UNIX domain sockets. + *

+ * @param int $timeout [optional]

+ * Value in seconds which will be used for connecting to the daemon. Think + * twice before changing the default value of 1 second - you can lose all + * the advantages of caching if your connection is too slow. + *

+ * @return bool true on success or false on failure. + */ + public function connect ($host, $port = null, $timeout = null) {} + + /** + * (PECL memcache >= 0.4.0)
+ * Open memcached server persistent connection + * @link http://php.net/manual/en/memcache.pconnect.php + * @param string $host

+ * Point to the host where memcached is listening for connections. This parameter + * may also specify other transports like unix:///path/to/memcached.sock + * to use UNIX domain sockets, in this case port must also + * be set to 0. + *

+ * @param int $port [optional]

+ * Point to the port where memcached is listening for connections. Set this + * parameter to 0 when using UNIX domain sockets. + *

+ * @param int $timeout [optional]

+ * Value in seconds which will be used for connecting to the daemon. Think + * twice before changing the default value of 1 second - you can lose all + * the advantages of caching if your connection is too slow. + *

+ * @return mixed a Memcache object or false on failure. + */ + public function pconnect ($host, $port = null, $timeout = null) {} + + /** + * (PECL memcache >= 2.0.0)
+ * Add a memcached server to connection pool + * @link http://php.net/manual/en/memcache.addserver.php + * @param string $host

+ * Point to the host where memcached is listening for connections. This parameter + * may also specify other transports like unix:///path/to/memcached.sock + * to use UNIX domain sockets, in this case port must also + * be set to 0. + *

+ * @param int $port [optional]

+ * Point to the port where memcached is listening for connections. + * Set this + * parameter to 0 when using UNIX domain sockets. + *

+ * @param bool $persistent [optional]

+ * Controls the use of a persistent connection. Default to true. + *

+ * @param int $weight [optional]

+ * Number of buckets to create for this server which in turn control its + * probability of it being selected. The probability is relative to the + * total weight of all servers. + *

+ * @param int $timeout [optional]

+ * Value in seconds which will be used for connecting to the daemon. Think + * twice before changing the default value of 1 second - you can lose all + * the advantages of caching if your connection is too slow. + *

+ * @param int $retry_interval [optional]

+ * Controls how often a failed server will be retried, the default value + * is 15 seconds. Setting this parameter to -1 disables automatic retry. + * Neither this nor the persistent parameter has any + * effect when the extension is loaded dynamically via dl. + *

+ *

+ * Each failed connection struct has its own timeout and before it has expired + * the struct will be skipped when selecting backends to serve a request. Once + * expired the connection will be successfully reconnected or marked as failed + * for another retry_interval seconds. The typical + * effect is that each web server child will retry the connection about every + * retry_interval seconds when serving a page. + *

+ * @param bool $status [optional]

+ * Controls if the server should be flagged as online. Setting this parameter + * to false and retry_interval to -1 allows a failed + * server to be kept in the pool so as not to affect the key distribution + * algorithm. Requests for this server will then failover or fail immediately + * depending on the memcache.allow_failover setting. + * Default to true, meaning the server should be considered online. + *

+ * @param callback $failure_callback [optional]

+ * Allows the user to specify a callback function to run upon encountering an + * error. The callback is run before failover is attempted. The function takes + * two parameters, the hostname and port of the failed server. + *

+ * @param int $timeoutms [optional]

+ *

+ * @return bool true on success or false on failure. + */ + public function addserver ($host, $port = 11211, $persistent = null, $weight = null, $timeout = null, $retry_interval = null, $status = null, $failure_callback = null, $timeoutms = null) {} + + public function setserverparams () {} + + public function setfailurecallback () {} + + public function getserverstatus () {} + + public function findserver () {} + + public function getversion () {} + + public function add () {} + + public function set () {} + + public function replace () {} + + public function cas () {} + + public function append () {} + + public function prepend () {} + + public function get () {} + + public function delete () {} + + public function getstats () {} + + public function getextendedstats () {} + + public function setcompressthreshold () {} + + public function increment () {} + + public function decrement () {} + + public function close () {} + + public function flush () {} + +} + +/** @jms-builtin */ +function memcache_connect () {} + +/** @jms-builtin */ +function memcache_pconnect () {} + +/** @jms-builtin */ +function memcache_add_server () {} + +/** @jms-builtin */ +function memcache_set_server_params () {} + +/** @jms-builtin */ +function memcache_set_failure_callback () {} + +/** @jms-builtin */ +function memcache_get_server_status () {} + +/** @jms-builtin */ +function memcache_get_version () {} + +/** @jms-builtin */ +function memcache_add () {} + +/** @jms-builtin */ +function memcache_set () {} + +/** @jms-builtin */ +function memcache_replace () {} + +/** @jms-builtin */ +function memcache_cas () {} + +/** @jms-builtin */ +function memcache_append () {} + +/** @jms-builtin */ +function memcache_prepend () {} + +/** @jms-builtin */ +function memcache_get () {} + +/** @jms-builtin */ +function memcache_delete () {} + +/** + * (PECL memcache >= 0.2.0)
+ * Turn debug output on/off + * @link http://php.net/manual/en/function.memcache-debug.php + * @param bool $on_off

+ * Turns debug output on if equals to true. + * Turns debug output off if equals to false. + *

+ * @return bool true if PHP was built with --enable-debug option, otherwise + * returns false. + * @jms-builtin + */ +function memcache_debug ($on_off) {} + +/** @jms-builtin */ +function memcache_get_stats () {} + +/** @jms-builtin */ +function memcache_get_extended_stats () {} + +/** @jms-builtin */ +function memcache_set_compress_threshold () {} + +/** @jms-builtin */ +function memcache_increment () {} + +/** @jms-builtin */ +function memcache_decrement () {} + +/** @jms-builtin */ +function memcache_close () {} + +/** @jms-builtin */ +function memcache_flush () {} + +define ('MEMCACHE_COMPRESSED', 2); +define ('MEMCACHE_HAVE_SESSION', 1); + +// End of memcache v.3.0.5 +?> diff --git a/res/php-5.4-core-api/memcached.php b/res/php-5.4-core-api/memcached.php new file mode 100644 index 0000000..2f54c32 --- /dev/null +++ b/res/php-5.4-core-api/memcached.php @@ -0,0 +1,1139 @@ +Enables or disables payload compression. When enabled, + * item values longer than a certain threshold (currently 100 bytes) will be + * compressed during storage and decompressed during retrieval + * transparently.

+ *

Type: boolean, default: true.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_COMPRESSION = -1001; + + /** + *

This can be used to create a "domain" for your item keys. The value + * specified here will be prefixed to each of the keys. It cannot be + * longer than 128 characters and will reduce the + * maximum available key size. The prefix is applied only to the item keys, + * not to the server keys.

+ *

Type: string, default: "".

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_PREFIX_KEY = -1002; + + /** + *

+ * Specifies the serializer to use for serializing non-scalar values. + * The valid serializers are Memcached::SERIALIZER_PHP + * or Memcached::SERIALIZER_IGBINARY. The latter is + * supported only when memcached is configured with + * --enable-memcached-igbinary option and the + * igbinary extension is loaded. + *

+ *

Type: integer, default: Memcached::SERIALIZER_PHP.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_SERIALIZER = -1003; + + /** + *

Indicates whether igbinary serializer support is available.

+ *

Type: boolean.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HAVE_IGBINARY = 0; + + /** + *

Indicates whether JSON serializer support is available.

+ *

Type: boolean.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HAVE_JSON = 1; + + /** + *

Specifies the hashing algorithm used for the item keys. The valid + * values are supplied via Memcached::HASH_* constants. + * Each hash algorithm has its advantages and its disadvantages. Go with the + * default if you don't know or don't care.

+ *

Type: integer, default: Memcached::HASH_DEFAULT

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_HASH = 2; + + /** + *

The default (Jenkins one-at-a-time) item key hashing algorithm.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HASH_DEFAULT = 0; + + /** + *

MD5 item key hashing algorithm.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HASH_MD5 = 1; + + /** + *

CRC item key hashing algorithm.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HASH_CRC = 2; + + /** + *

FNV1_64 item key hashing algorithm.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HASH_FNV1_64 = 3; + + /** + *

FNV1_64A item key hashing algorithm.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HASH_FNV1A_64 = 4; + + /** + *

FNV1_32 item key hashing algorithm.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HASH_FNV1_32 = 5; + + /** + *

FNV1_32A item key hashing algorithm.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HASH_FNV1A_32 = 6; + + /** + *

Hsieh item key hashing algorithm.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HASH_HSIEH = 7; + + /** + *

Murmur item key hashing algorithm.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const HASH_MURMUR = 8; + + /** + *

Specifies the method of distributing item keys to the servers. + * Currently supported methods are modulo and consistent hashing. Consistent + * hashing delivers better distribution and allows servers to be added to + * the cluster with minimal cache losses.

+ *

Type: integer, default: Memcached::DISTRIBUTION_MODULA.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_DISTRIBUTION = 9; + + /** + *

Modulo-based key distribution algorithm.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const DISTRIBUTION_MODULA = 0; + + /** + *

Consistent hashing key distribution algorithm (based on libketama).

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const DISTRIBUTION_CONSISTENT = 1; + + /** + *

Enables or disables compatibility with libketama-like behavior. When + * enabled, the item key hashing algorithm is set to MD5 and distribution is + * set to be weighted consistent hashing distribution. This is useful + * because other libketama-based clients (Python, Ruby, etc.) with the same + * server configuration will be able to access the keys transparently. + *

+ *

+ * It is highly recommended to enable this option if you want to use + * consistent hashing, and it may be enabled by default in future + * releases. + *

+ *

Type: boolean, default: false.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_LIBKETAMA_COMPATIBLE = 16; + + /** + *

Enables or disables buffered I/O. Enabling buffered I/O causes + * storage commands to "buffer" instead of being sent. Any action that + * retrieves data causes this buffer to be sent to the remote connection. + * Quitting the connection or closing down the connection will also cause + * the buffered data to be pushed to the remote connection.

+ *

Type: boolean, default: false.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_BUFFER_WRITES = 10; + + /** + *

Enable the use of the binary protocol. Please note that you cannot + * toggle this option on an open connection.

+ *

Type: boolean, default: false.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_BINARY_PROTOCOL = 18; + + /** + *

Enables or disables asynchronous I/O. This is the fastest transport + * available for storage functions.

+ *

Type: boolean, default: false.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_NO_BLOCK = 0; + + /** + *

Enables or disables the no-delay feature for connecting sockets (may + * be faster in some environments).

+ *

Type: boolean, default: false.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_TCP_NODELAY = 1; + + /** + *

The maximum socket send buffer in bytes.

+ *

Type: integer, default: varies by platform/kernel + * configuration.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_SOCKET_SEND_SIZE = 4; + + /** + *

The maximum socket receive buffer in bytes.

+ *

Type: integer, default: varies by platform/kernel + * configuration.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_SOCKET_RECV_SIZE = 5; + + /** + *

In non-blocking mode this set the value of the timeout during socket + * connection, in milliseconds.

+ *

Type: integer, default: 1000.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_CONNECT_TIMEOUT = 14; + + /** + *

The amount of time, in seconds, to wait until retrying a failed + * connection attempt.

+ *

Type: integer, default: 0.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_RETRY_TIMEOUT = 15; + + /** + *

Socket sending timeout, in microseconds. In cases where you cannot + * use non-blocking I/O this will allow you to still have timeouts on the + * sending of data.

+ *

Type: integer, default: 0.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_SEND_TIMEOUT = 19; + + /** + *

Socket reading timeout, in microseconds. In cases where you cannot + * use non-blocking I/O this will allow you to still have timeouts on the + * reading of data.

+ *

Type: integer, default: 0.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_RECV_TIMEOUT = 20; + + /** + *

Timeout for connection polling, in milliseconds.

+ *

Type: integer, default: 1000.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_POLL_TIMEOUT = 8; + + /** + *

Enables or disables caching of DNS lookups.

+ *

Type: boolean, default: false.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_CACHE_LOOKUPS = 6; + + /** + *

Specifies the failure limit for server connection attempts. The + * server will be removed after this many continuous connection + * failures.

+ *

Type: integer, default: 0.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const OPT_SERVER_FAILURE_LIMIT = 21; + + /** + *

The operation was successful.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_SUCCESS = 0; + + /** + *

The operation failed in some fashion.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_FAILURE = 1; + + /** + *

DNS lookup failed.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_HOST_LOOKUP_FAILURE = 2; + + /** + *

Failed to read network data.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_UNKNOWN_READ_FAILURE = 7; + + /** + *

Bad command in memcached protocol.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_PROTOCOL_ERROR = 8; + + /** + *

Error on the client side.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_CLIENT_ERROR = 9; + + /** + *

Error on the server side.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_SERVER_ERROR = 10; + + /** + *

Failed to write network data.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_WRITE_FAILURE = 5; + + /** + *

Failed to do compare-and-swap: item you are trying to store has been + * modified since you last fetched it.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_DATA_EXISTS = 12; + + /** + *

Item was not stored: but not because of an error. This normally + * means that either the condition for an "add" or a "replace" command + * wasn't met, or that the item is in a delete queue.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_NOTSTORED = 14; + + /** + *

Item with this key was not found (with "get" operation or "cas" + * operations).

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_NOTFOUND = 16; + + /** + *

Partial network data read error.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_PARTIAL_READ = 18; + + /** + *

Some errors occurred during multi-get.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_SOME_ERRORS = 19; + + /** + *

Server list is empty.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_NO_SERVERS = 20; + + /** + *

End of result set.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_END = 21; + + /** + *

System error.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_ERRNO = 26; + + /** + *

The operation was buffered.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_BUFFERED = 32; + + /** + *

The operation timed out.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_TIMEOUT = 31; + + /** + *

Bad key.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_BAD_KEY_PROVIDED = 33; + + /** + *

Failed to create network socket.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_CONNECTION_SOCKET_CREATE_FAILURE = 11; + + /** + *

Payload failure: could not compress/decompress or serialize/unserialize the value.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const RES_PAYLOAD_FAILURE = -1001; + + /** + *

The default PHP serializer.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const SERIALIZER_PHP = 1; + + /** + *

The igbinary serializer. + * Instead of textual representation it stores PHP data structures in a + * compact binary form, resulting in space and time gains.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const SERIALIZER_IGBINARY = 2; + + /** + *

The JSON serializer. Requires PHP 5.2.10+.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const SERIALIZER_JSON = 3; + + /** + *

A flag for Memcached::getMulti and + * Memcached::getMultiByKey to ensure that the keys are + * returned in the same order as they were requested in. Non-existing keys + * get a default value of NULL.

+ * @link http://php.net/manual/en/memcached.constants.php + */ + const GET_PRESERVE_ORDER = 1; + + + /** + * (PECL memcached >= 0.1.0)
+ * Create a Memcached instance + * @link http://php.net/manual/en/memcached.construct.php + * @param $persistent_id [optional] + */ + public function __construct ($persistent_id) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Return the result code of the last operation + * @link http://php.net/manual/en/memcached.getresultcode.php + * @return int Result code of the last Memcached operation. + */ + public function getResultCode () {} + + /** + * (PECL memcached >= 1.0.0)
+ * Return the message describing the result of the last operation + * @link http://php.net/manual/en/memcached.getresultmessage.php + * @return string Message describing the result of the last Memcached operation. + */ + public function getResultMessage () {} + + /** + * (PECL memcached >= 0.1.0)
+ * Retrieve an item + * @link http://php.net/manual/en/memcached.get.php + * @param string $key

+ * The key of the item to retrieve. + *

+ * @param callback $cache_cb [optional]

+ * Read-through caching callback or null. + *

+ * @param float $cas_token [optional]

+ * The variable to store the CAS token in. + *

+ * @return mixed the value stored in the cache or false otherwise. + * The Memcached::getResultCode will return + * Memcached::RES_NOTFOUND if the key does not exist. + */ + public function get ($key, $cache_cb = null, &$cas_token = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Retrieve an item from a specific server + * @link http://php.net/manual/en/memcached.getbykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param string $key

+ * The key of the item to fetch. + *

+ * @param callback $cache_cb [optional]

+ * Read-through caching callback or null + *

+ * @param float $cas_token [optional]

+ * The variable to store the CAS token in. + *

+ * @return mixed the value stored in the cache or false otherwise. + * The Memcached::getResultCode will return + * Memcached::RES_NOTFOUND if the key does not exist. + */ + public function getByKey ($server_key, $key, $cache_cb = null, &$cas_token = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Retrieve multiple items + * @link http://php.net/manual/en/memcached.getmulti.php + * @param array $keys

+ * Array of keys to retrieve. + *

+ * @param array $cas_tokens [optional]

+ * The variable to store the CAS tokens for the found items. + *

+ * @param int $flags [optional]

+ * The flags for the get operation. + *

+ * @return mixed the array of found items or false on failure. + * &memcached.result.getresultcode; + */ + public function getMulti (array $keys, array &$cas_tokens = null, $flags = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Retrieve multiple items from a specific server + * @link http://php.net/manual/en/memcached.getmultibykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param array $keys

+ * Array of keys to retrieve. + *

+ * @param string $cas_tokens [optional]

+ * The variable to store the CAS tokens for the found items. + *

+ * @param int $flags [optional]

+ * The flags for the get operation. + *

+ * @return array the array of found items or false on failure. + * &memcached.result.getresultcode; + */ + public function getMultiByKey ($server_key, array $keys, &$cas_tokens = null, $flags = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Request multiple items + * @link http://php.net/manual/en/memcached.getdelayed.php + * @param array $keys

+ * Array of keys to request. + *

+ * @param bool $with_cas [optional]

+ * Whether to request CAS token values also. + *

+ * @param callback $value_cb [optional]

+ * The result callback or null. + *

+ * @return bool true on success or false on failure. + * &memcached.result.getresultcode; + */ + public function getDelayed (array $keys, $with_cas = null, $value_cb = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Request multiple items from a specific server + * @link http://php.net/manual/en/memcached.getdelayedbykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param array $keys

+ * Array of keys to request. + *

+ * @param bool $with_cas [optional]

+ * Whether to request CAS token values also. + *

+ * @param callback $value_cb [optional]

+ * The result callback or null. + *

+ * @return bool true on success or false on failure. + * &memcached.result.getresultcode; + */ + public function getDelayedByKey ($server_key, array $keys, $with_cas = null, $value_cb = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Fetch the next result + * @link http://php.net/manual/en/memcached.fetch.php + * @return array the next result or false otherwise. + * The Memcached::getResultCode will return + * Memcached::RES_END if result set is exhausted. + */ + public function fetch () {} + + /** + * (PECL memcached >= 0.1.0)
+ * Fetch all the remaining results + * @link http://php.net/manual/en/memcached.fetchall.php + * @return array the results or false on failure. + * &memcached.result.getresultcode; + */ + public function fetchAll () {} + + /** + * (PECL memcached >= 0.1.0)
+ * Store an item + * @link http://php.net/manual/en/memcached.set.php + * @param string $key

+ * &memcached.parameter.key; + *

+ * @param mixed $value

+ * &memcached.parameter.value; + *

+ * @param int $expiration [optional]

+ * &memcached.parameter.expiration; + *

+ * @return bool true on success or false on failure. + * &memcached.result.getresultcode; + */ + public function set ($key, $value, $expiration = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Store an item on a specific server + * @link http://php.net/manual/en/memcached.setbykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param string $key

+ * &memcached.parameter.key; + *

+ * @param mixed $value

+ * &memcached.parameter.value; + *

+ * @param int $expiration [optional]

+ * &memcached.parameter.expiration; + *

+ * @return bool true on success or false on failure. + * &memcached.result.getresultcode; + */ + public function setByKey ($server_key, $key, $value, $expiration = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Store multiple items + * @link http://php.net/manual/en/memcached.setmulti.php + * @param array $items

+ * &memcached.parameter.items; + *

+ * @param int $expiration [optional]

+ * &memcached.parameter.expiration; + *

+ * @return bool true on success or false on failure. + * &memcached.result.getresultcode; + */ + public function setMulti (array $items, $expiration = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Store multiple items on a specific server + * @link http://php.net/manual/en/memcached.setmultibykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param array $items

+ * &memcached.parameter.items; + *

+ * @param int $expiration [optional]

+ * &memcached.parameter.expiration; + *

+ * @return bool true on success or false on failure. + * &memcached.result.getresultcode; + */ + public function setMultiByKey ($server_key, array $items, $expiration = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Compare and swap an item + * @link http://php.net/manual/en/memcached.cas.php + * @param float $cas_token

+ * Unique value associated with the existing item. Generated by memcache. + *

+ * @param string $key

+ * &memcached.parameter.key; + *

+ * @param mixed $value

+ * &memcached.parameter.value; + *

+ * @param int $expiration [optional]

+ * &memcached.parameter.expiration; + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_DATA_EXISTS if the item you are trying + * to store has been modified since you last fetched it. + */ + public function cas ($cas_token, $key, $value, $expiration = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Compare and swap an item on a specific server + * @link http://php.net/manual/en/memcached.casbykey.php + * @param float $cas_token

+ * Unique value associated with the existing item. Generated by memcache. + *

+ * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param string $key

+ * &memcached.parameter.key; + *

+ * @param mixed $value

+ * &memcached.parameter.value; + *

+ * @param int $expiration [optional]

+ * &memcached.parameter.expiration; + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_DATA_EXISTS if the item you are trying + * to store has been modified since you last fetched it. + */ + public function casByKey ($cas_token, $server_key, $key, $value, $expiration = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Add an item under a new key + * @link http://php.net/manual/en/memcached.add.php + * @param string $key

+ * &memcached.parameter.key; + *

+ * @param mixed $value

+ * &memcached.parameter.value; + *

+ * @param int $expiration [optional]

+ * &memcached.parameter.expiration; + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTSTORED if the key already exists. + */ + public function add ($key, $value, $expiration = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Add an item under a new key on a specific server + * @link http://php.net/manual/en/memcached.addbykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param string $key

+ * &memcached.parameter.key; + *

+ * @param mixed $value

+ * &memcached.parameter.value; + *

+ * @param int $expiration [optional]

+ * &memcached.parameter.expiration; + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTSTORED if the key already exists. + */ + public function addByKey ($server_key, $key, $value, $expiration = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Append data to an existing item + * @link http://php.net/manual/en/memcached.append.php + * @param string $key

+ * &memcached.parameter.key; + *

+ * @param string $value

+ * The string to append. + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTSTORED if the key does not exist. + */ + public function append ($key, $value) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Append data to an existing item on a specific server + * @link http://php.net/manual/en/memcached.appendbykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param string $key

+ * &memcached.parameter.key; + *

+ * @param string $value

+ * The string to append. + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTSTORED if the key does not exist. + */ + public function appendByKey ($server_key, $key, $value) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Prepend data to an existing item + * @link http://php.net/manual/en/memcached.prepend.php + * @param string $key

+ * The key of the item to prepend the data to. + *

+ * @param string $value

+ * The string to prepend. + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTSTORED if the key does not exist. + */ + public function prepend ($key, $value) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Prepend data to an existing item on a specific server + * @link http://php.net/manual/en/memcached.prependbykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param string $key

+ * The key of the item to prepend the data to. + *

+ * @param string $value

+ * The string to prepend. + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTSTORED if the key does not exist. + */ + public function prependByKey ($server_key, $key, $value) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Replace the item under an existing key + * @link http://php.net/manual/en/memcached.replace.php + * @param string $key

+ * &memcached.parameter.key; + *

+ * @param mixed $value

+ * &memcached.parameter.value; + *

+ * @param int $expiration [optional]

+ * &memcached.parameter.expiration; + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTSTORED if the key does not exist. + */ + public function replace ($key, $value, $expiration = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Replace the item under an existing key on a specific server + * @link http://php.net/manual/en/memcached.replacebykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param string $key

+ * &memcached.parameter.key; + *

+ * @param mixed $value

+ * &memcached.parameter.value; + *

+ * @param int $expiration [optional]

+ * &memcached.parameter.expiration; + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTSTORED if the key does not exist. + */ + public function replaceByKey ($server_key, $key, $value, $expiration = null) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Delete an item + * @link http://php.net/manual/en/memcached.delete.php + * @param string $key

+ * The key to be deleted. + *

+ * @param int $time [optional]

+ * The amount of time the server will wait to delete the item. + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTFOUND if the key does not exist. + */ + public function delete ($key, $time = 0) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Delete an item from a specific server + * @link http://php.net/manual/en/memcached.deletebykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @param string $key

+ * The key to be deleted. + *

+ * @param int $time [optional]

+ * The amount of time the server will wait to delete the item. + *

+ * @return bool true on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTFOUND if the key does not exist. + */ + public function deleteByKey ($server_key, $key, $time = 0) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Increment numeric item's value + * @link http://php.net/manual/en/memcached.increment.php + * @param string $key

+ * The key of the item to increment. + *

+ * @param int $offset [optional]

+ * The amount by which to increment the item's value. + *

+ * @return int new item's value on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTFOUND if the key does not exist. + */ + public function increment ($key, $offset = 1) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Decrement numeric item's value + * @link http://php.net/manual/en/memcached.decrement.php + * @param string $key

+ * The key of the item to decrement. + *

+ * @param int $offset [optional]

+ * The amount by which to decrement the item's value. + *

+ * @return int item's new value on success or false on failure. + * The Memcached::getResultCode will return + * Memcached::RES_NOTFOUND if the key does not exist. + */ + public function decrement ($key, $offset = 1) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Add a server to the server pool + * @link http://php.net/manual/en/memcached.addserver.php + * @param string $host

+ * The hostname of the memcache server. If the hostname is invalid, data-related + * operations will set + * Memcached::RES_HOST_LOOKUP_FAILURE result code. + *

+ * @param int $port

+ * The port on which memcache is running. Usually, this is + * 11211. + *

+ * @param int $weight [optional]

+ * The weight of the server relative to the total weight of all the + * servers in the pool. This controls the probability of the server being + * selected for operations. This is used only with consistent distribution + * option and usually corresponds to the amount of memory available to + * memcache on that server. + *

+ * @return bool true on success or false on failure. + */ + public function addServer ($host, $port, $weight = 0) {} + + /** + * (PECL memcached >= 0.1.1)
+ * Add multiple servers to the server pool + * @link http://php.net/manual/en/memcached.addservers.php + * @param array $servers + * @return bool true on success or false on failure. + */ + public function addServers (array $servers) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Get the list of the servers in the pool + * @link http://php.net/manual/en/memcached.getserverlist.php + * @return array The list of all servers in the server pool. + */ + public function getServerList () {} + + /** + * (PECL memcached >= 0.1.0)
+ * Map a key to a server + * @link http://php.net/manual/en/memcached.getserverbykey.php + * @param string $server_key

+ * &memcached.parameter.server_key; + *

+ * @return array true on success or false on failure. + * &memcached.result.getresultcode; + */ + public function getServerByKey ($server_key) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Get server pool statistics + * @link http://php.net/manual/en/memcached.getstats.php + * @return array Array of server statistics, one entry per server. + */ + public function getStats () {} + + /** + * (PECL memcached >= 0.1.5)
+ * Get server pool version info + * @link http://php.net/manual/en/memcached.getversion.php + * @return array Array of server versions, one entry per server. + */ + public function getVersion () {} + + /** + * (PECL memcached >= 0.1.0)
+ * Invalidate all items in the cache + * @link http://php.net/manual/en/memcached.flush.php + * @param int $delay [optional]

+ * Numer of seconds to wait before invalidating the items. + *

+ * @return bool true on success or false on failure. + * &memcached.result.getresultcode; + */ + public function flush ($delay = 0) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Retrieve a Memcached option value + * @link http://php.net/manual/en/memcached.getoption.php + * @param int $option

+ * One of the Memcached::OPT_* constants. + *

+ * @return mixed the value of the requested option, or FALSE on + * error. + */ + public function getOption ($option) {} + + /** + * (PECL memcached >= 0.1.0)
+ * Set a Memcached option + * @link http://php.net/manual/en/memcached.setoption.php + * @param int $option + * @param mixed $value + * @return bool true on success or false on failure. + */ + public function setOption ($option, $value) {} + +} + +/** + * Description of the class. + * @link http://php.net/manual/en/class.memcachedexception.php + * @jms-builtin + */ +class MemcachedException extends RuntimeException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or null otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} +// End of memcached v.1.0.2 +?> diff --git a/res/php-5.4-core-api/mhash.php b/res/php-5.4-core-api/mhash.php new file mode 100644 index 0000000..5648b83 --- /dev/null +++ b/res/php-5.4-core-api/mhash.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.4-core-api/mime_magic.php b/res/php-5.4-core-api/mime_magic.php new file mode 100644 index 0000000..975c78f --- /dev/null +++ b/res/php-5.4-core-api/mime_magic.php @@ -0,0 +1,19 @@ + + * Path to the tested file. + *

+ * @return string the content type in MIME format, like + * text/plain or application/octet-stream. + *

+ * @jms-builtin + */ +function mime_content_type ($filename) {} + +// End of mime_magic v.0.1 +?> diff --git a/res/php-5.4-core-api/ming.php b/res/php-5.4-core-api/ming.php new file mode 100644 index 0000000..c2bc40e --- /dev/null +++ b/res/php-5.4-core-api/ming.php @@ -0,0 +1,485 @@ + diff --git a/res/php-5.4-core-api/mssql.php b/res/php-5.4-core-api/mssql.php new file mode 100644 index 0000000..1c9fbc6 --- /dev/null +++ b/res/php-5.4-core-api/mssql.php @@ -0,0 +1,1000 @@ + + * Open MS SQL server connection + * @link http://php.net/manual/en/function.mssql-connect.php + * @param string $servername [optional]

+ * The MS SQL server. It can also include a port number, e.g. + * hostname:port (Linux), or + * hostname,port (Windows). + *

+ * @param string $username [optional]

+ * The username. + *

+ * @param string $password [optional]

+ * The password. + *

+ * @param bool $new_link [optional]

+ * If a second call is made to mssql_connect with the + * same arguments, no new link will be established, but instead, the link + * identifier of the already opened link will be returned. This parameter + * modifies this behavior and makes mssql_connect + * always open a new link, even if mssql_connect was + * called before with the same parameters. + *

+ * @return resource a MS SQL link identifier on success, or false on error. + * @jms-builtin + */ +function mssql_connect ($servername = null, $username = null, $password = null, $new_link = false) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Open persistent MS SQL connection + * @link http://php.net/manual/en/function.mssql-pconnect.php + * @param string $servername [optional]

+ * The MS SQL server. It can also include a port number. e.g. + * hostname:port. + *

+ * @param string $username [optional]

+ * The username. + *

+ * @param string $password [optional]

+ * The password. + *

+ * @param bool $new_link [optional]

+ * If a second call is made to mssql_pconnect with + * the same arguments, no new link will be established, but instead, the + * link identifier of the already opened link will be returned. This + * parameter modifies this behavior and makes + * mssql_pconnect always open a new link, even if + * mssql_pconnect was called before with the same + * parameters. + *

+ * @return resource a positive MS SQL persistent link identifier on success, or + * false on error. + * @jms-builtin + */ +function mssql_pconnect ($servername = null, $username = null, $password = null, $new_link = false) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Close MS SQL Server connection + * @link http://php.net/manual/en/function.mssql-close.php + * @param resource $link_identifier [optional]

+ * A MS SQL link identifier, returned by + * mssql_connect. + *

+ *

+ * This function will not close persistent links generated by + * mssql_pconnect. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function mssql_close ($link_identifier = null) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Select MS SQL database + * @link http://php.net/manual/en/function.mssql-select-db.php + * @param string $database_name

+ * The database name. + *

+ *

+ * To escape the name of a database that contains spaces, hyphens ("-"), + * or any other exceptional characters, the database name must be + * enclosed in brackets, as is shown in the example, below. This + * technique must also be applied when selecting a database name that is + * also a reserved word (such as primary). + *

+ * @param resource $link_identifier [optional]

+ * A MS SQL link identifier, returned by + * mssql_connect or + * mssql_pconnect. + *

+ *

+ * If no link identifier is specified, the last opened link is assumed. + * If no link is open, the function will try to establish a link as if + * mssql_connect was called, and use it. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function mssql_select_db ($database_name, $link_identifier = null) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Send MS SQL query + * @link http://php.net/manual/en/function.mssql-query.php + * @param string $query

+ * An SQL query. + *

+ * @param resource $link_identifier [optional]

+ * A MS SQL link identifier, returned by + * mssql_connect or + * mssql_pconnect. + *

+ *

+ * If the link identifier isn't specified, the last opened link is + * assumed. If no link is open, the function tries to establish a link + * as if mssql_connect was called, and use it. + *

+ * @param int $batch_size [optional]

+ * The number of records to batch in the buffer. + *

+ * @return mixed a MS SQL result resource on success, true if no rows were + * returned, or false on error. + * @jms-builtin + */ +function mssql_query ($query, $link_identifier = null, $batch_size = 0) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5, PECL odbtp >= 1.1.1)
+ * Returns the next batch of records + * @link http://php.net/manual/en/function.mssql-fetch-batch.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return int the batch number as an integer. + * @jms-builtin + */ +function mssql_fetch_batch ($result) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5, PECL odbtp >= 1.1.1)
+ * Returns the number of records affected by the query + * @link http://php.net/manual/en/function.mssql-rows-affected.php + * @param resource $link_identifier

+ * A MS SQL link identifier, returned by + * mssql_connect or + * mssql_pconnect. + *

+ * @return int the number of records affected by last operation. + * @jms-builtin + */ +function mssql_rows_affected ($link_identifier) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Free result memory + * @link http://php.net/manual/en/function.mssql-free-result.php + * @param resource $result

+ * The result resource that is being freed. This result comes from a + * call to mssql_query. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function mssql_free_result ($result) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Returns the last message from the server + * @link http://php.net/manual/en/function.mssql-get-last-message.php + * @return string last error message from server, or an empty string if + * no error messages are returned from MSSQL. + * @jms-builtin + */ +function mssql_get_last_message () {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Gets the number of rows in result + * @link http://php.net/manual/en/function.mssql-num-rows.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return int the number of rows, as an integer. + * @jms-builtin + */ +function mssql_num_rows ($result) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Gets the number of fields in result + * @link http://php.net/manual/en/function.mssql-num-fields.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return int the number of fields, as an integer. + * @jms-builtin + */ +function mssql_num_fields ($result) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Get field information + * @link http://php.net/manual/en/function.mssql-fetch-field.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param int $field_offset [optional]

+ * The numerical field offset. If the field offset is not specified, the + * next field that was not yet retrieved by this function is retrieved. The + * field_offset starts at 0. + *

+ * @return object an object containing field information. + *

+ *

+ * The properties of the object are: + * @jms-builtin + */ +function mssql_fetch_field ($result, $field_offset = -1) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Get row as enumerated array + * @link http://php.net/manual/en/function.mssql-fetch-row.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. + * @jms-builtin + */ +function mssql_fetch_row ($result) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Fetch a result row as an associative array, a numeric array, or both + * @link http://php.net/manual/en/function.mssql-fetch-array.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param int $result_type [optional]

+ * The type of array that is to be fetched. It's a constant and can take + * the following values: MSSQL_ASSOC, + * MSSQL_NUM, and + * MSSQL_BOTH. + *

+ * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. + * @jms-builtin + */ +function mssql_fetch_array ($result, $result_type = 'MSSQL_BOTH') {} + +/** + * (PHP 4 >= 4.2.0, PHP 5, PECL odbtp >= 1.1.1)
+ * Returns an associative array of the current row in the result + * @link http://php.net/manual/en/function.mssql-fetch-assoc.php + * @param resource $result_id

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return array an associative array that corresponds to the fetched row, or + * false if there are no more rows. + * @jms-builtin + */ +function mssql_fetch_assoc ($result_id) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Fetch row as object + * @link http://php.net/manual/en/function.mssql-fetch-object.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return object an object with properties that correspond to the fetched row, or + * false if there are no more rows. + * @jms-builtin + */ +function mssql_fetch_object ($result) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Get the length of a field + * @link http://php.net/manual/en/function.mssql-field-length.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param int $offset [optional]

+ * The field offset, starts at 0. If omitted, the current field is used. + *

+ * @return int The length of the specified field index on success&return.falseforfailure;. + * @jms-builtin + */ +function mssql_field_length ($result, $offset = -1) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Get the name of a field + * @link http://php.net/manual/en/function.mssql-field-name.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param int $offset [optional]

+ * The field offset, starts at 0. If omitted, the current field is used. + *

+ * @return string The name of the specified field index on success&return.falseforfailure;. + * @jms-builtin + */ +function mssql_field_name ($result, $offset = -1) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Gets the type of a field + * @link http://php.net/manual/en/function.mssql-field-type.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param int $offset [optional]

+ * The field offset, starts at 0. If omitted, the current field is used. + *

+ * @return string The type of the specified field index on success&return.falseforfailure;. + * @jms-builtin + */ +function mssql_field_type ($result, $offset = -1) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Moves internal row pointer + * @link http://php.net/manual/en/function.mssql-data-seek.php + * @param resource $result_identifier

+ * The result resource that is being evaluated. + *

+ * @param int $row_number

+ * The desired row number of the new result pointer. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function mssql_data_seek ($result_identifier, $row_number) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Seeks to the specified field offset + * @link http://php.net/manual/en/function.mssql-field-seek.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param int $field_offset

+ * The field offset, starts at 0. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function mssql_field_seek ($result, $field_offset) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Get result data + * @link http://php.net/manual/en/function.mssql-result.php + * @param resource $result

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @param int $row

+ * The row number. + *

+ * @param mixed $field

+ * Can be the field's offset, the field's name or the field's table dot + * field's name (tablename.fieldname). If the column name has been + * aliased ('select foo as bar from...'), it uses the alias instead of + * the column name. + *

+ *

+ * Specifying a numeric offset for the field + * argument is much quicker than specifying a + * fieldname or + * tablename.fieldname argument. + *

+ * @return string the contents of the specified cell. + * @jms-builtin + */ +function mssql_result ($result, $row, $field) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5, PECL odbtp >= 1.1.1)
+ * Move the internal result pointer to the next result + * @link http://php.net/manual/en/function.mssql-next-result.php + * @param resource $result_id

+ * The result resource that is being evaluated. This result comes from a + * call to mssql_query. + *

+ * @return bool true if an additional result set was available or false + * otherwise. + * @jms-builtin + */ +function mssql_next_result ($result_id) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Sets the minimum error severity + * @link http://php.net/manual/en/function.mssql-min-error-severity.php + * @param int $severity

+ * The new error severity. + *

+ * @return void + * @jms-builtin + */ +function mssql_min_error_severity ($severity) {} + +/** + * (PHP 4, PHP 5, PECL odbtp >= 1.1.1)
+ * Sets the minimum message severity + * @link http://php.net/manual/en/function.mssql-min-message-severity.php + * @param int $severity

+ * The new message severity. + *

+ * @return void + * @jms-builtin + */ +function mssql_min_message_severity ($severity) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5, PECL odbtp >= 1.1.1)
+ * Initializes a stored procedure or a remote stored procedure + * @link http://php.net/manual/en/function.mssql-init.php + * @param string $sp_name

+ * Stored procedure name, like ownew.sp_name or + * otherdb.owner.sp_name. + *

+ * @param resource $link_identifier [optional]

+ * A MS SQL link identifier, returned by + * mssql_connect. + *

+ * @return resource a resource identifier "statement", used in subsequent calls to + * mssql_bind and mssql_execute, + * or false on errors. + * @jms-builtin + */ +function mssql_init ($sp_name, $link_identifier = null) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5, PECL odbtp >= 1.1.1)
+ * Adds a parameter to a stored procedure or a remote stored procedure + * @link http://php.net/manual/en/function.mssql-bind.php + * @param resource $stmt

+ * Statement resource, obtained with mssql_init. + *

+ * @param string $param_name

+ * The parameter name, as a string. + *

+ *

+ * You have to include the @ character, like in the + * T-SQL syntax. See the explanation included in + * mssql_execute. + *

+ * @param mixed $var

+ * The PHP variable you'll bind the MSSQL parameter to. It is passed by + * reference, to retrieve OUTPUT and RETVAL values after + * the procedure execution. + *

+ * @param int $type

+ * One of: SQLTEXT, + * SQLVARCHAR, SQLCHAR, + * SQLINT1, SQLINT2, + * SQLINT4, SQLBIT, + * SQLFLT4, SQLFLT8, + * SQLFLTN. + *

+ * @param bool $is_output [optional]

+ * Whether the value is an OUTPUT parameter or not. If it's an OUTPUT + * parameter and you don't mention it, it will be treated as a normal + * input parameter and no error will be thrown. + *

+ * @param bool $is_null [optional]

+ * Whether the parameter is null or not. Passing the null value as + * var will not do the job. + *

+ * @param int $maxlen [optional]

+ * Used with char/varchar values. You have to indicate the length of the + * data so if the parameter is a varchar(50), the type must be + * SQLVARCHAR and this value 50. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function mssql_bind ($stmt, $param_name, &$var, $type, $is_output = false, $is_null = false, $maxlen = -1) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5, PECL odbtp >= 1.1.1)
+ * Executes a stored procedure on a MS SQL server database + * @link http://php.net/manual/en/function.mssql-execute.php + * @param resource $stmt

+ * Statement handle obtained with mssql_init. + *

+ * @param bool $skip_results [optional]

+ * Whenever to skip the results or not. + *

+ * @return mixed + * @jms-builtin + */ +function mssql_execute ($stmt, $skip_results = false) {} + +/** + * (PHP 4 >= 4.3.2, PHP 5, PECL odbtp >= 1.1.1)
+ * Free statement memory + * @link http://php.net/manual/en/function.mssql-free-statement.php + * @param resource $stmt

+ * Statement resource, obtained with mssql_init. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function mssql_free_statement ($stmt) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5, PECL odbtp >= 1.1.1)
+ * Converts a 16 byte binary GUID to a string + * @link http://php.net/manual/en/function.mssql-guid-string.php + * @param string $binary

+ * A 16 byte binary GUID. + *

+ * @param bool $short_format [optional]

+ * Whenever to use short format. + *

+ * @return string the converted string on success. + * @jms-builtin + */ +function mssql_guid_string ($binary, $short_format = false) {} + +/** + * (PHP 4, PHP 5)
+ * Opens a Sybase server connection + * @link http://php.net/manual/en/function.sybase-connect.php + * @param string $servername [optional]

+ * The servername argument has to be a valid servername that is defined + * in the 'interfaces' file. + *

+ * @param string $username [optional]

+ * Sybase user name + *

+ * @param string $password [optional]

+ * Password associated with username. + *

+ * @param string $charset [optional]

+ * Specifies the charset for the connection + *

+ * @param string $appname [optional]

+ * Specifies an appname for the Sybase connection. + * This allow you to make separate connections in the same script to the + * same database. This may come handy when you have started a transaction + * in your current connection, and you need to be able to do a separate + * query which cannot be performed inside this transaction. + *

+ * @param bool $new [optional]

+ * Whether to open a new connection or use the existing one. + *

+ * @return resource a positive Sybase link identifier on success, or false on + * failure. + * @jms-builtin + */ +function sybase_connect ($servername = null, $username = null, $password = null, $charset = null, $appname = null, $new = false) {} + +/** + * (PHP 4, PHP 5)
+ * Open persistent Sybase connection + * @link http://php.net/manual/en/function.sybase-pconnect.php + * @param string $servername [optional]

+ * The servername argument has to be a valid servername that is defined + * in the 'interfaces' file. + *

+ * @param string $username [optional]

+ * Sybase user name + *

+ * @param string $password [optional]

+ * Password associated with username. + *

+ * @param string $charset [optional]

+ * Specifies the charset for the connection + *

+ * @param string $appname [optional]

+ * Specifies an appname for the Sybase connection. + * This allow you to make separate connections in the same script to the + * same database. This may come handy when you have started a transaction + * in your current connection, and you need to be able to do a separate + * query which cannot be performed inside this transaction. + *

+ * @return resource a positive Sybase persistent link identifier on success, or + * false on error. + * @jms-builtin + */ +function sybase_pconnect ($servername = null, $username = null, $password = null, $charset = null, $appname = null) {} + +/** + * (PHP 4, PHP 5)
+ * Closes a Sybase connection + * @link http://php.net/manual/en/function.sybase-close.php + * @param resource $link_identifier [optional]

+ * If the link identifier isn't specified, the last opened link is + * assumed. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function sybase_close ($link_identifier = null) {} + +/** + * (PHP 4, PHP 5)
+ * Selects a Sybase database + * @link http://php.net/manual/en/function.sybase-select-db.php + * @param string $database_name + * @param resource $link_identifier [optional]

+ * If no link identifier is specified, the last opened link is assumed. + * If no link is open, the function will try to establish a link as if + * sybase_connect was called, and use it. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function sybase_select_db ($database_name, $link_identifier = null) {} + +/** + * (PHP 4, PHP 5)
+ * Sends a Sybase query + * @link http://php.net/manual/en/function.sybase-query.php + * @param string $query + * @param resource $link_identifier [optional]

+ * If the link identifier isn't specified, the last opened link is + * assumed. If no link is open, the function tries to establish a link as + * if sybase_connect was called, and use it. + *

+ * @return mixed a positive Sybase result identifier on success, false on error, + * or true if the query was successful but didn't return any columns. + * @jms-builtin + */ +function sybase_query ($query, $link_identifier = null) {} + +/** + * @param $result + * @jms-builtin + */ +function sybase_fetch_batch ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Gets number of affected rows in last query + * @link http://php.net/manual/en/function.sybase-affected-rows.php + * @param resource $link_identifier [optional]

+ * If the link identifier isn't specified, the last opened link is assumed. + *

+ * @return int the number of affected rows, as an integer. + * @jms-builtin + */ +function sybase_affected_rows ($link_identifier = null) {} + +/** + * (PHP 4, PHP 5)
+ * Frees result memory + * @link http://php.net/manual/en/function.sybase-free-result.php + * @param resource $result + * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function sybase_free_result ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the last message from the server + * @link http://php.net/manual/en/function.sybase-get-last-message.php + * @return string the message as a string. + * @jms-builtin + */ +function sybase_get_last_message () {} + +/** + * (PHP 4, PHP 5)
+ * Get number of rows in a result set + * @link http://php.net/manual/en/function.sybase-num-rows.php + * @param resource $result + * @return int the number of rows as an integer. + * @jms-builtin + */ +function sybase_num_rows ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the number of fields in a result set + * @link http://php.net/manual/en/function.sybase-num-fields.php + * @param resource $result + * @return int the number of fields as an integer. + * @jms-builtin + */ +function sybase_num_fields ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Get field information from a result + * @link http://php.net/manual/en/function.sybase-fetch-field.php + * @param resource $result + * @param int $field_offset [optional]

+ * If the field offset isn't specified, the next field that wasn't yet + * retrieved by sybase_fetch_field is retrieved. + *

+ * @return object an object containing field information. + *

+ *

+ * The properties of the object are: + * @jms-builtin + */ +function sybase_fetch_field ($result, $field_offset = -1) {} + +/** + * (PHP 4, PHP 5)
+ * Get a result row as an enumerated array + * @link http://php.net/manual/en/function.sybase-fetch-row.php + * @param resource $result + * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. Each result column is stored in an array offset, + * starting at offset 0. + * @jms-builtin + */ +function sybase_fetch_row ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch row as array + * @link http://php.net/manual/en/function.sybase-fetch-array.php + * @param resource $result + * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. + *

+ *

+ * When selecting fields with identical names (for instance, in a join), the + * associative indices will have a sequential number prepended. See the + * example for details. + * @jms-builtin + */ +function sybase_fetch_array ($result) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Fetch a result row as an associative array + * @link http://php.net/manual/en/function.sybase-fetch-assoc.php + * @param resource $result + * @return array an array that corresponds to the fetched row, or false if there + * are no more rows. + * @jms-builtin + */ +function sybase_fetch_assoc ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch a row as an object + * @link http://php.net/manual/en/function.sybase-fetch-object.php + * @param resource $result + * @param mixed $object [optional]

+ * Use the second object to specify the type of object + * you want to return. If this parameter is omitted, the object will be of + * type stdClass. + *

+ * @return object an object with properties that correspond to the fetched row, or + * false if there are no more rows. + * @jms-builtin + */ +function sybase_fetch_object ($result, $object = null) {} + +/** + * @param $result + * @param $offset [optional] + * @jms-builtin + */ +function sybase_field_length ($result, $offset) {} + +/** + * @param $result + * @param $offset [optional] + * @jms-builtin + */ +function sybase_field_name ($result, $offset) {} + +/** + * @param $result + * @param $offset [optional] + * @jms-builtin + */ +function sybase_field_type ($result, $offset) {} + +/** + * (PHP 4, PHP 5)
+ * Moves internal row pointer + * @link http://php.net/manual/en/function.sybase-data-seek.php + * @param resource $result_identifier + * @param int $row_number + * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function sybase_data_seek ($result_identifier, $row_number) {} + +/** + * (PHP 4, PHP 5)
+ * Sets field offset + * @link http://php.net/manual/en/function.sybase-field-seek.php + * @param resource $result + * @param int $field_offset + * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function sybase_field_seek ($result, $field_offset) {} + +/** + * (PHP 4, PHP 5)
+ * Get result data + * @link http://php.net/manual/en/function.sybase-result.php + * @param resource $result + * @param int $row + * @param mixed $field

+ * The field argument can be the field's offset, or the field's name, or + * the field's table dot field's name (tablename.fieldname). If the + * column name has been aliased ('select foo as bar from...'), use the + * alias instead of the column name. + *

+ * @return string sybase_result returns the contents of one cell from a + * Sybase result set. + * @jms-builtin + */ +function sybase_result ($result, $row, $field) {} + +/** + * @param $result_id + * @jms-builtin + */ +function sybase_next_result ($result_id) {} + +/** + * (PHP 4, PHP 5)
+ * Sets minimum error severity + * @link http://php.net/manual/en/function.sybase-min-error-severity.php + * @param int $severity + * @return void + * @jms-builtin + */ +function sybase_min_error_severity ($severity) {} + +/** + * (PHP 4, PHP 5)
+ * Sets minimum message severity + * @link http://php.net/manual/en/function.sybase-min-message-severity.php + * @param int $severity + * @return void + * @jms-builtin + */ +function sybase_min_message_severity ($severity) {} + +/** + * @param $sp_name + * @param $link_identifier [optional] + * @jms-builtin + */ +function sybase_init ($sp_name, $link_identifier) {} + +/** + * @param $stmt + * @param $param_name + * @param $var + * @param $type + * @param $is_output [optional] + * @param $is_null [optional] + * @param $maxlen [optional] + * @jms-builtin + */ +function sybase_bind ($stmt, $param_name, &$var, $type, $is_output, $is_null, $maxlen) {} + +/** + * @param $stmt + * @param $skip_results [optional] + * @jms-builtin + */ +function sybase_execute ($stmt, $skip_results) {} + +/** + * @param $stmt + * @jms-builtin + */ +function sybase_free_statement ($stmt) {} + +/** + * @param $binary + * @param $short_format [optional] + * @jms-builtin + */ +function sybase_guid_string ($binary, $short_format) {} + + +/** + * Return an associative array. Used on + * mssql_fetch_array's + * result_type parameter. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('MSSQL_ASSOC', 1); + +/** + * Return an array with numeric keys. Used on + * mssql_fetch_array's + * result_type parameter. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('MSSQL_NUM', 2); + +/** + * Return an array with both numeric keys and + * keys with their field name. This is the + * default value for mssql_fetch_array's + * result_type parameter. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('MSSQL_BOTH', 3); + +/** + * Indicates the 'TEXT' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('SQLTEXT', 35); + +/** + * Indicates the 'VARCHAR' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('SQLVARCHAR', 39); + +/** + * Indicates the 'CHAR' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('SQLCHAR', 47); + +/** + * Represents one byte, with a range of -128 to 127. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('SQLINT1', 48); + +/** + * Represents two bytes, with a range of -32768 + * to 32767. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('SQLINT2', 52); + +/** + * Represents four bytes, with a range of -2147483648 + * to 2147483647. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('SQLINT4', 56); + +/** + * Indicates the 'BIT' type in MSSQL, used by + * mssql_bind's type + * parameter. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('SQLBIT', 50); + +/** + * Represents an four byte float. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('SQLFLT4', 59); + +/** + * Represents an eight byte float. + * @link http://php.net/manual/en/mssql.constants.php + */ +define ('SQLFLT8', 62); +define ('SQLFLTN', 109); + +// End of mssql v. +?> diff --git a/res/php-5.4-core-api/mysql.php b/res/php-5.4-core-api/mysql.php new file mode 100644 index 0000000..758a409 --- /dev/null +++ b/res/php-5.4-core-api/mysql.php @@ -0,0 +1,939 @@ + + * Open a connection to a MySQL Server + * @link http://php.net/manual/en/function.mysql-connect.php + * @param string $server [optional]

+ * The MySQL server. It can also include a port number. e.g. + * "hostname:port" or a path to a local socket e.g. ":/path/to/socket" for + * the localhost. + *

+ *

+ * If the PHP directive + * mysql.default_host is undefined (default), then the default + * value is 'localhost:3306'. In SQL safe mode, this parameter is ignored + * and value 'localhost:3306' is always used. + *

+ * @param string $username [optional]

+ * The username. Default value is defined by mysql.default_user. In + * SQL safe mode, this parameter is ignored and the name of the user that + * owns the server process is used. + *

+ * @param string $password [optional]

+ * The password. Default value is defined by mysql.default_password. In + * SQL safe mode, this parameter is ignored and empty password is used. + *

+ * @param bool $new_link [optional]

+ * If a second call is made to mysql_connect + * with the same arguments, no new link will be established, but + * instead, the link identifier of the already opened link will be + * returned. The new_link parameter modifies this + * behavior and makes mysql_connect always open + * a new link, even if mysql_connect was called + * before with the same parameters. + * In SQL safe mode, this parameter is ignored. + *

+ * @param int $client_flags [optional]

+ * The client_flags parameter can be a combination + * of the following constants: + * 128 (enable LOAD DATA LOCAL handling), + * MYSQL_CLIENT_SSL, + * MYSQL_CLIENT_COMPRESS, + * MYSQL_CLIENT_IGNORE_SPACE or + * MYSQL_CLIENT_INTERACTIVE. + * Read the section about for further information. + * In SQL safe mode, this parameter is ignored. + *

+ * @return resource a MySQL link identifier on success or FALSE on failure. + * @jms-builtin + */ +function mysql_connect ($server = 'ini_get("mysql.default_host")', $username = 'ini_get("mysql.default_user")', $password = 'ini_get("mysql.default_password")', $new_link = false, $client_flags = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Open a persistent connection to a MySQL server + * @link http://php.net/manual/en/function.mysql-pconnect.php + * @param string $server [optional]

+ * The MySQL server. It can also include a port number. e.g. + * "hostname:port" or a path to a local socket e.g. ":/path/to/socket" for + * the localhost. + *

+ *

+ * If the PHP directive + * mysql.default_host is undefined (default), then the default + * value is 'localhost:3306' + *

+ * @param string $username [optional]

+ * The username. Default value is the name of the user that owns the + * server process. + *

+ * @param string $password [optional]

+ * The password. Default value is an empty password. + *

+ * @param int $client_flags [optional]

+ * The client_flags parameter can be a combination + * of the following constants: + * 128 (enable LOAD DATA LOCAL handling), + * MYSQL_CLIENT_SSL, + * MYSQL_CLIENT_COMPRESS, + * MYSQL_CLIENT_IGNORE_SPACE or + * MYSQL_CLIENT_INTERACTIVE. + *

+ * @return resource a MySQL persistent link identifier on success, or FALSE on + * failure. + * @jms-builtin + */ +function mysql_pconnect ($server = 'ini_get("mysql.default_host")', $username = 'ini_get("mysql.default_user")', $password = 'ini_get("mysql.default_password")', $client_flags = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Close MySQL connection + * @link http://php.net/manual/en/function.mysql-close.php + * @param resource $link_identifier [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mysql_close ($link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * Select a MySQL database + * @link http://php.net/manual/en/function.mysql-select-db.php + * @param string $database_name

+ * The name of the database that is to be selected. + *

+ * @param resource $link_identifier [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mysql_select_db ($database_name, $link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * Send a MySQL query + * @link http://php.net/manual/en/function.mysql-query.php + * @param string $query

+ * An SQL query + *

+ *

+ * The query string should not end with a semicolon. + * Data inside the query should be properly escaped. + *

+ * @param resource $link_identifier [optional] + * @return resource For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, + * mysql_query + * returns a resource on success, or FALSE on + * error. + *

+ *

+ * For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, + * mysql_query returns TRUE on success + * or FALSE on error. + *

+ *

+ * The returned result resource should be passed to + * mysql_fetch_array, and other + * functions for dealing with result tables, to access the returned data. + *

+ *

+ * Use mysql_num_rows to find out how many rows + * were returned for a SELECT statement or + * mysql_affected_rows to find out how many + * rows were affected by a DELETE, INSERT, REPLACE, or UPDATE + * statement. + *

+ *

+ * mysql_query will also fail and return FALSE + * if the user does not have permission to access the table(s) referenced by + * the query. + * @jms-builtin + */ +function mysql_query ($query, $link_identifier = NULL) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Send an SQL query to MySQL without fetching and buffering the result rows. + * @link http://php.net/manual/en/function.mysql-unbuffered-query.php + * @param string $query

+ * The SQL query to execute. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param resource $link_identifier [optional] + * @return resource For SELECT, SHOW, DESCRIBE or EXPLAIN statements, + * mysql_unbuffered_query + * returns a resource on success, or FALSE on + * error. + *

+ *

+ * For other type of SQL statements, UPDATE, DELETE, DROP, etc, + * mysql_unbuffered_query returns TRUE on success + * or FALSE on error. + * @jms-builtin + */ +function mysql_unbuffered_query ($query, $link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * Selects a database and executes a query on it + * @link http://php.net/manual/en/function.mysql-db-query.php + * @param string $database

+ * The name of the database that will be selected. + *

+ * @param string $query

+ * The MySQL query. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param resource $link_identifier [optional] + * @return resource a positive MySQL result resource to the query result, + * or FALSE on error. The function also returns TRUE/FALSE for + * INSERT/UPDATE/DELETE + * queries to indicate success/failure. + * @jms-builtin + */ +function mysql_db_query ($database, $query, $link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * List databases available on a MySQL server + * @link http://php.net/manual/en/function.mysql-list-dbs.php + * @param resource $link_identifier [optional] + * @return resource a result pointer resource on success, or FALSE on + * failure. Use the mysql_tablename function to traverse + * this result pointer, or any function for result tables, such as + * mysql_fetch_array. + * @jms-builtin + */ +function mysql_list_dbs ($link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * List tables in a MySQL database + * @link http://php.net/manual/en/function.mysql-list-tables.php + * @param string $database

+ * The name of the database + *

+ * @param resource $link_identifier [optional] + * @return resource A result pointer resource on success or FALSE on failure. + *

+ *

+ * Use the mysql_tablename function to + * traverse this result pointer, or any function for result tables, + * such as mysql_fetch_array. + * @jms-builtin + */ +function mysql_list_tables ($database, $link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * List MySQL table fields + * @link http://php.net/manual/en/function.mysql-list-fields.php + * @param string $database_name

+ * The name of the database that's being queried. + *

+ * @param string $table_name

+ * The name of the table that's being queried. + *

+ * @param resource $link_identifier [optional] + * @return resource A result pointer resource on success, or FALSE on + * failure. + *

+ *

+ * The returned result can be used with mysql_field_flags, + * mysql_field_len, + * mysql_field_name and + * mysql_field_type. + * @jms-builtin + */ +function mysql_list_fields ($database_name, $table_name, $link_identifier = NULL) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * List MySQL processes + * @link http://php.net/manual/en/function.mysql-list-processes.php + * @param resource $link_identifier [optional] + * @return resource A result pointer resource on success or FALSE on failure. + * @jms-builtin + */ +function mysql_list_processes ($link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the text of the error message from previous MySQL operation + * @link http://php.net/manual/en/function.mysql-error.php + * @param resource $link_identifier [optional] + * @return string the error text from the last MySQL function, or + * '' (empty string) if no error occurred. + * @jms-builtin + */ +function mysql_error ($link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the numerical value of the error message from previous MySQL operation + * @link http://php.net/manual/en/function.mysql-errno.php + * @param resource $link_identifier [optional] + * @return int the error number from the last MySQL function, or + * 0 (zero) if no error occurred. + * @jms-builtin + */ +function mysql_errno ($link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * Get number of affected rows in previous MySQL operation + * @link http://php.net/manual/en/function.mysql-affected-rows.php + * @param resource $link_identifier [optional] + * @return int the number of affected rows on success, and -1 if the last query + * failed. + *

+ *

+ * If the last query was a DELETE query with no WHERE clause, all + * of the records will have been deleted from the table but this + * function will return zero with MySQL versions prior to 4.1.2. + *

+ *

+ * When using UPDATE, MySQL will not update columns where the new value is the + * same as the old value. This creates the possibility that + * mysql_affected_rows may not actually equal the number + * of rows matched, only the number of rows that were literally affected by + * the query. + *

+ *

+ * The REPLACE statement first deletes the record with the same primary key + * and then inserts the new record. This function returns the number of + * deleted records plus the number of inserted records. + * @jms-builtin + */ +function mysql_affected_rows ($link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * Get the ID generated in the last query + * @link http://php.net/manual/en/function.mysql-insert-id.php + * @param resource $link_identifier [optional] + * @return int The ID generated for an AUTO_INCREMENT column by the previous + * query on success, 0 if the previous + * query does not generate an AUTO_INCREMENT value, or FALSE if + * no MySQL connection was established. + * @jms-builtin + */ +function mysql_insert_id ($link_identifier = NULL) {} + +/** + * (PHP 4, PHP 5)
+ * Get result data + * @link http://php.net/manual/en/function.mysql-result.php + * @param resource $result + * @param int $row

+ * The row number from the result that's being retrieved. Row numbers + * start at 0. + *

+ * @param mixed $field [optional]

+ * The name or offset of the field being retrieved. + *

+ *

+ * It can be the field's offset, the field's name, or the field's table + * dot field name (tablename.fieldname). If the column name has been + * aliased ('select foo as bar from...'), use the alias instead of the + * column name. If undefined, the first field is retrieved. + *

+ * @return string The contents of one cell from a MySQL result set on success, or + * FALSE on failure. + * @jms-builtin + */ +function mysql_result ($result, $row, $field = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Get number of rows in result + * @link http://php.net/manual/en/function.mysql-num-rows.php + * @param resource $result + * @return int The number of rows in a result set on success or FALSE on failure. + * @jms-builtin + */ +function mysql_num_rows ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Get number of fields in result + * @link http://php.net/manual/en/function.mysql-num-fields.php + * @param resource $result + * @return int the number of fields in the result set resource on + * success or FALSE on failure. + * @jms-builtin + */ +function mysql_num_fields ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Get a result row as an enumerated array + * @link http://php.net/manual/en/function.mysql-fetch-row.php + * @param resource $result + * @return array an numerical array of strings that corresponds to the fetched row, or + * FALSE if there are no more rows. + *

+ *

+ * mysql_fetch_row fetches one row of data from + * the result associated with the specified result identifier. The + * row is returned as an array. Each result column is stored in an + * array offset, starting at offset 0. + * @jms-builtin + */ +function mysql_fetch_row ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch a result row as an associative array, a numeric array, or both + * @link http://php.net/manual/en/function.mysql-fetch-array.php + * @param resource $result + * @param int $result_type [optional]

+ * The type of array that is to be fetched. It's a constant and can + * take the following values: MYSQL_ASSOC, + * MYSQL_NUM, and + * MYSQL_BOTH. + *

+ * @return array an array of strings that corresponds to the fetched row, or FALSE + * if there are no more rows. The type of returned array depends on + * how result_type is defined. By using + * MYSQL_BOTH (default), you'll get an array with both + * associative and number indices. Using MYSQL_ASSOC, you + * only get associative indices (as mysql_fetch_assoc + * works), using MYSQL_NUM, you only get number indices + * (as mysql_fetch_row works). + *

+ *

+ * If two or more columns of the result have the same field names, + * the last column will take precedence. To access the other column(s) + * of the same name, you must use the numeric index of the column or + * make an alias for the column. For aliased columns, you cannot + * access the contents with the original column name. + * @jms-builtin + */ +function mysql_fetch_array ($result, $result_type = 'MYSQL_BOTH') {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Fetch a result row as an associative array + * @link http://php.net/manual/en/function.mysql-fetch-assoc.php + * @param resource $result + * @return array an associative array of strings that corresponds to the fetched row, or + * FALSE if there are no more rows. + *

+ *

+ * If two or more columns of the result have the same field names, + * the last column will take precedence. To access the other + * column(s) of the same name, you either need to access the + * result with numeric indices by using + * mysql_fetch_row or add alias names. + * See the example at the mysql_fetch_array + * description about aliases. + * @jms-builtin + */ +function mysql_fetch_assoc ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch a result row as an object + * @link http://php.net/manual/en/function.mysql-fetch-object.php + * @param resource $result + * @param string $class_name [optional]

+ * The name of the class to instantiate, set the properties of and return. + * If not specified, a stdClass object is returned. + *

+ * @param array $params [optional]

+ * An optional array of parameters to pass to the constructor + * for class_name objects. + *

+ * @return object an object with string properties that correspond to the + * fetched row, or FALSE if there are no more rows. + * @jms-builtin + */ +function mysql_fetch_object ($result, $class_name = null, array $params = null) {} + +/** + * (PHP 4, PHP 5)
+ * Move internal result pointer + * @link http://php.net/manual/en/function.mysql-data-seek.php + * @param resource $result + * @param int $row_number

+ * The desired row number of the new result pointer. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mysql_data_seek ($result, $row_number) {} + +/** + * (PHP 4, PHP 5)
+ * Get the length of each output in a result + * @link http://php.net/manual/en/function.mysql-fetch-lengths.php + * @param resource $result + * @return array An array of lengths on success or FALSE on failure. + * @jms-builtin + */ +function mysql_fetch_lengths ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Get column information from a result and return as an object + * @link http://php.net/manual/en/function.mysql-fetch-field.php + * @param resource $result + * @param int $field_offset [optional]

+ * The numerical field offset. If the field offset is not specified, the + * next field that was not yet retrieved by this function is retrieved. + * The field_offset starts at 0. + *

+ * @return object an object containing field information. The properties + * of the object are: + *

+ *

+ * name - column name + * table - name of the table the column belongs to + * max_length - maximum length of the column + * not_null - 1 if the column cannot be NULL + * primary_key - 1 if the column is a primary key + * unique_key - 1 if the column is a unique key + * multiple_key - 1 if the column is a non-unique key + * numeric - 1 if the column is numeric + * blob - 1 if the column is a BLOB + * type - the type of the column + * unsigned - 1 if the column is unsigned + * zerofill - 1 if the column is zero-filled + * @jms-builtin + */ +function mysql_fetch_field ($result, $field_offset = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Set result pointer to a specified field offset + * @link http://php.net/manual/en/function.mysql-field-seek.php + * @param resource $result + * @param int $field_offset + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mysql_field_seek ($result, $field_offset) {} + +/** + * (PHP 4, PHP 5)
+ * Free result memory + * @link http://php.net/manual/en/function.mysql-free-result.php + * @param resource $result + * @return bool TRUE on success or FALSE on failure. + *

+ *

+ * If a non-resource is used for the result, an + * error of level E_WARNING will be emitted. It's worth noting that + * mysql_query only returns a resource + * for SELECT, SHOW, EXPLAIN, and DESCRIBE queries. + * @jms-builtin + */ +function mysql_free_result ($result) {} + +/** + * (PHP 4, PHP 5)
+ * Get the name of the specified field in a result + * @link http://php.net/manual/en/function.mysql-field-name.php + * @param resource $result + * @param int $field_offset + * @return string The name of the specified field index on success or FALSE on failure. + * @jms-builtin + */ +function mysql_field_name ($result, $field_offset) {} + +/** + * (PHP 4, PHP 5)
+ * Get name of the table the specified field is in + * @link http://php.net/manual/en/function.mysql-field-table.php + * @param resource $result + * @param int $field_offset + * @return string The name of the table on success. + * @jms-builtin + */ +function mysql_field_table ($result, $field_offset) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the length of the specified field + * @link http://php.net/manual/en/function.mysql-field-len.php + * @param resource $result + * @param int $field_offset + * @return int The length of the specified field index on success or FALSE on failure. + * @jms-builtin + */ +function mysql_field_len ($result, $field_offset) {} + +/** + * (PHP 4, PHP 5)
+ * Get the type of the specified field in a result + * @link http://php.net/manual/en/function.mysql-field-type.php + * @param resource $result + * @param int $field_offset + * @return string The returned field type + * will be one of "int", "real", + * "string", "blob", and others as + * detailed in the MySQL + * documentation. + * @jms-builtin + */ +function mysql_field_type ($result, $field_offset) {} + +/** + * (PHP 4, PHP 5)
+ * Get the flags associated with the specified field in a result + * @link http://php.net/manual/en/function.mysql-field-flags.php + * @param resource $result + * @param int $field_offset + * @return string a string of flags associated with the result or FALSE on failure. + *

+ *

+ * The following flags are reported, if your version of MySQL + * is current enough to support them: "not_null", + * "primary_key", "unique_key", + * "multiple_key", "blob", + * "unsigned", "zerofill", + * "binary", "enum", + * "auto_increment" and "timestamp". + * @jms-builtin + */ +function mysql_field_flags ($result, $field_offset) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Escapes a string for use in a mysql_query + * @link http://php.net/manual/en/function.mysql-escape-string.php + * @param string $unescaped_string

+ * The string that is to be escaped. + *

+ * @return string the escaped string. + * @jms-builtin + */ +function mysql_escape_string ($unescaped_string) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Escapes special characters in a string for use in an SQL statement + * @link http://php.net/manual/en/function.mysql-real-escape-string.php + * @param string $unescaped_string

+ * The string that is to be escaped. + *

+ * @param resource $link_identifier [optional] + * @return string the escaped string, or FALSE on error. + * @jms-builtin + */ +function mysql_real_escape_string ($unescaped_string, $link_identifier = NULL) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Get current system status + * @link http://php.net/manual/en/function.mysql-stat.php + * @param resource $link_identifier [optional] + * @return string a string with the status for uptime, threads, queries, open tables, + * flush tables and queries per second. For a complete list of other status + * variables, you have to use the SHOW STATUS SQL command. + * If link_identifier is invalid, NULL is returned. + * @jms-builtin + */ +function mysql_stat ($link_identifier = NULL) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Return the current thread ID + * @link http://php.net/manual/en/function.mysql-thread-id.php + * @param resource $link_identifier [optional] + * @return int The thread ID on success or FALSE on failure. + * @jms-builtin + */ +function mysql_thread_id ($link_identifier = NULL) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Returns the name of the character set + * @link http://php.net/manual/en/function.mysql-client-encoding.php + * @param resource $link_identifier [optional] + * @return string the default character set name for the current connection. + * @jms-builtin + */ +function mysql_client_encoding ($link_identifier = NULL) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Ping a server connection or reconnect if there is no connection + * @link http://php.net/manual/en/function.mysql-ping.php + * @param resource $link_identifier [optional] + * @return bool TRUE if the connection to the server MySQL server is working, + * otherwise FALSE. + * @jms-builtin + */ +function mysql_ping ($link_identifier = NULL) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Get MySQL client info + * @link http://php.net/manual/en/function.mysql-get-client-info.php + * @return string The MySQL client version. + * @jms-builtin + */ +function mysql_get_client_info () {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Get MySQL host info + * @link http://php.net/manual/en/function.mysql-get-host-info.php + * @param resource $link_identifier [optional] + * @return string a string describing the type of MySQL connection in use for the + * connection or FALSE on failure. + * @jms-builtin + */ +function mysql_get_host_info ($link_identifier = NULL) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Get MySQL protocol info + * @link http://php.net/manual/en/function.mysql-get-proto-info.php + * @param resource $link_identifier [optional] + * @return int the MySQL protocol on success or FALSE on failure. + * @jms-builtin + */ +function mysql_get_proto_info ($link_identifier = NULL) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Get MySQL server info + * @link http://php.net/manual/en/function.mysql-get-server-info.php + * @param resource $link_identifier [optional] + * @return string the MySQL server version on success or FALSE on failure. + * @jms-builtin + */ +function mysql_get_server_info ($link_identifier = NULL) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Get information about the most recent query + * @link http://php.net/manual/en/function.mysql-info.php + * @param resource $link_identifier [optional] + * @return string information about the statement on success, or FALSE on + * failure. See the example below for which statements provide information, + * and what the returned value may look like. Statements that are not listed + * will return FALSE. + * @jms-builtin + */ +function mysql_info ($link_identifier = NULL) {} + +/** + * (PHP 5 >= 5.2.3)
+ * Sets the client character set + * @link http://php.net/manual/en/function.mysql-set-charset.php + * @param string $charset

+ * A valid character set name. + *

+ * @param resource $link_identifier [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mysql_set_charset ($charset, $link_identifier = NULL) {} + +/** + * @param $database_name + * @param $query + * @param $link_identifier [optional] + * @jms-builtin + */ +function mysql ($database_name, $query, $link_identifier) {} + +/** + * @param $result + * @param $field_index + * @jms-builtin + */ +function mysql_fieldname ($result, $field_index) {} + +/** + * @param $result + * @param $field_offset + * @jms-builtin + */ +function mysql_fieldtable ($result, $field_offset) {} + +/** + * @param $result + * @param $field_offset + * @jms-builtin + */ +function mysql_fieldlen ($result, $field_offset) {} + +/** + * @param $result + * @param $field_offset + * @jms-builtin + */ +function mysql_fieldtype ($result, $field_offset) {} + +/** + * @param $result + * @param $field_offset + * @jms-builtin + */ +function mysql_fieldflags ($result, $field_offset) {} + +/** + * @param $database_name + * @param $link_identifier [optional] + * @jms-builtin + */ +function mysql_selectdb ($database_name, $link_identifier) {} + +/** + * @param $result + * @jms-builtin + */ +function mysql_freeresult ($result) {} + +/** + * @param $result + * @jms-builtin + */ +function mysql_numfields ($result) {} + +/** + * @param $result + * @jms-builtin + */ +function mysql_numrows ($result) {} + +/** + * @param $link_identifier [optional] + * @jms-builtin + */ +function mysql_listdbs ($link_identifier) {} + +/** + * @param $database_name + * @param $link_identifier [optional] + * @jms-builtin + */ +function mysql_listtables ($database_name, $link_identifier) {} + +/** + * @param $database_name + * @param $table_name + * @param $link_identifier [optional] + * @jms-builtin + */ +function mysql_listfields ($database_name, $table_name, $link_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Retrieves database name from the call to mysql_list_dbs + * @link http://php.net/manual/en/function.mysql-db-name.php + * @param resource $result

+ * The result pointer from a call to mysql_list_dbs. + *

+ * @param int $row

+ * The index into the result set. + *

+ * @param mixed $field [optional]

+ * The field name. + *

+ * @return string the database name on success, and FALSE on failure. If FALSE + * is returned, use mysql_error to determine the nature + * of the error. + * @jms-builtin + */ +function mysql_db_name ($result, $row, $field = NULL) {} + +/** + * @param $result + * @param $row + * @param $field [optional] + * @jms-builtin + */ +function mysql_dbname ($result, $row, $field) {} + +/** + * (PHP 4, PHP 5)
+ * Get table name of field + * @link http://php.net/manual/en/function.mysql-tablename.php + * @param resource $result

+ * A result pointer resource that's returned from + * mysql_list_tables. + *

+ * @param int $i

+ * The integer index (row/table number) + *

+ * @return string The name of the table on success or FALSE on failure. + *

+ *

+ * Use the mysql_tablename function to + * traverse this result pointer, or any function for result tables, + * such as mysql_fetch_array. + * @jms-builtin + */ +function mysql_tablename ($result, $i) {} + +/** + * @param $result + * @param $row + * @param $field [optional] + * @jms-builtin + */ +function mysql_table_name ($result, $row, $field) {} + + +/** + * Columns are returned into the array having the fieldname as the array + * index. + * @link http://php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_ASSOC', 1); + +/** + * Columns are returned into the array having a numerical index to the + * fields. This index starts with 0, the first field in the result. + * @link http://php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_NUM', 2); + +/** + * Columns are returned into the array having both a numerical index + * and the fieldname as the array index. + * @link http://php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_BOTH', 3); + +/** + * Use compression protocol + * @link http://php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_COMPRESS', 32); + +/** + * Use SSL encryption. This flag is only available with version 4.x + * of the MySQL client library or newer. Version 3.23.x is bundled both + * with PHP 4 and Windows binaries of PHP 5. + * @link http://php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_SSL', 2048); + +/** + * Allow interactive_timeout seconds (instead of wait_timeout) of + * inactivity before closing the connection. + * @link http://php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_INTERACTIVE', 1024); + +/** + * Allow space after function names + * @link http://php.net/manual/en/mysql.constants.php + */ +define ('MYSQL_CLIENT_IGNORE_SPACE', 256); + +// End of mysql v.1.0 +?> diff --git a/res/php-5.4-core-api/mysqli.php b/res/php-5.4-core-api/mysqli.php new file mode 100644 index 0000000..780b48f --- /dev/null +++ b/res/php-5.4-core-api/mysqli.php @@ -0,0 +1,2730 @@ + + * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * String representation of the exception + * @link http://php.net/manual/en/exception.tostring.php + * @return string the string representation of the exception. + */ + public function __toString () {} + +} + +/** + * MySQLi Driver. + * @link http://php.net/manual/en/class.mysqli-driver.php + * @jms-builtin + */ +final class mysqli_driver { + /** + * @var string + */ + public $client_info; + /** + * @var string + */ + public $client_version; + /** + * @var string + */ + public $driver_version; + /** + * @var string + */ + public $embedded; + /** + * @var bool + */ + public $reconnect; + /** + * @var int + */ + public $report_mode; + +} + +/** + * Represents a connection between PHP and a MySQL database. + * @link http://php.net/manual/en/class.mysqli.php + * @jms-builtin + */ +class mysqli { + public $affected_rows; + public $client_info; + public $client_version; + public $connect_errno; + public $connect_error; + public $errno; + public $error; + public $error_list; + public $field_count; + public $host_info; + public $info; + public $insert_id; + public $server_info; + public $server_version; + public $stat; + public $sqlstate; + public $protocol_version; + public $thread_id; + public $warning_count; + + + /** + * (PHP 5)
+ * Turns on or off auto-commiting database modifications + * @link http://php.net/manual/en/mysqli.autocommit.php + * @param mysqli $link + * @param bool $mode

+ * Whether to turn on auto-commit or not. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function autocommit (mysqli $link, $mode) {} + + /** + * (PHP 5)
+ * Changes the user of the specified database connection + * @link http://php.net/manual/en/mysqli.change-user.php + * @param mysqli $link + * @param string $user

+ * The MySQL user name. + *

+ * @param string $password

+ * The MySQL password. + *

+ * @param string $database

+ * The database to change to. + *

+ *

+ * If desired, the NULL value may be passed resulting in only changing + * the user and not selecting a database. To select a database in this + * case use the mysqli_select_db function. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function change_user (mysqli $link, $user, $password, $database) {} + + /** + * (PHP 5)
+ * Returns the default character set for the database connection + * @link http://php.net/manual/en/mysqli.character-set-name.php + * @param mysqli $link + * @return string The default character set for the current connection + */ + public function character_set_name (mysqli $link) {} + + /** + * (PHP 5)
+ * Closes a previously opened database connection + * @link http://php.net/manual/en/mysqli.close.php + * @param mysqli $link + * @return bool TRUE on success or FALSE on failure. + */ + public function close (mysqli $link) {} + + /** + * (PHP 5)
+ * Commits the current transaction + * @link http://php.net/manual/en/mysqli.commit.php + * @param mysqli $link + * @return bool TRUE on success or FALSE on failure. + */ + public function commit (mysqli $link) {} + + /** + * @param $host [optional] + * @param $user [optional] + * @param $password [optional] + * @param $database [optional] + * @param $port [optional] + * @param $socket [optional] + */ + public function connect ($host, $user, $password, $database, $port, $socket) {} + + /** + * (PHP 5)
+ * Dump debugging information into the log + * @link http://php.net/manual/en/mysqli.dump-debug-info.php + * @param mysqli $link + * @return bool TRUE on success or FALSE on failure. + */ + public function dump_debug_info (mysqli $link) {} + + /** + * (PHP 5)
+ * Performs debugging operations + * @link http://php.net/manual/en/mysqli.debug.php + * @param string $message

+ * A string representing the debugging operation to perform + *

+ * @return bool TRUE. + */ + public function debug ($message) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns a character set object + * @link http://php.net/manual/en/mysqli.get-charset.php + * @param mysqli $link + * @return object The function returns a character set object with the following properties: + * charset + *

Character set name

+ * collation + *

Collation name

+ * dir + *

Directory the charset description was fetched from (?) or "" for built-in character sets

+ * min_length + *

Minimum character length in bytes

+ * max_length + *

Maximum character length in bytes

+ * number + *

Internal character set number

+ * state + *

Character set status (?)

+ */ + public function get_charset (mysqli $link) {} + + /** + * (PHP 5)
+ * Returns the MySQL client version as a string + * @link http://php.net/manual/en/mysqli.get-client-info.php + * @param mysqli $link + * @return string A string that represents the MySQL client library version + */ + public function get_client_info (mysqli $link) {} + + public function get_server_info () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get result of SHOW WARNINGS + * @link http://php.net/manual/en/mysqli.get-warnings.php + * @param mysqli $link + * @return mysqli_warning + */ + public function get_warnings (mysqli $link) {} + + /** + * (PHP 5)
+ * Initializes MySQLi and returns a resource for use with mysqli_real_connect() + * @link http://php.net/manual/en/mysqli.init.php + * @return mysqli an object. + */ + public function init () {} + + /** + * (PHP 5)
+ * Asks the server to kill a MySQL thread + * @link http://php.net/manual/en/mysqli.kill.php + * @param mysqli $link + * @param int $processid + * @return bool TRUE on success or FALSE on failure. + */ + public function kill (mysqli $link, $processid) {} + + /** + * (PHP 5)
+ * Unsets user defined handler for load local infile command + * @link http://php.net/manual/en/mysqli.set-local-infile-default.php + * @param mysqli $link + * @return void No value is returned. + */ + public function set_local_infile_default (mysqli $link) {} + + /** + * (PHP 5)
+ * Set callback function for LOAD DATA LOCAL INFILE command + * @link http://php.net/manual/en/mysqli.set-local-infile-handler.php + * @param mysqli $link + * @param callable $read_func

+ * A callback function or object method taking the following parameters: + *

+ * stream + *

A PHP stream associated with the SQL commands INFILE

+ * @return bool TRUE on success or FALSE on failure. + */ + public function set_local_infile_handler (mysqli $link, callable $read_func) {} + + /** + * (PHP 5)
+ * Performs a query on the database + * @link http://php.net/manual/en/mysqli.multi-query.php + * @param mysqli $link + * @param string $query

+ * The query, as a string. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return bool FALSE if the first statement failed. + * To retrieve subsequent errors from other statements you have to call + * mysqli_next_result first. + */ + public function multi_query (mysqli $link, $query) {} + + /** + * @param $host [optional] + * @param $user [optional] + * @param $password [optional] + * @param $database [optional] + * @param $port [optional] + * @param $socket [optional] + */ + public function mysqli ($host, $user, $password, $database, $port, $socket) {} + + /** + * (PHP 5)
+ * Check if there are any more query results from a multi query + * @link http://php.net/manual/en/mysqli.more-results.php + * @param mysqli $link + * @return bool TRUE on success or FALSE on failure. + */ + public function more_results (mysqli $link) {} + + /** + * (PHP 5)
+ * Prepare next result from multi_query + * @link http://php.net/manual/en/mysqli.next-result.php + * @param mysqli $link + * @return bool TRUE on success or FALSE on failure. + */ + public function next_result (mysqli $link) {} + + /** + * (PHP 5)
+ * Set options + * @link http://php.net/manual/en/mysqli.options.php + * @param mysqli $link + * @param int $option

+ * The option that you want to set. It can be one of the following values: + * + * Valid options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
MYSQLI_OPT_CONNECT_TIMEOUTconnection timeout in seconds (supported on Windows with TCP/IP since PHP 5.3.1)
MYSQLI_OPT_LOCAL_INFILEenable/disable use of LOAD LOCAL INFILE
MYSQLI_INIT_COMMANDcommand to execute after when connecting to MySQL server
MYSQLI_READ_DEFAULT_FILE + * Read options from named option file instead of my.cnf + *
MYSQLI_READ_DEFAULT_GROUP + * Read options from the named group from my.cnf + * or the file specified with MYSQL_READ_DEFAULT_FILE. + *
+ *

+ * @param mixed $value

+ * The value for the option. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function options (mysqli $link, $option, $value) {} + + /** + * (PHP 5)
+ * Pings a server connection, or tries to reconnect if the connection has gone down + * @link http://php.net/manual/en/mysqli.ping.php + * @param mysqli $link + * @return bool TRUE on success or FALSE on failure. + */ + public function ping (mysqli $link) {} + + /** + * (PHP 5)
+ * Prepare an SQL statement for execution + * @link http://php.net/manual/en/mysqli.prepare.php + * @param mysqli $link + * @param string $query

+ * The query, as a string. + *

+ *

+ * You should not add a terminating semicolon or \g + * to the statement. + *

+ *

+ * This parameter can include one or more parameter markers in the SQL + * statement by embedding question mark (?) characters + * at the appropriate positions. + *

+ *

+ * The markers are legal only in certain places in SQL statements. + * For example, they are allowed in the VALUES() + * list of an INSERT statement (to specify column + * values for a row), or in a comparison with a column in a + * WHERE clause to specify a comparison value. + *

+ *

+ * However, they are not allowed for identifiers (such as table or + * column names), in the select list that names the columns to be + * returned by a SELECT statement, or to specify both + * operands of a binary operator such as the = equal + * sign. The latter restriction is necessary because it would be + * impossible to determine the parameter type. It's not allowed to + * compare marker with NULL by + * ? IS NULL too. In general, parameters are legal + * only in Data Manipulation Language (DML) statements, and not in Data + * Definition Language (DDL) statements. + *

+ * @return mysqli_stmt mysqli_prepare returns a statement object or FALSE if an error occurred. + */ + public function prepare (mysqli $link, $query) {} + + /** + * (PHP 5)
+ * Performs a query on the database + * @link http://php.net/manual/en/mysqli.query.php + * @param mysqli $link + * @param string $query

+ * The query string. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @param int $resultmode [optional]

+ * Either the constant MYSQLI_USE_RESULT or + * MYSQLI_STORE_RESULT depending on the desired + * behavior. By default, MYSQLI_STORE_RESULT is used. + *

+ *

+ * If you use MYSQLI_USE_RESULT all subsequent calls + * will return error Commands out of sync unless you + * call mysqli_free_result + *

+ *

+ * With MYSQLI_ASYNC (available with mysqlnd), it is + * possible to perform query asynchronously. + * mysqli_poll is then used to get results from such + * queries. + *

+ * @return mixed FALSE on failure. For successful SELECT, SHOW, DESCRIBE or + * EXPLAIN queries mysqli_query will return + * a mysqli_result object. For other successful queries mysqli_query will + * return TRUE. + */ + public function query (mysqli $link, $query, $resultmode = 'MYSQLI_STORE_RESULT') {} + + /** + * (PHP 5)
+ * Opens a connection to a mysql server + * @link http://php.net/manual/en/mysqli.real-connect.php + * @param mysqli $link + * @param string $host [optional]

+ * Can be either a host name or an IP address. Passing the NULL value + * or the string "localhost" to this parameter, the local host is + * assumed. When possible, pipes will be used instead of the TCP/IP + * protocol. + *

+ * @param string $username [optional]

+ * The MySQL user name. + *

+ * @param string $passwd [optional]

+ * If provided or NULL, the MySQL server will attempt to authenticate + * the user against those user records which have no password only. This + * allows one username to be used with different permissions (depending + * on if a password as provided or not). + *

+ * @param string $dbname [optional]

+ * If provided will specify the default database to be used when + * performing queries. + *

+ * @param int $port [optional]

+ * Specifies the port number to attempt to connect to the MySQL server. + *

+ * @param string $socket [optional]

+ * Specifies the socket or named pipe that should be used. + *

+ *

+ * Specifying the socket parameter will not + * explicitly determine the type of connection to be used when + * connecting to the MySQL server. How the connection is made to the + * MySQL database is determined by the host + * parameter. + *

+ * @param int $flags [optional]

+ * With the parameter flags you can set different + * connection options: + *

+ * + * Supported flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
MYSQLI_CLIENT_COMPRESSUse compression protocol
MYSQLI_CLIENT_FOUND_ROWSreturn number of matched rows, not the number of affected rows
MYSQLI_CLIENT_IGNORE_SPACEAllow spaces after function names. Makes all function names reserved words.
MYSQLI_CLIENT_INTERACTIVE + * Allow interactive_timeout seconds (instead of + * wait_timeout seconds) of inactivity before closing the connection + *
MYSQLI_CLIENT_SSLUse SSL (encryption)
+ *

+ * For security reasons the MULTI_STATEMENT flag is + * not supported in PHP. If you want to execute multiple queries use the + * mysqli_multi_query function. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function real_connect (mysqli $link, $host = null, $username = null, $passwd = null, $dbname = null, $port = null, $socket = null, $flags = null) {} + + /** + * (PHP 5)
+ * Escapes special characters in a string for use in an SQL statement, taking into account the current charset of the connection + * @link http://php.net/manual/en/mysqli.real-escape-string.php + * @param string $escapestr

+ * The string to be escaped. + *

+ *

+ * Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and + * Control-Z. + *

+ * @return string an escaped string. + */ + public function real_escape_string ($escapestr) {} + + /** + * @param $string_to_escape + */ + public function escape_string ($string_to_escape) {} + + /** + * (PHP 5)
+ * Execute an SQL query + * @link http://php.net/manual/en/mysqli.real-query.php + * @param mysqli $link + * @param string $query

+ * The query, as a string. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function real_query (mysqli $link, $query) {} + + /** + * (PHP 5)
+ * Rolls back current transaction + * @link http://php.net/manual/en/mysqli.rollback.php + * @param mysqli $link + * @return bool TRUE on success or FALSE on failure. + */ + public function rollback (mysqli $link) {} + + /** + * (PHP 5)
+ * Selects the default database for database queries + * @link http://php.net/manual/en/mysqli.select-db.php + * @param mysqli $link + * @param string $dbname

+ * The database name. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function select_db (mysqli $link, $dbname) {} + + /** + * (PHP 5 >= 5.0.5)
+ * Sets the default client character set + * @link http://php.net/manual/en/mysqli.set-charset.php + * @param mysqli $link + * @param string $charset

+ * The charset to be set as default. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function set_charset (mysqli $link, $charset) {} + + /** + * @param $option + * @param $value + */ + public function set_opt ($option, $value) {} + + /** + * (PHP 5)
+ * Used for establishing secure connections using SSL + * @link http://php.net/manual/en/mysqli.ssl-set.php + * @param mysqli $link + * @param string $key

+ * The path name to the key file. + *

+ * @param string $cert

+ * The path name to the certificate file. + *

+ * @param string $ca

+ * The path name to the certificate authority file. + *

+ * @param string $capath

+ * The pathname to a directory that contains trusted SSL CA certificates + * in PEM format. + *

+ * @param string $cipher

+ * A list of allowable ciphers to use for SSL encryption. + *

+ * @return bool This function always returns TRUE value. If SSL setup is + * incorrect mysqli_real_connect will return an error + * when you attempt to connect. + */ + public function ssl_set (mysqli $link, $key, $cert, $ca, $capath, $cipher) {} + + /** + * (PHP 5)
+ * Gets the current system status + * @link http://php.net/manual/en/mysqli.stat.php + * @param mysqli $link + * @return string A string describing the server status. FALSE if an error occurred. + */ + public function stat (mysqli $link) {} + + /** + * (PHP 5)
+ * Initializes a statement and returns an object for use with mysqli_stmt_prepare + * @link http://php.net/manual/en/mysqli.stmt-init.php + * @param mysqli $link + * @return mysqli_stmt an object. + */ + public function stmt_init (mysqli $link) {} + + /** + * (PHP 5)
+ * Transfers a result set from the last query + * @link http://php.net/manual/en/mysqli.store-result.php + * @param mysqli $link + * @return mysqli_result a buffered result object or FALSE if an error occurred. + *

+ *

+ * mysqli_store_result returns FALSE in case the query + * didn't return a result set (if the query was, for example an INSERT + * statement). This function also returns FALSE if the reading of the + * result set failed. You can check if you have got an error by checking + * if mysqli_error doesn't return an empty string, if + * mysqli_errno returns a non zero value, or if + * mysqli_field_count returns a non zero value. + * Also possible reason for this function returning FALSE after + * successful call to mysqli_query can be too large + * result set (memory for it cannot be allocated). If + * mysqli_field_count returns a non-zero value, the + * statement should have produced a non-empty result set. + */ + public function store_result (mysqli $link) {} + + /** + * (PHP 5)
+ * Returns whether thread safety is given or not + * @link http://php.net/manual/en/mysqli.thread-safe.php + * @return bool TRUE if the client library is thread-safe, otherwise FALSE. + */ + public function thread_safe () {} + + /** + * (PHP 5)
+ * Initiate a result set retrieval + * @link http://php.net/manual/en/mysqli.use-result.php + * @param mysqli $link + * @return mysqli_result an unbuffered result object or FALSE if an error occurred. + */ + public function use_result (mysqli $link) {} + + /** + * (PHP 5 <= 5.3.0)
+ * Refreshes + * @link http://php.net/manual/en/mysqli.refresh.php + * @param resource $link + * @param int $options

+ * The options to refresh, using the MYSQLI_REFRESH_* constants as documented + * within the MySQLi constants documentation. + *

+ *

+ * See also the official MySQL Refresh + * documentation. + *

+ * @return int TRUE if the refresh was a success, otherwise FALSE + */ + public function refresh ($link, $options) {} + +} + +/** + * Represents a MySQL warning. + * @link http://php.net/manual/en/class.mysqli-warning.php + * @jms-builtin + */ +final class mysqli_warning { + public $message; + public $sqlstate; + public $errno; + + + /** + * (PHP 5)
+ * The __construct purpose + * @link http://php.net/manual/en/mysqli-warning.construct.php + */ + protected function __construct () {} + + /** + * (PHP 5)
+ * The next purpose + * @link http://php.net/manual/en/mysqli-warning.next.php + */ + public function next () {} + +} + +/** + * Represents the result set obtained from a query against the database. + * @link http://php.net/manual/en/class.mysqli-result.php + * @jms-builtin + */ +class mysqli_result implements Traversable { + public $current_field; + public $field_count; + public $lengths; + public $num_rows; + public $type; + + + public function __construct () {} + + public function close () {} + + /** + * (PHP 5)
+ * Frees the memory associated with a result + * @link http://php.net/manual/en/mysqli-result.free.php + * @return void No value is returned. + */ + public function free () {} + + /** + * (PHP 5)
+ * Adjusts the result pointer to an arbitary row in the result + * @link http://php.net/manual/en/mysqli-result.data-seek.php + * @param mysqli_result $result + * @param int $offset

+ * The field offset. Must be between zero and the total number of rows + * minus one (0..mysqli_num_rows - 1). + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function data_seek (mysqli_result $result, $offset) {} + + /** + * (PHP 5)
+ * Returns the next field in the result set + * @link http://php.net/manual/en/mysqli-result.fetch-field.php + * @param mysqli_result $result + * @return object an object which contains field definition information or FALSE + * if no field information is available. + *

+ *

+ * + * Object properties + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
PropertyDescription
nameThe name of the column
orgnameOriginal column name if an alias was specified
tableThe name of the table this field belongs to (if not calculated)
orgtableOriginal table name if an alias was specified
defReserved for default value, currently always ""
dbDatabase (since PHP 5.3.6)
catalogThe catalog name, always "def" (since PHP 5.3.6)
max_lengthThe maximum width of the field for the result set.
lengthThe width of the field, as specified in the table definition.
charsetnrThe character set number for the field.
flagsAn integer representing the bit-flags for the field.
typeThe data type used for this field
decimalsThe number of decimals used (for integer fields)
+ */ + public function fetch_field (mysqli_result $result) {} + + /** + * (PHP 5)
+ * Returns an array of objects representing the fields in a result set + * @link http://php.net/manual/en/mysqli-result.fetch-fields.php + * @param mysqli_result $result + * @return array an array of objects which contains field definition information or + * FALSE if no field information is available. + *

+ *

+ * + * Object properties + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
PropertyDescription
nameThe name of the column
orgnameOriginal column name if an alias was specified
tableThe name of the table this field belongs to (if not calculated)
orgtableOriginal table name if an alias was specified
max_lengthThe maximum width of the field for the result set.
lengthThe width of the field, as specified in the table definition.
charsetnrThe character set number for the field.
flagsAn integer representing the bit-flags for the field.
typeThe data type used for this field
decimalsThe number of decimals used (for integer fields)
+ */ + public function fetch_fields (mysqli_result $result) {} + + /** + * (PHP 5)
+ * Fetch meta-data for a single field + * @link http://php.net/manual/en/mysqli-result.fetch-field-direct.php + * @param mysqli_result $result + * @param int $fieldnr

+ * The field number. This value must be in the range from + * 0 to number of fields - 1. + *

+ * @return object an object which contains field definition information or FALSE + * if no field information for specified fieldnr is + * available. + *

+ *

+ * + * Object attributes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
AttributeDescription
nameThe name of the column
orgnameOriginal column name if an alias was specified
tableThe name of the table this field belongs to (if not calculated)
orgtableOriginal table name if an alias was specified
defThe default value for this field, represented as a string
max_lengthThe maximum width of the field for the result set.
lengthThe width of the field, as specified in the table definition.
charsetnrThe character set number for the field.
flagsAn integer representing the bit-flags for the field.
typeThe data type used for this field
decimalsThe number of decimals used (for integer fields)
+ */ + public function fetch_field_direct (mysqli_result $result, $fieldnr) {} + + /** + * (PHP 5)
+ * Fetch a result row as an associative, a numeric array, or both + * @link http://php.net/manual/en/mysqli-result.fetch-array.php + * @param mysqli_result $result + * @param int $resulttype [optional]

+ * This optional parameter is a constant indicating what type of array + * should be produced from the current row data. The possible values for + * this parameter are the constants MYSQLI_ASSOC, + * MYSQLI_NUM, or MYSQLI_BOTH. + *

+ *

+ * By using the MYSQLI_ASSOC constant this function + * will behave identically to the mysqli_fetch_assoc, + * while MYSQLI_NUM will behave identically to the + * mysqli_fetch_row function. The final option + * MYSQLI_BOTH will create a single array with the + * attributes of both. + *

+ * @return mixed an array of strings that corresponds to the fetched row or NULL if there + * are no more rows in resultset. + */ + public function fetch_array (mysqli_result $result, $resulttype = 'MYSQLI_BOTH') {} + + /** + * (PHP 5)
+ * Fetch a result row as an associative array + * @link http://php.net/manual/en/mysqli-result.fetch-assoc.php + * @param mysqli_result $result + * @return array an associative array of strings representing the fetched row in the result + * set, where each key in the array represents the name of one of the result + * set's columns or NULL if there are no more rows in resultset. + *

+ *

+ * If two or more columns of the result have the same field names, the last + * column will take precedence. To access the other column(s) of the same + * name, you either need to access the result with numeric indices by using + * mysqli_fetch_row or add alias names. + */ + public function fetch_assoc (mysqli_result $result) {} + + /** + * (PHP 5)
+ * Returns the current row of a result set as an object + * @link http://php.net/manual/en/mysqli-result.fetch-object.php + * @param mysqli_result $result + * @param string $class_name [optional]

+ * The name of the class to instantiate, set the properties of and return. + * If not specified, a stdClass object is returned. + *

+ * @param array $params [optional]

+ * An optional array of parameters to pass to the constructor + * for class_name objects. + *

+ * @return object an object with string properties that corresponds to the fetched + * row or NULL if there are no more rows in resultset. + */ + public function fetch_object (mysqli_result $result, $class_name = null, array $params = null) {} + + /** + * (PHP 5)
+ * Get a result row as an enumerated array + * @link http://php.net/manual/en/mysqli-result.fetch-row.php + * @param mysqli_result $result + * @return mixed mysqli_fetch_row returns an array of strings that corresponds to the fetched row + * or NULL if there are no more rows in result set. + */ + public function fetch_row (mysqli_result $result) {} + + /** + * (PHP 5)
+ * Set result pointer to a specified field offset + * @link http://php.net/manual/en/mysqli-result.field-seek.php + * @param mysqli_result $result + * @param int $fieldnr

+ * The field number. This value must be in the range from + * 0 to number of fields - 1. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function field_seek (mysqli_result $result, $fieldnr) {} + + public function free_result () {} + +} + +/** + * Represents a prepared statement. + * @link http://php.net/manual/en/class.mysqli-stmt.php + * @jms-builtin + */ +class mysqli_stmt { + public $affected_rows; + public $insert_id; + public $num_rows; + public $param_count; + public $field_count; + public $errno; + public $error; + public $error_list; + public $sqlstate; + public $id; + + + public function __construct () {} + + /** + * (PHP 5)
+ * Used to get the current value of a statement attribute + * @link http://php.net/manual/en/mysqli-stmt.attr-get.php + * @param mysqli_stmt $stmt + * @param int $attr

+ * The attribute that you want to get. + *

+ * @return int FALSE if the attribute is not found, otherwise returns the value of the attribute. + */ + public function attr_get (mysqli_stmt $stmt, $attr) {} + + /** + * (PHP 5)
+ * Used to modify the behavior of a prepared statement + * @link http://php.net/manual/en/mysqli-stmt.attr-set.php + * @param mysqli_stmt $stmt + * @param int $attr

+ * The attribute that you want to set. It can have one of the following values: + * + * Attribute values + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CharacterDescription
MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH + * If set to 1, causes mysqli_stmt_store_result to + * update the metadata MYSQL_FIELD->max_length value. + *
MYSQLI_STMT_ATTR_CURSOR_TYPE + * Type of cursor to open for statement when mysqli_stmt_execute + * is invoked. mode can be MYSQLI_CURSOR_TYPE_NO_CURSOR + * (the default) or MYSQLI_CURSOR_TYPE_READ_ONLY. + *
MYSQLI_STMT_ATTR_PREFETCH_ROWS + * Number of rows to fetch from server at a time when using a cursor. + * mode can be in the range from 1 to the maximum + * value of unsigned long. The default is 1. + *
+ *

+ *

+ * If you use the MYSQLI_STMT_ATTR_CURSOR_TYPE option with + * MYSQLI_CURSOR_TYPE_READ_ONLY, a cursor is opened for the + * statement when you invoke mysqli_stmt_execute. If there + * is already an open cursor from a previous mysqli_stmt_execute call, + * it closes the cursor before opening a new one. mysqli_stmt_reset + * also closes any open cursor before preparing the statement for re-execution. + * mysqli_stmt_free_result closes any open cursor. + *

+ *

+ * If you open a cursor for a prepared statement, mysqli_stmt_store_result + * is unnecessary. + *

+ * @param int $mode

The value to assign to the attribute.

+ * @return bool + */ + public function attr_set (mysqli_stmt $stmt, $attr, $mode) {} + + /** + * (PHP 5)
+ * Binds variables to a prepared statement as parameters + * @link http://php.net/manual/en/mysqli-stmt.bind-param.php + * @param mysqli_stmt $stmt + * @param string $types

+ * A string that contains one or more characters which specify the types + * for the corresponding bind variables: + * + * Type specification chars + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CharacterDescription
icorresponding variable has type integer
dcorresponding variable has type double
scorresponding variable has type string
bcorresponding variable is a blob and will be sent in packets
+ *

+ * @param mixed $var1

+ * The number of variables and length of string + * types must match the parameters in the statement. + *

+ * @param mixed $_ [optional] + * @return bool TRUE on success or FALSE on failure. + */ + public function bind_param (mysqli_stmt $stmt, $types, &$var1, &$_ = null) {} + + /** + * (PHP 5)
+ * Binds variables to a prepared statement for result storage + * @link http://php.net/manual/en/mysqli-stmt.bind-result.php + * @param mysqli_stmt $stmt + * @param mixed $var1

+ * The variable to be bound. + *

+ * @param mixed $_ [optional] + * @return bool TRUE on success or FALSE on failure. + */ + public function bind_result (mysqli_stmt $stmt, &$var1, &$_ = null) {} + + /** + * (PHP 5)
+ * Closes a prepared statement + * @link http://php.net/manual/en/mysqli-stmt.close.php + * @param mysqli_stmt $stmt + * @return bool TRUE on success or FALSE on failure. + */ + public function close (mysqli_stmt $stmt) {} + + /** + * (PHP 5)
+ * Seeks to an arbitrary row in statement result set + * @link http://php.net/manual/en/mysqli-stmt.data-seek.php + * @param mysqli_stmt $stmt + * @param int $offset

+ * Must be between zero and the total number of rows minus one (0.. + * mysqli_stmt_num_rows - 1). + *

+ * @return void No value is returned. + */ + public function data_seek (mysqli_stmt $stmt, $offset) {} + + /** + * (PHP 5)
+ * Executes a prepared Query + * @link http://php.net/manual/en/mysqli-stmt.execute.php + * @param mysqli_stmt $stmt + * @return bool TRUE on success or FALSE on failure. + */ + public function execute (mysqli_stmt $stmt) {} + + /** + * (PHP 5)
+ * Fetch results from a prepared statement into the bound variables + * @link http://php.net/manual/en/mysqli-stmt.fetch.php + * @param mysqli_stmt $stmt + * @return bool + */ + public function fetch (mysqli_stmt $stmt) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Get result of SHOW WARNINGS + * @link http://php.net/manual/en/mysqli-stmt.get-warnings.php + * @param mysqli_stmt $stmt + * @return object + */ + public function get_warnings (mysqli_stmt $stmt) {} + + /** + * (PHP 5)
+ * Returns result set metadata from a prepared statement + * @link http://php.net/manual/en/mysqli-stmt.result-metadata.php + * @param mysqli_stmt $stmt + * @return mysqli_result a result object or FALSE if an error occurred. + */ + public function result_metadata (mysqli_stmt $stmt) {} + + public function num_rows () {} + + /** + * (PHP 5)
+ * Send data in blocks + * @link http://php.net/manual/en/mysqli-stmt.send-long-data.php + * @param mysqli_stmt $stmt + * @param int $param_nr

+ * Indicates which parameter to associate the data with. Parameters are + * numbered beginning with 0. + *

+ * @param string $data

+ * A string containing data to be sent. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function send_long_data (mysqli_stmt $stmt, $param_nr, $data) {} + + /** + * (PHP 5)
+ * Frees stored result memory for the given statement handle + * @link http://php.net/manual/en/mysqli-stmt.free-result.php + * @param mysqli_stmt $stmt + * @return void No value is returned. + */ + public function free_result (mysqli_stmt $stmt) {} + + /** + * (PHP 5)
+ * Resets a prepared statement + * @link http://php.net/manual/en/mysqli-stmt.reset.php + * @param mysqli_stmt $stmt + * @return bool TRUE on success or FALSE on failure. + */ + public function reset (mysqli_stmt $stmt) {} + + /** + * (PHP 5)
+ * Prepare an SQL statement for execution + * @link http://php.net/manual/en/mysqli-stmt.prepare.php + * @param mysqli_stmt $stmt + * @param string $query

+ * The query, as a string. It must consist of a single SQL statement. + *

+ *

+ * You can include one or more parameter markers in the SQL statement by + * embedding question mark (?) characters at the + * appropriate positions. + *

+ *

+ * You should not add a terminating semicolon or \g + * to the statement. + *

+ *

+ * The markers are legal only in certain places in SQL statements. + * For example, they are allowed in the VALUES() list of an INSERT statement + * (to specify column values for a row), or in a comparison with a column in + * a WHERE clause to specify a comparison value. + *

+ *

+ * However, they are not allowed for identifiers (such as table or column names), + * in the select list that names the columns to be returned by a SELECT statement), + * or to specify both operands of a binary operator such as the = + * equal sign. The latter restriction is necessary because it would be impossible + * to determine the parameter type. In general, parameters are legal only in Data + * Manipulation Language (DML) statements, and not in Data Definition Language + * (DDL) statements. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function prepare (mysqli_stmt $stmt, $query) {} + + /** + * (PHP 5)
+ * Transfers a result set from a prepared statement + * @link http://php.net/manual/en/mysqli-stmt.store-result.php + * @param mysqli_stmt $stmt + * @return bool TRUE on success or FALSE on failure. + */ + public function store_result (mysqli_stmt $stmt) {} + +} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_affected_rows ($link) {} + +/** + * @param $link + * @param $mode + * @jms-builtin + */ +function mysqli_autocommit ($link, $mode) {} + +/** + * @param $link + * @param $user + * @param $password + * @param $database + * @jms-builtin + */ +function mysqli_change_user ($link, $user, $password, $database) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_character_set_name ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_close ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_commit ($link) {} + +/** + * (PHP 5)
+ * Alias of mysqli::__construct + * @link http://php.net/manual/en/function.mysqli-connect.php + * @param $host [optional] + * @param $user [optional] + * @param $password [optional] + * @param $database [optional] + * @param $port [optional] + * @param $socket [optional] + * @jms-builtin + */ +function mysqli_connect ($host, $user, $password, $database, $port, $socket) {} + +/** @jms-builtin */ +function mysqli_connect_errno () {} + +/** @jms-builtin */ +function mysqli_connect_error () {} + +/** + * @param $result + * @param $offset + * @jms-builtin + */ +function mysqli_data_seek ($result, $offset) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_dump_debug_info ($link) {} + +/** + * @param $debug_options + * @jms-builtin + */ +function mysqli_debug ($debug_options) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_errno ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_error ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_error_list ($link) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_execute ($stmt) {} + +/** + * (PHP 5)
+ * Alias for mysqli_stmt_execute + * @link http://php.net/manual/en/function.mysqli-execute.php + * @param $stmt + * @jms-builtin + */ +function mysqli_execute ($stmt) {} + +/** + * @param $result + * @jms-builtin + */ +function mysqli_fetch_field ($result) {} + +/** + * @param $result + * @jms-builtin + */ +function mysqli_fetch_fields ($result) {} + +/** + * @param $result + * @param $field_nr + * @jms-builtin + */ +function mysqli_fetch_field_direct ($result, $field_nr) {} + +/** + * @param $result + * @jms-builtin + */ +function mysqli_fetch_lengths ($result) {} + +/** + * @param $result + * @param $result_type [optional] + * @jms-builtin + */ +function mysqli_fetch_array ($result, $result_type) {} + +/** + * @param $result + * @jms-builtin + */ +function mysqli_fetch_assoc ($result) {} + +/** + * @param $result + * @param $class_name [optional] + * @param $params [optional] + * @jms-builtin + */ +function mysqli_fetch_object ($result, $class_namearray , $params) {} + +/** + * @param $result + * @jms-builtin + */ +function mysqli_fetch_row ($result) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_field_count ($link) {} + +/** + * @param $result + * @param $field_nr + * @jms-builtin + */ +function mysqli_field_seek ($result, $field_nr) {} + +/** + * @param $result + * @jms-builtin + */ +function mysqli_field_tell ($result) {} + +/** + * @param $result + * @jms-builtin + */ +function mysqli_free_result ($result) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_get_charset ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_get_client_info ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_get_client_version ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_get_host_info ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_get_proto_info ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_get_server_info ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_get_server_version ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_get_warnings ($link) {} + +/** @jms-builtin */ +function mysqli_init () {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_info ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_insert_id ($link) {} + +/** + * @param $link + * @param $connection_id + * @jms-builtin + */ +function mysqli_kill ($link, $connection_id) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_set_local_infile_default ($link) {} + +/** + * @param $link + * @param $read_callback + * @jms-builtin + */ +function mysqli_set_local_infile_handler ($link, $read_callback) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_more_results ($link) {} + +/** + * @param $link + * @param $query + * @jms-builtin + */ +function mysqli_multi_query ($link, $query) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_next_result ($link) {} + +/** + * @param $result + * @jms-builtin + */ +function mysqli_num_fields ($result) {} + +/** + * @param $result + * @jms-builtin + */ +function mysqli_num_rows ($result) {} + +/** + * @param $link + * @param $option + * @param $value + * @jms-builtin + */ +function mysqli_options ($link, $option, $value) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_ping ($link) {} + +/** + * @param $link + * @param $query + * @jms-builtin + */ +function mysqli_prepare ($link, $query) {} + +/** + * (PHP 5)
+ * Enables or disables internal report functions + * @link http://php.net/manual/en/function.mysqli-report.php + * @param int $flags

+ * + * Supported flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
MYSQLI_REPORT_OFFTurns reporting off
MYSQLI_REPORT_ERRORReport errors from mysqli function calls
MYSQLI_REPORT_STRICT + * Throw mysqli_sql_exception for errors + * instead of warnings + *
MYSQLI_REPORT_INDEXReport if no index or bad index was used in a query
MYSQLI_REPORT_ALLSet all options (report all)
+ *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mysqli_report ($flags) {} + +/** + * @param $link + * @param $query + * @jms-builtin + */ +function mysqli_query ($link, $query) {} + +/** + * @param $link + * @param $host [optional] + * @param $user [optional] + * @param $password [optional] + * @param $database [optional] + * @param $port [optional] + * @param $socket [optional] + * @param $flags [optional] + * @jms-builtin + */ +function mysqli_real_connect ($link, $host, $user, $password, $database, $port, $socket, $flags) {} + +/** + * @param $link + * @param $string_to_escape + * @jms-builtin + */ +function mysqli_real_escape_string ($link, $string_to_escape) {} + +/** + * @param $link + * @param $query + * @jms-builtin + */ +function mysqli_real_query ($link, $query) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_rollback ($link) {} + +/** + * @param $link + * @param $database + * @jms-builtin + */ +function mysqli_select_db ($link, $database) {} + +/** + * @param $link + * @param $charset + * @jms-builtin + */ +function mysqli_set_charset ($link, $charset) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_affected_rows ($stmt) {} + +/** + * @param $stmt + * @param $attribute + * @jms-builtin + */ +function mysqli_stmt_attr_get ($stmt, $attribute) {} + +/** + * @param $stmt + * @param $attribute + * @param $value + * @jms-builtin + */ +function mysqli_stmt_attr_set ($stmt, $attribute, $value) {} + +/** + * @param $stmt + * @param $types + * @jms-builtin + */ +function mysqli_stmt_bind_param ($stmt, $types) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_bind_result ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_close ($stmt) {} + +/** + * @param $stmt + * @param $offset + * @jms-builtin + */ +function mysqli_stmt_data_seek ($stmt, $offset) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_errno ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_error ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_error_list ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_fetch ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_field_count ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_free_result ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_get_warnings ($stmt) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_stmt_init ($link) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_insert_id ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_num_rows ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_param_count ($stmt) {} + +/** + * @param $stmt + * @param $query + * @jms-builtin + */ +function mysqli_stmt_prepare ($stmt, $query) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_reset ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_result_metadata ($stmt) {} + +/** + * @param $stmt + * @param $param_nr + * @param $data + * @jms-builtin + */ +function mysqli_stmt_send_long_data ($stmt, $param_nr, $data) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_store_result ($stmt) {} + +/** + * @param $stmt + * @jms-builtin + */ +function mysqli_stmt_sqlstate ($stmt) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_sqlstate ($link) {} + +/** + * @param $link + * @param $key + * @param $cert + * @param $certificate_authority + * @param $certificate_authority_path + * @param $cipher + * @jms-builtin + */ +function mysqli_ssl_set ($link, $key, $cert, $certificate_authority, $certificate_authority_path, $cipher) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_stat ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_store_result ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_thread_id ($link) {} + +/** @jms-builtin */ +function mysqli_thread_safe () {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_use_result ($link) {} + +/** + * @param $link + * @jms-builtin + */ +function mysqli_warning_count ($link) {} + +/** + * @param $link + * @param $options + * @jms-builtin + */ +function mysqli_refresh ($link, $options) {} + +/** + * (PHP 5)
+ * Alias of mysqli_real_escape_string + * @link http://php.net/manual/en/function.mysqli-escape-string.php + * @param $link + * @param $query + * @jms-builtin + */ +function mysqli_escape_string ($link, $query) {} + +/** + * (PHP 5)
+ * Alias of mysqli_options + * @link http://php.net/manual/en/function.mysqli-set-opt.php + * @jms-builtin + */ +function mysqli_set_opt () {} + + +/** + *

+ * Read options from the named group from my.cnf + * or the file specified with MYSQLI_READ_DEFAULT_FILE + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_READ_DEFAULT_GROUP', 5); + +/** + *

+ * Read options from the named option file instead of from my.cnf + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_READ_DEFAULT_FILE', 4); + +/** + *

+ * Connect timeout in seconds + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_OPT_CONNECT_TIMEOUT', 0); + +/** + *

+ * Enables command LOAD LOCAL INFILE + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_OPT_LOCAL_INFILE', 8); + +/** + *

+ * Command to execute when connecting to MySQL server. Will automatically be re-executed when reconnecting. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_INIT_COMMAND', 3); +define ('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT', 21); + +/** + *

+ * Use SSL (encrypted protocol). This option should not be set by application programs; + * it is set internally in the MySQL client library + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_SSL', 2048); + +/** + *

+ * Use compression protocol + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_COMPRESS', 32); + +/** + *

+ * Allow interactive_timeout seconds + * (instead of wait_timeout seconds) of inactivity before + * closing the connection. The client's session + * wait_timeout variable will be set to + * the value of the session interactive_timeout variable. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_INTERACTIVE', 1024); + +/** + *

+ * Allow spaces after function names. Makes all functions names reserved words. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_IGNORE_SPACE', 256); + +/** + *

+ * Don't allow the db_name.tbl_name.col_name syntax. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CLIENT_NO_SCHEMA', 16); +define ('MYSQLI_CLIENT_FOUND_ROWS', 2); + +/** + *

+ * For using buffered resultsets + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STORE_RESULT', 0); + +/** + *

+ * For using unbuffered resultsets + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_USE_RESULT', 1); + +/** + *

+ * Columns are returned into the array having the fieldname as the array index. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_ASSOC', 1); + +/** + *

+ * Columns are returned into the array having an enumerated index. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NUM', 2); + +/** + *

+ * Columns are returned into the array having both a numerical index and the fieldname as the associative index. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_BOTH', 3); + +/** + *

+ *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH', 0); + +/** + *

+ *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STMT_ATTR_CURSOR_TYPE', 1); + +/** + *

+ *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_NO_CURSOR', 0); + +/** + *

+ *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_READ_ONLY', 1); + +/** + *

+ *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_FOR_UPDATE', 2); + +/** + *

+ *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_CURSOR_TYPE_SCROLLABLE', 4); + +/** + *

+ *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_STMT_ATTR_PREFETCH_ROWS', 2); + +/** + *

+ * Indicates that a field is defined as NOT NULL + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NOT_NULL_FLAG', 1); + +/** + *

+ * Field is part of a primary index + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_PRI_KEY_FLAG', 2); + +/** + *

+ * Field is part of a unique index. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_UNIQUE_KEY_FLAG', 4); + +/** + *

+ * Field is part of an index. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_MULTIPLE_KEY_FLAG', 8); + +/** + *

+ * Field is defined as BLOB + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_BLOB_FLAG', 16); + +/** + *

+ * Field is defined as UNSIGNED + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_UNSIGNED_FLAG', 32); + +/** + *

+ * Field is defined as ZEROFILL + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_ZEROFILL_FLAG', 64); + +/** + *

+ * Field is defined as AUTO_INCREMENT + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_AUTO_INCREMENT_FLAG', 512); + +/** + *

+ * Field is defined as TIMESTAMP + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TIMESTAMP_FLAG', 1024); + +/** + *

+ * Field is defined as SET + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_SET_FLAG', 2048); + +/** + *

+ * Field is defined as NUMERIC + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NUM_FLAG', 32768); + +/** + *

+ * Field is part of an multi-index + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_PART_KEY_FLAG', 16384); + +/** + *

+ * Field is part of GROUP BY + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_GROUP_FLAG', 32768); + +/** + *

+ * Field is defined as ENUM. Available since PHP 5.3.0. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_ENUM_FLAG', 256); +define ('MYSQLI_BINARY_FLAG', 128); +define ('MYSQLI_NO_DEFAULT_VALUE_FLAG', 4096); + +/** + *

+ * Field is defined as DECIMAL + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DECIMAL', 0); + +/** + *

+ * Field is defined as TINYINT + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TINY', 1); + +/** + *

+ * Field is defined as SMALLINT + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_SHORT', 2); + +/** + *

+ * Field is defined as INT + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_LONG', 3); + +/** + *

+ * Field is defined as FLOAT + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_FLOAT', 4); + +/** + *

+ * Field is defined as DOUBLE + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DOUBLE', 5); + +/** + *

+ * Field is defined as DEFAULT NULL + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_NULL', 6); + +/** + *

+ * Field is defined as TIMESTAMP + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TIMESTAMP', 7); + +/** + *

+ * Field is defined as BIGINT + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_LONGLONG', 8); + +/** + *

+ * Field is defined as MEDIUMINT + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_INT24', 9); + +/** + *

+ * Field is defined as DATE + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DATE', 10); + +/** + *

+ * Field is defined as TIME + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TIME', 11); + +/** + *

+ * Field is defined as DATETIME + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_DATETIME', 12); + +/** + *

+ * Field is defined as YEAR + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_YEAR', 13); + +/** + *

+ * Field is defined as DATE + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_NEWDATE', 14); + +/** + *

+ * Field is defined as ENUM + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_ENUM', 247); + +/** + *

+ * Field is defined as SET + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_SET', 248); + +/** + *

+ * Field is defined as TINYBLOB + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_TINY_BLOB', 249); + +/** + *

+ * Field is defined as MEDIUMBLOB + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_MEDIUM_BLOB', 250); + +/** + *

+ * Field is defined as LONGBLOB + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_LONG_BLOB', 251); + +/** + *

+ * Field is defined as BLOB + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_BLOB', 252); + +/** + *

+ * Field is defined as VARCHAR + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_VAR_STRING', 253); + +/** + *

+ * Field is defined as STRING + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_STRING', 254); + +/** + *

+ * Field is defined as CHAR + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_CHAR', 1); + +/** + *

+ * Field is defined as INTERVAL + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_INTERVAL', 247); + +/** + *

+ * Field is defined as GEOMETRY + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_GEOMETRY', 255); + +/** + *

+ * Precision math DECIMAL or NUMERIC field (MySQL 5.0.3 and up) + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_NEWDECIMAL', 246); + +/** + *

+ * Field is defined as BIT (MySQL 5.0.3 and up) + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_TYPE_BIT', 16); + +/** + *

+ *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_SET_CHARSET_NAME', 7); +define ('MYSQLI_SET_CHARSET_DIR', 6); + +/** + *

+ * No more data available for bind variable + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_NO_DATA', 100); + +/** + *

+ * Data truncation occurred. Available since PHP 5.1.0 and MySQL 5.0.5. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_DATA_TRUNCATED', 101); + +/** + *

+ * Report if no index or bad index was used in a query. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REPORT_INDEX', 4); + +/** + *

+ * Report errors from mysqli function calls. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REPORT_ERROR', 1); + +/** + *

+ * Throw a mysqli_sql_exception for errors instead of warnings. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REPORT_STRICT', 2); + +/** + *

+ * Set all options on (report all). + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REPORT_ALL', 255); + +/** + *

+ * Turns reporting off. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REPORT_OFF', 0); + +/** + *

+ * Is set to 1 if mysqli_debug functionality is enabled. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_DEBUG_TRACE_ENABLED', 0); + +/** + *

+ *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED', 16); + +/** + *

+ *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_SERVER_QUERY_NO_INDEX_USED', 32); +define ('MYSQLI_SERVER_QUERY_WAS_SLOW', 2048); +define ('MYSQLI_SERVER_PS_OUT_PARAMS', 4096); + +/** + *

+ * Refreshes the grant tables. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REFRESH_GRANT', 1); + +/** + *

+ * Flushes the logs, like executing the + * FLUSH LOGS SQL statement. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REFRESH_LOG', 2); + +/** + *

+ * Flushes the table cache, like executing the + * FLUSH TABLES SQL statement. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REFRESH_TABLES', 4); + +/** + *

+ * Flushes the host cache, like executing the + * FLUSH HOSTS SQL statement. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REFRESH_HOSTS', 8); + +/** + *

+ * Reset the status variables, like executing the + * FLUSH STATUS SQL statement. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REFRESH_STATUS', 16); + +/** + *

+ * Flushes the thread cache. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REFRESH_THREADS', 32); + +/** + *

+ * On a slave replication server: resets the master server information, and + * restarts the slave. Like executing the RESET SLAVE + * SQL statement. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REFRESH_SLAVE', 64); + +/** + *

+ * On a master replication server: removes the binary log files listed in the + * binary log index, and truncates the index file. Like executing the + * RESET MASTER SQL statement. + *

+ * @link http://php.net/manual/en/mysqli.constants.php + */ +define ('MYSQLI_REFRESH_MASTER', 128); + +// End of mysqli v.0.1 +?> diff --git a/res/php-5.4-core-api/mysqlnd.php b/res/php-5.4-core-api/mysqlnd.php new file mode 100644 index 0000000..c3d2e4a --- /dev/null +++ b/res/php-5.4-core-api/mysqlnd.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.4-core-api/ncurses.php b/res/php-5.4-core-api/ncurses.php new file mode 100644 index 0000000..61a14e0 --- /dev/null +++ b/res/php-5.4-core-api/ncurses.php @@ -0,0 +1,1926 @@ + + *

+ * @return int + * @jms-builtin + */ +function ncurses_addch ($ch) {} + +/** + * Set fore- and background color + * @link http://php.net/manual/en/function.ncurses-color-set.php + * @param pair int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_color_set ($pair) {} + +/** + * Delete a ncurses window + * @link http://php.net/manual/en/function.ncurses-delwin.php + * @param window resource

+ *

+ * @return bool + * @jms-builtin + */ +function ncurses_delwin ($window) {} + +/** + * Stop using ncurses, clean up the screen + * @link http://php.net/manual/en/function.ncurses-end.php + * @return int + * @jms-builtin + */ +function ncurses_end () {} + +/** + * Read a character from keyboard + * @link http://php.net/manual/en/function.ncurses-getch.php + * @return int + * @jms-builtin + */ +function ncurses_getch () {} + +/** + * Check if terminal has colors + * @link http://php.net/manual/en/function.ncurses-has-colors.php + * @return bool Return true if the terminal has color capacities, false otherwise. + *

+ * @jms-builtin + */ +function ncurses_has_colors () {} + +/** + * Initialize ncurses + * @link http://php.net/manual/en/function.ncurses-init.php + * @return void &return.void; + *

+ * @jms-builtin + */ +function ncurses_init () {} + +/** + * Allocate a color pair + * @link http://php.net/manual/en/function.ncurses-init-pair.php + * @param pair int

+ *

+ * @param fg int

+ *

+ * @param bg int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_init_pair ($pair, $fg, $bg) {} + +/** + * Gets the RGB value for color + * @link http://php.net/manual/en/function.ncurses-color-content.php + * @param color int

+ *

+ * @param r int

+ *

+ * @param g int

+ *

+ * @param b int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_color_content ($color, &$r, &$g, &$b) {} + +/** + * Gets the RGB value for color + * @link http://php.net/manual/en/function.ncurses-pair-content.php + * @param pair int

+ *

+ * @param f int

+ *

+ * @param b int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_pair_content ($pair, &$f, &$b) {} + +/** + * Move output position + * @link http://php.net/manual/en/function.ncurses-move.php + * @param y int

+ *

+ * @param x int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_move ($y, $x) {} + +/** + * Create a new window + * @link http://php.net/manual/en/function.ncurses-newwin.php + * @param rows int

+ * Number of rows + *

+ * @param cols int

+ * Number of columns + *

+ * @param y int

+ * y-ccordinate of the origin + *

+ * @param x int

+ * x-ccordinate of the origin + *

+ * @return resource a resource ID for the new window. + *

+ * @jms-builtin + */ +function ncurses_newwin ($rows, $cols, $y, $x) {} + +/** + * Refresh screen + * @link http://php.net/manual/en/function.ncurses-refresh.php + * @param ch int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_refresh ($ch) {} + +/** + * Start using colors + * @link http://php.net/manual/en/function.ncurses-start-color.php + * @return int + * @jms-builtin + */ +function ncurses_start_color () {} + +/** + * Start using 'standout' attribute + * @link http://php.net/manual/en/function.ncurses-standout.php + * @return int + * @jms-builtin + */ +function ncurses_standout () {} + +/** + * Stop using 'standout' attribute + * @link http://php.net/manual/en/function.ncurses-standend.php + * @return int + * @jms-builtin + */ +function ncurses_standend () {} + +/** + * Returns baudrate of terminal + * @link http://php.net/manual/en/function.ncurses-baudrate.php + * @return int + * @jms-builtin + */ +function ncurses_baudrate () {} + +/** + * Let the terminal beep + * @link http://php.net/manual/en/function.ncurses-beep.php + * @return int + * @jms-builtin + */ +function ncurses_beep () {} + +/** + * Check if we can change terminals colors + * @link http://php.net/manual/en/function.ncurses-can-change-color.php + * @return bool Return true if the terminal has color capabilities and you can change + * the colors, false otherwise. + *

+ * @jms-builtin + */ +function ncurses_can_change_color () {} + +/** + * Switch of input buffering + * @link http://php.net/manual/en/function.ncurses-cbreak.php + * @return bool true or NCURSES_ERR if any error occurred. + *

+ * @jms-builtin + */ +function ncurses_cbreak () {} + +/** + * Clear screen + * @link http://php.net/manual/en/function.ncurses-clear.php + * @return bool &return.success; + *

+ * @jms-builtin + */ +function ncurses_clear () {} + +/** + * Clear screen from current position to bottom + * @link http://php.net/manual/en/function.ncurses-clrtobot.php + * @return bool &return.success; + *

+ * @jms-builtin + */ +function ncurses_clrtobot () {} + +/** + * Clear screen from current position to end of line + * @link http://php.net/manual/en/function.ncurses-clrtoeol.php + * @return bool &return.success; + *

+ * @jms-builtin + */ +function ncurses_clrtoeol () {} + +/** + * Saves terminals (program) mode + * @link http://php.net/manual/en/function.ncurses-def-prog-mode.php + * @return bool false on success, otherwise true. + *

+ * @jms-builtin + */ +function ncurses_def_prog_mode () {} + +/** + * Resets the prog mode saved by def_prog_mode + * @link http://php.net/manual/en/function.ncurses-reset-prog-mode.php + * @return int + * @jms-builtin + */ +function ncurses_reset_prog_mode () {} + +/** + * Saves terminals (shell) mode + * @link http://php.net/manual/en/function.ncurses-def-shell-mode.php + * @return bool false on success, true otherwise. + *

+ * @jms-builtin + */ +function ncurses_def_shell_mode () {} + +/** + * Resets the shell mode saved by def_shell_mode + * @link http://php.net/manual/en/function.ncurses-reset-shell-mode.php + * @return int + * @jms-builtin + */ +function ncurses_reset_shell_mode () {} + +/** + * Delete character at current position, move rest of line left + * @link http://php.net/manual/en/function.ncurses-delch.php + * @return bool false on success, true otherwise. + *

+ * @jms-builtin + */ +function ncurses_delch () {} + +/** + * Delete line at current position, move rest of screen up + * @link http://php.net/manual/en/function.ncurses-deleteln.php + * @return bool false on success, otherwise true. + *

+ * @jms-builtin + */ +function ncurses_deleteln () {} + +/** + * Write all prepared refreshes to terminal + * @link http://php.net/manual/en/function.ncurses-doupdate.php + * @return bool &return.success; + *

+ * @jms-builtin + */ +function ncurses_doupdate () {} + +/** + * Activate keyboard input echo + * @link http://php.net/manual/en/function.ncurses-echo.php + * @return bool false on success, true if any error occurred. + *

+ * @jms-builtin + */ +function ncurses_echo () {} + +/** + * Erase terminal screen + * @link http://php.net/manual/en/function.ncurses-erase.php + * @return bool &return.success; + *

+ * @jms-builtin + */ +function ncurses_erase () {} + +/** + * Erase window contents + * @link http://php.net/manual/en/function.ncurses-werase.php + * @param window resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_werase ($window) {} + +/** + * Returns current erase character + * @link http://php.net/manual/en/function.ncurses-erasechar.php + * @return string The current erase char, as a string. + *

+ * @jms-builtin + */ +function ncurses_erasechar () {} + +/** + * Flash terminal screen (visual bell) + * @link http://php.net/manual/en/function.ncurses-flash.php + * @return bool false on success, otherwise true. + *

+ * @jms-builtin + */ +function ncurses_flash () {} + +/** + * Flush keyboard input buffer + * @link http://php.net/manual/en/function.ncurses-flushinp.php + * @return bool false on success, otherwise true. + *

+ * @jms-builtin + */ +function ncurses_flushinp () {} + +/** + * Check for insert- and delete-capabilities + * @link http://php.net/manual/en/function.ncurses-has-ic.php + * @return bool true if the terminal has insert/delete-capabilities, false + * otherwise. + *

+ * @jms-builtin + */ +function ncurses_has_ic () {} + +/** + * Check for line insert- and delete-capabilities + * @link http://php.net/manual/en/function.ncurses-has-il.php + * @return bool true if the terminal has insert/delete-line capabilities, + * false otherwise. + *

+ * @jms-builtin + */ +function ncurses_has_il () {} + +/** + * Get character and attribute at current position + * @link http://php.net/manual/en/function.ncurses-inch.php + * @return string the character, as a string. + *

+ * @jms-builtin + */ +function ncurses_inch () {} + +/** + * Insert a line, move rest of screen down + * @link http://php.net/manual/en/function.ncurses-insertln.php + * @return int + * @jms-builtin + */ +function ncurses_insertln () {} + +/** + * Ncurses is in endwin mode, normal screen output may be performed + * @link http://php.net/manual/en/function.ncurses-isendwin.php + * @return bool true, if ncurses_endwin has been called + * without any subsequent calls to ncurses_wrefresh, + * false otherwise. + *

+ * @jms-builtin + */ +function ncurses_isendwin () {} + +/** + * Returns current line kill character + * @link http://php.net/manual/en/function.ncurses-killchar.php + * @return string the kill character, as a string. + *

+ * @jms-builtin + */ +function ncurses_killchar () {} + +/** + * Translate newline and carriage return / line feed + * @link http://php.net/manual/en/function.ncurses-nl.php + * @return bool + * @jms-builtin + */ +function ncurses_nl () {} + +/** + * Switch terminal to cooked mode + * @link http://php.net/manual/en/function.ncurses-nocbreak.php + * @return bool true if any error occurred, otherwise false. + *

+ * @jms-builtin + */ +function ncurses_nocbreak () {} + +/** + * Switch off keyboard input echo + * @link http://php.net/manual/en/function.ncurses-noecho.php + * @return bool true if any error occurred, false otherwise. + *

+ * @jms-builtin + */ +function ncurses_noecho () {} + +/** + * Do not translate newline and carriage return / line feed + * @link http://php.net/manual/en/function.ncurses-nonl.php + * @return bool + * @jms-builtin + */ +function ncurses_nonl () {} + +/** + * Switch terminal out of raw mode + * @link http://php.net/manual/en/function.ncurses-noraw.php + * @return bool true if any error occurred, otherwise false. + *

+ * @jms-builtin + */ +function ncurses_noraw () {} + +/** + * Switch terminal into raw mode + * @link http://php.net/manual/en/function.ncurses-raw.php + * @return bool true if any error occurred, otherwise false. + *

+ * @jms-builtin + */ +function ncurses_raw () {} + +/** + * Enables/Disable 8-bit meta key information + * @link http://php.net/manual/en/function.ncurses-meta.php + * @param window resource

+ *

+ * @param 8bit bool

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_meta ($window, $bit8) {} + +/** + * Restores saved terminal state + * @link http://php.net/manual/en/function.ncurses-resetty.php + * @return bool Always returns false. + *

+ * @jms-builtin + */ +function ncurses_resetty () {} + +/** + * Saves terminal state + * @link http://php.net/manual/en/function.ncurses-savetty.php + * @return bool Always returns false. + *

+ * @jms-builtin + */ +function ncurses_savetty () {} + +/** + * Returns a logical OR of all attribute flags supported by terminal + * @link http://php.net/manual/en/function.ncurses-termattrs.php + * @return bool + * @jms-builtin + */ +function ncurses_termattrs () {} + +/** + * Assign terminal default colors to color id -1 + * @link http://php.net/manual/en/function.ncurses-use-default-colors.php + * @return bool + * @jms-builtin + */ +function ncurses_use_default_colors () {} + +/** + * Returns current soft label key attribute + * @link http://php.net/manual/en/function.ncurses-slk-attr.php + * @return int The attribute, as an integer. + *

+ * @jms-builtin + */ +function ncurses_slk_attr () {} + +/** + * Clears soft labels from screen + * @link http://php.net/manual/en/function.ncurses-slk-clear.php + * @return bool true on errors, false otherwise. + *

+ * @jms-builtin + */ +function ncurses_slk_clear () {} + +/** + * Copies soft label keys to virtual screen + * @link http://php.net/manual/en/function.ncurses-slk-noutrefresh.php + * @return bool + * @jms-builtin + */ +function ncurses_slk_noutrefresh () {} + +/** + * Copies soft label keys to screen + * @link http://php.net/manual/en/function.ncurses-slk-refresh.php + * @return int + * @jms-builtin + */ +function ncurses_slk_refresh () {} + +/** + * Restores soft label keys + * @link http://php.net/manual/en/function.ncurses-slk-restore.php + * @return int + * @jms-builtin + */ +function ncurses_slk_restore () {} + +/** + * Forces output when ncurses_slk_noutrefresh is performed + * @link http://php.net/manual/en/function.ncurses-slk-touch.php + * @return int + * @jms-builtin + */ +function ncurses_slk_touch () {} + +/** + * Turn off the given attributes + * @link http://php.net/manual/en/function.ncurses-attroff.php + * @param attributes int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_attroff ($attributes) {} + +/** + * Turn on the given attributes + * @link http://php.net/manual/en/function.ncurses-attron.php + * @param attributes int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_attron ($attributes) {} + +/** + * Set given attributes + * @link http://php.net/manual/en/function.ncurses-attrset.php + * @param attributes int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_attrset ($attributes) {} + +/** + * Set background property for terminal screen + * @link http://php.net/manual/en/function.ncurses-bkgd.php + * @param attrchar int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_bkgd ($attrchar) {} + +/** + * Set cursor state + * @link http://php.net/manual/en/function.ncurses-curs-set.php + * @param visibility int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_curs_set ($visibility) {} + +/** + * Delay output on terminal using padding characters + * @link http://php.net/manual/en/function.ncurses-delay-output.php + * @param milliseconds int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_delay_output ($milliseconds) {} + +/** + * Single character output including refresh + * @link http://php.net/manual/en/function.ncurses-echochar.php + * @param character int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_echochar ($character) {} + +/** + * Put terminal into halfdelay mode + * @link http://php.net/manual/en/function.ncurses-halfdelay.php + * @param tenth int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_halfdelay ($tenth) {} + +/** + * Check for presence of a function key on terminal keyboard + * @link http://php.net/manual/en/function.ncurses-has-key.php + * @param keycode int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_has_key ($keycode) {} + +/** + * Insert character moving rest of line including character at current position + * @link http://php.net/manual/en/function.ncurses-insch.php + * @param character int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_insch ($character) {} + +/** + * Insert lines before current line scrolling down (negative numbers delete and scroll up) + * @link http://php.net/manual/en/function.ncurses-insdelln.php + * @param count int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_insdelln ($count) {} + +/** + * Set timeout for mouse button clicks + * @link http://php.net/manual/en/function.ncurses-mouseinterval.php + * @param milliseconds int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mouseinterval ($milliseconds) {} + +/** + * Sleep + * @link http://php.net/manual/en/function.ncurses-napms.php + * @param milliseconds int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_napms ($milliseconds) {} + +/** + * Scroll window content up or down without changing current position + * @link http://php.net/manual/en/function.ncurses-scrl.php + * @param count int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_scrl ($count) {} + +/** + * Turn off the given attributes for soft function-key labels + * @link http://php.net/manual/en/function.ncurses-slk-attroff.php + * @param intarg int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_slk_attroff ($intarg) {} + +/** + * Turn on the given attributes for soft function-key labels + * @link http://php.net/manual/en/function.ncurses-slk-attron.php + * @param intarg int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_slk_attron ($intarg) {} + +/** + * Set given attributes for soft function-key labels + * @link http://php.net/manual/en/function.ncurses-slk-attrset.php + * @param intarg int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_slk_attrset ($intarg) {} + +/** + * Sets color for soft label keys + * @link http://php.net/manual/en/function.ncurses-slk-color.php + * @param intarg int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_slk_color ($intarg) {} + +/** + * Initializes soft label key functions + * @link http://php.net/manual/en/function.ncurses-slk-init.php + * @param format int

+ * If ncurses_initscr eventually uses a line from + * stdscr to emulate the soft labels, then this parameter determines how + * the labels are arranged of the screen. + *

+ *

+ * 0 indicates a 3-2-3 arrangement of the labels, 1 indicates a 4-4 + * arrangement and 2 indicates the PC like 4-4-4 mode, but in addition an + * index line will be created. + *

+ * @return bool &return.success; + *

+ * @jms-builtin + */ +function ncurses_slk_init ($format) {} + +/** + * Sets function key labels + * @link http://php.net/manual/en/function.ncurses-slk-set.php + * @param labelnr int

+ *

+ * @param label string

+ *

+ * @param format int

+ *

+ * @return bool + * @jms-builtin + */ +function ncurses_slk_set ($labelnr, $label, $format) {} + +/** + * Specify different filedescriptor for typeahead checking + * @link http://php.net/manual/en/function.ncurses-typeahead.php + * @param fd int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_typeahead ($fd) {} + +/** + * Put a character back into the input stream + * @link http://php.net/manual/en/function.ncurses-ungetch.php + * @param keycode int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_ungetch ($keycode) {} + +/** + * Display the string on the terminal in the video attribute mode + * @link http://php.net/manual/en/function.ncurses-vidattr.php + * @param intarg int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_vidattr ($intarg) {} + +/** + * Refresh window on terminal screen + * @link http://php.net/manual/en/function.ncurses-wrefresh.php + * @param window resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wrefresh ($window) {} + +/** + * Control use of extended names in terminfo descriptions + * @link http://php.net/manual/en/function.ncurses-use-extended-names.php + * @param flag bool

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_use_extended_names ($flag) {} + +/** + * Control screen background + * @link http://php.net/manual/en/function.ncurses-bkgdset.php + * @param attrchar int

+ *

+ * @return void + * @jms-builtin + */ +function ncurses_bkgdset ($attrchar) {} + +/** + * Set LINES for iniscr() and newterm() to 1 + * @link http://php.net/manual/en/function.ncurses-filter.php + * @return void + * @jms-builtin + */ +function ncurses_filter () {} + +/** + * Do not flush on signal characters + * @link http://php.net/manual/en/function.ncurses-noqiflush.php + * @return void + * @jms-builtin + */ +function ncurses_noqiflush () {} + +/** + * Flush on signal characters + * @link http://php.net/manual/en/function.ncurses-qiflush.php + * @return void + * @jms-builtin + */ +function ncurses_qiflush () {} + +/** + * Set timeout for special key sequences + * @link http://php.net/manual/en/function.ncurses-timeout.php + * @param millisec int

+ *

+ * @return void + * @jms-builtin + */ +function ncurses_timeout ($millisec) {} + +/** + * Control use of environment information about terminal size + * @link http://php.net/manual/en/function.ncurses-use-env.php + * @param flag bool

+ *

+ * @return void + * @jms-builtin + */ +function ncurses_use_env ($flag) {} + +/** + * Output text at current position + * @link http://php.net/manual/en/function.ncurses-addstr.php + * @param text string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_addstr ($text) {} + +/** + * Apply padding information to the string and output it + * @link http://php.net/manual/en/function.ncurses-putp.php + * @param text string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_putp ($text) {} + +/** + * Dump screen content to file + * @link http://php.net/manual/en/function.ncurses-scr-dump.php + * @param filename string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_scr_dump ($filename) {} + +/** + * Initialize screen from file dump + * @link http://php.net/manual/en/function.ncurses-scr-init.php + * @param filename string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_scr_init ($filename) {} + +/** + * Restore screen from file dump + * @link http://php.net/manual/en/function.ncurses-scr-restore.php + * @param filename string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_scr_restore ($filename) {} + +/** + * Inherit screen from file dump + * @link http://php.net/manual/en/function.ncurses-scr-set.php + * @param filename string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_scr_set ($filename) {} + +/** + * Move current position and add character + * @link http://php.net/manual/en/function.ncurses-mvaddch.php + * @param y int

+ *

+ * @param x int

+ *

+ * @param c int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvaddch ($y, $x, $c) {} + +/** + * Move position and add attributed string with specified length + * @link http://php.net/manual/en/function.ncurses-mvaddchnstr.php + * @param y int

+ *

+ * @param x int

+ *

+ * @param s string

+ *

+ * @param n int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvaddchnstr ($y, $x, $s, $n) {} + +/** + * Add attributed string with specified length at current position + * @link http://php.net/manual/en/function.ncurses-addchnstr.php + * @param s string

+ *

+ * @param n int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_addchnstr ($s, $n) {} + +/** + * Move position and add attributed string + * @link http://php.net/manual/en/function.ncurses-mvaddchstr.php + * @param y int

+ *

+ * @param x int

+ *

+ * @param s string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvaddchstr ($y, $x, $s) {} + +/** + * Add attributed string at current position + * @link http://php.net/manual/en/function.ncurses-addchstr.php + * @param s string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_addchstr ($s) {} + +/** + * Move position and add string with specified length + * @link http://php.net/manual/en/function.ncurses-mvaddnstr.php + * @param y int

+ *

+ * @param x int

+ *

+ * @param s string

+ *

+ * @param n int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvaddnstr ($y, $x, $s, $n) {} + +/** + * Add string with specified length at current position + * @link http://php.net/manual/en/function.ncurses-addnstr.php + * @param s string

+ *

+ * @param n int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_addnstr ($s, $n) {} + +/** + * Move position and add string + * @link http://php.net/manual/en/function.ncurses-mvaddstr.php + * @param y int

+ *

+ * @param x int

+ *

+ * @param s string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvaddstr ($y, $x, $s) {} + +/** + * Move position and delete character, shift rest of line left + * @link http://php.net/manual/en/function.ncurses-mvdelch.php + * @param y int

+ *

+ * @param x int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvdelch ($y, $x) {} + +/** + * Move position and get character at new position + * @link http://php.net/manual/en/function.ncurses-mvgetch.php + * @param y int

+ *

+ * @param x int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvgetch ($y, $x) {} + +/** + * Move position and get attributed character at new position + * @link http://php.net/manual/en/function.ncurses-mvinch.php + * @param y int

+ *

+ * @param x int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvinch ($y, $x) {} + +/** + * Add string at new position in window + * @link http://php.net/manual/en/function.ncurses-mvwaddstr.php + * @param window resource

+ *

+ * @param y int

+ *

+ * @param x int

+ *

+ * @param text string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvwaddstr ($window, $y, $x, $text) {} + +/** + * Insert string at current position, moving rest of line right + * @link http://php.net/manual/en/function.ncurses-insstr.php + * @param text string

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_insstr ($text) {} + +/** + * Reads string from terminal screen + * @link http://php.net/manual/en/function.ncurses-instr.php + * @param buffer string

+ * The characters. Attributes will be stripped. + *

+ * @return int the number of characters. + *

+ * @jms-builtin + */ +function ncurses_instr (&$buffer) {} + +/** + * Set new position and draw a horizontal line using an attributed character and max. n characters long + * @link http://php.net/manual/en/function.ncurses-mvhline.php + * @param y int

+ *

+ * @param x int

+ *

+ * @param attrchar int

+ *

+ * @param n int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvhline ($y, $x, $attrchar, $n) {} + +/** + * Move cursor immediately + * @link http://php.net/manual/en/function.ncurses-mvcur.php + * @param old_y int

+ *

+ * @param old_x int

+ *

+ * @param new_y int

+ *

+ * @param new_x int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_mvcur ($old_y, $old_x, $new_y, $new_x) {} + +/** + * Set new RGB value for color + * @link http://php.net/manual/en/function.ncurses-init-color.php + * @param color int

+ *

+ * @param r int

+ *

+ * @param g int

+ *

+ * @param b int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_init_color ($color, $r, $g, $b) {} + +/** + * Draw a border around the screen using attributed characters + * @link http://php.net/manual/en/function.ncurses-border.php + * @param left int

+ *

+ * @param right int

+ *

+ * @param top int

+ *

+ * @param bottom int

+ *

+ * @param tl_corner int

+ * Top left corner + *

+ * @param tr_corner int

+ * Top right corner + *

+ * @param bl_corner int

+ * Bottom left corner + *

+ * @param br_corner int

+ * Bottom right corner + *

+ * @return int + * @jms-builtin + */ +function ncurses_border ($left, $right, $top, $bottom, $tl_corner, $tr_corner, $bl_corner, $br_corner) {} + +/** + * Define default colors for color 0 + * @link http://php.net/manual/en/function.ncurses-assume-default-colors.php + * @param fg int

+ *

+ * @param bg int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_assume_default_colors ($fg, $bg) {} + +/** + * Define a keycode + * @link http://php.net/manual/en/function.ncurses-define-key.php + * @param definition string

+ *

+ * @param keycode int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_define_key ($definition, $keycode) {} + +/** + * Draw a horizontal line at current position using an attributed character and max. n characters long + * @link http://php.net/manual/en/function.ncurses-hline.php + * @param charattr int

+ *

+ * @param n int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_hline ($charattr, $n) {} + +/** + * Draw a vertical line at current position using an attributed character and max. n characters long + * @link http://php.net/manual/en/function.ncurses-vline.php + * @param charattr int

+ *

+ * @param n int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_vline ($charattr, $n) {} + +/** + * Enable or disable a keycode + * @link http://php.net/manual/en/function.ncurses-keyok.php + * @param keycode int

+ *

+ * @param enable bool

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_keyok ($keycode, $enable) {} + +/** + * Returns terminals (short)-name + * @link http://php.net/manual/en/function.ncurses-termname.php + * @return string the shortname of the terminal, truncated to 14 characters. + * On errors, returns &null;. + *

+ * @jms-builtin + */ +function ncurses_termname () {} + +/** + * Returns terminals description + * @link http://php.net/manual/en/function.ncurses-longname.php + * @return string the description, as a string truncated to 128 characters. + * On errors, returns &null;. + *

+ * @jms-builtin + */ +function ncurses_longname () {} + +/** + * Sets mouse options + * @link http://php.net/manual/en/function.ncurses-mousemask.php + * @param newmask int

+ * Mouse mask options can be set with the following predefined constants: + *

NCURSES_BUTTON1_PRESSED

+ * @param oldmask int

+ * This will be set to the previous value of the mouse event mask. + *

+ * @return int a mask to indicated which of the in parameter + * newmask specified mouse events can be reported. On + * complete failure, it returns 0. + *

+ * @jms-builtin + */ +function ncurses_mousemask ($newmask, &$oldmask) {} + +/** + * Reads mouse event + * @link http://php.net/manual/en/function.ncurses-getmouse.php + * @param mevent array

+ * Event options will be delivered in this parameter which has to be an + * array, passed by reference (see example below). + *

+ *

+ * On success an associative array with following keys will be delivered: + *

+ * "id" : Id to distinguish multiple devices + *

+ * @return bool false if a mouse event is actually visible in the given window, + * otherwise returns true. + *

+ * @jms-builtin + */ +function ncurses_getmouse (array &$mevent) {} + +/** + * Pushes mouse event to queue + * @link http://php.net/manual/en/function.ncurses-ungetmouse.php + * @param mevent array

+ * An associative array specifying the event options: + *

"id" : Id to distinguish multiple devices

+ * @return bool false on success, true otherwise. + *

+ * @jms-builtin + */ +function ncurses_ungetmouse (array $mevent) {} + +/** + * Transforms coordinates + * @link http://php.net/manual/en/function.ncurses-mouse-trafo.php + * @param y int

+ *

+ * @param x int

+ *

+ * @param toscreen bool

+ *

+ * @return bool + * @jms-builtin + */ +function ncurses_mouse_trafo (&$y, &$x, $toscreen) {} + +/** + * Transforms window/stdscr coordinates + * @link http://php.net/manual/en/function.ncurses-wmouse-trafo.php + * @param window resource

+ *

+ * @param y int

+ *

+ * @param x int

+ *

+ * @param toscreen bool

+ *

+ * @return bool + * @jms-builtin + */ +function ncurses_wmouse_trafo ($window, &$y, &$x, $toscreen) {} + +/** + * Outputs text at current postion in window + * @link http://php.net/manual/en/function.ncurses-waddstr.php + * @param window resource

+ *

+ * @param str string

+ *

+ * @param n int[optional]

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_waddstr ($window, $str, $n = null) {} + +/** + * Copies window to virtual screen + * @link http://php.net/manual/en/function.ncurses-wnoutrefresh.php + * @param window resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wnoutrefresh ($window) {} + +/** + * Clears window + * @link http://php.net/manual/en/function.ncurses-wclear.php + * @param window resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wclear ($window) {} + +/** + * Sets windows color pairings + * @link http://php.net/manual/en/function.ncurses-wcolor-set.php + * @param window resource

+ *

+ * @param color_pair int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wcolor_set ($window, $color_pair) {} + +/** + * Reads a character from keyboard (window) + * @link http://php.net/manual/en/function.ncurses-wgetch.php + * @param window resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wgetch ($window) {} + +/** + * Turns keypad on or off + * @link http://php.net/manual/en/function.ncurses-keypad.php + * @param window resource

+ *

+ * @param bf bool

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_keypad ($window, $bf) {} + +/** + * Moves windows output position + * @link http://php.net/manual/en/function.ncurses-wmove.php + * @param window resource

+ *

+ * @param y int

+ *

+ * @param x int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wmove ($window, $y, $x) {} + +/** + * Creates a new pad (window) + * @link http://php.net/manual/en/function.ncurses-newpad.php + * @param rows int

+ *

+ * @param cols int

+ *

+ * @return resource + * @jms-builtin + */ +function ncurses_newpad ($rows, $cols) {} + +/** + * Copies a region from a pad into the virtual screen + * @link http://php.net/manual/en/function.ncurses-prefresh.php + * @param pad resource

+ *

+ * @param pminrow int

+ *

+ * @param pmincol int

+ *

+ * @param sminrow int

+ *

+ * @param smincol int

+ *

+ * @param smaxrow int

+ *

+ * @param smaxcol int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_prefresh ($pad, $pminrow, $pmincol, $sminrow, $smincol, $smaxrow, $smaxcol) {} + +/** + * Copies a region from a pad into the virtual screen + * @link http://php.net/manual/en/function.ncurses-pnoutrefresh.php + * @param pad resource

+ *

+ * @param pminrow int

+ *

+ * @param pmincol int

+ *

+ * @param sminrow int

+ *

+ * @param smincol int

+ *

+ * @param smaxrow int

+ *

+ * @param smaxcol int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_pnoutrefresh ($pad, $pminrow, $pmincol, $sminrow, $smincol, $smaxrow, $smaxcol) {} + +/** + * Enter standout mode for a window + * @link http://php.net/manual/en/function.ncurses-wstandout.php + * @param window resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wstandout ($window) {} + +/** + * End standout mode for a window + * @link http://php.net/manual/en/function.ncurses-wstandend.php + * @param window resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wstandend ($window) {} + +/** + * Set the attributes for a window + * @link http://php.net/manual/en/function.ncurses-wattrset.php + * @param window resource

+ *

+ * @param attrs int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wattrset ($window, $attrs) {} + +/** + * Turns on attributes for a window + * @link http://php.net/manual/en/function.ncurses-wattron.php + * @param window resource

+ *

+ * @param attrs int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wattron ($window, $attrs) {} + +/** + * Turns off attributes for a window + * @link http://php.net/manual/en/function.ncurses-wattroff.php + * @param window resource

+ *

+ * @param attrs int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wattroff ($window, $attrs) {} + +/** + * Adds character at current position in a window and advance cursor + * @link http://php.net/manual/en/function.ncurses-waddch.php + * @param window resource

+ *

+ * @param ch int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_waddch ($window, $ch) {} + +/** + * Draws a border around the window using attributed characters + * @link http://php.net/manual/en/function.ncurses-wborder.php + * @param window resource

+ * The window on which we operate + *

+ * @param left int

+ *

+ * @param right int

+ *

+ * @param top int

+ *

+ * @param bottom int

+ *

+ * @param tl_corner int

+ * Top left corner + *

+ * @param tr_corner int

+ * Top right corner + *

+ * @param bl_corner int

+ * Bottom left corner + *

+ * @param br_corner int

+ * Bottom right corner + *

+ * @return int + * @jms-builtin + */ +function ncurses_wborder ($window, $left, $right, $top, $bottom, $tl_corner, $tr_corner, $bl_corner, $br_corner) {} + +/** + * Draws a horizontal line in a window at current position using an attributed character and max. n characters long + * @link http://php.net/manual/en/function.ncurses-whline.php + * @param window resource

+ *

+ * @param charattr int

+ *

+ * @param n int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_whline ($window, $charattr, $n) {} + +/** + * Draws a vertical line in a window at current position using an attributed character and max. n characters long + * @link http://php.net/manual/en/function.ncurses-wvline.php + * @param window resource

+ *

+ * @param charattr int

+ *

+ * @param n int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_wvline ($window, $charattr, $n) {} + +/** + * Returns the current cursor position for a window + * @link http://php.net/manual/en/function.ncurses-getyx.php + * @param window resource

+ *

+ * @param y int

+ *

+ * @param x int

+ *

+ * @return void + * @jms-builtin + */ +function ncurses_getyx ($window, &$y, &$x) {} + +/** + * Returns the size of a window + * @link http://php.net/manual/en/function.ncurses-getmaxyx.php + * @param window resource

+ * The measured window + *

+ * @param y int

+ * This will be set to the window height + *

+ * @param x int

+ * This will be set to the window width + *

+ * @return void &return.void; + *

+ * @jms-builtin + */ +function ncurses_getmaxyx ($window, &$y, &$x) {} + +/** + * Refreshes the virtual screen to reflect the relations between panels in the stack + * @link http://php.net/manual/en/function.ncurses-update-panels.php + * @return void + * @jms-builtin + */ +function ncurses_update_panels () {} + +/** + * Returns the window associated with panel + * @link http://php.net/manual/en/function.ncurses-panel-window.php + * @param panel resource

+ *

+ * @return resource + * @jms-builtin + */ +function ncurses_panel_window ($panel) {} + +/** + * Returns the panel below panel + * @link http://php.net/manual/en/function.ncurses-panel-below.php + * @param panel resource

+ *

+ * @return resource + * @jms-builtin + */ +function ncurses_panel_below ($panel) {} + +/** + * Returns the panel above panel + * @link http://php.net/manual/en/function.ncurses-panel-above.php + * @param panel resource

+ *

+ * @return resource If panel is null, returns the bottom panel in the stack. + *

+ * @jms-builtin + */ +function ncurses_panel_above ($panel) {} + +/** + * Replaces the window associated with panel + * @link http://php.net/manual/en/function.ncurses-replace-panel.php + * @param panel resource

+ *

+ * @param window resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_replace_panel ($panel, $window) {} + +/** + * Moves a panel so that its upper-left corner is at [startx, starty] + * @link http://php.net/manual/en/function.ncurses-move-panel.php + * @param panel resource

+ *

+ * @param startx int

+ *

+ * @param starty int

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_move_panel ($panel, $startx, $starty) {} + +/** + * Moves a visible panel to the bottom of the stack + * @link http://php.net/manual/en/function.ncurses-bottom-panel.php + * @param panel resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_bottom_panel ($panel) {} + +/** + * Moves a visible panel to the top of the stack + * @link http://php.net/manual/en/function.ncurses-top-panel.php + * @param panel resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_top_panel ($panel) {} + +/** + * Places an invisible panel on top of the stack, making it visible + * @link http://php.net/manual/en/function.ncurses-show-panel.php + * @param panel resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_show_panel ($panel) {} + +/** + * Remove panel from the stack, making it invisible + * @link http://php.net/manual/en/function.ncurses-hide-panel.php + * @param panel resource

+ *

+ * @return int + * @jms-builtin + */ +function ncurses_hide_panel ($panel) {} + +/** + * Remove panel from the stack and delete it (but not the associated window) + * @link http://php.net/manual/en/function.ncurses-del-panel.php + * @param panel resource

+ *

+ * @return bool + * @jms-builtin + */ +function ncurses_del_panel ($panel) {} + +/** + * Create a new panel and associate it with window + * @link http://php.net/manual/en/function.ncurses-new-panel.php + * @param window resource

+ *

+ * @return resource + * @jms-builtin + */ +function ncurses_new_panel ($window) {} + +define ('NCURSES_COLOR_BLACK', 0); +define ('NCURSES_COLOR_RED', 1); +define ('NCURSES_COLOR_GREEN', 2); +define ('NCURSES_COLOR_YELLOW', 3); +define ('NCURSES_COLOR_BLUE', 4); +define ('NCURSES_COLOR_MAGENTA', 5); +define ('NCURSES_COLOR_CYAN', 6); +define ('NCURSES_COLOR_WHITE', 7); +define ('NCURSES_KEY_DOWN', 258); +define ('NCURSES_KEY_UP', 259); +define ('NCURSES_KEY_LEFT', 260); +define ('NCURSES_KEY_RIGHT', 261); +define ('NCURSES_KEY_HOME', 262); +define ('NCURSES_KEY_END', 360); +define ('NCURSES_KEY_BACKSPACE', 263); +define ('NCURSES_KEY_MOUSE', 409); +define ('NCURSES_KEY_F0', 264); +define ('NCURSES_KEY_F1', 265); +define ('NCURSES_KEY_F2', 266); +define ('NCURSES_KEY_F3', 267); +define ('NCURSES_KEY_F4', 268); +define ('NCURSES_KEY_F5', 269); +define ('NCURSES_KEY_F6', 270); +define ('NCURSES_KEY_F7', 271); +define ('NCURSES_KEY_F8', 272); +define ('NCURSES_KEY_F9', 273); +define ('NCURSES_KEY_F10', 274); +define ('NCURSES_KEY_F11', 275); +define ('NCURSES_KEY_F12', 276); +define ('NCURSES_KEY_DL', 328); +define ('NCURSES_KEY_IL', 329); +define ('NCURSES_KEY_DC', 330); +define ('NCURSES_KEY_IC', 331); +define ('NCURSES_KEY_EIC', 332); +define ('NCURSES_KEY_CLEAR', 333); +define ('NCURSES_KEY_EOS', 334); +define ('NCURSES_KEY_EOL', 335); +define ('NCURSES_KEY_SF', 336); +define ('NCURSES_KEY_SR', 337); +define ('NCURSES_KEY_NPAGE', 338); +define ('NCURSES_KEY_PPAGE', 339); +define ('NCURSES_KEY_STAB', 340); +define ('NCURSES_KEY_CTAB', 341); +define ('NCURSES_KEY_CATAB', 342); +define ('NCURSES_KEY_ENTER', 343); +define ('NCURSES_KEY_SRESET', 344); +define ('NCURSES_KEY_RESET', 345); +define ('NCURSES_KEY_PRINT', 346); +define ('NCURSES_KEY_LL', 347); +define ('NCURSES_KEY_A1', 348); +define ('NCURSES_KEY_A3', 349); +define ('NCURSES_KEY_B2', 350); +define ('NCURSES_KEY_C1', 351); +define ('NCURSES_KEY_C3', 352); +define ('NCURSES_KEY_BTAB', 353); +define ('NCURSES_KEY_BEG', 354); +define ('NCURSES_KEY_CANCEL', 355); +define ('NCURSES_KEY_CLOSE', 356); +define ('NCURSES_KEY_COMMAND', 357); +define ('NCURSES_KEY_COPY', 358); +define ('NCURSES_KEY_CREATE', 359); +define ('NCURSES_KEY_EXIT', 361); +define ('NCURSES_KEY_FIND', 362); +define ('NCURSES_KEY_HELP', 363); +define ('NCURSES_KEY_MARK', 364); +define ('NCURSES_KEY_MESSAGE', 365); +define ('NCURSES_KEY_MOVE', 366); +define ('NCURSES_KEY_NEXT', 367); +define ('NCURSES_KEY_OPEN', 368); +define ('NCURSES_KEY_OPTIONS', 369); +define ('NCURSES_KEY_PREVIOUS', 370); +define ('NCURSES_KEY_REDO', 371); +define ('NCURSES_KEY_REFERENCE', 372); +define ('NCURSES_KEY_REFRESH', 373); +define ('NCURSES_KEY_REPLACE', 374); +define ('NCURSES_KEY_RESTART', 375); +define ('NCURSES_KEY_RESUME', 376); +define ('NCURSES_KEY_SAVE', 377); +define ('NCURSES_KEY_SBEG', 378); +define ('NCURSES_KEY_SCANCEL', 379); +define ('NCURSES_KEY_SCOMMAND', 380); +define ('NCURSES_KEY_SCOPY', 381); +define ('NCURSES_KEY_SCREATE', 382); +define ('NCURSES_KEY_SDC', 383); +define ('NCURSES_KEY_SDL', 384); +define ('NCURSES_KEY_SELECT', 385); +define ('NCURSES_KEY_SEND', 386); +define ('NCURSES_KEY_SEOL', 387); +define ('NCURSES_KEY_SEXIT', 388); +define ('NCURSES_KEY_SFIND', 389); +define ('NCURSES_KEY_SHELP', 390); +define ('NCURSES_KEY_SHOME', 391); +define ('NCURSES_KEY_SIC', 392); +define ('NCURSES_KEY_SLEFT', 393); +define ('NCURSES_KEY_SMESSAGE', 394); +define ('NCURSES_KEY_SMOVE', 395); +define ('NCURSES_KEY_SNEXT', 396); +define ('NCURSES_KEY_SOPTIONS', 397); +define ('NCURSES_KEY_SPREVIOUS', 398); +define ('NCURSES_KEY_SPRINT', 399); +define ('NCURSES_KEY_SREDO', 400); +define ('NCURSES_KEY_SREPLACE', 401); +define ('NCURSES_KEY_SRIGHT', 402); +define ('NCURSES_KEY_SRSUME', 403); +define ('NCURSES_KEY_SSAVE', 404); +define ('NCURSES_KEY_SSUSPEND', 405); +define ('NCURSES_KEY_SUNDO', 406); +define ('NCURSES_KEY_SUSPEND', 407); +define ('NCURSES_KEY_UNDO', 408); +define ('NCURSES_KEY_RESIZE', 410); +define ('NCURSES_A_NORMAL', 0); +define ('NCURSES_A_STANDOUT', 65536); +define ('NCURSES_A_UNDERLINE', 131072); +define ('NCURSES_A_REVERSE', 262144); +define ('NCURSES_A_BLINK', 524288); +define ('NCURSES_A_DIM', 1048576); +define ('NCURSES_A_BOLD', 2097152); +define ('NCURSES_A_PROTECT', 16777216); +define ('NCURSES_A_INVIS', 8388608); +define ('NCURSES_A_ALTCHARSET', 4194304); +define ('NCURSES_A_CHARTEXT', 255); +define ('NCURSES_BUTTON1_PRESSED', 2); +define ('NCURSES_BUTTON1_RELEASED', 1); +define ('NCURSES_BUTTON1_CLICKED', 4); +define ('NCURSES_BUTTON1_DOUBLE_CLICKED', 8); +define ('NCURSES_BUTTON1_TRIPLE_CLICKED', 16); +define ('NCURSES_BUTTON2_PRESSED', 128); +define ('NCURSES_BUTTON2_RELEASED', 64); +define ('NCURSES_BUTTON2_CLICKED', 256); +define ('NCURSES_BUTTON2_DOUBLE_CLICKED', 512); +define ('NCURSES_BUTTON2_TRIPLE_CLICKED', 1024); +define ('NCURSES_BUTTON3_PRESSED', 8192); +define ('NCURSES_BUTTON3_RELEASED', 4096); +define ('NCURSES_BUTTON3_CLICKED', 16384); +define ('NCURSES_BUTTON3_DOUBLE_CLICKED', 32768); +define ('NCURSES_BUTTON3_TRIPLE_CLICKED', 65536); +define ('NCURSES_BUTTON4_PRESSED', 524288); +define ('NCURSES_BUTTON4_RELEASED', 262144); +define ('NCURSES_BUTTON4_CLICKED', 1048576); +define ('NCURSES_BUTTON4_DOUBLE_CLICKED', 2097152); +define ('NCURSES_BUTTON4_TRIPLE_CLICKED', 4194304); +define ('NCURSES_BUTTON_SHIFT', 33554432); +define ('NCURSES_BUTTON_CTRL', 16777216); +define ('NCURSES_BUTTON_ALT', 67108864); +define ('NCURSES_ALL_MOUSE_EVENTS', 134217727); +define ('NCURSES_REPORT_MOUSE_POSITION', 134217728); + +// End of ncurses v. +?> diff --git a/res/php-5.4-core-api/oci8.php b/res/php-5.4-core-api/oci8.php new file mode 100644 index 0000000..5420e92 --- /dev/null +++ b/res/php-5.4-core-api/oci8.php @@ -0,0 +1,2458 @@ + + * Returns large object's contents + * @link http://php.net/manual/en/oci-lob.load.php + * @return string the contents of the object, or FALSE on errors. + */ + public function load () {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the current position of internal pointer of large object + * @link http://php.net/manual/en/oci-lob.tell.php + * @return int current position of a LOB's internal pointer or FALSE if an + * error occurred. + */ + public function tell () {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Truncates large object + * @link http://php.net/manual/en/oci-lob.truncate.php + * @param int $length [optional]

+ * If provided, this method will truncate the LOB to + * length bytes. Otherwise, it will completely + * purge the LOB. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function truncate ($length = 0) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Erases a specified portion of the internal LOB data + * @link http://php.net/manual/en/oci-lob.erase.php + * @param int $offset [optional] + * @param int $length [optional] + * @return int the actual number of characters/bytes erased or FALSE on failure. + */ + public function erase ($offset = null, $length = null) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Flushes/writes buffer of the LOB to the server + * @link http://php.net/manual/en/oci-lob.flush.php + * @param int $flag [optional]

+ * By default, resources are not freed, but using flag + * OCI_LOB_BUFFER_FREE you can do it explicitly. + * Be sure you know what you're doing - next read/write operation to the + * same part of LOB will involve a round-trip to the server and initialize + * new buffer resources. It is recommended to use + * OCI_LOB_BUFFER_FREE flag only when you are not + * going to work with the LOB anymore. + *

+ * @return bool TRUE on success or FALSE on failure. + *

+ *

+ * Returns FALSE if buffering was not enabled or an error occurred. + */ + public function flush ($flag = null) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Changes current state of buffering for the large object + * @link http://php.net/manual/en/oci-lob.setbuffering.php + * @param bool $on_off

+ * TRUE for on and FALSE for off. + *

+ * @return bool TRUE on success or FALSE on failure. Repeated calls to this method with the same flag will + * return TRUE. + */ + public function setbuffering ($on_off) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns current state of buffering for the large object + * @link http://php.net/manual/en/oci-lob.getbuffering.php + * @return bool FALSE if buffering for the large object is off and TRUE if + * buffering is used. + */ + public function getbuffering () {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Moves the internal pointer to the beginning of the large object + * @link http://php.net/manual/en/oci-lob.rewind.php + * @return bool TRUE on success or FALSE on failure. + */ + public function rewind () {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Reads part of the large object + * @link http://php.net/manual/en/oci-lob.read.php + * @param int $length

+ * The length of data to read, in bytes. + *

+ * @return string the contents as a string, or FALSE on failure. + */ + public function read ($length) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Tests for end-of-file on a large object's descriptor + * @link http://php.net/manual/en/oci-lob.eof.php + * @return bool TRUE if internal pointer of large object is at the end of LOB. + * Otherwise returns FALSE. + */ + public function eof () {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Sets the internal pointer of the large object + * @link http://php.net/manual/en/oci-lob.seek.php + * @param int $offset

+ * Indicates the amount of bytes, on which internal pointer should be + * moved from the position, pointed by whence. + *

+ * @param int $whence [optional]

+ * May be one of: + * OCI_SEEK_SET - sets the position equal to + * offset + * OCI_SEEK_CUR - adds offset + * bytes to the current position + * OCI_SEEK_END - adds offset + * bytes to the end of large object (use negative value to move to a position + * before the end of large object) + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function seek ($offset, $whence = 'OCI_SEEK_SET') {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Writes data to the large object + * @link http://php.net/manual/en/oci-lob.write.php + * @param string $data

+ * The data to write in the LOB. + *

+ * @param int $length [optional]

+ * If this parameter is given, writing will stop after + * length bytes have been written or the end of + * data is reached, whichever comes first. + *

+ * @return int the number of bytes written or FALSE on failure. + */ + public function write ($data, $length = null) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Appends data from the large object to another large object + * @link http://php.net/manual/en/oci-lob.append.php + * @param OCI_Lob $lob_from

+ * The copied LOB. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function append (OCI_Lob $lob_from) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns size of large object + * @link http://php.net/manual/en/oci-lob.size.php + * @return int length of large object value or FALSE on failure. + * Empty objects have zero length. + */ + public function size () {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Alias of OCI-Lob::export + * @link http://php.net/manual/en/oci-lob.writetofile.php + * @param $filename + * @param $start [optional] + * @param $length [optional] + */ + public function writetofile ($filename, $start, $length) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Exports LOB's contents to a file + * @link http://php.net/manual/en/oci-lob.export.php + * @param string $filename

+ * Path to the file. + *

+ * @param int $start [optional]

+ * Indicates from where to start exporting. + *

+ * @param int $length [optional]

+ * Indicates the length of data to be exported. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function export ($filename, $start = null, $length = null) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Imports file data to the LOB + * @link http://php.net/manual/en/oci-lob.import.php + * @param string $filename

+ * Path to the file. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function import ($filename) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Writes a temporary large object + * @link http://php.net/manual/en/oci-lob.writetemporary.php + * @param string $data

+ * The data to write. + *

+ * @param int $lob_type [optional]

+ * Can be one of the following: + * OCI_TEMP_BLOB is used to create temporary BLOBs + * OCI_TEMP_CLOB is used to create + * temporary CLOBs + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writetemporary ($data, $lob_type = 'OCI_TEMP_CLOB') {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Closes LOB descriptor + * @link http://php.net/manual/en/oci-lob.close.php + * @return bool TRUE on success or FALSE on failure. + */ + public function close () {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Saves data to the large object + * @link http://php.net/manual/en/oci-lob.save.php + * @param string $data

+ * The data to be saved. + *

+ * @param int $offset [optional]

+ * Can be used to indicate offset from the beginning of the large object. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function save ($data, $offset = null) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Alias of OCI-Lob::import + * @link http://php.net/manual/en/oci-lob.savefile.php + * @param $filename + */ + public function savefile ($filename) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Frees resources associated with the LOB descriptor + * @link http://php.net/manual/en/oci-lob.free.php + * @return bool TRUE on success or FALSE on failure. + */ + public function free () {} + +} + +/** @jms-builtin */ +class OCI_Collection { + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Appends element to the collection + * @link http://php.net/manual/en/oci-collection.append.php + * @param mixed $value

+ * The value to be added to the collection. Can be a string or a number. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function append ($value) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns value of the element + * @link http://php.net/manual/en/oci-collection.getelem.php + * @param int $index

+ * The element index. First index is 0. + *

+ * @return mixed FALSE if such element doesn't exist; NULL if element is NULL; + * string if element is column of a string datatype or number if element is + * numeric field. + */ + public function getelem ($index) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Assigns a value to the element of the collection + * @link http://php.net/manual/en/oci-collection.assignelem.php + * @param int $index

+ * The element index. First index is 0. + *

+ * @param mixed $value

+ * Can be a string or a number. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function assignelem ($index, $value) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Assigns a value to the collection from another existing collection + * @link http://php.net/manual/en/oci-collection.assign.php + * @param OCI_Collection $from

+ * An instance of OCI-Collection. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function assign (OCI_Collection $from) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns size of the collection + * @link http://php.net/manual/en/oci-collection.size.php + * @return int the number of elements in the collection or FALSE on error. + */ + public function size () {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the maximum number of elements in the collection + * @link http://php.net/manual/en/oci-collection.max.php + * @return int the maximum number as an integer, or FALSE on errors. + *

+ *

+ * If the returned value is 0, then the number of elements is not limited. + */ + public function max () {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Trims elements from the end of the collection + * @link http://php.net/manual/en/oci-collection.trim.php + * @param int $num

+ * The number of elements to be trimmed. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function trim ($num) {} + + /** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Frees the resources associated with the collection object + * @link http://php.net/manual/en/oci-collection.free.php + * @return bool TRUE on success or FALSE on failure. + */ + public function free () {} + +} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Associates a PHP variable with a column for query fetches + * @link http://php.net/manual/en/function.oci-define-by-name.php + * @param resource $statement A valid OCI8 statement + * identifier created by oci_parse and executed + * by oci_execute, or a REF + * CURSOR statement identifier.

+ * @param string $column_name

+ * The column name used in the query. + *

+ *

+ * Use uppercase for Oracle's default, non-case sensitive column + * names. Use the exact column name case for case-sensitive + * column names. + *

+ * @param mixed $variable

+ * The PHP variable that will contain the returned column value. + *

+ * @param int $type [optional]

+ * The data type to be returned. Generally not needed. Note that + * Oracle-style data conversions are not performed. For example, + * SQLT_INT will be ignored and the returned + * data type will still be SQLT_CHR. + *

+ *

+ * You can optionally use oci_new_descriptor + * to allocate LOB/ROWID/BFILE descriptors. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_define_by_name ($statement, $column_name, &$variable, $type = 'SQLT_CHR') {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Binds a PHP variable to an Oracle placeholder + * @link http://php.net/manual/en/function.oci-bind-by-name.php + * @param resource $statement

+ * A valid OCI8 statement identifer. + *

+ * @param string $bv_name

+ * The colon-prefixed bind variable placeholder used in the + * statement. The colon is optional + * in bv_name. Oracle does not use question + * marks for placeholders. + *

+ * @param mixed $variable

+ * The PHP variable to be associated with bv_name + *

+ * @param int $maxlength [optional]

+ * Sets the maximum length for the data. If you set it to -1, this + * function will use the current length + * of variable to set the maximum + * length. In this case the variable must + * exist and contain data + * when oci_bind_by_name is called. + *

+ * @param int $type [optional]

+ * The datatype that Oracle will treat the data as. The + * default type used + * is SQLT_CHR. Oracle will convert the data + * between this type and the database column (or PL/SQL variable + * type), when possible. + *

+ *

+ * If you need to bind an abstract datatype (LOB/ROWID/BFILE) you + * need to allocate it first using the + * oci_new_descriptor function. The + * length is not used for abstract datatypes + * and should be set to -1. + *

+ *

+ * Possible values for type are: + *

+ * SQLT_BFILEE or OCI_B_BFILE + * - for BFILEs; + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_bind_by_name ($statement, $bv_name, &$variable, $maxlength = -1, $type = 'SQLT_CHR') {} + +/** + * (PHP 5 >= 5.1.2, PECL OCI8 >= 1.2.0)
+ * Binds a PHP array to an Oracle PL/SQL array parameter + * @link http://php.net/manual/en/function.oci-bind-array-by-name.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @param string $name

+ * The Oracle placeholder. + *

+ * @param array $var_array

+ * An array. + *

+ * @param int $max_table_length

+ * Sets the maximum length both for incoming and result arrays. + *

+ * @param int $max_item_length [optional]

+ * Sets maximum length for array items. If not specified or equals to -1, + * oci_bind_array_by_name will find the longest + * element in the incoming array and will use it as the maximum length. + *

+ * @param int $type [optional]

+ * Should be used to set the type of PL/SQL array items. See list of + * available types below: + *

+ *

+ *

+ * SQLT_NUM - for arrays of NUMBER. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_bind_array_by_name ($statement, $name, array &$var_array, $max_table_length, $max_item_length = -1, $type = 'SQLT_AFC') {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Checks if the field is NULL + * @link http://php.net/manual/en/function.oci-field-is-null.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @param mixed $field

+ * Can be a field's index or a field's name (uppercased). + *

+ * @return bool TRUE if field is NULL, FALSE otherwise. + * @jms-builtin + */ +function oci_field_is_null ($statement, $field) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the name of a field from the statement + * @link http://php.net/manual/en/function.oci-field-name.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @param int $field

+ * Can be the field's index (1-based) or name. + *

+ * @return string the name as a string, or FALSE on errors. + * @jms-builtin + */ +function oci_field_name ($statement, $field) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns field's size + * @link http://php.net/manual/en/function.oci-field-size.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @param mixed $field

+ * Can be the field's index (1-based) or name. + *

+ * @return int the size of a field in bytes, or FALSE on + * errors. + * @jms-builtin + */ +function oci_field_size ($statement, $field) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Tell the scale of the field + * @link http://php.net/manual/en/function.oci-field-scale.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @param int $field

+ * Can be the field's index (1-based) or name. + *

+ * @return int the scale as an integer, or FALSE on errors. + * @jms-builtin + */ +function oci_field_scale ($statement, $field) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Tell the precision of a field + * @link http://php.net/manual/en/function.oci-field-precision.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @param int $field

+ * Can be the field's index (1-based) or name. + *

+ * @return int the precision as an integer, or FALSE on errors. + * @jms-builtin + */ +function oci_field_precision ($statement, $field) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns field's data type + * @link http://php.net/manual/en/function.oci-field-type.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @param int $field

+ * Can be the field's index (1-based) or name. + *

+ * @return mixed the field data type as a string, or FALSE on errors. + * @jms-builtin + */ +function oci_field_type ($statement, $field) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Tell the raw Oracle data type of the field + * @link http://php.net/manual/en/function.oci-field-type-raw.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @param int $field

+ * Can be the field's index (1-based) or name. + *

+ * @return int Oracle's raw data type as a string, or FALSE on errors. + * @jms-builtin + */ +function oci_field_type_raw ($statement, $field) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Executes a statement + * @link http://php.net/manual/en/function.oci-execute.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @param int $mode [optional]

+ * An optional second parameter can be one of the following constants: + * + * Execution Modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
OCI_COMMIT_ON_SUCCESSAutomatically commit all outstanding changes for + * this connection when the statement has succeeded. This + * is the default.
OCI_DEFAULTObsolete as of PHP 5.3.2 (PECL OCI8 1.4) but still + * available for backward compatibility. Use the + * equivalent OCI_NO_AUTO_COMMIT in new + * code.
OCI_DESCRIBE_ONLYMake query meta data available to functions + * like oci_field_name but do not + * create a result set. Any subsequent fetch call such + * as oci_fetch_array will + * fail.
OCI_NO_AUTO_COMMITDo not automatically commit changes. Prior to PHP + * 5.3.2 (PECL OCI8 1.4) + * use OCI_DEFAULT which is an alias + * for OCI_NO_AUTO_COMMIT.
+ *

+ *

+ * Using OCI_NO_AUTO_COMMIT mode starts a + * transaction. Transactions are automatically rolled back when + * the connection is closed, or when the script ends. Explicitly + * call oci_commit to commit a transaction, + * or oci_rollback to abort it. + *

+ *

+ * When inserting or updating data, using transactions is + * recommended for relational data consistency and for performance + * reasons. + *

+ *

+ * If OCI_NO_AUTO_COMMIT mode is used for any + * statement including queries, and + * oci_commit + * or oci_rollback is not subsequently + * called, then OCI8 will perform a rollback at the end of the + * script even if no data was changed. To avoid an unnecessary + * rollback, many scripts do not + * use OCI_NO_AUTO_COMMIT mode for queries or + * PL/SQL. Be careful to ensure the appropriate transactional + * consistency for the application when + * using oci_execute with different modes in + * the same script. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_execute ($statement, $mode = 'OCI_COMMIT_ON_SUCCESS') {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Cancels reading from cursor + * @link http://php.net/manual/en/function.oci-cancel.php + * @param resource $statement

+ * An OCI statement. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_cancel ($statement) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Fetches the next row from a query into internal buffers + * @link http://php.net/manual/en/function.oci-fetch.php + * @param resource $statement A valid OCI8 statement + * identifier created by oci_parse and executed + * by oci_execute, or a REF + * CURSOR statement identifier.

+ * @return bool TRUE on success or FALSE if there are no more rows in the + * statement. + * @jms-builtin + */ +function oci_fetch ($statement) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the next row from a query as an object + * @link http://php.net/manual/en/function.oci-fetch-object.php + * @param resource $statement A valid OCI8 statement + * identifier created by oci_parse and executed + * by oci_execute, or a REF + * CURSOR statement identifier.

+ * @return object an object. Each attribute of the object corresponds to a + * column of the row. If there are no more rows in + * the statement then FALSE is returned. + *

+ *

+ * Any LOB columns are returned as LOB descriptors. + *

+ *

+ * DATE columns are returned as strings formatted + * to the current date format. The default format can be changed with + * Oracle environment variables such as NLS_LANG or + * by a previously executed ALTER SESSION SET + * NLS_DATE_FORMAT command. + *

+ *

+ * Oracle's default, non-case sensitive column names will have + * uppercase attribute names. Case-sensitive column names will have + * attribute names using the exact column case. + * Use var_dump on the result object to verify + * the appropriate case to use for each query. + *

+ *

+ * Attribute values will be NULL for any NULL + * data fields. + * @jms-builtin + */ +function oci_fetch_object ($statement) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the next row from a query as a numeric array + * @link http://php.net/manual/en/function.oci-fetch-row.php + * @param resource $statement A valid OCI8 statement + * identifier created by oci_parse and executed + * by oci_execute, or a REF + * CURSOR statement identifier.

+ * @return array a numerically indexed array. If there are no more rows in + * the statement then FALSE is returned. + * @jms-builtin + */ +function oci_fetch_row ($statement) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the next row from a query as an associative array + * @link http://php.net/manual/en/function.oci-fetch-assoc.php + * @param resource $statement A valid OCI8 statement + * identifier created by oci_parse and executed + * by oci_execute, or a REF + * CURSOR statement identifier.

+ * @return array an associative array. If there are no more rows in + * the statement then FALSE is returned. + * @jms-builtin + */ +function oci_fetch_assoc ($statement) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the next row from a query as an associative or numeric array + * @link http://php.net/manual/en/function.oci-fetch-array.php + * @param resource $statement A valid OCI8 statement + * identifier created by oci_parse and executed + * by oci_execute, or a REF + * CURSOR statement identifier.

+ * @param int $mode [optional]

+ * An optional second parameter can be any combination of the following + * constants: + * + * oci_fetch_array Modes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
OCI_BOTHReturns an array with both associative and numeric + * indices. This is the same + * as OCI_ASSOC + * + OCI_NUM and is the default + * behavior.
OCI_ASSOCReturns an associative array.
OCI_NUMReturns a numeric array.
OCI_RETURN_NULLSCreates elements for NULL fields. The element + * values will be a PHP NULL. + *
OCI_RETURN_LOBSReturns the contents of LOBs instead of the LOB + * descriptors.
+ *

+ *

+ * The default mode is OCI_BOTH. + *

+ *

+ * Use the addition operator "+" to specify more than + * one mode at a time. + *

+ * @return array an array with associative and/or numeric indices. If there + * are no more rows in the statement then + * FALSE is returned. + *

+ *

+ * By default, LOB columns are returned as LOB descriptors. + *

+ *

+ * DATE columns are returned as strings formatted + * to the current date format. The default format can be changed with + * Oracle environment variables such as NLS_LANG or + * by a previously executed ALTER SESSION SET + * NLS_DATE_FORMAT command. + *

+ *

+ * Oracle's default, non-case sensitive column names will have + * uppercase associative indices in the result array. Case-sensitive + * column names will have array indices using the exact column case. + * Use var_dump on the result array to verify the + * appropriate case to use for each query. + * @jms-builtin + */ +function oci_fetch_array ($statement, $mode = null) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Fetches the next row into an array (deprecated) + * @link http://php.net/manual/en/function.ocifetchinto.php + * @jms-builtin + */ +function ocifetchinto ($statement, array &$result, $mode = 'OCI_ASSOC + OCI_NUM') {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Fetches multiple rows from a query into a two-dimensional array + * @link http://php.net/manual/en/function.oci-fetch-all.php + * @param resource $statement A valid OCI8 statement + * identifier created by oci_parse and executed + * by oci_execute, or a REF + * CURSOR statement identifier.

+ * @param array $output

+ * The variable to contain the returned rows. + *

+ *

+ * LOB columns are returned as strings, where Oracle supports + * conversion. + *

+ *

+ * See oci_fetch_array for more information + * on how data and types are fetched. + *

+ * @param int $skip [optional]

+ * The number of initial rows to discard when fetching the + * result. The default value is 0, so the first row onwards is + * returned. + *

+ * @param int $maxrows [optional]

+ * The number of rows to return. The default is -1 meaning return + * all the rows from skip + 1 onwards. + *

+ * @param int $flags [optional]

+ * Parameter flags indicates the array + * structure and whether associative arrays should be used. + * + * oci_fetch_all Array Structure Modes + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
OCI_FETCHSTATEMENT_BY_ROWThe outer array will contain one sub-array per query + * row.
OCI_FETCHSTATEMENT_BY_COLUMNThe outer array will contain one sub-array per query + * column. This is the default.
+ *

+ *

+ * Arrays can be indexed by column heading or numerically. + * + * oci_fetch_all Array Index Modes + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
OCI_NUMNumeric indexes are used for each column's array.
OCI_ASSOCAssociative indexes are used for each column's + * array. This is the default.
+ *

+ *

+ * Use the addition operator "+" to choose a combination + * of array structure and index modes. + *

+ *

+ * Oracle's default, non-case sensitive column names will have + * uppercase array keys. Case-sensitive column names will have + * array keys using the exact column case. + * Use var_dump + * on output to verify the appropriate case + * to use for each query. + *

+ *

+ * Queries that have more than one column with the same name + * should use column aliases. Otherwise only one of the columns + * will appear in an associative array. + *

+ * @return int the number of rows in output, which + * may be 0 or more, or FALSE on failure. + * @jms-builtin + */ +function oci_fetch_all ($statement, array &$output, $skip = 0, $maxrows = -1, $flags = 'OCI_FETCHSTATEMENT_BY_COLUMN + OCI_ASSOC') {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Frees all resources associated with statement or cursor + * @link http://php.net/manual/en/function.oci-free-statement.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_free_statement ($statement) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Enables or disables internal debug output + * @link http://php.net/manual/en/function.oci-internal-debug.php + * @param bool $onoff

+ * Set this to FALSE to turn debug output off or TRUE to turn it on. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function oci_internal_debug ($onoff) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the number of result columns in a statement + * @link http://php.net/manual/en/function.oci-num-fields.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @return int the number of columns as an integer, or FALSE on errors. + * @jms-builtin + */ +function oci_num_fields ($statement) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Prepares an Oracle statement for execution + * @link http://php.net/manual/en/function.oci-parse.php + * @param resource $connection

+ * An Oracle connection identifier, returned by + * oci_connect, oci_pconnect, or oci_new_connect. + *

+ * @param string $sql_text

+ * The SQL or PL/SQL statement. + *

+ *

+ * SQL statements should not end with a + * semi-colon (";"). PL/SQL + * statements should end with a semi-colon + * (";"). + *

+ * @return resource a statement handle on success, or FALSE on error. + * @jms-builtin + */ +function oci_parse ($connection, $sql_text) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Allocates and returns a new cursor (statement handle) + * @link http://php.net/manual/en/function.oci-new-cursor.php + * @param resource $connection

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @return resource a new statement handle, or FALSE on error. + * @jms-builtin + */ +function oci_new_cursor ($connection) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns field's value from the fetched row + * @link http://php.net/manual/en/function.oci-result.php + * @param resource $statement + * @param mixed $field

+ * Can be either use the column number (1-based) or the column name (in + * uppercase). + *

+ * @return mixed everything as strings except for abstract types (ROWIDs, LOBs and + * FILEs). Returns FALSE on error. + * @jms-builtin + */ +function oci_result ($statement, $field) {} + +/** + * (PHP 5.3.7, PECL OCI8 >= 1.4.6)
+ * Returns the Oracle client library version + * @link http://php.net/manual/en/function.oci-client-version.php + * @return string the version number as a string. + * @jms-builtin + */ +function oci_client_version () {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the Oracle Database version + * @link http://php.net/manual/en/function.oci-server-version.php + * @param resource $connection + * @return string the version information as a string or FALSE on error. + * @jms-builtin + */ +function oci_server_version ($connection) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the type of a statement + * @link http://php.net/manual/en/function.oci-statement-type.php + * @param resource $statement

+ * A valid OCI8 statement identifier from oci_parse. + *

+ * @return string the type of statement as one of the + * following strings. + * + * Statement type + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Return StringNotes
ALTER
BEGIN
CALLIntroduced in PHP 5.2.1 (PECL OCI8 1.2.3)
CREATE
DECLARE
DELETE
DROP
INSERT
SELECT
UPDATE
UNKNOWN
+ *

+ *

+ * Returns FALSE on error. + * @jms-builtin + */ +function oci_statement_type ($statement) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns number of rows affected during statement execution + * @link http://php.net/manual/en/function.oci-num-rows.php + * @param resource $statement

+ * A valid OCI statement identifier. + *

+ * @return int the number of rows affected as an integer, or FALSE on errors. + * @jms-builtin + */ +function oci_num_rows ($statement) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Closes an Oracle connection + * @link http://php.net/manual/en/function.oci-close.php + * @param resource $connection

+ * An Oracle connection identifier returned by + * oci_connect, oci_pconnect, + * or oci_new_connect. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_close ($connection) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Connect to an Oracle database + * @link http://php.net/manual/en/function.oci-connect.php + * @param string $username

+ * The Oracle user name. + *

+ * @param string $password

+ * The password for username. + *

+ * @param string $connection_string [optional] Contains + * the Oracle instance to connect to. It can be + * an Easy Connect + * string, or a Connect Name from + * the tnsnames.ora file, or the name of a local + * Oracle instance. + *

+ * If not specified, PHP uses + * environment variables such as TWO_TASK (on Linux) + * or LOCAL (on Windows) + * and ORACLE_SID to determine the + * Oracle instance to connect to. + *

+ * To use the Easy Connect naming method, PHP must be linked with Oracle + * 10g or greater Client libraries. The Easy Connect string for Oracle + * 10g is of the form: + * [//]host_name[:port][/service_name]. With Oracle + * 11g, the syntax is: + * [//]host_name[:port][/service_name][:server_type][/instance_name]. + * Service names can be found by running the Oracle + * utility lsnrctl status on the database server + * machine. + *

+ * The tnsnames.ora file can be in the Oracle Net + * search path, which + * includes $ORACLE_HOME/network/admin + * and /etc. Alternatively + * set TNS_ADMIN so + * that $TNS_ADMIN/tnsnames.ora is read. Make sure + * the web daemon has read access to the file. + *

+ * @param string $character_set [optional] Determines + * the character set used by the Oracle Client libraries. The character + * set does not need to match the character set used by the database. If + * it doesn't match, Oracle will do its best to convert data to and from + * the database character set. Depending on the character sets this may + * not give usable results. Conversion also adds some time overhead. + *

+ * If not specified, the + * Oracle Client libraries determine a character set from + * the NLS_LANG environment variable. + *

+ * Passing this parameter can + * reduce connection time. + *

+ * @param int $session_mode [optional] This + * parameter is available since version PHP 5 (PECL OCI8 1.1) and accepts the + * following values: OCI_DEFAULT, + * OCI_SYSOPER and OCI_SYSDBA. + * If either OCI_SYSOPER or + * OCI_SYSDBA were specified, this function will try + * to establish privileged connection using external credentials. + * Privileged connections are disabled by default. To enable them you + * need to set oci8.privileged_connect + * to On. + *

+ * PHP 5.3 (PECL OCI8 1.3.4) introduced the + * OCI_CRED_EXT mode value. This tells Oracle to use + * External or OS authentication, which must be configured in the + * database. The OCI_CRED_EXT flag can only be used + * with username of "/" and a empty password. + * oci8.privileged_connect + * may be On or Off. + *

+ * OCI_CRED_EXT may be combined with the + * OCI_SYSOPER or + * OCI_SYSDBA modes. + *

+ * OCI_CRED_EXT is not supported on Windows for + * security reasons. + *

+ * @return resource a connection identifier or FALSE on error. + * @jms-builtin + */ +function oci_connect ($username, $password, $connection_string = null, $character_set = null, $session_mode = null) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Connect to the Oracle server using a unique connection + * @link http://php.net/manual/en/function.oci-new-connect.php + * @param string $username

+ * The Oracle user name. + *

+ * @param string $password

+ * The password for username. + *

+ * @param string $connection_string [optional] Contains + * the Oracle instance to connect to. It can be + * an Easy Connect + * string, or a Connect Name from + * the tnsnames.ora file, or the name of a local + * Oracle instance. + *

+ * If not specified, PHP uses + * environment variables such as TWO_TASK (on Linux) + * or LOCAL (on Windows) + * and ORACLE_SID to determine the + * Oracle instance to connect to. + *

+ * To use the Easy Connect naming method, PHP must be linked with Oracle + * 10g or greater Client libraries. The Easy Connect string for Oracle + * 10g is of the form: + * [//]host_name[:port][/service_name]. With Oracle + * 11g, the syntax is: + * [//]host_name[:port][/service_name][:server_type][/instance_name]. + * Service names can be found by running the Oracle + * utility lsnrctl status on the database server + * machine. + *

+ * The tnsnames.ora file can be in the Oracle Net + * search path, which + * includes $ORACLE_HOME/network/admin + * and /etc. Alternatively + * set TNS_ADMIN so + * that $TNS_ADMIN/tnsnames.ora is read. Make sure + * the web daemon has read access to the file. + *

+ * @param string $character_set [optional] Determines + * the character set used by the Oracle Client libraries. The character + * set does not need to match the character set used by the database. If + * it doesn't match, Oracle will do its best to convert data to and from + * the database character set. Depending on the character sets this may + * not give usable results. Conversion also adds some time overhead. + *

+ * If not specified, the + * Oracle Client libraries determine a character set from + * the NLS_LANG environment variable. + *

+ * Passing this parameter can + * reduce connection time. + *

+ * @param int $session_mode [optional] This + * parameter is available since version PHP 5 (PECL OCI8 1.1) and accepts the + * following values: OCI_DEFAULT, + * OCI_SYSOPER and OCI_SYSDBA. + * If either OCI_SYSOPER or + * OCI_SYSDBA were specified, this function will try + * to establish privileged connection using external credentials. + * Privileged connections are disabled by default. To enable them you + * need to set oci8.privileged_connect + * to On. + *

+ * PHP 5.3 (PECL OCI8 1.3.4) introduced the + * OCI_CRED_EXT mode value. This tells Oracle to use + * External or OS authentication, which must be configured in the + * database. The OCI_CRED_EXT flag can only be used + * with username of "/" and a empty password. + * oci8.privileged_connect + * may be On or Off. + *

+ * OCI_CRED_EXT may be combined with the + * OCI_SYSOPER or + * OCI_SYSDBA modes. + *

+ * OCI_CRED_EXT is not supported on Windows for + * security reasons. + *

+ * @return resource a connection identifier or FALSE on error. + * @jms-builtin + */ +function oci_new_connect ($username, $password, $connection_string = null, $character_set = null, $session_mode = null) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Connect to an Oracle database using a persistent connection + * @link http://php.net/manual/en/function.oci-pconnect.php + * @param string $username

+ * The Oracle user name. + *

+ * @param string $password

+ * The password for username. + *

+ * @param string $connection_string [optional] Contains + * the Oracle instance to connect to. It can be + * an Easy Connect + * string, or a Connect Name from + * the tnsnames.ora file, or the name of a local + * Oracle instance. + *

+ * If not specified, PHP uses + * environment variables such as TWO_TASK (on Linux) + * or LOCAL (on Windows) + * and ORACLE_SID to determine the + * Oracle instance to connect to. + *

+ * To use the Easy Connect naming method, PHP must be linked with Oracle + * 10g or greater Client libraries. The Easy Connect string for Oracle + * 10g is of the form: + * [//]host_name[:port][/service_name]. With Oracle + * 11g, the syntax is: + * [//]host_name[:port][/service_name][:server_type][/instance_name]. + * Service names can be found by running the Oracle + * utility lsnrctl status on the database server + * machine. + *

+ * The tnsnames.ora file can be in the Oracle Net + * search path, which + * includes $ORACLE_HOME/network/admin + * and /etc. Alternatively + * set TNS_ADMIN so + * that $TNS_ADMIN/tnsnames.ora is read. Make sure + * the web daemon has read access to the file. + *

+ * @param string $character_set [optional] Determines + * the character set used by the Oracle Client libraries. The character + * set does not need to match the character set used by the database. If + * it doesn't match, Oracle will do its best to convert data to and from + * the database character set. Depending on the character sets this may + * not give usable results. Conversion also adds some time overhead. + *

+ * If not specified, the + * Oracle Client libraries determine a character set from + * the NLS_LANG environment variable. + *

+ * Passing this parameter can + * reduce connection time. + *

+ * @param int $session_mode [optional] This + * parameter is available since version PHP 5 (PECL OCI8 1.1) and accepts the + * following values: OCI_DEFAULT, + * OCI_SYSOPER and OCI_SYSDBA. + * If either OCI_SYSOPER or + * OCI_SYSDBA were specified, this function will try + * to establish privileged connection using external credentials. + * Privileged connections are disabled by default. To enable them you + * need to set oci8.privileged_connect + * to On. + *

+ * PHP 5.3 (PECL OCI8 1.3.4) introduced the + * OCI_CRED_EXT mode value. This tells Oracle to use + * External or OS authentication, which must be configured in the + * database. The OCI_CRED_EXT flag can only be used + * with username of "/" and a empty password. + * oci8.privileged_connect + * may be On or Off. + *

+ * OCI_CRED_EXT may be combined with the + * OCI_SYSOPER or + * OCI_SYSDBA modes. + *

+ * OCI_CRED_EXT is not supported on Windows for + * security reasons. + *

+ * @return resource a connection identifier or FALSE on error. + * @jms-builtin + */ +function oci_pconnect ($username, $password, $connection_string = null, $character_set = null, $session_mode = null) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Returns the last error found + * @link http://php.net/manual/en/function.oci-error.php + * @param resource $resource [optional]

+ * For most errors, resource is the + * resource handle that was passed to the failing function call. + * For connection errors with oci_connect, + * oci_new_connect or + * oci_pconnect do not pass resource. + *

+ * @return array If no error is found, oci_error returns + * FALSE. Otherwise, oci_error returns the + * error information as an associative array. + *

+ *

+ * + * oci_error Array Description + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Array keyTypeDescription
codeinteger + * The Oracle error number. + *
messagestring + * The Oracle error text. + *
offsetinteger + * The byte position of an error in the SQL statement. If there + * was no statement, this is 0 + *
sqltextstring + * The SQL statement text. If there was no statement, this is + * an empty string. + *
+ * @jms-builtin + */ +function oci_error ($resource = null) {} + +/** + * @param $lob_descriptor + * @jms-builtin + */ +function oci_free_descriptor ($lob_descriptor) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Compares two LOB/FILE locators for equality + * @link http://php.net/manual/en/function.oci-lob-is-equal.php + * @param OCI_Lob $lob1

+ * A LOB identifier. + *

+ * @param OCI_Lob $lob2

+ * A LOB identifier. + *

+ * @return bool TRUE if these objects are equal, FALSE otherwise. + * @jms-builtin + */ +function oci_lob_is_equal (OCI_Lob $lob1, OCI_Lob $lob2) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Copies large object + * @link http://php.net/manual/en/function.oci-lob-copy.php + * @param OCI_Lob $lob_to

+ * The destination LOB. + *

+ * @param OCI_Lob $lob_from

+ * The copied LOB. + *

+ * @param int $length [optional]

+ * Indicates the length of data to be copied. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_lob_copy (OCI_Lob $lob_to, OCI_Lob $lob_from, $length = 0) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Commits the outstanding database transaction + * @link http://php.net/manual/en/function.oci-commit.php + * @param resource $connection

+ * An Oracle connection identifier, returned by + * oci_connect, oci_pconnect, or oci_new_connect. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_commit ($connection) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Rolls back the outstanding database transaction + * @link http://php.net/manual/en/function.oci-rollback.php + * @param resource $connection

+ * An Oracle connection identifier, returned by + * oci_connect, oci_pconnect + * or oci_new_connect. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_rollback ($connection) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Initializes a new empty LOB or FILE descriptor + * @link http://php.net/manual/en/function.oci-new-descriptor.php + * @param resource $connection

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param int $type [optional]

+ * Valid values for type are: + * OCI_DTYPE_FILE, OCI_DTYPE_LOB and + * OCI_DTYPE_ROWID. + *

+ * @return OCI_Lob a new LOB or FILE descriptor on success, FALSE on error. + * @jms-builtin + */ +function oci_new_descriptor ($connection, $type = 'OCI_DTYPE_LOB') {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Sets number of rows to be prefetched by queries + * @link http://php.net/manual/en/function.oci-set-prefetch.php + * @param resource $statement A valid OCI8 statement + * identifier created by oci_parse and executed + * by oci_execute, or a REF + * CURSOR statement identifier.

+ * @param int $rows

+ * The number of rows to be prefetched, >= 0 + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_set_prefetch ($statement, $rows) {} + +/** + * (PHP 5.3.2, PECL OCI8 >= 1.4.0)
+ * Sets the client identifier + * @link http://php.net/manual/en/function.oci-set-client-identifier.php + * @param resource $connection An Oracle connection identifier, + * returned by oci_connect, oci_pconnect, + * or oci_new_connect.

+ * @param string $client_identifier

+ * User chosen string up to 64 bytes long. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_set_client_identifier ($connection, $client_identifier) {} + +/** + * (PHP 5.3.2, PECL OCI8 >= 1.4.0)
+ * Sets the database edition + * @link http://php.net/manual/en/function.oci-set-edition.php + * @param string $edition

+ * Oracle Database edition name previously created with the SQL + * "CREATE EDITION" command. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_set_edition ($edition) {} + +/** + * (PHP 5.3.2, PECL OCI8 >= 1.4.0)
+ * Sets the module name + * @link http://php.net/manual/en/function.oci-set-module-name.php + * @param resource $connection An Oracle connection identifier, + * returned by oci_connect, oci_pconnect, + * or oci_new_connect.

+ * @param string $module_name

+ * User chosen string up to 48 bytes long. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_set_module_name ($connection, $module_name) {} + +/** + * (PHP 5.3.2, PECL OCI8 >= 1.4.0)
+ * Sets the action name + * @link http://php.net/manual/en/function.oci-set-action.php + * @param resource $connection An Oracle connection identifier, + * returned by oci_connect, oci_pconnect, + * or oci_new_connect.

+ * @param string $action_name

+ * User chosen string up to 32 bytes long. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_set_action ($connection, $action_name) {} + +/** + * (PHP 5.3.2, PECL OCI8 >= 1.4.0)
+ * Sets the client information + * @link http://php.net/manual/en/function.oci-set-client-info.php + * @param resource $connection + * @param string $client_info + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_set_client_info ($connection, $client_info) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Changes password of Oracle's user + * @link http://php.net/manual/en/function.oci-password-change.php + * @param resource $connection

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param string $username

+ * The Oracle user name. + *

+ * @param string $old_password

+ * The old password. + *

+ * @param string $new_password

+ * The new password to be set. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function oci_password_change ($connection, $username, $old_password, $new_password) {} + +/** + * (PHP 5, PECL OCI8 >= 1.1.0)
+ * Allocates new collection object + * @link http://php.net/manual/en/function.oci-new-collection.php + * @param resource $connection

+ * An Oracle connection identifier, returned by + * oci_connect or oci_pconnect. + *

+ * @param string $tdo

+ * Should be a valid named type (uppercase). + *

+ * @param string $schema [optional]

+ * Should point to the scheme, where the named type was created. The name + * of the current user is the default value. + *

+ * @return OCI_Collection a new OCICollection object or FALSE on + * error. + * @jms-builtin + */ +function oci_new_collection ($connection, $tdo, $schema = null) {} + +/** + * @param $statement_resource + * @jms-builtin + */ +function oci_free_cursor ($statement_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_free_statement + * @link http://php.net/manual/en/function.ocifreecursor.php + * @jms-builtin + */ +function ocifreecursor ($statement_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_bind_by_name + * @link http://php.net/manual/en/function.ocibindbyname.php + * @jms-builtin + */ +function ocibindbyname ($statement_resource, $column_name, &$variable, $maximum_length, $type) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_define_by_name + * @link http://php.net/manual/en/function.ocidefinebyname.php + * @jms-builtin + */ +function ocidefinebyname ($statement_resource, $column_name, &$variable, $type) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_field_is_null + * @link http://php.net/manual/en/function.ocicolumnisnull.php + * @jms-builtin + */ +function ocicolumnisnull ($statement_resource, $column_number_or_name) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_field_name + * @link http://php.net/manual/en/function.ocicolumnname.php + * @jms-builtin + */ +function ocicolumnname ($statement_resource, $column_number) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_field_size + * @link http://php.net/manual/en/function.ocicolumnsize.php + * @jms-builtin + */ +function ocicolumnsize ($statement_resource, $column_number_or_name) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_field_scale + * @link http://php.net/manual/en/function.ocicolumnscale.php + * @jms-builtin + */ +function ocicolumnscale ($statement_resource, $column_number) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_field_precision + * @link http://php.net/manual/en/function.ocicolumnprecision.php + * @jms-builtin + */ +function ocicolumnprecision ($statement_resource, $column_number) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_field_type + * @link http://php.net/manual/en/function.ocicolumntype.php + * @jms-builtin + */ +function ocicolumntype ($statement_resource, $column_number) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_field_type_raw + * @link http://php.net/manual/en/function.ocicolumntyperaw.php + * @jms-builtin + */ +function ocicolumntyperaw ($statement_resource, $column_number) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_execute + * @link http://php.net/manual/en/function.ociexecute.php + * @jms-builtin + */ +function ociexecute ($statement_resource, $mode) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_cancel + * @link http://php.net/manual/en/function.ocicancel.php + * @jms-builtin + */ +function ocicancel ($statement_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_fetch + * @link http://php.net/manual/en/function.ocifetch.php + * @jms-builtin + */ +function ocifetch ($statement_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_fetch_all + * @link http://php.net/manual/en/function.ocifetchstatement.php + * @jms-builtin + */ +function ocifetchstatement ($statement_resource, &$output, $skip, $maximum_rows, $flags) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_free_statement + * @link http://php.net/manual/en/function.ocifreestatement.php + * @jms-builtin + */ +function ocifreestatement ($statement_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_internal_debug + * @link http://php.net/manual/en/function.ociinternaldebug.php + * @jms-builtin + */ +function ociinternaldebug ($mode) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_num_fields + * @link http://php.net/manual/en/function.ocinumcols.php + * @jms-builtin + */ +function ocinumcols ($statement_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_parse + * @link http://php.net/manual/en/function.ociparse.php + * @jms-builtin + */ +function ociparse ($connection_resource, $sql_text) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_new_cursor + * @link http://php.net/manual/en/function.ocinewcursor.php + * @jms-builtin + */ +function ocinewcursor ($connection_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_result + * @link http://php.net/manual/en/function.ociresult.php + * @jms-builtin + */ +function ociresult ($statement_resource, $column_number_or_name) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_server_version + * @link http://php.net/manual/en/function.ociserverversion.php + * @jms-builtin + */ +function ociserverversion ($connection_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_statement_type + * @link http://php.net/manual/en/function.ocistatementtype.php + * @jms-builtin + */ +function ocistatementtype ($statement_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_num_rows + * @link http://php.net/manual/en/function.ocirowcount.php + * @jms-builtin + */ +function ocirowcount ($statement_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_close + * @link http://php.net/manual/en/function.ocilogoff.php + * @jms-builtin + */ +function ocilogoff ($connection_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_connect + * @link http://php.net/manual/en/function.ocilogon.php + * @jms-builtin + */ +function ocilogon ($username, $password, $connection_string, $character_set, $session_mode) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_new_connect + * @link http://php.net/manual/en/function.ocinlogon.php + * @jms-builtin + */ +function ocinlogon ($username, $password, $connection_string, $character_set, $session_mode) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_pconnect + * @link http://php.net/manual/en/function.ociplogon.php + * @jms-builtin + */ +function ociplogon ($username, $password, $connection_string, $character_set, $session_mode) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_error + * @link http://php.net/manual/en/function.ocierror.php + * @jms-builtin + */ +function ocierror ($connection_or_statement_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Lob::free + * @link http://php.net/manual/en/function.ocifreedesc.php + * @jms-builtin + */ +function ocifreedesc ($lob_descriptor) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Lob::save + * @link http://php.net/manual/en/function.ocisavelob.php + * @jms-builtin + */ +function ocisavelob ($lob_descriptor, $data, $offset) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Lob::import + * @link http://php.net/manual/en/function.ocisavelobfile.php + * @jms-builtin + */ +function ocisavelobfile ($lob_descriptor, $filename) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Lob::export + * @link http://php.net/manual/en/function.ociwritelobtofile.php + * @jms-builtin + */ +function ociwritelobtofile ($lob_descriptor, $filename, $start, $length) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Lob::load + * @link http://php.net/manual/en/function.ociloadlob.php + * @jms-builtin + */ +function ociloadlob ($lob_descriptor) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_commit + * @link http://php.net/manual/en/function.ocicommit.php + * @jms-builtin + */ +function ocicommit ($connection_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_rollback + * @link http://php.net/manual/en/function.ocirollback.php + * @jms-builtin + */ +function ocirollback ($connection_resource) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_new_descriptor + * @link http://php.net/manual/en/function.ocinewdescriptor.php + * @jms-builtin + */ +function ocinewdescriptor ($connection_resource, $type) {} + +/** + * (PHP 4, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_set_prefetch + * @link http://php.net/manual/en/function.ocisetprefetch.php + * @jms-builtin + */ +function ocisetprefetch ($statement_resource, $number_of_rows) {} + +/** + * @param $connection_resource_or_connection_string + * @param $username + * @param $old_password + * @param $new_password + * @jms-builtin + */ +function ocipasswordchange ($connection_resource_or_connection_string, $username, $old_password, $new_password) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Collection::free + * @link http://php.net/manual/en/function.ocifreecollection.php + * @jms-builtin + */ +function ocifreecollection ($collection) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of oci_new_collection + * @link http://php.net/manual/en/function.ocinewcollection.php + * @jms-builtin + */ +function ocinewcollection ($connection_resource, $type_name, $schema_name) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Collection::append + * @link http://php.net/manual/en/function.ocicollappend.php + * @jms-builtin + */ +function ocicollappend ($collection, $value) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Collection::getElem + * @link http://php.net/manual/en/function.ocicollgetelem.php + * @jms-builtin + */ +function ocicollgetelem ($collection, $index) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Collection::assignElem + * @link http://php.net/manual/en/function.ocicollassignelem.php + * @jms-builtin + */ +function ocicollassignelem ($collection, $index, $value) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Collection::size + * @link http://php.net/manual/en/function.ocicollsize.php + * @jms-builtin + */ +function ocicollsize ($collection) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Collection::max + * @link http://php.net/manual/en/function.ocicollmax.php + * @jms-builtin + */ +function ocicollmax ($collection) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5, PECL OCI8 >= 1.0.0)
+ * Alias of OCI-Collection::trim + * @link http://php.net/manual/en/function.ocicolltrim.php + * @jms-builtin + */ +function ocicolltrim ($collection, $number) {} + + +/** + * Statement execution mode + * for oci_execute. The transaction is + * not automatically committed when using this mode. From PHP + * 5.3.2 (PECL OCI8 1.4) onwards, + * OCI_NO_AUTO_COMMIT is preferred instead + * of OCI_DEFAULT. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DEFAULT', 0); + +/** + * Used with oci_connect to connect with + * the SYSOPER privilege. The php.ini setting + * oci8.privileged_connect + * should be enabled to use this. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_SYSOPER', 4); + +/** + * Used with oci_connect to connect with + * the SYSDBA privilege. The php.ini setting + * oci8.privileged_connect + * should be enabled to use this. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_SYSDBA', 2); + +/** + * Used with oci_connect for using + * Oracles' External or OS authentication. Introduced in PHP + * 5.3 and PECL OCI8 1.3.4. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_CRED_EXT', -2147483648); + +/** + * Statement execution mode + * for oci_execute. Use this mode if you + * want meta data such as the column names but don't want to + * fetch rows from the query. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DESCRIBE_ONLY', 16); + +/** + * Statement execution mode for oci_execute + * call. Automatically commit changes when the statement has + * succeeded. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_COMMIT_ON_SUCCESS', 32); + +/** + * Statement execution mode + * for oci_execute. The statement is not + * committed automatically when using this mode. For + * readability in new code, use this value instead of the + * obsolete OCI_DEFAULT constant. + * Introduced in PHP 5.3.2 (PECL OCI8 1.4). + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_NO_AUTO_COMMIT', 0); + +/** + * Obsolete. Statement fetch mode. Used when the application + * knows in advance exactly how many rows it will be fetching. + * This mode turns prefetching off for Oracle release 8 or + * later mode. The cursor is canceled after the desired rows + * are fetched which may result in reduced server-side + * resource usage. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_EXACT_FETCH', 2); + +/** + * Used with to set the seek position. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_SEEK_SET', 0); + +/** + * Used with to set the seek position. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_SEEK_CUR', 1); + +/** + * Used with to set the seek position. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_SEEK_END', 2); + +/** + * Used with to free + * buffers used. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_LOB_BUFFER_FREE', 1); + +/** + * The same as OCI_B_BFILE. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BFILEE', 114); + +/** + * The same as OCI_B_CFILEE. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_CFILEE', 115); + +/** + * The same as OCI_B_CLOB. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_CLOB', 112); + +/** + * The same as OCI_B_BLOB. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BLOB', 113); + +/** + * The same as OCI_B_ROWID. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_RDD', 104); + +/** + * The same as OCI_B_INT. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_INT', 3); + +/** + * The same as OCI_B_NUM. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_NUM', 2); + +/** + * The same as OCI_B_CURSOR. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_RSET', 116); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * CHAR. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_AFC', 96); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * VARCHAR2. + * Also used with oci_bind_by_name. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_CHR', 1); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * VARCHAR. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_VCS', 9); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * VARCHAR2. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_AVC', 97); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * STRING. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_STR', 5); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * LONG VARCHAR. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_LVC', 94); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * FLOAT. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_FLT', 4); + +/** + * Not supported. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_UIN', 68); + +/** + * Used with oci_bind_by_name to bind LONG values. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_LNG', 8); + +/** + * Used with oci_bind_by_name to bind LONG RAW values. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_LBI', 24); + +/** + * The same as OCI_B_BIN. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BIN', 23); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * LONG. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_ODT', 156); + +/** + * Not supported. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BDOUBLE', 22); + +/** + * Not supported. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_BFLOAT', 21); + +/** + * Used with oci_bind_by_name when binding + * named data types. Note: in PHP < 5.0 it was called + * OCI_B_SQLT_NTY. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_NTY', 108); + +/** + * The same as OCI_B_NTY. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('SQLT_NTY', 108); + +/** + * Obsolete. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_SYSDATE', "SYSDATE"); + +/** + * Used with oci_bind_by_name when binding + * BFILEs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_BFILE', 114); + +/** + * Used with oci_bind_by_name when binding + * CFILEs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_CFILEE', 115); + +/** + * Used with oci_bind_by_name when binding + * CLOBs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_CLOB', 112); + +/** + * Used with oci_bind_by_name when + * binding BLOBs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_BLOB', 113); + +/** + * Used with oci_bind_by_name when binding + * ROWIDs. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_ROWID', 104); + +/** + * Used with oci_bind_by_name when binding + * cursors, previously allocated + * with oci_new_descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_CURSOR', 116); + +/** + * Used with oci_bind_by_name to bind RAW values. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_BIN', 23); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * INTEGER. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_INT', 3); + +/** + * Used with oci_bind_array_by_name to bind arrays of + * NUMBER. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_B_NUM', 2); + +/** + * Default mode of oci_fetch_all. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_FETCHSTATEMENT_BY_COLUMN', 16); + +/** + * Alternative mode of oci_fetch_all. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_FETCHSTATEMENT_BY_ROW', 32); + +/** + * Used with oci_fetch_all and + * oci_fetch_array to get results as an associative + * array. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_ASSOC', 1); + +/** + * Used with oci_fetch_all and + * oci_fetch_array to get results as an + * enumerated array. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_NUM', 2); + +/** + * Used with oci_fetch_all and + * oci_fetch_array to get results as an + * array with both associative and number indices. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_BOTH', 3); + +/** + * Used with oci_fetch_array to get empty + * array elements if the row items value is NULL. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_RETURN_NULLS', 4); + +/** + * Used with oci_fetch_array to get the + * data value of the LOB instead of the descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_RETURN_LOBS', 8); + +/** + * This flag tells oci_new_descriptor to + * initialize a new FILE descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DTYPE_FILE', 56); + +/** + * This flag tells oci_new_descriptor to + * initialize a new LOB descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DTYPE_LOB', 50); + +/** + * This flag tells oci_new_descriptor to + * initialize a new ROWID descriptor. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_DTYPE_ROWID', 54); + +/** + * The same as OCI_DTYPE_FILE. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_D_FILE', 56); + +/** + * The same as OCI_DTYPE_LOB. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_D_LOB', 50); + +/** + * The same as OCI_DTYPE_ROWID. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_D_ROWID', 54); + +/** + * Used with + * to indicate that a temporary CLOB should be created. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_TEMP_CLOB', 2); + +/** + * Used with + * to indicate that a temporary BLOB should be created. + * @link http://php.net/manual/en/oci8.constants.php + */ +define ('OCI_TEMP_BLOB', 1); + +// End of oci8 v.1.4.7 +?> diff --git a/res/php-5.4-core-api/odbc.php b/res/php-5.4-core-api/odbc.php new file mode 100644 index 0000000..7142687 --- /dev/null +++ b/res/php-5.4-core-api/odbc.php @@ -0,0 +1,1018 @@ + + * Toggle autocommit behaviour + * @link http://php.net/manual/en/function.odbc-autocommit.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param bool $OnOff [optional]

+ * If OnOff is TRUE, auto-commit is enabled, if + * it is FALSE auto-commit is disabled. + *

+ * @return mixed Without the OnOff parameter, this function returns + * auto-commit status for connection_id. Non-zero is + * returned if auto-commit is on, 0 if it is off, or FALSE if an error + * occurs. + *

+ *

+ * If OnOff is set, this function returns TRUE on + * success and FALSE on failure. + * @jms-builtin + */ +function odbc_autocommit ($connection_id, $OnOff = false) {} + +/** + * (PHP 4, PHP 5)
+ * Handling of binary column data + * @link http://php.net/manual/en/function.odbc-binmode.php + * @param resource $result_id

+ * The result identifier. + *

+ *

+ * If result_id is 0, the + * settings apply as default for new results. + * Default for longreadlen is 4096 and + * mode defaults to + * ODBC_BINMODE_RETURN. Handling of binary long + * columns is also affected by odbc_longreadlen. + *

+ * @param int $mode

+ * Possible values for mode are: + * ODBC_BINMODE_PASSTHRU: Passthru BINARY data + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function odbc_binmode ($result_id, $mode) {} + +/** + * (PHP 4, PHP 5)
+ * Close an ODBC connection + * @link http://php.net/manual/en/function.odbc-close.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @return void No value is returned. + * @jms-builtin + */ +function odbc_close ($connection_id) {} + +/** + * (PHP 4, PHP 5)
+ * Close all ODBC connections + * @link http://php.net/manual/en/function.odbc-close-all.php + * @return void No value is returned. + * @jms-builtin + */ +function odbc_close_all () {} + +/** + * (PHP 4, PHP 5)
+ * Lists the column names in specified tables + * @link http://php.net/manual/en/function.odbc-columns.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param string $qualifier [optional]

+ * The qualifier. + *

+ * @param string $schema [optional]

+ * The owner. + *

+ * @param string $table_name [optional]

+ * The table name. + *

+ * @param string $column_name [optional]

+ * The column name. + *

+ * @return resource an ODBC result identifier or FALSE on failure. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_SCHEM + * TABLE_NAME + * COLUMN_NAME + * DATA_TYPE + * TYPE_NAME + * PRECISION + * LENGTH + * SCALE + * RADIX + * NULLABLE + * REMARKS + *

+ *

+ * The result set is ordered by TABLE_QUALIFIER, TABLE_SCHEM and + * TABLE_NAME. + * @jms-builtin + */ +function odbc_columns ($connection_id, $qualifier = null, $schema = null, $table_name = null, $column_name = null) {} + +/** + * (PHP 4, PHP 5)
+ * Commit an ODBC transaction + * @link http://php.net/manual/en/function.odbc-commit.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function odbc_commit ($connection_id) {} + +/** + * (PHP 4, PHP 5)
+ * Connect to a datasource + * @link http://php.net/manual/en/function.odbc-connect.php + * @param string $dsn

+ * The database source name for the connection. Alternatively, a + * DSN-less connection string can be used. + *

+ * @param string $user

+ * The username. + *

+ * @param string $password

+ * The password. + *

+ * @param int $cursor_type [optional]

+ * This sets the type of cursor to be used + * for this connection. This parameter is not normally needed, but + * can be useful for working around problems with some ODBC drivers. + *

+ * The following constants are defined for cursortype: + *

+ * SQL_CUR_USE_IF_NEEDED + * @return resource an ODBC connection id or 0 (FALSE) on + * error. + * @jms-builtin + */ +function odbc_connect ($dsn, $user, $password, $cursor_type = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get cursorname + * @link http://php.net/manual/en/function.odbc-cursor.php + * @param resource $result_id

+ * The result identifier. + *

+ * @return string the cursor name, as a string. + * @jms-builtin + */ +function odbc_cursor ($result_id) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Returns information about a current connection + * @link http://php.net/manual/en/function.odbc-data-source.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param int $fetch_type

+ * The fetch_type can be one of two constant types: + * SQL_FETCH_FIRST, SQL_FETCH_NEXT. + * Use SQL_FETCH_FIRST the first time this function is + * called, thereafter use the SQL_FETCH_NEXT. + *

+ * @return array FALSE on error, and an array upon success. + * @jms-builtin + */ +function odbc_data_source ($connection_id, $fetch_type) {} + +/** + * (PHP 4, PHP 5)
+ * Execute a prepared statement + * @link http://php.net/manual/en/function.odbc-execute.php + * @param resource $result_id

+ * The result id resource, from odbc_prepare. + *

+ * @param array $parameters_array [optional]

+ * Parameters in parameter_array will be + * substituted for placeholders in the prepared statement in order. + * Elements of this array will be converted to strings by calling this + * function. + *

+ *

+ * Any parameters in parameter_array which + * start and end with single quotes will be taken as the name of a + * file to read and send to the database server as the data for the + * appropriate placeholder. + *

+ * If you wish to store a string which actually begins and ends with + * single quotes, you must add a space or other non-single-quote character + * to the beginning or end of the parameter, which will prevent the + * parameter from being taken as a file name. If this is not an option, + * then you must use another mechanism to store the string, such as + * executing the query directly with odbc_exec). + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function odbc_execute ($result_id, array $parameters_array = null) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Get the last error code + * @link http://php.net/manual/en/function.odbc-error.php + * @param resource $connection_id [optional] The ODBC connection identifier, + * see odbc_connect for details.

+ * @return string If connection_id is specified, the last state + * of that connection is returned, else the last state of any connection + * is returned. + *

+ *

+ * This function returns meaningful value only if last odbc query failed + * (i.e. odbc_exec returned FALSE). + * @jms-builtin + */ +function odbc_error ($connection_id = null) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Get the last error message + * @link http://php.net/manual/en/function.odbc-errormsg.php + * @param resource $connection_id [optional] The ODBC connection identifier, + * see odbc_connect for details.

+ * @return string If connection_id is specified, the last state + * of that connection is returned, else the last state of any connection + * is returned. + *

+ *

+ * This function returns meaningful value only if last odbc query failed + * (i.e. odbc_exec returned FALSE). + * @jms-builtin + */ +function odbc_errormsg ($connection_id = null) {} + +/** + * (PHP 4, PHP 5)
+ * Prepare and execute an SQL statement + * @link http://php.net/manual/en/function.odbc-exec.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param string $query_string

+ * The SQL statement. + *

+ * @param int $flags [optional]

+ * This parameter is currently not used. + *

+ * @return resource an ODBC result identifier if the SQL command was executed + * successfully, or FALSE on error. + * @jms-builtin + */ +function odbc_exec ($connection_id, $query_string, $flags = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Fetch a result row as an associative array + * @link http://php.net/manual/en/function.odbc-fetch-array.php + * @param resource $result

+ * The result resource from odbc_exec. + *

+ * @param int $rownumber [optional]

+ * Optionally choose which row number to retrieve. + *

+ * @return array an array that corresponds to the fetched row, or FALSE if there + * are no more rows. + * @jms-builtin + */ +function odbc_fetch_array ($result, $rownumber = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Fetch a result row as an object + * @link http://php.net/manual/en/function.odbc-fetch-object.php + * @param resource $result

+ * The result resource from odbc_exec. + *

+ * @param int $rownumber [optional]

+ * Optionally choose which row number to retrieve. + *

+ * @return object an object that corresponds to the fetched row, or FALSE if there + * are no more rows. + * @jms-builtin + */ +function odbc_fetch_object ($result, $rownumber = null) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch a row + * @link http://php.net/manual/en/function.odbc-fetch-row.php + * @param resource $result_id

+ * The result identifier. + *

+ * @param int $row_number [optional]

+ * If row_number is not specified, + * odbc_fetch_row will try to fetch the next row in + * the result set. Calls to odbc_fetch_row with and + * without row_number can be mixed. + *

+ *

+ * To step through the result more than once, you can call + * odbc_fetch_row with + * row_number 1, and then continue doing + * odbc_fetch_row without + * row_number to review the result. If a driver + * doesn't support fetching rows by number, the + * row_number parameter is ignored. + *

+ * @return bool TRUE if there was a row, FALSE otherwise. + * @jms-builtin + */ +function odbc_fetch_row ($result_id, $row_number = null) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch one result row into array + * @link http://php.net/manual/en/function.odbc-fetch-into.php + * @param resource $result_id

+ * The result resource. + *

+ * @param array $result_array

+ * The result array + * that can be of any type since it will be converted to type + * array. The array will contain the column values starting at array + * index 0. + *

+ * @param int $rownumber [optional]

+ * The row number. + *

+ * @return int the number of columns in the result; + * FALSE on error. + * @jms-builtin + */ +function odbc_fetch_into ($result_id, array &$result_array, $rownumber = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get the length (precision) of a field + * @link http://php.net/manual/en/function.odbc-field-len.php + * @param resource $result_id

+ * The result identifier. + *

+ * @param int $field_number

+ * The field number. Field numbering starts at 1. + *

+ * @return int the field name as a string, or FALSE on error. + * @jms-builtin + */ +function odbc_field_len ($result_id, $field_number) {} + +/** + * (PHP 4, PHP 5)
+ * Get the scale of a field + * @link http://php.net/manual/en/function.odbc-field-scale.php + * @param resource $result_id

+ * The result identifier. + *

+ * @param int $field_number

+ * The field number. Field numbering starts at 1. + *

+ * @return int the field scale as a integer, or FALSE on error. + * @jms-builtin + */ +function odbc_field_scale ($result_id, $field_number) {} + +/** + * (PHP 4, PHP 5)
+ * Get the columnname + * @link http://php.net/manual/en/function.odbc-field-name.php + * @param resource $result_id

+ * The result identifier. + *

+ * @param int $field_number

+ * The field number. Field numbering starts at 1. + *

+ * @return string the field name as a string, or FALSE on error. + * @jms-builtin + */ +function odbc_field_name ($result_id, $field_number) {} + +/** + * (PHP 4, PHP 5)
+ * Datatype of a field + * @link http://php.net/manual/en/function.odbc-field-type.php + * @param resource $result_id

+ * The result identifier. + *

+ * @param int $field_number

+ * The field number. Field numbering starts at 1. + *

+ * @return string the field type as a string, or FALSE on error. + * @jms-builtin + */ +function odbc_field_type ($result_id, $field_number) {} + +/** + * (PHP 4, PHP 5)
+ * Return column number + * @link http://php.net/manual/en/function.odbc-field-num.php + * @param resource $result_id

+ * The result identifier. + *

+ * @param string $field_name

+ * The field name. + *

+ * @return int the field number as a integer, or FALSE on error. + * Field numbering starts at 1. + * @jms-builtin + */ +function odbc_field_num ($result_id, $field_name) {} + +/** + * (PHP 4, PHP 5)
+ * Free resources associated with a result + * @link http://php.net/manual/en/function.odbc-free-result.php + * @param resource $result_id

+ * The result identifier. + *

+ * @return bool Always returns TRUE. + * @jms-builtin + */ +function odbc_free_result ($result_id) {} + +/** + * (PHP 4, PHP 5)
+ * Retrieves information about data types supported by the data source + * @link http://php.net/manual/en/function.odbc-gettypeinfo.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param int $data_type [optional]

+ * The data type, which can be used to restrict the information to a + * single data type. + *

+ * @return resource an ODBC result identifier or + * FALSE on failure. + *

+ *

+ * The result set has the following columns: + * TYPE_NAME + * DATA_TYPE + * PRECISION + * LITERAL_PREFIX + * LITERAL_SUFFIX + * CREATE_PARAMS + * NULLABLE + * CASE_SENSITIVE + * SEARCHABLE + * UNSIGNED_ATTRIBUTE + * MONEY + * AUTO_INCREMENT + * LOCAL_TYPE_NAME + * MINIMUM_SCALE + * MAXIMUM_SCALE + *

+ *

+ * The result set is ordered by DATA_TYPE and TYPE_NAME. + * @jms-builtin + */ +function odbc_gettypeinfo ($connection_id, $data_type = null) {} + +/** + * (PHP 4, PHP 5)
+ * Handling of LONG columns + * @link http://php.net/manual/en/function.odbc-longreadlen.php + * @param resource $result_id

+ * The result identifier. + *

+ * @param int $length

+ * The number of bytes returned to PHP is controlled by the parameter + * length. If it is set to 0, Long column data is passed through to the + * client. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function odbc_longreadlen ($result_id, $length) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Checks if multiple results are available + * @link http://php.net/manual/en/function.odbc-next-result.php + * @param resource $result_id

+ * The result identifier. + *

+ * @return bool TRUE if there are more result sets, FALSE otherwise. + * @jms-builtin + */ +function odbc_next_result ($result_id) {} + +/** + * (PHP 4, PHP 5)
+ * Number of columns in a result + * @link http://php.net/manual/en/function.odbc-num-fields.php + * @param resource $result_id

+ * The result identifier returned by odbc_exec. + *

+ * @return int the number of fields, or -1 on error. + * @jms-builtin + */ +function odbc_num_fields ($result_id) {} + +/** + * (PHP 4, PHP 5)
+ * Number of rows in a result + * @link http://php.net/manual/en/function.odbc-num-rows.php + * @param resource $result_id

+ * The result identifier returned by odbc_exec. + *

+ * @return int the number of rows in an ODBC result. + * This function will return -1 on error. + * @jms-builtin + */ +function odbc_num_rows ($result_id) {} + +/** + * (PHP 4, PHP 5)
+ * Open a persistent database connection + * @link http://php.net/manual/en/function.odbc-pconnect.php + * @param string $dsn + * @param string $user + * @param string $password + * @param int $cursor_type [optional] + * @return resource an ODBC connection id or 0 (FALSE) on + * error. + * @jms-builtin + */ +function odbc_pconnect ($dsn, $user, $password, $cursor_type = null) {} + +/** + * (PHP 4, PHP 5)
+ * Prepares a statement for execution + * @link http://php.net/manual/en/function.odbc-prepare.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param string $query_string

+ * The query string statement being prepared. + *

+ * @return resource an ODBC result identifier if the SQL command was prepared + * successfully. Returns FALSE on error. + * @jms-builtin + */ +function odbc_prepare ($connection_id, $query_string) {} + +/** + * (PHP 4, PHP 5)
+ * Get result data + * @link http://php.net/manual/en/function.odbc-result.php + * @param resource $result_id

+ * The ODBC resource. + *

+ * @param mixed $field

+ * The field name being retrieved. It can either be an integer containing + * the column number of the field you want; or it can be a string + * containing the name of the field. + *

+ * @return mixed the string contents of the field, FALSE on error, NULL for + * NULL data, or TRUE for binary data. + * @jms-builtin + */ +function odbc_result ($result_id, $field) {} + +/** + * (PHP 4, PHP 5)
+ * Print result as HTML table + * @link http://php.net/manual/en/function.odbc-result-all.php + * @param resource $result_id

+ * The result identifier. + *

+ * @param string $format [optional]

+ * Additional overall table formatting. + *

+ * @return int the number of rows in the result or FALSE on error. + * @jms-builtin + */ +function odbc_result_all ($result_id, $format = null) {} + +/** + * (PHP 4, PHP 5)
+ * Rollback a transaction + * @link http://php.net/manual/en/function.odbc-rollback.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function odbc_rollback ($connection_id) {} + +/** + * (PHP 4, PHP 5)
+ * Adjust ODBC settings + * @link http://php.net/manual/en/function.odbc-setoption.php + * @param resource $id

+ * Is a connection id or result id on which to change the settings. + * For SQLSetConnectOption(), this is a connection id. + * For SQLSetStmtOption(), this is a result id. + *

+ * @param int $function

+ * Is the ODBC function to use. The value should be + * 1 for SQLSetConnectOption() and + * 2 for SQLSetStmtOption(). + *

+ * @param int $option

+ * The option to set. + *

+ * @param int $param

+ * The value for the given option. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function odbc_setoption ($id, $function, $option, $param) {} + +/** + * (PHP 4, PHP 5)
+ * Retrieves special columns + * @link http://php.net/manual/en/function.odbc-specialcolumns.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param int $type When the type argument is SQL_BEST_ROWID, + * odbc_specialcolumns returns the + * column or columns that uniquely identify each row in the table. + * When the type argument is SQL_ROWVER, + * odbc_specialcolumns returns the column or columns in the + * specified table, if any, that are automatically updated by the data source + * when any value in the row is updated by any transaction. + * @param string $qualifier

+ * The qualifier. + *

+ * @param string $owner

+ * The owner. + *

+ * @param string $table

+ * The table. + *

+ * @param int $scope

+ * The scope, which orders the result set. + *

+ * @param int $nullable

+ * The nullable option. + *

+ * @return resource an ODBC result identifier or FALSE on + * failure. + *

+ *

+ * The result set has the following columns: + * SCOPE + * COLUMN_NAME + * DATA_TYPE + * TYPE_NAME + * PRECISION + * LENGTH + * SCALE + * PSEUDO_COLUMN + * @jms-builtin + */ +function odbc_specialcolumns ($connection_id, $type, $qualifier, $owner, $table, $scope, $nullable) {} + +/** + * (PHP 4, PHP 5)
+ * Retrieve statistics about a table + * @link http://php.net/manual/en/function.odbc-statistics.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param string $qualifier

+ * The qualifier. + *

+ * @param string $owner

+ * The owner. + *

+ * @param string $table_name

+ * The table name. + *

+ * @param int $unique

+ * The unique attribute. + *

+ * @param int $accuracy

+ * The accuracy. + *

+ * @return resource an ODBC result identifier or FALSE on failure. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * NON_UNIQUE + * INDEX_QUALIFIER + * INDEX_NAME + * TYPE + * SEQ_IN_INDEX + * COLUMN_NAME + * COLLATION + * CARDINALITY + * PAGES + * FILTER_CONDITION + * @jms-builtin + */ +function odbc_statistics ($connection_id, $qualifier, $owner, $table_name, $unique, $accuracy) {} + +/** + * (PHP 4, PHP 5)
+ * Get the list of table names stored in a specific data source + * @link http://php.net/manual/en/function.odbc-tables.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param string $qualifier [optional]

+ * The qualifier. + *

+ * @param string $owner [optional]

+ * The owner. Accepts search patterns ('%' to match zero or more + * characters and '_' to match a single character). + *

+ * @param string $name [optional]

+ * The name. Accepts search patterns ('%' to match zero or more + * characters and '_' to match a single character). + *

+ * @param string $types [optional]

+ * If table_type is not an empty string, it + * must contain a list of comma-separated values for the types of + * interest; each value may be enclosed in single quotes (') or + * unquoted. For example, "'TABLE','VIEW'" or "TABLE, VIEW". If the + * data source does not support a specified table type, + * odbc_tables does not return any results for + * that type. + *

+ * @return resource an ODBC result identifier containing the information + * or FALSE on failure. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * TABLE_TYPE + * REMARKS + * @jms-builtin + */ +function odbc_tables ($connection_id, $qualifier = null, $owner = null, $name = null, $types = null) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the primary keys for a table + * @link http://php.net/manual/en/function.odbc-primarykeys.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param string $qualifier + * @param string $owner + * @param string $table + * @return resource an ODBC result identifier or FALSE on failure. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * COLUMN_NAME + * KEY_SEQ + * PK_NAME + * @jms-builtin + */ +function odbc_primarykeys ($connection_id, $qualifier, $owner, $table) {} + +/** + * (PHP 4, PHP 5)
+ * Lists columns and associated privileges for the given table + * @link http://php.net/manual/en/function.odbc-columnprivileges.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param string $qualifier

+ * The qualifier. + *

+ * @param string $owner

+ * The owner. + *

+ * @param string $table_name

+ * The table name. + *

+ * @param string $column_name

+ * The column_name argument accepts search + * patterns ('%' to match zero or more characters and '_' to match a + * single character). + *

+ * @return resource an ODBC result identifier or FALSE on failure. + * This result identifier can be used to fetch a list of columns and + * associated privileges. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * GRANTOR + * GRANTEE + * PRIVILEGE + * IS_GRANTABLE + *

+ *

+ * The result set is ordered by TABLE_QUALIFIER, TABLE_OWNER and + * TABLE_NAME. + * @jms-builtin + */ +function odbc_columnprivileges ($connection_id, $qualifier, $owner, $table_name, $column_name) {} + +/** + * (PHP 4, PHP 5)
+ * Lists tables and the privileges associated with each table + * @link http://php.net/manual/en/function.odbc-tableprivileges.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param string $qualifier

+ * The qualifier. + *

+ * @param string $owner

+ * The owner. Accepts the following search patterns: + * ('%' to match zero or more characters and '_' to match a single character) + *

+ * @param string $name

+ * The name. Accepts the following search patterns: + * ('%' to match zero or more characters and '_' to match a single character) + *

+ * @return resource An ODBC result identifier or FALSE on failure. + *

+ *

+ * The result set has the following columns: + * TABLE_QUALIFIER + * TABLE_OWNER + * TABLE_NAME + * GRANTOR + * GRANTEE + * PRIVILEGE + * IS_GRANTABLE + * @jms-builtin + */ +function odbc_tableprivileges ($connection_id, $qualifier, $owner, $name) {} + +/** + * (PHP 4, PHP 5)
+ * Retrieves a list of foreign keys + * @link http://php.net/manual/en/function.odbc-foreignkeys.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @param string $pk_qualifier

+ * The primary key qualifier. + *

+ * @param string $pk_owner

+ * The primary key owner. + *

+ * @param string $pk_table

+ * The primary key table. + *

+ * @param string $fk_qualifier

+ * The foreign key qualifier. + *

+ * @param string $fk_owner

+ * The foreign key owner. + *

+ * @param string $fk_table

+ * The foreign key table. + *

+ * @return resource an ODBC result identifier or FALSE on failure. + *

+ *

+ * The result set has the following columns: + * PKTABLE_QUALIFIER + * PKTABLE_OWNER + * PKTABLE_NAME + * PKCOLUMN_NAME + * FKTABLE_QUALIFIER + * FKTABLE_OWNER + * FKTABLE_NAME + * FKCOLUMN_NAME + * KEY_SEQ + * UPDATE_RULE + * DELETE_RULE + * FK_NAME + * PK_NAME + *

+ * If pk_table contains a table name, + * odbc_foreignkeys returns a result set + * containing the primary key of the specified table and all of the + * foreign keys that refer to it. + * If fk_table contains a table name, + * odbc_foreignkeys returns a result set + * containing all of the foreign keys in the specified table and the + * primary keys (in other tables) to which they refer. + * If both pk_table and + * fk_table contain table names, + * odbc_foreignkeys returns the foreign keys in + * the table specified in fk_table that refer + * to the primary key of the table specified in + * pk_table + * @jms-builtin + */ +function odbc_foreignkeys ($connection_id, $pk_qualifier, $pk_owner, $pk_table, $fk_qualifier, $fk_owner, $fk_table) {} + +/** + * (PHP 4, PHP 5)
+ * Get the list of procedures stored in a specific data source + * @link http://php.net/manual/en/function.odbc-procedures.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @return resource an ODBC + * result identifier containing the information or FALSE on failure. + *

+ *

+ * The result set has the following columns: + * PROCEDURE_QUALIFIER + * PROCEDURE_OWNER + * PROCEDURE_NAME + * NUM_INPUT_PARAMS + * NUM_OUTPUT_PARAMS + * NUM_RESULT_SETS + * REMARKS + * PROCEDURE_TYPE + * @jms-builtin + */ +function odbc_procedures ($connection_id) {} + +/** + * (PHP 4, PHP 5)
+ * Retrieve information about parameters to procedures + * @link http://php.net/manual/en/function.odbc-procedurecolumns.php + * @param resource $connection_id The ODBC connection identifier, + * see odbc_connect for details.

+ * @return resource the list of input and output parameters, as well as the + * columns that make up the result set for the specified procedures. + * Returns an ODBC result identifier or FALSE on failure. + *

+ *

+ * The result set has the following columns: + * PROCEDURE_QUALIFIER + * PROCEDURE_OWNER + * PROCEDURE_NAME + * COLUMN_NAME + * COLUMN_TYPE + * DATA_TYPE + * TYPE_NAME + * PRECISION + * LENGTH + * SCALE + * RADIX + * NULLABLE + * REMARKS + * @jms-builtin + */ +function odbc_procedurecolumns ($connection_id) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of odbc_exec + * @link http://php.net/manual/en/function.odbc-do.php + * @param $connection_id + * @param $query + * @param $flags [optional] + * @jms-builtin + */ +function odbc_do ($connection_id, $query, $flags) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of odbc_field_len + * @link http://php.net/manual/en/function.odbc-field-precision.php + * @param $result_id + * @param $field_number + * @jms-builtin + */ +function odbc_field_precision ($result_id, $field_number) {} + +define ('ODBC_TYPE', "unixODBC"); +define ('ODBC_BINMODE_PASSTHRU', 0); +define ('ODBC_BINMODE_RETURN', 1); +define ('ODBC_BINMODE_CONVERT', 2); +define ('SQL_ODBC_CURSORS', 110); +define ('SQL_CUR_USE_DRIVER', 2); +define ('SQL_CUR_USE_IF_NEEDED', 0); +define ('SQL_CUR_USE_ODBC', 1); +define ('SQL_CONCURRENCY', 7); +define ('SQL_CONCUR_READ_ONLY', 1); +define ('SQL_CONCUR_LOCK', 2); +define ('SQL_CONCUR_ROWVER', 3); +define ('SQL_CONCUR_VALUES', 4); +define ('SQL_CURSOR_TYPE', 6); +define ('SQL_CURSOR_FORWARD_ONLY', 0); +define ('SQL_CURSOR_KEYSET_DRIVEN', 1); +define ('SQL_CURSOR_DYNAMIC', 2); +define ('SQL_CURSOR_STATIC', 3); +define ('SQL_KEYSET_SIZE', 8); +define ('SQL_FETCH_FIRST', 2); +define ('SQL_FETCH_NEXT', 1); +define ('SQL_CHAR', 1); +define ('SQL_VARCHAR', 12); +define ('SQL_LONGVARCHAR', -1); +define ('SQL_DECIMAL', 3); +define ('SQL_NUMERIC', 2); +define ('SQL_BIT', -7); +define ('SQL_TINYINT', -6); +define ('SQL_SMALLINT', 5); +define ('SQL_INTEGER', 4); +define ('SQL_BIGINT', -5); +define ('SQL_REAL', 7); +define ('SQL_FLOAT', 6); +define ('SQL_DOUBLE', 8); +define ('SQL_BINARY', -2); +define ('SQL_VARBINARY', -3); +define ('SQL_LONGVARBINARY', -4); +define ('SQL_DATE', 9); +define ('SQL_TIME', 10); +define ('SQL_TIMESTAMP', 11); + +// End of odbc v.1.0 +?> diff --git a/res/php-5.4-core-api/openssl.php b/res/php-5.4-core-api/openssl.php new file mode 100644 index 0000000..6c2151f --- /dev/null +++ b/res/php-5.4-core-api/openssl.php @@ -0,0 +1,1099 @@ + + * Frees a private key + * @link http://php.net/manual/en/function.openssl-pkey-free.php + * @param resource $key

+ * Resource holding the key. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function openssl_pkey_free ($key) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Generates a new private key + * @link http://php.net/manual/en/function.openssl-pkey-new.php + * @param array $configargs [optional]

+ * You can finetune the key generation (such as specifying the number of + * bits) using configargs. See + * openssl_csr_new for more information about + * configargs. + *

+ * @return resource a resource identifier for the pkey on success, or FALSE on + * error. + * @jms-builtin + */ +function openssl_pkey_new (array $configargs = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Gets an exportable representation of a key into a string + * @link http://php.net/manual/en/function.openssl-pkey-export.php + * @param mixed $key + * @param string $out + * @param string $passphrase [optional]

+ * The key is optionally protected by passphrase. + *

+ * @param array $configargs [optional]

+ * configargs can be used to fine-tune the export + * process by specifying and/or overriding options for the openssl + * configuration file. See openssl_csr_new for more + * information about configargs. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_pkey_export ($key, &$out, $passphrase = null, array $configargs = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Gets an exportable representation of a key into a file + * @link http://php.net/manual/en/function.openssl-pkey-export-to-file.php + * @param mixed $key + * @param string $outfilename

+ * Path to the output file. + *

+ * @param string $passphrase [optional]

+ * The key can be optionally protected by a + * passphrase. + *

+ * @param array $configargs [optional]

+ * configargs can be used to fine-tune the export + * process by specifying and/or overriding options for the openssl + * configuration file. See openssl_csr_new for more + * information about configargs. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_pkey_export_to_file ($key, $outfilename, $passphrase = null, array $configargs = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get a private key + * @link http://php.net/manual/en/function.openssl-pkey-get-private.php + * @param mixed $key

+ * key can be one of the following: + * a string having the format + * file://path/to/file.pem. The named file must + * contain a PEM encoded certificate/private key (it may contain both). + * @param string $passphrase [optional]

+ * The optional parameter passphrase must be used + * if the specified key is encrypted (protected by a passphrase). + *

+ * @return resource a positive key resource identifier on success, or FALSE on error. + * @jms-builtin + */ +function openssl_pkey_get_private ($key, $passphrase = "") {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Extract public key from certificate and prepare it for use + * @link http://php.net/manual/en/function.openssl-pkey-get-public.php + * @param mixed $certificate

+ * certificate can be one of the following: + * an X.509 certificate resource + * @return resource a positive key resource identifier on success, or FALSE on error. + * @jms-builtin + */ +function openssl_pkey_get_public ($certificate) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Returns an array with the key details + * @link http://php.net/manual/en/function.openssl-pkey-get-details.php + * @param resource $key

+ * Resource holding the key. + *

+ * @return array an array with the key details in success or FALSE in failure. + * Returned array has indexes bits (number of bits), + * key (string representation of the public key) and + * type (type of the key which is one of + * OPENSSL_KEYTYPE_RSA, + * OPENSSL_KEYTYPE_DSA, + * OPENSSL_KEYTYPE_DH, + * OPENSSL_KEYTYPE_EC or -1 meaning unknown). + *

+ *

+ * Depending on the key type used, additional details may be returned. Note that + * some elements may not always be available. + * @jms-builtin + */ +function openssl_pkey_get_details ($key) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Free key resource + * @link http://php.net/manual/en/function.openssl-free-key.php + * @param resource $key_identifier + * @return void No value is returned. + * @jms-builtin + */ +function openssl_free_key ($key_identifier) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Alias of openssl_pkey_get_private + * @link http://php.net/manual/en/function.openssl-get-privatekey.php + * @param $key + * @param $passphrase [optional] + * @jms-builtin + */ +function openssl_get_privatekey ($key, $passphrase) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Alias of openssl_pkey_get_public + * @link http://php.net/manual/en/function.openssl-get-publickey.php + * @param $cert + * @jms-builtin + */ +function openssl_get_publickey ($cert) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Parse an X.509 certificate and return a resource identifier for +it + * @link http://php.net/manual/en/function.openssl-x509-read.php + * @param mixed $x509certdata + * @return resource a resource identifier on success or FALSE on failure. + * @jms-builtin + */ +function openssl_x509_read ($x509certdata) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Free certificate resource + * @link http://php.net/manual/en/function.openssl-x509-free.php + * @param resource $x509cert + * @return void No value is returned. + * @jms-builtin + */ +function openssl_x509_free ($x509cert) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Parse an X509 certificate and return the information as an array + * @link http://php.net/manual/en/function.openssl-x509-parse.php + * @param mixed $x509cert + * @param bool $shortnames [optional]

+ * shortnames controls how the data is indexed in the + * array - if shortnames is TRUE (the default) then + * fields will be indexed with the short name form, otherwise, the long name + * form will be used - e.g.: CN is the shortname form of commonName. + *

+ * @return array The structure of the returned data is (deliberately) not + * yet documented, as it is still subject to change. + * @jms-builtin + */ +function openssl_x509_parse ($x509cert, $shortnames = true) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Verifies if a certificate can be used for a particular purpose + * @link http://php.net/manual/en/function.openssl-x509-checkpurpose.php + * @param mixed $x509cert

+ * The examined certificate. + *

+ * @param int $purpose

+ * + * openssl_x509_checkpurpose purposes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
X509_PURPOSE_SSL_CLIENTCan the certificate be used for the client side of an SSL + * connection?
X509_PURPOSE_SSL_SERVERCan the certificate be used for the server side of an SSL + * connection?
X509_PURPOSE_NS_SSL_SERVERCan the cert be used for Netscape SSL server?
X509_PURPOSE_SMIME_SIGNCan the cert be used to sign S/MIME email?
X509_PURPOSE_SMIME_ENCRYPTCan the cert be used to encrypt S/MIME email?
X509_PURPOSE_CRL_SIGNCan the cert be used to sign a certificate revocation list + * (CRL)?
X509_PURPOSE_ANYCan the cert be used for Any/All purposes?
+ * These options are not bitfields - you may specify one only! + *

+ * @param array $cainfo [optional]

+ * cainfo should be an array of trusted CA files/dirs + * as described in Certificate + * Verification. + *

+ * @param string $untrustedfile [optional]

+ * If specified, this should be the name of a PEM encoded file holding + * certificates that can be used to help verify the certificate, although + * no trust is placed in the certificates that come from that file. + *

+ * @return int TRUE if the certificate can be used for the intended purpose, + * FALSE if it cannot, or -1 on error. + * @jms-builtin + */ +function openssl_x509_checkpurpose ($x509cert, $purpose, array $cainfo = 'array()', $untrustedfile = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Checks if a private key corresponds to a certificate + * @link http://php.net/manual/en/function.openssl-x509-check-private-key.php + * @param mixed $cert

+ * The certificate. + *

+ * @param mixed $key

+ * The private key. + *

+ * @return bool TRUE if key is the private key that + * corresponds to cert, or FALSE otherwise. + * @jms-builtin + */ +function openssl_x509_check_private_key ($cert, $key) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Exports a certificate as a string + * @link http://php.net/manual/en/function.openssl-x509-export.php + * @param mixed $x509 + * @param string $output

+ * On success, this will hold the PEM. + *

+ * @param bool $notext [optional] The optional parameter notext affects + * the verbosity of the output; if it is FALSE, then additional human-readable + * information is included in the output. The default value of + * notext is TRUE. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_x509_export ($x509, &$output, $notext = '&true;') {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Exports a certificate to file + * @link http://php.net/manual/en/function.openssl-x509-export-to-file.php + * @param mixed $x509 + * @param string $outfilename

+ * Path to the output file. + *

+ * @param bool $notext [optional] The optional parameter notext affects + * the verbosity of the output; if it is FALSE, then additional human-readable + * information is included in the output. The default value of + * notext is TRUE. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_x509_export_to_file ($x509, $outfilename, $notext = '&true;') {} + +/** + * (PHP 5 >= 5.2.2)
+ * Exports a PKCS#12 Compatible Certificate Store File to variable. + * @link http://php.net/manual/en/function.openssl-pkcs12-export.php + * @param mixed $x509 + * @param string $out

+ * On success, this will hold the PKCS#12. + *

+ * @param mixed $priv_key

+ * Private key component of PKCS#12 file. + *

+ * @param string $pass

+ * Encryption password for unlocking the PKCS#12 file. + *

+ * @param array $args [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_pkcs12_export ($x509, &$out, $priv_key, $pass, array $args = null) {} + +/** + * (PHP 5 >= 5.2.2)
+ * Exports a PKCS#12 Compatible Certificate Store File + * @link http://php.net/manual/en/function.openssl-pkcs12-export-to-file.php + * @param mixed $x509 + * @param string $filename

+ * Path to the output file. + *

+ * @param mixed $priv_key

+ * Private key component of PKCS#12 file. + *

+ * @param string $pass

+ * Encryption password for unlocking the PKCS#12 file. + *

+ * @param array $args [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_pkcs12_export_to_file ($x509, $filename, $priv_key, $pass, array $args = null) {} + +/** + * (PHP 5 >= 5.2.2)
+ * Parse a PKCS#12 Certificate Store into an array + * @link http://php.net/manual/en/function.openssl-pkcs12-read.php + * @param string $pkcs12 + * @param array $certs

+ * On success, this will hold the Certificate Store Data. + *

+ * @param string $pass

+ * Encryption password for unlocking the PKCS#12 file. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_pkcs12_read ($pkcs12, array &$certs, $pass) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Generates a CSR + * @link http://php.net/manual/en/function.openssl-csr-new.php + * @param array $dn

+ * The Distinguished Name to be used in the certificate. + *

+ * @param resource $privkey

+ * privkey should be set to a private key that was + * previously generated by openssl_pkey_new (or + * otherwise obtained from the other openssl_pkey family of functions). + * The corresponding public portion of the key will be used to sign the + * CSR. + *

+ * @param array $configargs [optional]

+ * By default, the information in your system openssl.conf + * is used to initialize the request; you can specify a configuration file + * section by setting the config_section_section key of + * configargs. You can also specify an alternative + * openssl configuration file by setting the value of the + * config key to the path of the file you want to use. + * The following keys, if present in configargs + * behave as their equivalents in the openssl.conf, as + * listed in the table below. + * + * Configuration overrides + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
configargs keytypeopenssl.conf equivalentdescription
digest_algstringdefault_mdSelects which digest method to use
x509_extensionsstringx509_extensionsSelects which extensions should be used when creating an x509 + * certificate
req_extensionsstringreq_extensionsSelects which extensions should be used when creating a CSR
private_key_bitsintegerdefault_bitsSpecifies how many bits should be used to generate a private + * key
private_key_typeintegernoneSpecifies the type of private key to create. This can be one + * of OPENSSL_KEYTYPE_DSA, + * OPENSSL_KEYTYPE_DH or + * OPENSSL_KEYTYPE_RSA. + * The default value is OPENSSL_KEYTYPE_RSA which + * is currently the only supported key type. + *
encrypt_keybooleanencrypt_keyShould an exported key (with passphrase) be encrypted?
encrypt_key_cipherintegernone + * One of cipher constants. + *
+ *

+ * @param array $extraattribs [optional]

+ * extraattribs is used to specify additional + * configuration options for the CSR. Both dn and + * extraattribs are associative arrays whose keys are + * converted to OIDs and applied to the relevant part of the request. + *

+ * @return mixed the CSR. + * @jms-builtin + */ +function openssl_csr_new (array $dn, &$privkey, array $configargs = null, array $extraattribs = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Exports a CSR as a string + * @link http://php.net/manual/en/function.openssl-csr-export.php + * @param resource $csr + * @param string $out + * @param bool $notext [optional] The optional parameter notext affects + * the verbosity of the output; if it is FALSE, then additional human-readable + * information is included in the output. The default value of + * notext is TRUE. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_csr_export ($csr, &$out, $notext = true) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Exports a CSR to a file + * @link http://php.net/manual/en/function.openssl-csr-export-to-file.php + * @param resource $csr + * @param string $outfilename

+ * Path to the output file. + *

+ * @param bool $notext [optional] The optional parameter notext affects + * the verbosity of the output; if it is FALSE, then additional human-readable + * information is included in the output. The default value of + * notext is TRUE. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_csr_export_to_file ($csr, $outfilename, $notext = true) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Sign a CSR with another certificate (or itself) and generate a certificate + * @link http://php.net/manual/en/function.openssl-csr-sign.php + * @param mixed $csr

+ * A CSR previously generated by openssl_csr_new. + * It can also be the path to a PEM encoded CSR when specified as + * file://path/to/csr or an exported string generated + * by openssl_csr_export. + *

+ * @param mixed $cacert

+ * The generated certificate will be signed by cacert. + * If cacert is NULL, the generated certificate + * will be a self-signed certificate. + *

+ * @param mixed $priv_key

+ * priv_key is the private key that corresponds to + * cacert. + *

+ * @param int $days

+ * days specifies the length of time for which the + * generated certificate will be valid, in days. + *

+ * @param array $configargs [optional]

+ * You can finetune the CSR signing by configargs. + * See openssl_csr_new for more information about + * configargs. + *

+ * @param int $serial [optional]

+ * An optional the serial number of issued certificate. If not specified + * it will default to 0. + *

+ * @return resource an x509 certificate resource on success, FALSE on failure. + * @jms-builtin + */ +function openssl_csr_sign ($csr, $cacert, $priv_key, $days, array $configargs = null, $serial = 0) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Returns the subject of a CERT + * @link http://php.net/manual/en/function.openssl-csr-get-subject.php + * @param mixed $csr + * @param bool $use_shortnames [optional] + * @return array + * @jms-builtin + */ +function openssl_csr_get_subject ($csr, $use_shortnames = true) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Returns the public key of a CERT + * @link http://php.net/manual/en/function.openssl-csr-get-public-key.php + * @param mixed $csr + * @param bool $use_shortnames [optional] + * @return resource + * @jms-builtin + */ +function openssl_csr_get_public_key ($csr, $use_shortnames = true) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Computes a digest + * @link http://php.net/manual/en/function.openssl-digest.php + * @param string $data

+ * The data. + *

+ * @param string $method

+ * The digest method. + *

+ * @param bool $raw_output [optional]

+ * Setting to TRUE will return as raw output data, otherwise the return + * value is binhex encoded. + *

+ * @return string the digested hash value on success or FALSE on failure. + * @jms-builtin + */ +function openssl_digest ($data, $method, $raw_output = false) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Encrypts data + * @link http://php.net/manual/en/function.openssl-encrypt.php + * @param string $data

+ * The data. + *

+ * @param string $method

+ * The cipher method. + *

+ * @param string $password

+ * The password. + *

+ * @param bool $raw_output [optional]

+ * Setting to TRUE will return as raw output data, otherwise the return + * value is base64 encoded. + *

+ * @param string $iv [optional]

+ * A non-NULL Initialization Vector. + *

+ * @return string the encrypted string on success or FALSE on failure. + * @jms-builtin + */ +function openssl_encrypt ($data, $method, $password, $raw_output = false, $iv = "") {} + +/** + * (PHP 5 >= 5.3.0)
+ * Decrypts data + * @link http://php.net/manual/en/function.openssl-decrypt.php + * @param string $data

+ * The data. + *

+ * @param string $method

+ * The cipher method. + *

+ * @param string $password

+ * The password. + *

+ * @param bool $raw_input [optional]

+ * Setting to TRUE will take a raw encoded string, + * otherwise a base64 string is assumed for the + * data parameter. + *

+ * @param string $iv [optional]

+ * A non-NULL Initialization Vector. + *

+ * @return string The decrypted string on success or FALSE on failure. + * @jms-builtin + */ +function openssl_decrypt ($data, $method, $password, $raw_input = false, $iv = "") {} + +/** + * (PHP 5 >= PHP 5.3.3)
+ * Gets the cipher iv length + * @link http://php.net/manual/en/function.openssl-cipher-iv-length.php + * @param string $method

+ * The method. + *

+ * @return int the cipher length on success, or FALSE on failure. + * @jms-builtin + */ +function openssl_cipher_iv_length ($method) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Generate signature + * @link http://php.net/manual/en/function.openssl-sign.php + * @param string $data + * @param string $signature

+ * If the call was successful the signature is returned in + * signature. + *

+ * @param mixed $priv_key_id + * @param int $signature_alg [optional]

+ * For more information see the list of Signature Algorithms. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_sign ($data, &$signature, $priv_key_id, $signature_alg = 'OPENSSL_ALGO_SHA1') {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Verify signature + * @link http://php.net/manual/en/function.openssl-verify.php + * @param string $data + * @param string $signature + * @param mixed $pub_key_id + * @param int $signature_alg [optional]

+ * For more information see the list of Signature Algorithms. + *

+ * @return int 1 if the signature is correct, 0 if it is incorrect, and + * -1 on error. + * @jms-builtin + */ +function openssl_verify ($data, $signature, $pub_key_id, $signature_alg = 'OPENSSL_ALGO_SHA1') {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Seal (encrypt) data + * @link http://php.net/manual/en/function.openssl-seal.php + * @param string $data + * @param string $sealed_data + * @param array $env_keys + * @param array $pub_key_ids + * @param string $method [optional] + * @return int the length of the sealed data on success, or FALSE on error. + * If successful the sealed data is returned in + * sealed_data, and the envelope keys in + * env_keys. + * @jms-builtin + */ +function openssl_seal ($data, &$sealed_data, array &$env_keys, array $pub_key_ids, $method = null) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Open sealed data + * @link http://php.net/manual/en/function.openssl-open.php + * @param string $sealed_data + * @param string $open_data

+ * If the call is successful the opened data is returned in this + * parameter. + *

+ * @param string $env_key + * @param mixed $priv_key_id + * @param string $method [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_open ($sealed_data, &$open_data, $env_key, $priv_key_id, $method = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Verifies the signature of an S/MIME signed message + * @link http://php.net/manual/en/function.openssl-pkcs7-verify.php + * @param string $filename

+ * Path to the message. + *

+ * @param int $flags

+ * flags can be used to affect how the signature is + * verified - see PKCS7 constants + * for more information. + *

+ * @param string $outfilename [optional]

+ * If the outfilename is specified, it should be a + * string holding the name of a file into which the certificates of the + * persons that signed the messages will be stored in PEM format. + *

+ * @param array $cainfo [optional]

+ * If the cainfo is specified, it should hold + * information about the trusted CA certificates to use in the verification + * process - see certificate + * verification for more information about this parameter. + *

+ * @param string $extracerts [optional]

+ * If the extracerts is specified, it is the filename + * of a file containing a bunch of certificates to use as untrusted CAs. + *

+ * @param string $content [optional]

+ * You can specify a filename with content that will + * be filled with the verified data, but with the signature information + * stripped. + *

+ * @return mixed TRUE if the signature is verified, FALSE if it is not correct + * (the message has been tampered with, or the signing certificate is invalid), + * or -1 on error. + * @jms-builtin + */ +function openssl_pkcs7_verify ($filename, $flags, $outfilename = null, array $cainfo = null, $extracerts = null, $content = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Decrypts an S/MIME encrypted message + * @link http://php.net/manual/en/function.openssl-pkcs7-decrypt.php + * @param string $infilename + * @param string $outfilename

+ * The decrypted message is written to the file specified by + * outfilename. + *

+ * @param mixed $recipcert + * @param mixed $recipkey [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_pkcs7_decrypt ($infilename, $outfilename, $recipcert, $recipkey = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Sign an S/MIME message + * @link http://php.net/manual/en/function.openssl-pkcs7-sign.php + * @param string $infilename + * @param string $outfilename + * @param mixed $signcert + * @param mixed $privkey + * @param array $headers

+ * headers is an array of headers that + * will be prepended to the data after it has been signed (see + * openssl_pkcs7_encrypt for more information about + * the format of this parameter). + *

+ * @param int $flags [optional]

+ * flags can be used to alter the output - see PKCS7 constants. + *

+ * @param string $extracerts [optional]

+ * extracerts specifies the name of a file containing + * a bunch of extra certificates to include in the signature which can for + * example be used to help the recipient to verify the certificate that you used. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_pkcs7_sign ($infilename, $outfilename, $signcert, $privkey, array $headers, $flags = 'PKCS7_DETACHED', $extracerts = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Encrypt an S/MIME message + * @link http://php.net/manual/en/function.openssl-pkcs7-encrypt.php + * @param string $infile + * @param string $outfile + * @param mixed $recipcerts

+ * Either a lone X.509 certificate, or an array of X.509 certificates. + *

+ * @param array $headers

+ * headers is an array of headers that + * will be prepended to the data after it has been encrypted. + *

+ *

+ * headers can be either an associative array + * keyed by header name, or an indexed array, where each element contains + * a single header line. + *

+ * @param int $flags [optional]

+ * flags can be used to specify options that affect + * the encoding process - see PKCS7 + * constants. + *

+ * @param int $cipherid [optional]

+ * One of cipher constants. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_pkcs7_encrypt ($infile, $outfile, $recipcerts, array $headers, $flags = 0, $cipherid = 'OPENSSL_CIPHER_RC2_40') {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Encrypts data with private key + * @link http://php.net/manual/en/function.openssl-private-encrypt.php + * @param string $data + * @param string $crypted + * @param mixed $key + * @param int $padding [optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_private_encrypt ($data, &$crypted, $key, $padding = 'OPENSSL_PKCS1_PADDING') {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Decrypts data with private key + * @link http://php.net/manual/en/function.openssl-private-decrypt.php + * @param string $data + * @param string $decrypted + * @param mixed $key

+ * key must be the private key corresponding that + * was used to encrypt the data. + *

+ * @param int $padding [optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_SSLV23_PADDING, + * OPENSSL_PKCS1_OAEP_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_private_decrypt ($data, &$decrypted, $key, $padding = 'OPENSSL_PKCS1_PADDING') {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Encrypts data with public key + * @link http://php.net/manual/en/function.openssl-public-encrypt.php + * @param string $data + * @param string $crypted

+ * This will hold the result of the encryption. + *

+ * @param mixed $key

+ * The public key. + *

+ * @param int $padding [optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_SSLV23_PADDING, + * OPENSSL_PKCS1_OAEP_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_public_encrypt ($data, &$crypted, $key, $padding = 'OPENSSL_PKCS1_PADDING') {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Decrypts data with public key + * @link http://php.net/manual/en/function.openssl-public-decrypt.php + * @param string $data + * @param string $decrypted + * @param mixed $key

+ * key must be the public key corresponding that + * was used to encrypt the data. + *

+ * @param int $padding [optional]

+ * padding can be one of + * OPENSSL_PKCS1_PADDING, + * OPENSSL_NO_PADDING. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openssl_public_decrypt ($data, &$decrypted, $key, $padding = 'OPENSSL_PKCS1_PADDING') {} + +/** + * (PHP 5 >= 5.3.0)
+ * Gets available digest methods + * @link http://php.net/manual/en/function.openssl-get-md-methods.php + * @param bool $aliases [optional]

+ * Set to TRUE if digest aliases should be included within the + * returned array. + *

+ * @return array An array of available digest methods. + * @jms-builtin + */ +function openssl_get_md_methods ($aliases = false) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Gets available cipher methods + * @link http://php.net/manual/en/function.openssl-get-cipher-methods.php + * @param bool $aliases [optional]

+ * Set to TRUE if cipher aliases should be included within the + * returned array. + *

+ * @return array An array of available cipher methods. + * @jms-builtin + */ +function openssl_get_cipher_methods ($aliases = false) {} + +/** + * (No version information available, might only be in SVN)
+ * Computes shared secret for public value of remote DH key and local DH key + * @link http://php.net/manual/en/function.openssl-dh-compute-key.php + * @param string $pub_key

+ * Public key + *

+ * @param resource $dh_key

+ * DH key + *

+ * @return string computed key on success or FALSE on failure. + * @jms-builtin + */ +function openssl_dh_compute_key ($pub_key, $dh_key) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Generate a pseudo-random string of bytes + * @link http://php.net/manual/en/function.openssl-random-pseudo-bytes.php + * @param int $length

+ * The length of the desired string of bytes. Must be a positive integer. PHP will + * try to cast this parameter to a non-null integer to use it. + *

+ * @param bool $crypto_strong [optional]

+ * If passed into the function, this will hold a boolean value that determines + * if the algorithm used was "cryptographically strong", e.g., safe for usage with GPG, + * passwords, etc. TRUE if it did, otherwise FALSE + *

+ * @return string the generated string of bytes on success, or FALSE on failure. + * @jms-builtin + */ +function openssl_random_pseudo_bytes ($length, &$crypto_strong = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Return openSSL error message + * @link http://php.net/manual/en/function.openssl-error-string.php + * @return string an error message string, or FALSE if there are no more error + * messages to return. + * @jms-builtin + */ +function openssl_error_string () {} + +define ('OPENSSL_VERSION_TEXT', "OpenSSL 1.0.1 14 Mar 2012"); +define ('OPENSSL_VERSION_NUMBER', 268439567); +define ('X509_PURPOSE_SSL_CLIENT', 1); +define ('X509_PURPOSE_SSL_SERVER', 2); +define ('X509_PURPOSE_NS_SSL_SERVER', 3); +define ('X509_PURPOSE_SMIME_SIGN', 4); +define ('X509_PURPOSE_SMIME_ENCRYPT', 5); +define ('X509_PURPOSE_CRL_SIGN', 6); +define ('X509_PURPOSE_ANY', 7); + +/** + * Used as default algorithm by openssl_sign and + * openssl_verify. + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('OPENSSL_ALGO_SHA1', 1); +define ('OPENSSL_ALGO_MD5', 2); +define ('OPENSSL_ALGO_MD4', 3); +define ('OPENSSL_ALGO_DSS1', 5); + +/** + * When signing a message, use cleartext signing with the MIME + * type "multipart/signed". This is the default + * if you do not specify any flags to + * openssl_pkcs7_sign. + * If you turn this option off, the message will be signed using + * opaque signing, which is more resistant to translation by mail relays + * but cannot be read by mail agents that do not support S/MIME. + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_DETACHED', 64); + +/** + * Adds text/plain content type headers to encrypted/signed + * message. If decrypting or verifying, it strips those headers from + * the output - if the decrypted or verified message is not of MIME type + * text/plain then an error will occur. + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_TEXT', 1); + +/** + * When verifying a message, certificates (if + * any) included in the message are normally searched for the + * signing certificate. With this option only the + * certificates specified in the extracerts + * parameter of openssl_pkcs7_verify are + * used. The supplied certificates can still be used as + * untrusted CAs however. + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOINTERN', 16); + +/** + * Do not verify the signers certificate of a signed + * message. + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOVERIFY', 32); + +/** + * Do not chain verification of signers certificates: that is + * don't use the certificates in the signed message as untrusted CAs. + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOCHAIN', 8); + +/** + * When signing a message the signer's certificate is normally + * included - with this option it is excluded. This will reduce the + * size of the signed message but the verifier must have a copy of the + * signers certificate available locally (passed using the + * extracerts to + * openssl_pkcs7_verify for example). + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOCERTS', 2); + +/** + * Normally when a message is signed, a set of attributes are + * included which include the signing time and the supported symmetric + * algorithms. With this option they are not included. + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOATTR', 256); + +/** + * Normally the input message is converted to "canonical" format + * which is effectively using CR and LF + * as end of line: as required by the S/MIME specification. When this + * option is present, no translation occurs. This is useful when + * handling binary data which may not be in MIME format. + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_BINARY', 128); + +/** + * Don't try and verify the signatures on a message + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('PKCS7_NOSIGS', 4); +define ('OPENSSL_PKCS1_PADDING', 1); +define ('OPENSSL_SSLV23_PADDING', 2); +define ('OPENSSL_NO_PADDING', 3); +define ('OPENSSL_PKCS1_OAEP_PADDING', 4); +define ('OPENSSL_CIPHER_RC2_40', 0); +define ('OPENSSL_CIPHER_RC2_128', 1); +define ('OPENSSL_CIPHER_RC2_64', 2); +define ('OPENSSL_CIPHER_DES', 3); +define ('OPENSSL_CIPHER_3DES', 4); +define ('OPENSSL_CIPHER_AES_128_CBC', 5); +define ('OPENSSL_CIPHER_AES_192_CBC', 6); +define ('OPENSSL_CIPHER_AES_256_CBC', 7); +define ('OPENSSL_KEYTYPE_RSA', 0); +define ('OPENSSL_KEYTYPE_DSA', 1); +define ('OPENSSL_KEYTYPE_DH', 2); +define ('OPENSSL_KEYTYPE_EC', 3); +define ('OPENSSL_RAW_DATA', 1); +define ('OPENSSL_ZERO_PADDING', 2); + +/** + * Whether SNI support is available or not. + * @link http://php.net/manual/en/openssl.constants.php + */ +define ('OPENSSL_TLSEXT_SERVER_NAME', 1); + +// End of openssl v. +?> diff --git a/res/php-5.4-core-api/pcntl.php b/res/php-5.4-core-api/pcntl.php new file mode 100644 index 0000000..e343743 --- /dev/null +++ b/res/php-5.4-core-api/pcntl.php @@ -0,0 +1,779 @@ + + * Forks the currently running process + * @link http://php.net/manual/en/function.pcntl-fork.php + * @return int On success, the PID of the child process is returned in the + * parent's thread of execution, and a 0 is returned in the child's + * thread of execution. On failure, a -1 will be returned in the + * parent's context, no child process will be created, and a PHP + * error is raised. + * @jms-builtin + */ +function pcntl_fork () {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Waits on or returns the status of a forked child + * @link http://php.net/manual/en/function.pcntl-waitpid.php + * @param int $pid

+ * The value of pid can be one of the following: + * + * possible values for pid + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
< -1 + * wait for any child process whose process group ID is equal to + * the absolute value of pid. + *
-1 + * wait for any child process; this is the same behaviour that + * the wait function exhibits. + *
0 + * wait for any child process whose process group ID is equal to + * that of the calling process. + *
> 0 + * wait for the child whose process ID is equal to the value of + * pid. + *
+ *

+ *

+ * Specifying -1 as the pid is + * equivalent to the functionality pcntl_wait provides + * (minus options). + *

+ * @param int $status

+ * pcntl_waitpid will store status information + * in the status parameter which can be + * evaluated using the following functions: + * pcntl_wifexited, + * pcntl_wifstopped, + * pcntl_wifsignaled, + * pcntl_wexitstatus, + * pcntl_wtermsig and + * pcntl_wstopsig. + *

+ * @param int $options [optional]

+ * The value of options is the value of zero + * or more of the following two global constants + * OR'ed together: + * + * possible values for options + * + * + * + * + * + * + * + * + *
WNOHANG + * return immediately if no child has exited. + *
WUNTRACED + * return for children which are stopped, and whose status has + * not been reported. + *
+ *

+ * @return int pcntl_waitpid returns the process ID of the + * child which exited, -1 on error or zero if WNOHANG was used and no + * child was available + * @jms-builtin + */ +function pcntl_waitpid ($pid, &$status, $options = 0) {} + +/** + * (PHP 5)
+ * Waits on or returns the status of a forked child + * @link http://php.net/manual/en/function.pcntl-wait.php + * @param int $status

+ * pcntl_wait will store status information + * in the status parameter which can be + * evaluated using the following functions: + * pcntl_wifexited, + * pcntl_wifstopped, + * pcntl_wifsignaled, + * pcntl_wexitstatus, + * pcntl_wtermsig and + * pcntl_wstopsig. + *

+ * @param int $options [optional]

+ * If wait3 is available on your system (mostly BSD-style systems), you can + * provide the optional options parameter. If this + * parameter is not provided, wait will be used for the system call. If + * wait3 is not available, providing a value for options + * will have no effect. The value of options + * is the value of zero or more of the following two constants + * OR'ed together: + * + * Possible values for options + * + * + * + * + * + * + * + * + *
WNOHANG + * Return immediately if no child has exited. + *
WUNTRACED + * Return for children which are stopped, and whose status has + * not been reported. + *
+ *

+ * @return int pcntl_wait returns the process ID of the + * child which exited, -1 on error or zero if WNOHANG was provided as an + * option (on wait3-available systems) and no child was available. + * @jms-builtin + */ +function pcntl_wait (&$status, $options = 0) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Installs a signal handler + * @link http://php.net/manual/en/function.pcntl-signal.php + * @param int $signo

+ * The signal number. + *

+ * @param callable $handler

+ * The signal handler which may be the name of a user created function, + * or method, or either of the two global constants + * SIG_IGN or SIG_DFL. + *

+ *

+ * Note that when you set a handler to an object method, that object's + * reference count is increased which makes it persist until you either + * change the handler to something else, or your script ends. + *

+ * @param bool $restart_syscalls [optional]

+ * Specifies whether system call restarting should be used when this + * signal arrives. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pcntl_signal ($signo, callable $handler, $restart_syscalls = true) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Calls signal handlers for pending signals + * @link http://php.net/manual/en/function.pcntl-signal-dispatch.php + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pcntl_signal_dispatch () {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Checks if status code represents a normal exit + * @link http://php.net/manual/en/function.pcntl-wifexited.php + * @param int $status The status + * parameter is the status parameter supplied to a successful + * call to pcntl_waitpid.

+ * @return bool TRUE if the child status code represents a normal exit, FALSE + * otherwise. + * @jms-builtin + */ +function pcntl_wifexited ($status) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Checks whether the child process is currently stopped + * @link http://php.net/manual/en/function.pcntl-wifstopped.php + * @param int $status The status + * parameter is the status parameter supplied to a successful + * call to pcntl_waitpid.

+ * @return bool TRUE if the child process which caused the return is + * currently stopped, FALSE otherwise. + * @jms-builtin + */ +function pcntl_wifstopped ($status) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Checks whether the status code represents a termination due to a signal + * @link http://php.net/manual/en/function.pcntl-wifsignaled.php + * @param int $status The status + * parameter is the status parameter supplied to a successful + * call to pcntl_waitpid.

+ * @return bool TRUE if the child process exited because of a signal which was + * not caught, FALSE otherwise. + * @jms-builtin + */ +function pcntl_wifsignaled ($status) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Returns the return code of a terminated child + * @link http://php.net/manual/en/function.pcntl-wexitstatus.php + * @param int $status The status + * parameter is the status parameter supplied to a successful + * call to pcntl_waitpid.

+ * @return int the return code, as an integer. + * @jms-builtin + */ +function pcntl_wexitstatus ($status) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Returns the signal which caused the child to terminate + * @link http://php.net/manual/en/function.pcntl-wtermsig.php + * @param int $status The status + * parameter is the status parameter supplied to a successful + * call to pcntl_waitpid.

+ * @return int the signal number, as an integer. + * @jms-builtin + */ +function pcntl_wtermsig ($status) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Returns the signal which caused the child to stop + * @link http://php.net/manual/en/function.pcntl-wstopsig.php + * @param int $status The status + * parameter is the status parameter supplied to a successful + * call to pcntl_waitpid.

+ * @return int the signal number. + * @jms-builtin + */ +function pcntl_wstopsig ($status) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Executes specified program in current process space + * @link http://php.net/manual/en/function.pcntl-exec.php + * @param string $path

+ * path must be the path to a binary executable or a + * script with a valid path pointing to an executable in the shebang ( + * #!/usr/local/bin/perl for example) as the first line. See your system's + * man execve(2) page for additional information. + *

+ * @param array $args [optional]

+ * args is an array of argument strings passed to the + * program. + *

+ * @param array $envs [optional]

+ * envs is an array of strings which are passed as + * environment to the program. The array is in the format of name => value, + * the key being the name of the environmental variable and the value being + * the value of that variable. + *

+ * @return void FALSE on error and does not return on success. + * @jms-builtin + */ +function pcntl_exec ($path, array $args = null, array $envs = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Set an alarm clock for delivery of a signal + * @link http://php.net/manual/en/function.pcntl-alarm.php + * @param int $seconds

+ * The number of seconds to wait. If seconds is + * zero, no new alarm is created. + *

+ * @return int the time in seconds that any previously scheduled alarm had + * remaining before it was to be delivered, or 0 if there + * was no previously scheduled alarm. + * @jms-builtin + */ +function pcntl_alarm ($seconds) {} + +/** @jms-builtin */ +function pcntl_get_last_error () {} + +/** @jms-builtin */ +function pcntl_errno () {} + +/** + * @param $errno + * @jms-builtin + */ +function pcntl_strerror ($errno) {} + +/** + * (PHP 5)
+ * Get the priority of any process + * @link http://php.net/manual/en/function.pcntl-getpriority.php + * @param int $pid [optional]

+ * If not specified, the pid of the current process is used. + *

+ * @param int $process_identifier [optional]

+ * One of PRIO_PGRP, PRIO_USER + * or PRIO_PROCESS. + *

+ * @return int pcntl_getpriority returns the priority of the process + * or FALSE on error. A lower numerical value causes more favorable + * scheduling. + * @jms-builtin + */ +function pcntl_getpriority ($pid = 'getmypid()', $process_identifier = 'PRIO_PROCESS') {} + +/** + * (PHP 5)
+ * Change the priority of any process + * @link http://php.net/manual/en/function.pcntl-setpriority.php + * @param int $priority

+ * priority is generally a value in the range + * -20 to 20. The default priority + * is 0 while a lower numerical value causes more + * favorable scheduling. Because priority levels can differ between + * system types and kernel versions, please see your system's setpriority(2) + * man page for specific details. + *

+ * @param int $pid [optional]

+ * If not specified, the pid of the current process is used. + *

+ * @param int $process_identifier [optional]

+ * One of PRIO_PGRP, PRIO_USER + * or PRIO_PROCESS. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pcntl_setpriority ($priority, $pid = 'getmypid()', $process_identifier = 'PRIO_PROCESS') {} + +/** + * (PHP 5 >= 5.3.0)
+ * Sets and retrieves blocked signals + * @link http://php.net/manual/en/function.pcntl-sigprocmask.php + * @param int $how

+ * Sets the behavior of pcntl_sigprocmask. Possible + * values: + * SIG_BLOCK: Add the signals to the + * currently blocked signals. + * SIG_UNBLOCK: Remove the signals from the + * currently blocked signals. + * SIG_SETMASK: Replace the currently + * blocked signals by the given list of signals. + *

+ * @param array $set

+ * List of signals. + *

+ * @param array $oldset [optional]

+ * The oldset parameter is set to an array + * containing the list of the previously blocked signals. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pcntl_sigprocmask ($how, array $set, array &$oldset = null) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Waits for signals + * @link http://php.net/manual/en/function.pcntl-sigwaitinfo.php + * @param array $set

+ * Array of signals to wait for. + *

+ * @param array $siginfo [optional]

+ * The siginfo parameter is set to an array containing + * informations about the signal. + *

+ *

+ * The following elements are set for all signals: + * signo: Signal number + * errno: An error number + * code: Signal code + *

+ *

+ * The following elements may be set for the SIGCHLD signal: + * status: Exit value or signal + * utime: User time consumed + * stime: System time consumed + * pid: Sending process ID + * uid: Real user ID of sending process + *

+ *

+ * The following elements may be set for the SIGILL, + * SIGFPE, SIGSEGV and + * SIGBUS signals: + * addr: Memory location which caused fault + *

+ *

+ * The following element may be set for the SIGPOLL + * signal: + * band: Band event + * fd: File descriptor number + *

+ * @return int On success, pcntl_sigwaitinfo returns a signal number. + * @jms-builtin + */ +function pcntl_sigwaitinfo (array $set, array &$siginfo = null) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Waits for signals, with a timeout + * @link http://php.net/manual/en/function.pcntl-sigtimedwait.php + * @param array $set

+ * Array of signals to wait for. + *

+ * @param array $siginfo [optional]

+ * The siginfo is set to an array containing + * informations about the signal. See + * pcntl_sigwaitinfo. + *

+ * @param int $seconds [optional]

+ * Timeout in seconds. + *

+ * @param int $nanoseconds [optional]

+ * Timeout in nanoseconds. + *

+ * @return int On success, pcntl_sigtimedwait returns a signal number. + * @jms-builtin + */ +function pcntl_sigtimedwait (array $set, array &$siginfo = null, $seconds = 0, $nanoseconds = 0) {} + +define ('WNOHANG', 1); +define ('WUNTRACED', 2); +define ('SIG_IGN', 1); +define ('SIG_DFL', 0); +define ('SIG_ERR', -1); +define ('SIGHUP', 1); +define ('SIGINT', 2); +define ('SIGQUIT', 3); +define ('SIGILL', 4); +define ('SIGTRAP', 5); +define ('SIGABRT', 6); +define ('SIGIOT', 6); +define ('SIGBUS', 7); +define ('SIGFPE', 8); +define ('SIGKILL', 9); +define ('SIGUSR1', 10); +define ('SIGSEGV', 11); +define ('SIGUSR2', 12); +define ('SIGPIPE', 13); +define ('SIGALRM', 14); +define ('SIGTERM', 15); +define ('SIGSTKFLT', 16); +define ('SIGCLD', 17); +define ('SIGCHLD', 17); +define ('SIGCONT', 18); +define ('SIGSTOP', 19); +define ('SIGTSTP', 20); +define ('SIGTTIN', 21); +define ('SIGTTOU', 22); +define ('SIGURG', 23); +define ('SIGXCPU', 24); +define ('SIGXFSZ', 25); +define ('SIGVTALRM', 26); +define ('SIGPROF', 27); +define ('SIGWINCH', 28); +define ('SIGPOLL', 29); +define ('SIGIO', 29); +define ('SIGPWR', 30); +define ('SIGSYS', 31); +define ('SIGBABY', 31); +define ('PRIO_PGRP', 1); +define ('PRIO_USER', 2); +define ('PRIO_PROCESS', 0); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SIG_BLOCK', 0); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SIG_UNBLOCK', 1); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SIG_SETMASK', 2); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SI_USER', 0); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SI_KERNEL', 128); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SI_QUEUE', -1); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SI_TIMER', -2); +define ('SI_MESGQ', -3); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SI_ASYNCIO', -4); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SI_SIGIO', -5); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SI_TKILL', -6); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('CLD_EXITED', 1); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('CLD_KILLED', 2); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('CLD_DUMPED', 3); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('CLD_TRAPPED', 4); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('CLD_STOPPED', 5); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('CLD_CONTINUED', 6); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('TRAP_BRKPT', 1); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('TRAP_TRACE', 2); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('POLL_IN', 1); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('POLL_OUT', 2); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('POLL_MSG', 3); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('POLL_ERR', 4); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('POLL_PRI', 5); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('POLL_HUP', 6); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('ILL_ILLOPC', 1); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('ILL_ILLOPN', 2); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('ILL_ILLADR', 3); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('ILL_ILLTRP', 4); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('ILL_PRVOPC', 5); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('ILL_PRVREG', 6); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('ILL_COPROC', 7); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('ILL_BADSTK', 8); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('FPE_INTDIV', 1); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('FPE_INTOVF', 2); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('FPE_FLTDIV', 3); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('FPE_FLTOVF', 4); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('FPE_FLTUND', 7); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('FPE_FLTRES', 6); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('FPE_FLTINV', 7); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('FPE_FLTSUB', 8); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SEGV_MAPERR', 1); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('SEGV_ACCERR', 2); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('BUS_ADRALN', 1); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('BUS_ADRERR', 2); + +/** + * Available since PHP 5.3.0. + * @link http://php.net/manual/en/pcntl.constants.php + */ +define ('BUS_OBJERR', 3); +define ('PCNTL_EINTR', 4); +define ('PCNTL_ECHILD', 10); +define ('PCNTL_EINVAL', 22); +define ('PCNTL_EAGAIN', 11); +define ('PCNTL_ESRCH', 3); +define ('PCNTL_EACCES', 13); +define ('PCNTL_EPERM', 1); +define ('PCNTL_ENOMEM', 12); +define ('PCNTL_E2BIG', 7); +define ('PCNTL_EFAULT', 14); +define ('PCNTL_EIO', 5); +define ('PCNTL_EISDIR', 21); +define ('PCNTL_ELIBBAD', 80); +define ('PCNTL_ELOOP', 40); +define ('PCNTL_EMFILE', 24); +define ('PCNTL_ENAMETOOLONG', 36); +define ('PCNTL_ENFILE', 23); +define ('PCNTL_ENOENT', 2); +define ('PCNTL_ENOEXEC', 8); +define ('PCNTL_ENOTDIR', 20); +define ('PCNTL_ETXTBSY', 26); + +// End of pcntl v. +?> diff --git a/res/php-5.4-core-api/pcre.php b/res/php-5.4-core-api/pcre.php new file mode 100644 index 0000000..5c9ceed --- /dev/null +++ b/res/php-5.4-core-api/pcre.php @@ -0,0 +1,512 @@ + + * Perform a regular expression match + * @link http://php.net/manual/en/function.preg-match.php + * @param string $pattern

+ * The pattern to search for, as a string. + *

+ * @param string $subject

+ * The input string. + *

+ * @param array $matches [optional]

+ * If matches is provided, then it is filled with + * the results of search. $matches[0] will contain the + * text that matched the full pattern, $matches[1] + * will have the text that matched the first captured parenthesized + * subpattern, and so on. + *

+ * @param int $flags [optional]

+ * flags can be the following flag: + * PREG_OFFSET_CAPTURE + * If this flag is passed, for every occurring match the appendant string + * offset will also be returned. Note that this changes the value of + * matches into an array where every element is an + * array consisting of the matched string at offset 0 + * and its string offset into subject at offset + * 1. + * @param int $offset [optional]

+ * Normally, the search starts from the beginning of the subject string. + * The optional parameter offset can be used to + * specify the alternate place from which to start the search (in bytes). + *

+ *

+ * Using offset is not equivalent to passing + * substr($subject, $offset) to + * preg_match in place of the subject string, + * because pattern can contain assertions such as + * ^, $ or + * (?<=x). Compare: + * + * $subject = "abcdef"; + * $pattern = '/^def/'; + * preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3); + * print_r($matches); + * + * The above example will output:

+ *
+ * Array
+ * (
+ * )
+ * 
+ *

+ * while this example + *

+ * + * $subject = "abcdef"; + * $pattern = '/^def/'; + * preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE); + * print_r($matches); + * + *

+ * will produce + *

+ *
+ * Array
+ * (
+ * [0] => Array
+ * (
+ * [0] => def
+ * [1] => 0
+ * )
+ * )
+ * 
+ *

+ * @return int preg_match returns the number of times + * pattern matches. That will be either 0 times + * (no match) or 1 time because preg_match will stop + * searching after the first match. preg_match_all + * on the contrary will continue until it reaches the end of + * subject. + * preg_match returns FALSE if an error occurred. + * @jms-builtin + */ +function preg_match ($pattern, $subject, array &$matches = null, $flags = 0, $offset = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Perform a global regular expression match + * @link http://php.net/manual/en/function.preg-match-all.php + * @param string $pattern

+ * The pattern to search for, as a string. + *

+ * @param string $subject

+ * The input string. + *

+ * @param array> $matches [optional]

+ * Normally, the search starts from the beginning of the subject string. + * The optional parameter offset can be used to + * specify the alternate place from which to start the search (in bytes). + *

+ *

+ * Using offset is not equivalent to passing + * substr($subject, $offset) to + * preg_match_all in place of the subject string, + * because pattern can contain assertions such as + * ^, $ or + * (?<=x). See preg_match + * for examples. + *

+ * @param int $flags [optional]

+ * Can be a combination of the following flags (note that it doesn't make + * sense to use PREG_PATTERN_ORDER together with + * PREG_SET_ORDER): + * PREG_PATTERN_ORDER + *

+ * Orders results so that $matches[0] is an array of full + * pattern matches, $matches[1] is an array of strings matched by + * the first parenthesized subpattern, and so on. + *

+ *

+ * + * preg_match_all("|]+>(.*)]+>|U", + * "example: this is a test", + * $out, PREG_PATTERN_ORDER); + * echo $out[0][0] . ", " . $out[0][1] . "\n"; + * echo $out[1][0] . ", " . $out[1][1] . "\n"; + * + * The above example will output:

+ *
+ * example: , this is a test
+ * example: , this is a test
+ * 
+ *

+ * So, $out[0] contains array of strings that matched full pattern, + * and $out[1] contains array of strings enclosed by tags. + *

+ *

+ * @param int $offset [optional] + * @return int the number of full pattern matches (which might be zero), + * or FALSE if an error occurred. + * @jms-builtin + */ +function preg_match_all ($pattern, $subject, array &$matches = null, $flags = 'PREG_PATTERN_ORDER', $offset = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Perform a regular expression search and replace + * @link http://php.net/manual/en/function.preg-replace.php + * @param string|array $pattern

+ * The pattern to search for. It can be either a string or an array with + * strings. + *

+ *

+ * Several PCRE modifiers + * are also available, including 'e' (PREG_REPLACE_EVAL), which + * is specific to this function. + *

+ * @param string|array $replacement

+ * The string or an array with strings to replace. If this parameter is a + * string and the pattern parameter is an array, + * all patterns will be replaced by that string. If both + * pattern and replacement + * parameters are arrays, each pattern will be + * replaced by the replacement counterpart. If + * there are fewer elements in the replacement + * array than in the pattern array, any extra + * patterns will be replaced by an empty string. + *

+ *

+ * replacement may contain references of the form + * \\n or (since PHP 4.0.4) + * $n, with the latter form + * being the preferred one. Every such reference will be replaced by the text + * captured by the n'th parenthesized pattern. + * n can be from 0 to 99, and + * \\0 or $0 refers to the text matched + * by the whole pattern. Opening parentheses are counted from left to right + * (starting from 1) to obtain the number of the capturing subpattern. + * To use backslash in replacement, it must be doubled + * ("\\\\" PHP string). + *

+ *

+ * When working with a replacement pattern where a backreference is + * immediately followed by another number (i.e.: placing a literal number + * immediately after a matched pattern), you cannot use the familiar + * \\1 notation for your backreference. + * \\11, for example, would confuse + * preg_replace since it does not know whether you + * want the \\1 backreference followed by a literal + * 1, or the \\11 backreference + * followed by nothing. In this case the solution is to use + * \${1}1. This creates an isolated + * $1 backreference, leaving the 1 + * as a literal. + *

+ *

+ * When using the e modifier, this function escapes + * some characters (namely ', ", + * \ and NULL) in the strings that replace the + * backreferences. This is done to ensure that no syntax errors arise + * from backreference usage with either single or double quotes (e.g. + * 'strlen(\'$1\')+strlen("$2")'). Make sure you are + * aware of PHP's string + * syntax to know exactly how the interpreted string will look. + *

+ * @param string|array $subject

+ * The string or an array with strings to search and replace. + *

+ *

+ * If subject is an array, then the search and + * replace is performed on every entry of subject, + * and the return value is an array as well. + *

+ * @param int $limit [optional]

+ * The maximum possible replacements for each pattern in each + * subject string. Defaults to + * -1 (no limit). + *

+ * @param int $count [optional]

+ * If specified, this variable will be filled with the number of + * replacements done. + *

+ * @return string|array preg_replace returns an array if the + * subject parameter is an array, or a string + * otherwise. + *

+ *

+ * If matches are found, the new subject will + * be returned, otherwise subject will be + * returned unchanged or NULL if an error occurred. + * @jms-builtin + */ +function preg_replace ($pattern, $replacement, $subject, $limit = -1, &$count = null) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Perform a regular expression search and replace using a callback + * @link http://php.net/manual/en/function.preg-replace-callback.php + * @param string|array $pattern

+ * The pattern to search for. It can be either a string or an array with + * strings. + *

+ * @param callable $callback

+ * A callback that will be called and passed an array of matched elements + * in the subject string. The callback should + * return the replacement string. + *

+ *

+ * You'll often need the callback function + * for a preg_replace_callback in just one place. + * In this case you can use an + * anonymous function (since + * PHP 5.3.0) or create_function to + * declare an anonymous function as callback within the call to + * preg_replace_callback. By doing it this way + * you have all information for the call in one place and do not + * clutter the function namespace with a callback function's name + * not used anywhere else. + *

+ *

+ * preg_replace_callback and + * create_function + * + * /* a unix-style command line filter to convert uppercase + * * letters at the beginning of paragraphs to lowercase * / + * $fp = fopen("php://stdin", "r") or die("can't read stdin"); + * while (!feof($fp)) { + * $line = fgets($fp); + * $line = preg_replace_callback( + * '|

\s*\w|', + * create_function( + * // single quotes are essential here, + * // or alternative escape all $ as \$ + * '$matches', + * 'return strtolower($matches[0]);' + * ), + * $line + * ); + * echo $line; + * } + * fclose($fp); + * + *

+ * @param string|array $subject

+ * The string or an array with strings to search and replace. + *

+ * @param int $limit [optional]

+ * The maximum possible replacements for each pattern in each + * subject string. Defaults to + * -1 (no limit). + *

+ * @param int $count [optional]

+ * If specified, this variable will be filled with the number of + * replacements done. + *

+ * @return string|array preg_replace_callback returns an array if the + * subject parameter is an array, or a string + * otherwise. On errors the return value is NULL + *

+ *

+ * If matches are found, the new subject will be returned, otherwise + * subject will be returned unchanged. + * @jms-builtin + */ +function preg_replace_callback ($pattern, callable $callback, $subject, $limit = -1, &$count = null) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Perform a regular expression search and replace + * @link http://php.net/manual/en/function.preg-filter.php + * @param string|array $pattern + * @param string|array $replacement + * @param string|array $subject + * @param int $limit [optional] + * @param int $count [optional] + * @return string|array an array if the subject + * parameter is an array, or a string otherwise. + *

+ *

+ * If no matches are found or an error occurred, an empty array + * is returned when subject is an array + * or NULL otherwise. + * @jms-builtin + */ +function preg_filter ($pattern, $replacement, $subject, $limit = -1, &$count = null) {} + +/** + * (PHP 4, PHP 5)
+ * Split string by a regular expression + * @link http://php.net/manual/en/function.preg-split.php + * @param string $pattern

+ * The pattern to search for, as a string. + *

+ * @param string $subject

+ * The input string. + *

+ * @param int $limit [optional]

+ * If specified, then only substrings up to limit + * are returned with the rest of the string being placed in the last + * substring. A limit of -1, 0 or NULL means "no limit" + * and, as is standard across PHP, you can use NULL to skip to the + * flags parameter. + *

+ * @param int $flags [optional]

+ * flags can be any combination of the following + * flags (combined with the | bitwise operator): + * PREG_SPLIT_NO_EMPTY + * If this flag is set, only non-empty pieces will be returned by + * preg_split. + * @return array an array containing substrings of subject + * split along boundaries matched by pattern. + * @jms-builtin + */ +function preg_split ($pattern, $subject, $limit = -1, $flags = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Quote regular expression characters + * @link http://php.net/manual/en/function.preg-quote.php + * @param string $str

+ * The input string. + *

+ * @param string $delimiter [optional]

+ * If the optional delimiter is specified, it + * will also be escaped. This is useful for escaping the delimiter + * that is required by the PCRE functions. The / is the most commonly + * used delimiter. + *

+ * @return string the quoted string. + * @jms-builtin + */ +function preg_quote ($str, $delimiter = null) {} + +/** + * (PHP 4, PHP 5)
+ * Return array entries that match the pattern + * @link http://php.net/manual/en/function.preg-grep.php + * @param string $pattern

+ * The pattern to search for, as a string. + *

+ * @param array $input

+ * The input array. + *

+ * @param int $flags [optional]

+ * If set to PREG_GREP_INVERT, this function returns + * the elements of the input array that do not match + * the given pattern. + *

+ * @return array an array indexed using the keys from the + * input array. + * @jms-builtin + */ +function preg_grep ($pattern, array $input, $flags = 0) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Returns the error code of the last PCRE regex execution + * @link http://php.net/manual/en/function.preg-last-error.php + * @return int one of the following constants (explained on their own page): + * PREG_NO_ERROR + * PREG_INTERNAL_ERROR + * PREG_BACKTRACK_LIMIT_ERROR (see also pcre.backtrack_limit) + * PREG_RECURSION_LIMIT_ERROR (see also pcre.recursion_limit) + * PREG_BAD_UTF8_ERROR + * PREG_BAD_UTF8_OFFSET_ERROR (since PHP 5.3.0) + * @jms-builtin + */ +function preg_last_error () {} + + +/** + * Orders results so that $matches[0] is an array of full pattern + * matches, $matches[1] is an array of strings matched by the first + * parenthesized subpattern, and so on. This flag is only used with + * preg_match_all. + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_PATTERN_ORDER', 1); + +/** + * Orders results so that $matches[0] is an array of first set of + * matches, $matches[1] is an array of second set of matches, and so + * on. This flag is only used with preg_match_all. + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_SET_ORDER', 2); + +/** + * See the description of + * PREG_SPLIT_OFFSET_CAPTURE. + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_OFFSET_CAPTURE', 256); + +/** + * This flag tells preg_split to return only non-empty + * pieces. + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_SPLIT_NO_EMPTY', 1); + +/** + * This flag tells preg_split to capture + * parenthesized expression in the delimiter pattern as well. + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_SPLIT_DELIM_CAPTURE', 2); + +/** + * If this flag is set, for every occurring match the appendant string + * offset will also be returned. Note that this changes the return + * values in an array where every element is an array consisting of the + * matched string at offset 0 and its string offset within subject at + * offset 1. This flag is only used for preg_split. + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_SPLIT_OFFSET_CAPTURE', 4); +define ('PREG_GREP_INVERT', 1); + +/** + * Returned by preg_last_error if there were no + * errors. + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_NO_ERROR', 0); + +/** + * Returned by preg_last_error if there was an + * internal PCRE error. + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_INTERNAL_ERROR', 1); + +/** + * Returned by preg_last_error if backtrack limit was exhausted. + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_BACKTRACK_LIMIT_ERROR', 2); + +/** + * Returned by preg_last_error if recursion limit was exhausted. + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_RECURSION_LIMIT_ERROR', 3); + +/** + * Returned by preg_last_error if the last error was + * caused by malformed UTF-8 data (only when running a regex in UTF-8 mode). + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_BAD_UTF8_ERROR', 4); + +/** + * Returned by preg_last_error if the offset didn't + * correspond to the begin of a valid UTF-8 code point (only when running + * a regex in UTF-8 + * mode). + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PREG_BAD_UTF8_OFFSET_ERROR', 5); + +/** + * PCRE version and release date (e.g. "7.0 18-Dec-2006"). + * @link http://php.net/manual/en/pcre.constants.php + */ +define ('PCRE_VERSION', "8.12 2011-01-15"); + +// End of pcre v. +?> diff --git a/res/php-5.4-core-api/pdo_dblib.php b/res/php-5.4-core-api/pdo_dblib.php new file mode 100644 index 0000000..d5ccbdb --- /dev/null +++ b/res/php-5.4-core-api/pdo_dblib.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.4-core-api/pdo_mysql.php b/res/php-5.4-core-api/pdo_mysql.php new file mode 100644 index 0000000..b6fdd63 --- /dev/null +++ b/res/php-5.4-core-api/pdo_mysql.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.4-core-api/pdo_pgsql.php b/res/php-5.4-core-api/pdo_pgsql.php new file mode 100644 index 0000000..e551b7a --- /dev/null +++ b/res/php-5.4-core-api/pdo_pgsql.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.4-core-api/pdo_sqlite.php b/res/php-5.4-core-api/pdo_sqlite.php new file mode 100644 index 0000000..d33f2d2 --- /dev/null +++ b/res/php-5.4-core-api/pdo_sqlite.php @@ -0,0 +1,5 @@ + diff --git a/res/php-5.4-core-api/pgsql.php b/res/php-5.4-core-api/pgsql.php new file mode 100644 index 0000000..e8ede6e --- /dev/null +++ b/res/php-5.4-core-api/pgsql.php @@ -0,0 +1,2150 @@ + + * Open a PostgreSQL connection + * @link http://php.net/manual/en/function.pg-connect.php + * @param string $connection_string

+ * The connection_string can be empty to use all default parameters, or it + * can contain one or more parameter settings separated by whitespace. + * Each parameter setting is in the form keyword = value. Spaces around + * the equal sign are optional. To write an empty value or a value + * containing spaces, surround it with single quotes, e.g., keyword = + * 'a value'. Single quotes and backslashes within the value must be + * escaped with a backslash, i.e., \' and \\. + *

+ *

+ * The currently recognized parameter keywords are: + * host, hostaddr, port, + * dbname (defaults to value of user), + * user, + * password, connect_timeout, + * options, tty (ignored), sslmode, + * requiressl (deprecated in favor of sslmode), and + * service. Which of these arguments exist depends + * on your PostgreSQL version. + *

+ *

+ * The options parameter can be used to set command line parameters + * to be invoked by the server. + *

+ * @param int $connect_type [optional]

+ * If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection + * is created, even if the connection_string is identical to + * an existing connection. + *

+ * @return resource PostgreSQL connection resource on success, FALSE on failure. + * @jms-builtin + */ +function pg_connect ($connection_string, $connect_type = null) {} + +/** + * (PHP 4, PHP 5)
+ * Open a persistent PostgreSQL connection + * @link http://php.net/manual/en/function.pg-pconnect.php + * @param string $connection_string

+ * The connection_string can be empty to use all default parameters, or it + * can contain one or more parameter settings separated by whitespace. + * Each parameter setting is in the form keyword = value. Spaces around + * the equal sign are optional. To write an empty value or a value + * containing spaces, surround it with single quotes, e.g., keyword = + * 'a value'. Single quotes and backslashes within the value must be + * escaped with a backslash, i.e., \' and \\. + *

+ *

+ * The currently recognized parameter keywords are: + * host, hostaddr, port, + * dbname, user, + * password, connect_timeout, + * options, tty (ignored), sslmode, + * requiressl (deprecated in favor of sslmode), and + * service. Which of these arguments exist depends + * on your PostgreSQL version. + *

+ * @param int $connect_type [optional]

+ * If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection + * is created, even if the connection_string is identical to + * an existing connection. + *

+ * @return resource PostgreSQL connection resource on success, FALSE on failure. + * @jms-builtin + */ +function pg_pconnect ($connection_string, $connect_type = null) {} + +/** + * (PHP 4, PHP 5)
+ * Closes a PostgreSQL connection + * @link http://php.net/manual/en/function.pg-close.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_close ($connection = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get connection status + * @link http://php.net/manual/en/function.pg-connection-status.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @return int PGSQL_CONNECTION_OK or + * PGSQL_CONNECTION_BAD. + * @jms-builtin + */ +function pg_connection_status ($connection) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get connection is busy or not + * @link http://php.net/manual/en/function.pg-connection-busy.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @return bool TRUE if the connection is busy, FALSE otherwise. + * @jms-builtin + */ +function pg_connection_busy ($connection) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Reset connection (reconnect) + * @link http://php.net/manual/en/function.pg-connection-reset.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_connection_reset ($connection) {} + +/** + * (PHP 4, PHP 5)
+ * Returns the host name associated with the connection + * @link http://php.net/manual/en/function.pg-host.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the name of the host the + * connection is to, or FALSE on error. + * @jms-builtin + */ +function pg_host ($connection = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get the database name + * @link http://php.net/manual/en/function.pg-dbname.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the name of the database the + * connection is to, or FALSE on error. + * @jms-builtin + */ +function pg_dbname ($connection = null) {} + +/** + * (PHP 4, PHP 5)
+ * Return the port number associated with the connection + * @link http://php.net/manual/en/function.pg-port.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return int An int containing the port number of the database + * server the connection is to, + * or FALSE on error. + * @jms-builtin + */ +function pg_port ($connection = null) {} + +/** + * (PHP 4, PHP 5)
+ * Return the TTY name associated with the connection + * @link http://php.net/manual/en/function.pg-tty.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the debug TTY of + * the connection, or FALSE on error. + * @jms-builtin + */ +function pg_tty ($connection = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get the options associated with the connection + * @link http://php.net/manual/en/function.pg-options.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the connection + * options, or FALSE on error. + * @jms-builtin + */ +function pg_options ($connection = null) {} + +/** + * (PHP 5)
+ * Returns an array with client, protocol and server version (when available) + * @link http://php.net/manual/en/function.pg-version.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return array an array with client, protocol + * and server keys and values (if available). Returns + * FALSE on error or invalid connection. + * @jms-builtin + */ +function pg_version ($connection = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Ping database connection + * @link http://php.net/manual/en/function.pg-ping.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_ping ($connection = null) {} + +/** + * (PHP 5)
+ * Looks up a current parameter setting of the server. + * @link http://php.net/manual/en/function.pg-parameter-status.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $param_name

+ * Possible param_name values include server_version, + * server_encoding, client_encoding, + * is_superuser, session_authorization, + * DateStyle, TimeZone, and + * integer_datetimes. + *

+ * @return string A string containing the value of the parameter, FALSE on failure or invalid + * param_name. + * @jms-builtin + */ +function pg_parameter_status ($connection = null, $param_name) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Returns the current in-transaction status of the server. + * @link http://php.net/manual/en/function.pg-transaction-status.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @return int The status can be PGSQL_TRANSACTION_IDLE (currently idle), + * PGSQL_TRANSACTION_ACTIVE (a command is in progress), + * PGSQL_TRANSACTION_INTRANS (idle, in a valid transaction block), + * or PGSQL_TRANSACTION_INERROR (idle, in a failed transaction block). + * PGSQL_TRANSACTION_UNKNOWN is reported if the connection is bad. + * PGSQL_TRANSACTION_ACTIVE is reported only when a query + * has been sent to the server and not yet completed. + * @jms-builtin + */ +function pg_transaction_status ($connection) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Execute a query + * @link http://php.net/manual/en/function.pg-query.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $query

+ * The SQL statement or statements to be executed. When multiple statements are passed to the function, + * they are automatically executed as one transaction, unless there are explicit BEGIN/COMMIT commands + * included in the query string. However, using multiple transactions in one function call is not recommended. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return resource A query result resource on success or FALSE on failure. + * @jms-builtin + */ +function pg_query ($connection = null, $query) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Submits a command to the server and waits for the result, with the ability to pass parameters separately from the SQL command text. + * @link http://php.net/manual/en/function.pg-query-params.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $query

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @param array $params

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ * @return resource A query result resource on success or FALSE on failure. + * @jms-builtin + */ +function pg_query_params ($connection = null, $query, array $params) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Submits a request to create a prepared statement with the +given parameters, and waits for completion. + * @link http://php.net/manual/en/function.pg-prepare.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $stmtname

+ * The name to give the prepared statement. Must be unique per-connection. If + * "" is specified, then an unnamed statement is created, overwriting any + * previously defined unnamed statement. + *

+ * @param string $query

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @return resource A query result resource on success or FALSE on failure. + * @jms-builtin + */ +function pg_prepare ($connection = null, $stmtname, $query) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Sends a request to execute a prepared statement with given parameters, and waits for the result. + * @link http://php.net/manual/en/function.pg-execute.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $stmtname

+ * The name of the prepared statement to execute. if + * "" is specified, then the unnamed statement is executed. The name must have + * been previously prepared using pg_prepare, + * pg_send_prepare or a PREPARE SQL + * command. + *

+ * @param array $params

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ *

+ * Elements are converted to strings by calling this function. + *

+ * @return resource A query result resource on success or FALSE on failure. + * @jms-builtin + */ +function pg_execute ($connection = null, $stmtname, array $params) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Sends asynchronous query + * @link http://php.net/manual/en/function.pg-send-query.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param string $query

+ * The SQL statement or statements to be executed. + *

+ *

+ * Data inside the query should be properly escaped. + *

+ * @return bool TRUE on success or FALSE on failure.

+ *

+ * Use pg_get_result to determine the query result. + * @jms-builtin + */ +function pg_send_query ($connection, $query) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Submits a command and separate parameters to the server without waiting for the result(s). + * @link http://php.net/manual/en/function.pg-send-query-params.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param string $query

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @param array $params

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ * @return bool TRUE on success or FALSE on failure.

+ *

+ * Use pg_get_result to determine the query result. + * @jms-builtin + */ +function pg_send_query_params ($connection, $query, array $params) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Sends a request to create a prepared statement with the given parameters, without waiting for completion. + * @link http://php.net/manual/en/function.pg-send-prepare.php + * @param resource $connection

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $stmtname

+ * The name to give the prepared statement. Must be unique per-connection. If + * "" is specified, then an unnamed statement is created, overwriting any + * previously defined unnamed statement. + *

+ * @param string $query

+ * The parameterized SQL statement. Must contain only a single statement. + * (multiple statements separated by semi-colons are not allowed.) If any parameters + * are used, they are referred to as $1, $2, etc. + *

+ * @return bool TRUE on success, FALSE on failure. Use pg_get_result + * to determine the query result. + * @jms-builtin + */ +function pg_send_prepare ($connection, $stmtname, $query) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Sends a request to execute a prepared statement with given parameters, without waiting for the result(s). + * @link http://php.net/manual/en/function.pg-send-execute.php + * @param resource $connection

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $stmtname

+ * The name of the prepared statement to execute. if + * "" is specified, then the unnamed statement is executed. The name must have + * been previously prepared using pg_prepare, + * pg_send_prepare or a PREPARE SQL + * command. + *

+ * @param array $params

+ * An array of parameter values to substitute for the $1, $2, etc. placeholders + * in the original prepared query string. The number of elements in the array + * must match the number of placeholders. + *

+ * @return bool TRUE on success, FALSE on failure. Use pg_get_result + * to determine the query result. + * @jms-builtin + */ +function pg_send_execute ($connection, $stmtname, array $params) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Cancel an asynchronous query + * @link http://php.net/manual/en/function.pg-cancel-query.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_cancel_query ($connection) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns values from a result resource + * @link http://php.net/manual/en/function.pg-fetch-result.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $row

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * next row is fetched. + *

+ * @param mixed $field

+ * A string representing the name of the field (column) to fetch, otherwise + * an int representing the field number to fetch. Fields are + * numbered from 0 upwards. + *

+ * @return string Boolean is returned as "t" or "f". All + * other types, including arrays are returned as strings formatted + * in the same default PostgreSQL manner that you would see in the + * psql program. Database NULL + * values are returned as NULL. + *

+ *

+ * FALSE is returned if row exceeds the number + * of rows in the set, or on any other error. + * @jms-builtin + */ +function pg_fetch_result ($result, $row, $field) {} + +/** + * (PHP 4, PHP 5)
+ * Get a row as an enumerated array + * @link http://php.net/manual/en/function.pg-fetch-row.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $row [optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If + * omitted or NULL, the next row is fetched. + *

+ * @param int $result_type [optional] + * @return array An array, indexed from 0 upwards, with each value + * represented as a string. Database NULL + * values are returned as NULL. + *

+ *

+ * FALSE is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * @jms-builtin + */ +function pg_fetch_row ($result, $row = null, $result_type = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Fetch a row as an associative array + * @link http://php.net/manual/en/function.pg-fetch-assoc.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $row [optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If + * omitted or NULL, the next row is fetched. + *

+ * @return array An array indexed associatively (by field name). + * Each value in the array is represented as a + * string. Database NULL + * values are returned as NULL. + *

+ *

+ * FALSE is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * @jms-builtin + */ +function pg_fetch_assoc ($result, $row = null) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch a row as an array + * @link http://php.net/manual/en/function.pg-fetch-array.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $row [optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If + * omitted or NULL, the next row is fetched. + *

+ * @param int $result_type [optional]

+ * An optional parameter that controls + * how the returned array is indexed. + * result_type is a constant and can take the + * following values: PGSQL_ASSOC, + * PGSQL_NUM and PGSQL_BOTH. + * Using PGSQL_NUM, pg_fetch_array + * will return an array with numerical indices, using + * PGSQL_ASSOC it will return only associative indices + * while PGSQL_BOTH, the default, will return both + * numerical and associative indices. + *

+ * @return array An array indexed numerically (beginning with 0) or + * associatively (indexed by field name), or both. + * Each value in the array is represented as a + * string. Database NULL + * values are returned as NULL. + *

+ *

+ * FALSE is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * @jms-builtin + */ +function pg_fetch_array ($result, $row = null, $result_type = 'PGSQL_BOTH') {} + +/** + * (PHP 4, PHP 5)
+ * Fetch a row as an object + * @link http://php.net/manual/en/function.pg-fetch-object.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $row [optional]

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If + * omitted or NULL, the next row is fetched. + *

+ * @param int $result_type [optional]

+ * Ignored and deprecated. + *

+ * @return object An object with one attribute for each field + * name in the result. Database NULL + * values are returned as NULL. + *

+ *

+ * FALSE is returned if row exceeds the number + * of rows in the set, there are no more rows, or on any other error. + * @jms-builtin + */ +function pg_fetch_object ($result, $row = null, $result_type = 'PGSQL_ASSOC') {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Fetches all rows from a result as an array + * @link http://php.net/manual/en/function.pg-fetch-all.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return array An array with all rows in the result. Each row is an array + * of field values indexed by field name. + *

+ *

+ * FALSE is returned if there are no rows in the result, or on any + * other error. + * @jms-builtin + */ +function pg_fetch_all ($result) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Fetches all rows in a particular result column as an array + * @link http://php.net/manual/en/function.pg-fetch-all-columns.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $column [optional]

+ * Column number, zero-based, to be retrieved from the result resource. Defaults + * to the first column if not specified. + *

+ * @return array An array with all values in the result column. + *

+ *

+ * FALSE is returned if column is larger than the number + * of columns in the result, or on any other error. + * @jms-builtin + */ +function pg_fetch_all_columns ($result, $column = 0) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns number of affected records (tuples) + * @link http://php.net/manual/en/function.pg-affected-rows.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return int The number of rows affected by the query. If no tuple is + * affected, it will return 0. + * @jms-builtin + */ +function pg_affected_rows ($result) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get asynchronous query result + * @link http://php.net/manual/en/function.pg-get-result.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. + *

+ * @return resource The result resource, or FALSE if no more results are available. + * @jms-builtin + */ +function pg_get_result ($connection = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Set internal row offset in result resource + * @link http://php.net/manual/en/function.pg-result-seek.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $offset

+ * Row to move the internal offset to in the result resource. + * Rows are numbered starting from zero. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_result_seek ($result, $offset) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get status of query result + * @link http://php.net/manual/en/function.pg-result-status.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $type [optional]

+ * Either PGSQL_STATUS_LONG to return the numeric status + * of the result, or PGSQL_STATUS_STRING + * to return the command tag of the result. + * If not specified, PGSQL_STATUS_LONG is the default. + *

+ * @return mixed Possible return values are PGSQL_EMPTY_QUERY, + * PGSQL_COMMAND_OK, PGSQL_TUPLES_OK, PGSQL_COPY_OUT, + * PGSQL_COPY_IN, PGSQL_BAD_RESPONSE, PGSQL_NONFATAL_ERROR and + * PGSQL_FATAL_ERROR if PGSQL_STATUS_LONG is + * specified. Otherwise, a string containing the PostgreSQL command tag is returned. + * @jms-builtin + */ +function pg_result_status ($result, $type = 'PGSQL_STATUS_LONG') {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Free result memory + * @link http://php.net/manual/en/function.pg-free-result.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_free_result ($result) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns the last row's OID + * @link http://php.net/manual/en/function.pg-last-oid.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return string A string containing the OID assigned to the most recently inserted + * row in the specified connection, or FALSE on error or + * no available OID. + * @jms-builtin + */ +function pg_last_oid ($result) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns the number of rows in a result + * @link http://php.net/manual/en/function.pg-num-rows.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return int The number of rows in the result. On error, -1 is returned. + * @jms-builtin + */ +function pg_num_rows ($result) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns the number of fields in a result + * @link http://php.net/manual/en/function.pg-num-fields.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return int The number of fields (columns) in the result. On error, -1 is returned. + * @jms-builtin + */ +function pg_num_fields ($result) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns the name of a field + * @link http://php.net/manual/en/function.pg-field-name.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $field_number

+ * Field number, starting from 0. + *

+ * @return string The field name, or FALSE on error. + * @jms-builtin + */ +function pg_field_name ($result, $field_number) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns the field number of the named field + * @link http://php.net/manual/en/function.pg-field-num.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param string $field_name

+ * The name of the field. + *

+ * @return int The field number (numbered from 0), or -1 on error. + * @jms-builtin + */ +function pg_field_num ($result, $field_name) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns the internal storage size of the named field + * @link http://php.net/manual/en/function.pg-field-size.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $field_number

+ * Field number, starting from 0. + *

+ * @return int The internal field storage size (in bytes). -1 indicates a variable + * length field. FALSE is returned on error. + * @jms-builtin + */ +function pg_field_size ($result, $field_number) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns the type name for the corresponding field number + * @link http://php.net/manual/en/function.pg-field-type.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $field_number

+ * Field number, starting from 0. + *

+ * @return string A string containing the base name of the field's type, or FALSE + * on error. + * @jms-builtin + */ +function pg_field_type ($result, $field_number) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Returns the type ID (OID) for the corresponding field number + * @link http://php.net/manual/en/function.pg-field-type-oid.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $field_number

+ * Field number, starting from 0. + *

+ * @return int The OID of the field's base type. FALSE is returned on error. + * @jms-builtin + */ +function pg_field_type_oid ($result, $field_number) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns the printed length + * @link http://php.net/manual/en/function.pg-field-prtlen.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $row_number + * @param mixed $field_name_or_number + * @return int The field printed length, or FALSE on error. + * @jms-builtin + */ +function pg_field_prtlen ($result, $row_number, $field_name_or_number) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Test if a field is SQL NULL + * @link http://php.net/manual/en/function.pg-field-is-null.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $row

+ * Row number in result to fetch. Rows are numbered from 0 upwards. If omitted, + * current row is fetched. + *

+ * @param mixed $field

+ * Field number (starting from 0) as an integer or + * the field name as a string. + *

+ * @return int 1 if the field in the given row is SQL NULL, 0 + * if not. FALSE is returned if the row is out of range, or upon any other error. + * @jms-builtin + */ +function pg_field_is_null ($result, $row, $field) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Returns the name or oid of the tables field + * @link http://php.net/manual/en/function.pg-field-table.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @param int $field_number

+ * Field number, starting from 0. + *

+ * @param bool $oid_only [optional]

+ * By default the tables name that field belongs to is returned but + * if oid_only is set to TRUE, then the + * oid will instead be returned. + *

+ * @return mixed On success either the fields table name or oid. Or, FALSE on failure. + * @jms-builtin + */ +function pg_field_table ($result, $field_number, $oid_only = false) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Gets SQL NOTIFY message + * @link http://php.net/manual/en/function.pg-get-notify.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param int $result_type [optional]

+ * An optional parameter that controls + * how the returned array is indexed. + * result_type is a constant and can take the + * following values: PGSQL_ASSOC, + * PGSQL_NUM and PGSQL_BOTH. + * Using PGSQL_NUM, pg_get_notify + * will return an array with numerical indices, using + * PGSQL_ASSOC it will return only associative indices + * while PGSQL_BOTH, the default, will return both + * numerical and associative indices. + *

+ * @return array An array containing the NOTIFY message name and backend PID. + * Otherwise if no NOTIFY is waiting, then FALSE is returned. + * @jms-builtin + */ +function pg_get_notify ($connection, $result_type = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Gets the backend's process ID + * @link http://php.net/manual/en/function.pg-get-pid.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @return int The backend database process ID. + * @jms-builtin + */ +function pg_get_pid ($connection) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get error message associated with result + * @link http://php.net/manual/en/function.pg-result-error.php + * @param resource $result

+ * PostgreSQL query result resource, returned by pg_query, + * pg_query_params or pg_execute + * (among others). + *

+ * @return string a string if there is an error associated with the + * result parameter, FALSE otherwise. + * @jms-builtin + */ +function pg_result_error ($result) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Returns an individual field of an error report. + * @link http://php.net/manual/en/function.pg-result-error-field.php + * @param resource $result

+ * A PostgreSQL query result resource from a previously executed + * statement. + *

+ * @param int $fieldcode

+ * Possible fieldcode values are: PGSQL_DIAG_SEVERITY, + * PGSQL_DIAG_SQLSTATE, PGSQL_DIAG_MESSAGE_PRIMARY, + * PGSQL_DIAG_MESSAGE_DETAIL, + * PGSQL_DIAG_MESSAGE_HINT, PGSQL_DIAG_STATEMENT_POSITION, + * PGSQL_DIAG_INTERNAL_POSITION (PostgreSQL 8.0+ only), + * PGSQL_DIAG_INTERNAL_QUERY (PostgreSQL 8.0+ only), + * PGSQL_DIAG_CONTEXT, PGSQL_DIAG_SOURCE_FILE, + * PGSQL_DIAG_SOURCE_LINE or + * PGSQL_DIAG_SOURCE_FUNCTION. + *

+ * @return string A string containing the contents of the error field, NULL if the field does not exist or FALSE + * on failure. + * @jms-builtin + */ +function pg_result_error_field ($result, $fieldcode) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get the last error message string of a connection + * @link http://php.net/manual/en/function.pg-last-error.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string A string containing the last error message on the + * given connection, or FALSE on error. + * @jms-builtin + */ +function pg_last_error ($connection = null) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Returns the last notice message from PostgreSQL server + * @link http://php.net/manual/en/function.pg-last-notice.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @return string A string containing the last notice on the + * given connection, or FALSE on error. + * @jms-builtin + */ +function pg_last_notice ($connection) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Send a NULL-terminated string to PostgreSQL backend + * @link http://php.net/manual/en/function.pg-put-line.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $data

+ * A line of text to be sent directly to the PostgreSQL backend. A NULL + * terminator is added automatically. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_put_line ($connection = null, $data) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Sync with PostgreSQL backend + * @link http://php.net/manual/en/function.pg-end-copy.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_end_copy ($connection = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Copy a table to an array + * @link http://php.net/manual/en/function.pg-copy-to.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param string $table_name

+ * Name of the table from which to copy the data into rows. + *

+ * @param string $delimiter [optional]

+ * The token that separates values for each field in each element of + * rows. Default is TAB. + *

+ * @param string $null_as [optional]

+ * How SQL NULL values are represented in the + * rows. Default is \N ("\\N"). + *

+ * @return array An array with one element for each line of COPY data. + * It returns FALSE on failure. + * @jms-builtin + */ +function pg_copy_to ($connection, $table_name, $delimiter = null, $null_as = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Insert records into a table from an array + * @link http://php.net/manual/en/function.pg-copy-from.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param string $table_name

+ * Name of the table into which to copy the rows. + *

+ * @param array $rows

+ * An array of data to be copied into table_name. + * Each value in rows becomes a row in table_name. + * Each value in rows should be a delimited string of the values + * to insert into each field. Values should be linefeed terminated. + *

+ * @param string $delimiter [optional]

+ * The token that separates values for each field in each element of + * rows. Default is TAB. + *

+ * @param string $null_as [optional]

+ * How SQL NULL values are represented in the + * rows. Default is \N ("\\N"). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_copy_from ($connection, $table_name, array $rows, $delimiter = null, $null_as = null) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Enable tracing a PostgreSQL connection + * @link http://php.net/manual/en/function.pg-trace.php + * @param string $pathname

+ * An optional file access mode, same as for fopen. + *

+ * @param string $mode [optional] + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_trace ($pathname, $mode = "w", $connection = null) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Disable tracing of a PostgreSQL connection + * @link http://php.net/manual/en/function.pg-untrace.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return bool Always returns TRUE. + * @jms-builtin + */ +function pg_untrace ($connection = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Create a large object + * @link http://php.net/manual/en/function.pg-lo-create.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param mixed $object_id [optional]

+ * If an object_id is given the function + * will try to create a large object with this id, else a free + * object id is assigned by the server. The parameter + * was added in PHP 5.3 and relies on functionality that first + * appeared in PostgreSQL 8.1. + *

+ * @return int A large object OID or FALSE on error. + * @jms-builtin + */ +function pg_lo_create ($connection = null, $object_id = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Delete a large object + * @link http://php.net/manual/en/function.pg-lo-unlink.php + * @param resource $connection

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param int $oid

+ * The OID of the large object in the database. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_lo_unlink ($connection, $oid) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Open a large object + * @link http://php.net/manual/en/function.pg-lo-open.php + * @param resource $connection

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param int $oid

+ * The OID of the large object in the database. + *

+ * @param string $mode

+ * Can be either "r" for read-only, "w" for write only or "rw" for read and + * write. + *

+ * @return resource A large object resource or FALSE on error. + * @jms-builtin + */ +function pg_lo_open ($connection, $oid, $mode) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Close a large object + * @link http://php.net/manual/en/function.pg-lo-close.php + * @param resource $large_object + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_lo_close ($large_object) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Read a large object + * @link http://php.net/manual/en/function.pg-lo-read.php + * @param resource $large_object

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @param int $len [optional]

+ * An optional maximum number of bytes to return. + *

+ * @return string A string containing len bytes from the + * large object, or FALSE on error. + * @jms-builtin + */ +function pg_lo_read ($large_object, $len = 8192) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Write to a large object + * @link http://php.net/manual/en/function.pg-lo-write.php + * @param resource $large_object

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @param string $data

+ * The data to be written to the large object. If len is + * specified and is less than the length of data, only + * len bytes will be written. + *

+ * @param int $len [optional]

+ * An optional maximum number of bytes to write. Must be greater than zero + * and no greater than the length of data. Defaults to + * the length of data. + *

+ * @return int The number of bytes written to the large object, or FALSE on error. + * @jms-builtin + */ +function pg_lo_write ($large_object, $data, $len = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Reads an entire large object and send straight to browser + * @link http://php.net/manual/en/function.pg-lo-read-all.php + * @param resource $large_object

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @return int Number of bytes read or FALSE on error. + * @jms-builtin + */ +function pg_lo_read_all ($large_object) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Import a large object from file + * @link http://php.net/manual/en/function.pg-lo-import.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $pathname

+ * The full path and file name of the file on the client + * filesystem from which to read the large object data. + *

+ * @param mixed $object_id [optional]

+ * If an object_id is given the function + * will try to create a large object with this id, else a free + * object id is assigned by the server. The parameter + * was added in PHP 5.3 and relies on functionality that first + * appeared in PostgreSQL 8.1. + *

+ * @return int The OID of the newly created large object, or + * FALSE on failure. + * @jms-builtin + */ +function pg_lo_import ($connection = null, $pathname, $object_id = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Export a large object to file + * @link http://php.net/manual/en/function.pg-lo-export.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param int $oid

+ * The OID of the large object in the database. + *

+ * @param string $pathname

+ * The full path and file name of the file in which to write the + * large object on the client filesystem. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_lo_export ($connection = null, $oid, $pathname) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Seeks position within a large object + * @link http://php.net/manual/en/function.pg-lo-seek.php + * @param resource $large_object

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @param int $offset

+ * The number of bytes to seek. + *

+ * @param int $whence [optional]

+ * One of the constants PGSQL_SEEK_SET (seek from object start), + * PGSQL_SEEK_CUR (seek from current position) + * or PGSQL_SEEK_END (seek from object end) . + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pg_lo_seek ($large_object, $offset, $whence = 'PGSQL_SEEK_CUR') {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns current seek position a of large object + * @link http://php.net/manual/en/function.pg-lo-tell.php + * @param resource $large_object

+ * PostgreSQL large object (LOB) resource, returned by pg_lo_open. + *

+ * @return int The current seek offset (in number of bytes) from the beginning of the large + * object. If there is an error, the return value is negative. + * @jms-builtin + */ +function pg_lo_tell ($large_object) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Escape a string for query + * @link http://php.net/manual/en/function.pg-escape-string.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $data

+ * A string containing text to be escaped. + *

+ * @return string A string containing the escaped data. + * @jms-builtin + */ +function pg_escape_string ($connection = null, $data) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Escape a string for insertion into a bytea field + * @link http://php.net/manual/en/function.pg-escape-bytea.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $data

+ * A string containing text or binary data to be inserted into a bytea + * column. + *

+ * @return string A string containing the escaped data. + * @jms-builtin + */ +function pg_escape_bytea ($connection = null, $data) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Unescape binary for bytea type + * @link http://php.net/manual/en/function.pg-unescape-bytea.php + * @param string $data

+ * A string containing PostgreSQL bytea data to be converted into + * a PHP binary string. + *

+ * @return string A string containing the unescaped data. + * @jms-builtin + */ +function pg_unescape_bytea ($data) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Determines the verbosity of messages returned by pg_last_error +and pg_result_error. + * @link http://php.net/manual/en/function.pg-set-error-verbosity.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param int $verbosity

+ * The required verbosity: PGSQL_ERRORS_TERSE, + * PGSQL_ERRORS_DEFAULT + * or PGSQL_ERRORS_VERBOSE. + *

+ * @return int The previous verbosity level: PGSQL_ERRORS_TERSE, + * PGSQL_ERRORS_DEFAULT + * or PGSQL_ERRORS_VERBOSE. + * @jms-builtin + */ +function pg_set_error_verbosity ($connection = null, $verbosity) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Gets the client encoding + * @link http://php.net/manual/en/function.pg-client-encoding.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @return string The client encoding, or FALSE on error. + * @jms-builtin + */ +function pg_client_encoding ($connection = null) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Set the client encoding + * @link http://php.net/manual/en/function.pg-set-client-encoding.php + * @param resource $connection [optional]

+ * PostgreSQL database connection resource. When + * connection is not present, the default connection + * is used. The default connection is the last connection made by + * pg_connect or pg_pconnect. + *

+ * @param string $encoding

+ * The required client encoding. One of SQL_ASCII, EUC_JP, + * EUC_CN, EUC_KR, EUC_TW, + * UNICODE, MULE_INTERNAL, LATINX (X=1...9), + * KOI8, WIN, ALT, SJIS, + * BIG5 or WIN1250. + *

+ *

+ * The exact list of available encodings depends on your PostgreSQL version, so check your + * PostgreSQL manual for a more specific list. + *

+ * @return int 0 on success or -1 on error. + * @jms-builtin + */ +function pg_set_client_encoding ($connection = null, $encoding) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Get meta data for table + * @link http://php.net/manual/en/function.pg-meta-data.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param string $table_name

+ * The name of the table. + *

+ * @return array An array of the table definition, or FALSE on error. + * @jms-builtin + */ +function pg_meta_data ($connection, $table_name) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Convert associative array values into suitable for SQL statement + * @link http://php.net/manual/en/function.pg-convert.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param string $table_name

+ * Name of the table against which to convert types. + *

+ * @param array $assoc_array

+ * Data to be converted. + *

+ * @param int $options [optional]

+ * Any number of PGSQL_CONV_IGNORE_DEFAULT, + * PGSQL_CONV_FORCE_NULL or + * PGSQL_CONV_IGNORE_NOT_NULL, combined. + *

+ * @return array An array of converted values, or FALSE on error. + * @jms-builtin + */ +function pg_convert ($connection, $table_name, array $assoc_array, $options = 0) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Insert array into table + * @link http://php.net/manual/en/function.pg-insert.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param string $table_name

+ * Name of the table into which to insert rows. The table table_name must at least + * have as many columns as assoc_array has elements. + *

+ * @param array $assoc_array

+ * An array whose keys are field names in the table table_name, + * and whose values are the values of those fields that are to be inserted. + *

+ * @param int $options [optional]

+ * Any number of PGSQL_CONV_OPTS, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC, + * PGSQL_DML_ASYNC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed TRUE on success or FALSE on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * @jms-builtin + */ +function pg_insert ($connection, $table_name, array $assoc_array, $options = 'PGSQL_DML_EXEC') {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Update table + * @link http://php.net/manual/en/function.pg-update.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param string $table_name

+ * Name of the table into which to update rows. + *

+ * @param array $data

+ * An array whose keys are field names in the table table_name, + * and whose values are what matched rows are to be updated to. + *

+ * @param array $condition

+ * An array whose keys are field names in the table table_name, + * and whose values are the conditions that a row must meet to be updated. + *

+ * @param int $options [optional]

+ * Any number of PGSQL_CONV_OPTS, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed TRUE on success or FALSE on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * @jms-builtin + */ +function pg_update ($connection, $table_name, array $data, array $condition, $options = 'PGSQL_DML_EXEC') {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Deletes records + * @link http://php.net/manual/en/function.pg-delete.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param string $table_name

+ * Name of the table from which to delete rows. + *

+ * @param array $assoc_array

+ * An array whose keys are field names in the table table_name, + * and whose values are the values of those fields that are to be deleted. + *

+ * @param int $options [optional]

+ * Any number of PGSQL_CONV_FORCE_NULL, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed TRUE on success or FALSE on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * @jms-builtin + */ +function pg_delete ($connection, $table_name, array $assoc_array, $options = 'PGSQL_DML_EXEC') {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Select records + * @link http://php.net/manual/en/function.pg-select.php + * @param resource $connection

+ * PostgreSQL database connection resource. + *

+ * @param string $table_name

+ * Name of the table from which to select rows. + *

+ * @param array $assoc_array

+ * An array whose keys are field names in the table table_name, + * and whose values are the conditions that a row must meet to be retrieved. + *

+ * @param int $options [optional]

+ * Any number of PGSQL_CONV_FORCE_NULL, + * PGSQL_DML_NO_CONV, + * PGSQL_DML_EXEC, + * PGSQL_DML_ASYNC or + * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the + * options then query string is returned. + *

+ * @return mixed TRUE on success or FALSE on failure. Returns string if PGSQL_DML_STRING is passed + * via options. + * @jms-builtin + */ +function pg_select ($connection, $table_name, array $assoc_array, $options = 'PGSQL_DML_EXEC') {} + +/** + * @param $connection [optional] + * @param $query [optional] + * @jms-builtin + */ +function pg_exec ($connection, $query) {} + +/** + * @param $result + * @jms-builtin + */ +function pg_getlastoid ($result) {} + +/** + * @param $result + * @jms-builtin + */ +function pg_cmdtuples ($result) {} + +/** + * @param $connection [optional] + * @jms-builtin + */ +function pg_errormessage ($connection) {} + +/** + * @param $result + * @jms-builtin + */ +function pg_numrows ($result) {} + +/** + * @param $result + * @jms-builtin + */ +function pg_numfields ($result) {} + +/** + * @param $result + * @param $field_number + * @jms-builtin + */ +function pg_fieldname ($result, $field_number) {} + +/** + * @param $result + * @param $field_number + * @jms-builtin + */ +function pg_fieldsize ($result, $field_number) {} + +/** + * @param $result + * @param $field_number + * @jms-builtin + */ +function pg_fieldtype ($result, $field_number) {} + +/** + * @param $result + * @param $field_name + * @jms-builtin + */ +function pg_fieldnum ($result, $field_name) {} + +/** + * @param $result + * @param $row [optional] + * @param $field_name_or_number [optional] + * @jms-builtin + */ +function pg_fieldprtlen ($result, $row, $field_name_or_number) {} + +/** + * @param $result + * @param $row [optional] + * @param $field_name_or_number [optional] + * @jms-builtin + */ +function pg_fieldisnull ($result, $row, $field_name_or_number) {} + +/** + * @param $result + * @jms-builtin + */ +function pg_freeresult ($result) {} + +/** + * @param $connection + * @jms-builtin + */ +function pg_result ($connection) {} + +/** + * @param $large_object + * @jms-builtin + */ +function pg_loreadall ($large_object) {} + +/** + * @param $connection [optional] + * @param $large_object_id [optional] + * @jms-builtin + */ +function pg_locreate ($connection, $large_object_id) {} + +/** + * @param $connection [optional] + * @param $large_object_oid [optional] + * @jms-builtin + */ +function pg_lounlink ($connection, $large_object_oid) {} + +/** + * @param $connection [optional] + * @param $large_object_oid [optional] + * @param $mode [optional] + * @jms-builtin + */ +function pg_loopen ($connection, $large_object_oid, $mode) {} + +/** + * @param $large_object + * @jms-builtin + */ +function pg_loclose ($large_object) {} + +/** + * @param $large_object + * @param $len [optional] + * @jms-builtin + */ +function pg_loread ($large_object, $len) {} + +/** + * @param $large_object + * @param $buf + * @param $len [optional] + * @jms-builtin + */ +function pg_lowrite ($large_object, $buf, $len) {} + +/** + * @param $connection [optional] + * @param $filename [optional] + * @param $large_object_oid [optional] + * @jms-builtin + */ +function pg_loimport ($connection, $filename, $large_object_oid) {} + +/** + * @param $connection [optional] + * @param $objoid [optional] + * @param $filename [optional] + * @jms-builtin + */ +function pg_loexport ($connection, $objoid, $filename) {} + +/** + * @param $connection [optional] + * @jms-builtin + */ +function pg_clientencoding ($connection) {} + +/** + * @param $connection [optional] + * @param $encoding [optional] + * @jms-builtin + */ +function pg_setclientencoding ($connection, $encoding) {} + + +/** + * Passed to pg_connect to force the creation of a new connection, + * rather than re-using an existing identical connection. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONNECT_FORCE_NEW', 2); + +/** + * Passed to pg_fetch_array. Return an associative array of field + * names and values. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ASSOC', 1); + +/** + * Passed to pg_fetch_array. Return a numerically indexed array of field + * numbers and values. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_NUM', 2); + +/** + * Passed to pg_fetch_array. Return an array of field values + * that is both numerically indexed (by field number) and associated (by field name). + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_BOTH', 3); + +/** + * Returned by pg_connection_status indicating that the database + * connection is in an invalid state. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONNECTION_BAD', 1); + +/** + * Returned by pg_connection_status indicating that the database + * connection is in a valid state. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONNECTION_OK', 0); + +/** + * Returned by pg_transaction_status. Connection is + * currently idle, not in a transaction. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_IDLE', 0); + +/** + * Returned by pg_transaction_status. A command + * is in progress on the connection. A query has been sent via the connection + * and not yet completed. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_ACTIVE', 1); + +/** + * Returned by pg_transaction_status. The connection + * is idle, in a transaction block. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_INTRANS', 2); + +/** + * Returned by pg_transaction_status. The connection + * is idle, in a failed transaction block. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_INERROR', 3); + +/** + * Returned by pg_transaction_status. The connection + * is bad. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TRANSACTION_UNKNOWN', 4); + +/** + * Passed to pg_set_error_verbosity. + * Specified that returned messages include severity, primary text, + * and position only; this will normally fit on a single line. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ERRORS_TERSE', 0); + +/** + * Passed to pg_set_error_verbosity. + * The default mode produces messages that include the above + * plus any detail, hint, or context fields (these may span + * multiple lines). + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ERRORS_DEFAULT', 1); + +/** + * Passed to pg_set_error_verbosity. + * The verbose mode includes all available fields. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_ERRORS_VERBOSE', 2); + +/** + * Passed to pg_lo_seek. Seek operation is to begin + * from the start of the object. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_SEEK_SET', 0); + +/** + * Passed to pg_lo_seek. Seek operation is to begin + * from the current position. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_SEEK_CUR', 1); + +/** + * Passed to pg_lo_seek. Seek operation is to begin + * from the end of the object. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_SEEK_END', 2); + +/** + * Passed to pg_result_status. Indicates that + * numerical result code is desired. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_STATUS_LONG', 1); + +/** + * Passed to pg_result_status. Indicates that + * textual result command tag is desired. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_STATUS_STRING', 2); + +/** + * Returned by pg_result_status. The string sent to the server + * was empty. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_EMPTY_QUERY', 0); + +/** + * Returned by pg_result_status. Successful completion of a + * command returning no data. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_COMMAND_OK', 1); + +/** + * Returned by pg_result_status. Successful completion of a command + * returning data (such as a SELECT or SHOW). + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_TUPLES_OK', 2); + +/** + * Returned by pg_result_status. Copy Out (from server) data + * transfer started. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_COPY_OUT', 3); + +/** + * Returned by pg_result_status. Copy In (to server) data + * transfer started. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_COPY_IN', 4); + +/** + * Returned by pg_result_status. The server's response + * was not understood. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_BAD_RESPONSE', 5); + +/** + * Returned by pg_result_status. A nonfatal error + * (a notice or warning) occurred. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_NONFATAL_ERROR', 6); + +/** + * Returned by pg_result_status. A fatal error + * occurred. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_FATAL_ERROR', 7); + +/** + * Passed to pg_result_error_field. + * The severity; the field contents are ERROR, + * FATAL, or PANIC (in an error message), or + * WARNING, NOTICE, DEBUG, + * INFO, or LOG (in a notice message), or a localized + * translation of one of these. Always present. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SEVERITY', 83); + +/** + * Passed to pg_result_error_field. + * The SQLSTATE code for the error. The SQLSTATE code identifies the type of error + * that has occurred; it can be used by front-end applications to perform specific + * operations (such as error handling) in response to a particular database error. + * This field is not localizable, and is always present. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SQLSTATE', 67); + +/** + * Passed to pg_result_error_field. + * The primary human-readable error message (typically one line). Always present. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_MESSAGE_PRIMARY', 77); + +/** + * Passed to pg_result_error_field. + * Detail: an optional secondary error message carrying more detail about the problem. May run to multiple lines. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_MESSAGE_DETAIL', 68); + +/** + * Passed to pg_result_error_field. + * Hint: an optional suggestion what to do about the problem. This is intended to differ from detail in that it + * offers advice (potentially inappropriate) rather than hard facts. May run to multiple lines. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_MESSAGE_HINT', 72); + +/** + * Passed to pg_result_error_field. + * A string containing a decimal integer indicating an error cursor position as an index into the original + * statement string. The first character has index 1, and positions are measured in characters not bytes. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_STATEMENT_POSITION', 80); + +/** + * Passed to pg_result_error_field. + * This is defined the same as the PG_DIAG_STATEMENT_POSITION field, but + * it is used when the cursor position refers to an internally generated + * command rather than the one submitted by the client. The + * PG_DIAG_INTERNAL_QUERY field will always appear when this + * field appears. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_INTERNAL_POSITION', 112); + +/** + * Passed to pg_result_error_field. + * The text of a failed internally-generated command. This could be, for example, a + * SQL query issued by a PL/pgSQL function. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_INTERNAL_QUERY', 113); + +/** + * Passed to pg_result_error_field. + * An indication of the context in which the error occurred. Presently + * this includes a call stack traceback of active procedural language + * functions and internally-generated queries. The trace is one entry + * per line, most recent first. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_CONTEXT', 87); + +/** + * Passed to pg_result_error_field. + * The file name of the PostgreSQL source-code location where the error + * was reported. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SOURCE_FILE', 70); + +/** + * Passed to pg_result_error_field. + * The line number of the PostgreSQL source-code location where the + * error was reported. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SOURCE_LINE', 76); + +/** + * Passed to pg_result_error_field. + * The name of the PostgreSQL source-code function reporting the error. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_DIAG_SOURCE_FUNCTION', 82); + +/** + * Passed to pg_convert. + * Ignore default values in the table during conversion. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONV_IGNORE_DEFAULT', 2); + +/** + * Passed to pg_convert. + * Use SQL NULL in place of an empty string. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONV_FORCE_NULL', 4); + +/** + * Passed to pg_convert. + * Ignore conversion of NULL into SQL NOT NULL columns. + * @link http://php.net/manual/en/pgsql.constants.php + */ +define ('PGSQL_CONV_IGNORE_NOT_NULL', 8); +define ('PGSQL_DML_NO_CONV', 256); +define ('PGSQL_DML_EXEC', 512); +define ('PGSQL_DML_ASYNC', 1024); +define ('PGSQL_DML_STRING', 2048); + +// End of pgsql v. +?> diff --git a/res/php-5.4-core-api/posix.php b/res/php-5.4-core-api/posix.php new file mode 100644 index 0000000..510805c --- /dev/null +++ b/res/php-5.4-core-api/posix.php @@ -0,0 +1,798 @@ + + * Send a signal to a process + * @link http://php.net/manual/en/function.posix-kill.php + * @param int $pid

+ * The process identifier. + *

+ * @param int $sig

+ * One of the PCNTL signals constants. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function posix_kill ($pid, $sig) {} + +/** + * (PHP 4, PHP 5)
+ * Return the current process identifier + * @link http://php.net/manual/en/function.posix-getpid.php + * @return int the identifier, as an integer. + * @jms-builtin + */ +function posix_getpid () {} + +/** + * (PHP 4, PHP 5)
+ * Return the parent process identifier + * @link http://php.net/manual/en/function.posix-getppid.php + * @return int the identifier, as an integer. + * @jms-builtin + */ +function posix_getppid () {} + +/** + * (PHP 4, PHP 5)
+ * Return the real user ID of the current process + * @link http://php.net/manual/en/function.posix-getuid.php + * @return int the user id, as an integer + * @jms-builtin + */ +function posix_getuid () {} + +/** + * (PHP 4, PHP 5)
+ * Set the UID of the current process + * @link http://php.net/manual/en/function.posix-setuid.php + * @param int $uid

+ * The user id. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function posix_setuid ($uid) {} + +/** + * (PHP 4, PHP 5)
+ * Return the effective user ID of the current process + * @link http://php.net/manual/en/function.posix-geteuid.php + * @return int the user id, as an integer + * @jms-builtin + */ +function posix_geteuid () {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Set the effective UID of the current process + * @link http://php.net/manual/en/function.posix-seteuid.php + * @param int $uid

+ * The user id. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function posix_seteuid ($uid) {} + +/** + * (PHP 4, PHP 5)
+ * Return the real group ID of the current process + * @link http://php.net/manual/en/function.posix-getgid.php + * @return int the real group id, as an integer. + * @jms-builtin + */ +function posix_getgid () {} + +/** + * (PHP 4, PHP 5)
+ * Set the GID of the current process + * @link http://php.net/manual/en/function.posix-setgid.php + * @param int $gid

+ * The group id. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function posix_setgid ($gid) {} + +/** + * (PHP 4, PHP 5)
+ * Return the effective group ID of the current process + * @link http://php.net/manual/en/function.posix-getegid.php + * @return int an integer of the effective group ID. + * @jms-builtin + */ +function posix_getegid () {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Set the effective GID of the current process + * @link http://php.net/manual/en/function.posix-setegid.php + * @param int $gid

+ * The group id. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function posix_setegid ($gid) {} + +/** + * (PHP 4, PHP 5)
+ * Return the group set of the current process + * @link http://php.net/manual/en/function.posix-getgroups.php + * @return array an array of integers containing the numeric group ids of the group + * set of the current process. + * @jms-builtin + */ +function posix_getgroups () {} + +/** + * (PHP 4, PHP 5)
+ * Return login name + * @link http://php.net/manual/en/function.posix-getlogin.php + * @return string the login name of the user, as a string. + * @jms-builtin + */ +function posix_getlogin () {} + +/** + * (PHP 4, PHP 5)
+ * Return the current process group identifier + * @link http://php.net/manual/en/function.posix-getpgrp.php + * @return int the identifier, as an integer. + * @jms-builtin + */ +function posix_getpgrp () {} + +/** + * (PHP 4, PHP 5)
+ * Make the current process a session leader + * @link http://php.net/manual/en/function.posix-setsid.php + * @return int the session id, or -1 on errors. + * @jms-builtin + */ +function posix_setsid () {} + +/** + * (PHP 4, PHP 5)
+ * Set process group id for job control + * @link http://php.net/manual/en/function.posix-setpgid.php + * @param int $pid

+ * The process id. + *

+ * @param int $pgid

+ * The process group id. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function posix_setpgid ($pid, $pgid) {} + +/** + * (PHP 4, PHP 5)
+ * Get process group id for job control + * @link http://php.net/manual/en/function.posix-getpgid.php + * @param int $pid

+ * The process id. + *

+ * @return int the identifier, as an integer. + * @jms-builtin + */ +function posix_getpgid ($pid) {} + +/** + * (PHP 4, PHP 5)
+ * Get the current sid of the process + * @link http://php.net/manual/en/function.posix-getsid.php + * @param int $pid

+ * The process identifier. If set to 0, the current process is + * assumed. If an invalid pid is + * specified, then FALSE is returned and an error is set which + * can be checked with posix_get_last_error. + *

+ * @return int the identifier, as an integer. + * @jms-builtin + */ +function posix_getsid ($pid) {} + +/** + * (PHP 4, PHP 5)
+ * Get system name + * @link http://php.net/manual/en/function.posix-uname.php + * @return array a hash of strings with information about the + * system. The indices of the hash are + * sysname - operating system name (e.g. Linux) + * nodename - system name (e.g. valiant) + * release - operating system release (e.g. 2.2.10) + * version - operating system version (e.g. #4 Tue Jul 20 + * 17:01:36 MEST 1999) + * machine - system architecture (e.g. i586) + * domainname - DNS domainname (e.g. example.com) + *

+ *

+ * domainname is a GNU extension and not part of POSIX.1, so this + * field is only available on GNU systems or when using the GNU + * libc. + * @jms-builtin + */ +function posix_uname () {} + +/** + * (PHP 4, PHP 5)
+ * Get process times + * @link http://php.net/manual/en/function.posix-times.php + * @return array a hash of strings with information about the current + * process CPU usage. The indices of the hash are: + * ticks - the number of clock ticks that have elapsed since + * reboot. + * utime - user time used by the current process. + * stime - system time used by the current process. + * cutime - user time used by current process and children. + * cstime - system time used by current process and children. + * @jms-builtin + */ +function posix_times () {} + +/** + * (PHP 4, PHP 5)
+ * Get path name of controlling terminal + * @link http://php.net/manual/en/function.posix-ctermid.php + * @return string Upon successful completion, returns string of the pathname to + * the current controlling terminal. Otherwise FALSE is returned and errno + * is set, which can be checked with posix_get_last_error. + * @jms-builtin + */ +function posix_ctermid () {} + +/** + * (PHP 4, PHP 5)
+ * Determine terminal device name + * @link http://php.net/manual/en/function.posix-ttyname.php + * @param int $fd

+ * The file descriptor. + *

+ * @return string On success, returns a string of the absolute path of the + * fd. On failure, returns FALSE + * @jms-builtin + */ +function posix_ttyname ($fd) {} + +/** + * (PHP 4, PHP 5)
+ * Determine if a file descriptor is an interactive terminal + * @link http://php.net/manual/en/function.posix-isatty.php + * @param int $fd

+ * The file descriptor. + *

+ * @return bool TRUE if fd is an open descriptor connected + * to a terminal and FALSE otherwise. + * @jms-builtin + */ +function posix_isatty ($fd) {} + +/** + * (PHP 4, PHP 5)
+ * Pathname of current directory + * @link http://php.net/manual/en/function.posix-getcwd.php + * @return string a string of the absolute pathname on success. + * On error, returns FALSE and sets errno which can be checked with + * posix_get_last_error. + * @jms-builtin + */ +function posix_getcwd () {} + +/** + * (PHP 4, PHP 5)
+ * Create a fifo special file (a named pipe) + * @link http://php.net/manual/en/function.posix-mkfifo.php + * @param string $pathname

+ * Path to the FIFO file. + *

+ * @param int $mode

+ * The second parameter mode has to be given in + * octal notation (e.g. 0644). The permission of the newly created + * FIFO also depends on the setting of the current + * umask. The permissions of the created file are + * (mode &#38; ~umask). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function posix_mkfifo ($pathname, $mode) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Create a special or ordinary file (POSIX.1) + * @link http://php.net/manual/en/function.posix-mknod.php + * @param string $pathname

+ * The file to create + *

+ * @param int $mode

+ * This parameter is constructed by a bitwise OR between file type (one of + * the following constants: POSIX_S_IFREG, + * POSIX_S_IFCHR, POSIX_S_IFBLK, + * POSIX_S_IFIFO or + * POSIX_S_IFSOCK) and permissions. + *

+ * @param int $major [optional]

+ * The major device kernel identifier (required to pass when using + * S_IFCHR or S_IFBLK). + *

+ * @param int $minor [optional]

+ * The minor device kernel identifier. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function posix_mknod ($pathname, $mode, $major = 0, $minor = 0) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Determine accessibility of a file + * @link http://php.net/manual/en/function.posix-access.php + * @param string $file

+ * The name of the file to be tested. + *

+ * @param int $mode [optional]

+ * A mask consisting of one or more of POSIX_F_OK, + * POSIX_R_OK, POSIX_W_OK and + * POSIX_X_OK. + *

+ *

+ * POSIX_R_OK, POSIX_W_OK and + * POSIX_X_OK request checking whether the file + * exists and has read, write and execute permissions, respectively. + * POSIX_F_OK just requests checking for the + * existence of the file. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function posix_access ($file, $mode = 'POSIX_F_OK') {} + +/** + * (PHP 4, PHP 5)
+ * Return info about a group by name + * @link http://php.net/manual/en/function.posix-getgrnam.php + * @param string $name

The name of the group

+ * @return array The array elements returned are: + * + * The group information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the name of the group. This is + * a short, usually less than 16 character "handle" of the + * group, not the real, full name. This should be the same as + * the name parameter used when + * calling the function, and hence redundant. + *
passwd + * The passwd element contains the group's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
gid + * Group ID of the group in numeric form. + *
members + * This consists of an array of + * string's for all the members in the group. + *
+ * @jms-builtin + */ +function posix_getgrnam ($name) {} + +/** + * (PHP 4, PHP 5)
+ * Return info about a group by group id + * @link http://php.net/manual/en/function.posix-getgrgid.php + * @param int $gid

+ * The group id. + *

+ * @return array The array elements returned are: + * + * The group information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the name of the group. This is + * a short, usually less than 16 character "handle" of the + * group, not the real, full name. + *
passwd + * The passwd element contains the group's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
gid + * Group ID, should be the same as the + * gid parameter used when calling the + * function, and hence redundant. + *
members + * This consists of an array of + * string's for all the members in the group. + *
+ * @jms-builtin + */ +function posix_getgrgid ($gid) {} + +/** + * (PHP 4, PHP 5)
+ * Return info about a user by username + * @link http://php.net/manual/en/function.posix-getpwnam.php + * @param string $username

+ * An alphanumeric username. + *

+ * @return array On success an array with the following elements is returned, else + * FALSE is returned: + * + * The user information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the username of the user. This is + * a short, usually less than 16 character "handle" of the + * user, not the real, full name. This should be the same as + * the username parameter used when + * calling the function, and hence redundant. + *
passwd + * The passwd element contains the user's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
uid + * User ID of the user in numeric form. + *
gid + * The group ID of the user. Use the function + * posix_getgrgid to resolve the group + * name and a list of its members. + *
gecos + * GECOS is an obsolete term that refers to the finger + * information field on a Honeywell batch processing system. + * The field, however, lives on, and its contents have been + * formalized by POSIX. The field contains a comma separated + * list containing the user's full name, office phone, office + * number, and home phone number. On most systems, only the + * user's full name is available. + *
dir + * This element contains the absolute path to the home + * directory of the user. + *
shell + * The shell element contains the absolute path to the + * executable of the user's default shell. + *
+ * @jms-builtin + */ +function posix_getpwnam ($username) {} + +/** + * (PHP 4, PHP 5)
+ * Return info about a user by user id + * @link http://php.net/manual/en/function.posix-getpwuid.php + * @param int $uid

+ * The user identifier. + *

+ * @return array an associative array with the following elements: + * + * The user information array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ElementDescription
name + * The name element contains the username of the user. This is + * a short, usually less than 16 character "handle" of the + * user, not the real, full name. + *
passwd + * The passwd element contains the user's password in an + * encrypted format. Often, for example on a system employing + * "shadow" passwords, an asterisk is returned instead. + *
uid + * User ID, should be the same as the + * uid parameter used when calling the + * function, and hence redundant. + *
gid + * The group ID of the user. Use the function + * posix_getgrgid to resolve the group + * name and a list of its members. + *
gecos + * GECOS is an obsolete term that refers to the finger + * information field on a Honeywell batch processing system. + * The field, however, lives on, and its contents have been + * formalized by POSIX. The field contains a comma separated + * list containing the user's full name, office phone, office + * number, and home phone number. On most systems, only the + * user's full name is available. + *
dir + * This element contains the absolute path to the + * home directory of the user. + *
shell + * The shell element contains the absolute path to the + * executable of the user's default shell. + *
+ * @jms-builtin + */ +function posix_getpwuid ($uid) {} + +/** + * (PHP 4, PHP 5)
+ * Return info about system resource limits + * @link http://php.net/manual/en/function.posix-getrlimit.php + * @return array an associative array of elements for each + * limit that is defined. Each limit has a soft and a hard limit. + * + * List of possible limits returned + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Limit nameLimit description
core + * The maximum size of the core file. When 0, not core files are + * created. When core files are larger than this size, they will + * be truncated at this size. + *
totalmem + * The maximum size of the memory of the process, in bytes. + *
virtualmem + * The maximum size of the virtual memory for the process, in bytes. + *
data + * The maximum size of the data segment for the process, in bytes. + *
stack + * The maximum size of the process stack, in bytes. + *
rss + * The maximum number of virtual pages resident in RAM + *
maxproc + * The maximum number of processes that can be created for the + * real user ID of the calling process. + *
memlock + * The maximum number of bytes of memory that may be locked into RAM. + *
cpu + * The amount of time the process is allowed to use the CPU. + *
filesize + * The maximum size of the data segment for the process, in bytes. + *
openfiles + * One more than the maximum number of open file descriptors. + *
+ * @jms-builtin + */ +function posix_getrlimit () {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Retrieve the error number set by the last posix function that failed + * @link http://php.net/manual/en/function.posix-get-last-error.php + * @return int the errno (error number) set by the last posix function that + * failed. If no errors exist, 0 is returned. + * @jms-builtin + */ +function posix_get_last_error () {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Alias of posix_get_last_error + * @link http://php.net/manual/en/function.posix-errno.php + * @jms-builtin + */ +function posix_errno () {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Retrieve the system error message associated with the given errno + * @link http://php.net/manual/en/function.posix-strerror.php + * @param int $errno

+ * A POSIX error number, returned by + * posix_get_last_error. If set to 0, then the + * string "Success" is returned. + *

+ * @return string the error message, as a string. + * @jms-builtin + */ +function posix_strerror ($errno) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Calculate the group access list + * @link http://php.net/manual/en/function.posix-initgroups.php + * @param string $name

+ * The user to calculate the list for. + *

+ * @param int $base_group_id

+ * Typically the group number from the password file. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function posix_initgroups ($name, $base_group_id) {} + + +/** + * Check whether the file exists. + * @link http://php.net/manual/en/posix.constants.php + */ +define ('POSIX_F_OK', 0); + +/** + * Check whether the file exists and has execute permissions. + * @link http://php.net/manual/en/posix.constants.php + */ +define ('POSIX_X_OK', 1); + +/** + * Check whether the file exists and has write permissions. + * @link http://php.net/manual/en/posix.constants.php + */ +define ('POSIX_W_OK', 2); + +/** + * Check whether the file exists and has read permissions. + * @link http://php.net/manual/en/posix.constants.php + */ +define ('POSIX_R_OK', 4); + +/** + * Normal file + * @link http://php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFREG', 32768); + +/** + * Character special file + * @link http://php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFCHR', 8192); + +/** + * Block special file + * @link http://php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFBLK', 24576); + +/** + * FIFO (named pipe) special file + * @link http://php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFIFO', 4096); + +/** + * Socket + * @link http://php.net/manual/en/posix.constants.php + */ +define ('POSIX_S_IFSOCK', 49152); + +// End of posix v. +?> diff --git a/res/php-5.4-core-api/ps.php b/res/php-5.4-core-api/ps.php new file mode 100644 index 0000000..997f75b --- /dev/null +++ b/res/php-5.4-core-api/ps.php @@ -0,0 +1,1637 @@ + + * Creates a new PostScript document object + * @link http://php.net/manual/en/function.ps-new.php + * @return resource Resource of PostScript document or false on failure. The return value + * is passed to all other functions as the first argument. + * @jms-builtin + */ +function ps_new () {} + +/** + * (PECL ps >= 1.1.0)
+ * Deletes all resources of a PostScript document + * @link http://php.net/manual/en/function.ps-delete.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_delete ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Opens a file for output + * @link http://php.net/manual/en/function.ps-open-file.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $filename [optional]

+ * The name of the postscript file. + * If filename is not passed the document will be + * created in memory and all output will go straight to the browser. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_open_file ($psdoc, $filename = null) {} + +/** + * (PECL ps >= 1.1.0)
+ * Fetches the full buffer containig the generated PS data + * @link http://php.net/manual/en/function.ps-get-buffer.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return string + * @jms-builtin + */ +function ps_get_buffer ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Closes a PostScript document + * @link http://php.net/manual/en/function.ps-close.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_close ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Start a new page + * @link http://php.net/manual/en/function.ps-begin-page.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $width

+ * The width of the page in pixel, e.g. 596 for A4 format. + *

+ * @param float $height

+ * The height of the page in pixel, e.g. 842 for A4 format. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_begin_page ($psdoc, $width, $height) {} + +/** + * (PECL ps >= 1.1.0)
+ * End a page + * @link http://php.net/manual/en/function.ps-end-page.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_end_page ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Gets certain values + * @link http://php.net/manual/en/function.ps-get-value.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $name

+ * Name of the value. + *

+ * @param float $modifier [optional]

+ * The parameter modifier specifies the resource + * for which the value is to be retrieved. This can be the id of a font or + * an image. + *

+ * @return float the value of the parameter or false. + * @jms-builtin + */ +function ps_get_value ($psdoc, $name, $modifier = null) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets certain values + * @link http://php.net/manual/en/function.ps-set-value.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $name

+ * The name can be one of the following: + * textrendering + *

+ * The way how text is shown. + *

+ * @param float $value

+ * The value of the parameter. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_set_value ($psdoc, $name, $value) {} + +/** + * (PECL ps >= 1.1.0)
+ * Gets certain parameters + * @link http://php.net/manual/en/function.ps-get-parameter.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $name

+ * Name of the parameter. + *

+ * @param float $modifier [optional]

+ * An identifier needed if a parameter of a resource is requested, + * e.g. the size of an image. In such a case the resource id is + * passed. + *

+ * @return string the value of the parameter or false on failure. + * @jms-builtin + */ +function ps_get_parameter ($psdoc, $name, $modifier = null) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets certain parameters + * @link http://php.net/manual/en/function.ps-set-parameter.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $name

+ * For a list of possible names see ps_get_parameter. + *

+ * @param string $value

+ * The value of the parameter. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_set_parameter ($psdoc, $name, $value) {} + +/** + * (PECL ps >= 1.1.0)
+ * Loads a font + * @link http://php.net/manual/en/function.ps-findfont.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $fontname

+ * The name of the font. + *

+ * @param string $encoding

+ * ps_findfont will try to load the file passed in + * the parameter encoding. Encoding files are of + * the same syntax as those used by dvips(1). They + * contain a font encoding vector (which is currently not used but must be + * present) and a list of extra ligatures to extend the list of ligatures + * derived from the afm file. + *

+ *

+ * encoding can be null or the empty string if + * the default encoding (TeXBase1) shall be used. + *

+ *

+ * If the encoding is set to builtin then there + * will be no reencoding and the font specific encoding will be used. This + * is very useful with symbol fonts. + *

+ * @param bool $embed [optional]

+ * If set to a value >0 the font will be embedded into the document. This + * requires the font outline (.pfb file) to be present. + *

+ * @return int the identifier of the font or zero in case of an error. The + * identifier is a positive number. + * @jms-builtin + */ +function ps_findfont ($psdoc, $fontname, $encoding, $embed = false) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets font to use for following output + * @link http://php.net/manual/en/function.ps-setfont.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $fontid

+ * The font identifier as returned by ps_findfont. + *

+ * @param float $size

+ * The size of the font. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_setfont ($psdoc, $fontid, $size) {} + +/** + * (PECL ps >= 1.1.0)
+ * Output text + * @link http://php.net/manual/en/function.ps-show.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $text

+ * The text to be output. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_show ($psdoc, $text) {} + +/** + * (PECL ps >= 1.1.0)
+ * Output text at given position + * @link http://php.net/manual/en/function.ps-show-xy.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $text

+ * The text to be output. + *

+ * @param float $x

+ * x-coordinate of the lower left corner of the box surrounding the text. + *

+ * @param float $y

+ * y-coordinate of the lower left corner of the box surrounding the text. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_show_xy ($psdoc, $text, $x, $y) {} + +/** + * (PECL ps >= 1.1.0)
+ * Output a text at current position + * @link http://php.net/manual/en/function.ps-show2.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $text + * @param int $len + * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_show2 ($psdoc, $text, $len) {} + +/** + * (PECL ps >= 1.1.0)
+ * Output text at position + * @link http://php.net/manual/en/function.ps-show-xy2.php + * @param resource $psdoc + * @param string $text + * @param int $len + * @param float $xcoor + * @param float $ycoor + * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_show_xy2 ($psdoc, $text, $len, $xcoor, $ycoor) {} + +/** + * (PECL ps >= 1.1.0)
+ * Continue text in next line + * @link http://php.net/manual/en/function.ps-continue-text.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $text

+ * The text to output. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_continue_text ($psdoc, $text) {} + +/** + * (PECL ps >= 1.1.0)
+ * Output text in a box + * @link http://php.net/manual/en/function.ps-show-boxed.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $text

+ * The text to be output into the given box. + *

+ * @param float $left

+ * x-coordinate of the lower left corner of the box. + *

+ * @param float $bottom

+ * y-coordinate of the lower left corner of the box. + *

+ * @param float $width

+ * Width of the box. + *

+ * @param float $height

+ * Height of the box. + *

+ * @param string $hmode

+ * The parameter hmode can be "justify", + * "fulljustify", "right", "left", or "center". The difference of + * "justify" and "fulljustify" just affects the last line of the box. In + * fulljustify mode the last line will be left and right justified unless + * this is also the last line of paragraph. In justify mode it will always + * be left justified. + *

+ * @param string $feature [optional]

+ *

+ * @return int Number of characters that could not be written. + * @jms-builtin + */ +function ps_show_boxed ($psdoc, $text, $left, $bottom, $width, $height, $hmode, $feature = null) {} + +/** + * (PECL ps >= 1.1.0)
+ * Gets width of a string + * @link http://php.net/manual/en/function.ps-stringwidth.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $text

+ * The text for which the width is to be calculated. + *

+ * @param int $fontid [optional]

+ * The identifier of the font to be used. If not font is specified + * the current font will be used. + *

+ * @param float $size [optional]

+ * The size of the font. If no size is specified the current size + * is used. + *

+ * @return float Width of a string in points. + * @jms-builtin + */ +function ps_stringwidth ($psdoc, $text, $fontid = 0, $size = 0.0) {} + +/** + * (PECL ps >= 1.2.0)
+ * Gets geometry of a string + * @link http://php.net/manual/en/function.ps-string-geometry.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $text

+ * The text for which the geometry is to be calculated. + *

+ * @param int $fontid [optional]

+ * The identifier of the font to be used. If not font is specified + * the current font will be used. + *

+ * @param float $size [optional]

+ * The size of the font. If no size is specified the current size + * is used. + *

+ * @return array An array of the dimensions of a string. The element 'width' contains the + * width of the string as returned by ps_stringwidth. The + * element 'descender' contains the maximum descender and 'ascender' the + * maximum ascender of the string. + * @jms-builtin + */ +function ps_string_geometry ($psdoc, $text, $fontid = 0, $size = 0.0) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets position for text output + * @link http://php.net/manual/en/function.ps-set-text-pos.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $x

+ * x-coordinate of the new text position. + *

+ * @param float $y

+ * y-coordinate of the new text position. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_set_text_pos ($psdoc, $x, $y) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets appearance of a dashed line + * @link http://php.net/manual/en/function.ps-setdash.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $on

+ * The length of the dash. + *

+ * @param float $off

+ * The length of the gap between dashes. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_setdash ($psdoc, $on, $off) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets appearance of a dashed line + * @link http://php.net/manual/en/function.ps-setpolydash.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $arr

+ * arr is a list of length elements alternately for + * the black and white portion. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_setpolydash ($psdoc, $arr) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets flatness + * @link http://php.net/manual/en/function.ps-setflat.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $value

+ * The value must be between 0.2 and 1. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_setflat ($psdoc, $value) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets how contected lines are joined + * @link http://php.net/manual/en/function.ps-setlinejoin.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $type

+ * The way lines are joined. Possible values are + * PS_LINEJOIN_MITER, + * PS_LINEJOIN_ROUND, or + * PS_LINEJOIN_BEVEL. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_setlinejoin ($psdoc, $type) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets appearance of line ends + * @link http://php.net/manual/en/function.ps-setlinecap.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $type

+ * The type of line ends. Possible values are + * PS_LINECAP_BUTT, + * PS_LINECAP_ROUND, or + * PS_LINECAP_SQUARED. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_setlinecap ($psdoc, $type) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets the miter limit + * @link http://php.net/manual/en/function.ps-setmiterlimit.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $value

+ * The maximum ratio between the miter length and the line width. Larger + * values (> 10) will result in very long spikes when two lines meet + * in a small angle. Keep the default unless you know what you are doing. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_setmiterlimit ($psdoc, $value) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets width of a line + * @link http://php.net/manual/en/function.ps-setlinewidth.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $width

+ * The width of lines in points. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_setlinewidth ($psdoc, $width) {} + +/** + * (PECL ps >= 1.3.0)
+ * Sets overprint mode + * @link http://php.net/manual/en/function.ps-setoverprintmode.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $mode + * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_setoverprintmode ($psdoc, $mode) {} + +/** + * (PECL ps >= 1.1.0)
+ * Save current context + * @link http://php.net/manual/en/function.ps-save.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_save ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Restore previously save context + * @link http://php.net/manual/en/function.ps-restore.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_restore ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets translation + * @link http://php.net/manual/en/function.ps-translate.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $x

+ * x-coordinate of the origin of the translated coordinate system. + *

+ * @param float $y

+ * y-coordinate of the origin of the translated coordinate system. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_translate ($psdoc, $x, $y) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets scaling factor + * @link http://php.net/manual/en/function.ps-scale.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $x

+ * Scaling factor in horizontal direction. + *

+ * @param float $y

+ * Scaling factor in vertical direction. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_scale ($psdoc, $x, $y) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets rotation factor + * @link http://php.net/manual/en/function.ps-rotate.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $rot

+ * Angle of rotation in degree. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_rotate ($psdoc, $rot) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets current point + * @link http://php.net/manual/en/function.ps-moveto.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $x

+ * x-coordinate of the point to move to. + *

+ * @param float $y

+ * y-coordinate of the point to move to. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_moveto ($psdoc, $x, $y) {} + +/** + * (PECL ps >= 1.1.0)
+ * Draws a line + * @link http://php.net/manual/en/function.ps-lineto.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $x

+ * x-coordinate of the end point of the line. + *

+ * @param float $y

+ * y-coordinate of the end point of the line. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_lineto ($psdoc, $x, $y) {} + +/** + * (PECL ps >= 1.1.0)
+ * Draws a curve + * @link http://php.net/manual/en/function.ps-curveto.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $x1

+ * x-coordinate of first control point. + *

+ * @param float $y1

+ * y-coordinate of first control point. + *

+ * @param float $x2

+ * x-coordinate of second control point. + *

+ * @param float $y2

+ * y-coordinate of second control point. + *

+ * @param float $x3

+ * x-coordinate of third control point. + *

+ * @param float $y3

+ * y-coordinate of third control point. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_curveto ($psdoc, $x1, $y1, $x2, $y2, $x3, $y3) {} + +/** + * (PECL ps >= 1.1.0)
+ * Draws a circle + * @link http://php.net/manual/en/function.ps-circle.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $x

+ * The x-coordinate of the circle's middle point. + *

+ * @param float $y

+ * The y-coordinate of the circle's middle point. + *

+ * @param float $radius

+ * The radius of the circle + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_circle ($psdoc, $x, $y, $radius) {} + +/** + * (PECL ps >= 1.1.0)
+ * Draws an arc counterclockwise + * @link http://php.net/manual/en/function.ps-arc.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $x

+ * The x-coordinate of the circle's middle point. + *

+ * @param float $y

+ * The y-coordinate of the circle's middle point. + *

+ * @param float $radius

+ * The radius of the circle + *

+ * @param float $alpha

+ * The start angle given in degrees. + *

+ * @param float $beta

+ * The end angle given in degrees. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_arc ($psdoc, $x, $y, $radius, $alpha, $beta) {} + +/** + * (PECL ps >= 1.1.0)
+ * Draws an arc clockwise + * @link http://php.net/manual/en/function.ps-arcn.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $x

+ * The x-coordinate of the circle's middle point. + *

+ * @param float $y

+ * The y-coordinate of the circle's middle point. + *

+ * @param float $radius

+ * The radius of the circle + *

+ * @param float $alpha

+ * The starting angle given in degrees. + *

+ * @param float $beta

+ * The end angle given in degrees. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_arcn ($psdoc, $x, $y, $radius, $alpha, $beta) {} + +/** + * (PECL ps >= 1.1.0)
+ * Draws a rectangle + * @link http://php.net/manual/en/function.ps-rect.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $x

+ * x-coordinate of the lower left corner of the rectangle. + *

+ * @param float $y

+ * y-coordinate of the lower left corner of the rectangle. + *

+ * @param float $width

+ * The width of the image. + *

+ * @param float $height

+ * The height of the image. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_rect ($psdoc, $x, $y, $width, $height) {} + +/** + * (PECL ps >= 1.1.0)
+ * Closes path + * @link http://php.net/manual/en/function.ps-closepath.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_closepath ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Draws the current path + * @link http://php.net/manual/en/function.ps-stroke.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_stroke ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Closes and strokes path + * @link http://php.net/manual/en/function.ps-closepath-stroke.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_closepath_stroke ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Fills the current path + * @link http://php.net/manual/en/function.ps-fill.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_fill ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Fills and strokes the current path + * @link http://php.net/manual/en/function.ps-fill-stroke.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_fill_stroke ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Clips drawing to current path + * @link http://php.net/manual/en/function.ps-clip.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_clip ($psdoc) {} + +/** + * (PECL ps >= 1.1.0)
+ * Opens image from file + * @link http://php.net/manual/en/function.ps-open-image-file.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $type

+ * The type of the image. Possible values are png, + * jpeg, or eps. + *

+ * @param string $filename

+ * The name of the file containing the image data. + *

+ * @param string $stringparam [optional]

+ * Not used. + *

+ * @param int $intparam [optional]

+ * Not used. + *

+ * @return int identifier of image or zero in case of an error. The identifier is + * a positive number greater than 0. + * @jms-builtin + */ +function ps_open_image_file ($psdoc, $type, $filename, $stringparam = null, $intparam = 0) {} + +/** + * (PECL ps >= 1.1.0)
+ * Reads an image for later placement + * @link http://php.net/manual/en/function.ps-open-image.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $type

+ * The type of the image. Possible values are png, + * jpeg, or eps. + *

+ * @param string $source

+ * Not used. + *

+ * @param string $data

+ * The image data. + *

+ * @param int $lenght + * @param int $width

+ * The width of the image. + *

+ * @param int $height

+ * The height of the image. + *

+ * @param int $components

+ * The number of components for each pixel. This can be + * 1 (gray scale images), 3 (rgb images), or 4 (cmyk, rgba images). + *

+ * @param int $bpc

+ * Number of bits per component (quite often 8). + *

+ * @param string $params + * @return int identifier of image or zero in case of an error. The identifier is + * a positive number greater than 0. + * @jms-builtin + */ +function ps_open_image ($psdoc, $type, $source, $data, $lenght, $width, $height, $components, $bpc, $params) {} + +/** + * (PECL ps >= 1.1.0)
+ * Closes image and frees memory + * @link http://php.net/manual/en/function.ps-close-image.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $imageid

+ * Resource identifier of the image as returned by + * ps_open_image or + * ps_open_image_file. + *

+ * @return void null on success or false on failure. + * @jms-builtin + */ +function ps_close_image ($psdoc, $imageid) {} + +/** + * (PECL ps >= 1.1.0)
+ * Places image on the page + * @link http://php.net/manual/en/function.ps-place-image.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $imageid

+ * The resource identifier of the image as returned by + * ps_open_image or + * ps_open_image_file. + *

+ * @param float $x

+ * x-coordinate of the lower left corner of the image. + *

+ * @param float $y

+ * y-coordinate of the lower left corner of the image. + *

+ * @param float $scale

+ * The scaling factor for the image. A scale of 1.0 will result + * in a resolution of 72 dpi, because each pixel is equivalent to + * 1 point. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_place_image ($psdoc, $imageid, $x, $y, $scale) {} + +/** + * (PECL ps >= 1.1.0)
+ * Add bookmark to current page + * @link http://php.net/manual/en/function.ps-add-bookmark.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $text

+ * The text used for displaying the bookmark. + *

+ * @param int $parent [optional]

+ * A bookmark previously created by this function which + * is used as the parent of the new bookmark. + *

+ * @param int $open [optional]

+ * If open is unequal to zero the bookmark will + * be shown open by the pdf viewer. + *

+ * @return int The returned value is a reference for the bookmark. It is only used if + * the bookmark shall be used as a parent. The value is greater zero if + * the function succeeds. In case of an error zero will + * be returned. + * @jms-builtin + */ +function ps_add_bookmark ($psdoc, $text, $parent = 0, $open = 0) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets information fields of document + * @link http://php.net/manual/en/function.ps-set-info.php + * @param resource $p + * @param string $key

+ * The name of the information field to set. The values which can be + * set are Keywords, Subject, + * Title, Creator, + * Author, BoundingBox, and + * Orientation. Be aware that some of them has a + * meaning to PostScript viewers. + *

+ * @param string $val + * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_set_info ($p, $key, $val) {} + +/** + * (PECL ps >= 1.3.4)
+ * Reads an external file with raw PostScript code + * @link http://php.net/manual/en/function.ps-include-file.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $file + * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_include_file ($psdoc, $file) {} + +/** + * (PECL ps >= 1.1.0)
+ * Adds note to current page + * @link http://php.net/manual/en/function.ps-add-note.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $llx

+ * The x-coordinate of the lower left corner. + *

+ * @param float $lly

+ * The y-coordinate of the lower left corner. + *

+ * @param float $urx

+ * The x-coordinate of the upper right corner. + *

+ * @param float $ury

+ * The y-coordinate of the upper right corner. + *

+ * @param string $contents

+ * The text of the note. + *

+ * @param string $title

+ * The title of the note as displayed in the header of the note. + *

+ * @param string $icon

+ * The icon shown if the note is folded. This parameter can be set + * to comment, insert, + * note, paragraph, + * newparagraph, key, or + * help. + *

+ * @param int $open

+ * If open is unequal to zero the note will + * be shown unfolded after opening the document with a pdf viewer. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_add_note ($psdoc, $llx, $lly, $urx, $ury, $contents, $title, $icon, $open) {} + +/** + * (PECL ps >= 1.1.0)
+ * Adds link to a page in a second pdf document + * @link http://php.net/manual/en/function.ps-add-pdflink.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $llx

+ * The x-coordinate of the lower left corner. + *

+ * @param float $lly

+ * The y-coordinate of the lower left corner. + *

+ * @param float $urx

+ * The x-coordinate of the upper right corner. + *

+ * @param float $ury

+ * The y-coordinate of the upper right corner. + *

+ * @param string $filename

+ * The name of the pdf document to be opened when clicking on + * this link. + *

+ * @param int $page

+ * The page number of the destination pdf document + *

+ * @param string $dest

+ * The parameter dest determines how the document + * is being viewed. It can be fitpage, + * fitwidth, fitheight, or + * fitbbox. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_add_pdflink ($psdoc, $llx, $lly, $urx, $ury, $filename, $page, $dest) {} + +/** + * (PECL ps >= 1.1.0)
+ * Adds link to a page in the same document + * @link http://php.net/manual/en/function.ps-add-locallink.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $llx

+ * The x-coordinate of the lower left corner. + *

+ * @param float $lly

+ * The y-coordinate of the lower left corner. + *

+ * @param float $urx

+ * The x-coordinate of the upper right corner. + *

+ * @param float $ury

+ * The y-coordinate of the upper right corner. + *

+ * @param int $page

+ * The number of the page displayed when clicking on the link. + *

+ * @param string $dest

+ * The parameter dest determines how the document + * is being viewed. It can be fitpage, + * fitwidth, fitheight, or + * fitbbox. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_add_locallink ($psdoc, $llx, $lly, $urx, $ury, $page, $dest) {} + +/** + * (PECL ps >= 1.1.0)
+ * Adds link which launches file + * @link http://php.net/manual/en/function.ps-add-launchlink.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $llx

+ * The x-coordinate of the lower left corner. + *

+ * @param float $lly

+ * The y-coordinate of the lower left corner. + *

+ * @param float $urx

+ * The x-coordinate of the upper right corner. + *

+ * @param float $ury

+ * The y-coordinate of the upper right corner. + *

+ * @param string $filename

+ * The path of the program to be started, when the link is clicked on. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_add_launchlink ($psdoc, $llx, $lly, $urx, $ury, $filename) {} + +/** + * (PECL ps >= 1.1.0)
+ * Adds link to a web location + * @link http://php.net/manual/en/function.ps-add-weblink.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $llx

+ * The x-coordinate of the lower left corner. + *

+ * @param float $lly

+ * The y-coordinate of the lower left corner. + *

+ * @param float $urx

+ * The x-coordinate of the upper right corner. + *

+ * @param float $ury

+ * The y-coordinate of the upper right corner. + *

+ * @param string $url

+ * The url of the hyperlink to be opened when clicking on + * this link, e.g. http://www.php.net. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_add_weblink ($psdoc, $llx, $lly, $urx, $ury, $url) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets border style of annotations + * @link http://php.net/manual/en/function.ps-set-border-style.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $style

+ * style can be solid or + * dashed. + *

+ * @param float $width

+ * The line width of the border. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_set_border_style ($psdoc, $style, $width) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets color of border for annotations + * @link http://php.net/manual/en/function.ps-set-border-color.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $red

+ * The red component of the border color. + *

+ * @param float $green

+ * The green component of the border color. + *

+ * @param float $blue

+ * The blue component of the border color. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_set_border_color ($psdoc, $red, $green, $blue) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets length of dashes for border of annotations + * @link http://php.net/manual/en/function.ps-set-border-dash.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $black

+ * The length of the dash. + *

+ * @param float $white

+ * The length of the gap between dashes. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_set_border_dash ($psdoc, $black, $white) {} + +/** + * (PECL ps >= 1.1.0)
+ * Sets current color + * @link http://php.net/manual/en/function.ps-setcolor.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $type

+ * The parameter type can be + * both, fill, or + * fillstroke. + *

+ * @param string $colorspace

+ * The colorspace should be one of gray, + * rgb, cmyk, + * spot, pattern. Depending on the + * colorspace either only the first, the first three or all parameters + * will be used. + *

+ * @param float $c1

+ * Depending on the colorspace this is either the red component (rgb), + * the cyan component (cmyk), the gray value (gray), the identifier of + * the spot color or the identifier of the pattern. + *

+ * @param float $c2

+ * Depending on the colorspace this is either the green component (rgb), + * the magenta component (cmyk). + *

+ * @param float $c3

+ * Depending on the colorspace this is either the blue component (rgb), + * the yellow component (cmyk). + *

+ * @param float $c4

+ * This must only be set in cmyk colorspace and specifies the black + * component. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_setcolor ($psdoc, $type, $colorspace, $c1, $c2, $c3, $c4) {} + +/** + * (PECL ps >= 1.1.0)
+ * Create spot color + * @link http://php.net/manual/en/function.ps-makespotcolor.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $name

+ * Name of the spot color, e.g. Pantone 5565. + *

+ * @param int $reserved [optional] + * @return int The id of the new spot color or 0 in case of an error. + * @jms-builtin + */ +function ps_makespotcolor ($psdoc, $name, $reserved = 0) {} + +/** + * (PECL ps >= 1.2.0)
+ * Start a new pattern + * @link http://php.net/manual/en/function.ps-begin-pattern.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $width

+ * The width of the pattern in pixel. + *

+ * @param float $height

+ * The height of the pattern in pixel. + *

+ * @param float $xstep + * @param float $ystep + * @param int $painttype

+ * Must be 1 or 2. + *

+ * @return int The identifier of the pattern or false on failure. + * @jms-builtin + */ +function ps_begin_pattern ($psdoc, $width, $height, $xstep, $ystep, $painttype) {} + +/** + * (PECL ps >= 1.2.0)
+ * End a pattern + * @link http://php.net/manual/en/function.ps-end-pattern.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_end_pattern ($psdoc) {} + +/** + * (PECL ps >= 1.2.0)
+ * Start a new template + * @link http://php.net/manual/en/function.ps-begin-template.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param float $width

+ * The width of the template in pixel. + *

+ * @param float $height

+ * The height of the template in pixel. + *

+ * @return int true on success or false on failure. + * @jms-builtin + */ +function ps_begin_template ($psdoc, $width, $height) {} + +/** + * (PECL ps >= 1.2.0)
+ * End a template + * @link http://php.net/manual/en/function.ps-end-template.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_end_template ($psdoc) {} + +/** + * (PECL ps >= 1.3.0)
+ * Fills an area with a shading + * @link http://php.net/manual/en/function.ps-shfill.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $shadingid

+ * The identifier of a shading previously created with + * ps_shading. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_shfill ($psdoc, $shadingid) {} + +/** + * (PECL ps >= 1.3.0)
+ * Creates a shading for later use + * @link http://php.net/manual/en/function.ps-shading.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $type

+ * The type of shading can be either radial or + * axial. Each shading starts with the current fill + * color and ends with the given color values passed in the parameters + * c1 to c4 + * (see ps_setcolor for their meaning). + *

+ * @param float $x0 + * @param float $y0 + * @param float $x1 + * @param float $y1 + * @param float $c1 + * @param float $c2 + * @param float $c3 + * @param float $c4 + * @param string $optlist

+ * If the shading is of type radial the + * optlist must also contain the parameters + * r0 and r1 with the radius of the + * start and end circle. + *

+ * @return int the identifier of the pattern or false on failure. + * @jms-builtin + */ +function ps_shading ($psdoc, $type, $x0, $y0, $x1, $y1, $c1, $c2, $c3, $c4, $optlist) {} + +/** + * (PECL ps >= 1.3.0)
+ * Creates a pattern based on a shading + * @link http://php.net/manual/en/function.ps-shading-pattern.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $shadingid

+ * The identifier of a shading previously created with + * ps_shading. + *

+ * @param string $optlist

+ * This argument is not currently used. + *

+ * @return int The identifier of the pattern or false on failure. + * @jms-builtin + */ +function ps_shading_pattern ($psdoc, $shadingid, $optlist) {} + +/** @jms-builtin */ +function ps_begin_font () {} + +/** @jms-builtin */ +function ps_end_font () {} + +/** @jms-builtin */ +function ps_begin_glyph () {} + +/** @jms-builtin */ +function ps_end_glyph () {} + +/** + * (PECL ps >= 1.1.0)
+ * Takes an GD image and returns an image for placement in a PS document + * @link http://php.net/manual/en/function.ps-open-memory-image.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $gd + * @return int + * @jms-builtin + */ +function ps_open_memory_image ($psdoc, $gd) {} + +/** + * (PECL ps >= 1.1.1)
+ * Hyphenates a word + * @link http://php.net/manual/en/function.ps-hyphenate.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param string $text

+ * text should not contain any non alpha + * characters. Possible positions for breaks are returned in an array of + * interger numbers. Each number is the position of the char in + * text after which a hyphenation can take place. + *

+ * @return array An array of integers indicating the position of possible breaks in + * the text or false on failure. + * @jms-builtin + */ +function ps_hyphenate ($psdoc, $text) {} + +/** + * (PECL ps >= 1.2.0)
+ * Output a glyph + * @link http://php.net/manual/en/function.ps-symbol.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $ord

+ * The position of the glyph in the font encoding vector. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function ps_symbol ($psdoc, $ord) {} + +/** + * (PECL ps >= 1.2.0)
+ * Gets name of a glyph + * @link http://php.net/manual/en/function.ps-symbol-name.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $ord

+ * The parameter ord is the position of the glyph + * in the font encoding vector. + *

+ * @param int $fontid [optional]

+ * The identifier of the font to be used. If not font is specified + * the current font will be used. + *

+ * @return string The name of a glyph in the given font. + * @jms-builtin + */ +function ps_symbol_name ($psdoc, $ord, $fontid = 0) {} + +/** + * (PECL ps >= 1.2.0)
+ * Gets width of a glyph + * @link http://php.net/manual/en/function.ps-symbol-width.php + * @param resource $psdoc

+ * Resource identifier of the postscript file + * as returned by ps_new. + *

+ * @param int $ord

+ * The position of the glyph in the font encoding vector. + *

+ * @param int $fontid [optional]

+ * The identifier of the font to be used. If not font is specified + * the current font will be used. + *

+ * @param float $size [optional]

+ * The size of the font. If no size is specified the current size + * is used. + *

+ * @return float The width of a glyph in points. + * @jms-builtin + */ +function ps_symbol_width ($psdoc, $ord, $fontid = 0, $size = 0.0) {} + +/** @jms-builtin */ +function ps_glyph_show () {} + +/** @jms-builtin */ +function ps_glyph_width () {} + +/** @jms-builtin */ +function ps_glyph_list () {} + +/** @jms-builtin */ +function ps_add_kerning () {} + +/** @jms-builtin */ +function ps_add_ligature () {} + +define ('PS_LINECAP_BUTT', 0); +define ('PS_LINECAP_ROUND', 1); +define ('PS_LINECAP_SQUARED', 2); +define ('PS_LINEJOIN_MITER', 0); +define ('PS_LINEJOIN_ROUND', 1); +define ('PS_LINEJOIN_BEVEL', 2); + +// End of ps v. +?> diff --git a/res/php-5.4-core-api/pspell.php b/res/php-5.4-core-api/pspell.php new file mode 100644 index 0000000..1b230f6 --- /dev/null +++ b/res/php-5.4-core-api/pspell.php @@ -0,0 +1,329 @@ + + * Load a new dictionary + * @link http://php.net/manual/en/function.pspell-new.php + * @param string $language

+ * The language parameter is the language code which consists of the + * two letter ISO 639 language code and an optional two letter ISO + * 3166 country code after a dash or underscore. + *

+ * @param string $spelling [optional]

+ * The spelling parameter is the requested spelling for languages + * with more than one spelling such as English. Known values are + * 'american', 'british', and 'canadian'. + *

+ * @param string $jargon [optional]

+ * The jargon parameter contains extra information to distinguish + * two different words lists that have the same language and + * spelling parameters. + *

+ * @param string $encoding [optional]

+ * The encoding parameter is the encoding that words are expected to + * be in. Valid values are 'utf-8', 'iso8859-*', 'koi8-r', + * 'viscii', 'cp1252', 'machine unsigned 16', 'machine unsigned + * 32'. This parameter is largely untested, so be careful when + * using. + *

+ * @param int $mode [optional]

+ * The mode parameter is the mode in which spellchecker will work. + * There are several modes available: + * PSPELL_FAST - Fast mode (least number of + * suggestions) + * @return int the dictionary link identifier on success or FALSE on failure. + * @jms-builtin + */ +function pspell_new ($language, $spelling = null, $jargon = null, $encoding = null, $mode = 0) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Load a new dictionary with personal wordlist + * @link http://php.net/manual/en/function.pspell-new-personal.php + * @param string $personal

+ * The file where words added to the personal list will be stored. + * It should be an absolute filename beginning with '/' because otherwise + * it will be relative to $HOME, which is "/root" for most systems, and + * is probably not what you want. + *

+ * @param string $language

+ * The language code which consists of the two letter ISO 639 language + * code and an optional two letter ISO 3166 country code after a dash + * or underscore. + *

+ * @param string $spelling [optional]

+ * The requested spelling for languages with more than one spelling such + * as English. Known values are 'american', 'british', and 'canadian'. + *

+ * @param string $jargon [optional]

+ * Extra information to distinguish two different words lists that have + * the same language and spelling parameters. + *

+ * @param string $encoding [optional]

+ * The encoding that words are expected to be in. Valid values are + * utf-8, iso8859-*, + * koi8-r, viscii, + * cp1252, machine unsigned 16, + * machine unsigned 32. + *

+ * @param int $mode [optional]

+ * The mode in which spellchecker will work. There are several modes available: + * PSPELL_FAST - Fast mode (least number of + * suggestions) + * @return int the dictionary link identifier for use in other pspell functions. + * @jms-builtin + */ +function pspell_new_personal ($personal, $language, $spelling = null, $jargon = null, $encoding = null, $mode = 0) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Load a new dictionary with settings based on a given config + * @link http://php.net/manual/en/function.pspell-new-config.php + * @param int $config

+ * The config parameter is the one returned by + * pspell_config_create when the config was created. + *

+ * @return int a dictionary link identifier on success. + * @jms-builtin + */ +function pspell_new_config ($config) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Check a word + * @link http://php.net/manual/en/function.pspell-check.php + * @param int $dictionary_link + * @param string $word

+ * The tested word. + *

+ * @return bool TRUE if the spelling is correct, FALSE if not. + * @jms-builtin + */ +function pspell_check ($dictionary_link, $word) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Suggest spellings of a word + * @link http://php.net/manual/en/function.pspell-suggest.php + * @param int $dictionary_link + * @param string $word

+ * The tested word. + *

+ * @return array an array of possible spellings. + * @jms-builtin + */ +function pspell_suggest ($dictionary_link, $word) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Store a replacement pair for a word + * @link http://php.net/manual/en/function.pspell-store-replacement.php + * @param int $dictionary_link

+ * A dictionary link identifier, opened with + * pspell_new_personal + *

+ * @param string $misspelled

+ * The misspelled word. + *

+ * @param string $correct

+ * The fixed spelling for the misspelled word. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_store_replacement ($dictionary_link, $misspelled, $correct) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Add the word to a personal wordlist + * @link http://php.net/manual/en/function.pspell-add-to-personal.php + * @param int $dictionary_link + * @param string $word

+ * The added word. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_add_to_personal ($dictionary_link, $word) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Add the word to the wordlist in the current session + * @link http://php.net/manual/en/function.pspell-add-to-session.php + * @param int $dictionary_link + * @param string $word

+ * The added word. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_add_to_session ($dictionary_link, $word) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Clear the current session + * @link http://php.net/manual/en/function.pspell-clear-session.php + * @param int $dictionary_link + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_clear_session ($dictionary_link) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Save the personal wordlist to a file + * @link http://php.net/manual/en/function.pspell-save-wordlist.php + * @param int $dictionary_link

+ * A dictionary link identifier opened with + * pspell_new_personal. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_save_wordlist ($dictionary_link) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Create a config used to open a dictionary + * @link http://php.net/manual/en/function.pspell-config-create.php + * @param string $language

+ * The language parameter is the language code which consists of the + * two letter ISO 639 language code and an optional two letter ISO + * 3166 country code after a dash or underscore. + *

+ * @param string $spelling [optional]

+ * The spelling parameter is the requested spelling for languages + * with more than one spelling such as English. Known values are + * 'american', 'british', and 'canadian'. + *

+ * @param string $jargon [optional]

+ * The jargon parameter contains extra information to distinguish + * two different words lists that have the same language and + * spelling parameters. + *

+ * @param string $encoding [optional]

+ * The encoding parameter is the encoding that words are expected to + * be in. Valid values are 'utf-8', 'iso8859-*', 'koi8-r', + * 'viscii', 'cp1252', 'machine unsigned 16', 'machine unsigned + * 32'. This parameter is largely untested, so be careful when + * using. + *

+ * @return int Retuns a pspell config identifier, or FALSE on error. + * @jms-builtin + */ +function pspell_config_create ($language, $spelling = null, $jargon = null, $encoding = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Consider run-together words as valid compounds + * @link http://php.net/manual/en/function.pspell-config-runtogether.php + * @param int $dictionary_link + * @param bool $flag

+ * TRUE if run-together words should be treated as legal compounds, + * FALSE otherwise. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_config_runtogether ($dictionary_link, $flag) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Change the mode number of suggestions returned + * @link http://php.net/manual/en/function.pspell-config-mode.php + * @param int $dictionary_link + * @param int $mode

+ * The mode parameter is the mode in which spellchecker will work. + * There are several modes available: + * PSPELL_FAST - Fast mode (least number of + * suggestions) + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_config_mode ($dictionary_link, $mode) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Ignore words less than N characters long + * @link http://php.net/manual/en/function.pspell-config-ignore.php + * @param int $dictionary_link + * @param int $n

+ * Words less than n characters will be skipped. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_config_ignore ($dictionary_link, $n) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Set a file that contains personal wordlist + * @link http://php.net/manual/en/function.pspell-config-personal.php + * @param int $dictionary_link + * @param string $file

+ * The personal wordlist. If the file does not exist, it will be created. + * The file should be writable by whoever PHP runs as (e.g. nobody). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_config_personal ($dictionary_link, $file) {} + +/** + * (PHP 5)
+ * Location of the main word list + * @link http://php.net/manual/en/function.pspell-config-dict-dir.php + * @param int $conf + * @param string $directory + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_config_dict_dir ($conf, $directory) {} + +/** + * (PHP 5)
+ * location of language data files + * @link http://php.net/manual/en/function.pspell-config-data-dir.php + * @param int $conf + * @param string $directory + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_config_data_dir ($conf, $directory) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Set a file that contains replacement pairs + * @link http://php.net/manual/en/function.pspell-config-repl.php + * @param int $dictionary_link + * @param string $file

+ * The file should be writable by whoever PHP runs as (e.g. nobody). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_config_repl ($dictionary_link, $file) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Determine whether to save a replacement pairs list +along with the wordlist + * @link http://php.net/manual/en/function.pspell-config-save-repl.php + * @param int $dictionary_link + * @param bool $flag

+ * TRUE if replacement pairs should be saved, FALSE otherwise. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function pspell_config_save_repl ($dictionary_link, $flag) {} + +define ('PSPELL_FAST', 1); +define ('PSPELL_NORMAL', 2); +define ('PSPELL_BAD_SPELLERS', 3); +define ('PSPELL_RUN_TOGETHER', 8); + +// End of pspell v. +?> diff --git a/res/php-5.4-core-api/radius.php b/res/php-5.4-core-api/radius.php new file mode 100644 index 0000000..2c4f782 --- /dev/null +++ b/res/php-5.4-core-api/radius.php @@ -0,0 +1,901 @@ + + * Creates a Radius handle for authentication + * @link http://php.net/manual/en/function.radius-auth-open.php + * @return resource a handle on success, false on error. This function only fails if + * insufficient memory is available. + * @jms-builtin + */ +function radius_auth_open () {} + +/** + * (PECL radius >= 1.1.0)
+ * Creates a Radius handle for accounting + * @link http://php.net/manual/en/function.radius-acct-open.php + * @return resource a handle on success, false on error. This function only fails if + * insufficient memory is available. + * @jms-builtin + */ +function radius_acct_open () {} + +/** + * (PECL radius >= 1.1.0)
+ * Frees all ressources + * @link http://php.net/manual/en/function.radius-close.php + * @param resource $radius_handle + * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_close ($radius_handle) {} + +/** + * (PECL radius >= 1.1.0)
+ * Returns an error message + * @link http://php.net/manual/en/function.radius-strerror.php + * @param resource $radius_handle + * @return string error messages as string from failed radius functions. + * @jms-builtin + */ +function radius_strerror ($radius_handle) {} + +/** + * (PECL radius >= 1.1.0)
+ * Causes the library to read the given configuration file + * @link http://php.net/manual/en/function.radius-config.php + * @param resource $radius_handle

+ *

+ * @param string $file

+ * The pathname of the configuration file is passed as the file argument + * to radius_config. The library can also be + * configured programmatically by calls to + * radius_add_server. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_config ($radius_handle, $file) {} + +/** + * (PECL radius >= 1.1.0)
+ * Adds a server + * @link http://php.net/manual/en/function.radius-add-server.php + * @param resource $radius_handle + * @param string $hostname

+ * The hostname parameter specifies the server host, + * either as a fully qualified domain name or as a dotted-quad IP address + * in text form. + *

+ * @param int $port

+ * The port specifies the UDP port to contact on + * the server. If port is given as 0, the library looks up the + * radius/udp or + * radacct/udp service in the + * network services database, and uses the port found there. If no entry + * is found, the library uses the standard Radius ports, 1812 for + * authentication and 1813 for accounting. + *

+ * @param string $secret

+ * The shared secret for the server host is passed to the + * secret parameter. The Radius protocol ignores + * all but the leading 128 bytes of the shared secret. + *

+ * @param int $timeout

+ * The timeout for receiving replies from the server is passed to the + * timeout parameter, in units of seconds. + *

+ * @param int $max_tries

+ * The maximum number of repeated requests to make before giving up is + * passed into the max_tries. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_add_server ($radius_handle, $hostname, $port, $secret, $timeout, $max_tries) {} + +/** + * (PECL radius >= 1.1.0)
+ * Create accounting or authentication request + * @link http://php.net/manual/en/function.radius-create-request.php + * @param resource $radius_handle + * @param int $type

+ * Type is RADIUS_ACCESS_REQUEST or + * RADIUS_ACCOUNTING_REQUEST. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_create_request ($radius_handle, $type) {} + +/** + * (PECL radius >= 1.1.0)
+ * Attaches a string attribute + * @link http://php.net/manual/en/function.radius-put-string.php + * @param resource $radius_handle + * @param int $type + * @param string $value + * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_put_string ($radius_handle, $type, $value) {} + +/** + * (PECL radius >= 1.1.0)
+ * Attaches an integer attribute + * @link http://php.net/manual/en/function.radius-put-int.php + * @param resource $radius_handle + * @param int $type + * @param int $value + * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_put_int ($radius_handle, $type, $value) {} + +/** + * (PECL radius >= 1.1.0)
+ * Attaches a binary attribute + * @link http://php.net/manual/en/function.radius-put-attr.php + * @param resource $radius_handle + * @param int $type + * @param string $value + * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_put_attr ($radius_handle, $type, $value) {} + +/** + * (PECL radius >= 1.1.0)
+ * Attaches an IP-Address attribute + * @link http://php.net/manual/en/function.radius-put-addr.php + * @param resource $radius_handle + * @param int $type + * @param string $addr + * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_put_addr ($radius_handle, $type, $addr) {} + +/** + * (PECL radius >= 1.1.0)
+ * Attaches a vendor specific string attribute + * @link http://php.net/manual/en/function.radius-put-vendor-string.php + * @param resource $radius_handle + * @param int $vendor + * @param int $type + * @param string $value + * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_put_vendor_string ($radius_handle, $vendor, $type, $value) {} + +/** + * (PECL radius >= 1.1.0)
+ * Attaches a vendor specific integer attribute + * @link http://php.net/manual/en/function.radius-put-vendor-int.php + * @param resource $radius_handle + * @param int $vendor + * @param int $type + * @param int $value + * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_put_vendor_int ($radius_handle, $vendor, $type, $value) {} + +/** + * (PECL radius >= 1.1.0)
+ * Attaches a vendor specific binary attribute + * @link http://php.net/manual/en/function.radius-put-vendor-attr.php + * @param resource $radius_handle + * @param int $vendor + * @param int $type + * @param string $value + * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_put_vendor_attr ($radius_handle, $vendor, $type, $value) {} + +/** + * (PECL radius >= 1.1.0)
+ * Attaches a vendor specific IP-Address attribute + * @link http://php.net/manual/en/function.radius-put-vendor-addr.php + * @param resource $radius_handle + * @param int $vendor + * @param int $type + * @param string $addr + * @return bool true on success or false on failure. + * @jms-builtin + */ +function radius_put_vendor_addr ($radius_handle, $vendor, $type, $addr) {} + +/** + * (PECL radius >= 1.1.0)
+ * Sends the request and waites for a reply + * @link http://php.net/manual/en/function.radius-send-request.php + * @param resource $radius_handle + * @return int If a valid response is received, radius_send_request + * returns the Radius code which specifies the type of the response. This will + * typically be RADIUS_ACCESS_ACCEPT, + * RADIUS_ACCESS_REJECT, or + * RADIUS_ACCESS_CHALLENGE. If no valid response is + * received, radius_send_request returns false. + * @jms-builtin + */ +function radius_send_request ($radius_handle) {} + +/** + * (PECL radius >= 1.1.0)
+ * Extracts an attribute + * @link http://php.net/manual/en/function.radius-get-attr.php + * @param resource $radius_handle + * @return mixed an associative array containing the attribute-type and the data, or + * error number <= 0. + * @jms-builtin + */ +function radius_get_attr ($radius_handle) {} + +/** + * (PECL radius >= 1.1.0)
+ * Extracts a vendor specific attribute + * @link http://php.net/manual/en/function.radius-get-vendor-attr.php + * @param string $data + * @return array an associative array containing the attribute-type, vendor and the + * data, or false on error. + * @jms-builtin + */ +function radius_get_vendor_attr ($data) {} + +/** + * (PECL radius >= 1.1.0)
+ * Converts raw data to IP-Address + * @link http://php.net/manual/en/function.radius-cvt-addr.php + * @param string $data + * @return string + * @jms-builtin + */ +function radius_cvt_addr ($data) {} + +/** + * (PECL radius >= 1.1.0)
+ * Converts raw data to integer + * @link http://php.net/manual/en/function.radius-cvt-int.php + * @param string $data + * @return int + * @jms-builtin + */ +function radius_cvt_int ($data) {} + +/** + * (PECL radius >= 1.1.0)
+ * Converts raw data to string + * @link http://php.net/manual/en/function.radius-cvt-string.php + * @param string $data + * @return string + * @jms-builtin + */ +function radius_cvt_string ($data) {} + +/** + * (PECL radius >= 1.1.0)
+ * Returns the request authenticator + * @link http://php.net/manual/en/function.radius-request-authenticator.php + * @param resource $radius_handle + * @return string the request authenticator as string, or false on error. + * @jms-builtin + */ +function radius_request_authenticator ($radius_handle) {} + +/** + * (PECL radius >= 1.1.0)
+ * Returns the shared secret + * @link http://php.net/manual/en/function.radius-server-secret.php + * @param resource $radius_handle + * @return string the server's shared secret as string, or false on error. + * @jms-builtin + */ +function radius_server_secret ($radius_handle) {} + +/** + * (PECL radius >= 1.2.0)
+ * Demangles data + * @link http://php.net/manual/en/function.radius-demangle.php + * @param resource $radius_handle + * @param string $mangled + * @return string the demangled string, or false on error. + * @jms-builtin + */ +function radius_demangle ($radius_handle, $mangled) {} + +/** + * (PECL radius >= 1.2.0)
+ * Derives mppe-keys from mangled data + * @link http://php.net/manual/en/function.radius-demangle-mppe-key.php + * @param resource $radius_handle + * @param string $mangled + * @return string the demangled string, or false on error. + * @jms-builtin + */ +function radius_demangle_mppe_key ($radius_handle, $mangled) {} + + +/** + * Authentication Request + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCESS_REQUEST', 1); + +/** + * Access accepted + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCESS_ACCEPT', 2); + +/** + * Access rejected + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCESS_REJECT', 3); + +/** + * Accounting request + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCOUNTING_REQUEST', 4); + +/** + * Accounting response + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCOUNTING_RESPONSE', 5); + +/** + * Accsess challenge + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCESS_CHALLENGE', 11); + +/** + * Username + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_USER_NAME', 1); + +/** + * Password + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_USER_PASSWORD', 2); + +/** + * Chap Password: chappass = md5(ident + plaintextpass + challenge) + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_CHAP_PASSWORD', 3); + +/** + * NAS IP-Adress + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_NAS_IP_ADDRESS', 4); + +/** + * NAS Port + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_NAS_PORT', 5); + +/** + *

+ * Type of Service, one of: + * RADIUS_LOGIN + * RADIUS_FRAMED + * RADIUS_CALLBACK_LOGIN + * RADIUS_CALLBACK_FRAMED + * RADIUS_OUTBOUND + * RADIUS_ADMINISTRATIVE + * RADIUS_NAS_PROMPT + * RADIUS_AUTHENTICATE_ONLY + * RADIUS_CALLBACK_NAS_PROMPT + *

+ * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_SERVICE_TYPE', 6); +define ('RADIUS_LOGIN', 1); +define ('RADIUS_FRAMED', 2); +define ('RADIUS_CALLBACK_LOGIN', 3); +define ('RADIUS_CALLBACK_FRAMED', 4); +define ('RADIUS_OUTBOUND', 5); +define ('RADIUS_ADMINISTRATIVE', 6); +define ('RADIUS_NAS_PROMPT', 7); +define ('RADIUS_AUTHENTICATE_ONLY', 8); +define ('RADIUS_CALLBACK_NAS_PROMPT', 9); + +/** + *

+ * Framed Protocol, one of: + * RADIUS_PPP + * RADIUS_SLIP + * RADIUS_ARAP + * RADIUS_GANDALF + * RADIUS_XYLOGICS + *

+ * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_PROTOCOL', 7); +define ('RADIUS_PPP', 1); +define ('RADIUS_SLIP', 2); +define ('RADIUS_ARAP', 3); +define ('RADIUS_GANDALF', 4); +define ('RADIUS_XYLOGICS', 5); + +/** + * IP-Address + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_IP_ADDRESS', 8); + +/** + * Netmask + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_IP_NETMASK', 9); + +/** + * Routing + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_ROUTING', 10); + +/** + * Filter ID + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FILTER_ID', 11); + +/** + * MTU + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_MTU', 12); + +/** + *

+ * Compression, one of: + * RADIUS_COMP_NONE + * RADIUS_COMP_VJ + * RADIUS_COMP_IPXHDR + *

+ * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_COMPRESSION', 13); +define ('RADIUS_COMP_NONE', 0); +define ('RADIUS_COMP_VJ', 1); +define ('RADIUS_COMP_IPXHDR', 2); + +/** + * Login IP Host + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_LOGIN_IP_HOST', 14); + +/** + * Login Service + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_LOGIN_SERVICE', 15); + +/** + * Login TCP Port + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_LOGIN_TCP_PORT', 16); + +/** + * Reply Message + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_REPLY_MESSAGE', 18); + +/** + * Callback Number + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_CALLBACK_NUMBER', 19); + +/** + * Callback ID + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_CALLBACK_ID', 20); + +/** + * Framed Route + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_ROUTE', 22); + +/** + * Framed IPX Network + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_IPX_NETWORK', 23); + +/** + * State + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_STATE', 24); + +/** + * Class + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_CLASS', 25); + +/** + * Vendor specific attribute + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_VENDOR_SPECIFIC', 26); + +/** + * Session timeout + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_SESSION_TIMEOUT', 27); + +/** + * Idle timeout + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_IDLE_TIMEOUT', 28); + +/** + * Termination action + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_TERMINATION_ACTION', 29); + +/** + * Called Station Id + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_CALLED_STATION_ID', 30); + +/** + * Calling Station Id + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_CALLING_STATION_ID', 31); + +/** + * NAS ID + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_NAS_IDENTIFIER', 32); + +/** + * Proxy State + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_PROXY_STATE', 33); + +/** + * Login LAT Service + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_LOGIN_LAT_SERVICE', 34); + +/** + * Login LAT Node + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_LOGIN_LAT_NODE', 35); + +/** + * Login LAT Group + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_LOGIN_LAT_GROUP', 36); + +/** + * Framed Appletalk Link + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_APPLETALK_LINK', 37); + +/** + * Framed Appletalk Network + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_APPLETALK_NETWORK', 38); + +/** + * Framed Appletalk Zone + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_FRAMED_APPLETALK_ZONE', 39); + +/** + * Challenge + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_CHAP_CHALLENGE', 60); + +/** + *

+ * NAS port type, one of: + * RADIUS_ASYNC + * RADIUS_SYNC + * RADIUS_ISDN_SYNC + * RADIUS_ISDN_ASYNC_V120 + * RADIUS_ISDN_ASYNC_V110 + * RADIUS_VIRTUAL + * RADIUS_PIAFS + * RADIUS_HDLC_CLEAR_CHANNEL + * RADIUS_X_25 + * RADIUS_X_75 + * RADIUS_G_3_FAX + * RADIUS_SDSL + * RADIUS_ADSL_CAP + * RADIUS_ADSL_DMT + * RADIUS_IDSL + * RADIUS_ETHERNET + * RADIUS_XDSL + * RADIUS_CABLE + * RADIUS_WIRELESS_OTHER + * RADIUS_WIRELESS_IEEE_802_11 + *

+ * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_NAS_PORT_TYPE', 61); +define ('RADIUS_ASYNC', 0); +define ('RADIUS_SYNC', 1); +define ('RADIUS_ISDN_SYNC', 2); +define ('RADIUS_ISDN_ASYNC_V120', 3); +define ('RADIUS_ISDN_ASYNC_V110', 4); +define ('RADIUS_VIRTUAL', 5); +define ('RADIUS_PIAFS', 6); +define ('RADIUS_HDLC_CLEAR_CHANNEL', 7); +define ('RADIUS_X_25', 8); +define ('RADIUS_X_75', 9); +define ('RADIUS_G_3_FAX', 10); +define ('RADIUS_SDSL', 11); +define ('RADIUS_ADSL_CAP', 12); +define ('RADIUS_ADSL_DMT', 13); +define ('RADIUS_IDSL', 14); +define ('RADIUS_ETHERNET', 15); +define ('RADIUS_XDSL', 16); +define ('RADIUS_CABLE', 17); +define ('RADIUS_WIRELESS_OTHER', 18); +define ('RADIUS_WIRELESS_IEEE_802_11', 19); + +/** + * Port Limit + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_PORT_LIMIT', 62); + +/** + * Login LAT Port + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_LOGIN_LAT_PORT', 63); + +/** + * Connect info + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_CONNECT_INFO', 77); +define ('RADIUS_NAS_IPV6_ADDRESS', 95); +define ('RADIUS_FRAMED_INTERFACE_ID', 96); +define ('RADIUS_FRAMED_IPV6_PREFIX', 97); +define ('RADIUS_LOGIN_IPV6_HOST', 98); +define ('RADIUS_FRAMED_IPV6_ROUTE', 99); +define ('RADIUS_FRAMED_IPV6_POOL', 100); + +/** + *

+ * Accounting status type, one of: + * RADIUS_START + * RADIUS_STOP + * RADIUS_ACCOUNTING_ON + * RADIUS_ACCOUNTING_OFF + *

+ * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_STATUS_TYPE', 40); +define ('RADIUS_START', 1); +define ('RADIUS_STOP', 2); +define ('RADIUS_ACCOUNTING_ON', 7); +define ('RADIUS_ACCOUNTING_OFF', 8); + +/** + * Accounting delay time + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_DELAY_TIME', 41); + +/** + * Accounting input bytes + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_INPUT_OCTETS', 42); + +/** + * Accounting output bytes + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_OUTPUT_OCTETS', 43); + +/** + * Accounting session ID + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_SESSION_ID', 44); + +/** + *

+ * Accounting authentic, one of: + * RADIUS_AUTH_RADIUS + * RADIUS_AUTH_LOCAL + * RADIUS_AUTH_REMOTE + *

+ * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_AUTHENTIC', 45); +define ('RADIUS_AUTH_RADIUS', 1); +define ('RADIUS_AUTH_LOCAL', 2); +define ('RADIUS_AUTH_REMOTE', 3); + +/** + * Accounting session time + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_SESSION_TIME', 46); + +/** + * Accounting input packets + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_INPUT_PACKETS', 47); + +/** + * Accounting output packets + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_OUTPUT_PACKETS', 48); + +/** + *

+ * Accounting terminate cause, one of: + * RADIUS_TERM_USER_REQUEST + * RADIUS_TERM_LOST_CARRIER + * RADIUS_TERM_LOST_SERVICE + * RADIUS_TERM_IDLE_TIMEOUT + * RADIUS_TERM_SESSION_TIMEOUT + * RADIUS_TERM_ADMIN_RESET + * RADIUS_TERM_ADMIN_REBOOT + * RADIUS_TERM_PORT_ERROR + * RADIUS_TERM_NAS_ERROR + * RADIUS_TERM_NAS_REQUEST + * RADIUS_TERM_NAS_REBOOT + * RADIUS_TERM_PORT_UNNEEDED + * RADIUS_TERM_PORT_PREEMPTED + * RADIUS_TERM_PORT_SUSPENDED + * RADIUS_TERM_SERVICE_UNAVAILABLE + * RADIUS_TERM_CALLBACK + * RADIUS_TERM_USER_ERROR + * RADIUS_TERM_HOST_REQUEST + *

+ * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_TERMINATE_CAUSE', 49); +define ('RADIUS_TERM_USER_REQUEST', 1); +define ('RADIUS_TERM_LOST_CARRIER', 2); +define ('RADIUS_TERM_LOST_SERVICE', 3); +define ('RADIUS_TERM_IDLE_TIMEOUT', 4); +define ('RADIUS_TERM_SESSION_TIMEOUT', 5); +define ('RADIUS_TERM_ADMIN_RESET', 6); +define ('RADIUS_TERM_ADMIN_REBOOT', 7); +define ('RADIUS_TERM_PORT_ERROR', 8); +define ('RADIUS_TERM_NAS_ERROR', 9); +define ('RADIUS_TERM_NAS_REQUEST', 10); +define ('RADIUS_TERM_NAS_REBOOT', 11); +define ('RADIUS_TERM_PORT_UNNEEDED', 12); +define ('RADIUS_TERM_PORT_PREEMPTED', 13); +define ('RADIUS_TERM_PORT_SUSPENDED', 14); +define ('RADIUS_TERM_SERVICE_UNAVAILABLE', 15); +define ('RADIUS_TERM_CALLBACK', 16); +define ('RADIUS_TERM_USER_ERROR', 17); +define ('RADIUS_TERM_HOST_REQUEST', 18); + +/** + * Accounting multi session ID + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_MULTI_SESSION_ID', 50); + +/** + * Accounting link count + * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_ACCT_LINK_COUNT', 51); + +/** + *

+ * Microsoft specific vendor attributes (RFC 2548), one of: + * RADIUS_MICROSOFT_MS_CHAP_RESPONSE + * RADIUS_MICROSOFT_MS_CHAP_ERROR + * RADIUS_MICROSOFT_MS_CHAP_PW_1 + * RADIUS_MICROSOFT_MS_CHAP_PW_2 + * RADIUS_MICROSOFT_MS_CHAP_LM_ENC_PW + * RADIUS_MICROSOFT_MS_CHAP_NT_ENC_PW + * RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICY + * RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES + * RADIUS_MICROSOFT_MS_RAS_VENDOR + * RADIUS_MICROSOFT_MS_CHAP_DOMAIN + * RADIUS_MICROSOFT_MS_CHAP_CHALLENGE + * RADIUS_MICROSOFT_MS_CHAP_MPPE_KEYS + * RADIUS_MICROSOFT_MS_BAP_USAGE + * RADIUS_MICROSOFT_MS_LINK_UTILIZATION_THRESHOLD + * RADIUS_MICROSOFT_MS_LINK_DROP_TIME_LIMIT + * RADIUS_MICROSOFT_MS_MPPE_SEND_KEY + * RADIUS_MICROSOFT_MS_MPPE_RECV_KEY + * RADIUS_MICROSOFT_MS_RAS_VERSION + * RADIUS_MICROSOFT_MS_OLD_ARAP_PASSWORD + * RADIUS_MICROSOFT_MS_NEW_ARAP_PASSWORD + * RADIUS_MICROSOFT_MS_ARAP_PASSWORD_CHANGE_REASON + * RADIUS_MICROSOFT_MS_FILTER + * RADIUS_MICROSOFT_MS_ACCT_AUTH_TYPE + * RADIUS_MICROSOFT_MS_ACCT_EAP_TYPE + * RADIUS_MICROSOFT_MS_CHAP2_RESPONSE + * RADIUS_MICROSOFT_MS_CHAP2_SUCCESS + * RADIUS_MICROSOFT_MS_CHAP2_PW + * RADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVER + * RADIUS_MICROSOFT_MS_SECONDARY_DNS_SERVER + * RADIUS_MICROSOFT_MS_PRIMARY_NBNS_SERVER + * RADIUS_MICROSOFT_MS_SECONDARY_NBNS_SERVER + * RADIUS_MICROSOFT_MS_ARAP_CHALLENGE + *

+ * @link http://php.net/manual/en/radius.constants.php + */ +define ('RADIUS_VENDOR_MICROSOFT', 311); +define ('RADIUS_MICROSOFT_MS_CHAP_RESPONSE', 1); +define ('RADIUS_MICROSOFT_MS_CHAP_ERROR', 2); +define ('RADIUS_MICROSOFT_MS_CHAP_PW_1', 3); +define ('RADIUS_MICROSOFT_MS_CHAP_PW_2', 4); +define ('RADIUS_MICROSOFT_MS_CHAP_LM_ENC_PW', 5); +define ('RADIUS_MICROSOFT_MS_CHAP_NT_ENC_PW', 6); +define ('RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICY', 7); +define ('RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES', 8); +define ('RADIUS_MICROSOFT_MS_RAS_VENDOR', 9); +define ('RADIUS_MICROSOFT_MS_CHAP_DOMAIN', 10); +define ('RADIUS_MICROSOFT_MS_CHAP_CHALLENGE', 11); +define ('RADIUS_MICROSOFT_MS_CHAP_MPPE_KEYS', 12); +define ('RADIUS_MICROSOFT_MS_BAP_USAGE', 13); +define ('RADIUS_MICROSOFT_MS_LINK_UTILIZATION_THRESHOLD', 14); +define ('RADIUS_MICROSOFT_MS_LINK_DROP_TIME_LIMIT', 15); +define ('RADIUS_MICROSOFT_MS_MPPE_SEND_KEY', 16); +define ('RADIUS_MICROSOFT_MS_MPPE_RECV_KEY', 17); +define ('RADIUS_MICROSOFT_MS_RAS_VERSION', 18); +define ('RADIUS_MICROSOFT_MS_OLD_ARAP_PASSWORD', 19); +define ('RADIUS_MICROSOFT_MS_NEW_ARAP_PASSWORD', 20); +define ('RADIUS_MICROSOFT_MS_ARAP_PASSWORD_CHANGE_REASON', 21); +define ('RADIUS_MICROSOFT_MS_FILTER', 22); +define ('RADIUS_MICROSOFT_MS_ACCT_AUTH_TYPE', 23); +define ('RADIUS_MICROSOFT_MS_ACCT_EAP_TYPE', 24); +define ('RADIUS_MICROSOFT_MS_CHAP2_RESPONSE', 25); +define ('RADIUS_MICROSOFT_MS_CHAP2_SUCCESS', 26); +define ('RADIUS_MICROSOFT_MS_CHAP2_PW', 27); +define ('RADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVER', 28); +define ('RADIUS_MICROSOFT_MS_SECONDARY_DNS_SERVER', 29); +define ('RADIUS_MICROSOFT_MS_PRIMARY_NBNS_SERVER', 30); +define ('RADIUS_MICROSOFT_MS_SECONDARY_NBNS_SERVER', 31); +define ('RADIUS_MICROSOFT_MS_ARAP_CHALLENGE', 33); +define ('RADIUS_MPPE_KEY_LEN', 16); + +// End of radius v.1.2.4 +?> diff --git a/res/php-5.4-core-api/readline.php b/res/php-5.4-core-api/readline.php new file mode 100644 index 0000000..5ce85d0 --- /dev/null +++ b/res/php-5.4-core-api/readline.php @@ -0,0 +1,164 @@ + + * Reads a line + * @link http://php.net/manual/en/function.readline.php + * @param string $prompt [optional]

+ * You may specify a string with which to prompt the user. + *

+ * @return string a single string from the user. The line returned has the ending + * newline removed. + * @jms-builtin + */ +function readline ($prompt = null) {} + +/** + * (PHP 4, PHP 5)
+ * Gets/sets various internal readline variables + * @link http://php.net/manual/en/function.readline-info.php + * @param string $varname [optional]

+ * A variable name. + *

+ * @param string $newvalue [optional]

+ * If provided, this will be the new value of the setting. + *

+ * @return mixed If called with no parameters, this function returns an array of + * values for all the setting readline uses. The elements will + * be indexed by the following values: done, end, erase_empty_line, + * library_version, line_buffer, mark, pending_input, point, prompt, + * readline_name, and terminal_name. + *

+ *

+ * If called with one or two parameters, the old value is returned. + * @jms-builtin + */ +function readline_info ($varname = null, $newvalue = null) {} + +/** + * (PHP 4, PHP 5)
+ * Adds a line to the history + * @link http://php.net/manual/en/function.readline-add-history.php + * @param string $line

+ * The line to be added in the history. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function readline_add_history ($line) {} + +/** + * (PHP 4, PHP 5)
+ * Clears the history + * @link http://php.net/manual/en/function.readline-clear-history.php + * @return bool true on success or false on failure. + * @jms-builtin + */ +function readline_clear_history () {} + +/** + * (PHP 4, PHP 5)
+ * Lists the history + * @link http://php.net/manual/en/function.readline-list-history.php + * @return array an array of the entire command line history. The elements are + * indexed by integers starting at zero. + * @jms-builtin + */ +function readline_list_history () {} + +/** + * (PHP 4, PHP 5)
+ * Reads the history + * @link http://php.net/manual/en/function.readline-read-history.php + * @param string $filename [optional]

+ * Path to the filename containing the command history. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function readline_read_history ($filename = null) {} + +/** + * (PHP 4, PHP 5)
+ * Writes the history + * @link http://php.net/manual/en/function.readline-write-history.php + * @param string $filename [optional]

+ * Path to the saved file. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function readline_write_history ($filename = null) {} + +/** + * (PHP 4, PHP 5)
+ * Registers a completion function + * @link http://php.net/manual/en/function.readline-completion-function.php + * @param callable $function

+ * You must supply the name of an existing function which accepts a + * partial command line and returns an array of possible matches. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function readline_completion_function (callable $function) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Initializes the readline callback interface and terminal, prints the prompt and returns immediately + * @link http://php.net/manual/en/function.readline-callback-handler-install.php + * @param string $prompt

+ * The prompt message. + *

+ * @param callable $callback

+ * The callback function takes one parameter; the + * user input returned. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function readline_callback_handler_install ($prompt, callable $callback) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Reads a character and informs the readline callback interface when a line is received + * @link http://php.net/manual/en/function.readline-callback-read-char.php + * @return void + * @jms-builtin + */ +function readline_callback_read_char () {} + +/** + * (PHP 5 >= 5.1.0)
+ * Removes a previously installed callback handler and restores terminal settings + * @link http://php.net/manual/en/function.readline-callback-handler-remove.php + * @return bool true if a previously installed callback handler was removed, or + * false if one could not be found. + * @jms-builtin + */ +function readline_callback_handler_remove () {} + +/** + * (PHP 5 >= 5.1.0)
+ * Redraws the display + * @link http://php.net/manual/en/function.readline-redisplay.php + * @return void + * @jms-builtin + */ +function readline_redisplay () {} + +/** + * (PHP 5 >= 5.1.0)
+ * Inform readline that the cursor has moved to a new line + * @link http://php.net/manual/en/function.readline-on-new-line.php + * @return void + * @jms-builtin + */ +function readline_on_new_line () {} + +define ('READLINE_LIB', "readline"); + +// End of readline v.5.4.3-1~dotdeb.0 +?> diff --git a/res/php-5.4-core-api/recode.php b/res/php-5.4-core-api/recode.php new file mode 100644 index 0000000..9353b74 --- /dev/null +++ b/res/php-5.4-core-api/recode.php @@ -0,0 +1,52 @@ + + * Recode a string according to a recode request + * @link http://php.net/manual/en/function.recode-string.php + * @param string $request

+ * The desired recode request type + *

+ * @param string $string

+ * The string to be recoded + *

+ * @return string the recoded string or false, if unable to + * perform the recode request. + * @jms-builtin + */ +function recode_string ($request, $string) {} + +/** + * (PHP 4, PHP 5)
+ * Recode from file to file according to recode request + * @link http://php.net/manual/en/function.recode-file.php + * @param string $request

+ * The desired recode request type + *

+ * @param resource $input

+ * A local file handle resource for + * the input + *

+ * @param resource $output

+ * A local file handle resource for + * the output + *

+ * @return bool false, if unable to comply, true otherwise. + * @jms-builtin + */ +function recode_file ($request, $input, $output) {} + +/** + * (PHP 4, PHP 5)
+ * &Alias; recode_string + * @link http://php.net/manual/en/function.recode.php + * @param $request + * @param $str + * @jms-builtin + */ +function recode ($request, $str) {} + +// End of recode v. +?> diff --git a/res/php-5.4-core-api/removed.php b/res/php-5.4-core-api/removed.php new file mode 100644 index 0000000..656606d --- /dev/null +++ b/res/php-5.4-core-api/removed.php @@ -0,0 +1,81 @@ + + * Convert character encoding as output buffer handler + * @link http://php.net/manual/en/function.ob-iconv-handler.php + * @param string $contents + * @param int $status + * @return string See ob_start for information about this handler + * return values. + * @jms-builtin + */ +function ob_iconv_handler ($contents, $status) {} + +/** + * (PHP 5)
+ * ob_start callback function to repair the buffer + * @link http://php.net/manual/en/function.ob-tidyhandler.php + * @param string $input

+ * The buffer. + *

+ * @param int $mode [optional]

+ * The buffer mode. + *

+ * @return string the modified buffer. + * @jms-builtin + */ +function ob_tidyhandler ($input, $mode = null) {} + +/** + * (PHP 4, PHP 5 < 5.4.0)
+ * Register one or more global variables with the current session + * @link http://php.net/manual/en/function.session-register.php + * @param mixed $name

+ * A string holding the name of a variable or an array consisting of + * variable names or other arrays. + *

+ * @param mixed $_ [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function session_register ($name, $_ = null) {} + +/** + * (PHP 4, PHP 5 < 5.4.0)
+ * Unregister a global variable from the current session + * @link http://php.net/manual/en/function.session-unregister.php + * @param string $name

+ * The variable name. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function session_unregister ($name) {} + +/** + * (PHP 4, PHP 5 < 5.4.0)
+ * Find out whether a global variable is registered in a session + * @link http://php.net/manual/en/function.session-is-registered.php + * @param string $name

+ * The variable name. + *

+ * @return bool session_is_registered returns TRUE if there is a + * global variable with the name name registered in + * the current session, FALSE otherwise. + * @jms-builtin + */ +function session_is_registered ($name) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Change the root directory + * @link http://php.net/manual/en/function.chroot.php + * @param string $directory

+ * The path to change the root directory to. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function chroot ($directory) {} +?> diff --git a/res/php-5.4-core-api/session.php b/res/php-5.4-core-api/session.php new file mode 100644 index 0000000..c29874b --- /dev/null +++ b/res/php-5.4-core-api/session.php @@ -0,0 +1,519 @@ +SessionHandlerInterface is an + * interface which defines a + * prototype for creating a custom session handler. In order to pass a custom + * session handler to session_set_save_handler using its + * OOP invocation, the class must implement this interface. + * @link http://php.net/manual/en/class.sessionhandlerinterface.php + */ +interface SessionHandlerInterface { + + /** + * (PHP 5 >= 5.4.0)
+ * Initialize session + * @link http://php.net/manual/en/sessionhandlerinterface.open.php + * @param string $save_path

+ * The path where to store/retrieve the session. + *

+ * @param string $session_id

+ * The session id. + *

+ * @return bool The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing. + */ + abstract public function open ($save_path, $session_id); + + /** + * (PHP 5 >= 5.4.0)
+ * Close the session + * @link http://php.net/manual/en/sessionhandlerinterface.close.php + * @return bool The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing. + */ + abstract public function close (); + + /** + * (PHP 5 >= 5.4.0)
+ * Read session data + * @link http://php.net/manual/en/sessionhandlerinterface.read.php + * @param string $session_id

+ * The session id. + *

+ * @return string an encoded string of the read data. If nothing was read, it must return an empty string. Note this value is returned internally to PHP for processing. + */ + abstract public function read ($session_id); + + /** + * (PHP 5 >= 5.4.0)
+ * Write session data + * @link http://php.net/manual/en/sessionhandlerinterface.write.php + * @param string $session_id

+ * The session id. + *

+ * @param string $session_data

+ * The encoded session data. This data is the result of the PHP internally encoding the $_SESSION superglobal to a serialized + * string and passing it as this parameter. Please note sessions use an alternative serialization method. + *

+ * @return bool The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing. + */ + abstract public function write ($session_id, $session_data); + + /** + * (PHP 5 >= 5.4.0)
+ * Destroy a session + * @link http://php.net/manual/en/sessionhandlerinterface.destroy.php + * @param string $session_id

+ * The session ID being destroyed. + *

+ * @return bool The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing. + */ + abstract public function destroy ($session_id); + + /** + * (PHP 5 >= 5.4.0)
+ * Cleanup old sessions + * @link http://php.net/manual/en/sessionhandlerinterface.gc.php + * @param string $maxlifetime

+ * Sessions that have not updated for the last maxlifetime seconds will be removed. + *

+ * @return bool The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing. + */ + abstract public function gc ($maxlifetime); + +} + +/** + * SessionHandler a special class that can be used to expose + * the current internal PHP session save handler by inheritance. There are six methods which + * wrap the six internal session save handler callbacks (open, close, + * read, write, destroy and gc). + * By default, this class will wrap whatever internal save handler is set as as defined by the + * session.save_handler configuration directive which is usually + * files by default. + * Other internal session save handlers are provided by PHP extensions such as SQLite (as sqlite), + * Memcache (as memcache), and Memcached (as memcached). + * @link http://php.net/manual/en/class.sessionhandler.php + * @jms-builtin + */ +class SessionHandler implements SessionHandlerInterface { + + /** + * (PHP 5 >= 5.4.0)
+ * Initialize session + * @link http://php.net/manual/en/sessionhandler.open.php + * @param string $save_path

+ * The path where to store/retrieve the session. + *

+ * @param string $session_id

+ * The session id. + *

+ * @return bool The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing. + */ + public function open ($save_path, $session_id) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Close the session + * @link http://php.net/manual/en/sessionhandler.close.php + * @return bool The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing. + */ + public function close () {} + + /** + * (PHP 5 >= 5.4.0)
+ * Read session data + * @link http://php.net/manual/en/sessionhandler.read.php + * @param string $session_id

+ * The session id to read data for. + *

+ * @return string an encoded string of the read data. If nothing was read, it must return an empty string. Note this value is returned internally to PHP for processing. + */ + public function read ($session_id) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Write session data + * @link http://php.net/manual/en/sessionhandler.write.php + * @param string $session_id

+ * The session id. + *

+ * @param string $session_data

+ * The encoded session data. This data is the result of the PHP internally encoding the $_SESSION superglobal to a serialized + * string and passing it as this parameter. Please note sessions use an alternative serialization method. + *

+ * @return bool The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing. + */ + public function write ($session_id, $session_data) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Destroy a session + * @link http://php.net/manual/en/sessionhandler.destroy.php + * @param string $session_id

+ * The session ID being destroyed. + *

+ * @return bool The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing. + */ + public function destroy ($session_id) {} + + /** + * (PHP 5 >= 5.4.0)
+ * Cleanup old sessions + * @link http://php.net/manual/en/sessionhandler.gc.php + * @param int $maxlifetime

+ * Sessions that have not updated for the last maxlifetime seconds will be removed. + *

+ * @return bool The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing. + */ + public function gc ($maxlifetime) {} + +} + +/** + * (PHP 4, PHP 5)
+ * Get and/or set the current session name + * @link http://php.net/manual/en/function.session-name.php + * @param string $name [optional]

+ * The session name references the name of the session, which is + * used in cookies and URLs (e.g. PHPSESSID). It + * should contain only alphanumeric characters; it should be short and + * descriptive (i.e. for users with enabled cookie warnings). + * If name is specified, the name of the current + * session is changed to its value. + *

+ *

+ *

+ * The session name can't consist of digits only, at least one letter + * must be present. Otherwise a new session id is generated every time. + *

+ *

+ * @return string the name of the current session. + * @jms-builtin + */ +function session_name ($name = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get and/or set the current session module + * @link http://php.net/manual/en/function.session-module-name.php + * @param string $module [optional]

+ * If module is specified, that module will be + * used instead. + *

+ * @return string the name of the current session module. + * @jms-builtin + */ +function session_module_name ($module = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get and/or set the current session save path + * @link http://php.net/manual/en/function.session-save-path.php + * @param string $path [optional]

+ * Session data path. If specified, the path to which data is saved will + * be changed. session_save_path needs to be called + * before session_start for that purpose. + *

+ *

+ *

+ * On some operating systems, you may want to specify a path on a + * filesystem that handles lots of small files efficiently. For example, + * on Linux, reiserfs may provide better performance than ext2fs. + *

+ *

+ * @return string the path of the current directory used for data storage. + * @jms-builtin + */ +function session_save_path ($path = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get and/or set the current session id + * @link http://php.net/manual/en/function.session-id.php + * @param string $id [optional]

+ * If id is specified, it will replace the current + * session id. session_id needs to be called before + * session_start for that purpose. Depending on the + * session handler, not all characters are allowed within the session id. + * For example, the file session handler only allows characters in the + * range a-z A-Z 0-9 , (comma) and - (minus)! + *

+ * When using session cookies, specifying an id + * for session_id will always send a new cookie + * when session_start is called, regardless if the + * current session id is identical to the one being set. + * @return string session_id returns the session id for the current + * session or the empty string ("") if there is no current + * session (no current session id exists). + * @jms-builtin + */ +function session_id ($id = null) {} + +/** + * (PHP 4 >= 4.3.2, PHP 5)
+ * Update the current session id with a newly generated one + * @link http://php.net/manual/en/function.session-regenerate-id.php + * @param bool $delete_old_session [optional]

+ * Whether to delete the old associated session file or not. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function session_regenerate_id ($delete_old_session = false) {} + +/** + * (PHP 4, PHP 5)
+ * Decodes session data from a session encoded string + * @link http://php.net/manual/en/function.session-decode.php + * @param string $data

+ * The encoded data to be stored. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function session_decode ($data) {} + +/** + * (PHP 4, PHP 5)
+ * Encodes the current session data as a session encoded string + * @link http://php.net/manual/en/function.session-encode.php + * @return string the contents of the current session encoded. + * @jms-builtin + */ +function session_encode () {} + +/** + * (PHP 4, PHP 5)
+ * Start new or resume existing session + * @link http://php.net/manual/en/function.session-start.php + * @return bool This function returns TRUE if a session was successfully started, + * otherwise FALSE. + * @jms-builtin + */ +function session_start () {} + +/** + * (PHP 4, PHP 5)
+ * Destroys all data registered to a session + * @link http://php.net/manual/en/function.session-destroy.php + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function session_destroy () {} + +/** + * (PHP 4, PHP 5)
+ * Free all session variables + * @link http://php.net/manual/en/function.session-unset.php + * @return void No value is returned. + * @jms-builtin + */ +function session_unset () {} + +/** + * (PHP 4, PHP 5)
+ * Sets user-level session storage functions + * @link http://php.net/manual/en/function.session-set-save-handler.php + * @param callable $open + * @param callable $close + * @param callable $read + * @param callable $write + * @param callable $destroy + * @param callable $gc + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function session_set_save_handler (callable $open, callable $close, callable $read, callable $write, callable $destroy, callable $gc) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Get and/or set the current cache limiter + * @link http://php.net/manual/en/function.session-cache-limiter.php + * @param string $cache_limiter [optional]

+ * If cache_limiter is specified, the name of the + * current cache limiter is changed to the new value. + *

+ * + * Possible values + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ValueHeaders sent
public + *
+ * Expires: (sometime in the future, according session.cache_expire)
+ * Cache-Control: public, max-age=(sometime in the future, according to session.cache_expire)
+ * Last-Modified: (the timestamp of when the session was last saved)
+ * 
+ *
private_no_expire + *
+ * Cache-Control: private, max-age=(session.cache_expire in the future), pre-check=(session.cache_expire in the future)
+ * Last-Modified: (the timestamp of when the session was last saved)
+ * 
+ *
private + *
+ * Expires: Thu, 19 Nov 1981 08:52:00 GMT
+ * Cache-Control: private, max-age=(session.cache_expire in the future), pre-check=(session.cache_expire in the future)
+ * Last-Modified: (the timestamp of when the session was last saved)
+ * 
+ *
nocache + *
+ * Expires: Thu, 19 Nov 1981 08:52:00 GMT
+ * Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
+ * Pragma: no-cache
+ * 
+ *
+ * @return string the name of the current cache limiter. + * @jms-builtin + */ +function session_cache_limiter ($cache_limiter = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Return current cache expire + * @link http://php.net/manual/en/function.session-cache-expire.php + * @param string $new_cache_expire [optional]

+ * If new_cache_expire is given, the current cache + * expire is replaced with new_cache_expire. + *

+ *

+ * Setting new_cache_expire is of value only, if + * session.cache_limiter is set to a value + * different from nocache. + *

+ * @return int the current setting of session.cache_expire. + * The value returned should be read in minutes, defaults to 180. + * @jms-builtin + */ +function session_cache_expire ($new_cache_expire = null) {} + +/** + * (PHP 4, PHP 5)
+ * Set the session cookie parameters + * @link http://php.net/manual/en/function.session-set-cookie-params.php + * @param int $lifetime

+ * Lifetime of the + * session cookie, defined in seconds. + *

+ * @param string $path [optional]

+ * Path on the domain where + * the cookie will work. Use a single slash ('/') for all paths on the + * domain. + *

+ * @param string $domain [optional]

+ * Cookie domain, for + * example 'www.php.net'. To make cookies visible on all subdomains then + * the domain must be prefixed with a dot like '.php.net'. + *

+ * @param bool $secure [optional]

+ * If TRUE cookie will only be sent over + * secure connections. + *

+ * @param bool $httponly [optional]

+ * If set to TRUE then PHP will attempt to send the + * httponly + * flag when setting the session cookie. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function session_set_cookie_params ($lifetime, $path = null, $domain = null, $secure = false, $httponly = false) {} + +/** + * (PHP 4, PHP 5)
+ * Get the session cookie parameters + * @link http://php.net/manual/en/function.session-get-cookie-params.php + * @return array an array with the current session cookie information, the array + * contains the following items: + * "lifetime" - The + * lifetime of the cookie in seconds. + * "path" - The path where + * information is stored. + * "domain" - The domain + * of the cookie. + * "secure" - The cookie + * should only be sent over secure connections. + * "httponly" - The + * cookie can only be accessed through the HTTP protocol. + * @jms-builtin + */ +function session_get_cookie_params () {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Write session data and end session + * @link http://php.net/manual/en/function.session-write-close.php + * @return void No value is returned. + * @jms-builtin + */ +function session_write_close () {} + +/** + * (PHP >=5.4.0)
+ * Returns the current session status + * @link http://php.net/manual/en/function.session-status.php + * @return mixed PHP_SESSION_DISABLED if sessions are disabled. + * PHP_SESSION_NONE if sessions are enabled, but none exists. + * PHP_SESSION_ACTIVE if sessions are enabled, and one exists. + * @jms-builtin + */ +function session_status () {} + +/** + * (PHP >=5.4.0)
+ * Session shutdown function + * @link http://php.net/manual/en/function.session-register-shutdown.php + * @return void TRUE on success or FALSE on failure. + * @jms-builtin + */ +function session_register_shutdown () {} + +/** + * (PHP 4 >= 4.4.0, PHP 5)
+ * Alias of session_write_close + * @link http://php.net/manual/en/function.session-commit.php + * @jms-builtin + */ +function session_commit () {} + + +/** + * Since PHP 5.4.0. Return value of session_status if sessions are disabled. + * @link http://php.net/manual/en/session.constants.php + */ +define ('PHP_SESSION_DISABLED', 0); + +/** + * Since PHP 5.4.0. Return value of session_status if sessions are enabled, + * but no session exists. + * @link http://php.net/manual/en/session.constants.php + */ +define ('PHP_SESSION_NONE', 1); + +/** + * Since PHP 5.4.0. Return value of session_status if sessions are enabled, + * and a session exists. + * @link http://php.net/manual/en/session.constants.php + */ +define ('PHP_SESSION_ACTIVE', 2); + +// End of session v. +?> diff --git a/res/php-5.4-core-api/shmop.php b/res/php-5.4-core-api/shmop.php new file mode 100644 index 0000000..8441a8b --- /dev/null +++ b/res/php-5.4-core-api/shmop.php @@ -0,0 +1,114 @@ + + * Create or open shared memory block + * @link http://php.net/manual/en/function.shmop-open.php + * @param int $key

+ * System's id for the shared memory block. + * Can be passed as a decimal or hex. + *

+ * @param string $flags

+ * The flags that you can use: + * "a" for access (sets SHM_RDONLY for shmat) + * use this flag when you need to open an existing shared memory + * segment for read only + * @param int $mode

+ * The permissions that you wish to assign to your memory segment, those + * are the same as permission for a file. Permissions need to be passed + * in octal form, like for example 0644 + *

+ * @param int $size

+ * The size of the shared memory block you wish to create in bytes + *

+ * @return int On success shmop_open will return an id that you can + * use to access the shared memory segment you've created. FALSE is + * returned on failure. + * @jms-builtin + */ +function shmop_open ($key, $flags, $mode, $size) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Read data from shared memory block + * @link http://php.net/manual/en/function.shmop-read.php + * @param int $shmid

+ * The shared memory block identifier created by + * shmop_open + *

+ * @param int $start

+ * Offset from which to start reading + *

+ * @param int $count

+ * The number of bytes to read + *

+ * @return string the data or FALSE on failure. + * @jms-builtin + */ +function shmop_read ($shmid, $start, $count) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Close shared memory block + * @link http://php.net/manual/en/function.shmop-close.php + * @param int $shmid

+ * The shared memory block identifier created by + * shmop_open + *

+ * @return void No value is returned. + * @jms-builtin + */ +function shmop_close ($shmid) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Get size of shared memory block + * @link http://php.net/manual/en/function.shmop-size.php + * @param int $shmid

+ * The shared memory block identifier created by + * shmop_open + *

+ * @return int an int, which represents the number of bytes the shared memory + * block occupies. + * @jms-builtin + */ +function shmop_size ($shmid) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Write data into shared memory block + * @link http://php.net/manual/en/function.shmop-write.php + * @param int $shmid

+ * The shared memory block identifier created by + * shmop_open + *

+ * @param string $data

+ * A string to write into shared memory block + *

+ * @param int $offset

+ * Specifies where to start writing data inside the shared memory + * segment. + *

+ * @return int The size of the written data, or FALSE on + * failure. + * @jms-builtin + */ +function shmop_write ($shmid, $data, $offset) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Delete shared memory block + * @link http://php.net/manual/en/function.shmop-delete.php + * @param int $shmid

+ * The shared memory block identifier created by + * shmop_open + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function shmop_delete ($shmid) {} + +// End of shmop v. +?> diff --git a/res/php-5.4-core-api/snmp.php b/res/php-5.4-core-api/snmp.php new file mode 100644 index 0000000..fe0a7df --- /dev/null +++ b/res/php-5.4-core-api/snmp.php @@ -0,0 +1,656 @@ + + * Fetch an SNMP object + * @link http://php.net/manual/en/function.snmpget.php + * @param string $hostname

+ * The SNMP agent. + *

+ * @param string $community

+ * The read community. + *

+ * @param string $object_id

+ * The SNMP object. + *

+ * @param int $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param int $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return string SNMP object value on success or false on error. + * @jms-builtin + */ +function snmpget ($hostname, $community, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 5)
+ * Fetch the SNMP object which follows the given object id + * @link http://php.net/manual/en/function.snmpgetnext.php + * @param string $host

The hostname of the SNMP agent (server).

+ * @param string $community

The read community.

+ * @param string $object_id

The SNMP object id which precedes the wanted one.

+ * @param int $timeout [optional]

The number of microseconds until the first timeout.

+ * @param int $retries [optional]

The number of times to retry if timeouts occur.

+ * @return string SNMP object value on success or false on error. + * In case of an error, an E_WARNING message is shown. + * @jms-builtin + */ +function snmpgetnext ($host, $community, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch all the SNMP objects from an agent + * @link http://php.net/manual/en/function.snmpwalk.php + * @param string $hostname

+ * The SNMP agent (server). + *

+ * @param string $community

+ * The read community. + *

+ * @param string $object_id

+ * If null, object_id is taken as the root of + * the SNMP objects tree and all objects under that tree are returned as + * an array. + *

+ *

+ * If object_id is specified, all the SNMP objects + * below that object_id are returned. + *

+ * @param int $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param int $retries [optional]

The number of times to retry if timeouts occur.

+ * @return array an array of SNMP object values starting from the + * object_id as root or false on error. + * @jms-builtin + */ +function snmpwalk ($hostname, $community, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 4, PHP 5)
+ * Return all objects including their respective object ID within the specified one + * @link http://php.net/manual/en/function.snmprealwalk.php + * @param string $host

The hostname of the SNMP agent (server).

+ * @param string $community

The read community.

+ * @param string $object_id

The SNMP object id which precedes the wanted one.

+ * @param int $timeout [optional]

The number of microseconds until the first timeout.

+ * @param int $retries [optional]

The number of times to retry if timeouts occur.

+ * @return array an associative array of the SNMP object ids and their values on success or false on error. + * In case of an error, an E_WARNING message is shown. + * @jms-builtin + */ +function snmprealwalk ($host, $community, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 4, PHP 5)
+ * Query for a tree of information about a network entity + * @link http://php.net/manual/en/function.snmpwalkoid.php + * @param string $hostname

+ * The SNMP agent. + *

+ * @param string $community

+ * The read community. + *

+ * @param string $object_id

+ * If null, object_id is taken as the root of + * the SNMP objects tree and all objects under that tree are returned as + * an array. + *

+ *

+ * If object_id is specified, all the SNMP objects + * below that object_id are returned. + *

+ * @param int $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param int $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return array an associative array with object ids and their respective + * object value starting from the object_id + * as root or false on error. + * @jms-builtin + */ +function snmpwalkoid ($hostname, $community, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 4, PHP 5)
+ * Fetches the current value of the UCD library's quick_print setting + * @link http://php.net/manual/en/function.snmp-get-quick-print.php + * @param $d + * @return bool true if quick_print is on, false otherwise. + * @jms-builtin + */ +function snmp_get_quick_print ($d) {} + +/** + * (PHP 4, PHP 5)
+ * Set the value of quick_print within the UCD SNMP library + * @link http://php.net/manual/en/function.snmp-set-quick-print.php + * @param bool $quick_print + * @return bool + * @jms-builtin + */ +function snmp_set_quick_print ($quick_print) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Return all values that are enums with their enum value instead of the raw integer + * @link http://php.net/manual/en/function.snmp-set-enum-print.php + * @param int $enum_print

+ * As the value is interpreted as boolean by the Net-SNMP library, it can only be "0" or "1". + *

+ * @return bool + * @jms-builtin + */ +function snmp_set_enum_print ($enum_print) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Set the OID output format + * @link http://php.net/manual/en/function.snmp-set-oid-output-format.php + * @param int $oid_format [optional] + * OID .1.3.6.1.2.1.1.3.0 representation for various oid_format values + * + * + *
SNMP_OID_OUTPUT_FULL.iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.sysUpTimeInstance
SNMP_OID_OUTPUT_NUMERIC.1.3.6.1.2.1.1.3.0
+ *

Begining from PHP 5.4.0 four additional constants available: + * + * + * + * + * + *
SNMP_OID_OUTPUT_MODULEDISMAN-EVENT-MIB::sysUpTimeInstance
SNMP_OID_OUTPUT_SUFFIXsysUpTimeInstance
SNMP_OID_OUTPUT_UCDsystem.sysUpTime.sysUpTimeInstance
SNMP_OID_OUTPUT_NONEUndefined
+ *

+ * @return bool + * @jms-builtin + */ +function snmp_set_oid_output_format ($oid_format = 'SNMP_OID_OUTPUT_MODULE') {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Return all objects including their respective object id within the specified one + * @link http://php.net/manual/en/function.snmp-set-oid-numeric-print.php + * @param int $oid_format + * @return void + * @jms-builtin + */ +function snmp_set_oid_numeric_print ($oid_format) {} + +/** + * (PHP 4, PHP 5)
+ * Set the value of an SNMP object + * @link http://php.net/manual/en/function.snmpset.php + * @param string $host

+ * The hostname of the SNMP agent (server). + *

+ * @param string $community

+ * The write community. + *

+ * @param string $object_id

+ * The SNMP object id. + *

+ * @param string $type &snmp.set.type.values; + * &snmp.set.type.values.asn.mapping; + * &snmp.set.type.values.equal.note; + * &snmp.set.type.values.bitset.note; + * @param mixed $value

+ * The new value. + *

+ * @param int $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param int $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * If the SNMP host rejects the data type, an E_WARNING message like "Warning: Error in packet. Reason: (badValue) The value given has the wrong type or length." is shown. + * If an unknown or invalid OID is specified the warning probably reads "Could not add variable". + * @jms-builtin + */ +function snmpset ($host, $community, $object_id, $type, $value, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Fetch an SNMP object + * @link http://php.net/manual/en/function.snmp2-get.php + * @param string $host

+ * The SNMP agent. + *

+ * @param string $community

+ * The read community. + *

+ * @param string $object_id

+ * The SNMP object. + *

+ * @param string $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param string $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return string SNMP object value on success or false on error. + * @jms-builtin + */ +function snmp2_get ($host, $community, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP >= 5.2.0)
+ * Fetch the SNMP object which follows the given object id + * @link http://php.net/manual/en/function.snmp2-getnext.php + * @param string $host

+ * The hostname of the SNMP agent (server). + *

+ * @param string $community

+ * The read community. + *

+ * @param string $object_id

+ * The SNMP object id which precedes the wanted one. + *

+ * @param string $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param string $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return string SNMP object value on success or false on error. + * In case of an error, an E_WARNING message is shown. + * @jms-builtin + */ +function snmp2_getnext ($host, $community, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP >= 5.2.0)
+ * Fetch all the SNMP objects from an agent + * @link http://php.net/manual/en/function.snmp2-walk.php + * @param string $host

+ * The SNMP agent (server). + *

+ * @param string $community

+ * The read community. + *

+ * @param string $object_id

+ * If null, object_id is taken as the root of + * the SNMP objects tree and all objects under that tree are returned as + * an array. + *

+ *

+ * If object_id is specified, all the SNMP objects + * below that object_id are returned. + *

+ * @param string $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param string $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return array an array of SNMP object values starting from the + * object_id as root or false on error. + * @jms-builtin + */ +function snmp2_walk ($host, $community, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP >= 5.2.0)
+ * Return all objects including their respective object ID within the specified one + * @link http://php.net/manual/en/function.snmp2-real-walk.php + * @param string $host

+ * The hostname of the SNMP agent (server). + *

+ * @param string $community

+ * The read community. + *

+ * @param string $object_id

+ * The SNMP object id which precedes the wanted one. + *

+ * @param string $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param string $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return array an associative array of the SNMP object ids and their values on success or false on error. + * In case of an error, an E_WARNING message is shown. + * @jms-builtin + */ +function snmp2_real_walk ($host, $community, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP >= 5.2.0)
+ * Set the value of an SNMP object + * @link http://php.net/manual/en/function.snmp2-set.php + * @param string $host

+ * The hostname of the SNMP agent (server). + *

+ * @param string $community

+ * The write community. + *

+ * @param string $object_id

+ * The SNMP object id. + *

+ * @param string $type &snmp.set.type.values; + * &snmp.set.type.values.asn.mapping; + * &snmp.set.type.values.equal.note; + * &snmp.set.type.values.bitset.note; + * @param string $value

+ * The new value. + *

+ * @param string $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param string $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * If the SNMP host rejects the data type, an E_WARNING message like "Warning: Error in packet. Reason: (badValue) The value given has the wrong type or length." is shown. + * If an unknown or invalid OID is specified the warning probably reads "Could not add variable". + * @jms-builtin + */ +function snmp2_set ($host, $community, $object_id, $type, $value, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch an SNMP object + * @link http://php.net/manual/en/function.snmp3-get.php + * @param string $host

+ * The hostname of the SNMP agent (server). + *

+ * @param string $sec_name

+ * the security name, usually some kind of username + *

+ * @param string $sec_level

+ * the security level (noAuthNoPriv|authNoPriv|authPriv) + *

+ * @param string $auth_protocol

+ * the authentication protocol (MD5 or SHA) + *

+ * @param string $auth_passphrase

+ * the authentication pass phrase + *

+ * @param string $priv_protocol

+ * the privacy protocol (DES or AES) + *

+ * @param string $priv_passphrase

+ * the privacy pass phrase + *

+ * @param string $object_id

+ * The SNMP object id. + *

+ * @param string $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param string $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return string SNMP object value on success or false on error. + * @jms-builtin + */ +function snmp3_get ($host, $sec_name, $sec_level, $auth_protocol, $auth_passphrase, $priv_protocol, $priv_passphrase, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 5)
+ * Fetch the SNMP object which follows the given object id + * @link http://php.net/manual/en/function.snmp3-getnext.php + * @param string $host

+ * The hostname of the + * SNMP agent (server). + *

+ * @param string $sec_name

+ * the security name, usually some kind of username + *

+ * @param string $sec_level

+ * the security level (noAuthNoPriv|authNoPriv|authPriv) + *

+ * @param string $auth_protocol

+ * the authentication protocol (MD5 or SHA) + *

+ * @param string $auth_passphrase

+ * the authentication pass phrase + *

+ * @param string $priv_protocol

+ * the privacy protocol (DES or AES) + *

+ * @param string $priv_passphrase

+ * the privacy pass phrase + *

+ * @param string $object_id

+ * The SNMP object id. + *

+ * @param string $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param string $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return string SNMP object value on success or false on error. + * In case of an error, an E_WARNING message is shown. + * @jms-builtin + */ +function snmp3_getnext ($host, $sec_name, $sec_level, $auth_protocol, $auth_passphrase, $priv_protocol, $priv_passphrase, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch all the SNMP objects from an agent + * @link http://php.net/manual/en/function.snmp3-walk.php + * @param string $host

+ * The hostname of the SNMP agent (server). + *

+ * @param string $sec_name

+ * the security name, usually some kind of username + *

+ * @param string $sec_level

+ * the security level (noAuthNoPriv|authNoPriv|authPriv) + *

+ * @param string $auth_protocol

+ * the authentication protocol (MD5 or SHA) + *

+ * @param string $auth_passphrase

+ * the authentication pass phrase + *

+ * @param string $priv_protocol

+ * the privacy protocol (DES or AES) + *

+ * @param string $priv_passphrase

+ * the privacy pass phrase + *

+ * @param string $object_id

+ * If null, object_id is taken as the root of + * the SNMP objects tree and all objects under that tree are returned as + * an array. + *

+ *

+ * If object_id is specified, all the SNMP objects + * below that object_id are returned. + *

+ * @param string $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param string $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return array an array of SNMP object values starting from the + * object_id as root or false on error. + * @jms-builtin + */ +function snmp3_walk ($host, $sec_name, $sec_level, $auth_protocol, $auth_passphrase, $priv_protocol, $priv_passphrase, $object_id, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 4, PHP 5)
+ * Return all objects including their respective object ID within the specified one + * @link http://php.net/manual/en/function.snmp3-real-walk.php + * @param string $host

+ * The hostname of the + * SNMP agent (server). + *

+ * @param string $sec_name

+ * the security name, usually some kind of username + *

+ * @param string $sec_level

+ * the security level (noAuthNoPriv|authNoPriv|authPriv) + *

+ * @param string $auth_protocol

+ * the authentication protocol (MD5 or SHA) + *

+ * @param string $auth_passphrase

+ * the authentication pass phrase + *

+ * @param string $priv_protocol

+ * the privacy protocol (DES or AES) + *

+ * @param string $priv_passphrase

+ * the privacy pass phrase + *

+ * @param string $object_id

+ * The SNMP object id. + *

+ * @param string $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param string $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return array an associative array of the + * SNMP object ids and their values on success or false on error. + * In case of an error, an E_WARNING message is shown. + * @jms-builtin + */ +function snmp3_real_walk ($host, $sec_name, $sec_level, $auth_protocol, $auth_passphrase, $priv_protocol, $priv_passphrase, $object_id, $timeout = null, $retries = null) {} + +/** + * (PHP 4, PHP 5)
+ * Set the value of an SNMP object + * @link http://php.net/manual/en/function.snmp3-set.php + * @param string $host

+ * The hostname of the SNMP agent (server). + *

+ * @param string $sec_name

+ * the security name, usually some kind of username + *

+ * @param string $sec_level

+ * the security level (noAuthNoPriv|authNoPriv|authPriv) + *

+ * @param string $auth_protocol

+ * the authentication protocol (MD5 or SHA) + *

+ * @param string $auth_passphrase

+ * the authentication pass phrase + *

+ * @param string $priv_protocol

+ * the privacy protocol (DES or AES) + *

+ * @param string $priv_passphrase

+ * the privacy pass phrase + *

+ * @param string $object_id

+ * The SNMP object id. + *

+ * @param string $type &snmp.set.type.values; + * &snmp.set.type.values.asn.mapping; + * &snmp.set.type.values.equal.note; + * &snmp.set.type.values.bitset.note; + * @param string $value

+ * The new value + *

+ * @param int $timeout [optional]

+ * The number of microseconds until the first timeout. + *

+ * @param int $retries [optional]

+ * The number of times to retry if timeouts occur. + *

+ * @return bool Returns true on success or false on failure. + *

+ *

+ * If the SNMP host rejects the data type, an E_WARNING message like "Warning: Error in packet. Reason: (badValue) The value given has the wrong type or length." is shown. + * If an unknown or invalid OID is specified the warning probably reads "Could not add variable". + * @jms-builtin + */ +function snmp3_set ($host, $sec_name, $sec_level, $auth_protocol, $auth_passphrase, $priv_protocol, $priv_passphrase, $object_id, $type, $value, $timeout = 1000000, $retries = 5) {} + +/** + * (PHP 4 >= 4.3.3, PHP 5)
+ * Specify the method how the SNMP values will be returned + * @link http://php.net/manual/en/function.snmp-set-valueretrieval.php + * @param int $method + * types + * + * + * + * + * + * + * + * + * + * + * + * + *
SNMP_VALUE_LIBRARYThe return values will be as returned by the Net-SNMP library.
SNMP_VALUE_PLAINThe return values will be the plain value without the SNMP type hint.
SNMP_VALUE_OBJECT + * The return values will be objects with the properties "value" and "type", where the latter + * is one of the SNMP_OCTET_STR, SNMP_COUNTER etc. constants. The + * way "value" is returned is based on which one of constants + * SNMP_VALUE_LIBRARY, SNMP_VALUE_PLAIN is set. + *
+ * @return bool + * @jms-builtin + */ +function snmp_set_valueretrieval ($method) {} + +/** + * (PHP 4 >= 4.3.3, PHP 5)
+ * Return the method how the SNMP values will be returned + * @link http://php.net/manual/en/function.snmp-get-valueretrieval.php + * @return int OR-ed combitantion of constants ( SNMP_VALUE_LIBRARY or + * SNMP_VALUE_PLAIN ) with + * possible SNMP_VALUE_OBJECT set. + * @jms-builtin + */ +function snmp_get_valueretrieval () {} + +/** + * (PHP 5)
+ * Reads and parses a MIB file into the active MIB tree + * @link http://php.net/manual/en/function.snmp-read-mib.php + * @param string $filename

The filename of the MIB.

+ * @return bool + * @jms-builtin + */ +function snmp_read_mib ($filename) {} + + +/** + * As of 5.2.0 + * @link http://php.net/manual/en/snmp.constants.php + */ +define ('SNMP_OID_OUTPUT_FULL', 3); + +/** + * As of 5.2.0 + * @link http://php.net/manual/en/snmp.constants.php + */ +define ('SNMP_OID_OUTPUT_NUMERIC', 4); +define ('SNMP_VALUE_LIBRARY', 0); +define ('SNMP_VALUE_PLAIN', 1); +define ('SNMP_VALUE_OBJECT', 2); +define ('SNMP_BIT_STR', 3); +define ('SNMP_OCTET_STR', 4); +define ('SNMP_OPAQUE', 68); +define ('SNMP_NULL', 5); +define ('SNMP_OBJECT_ID', 6); +define ('SNMP_IPADDRESS', 64); +define ('SNMP_COUNTER', 66); +define ('SNMP_UNSIGNED', 66); +define ('SNMP_TIMETICKS', 67); +define ('SNMP_UINTEGER', 71); +define ('SNMP_INTEGER', 2); +define ('SNMP_COUNTER64', 70); + +// End of snmp v. +?> diff --git a/res/php-5.4-core-api/soap.php b/res/php-5.4-core-api/soap.php new file mode 100644 index 0000000..9358bc2 --- /dev/null +++ b/res/php-5.4-core-api/soap.php @@ -0,0 +1,789 @@ + + * SoapClient constructor + * @link http://php.net/manual/en/soapclient.soapclient.php + * @param mixed $wsdl

+ * URI of the WSDL file or NULL if working in + * non-WSDL mode. + *

+ *

+ * During development, WSDL caching may be disabled by the + * use of the soap.wsdl_cache_ttl php.ini setting + * otherwise changes made to the WSDL file will have no effect until + * soap.wsdl_cache_ttl is expired. + *

+ * @param array $options [optional]

+ * An array of options. If working in WSDL mode, this parameter is optional. + * If working in non-WSDL mode, the location and + * uri options must be set, where location + * is the URL of the SOAP server to send the request to, and uri + * is the target namespace of the SOAP service. + *

+ *

+ * The style and use options only work in + * non-WSDL mode. In WSDL mode, they come from the WSDL file. + *

+ *

+ * The soap_version option specifies whether to use SOAP + * 1.1 (default), or SOAP 1.2 client. + *

+ *

+ * For HTTP authentication, the login and + * password options can be used to supply credentials. + * For making an HTTP connection through + * a proxy server, the options proxy_host, + * proxy_port, proxy_login + * and proxy_password are also available. + * For HTTPS client certificate authentication use + * local_cert and passphrase options. An + * authentication may be supplied in the authentication + * option. The authentication method may be either + * SOAP_AUTHENTICATION_BASIC (default) or + * SOAP_AUTHENTICATION_DIGEST. + *

+ *

+ * The compression option allows to use compression + * of HTTP SOAP requests and responses. + *

+ *

+ * The encoding option defines internal character + * encoding. This option does not change the encoding of SOAP requests (it is + * always utf-8), but converts strings into it. + *

+ *

+ * The trace option enables tracing of request so faults + * can be backtraced. This defaults to FALSE + *

+ *

+ * The classmap option can be used to map some WSDL + * types to PHP classes. This option must be an array with WSDL types + * as keys and names of PHP classes as values. + *

+ *

+ * Setting the boolean trace option enables use of the + * methods + * SoapClient->__getLastRequest, + * SoapClient->__getLastRequestHeaders, + * SoapClient->__getLastResponse and + * SoapClient->__getLastResponseHeaders. + *

+ *

+ * The exceptions option is a boolean value defining whether + * soap errors throw exceptions of type + * SoapFault. + *

+ *

+ * The connection_timeout option defines a timeout in seconds + * for the connection to the SOAP service. This option does not define a timeout + * for services with slow responses. To limit the time to wait for calls to finish the + * default_socket_timeout setting + * is available. + *

+ *

+ * The typemap option is an array of type mappings. + * Type mapping is an array with keys type_name, + * type_ns (namespace URI), from_xml + * (callback accepting one string parameter) and to_xml + * (callback accepting one object parameter). + *

+ *

+ * The cache_wsdl option is one of + * WSDL_CACHE_NONE, + * WSDL_CACHE_DISK, + * WSDL_CACHE_MEMORY or + * WSDL_CACHE_BOTH. + *

+ *

+ * The user_agent option specifies string to use in + * User-Agent header. + *

+ *

+ * The stream_context option is a resource + * for context. + *

+ *

+ * The features option is a bitmask of + * SOAP_SINGLE_ELEMENT_ARRAYS, + * SOAP_USE_XSI_ARRAY_TYPE, + * SOAP_WAIT_ONE_WAY_CALLS. + *

+ *

+ * The keep_alive option is a boolean value defining whether + * to send the Connection: Keep-Alive header or + * Connection: close . + *

+ */ + public function SoapClient ($wsdl, array $options = null) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Calls a SOAP function (deprecated) + * @link http://php.net/manual/en/soapclient.call.php + * @param string $function_name + * @param string $arguments + * @return mixed + */ + public function __call ($function_name, $arguments) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Calls a SOAP function + * @link http://php.net/manual/en/soapclient.soapcall.php + * @param string $function_name

+ * The name of the SOAP function to call. + *

+ * @param array $arguments

+ * An array of the arguments to pass to the function. This can be either + * an ordered or an associative array. + *

+ * @param array $options [optional]

+ * An associative array of options to pass to the client. + *

+ *

+ * The location option is the URL of the remote Web service. + *

+ *

+ * The uri option is the target namespace of the SOAP service. + *

+ *

+ * The soapaction option is the action to call. + *

+ * @param mixed $input_headers [optional]

+ * An array of headers to be sent along with the SOAP request. + *

+ * @param array $output_headers [optional]

+ * If supplied, this array will be filled with the headers from the SOAP response. + *

+ * @return mixed SOAP functions may return one, or multiple values. If only one value is returned + * by the SOAP function, the return value of __soapCall will be + * a simple value (e.g. an integer, a string, etc). If multiple values are + * returned, __soapCall will return + * an associative array of named output parameters. + *

+ *

+ * On error, if the SoapClient object was constructed with the trace + * option set to FALSE, a SoapFault object will be returned. + */ + public function __soapCall ($function_name, array $arguments, array $options = null, $input_headers = null, array &$output_headers = null) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Returns last SOAP request + * @link http://php.net/manual/en/soapclient.getlastrequest.php + * @return string The last SOAP request, as an XML string. + */ + public function __getLastRequest () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Returns last SOAP response + * @link http://php.net/manual/en/soapclient.getlastresponse.php + * @return string The last SOAP response, as an XML string. + */ + public function __getLastResponse () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Returns the SOAP headers from the last request + * @link http://php.net/manual/en/soapclient.getlastrequestheaders.php + * @return string The last SOAP request headers. + */ + public function __getLastRequestHeaders () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Returns the SOAP headers from the last response + * @link http://php.net/manual/en/soapclient.getlastresponseheaders.php + * @return string The last SOAP response headers. + */ + public function __getLastResponseHeaders () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Returns list of available SOAP functions + * @link http://php.net/manual/en/soapclient.getfunctions.php + * @return array The array of SOAP function prototypes, detailing the return type, + * the function name and type-hinted paramaters. + */ + public function __getFunctions () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Returns a list of SOAP types + * @link http://php.net/manual/en/soapclient.gettypes.php + * @return array The array of SOAP types, detailing all structures and types. + */ + public function __getTypes () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Performs a SOAP request + * @link http://php.net/manual/en/soapclient.dorequest.php + * @param string $request

+ * The XML SOAP request. + *

+ * @param string $location

+ * The URL to request. + *

+ * @param string $action

+ * The SOAP action. + *

+ * @param int $version

+ * The SOAP version. + *

+ * @param int $one_way [optional]

+ * If one_way is set to 1, this method returns nothing. + * Use this where a response is not expected. + *

+ * @return string The XML SOAP response. + */ + public function __doRequest ($request, $location, $action, $version, $one_way = 0) {} + + /** + * (PHP 5 >= 5.0.4)
+ * The __setCookie purpose + * @link http://php.net/manual/en/soapclient.setcookie.php + * @param string $name

+ * The name of the cookie. + *

+ * @param string $value [optional]

+ * The value of the cookie. If not specified, the cookie will be deleted. + *

+ * @return void No value is returned. + */ + public function __setCookie ($name, $value = null) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Sets the location of the Web service to use + * @link http://php.net/manual/en/soapclient.setlocation.php + * @param string $new_location [optional]

+ * The new endpoint URL. + *

+ * @return string The old endpoint URL. + */ + public function __setLocation ($new_location = null) {} + + /** + * (PHP 5 >= 5.0.5)
+ * Sets SOAP headers for subsequent calls + * @link http://php.net/manual/en/soapclient.setsoapheaders.php + * @param mixed $soapheaders [optional]

+ * The headers to be set. It could be SoapHeader + * object or array of SoapHeader objects. + * If not specified or set to NULL, the headers will be deleted. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function __setSoapHeaders ($soapheaders = null) {} + +} + +/** + * A class representing a variable or object for use with SOAP services. + * @link http://php.net/manual/en/class.soapvar.php + * @jms-builtin + */ +class SoapVar { + + /** + * (PHP 5 >= 5.0.1)
+ * SoapVar constructor + * @link http://php.net/manual/en/soapvar.soapvar.php + * @param mixed $data

+ * The data to pass or return. + *

+ * @param string $encoding

+ * The encoding ID, one of the XSD_... constants. + *

+ * @param string $type_name [optional]

+ * The type name. + *

+ * @param string $type_namespace [optional]

+ * The type namespace. + *

+ * @param string $node_name [optional]

+ * The XML node name. + *

+ * @param string $node_namespace [optional]

+ * The XML node namespace. + *

+ */ + public function SoapVar ($data, $encoding, $type_name = null, $type_namespace = null, $node_name = null, $node_namespace = null) {} + +} + +/** + * The SoapServer class provides a server for the SOAP 1.1 and SOAP 1.2 protocols. It can be used with or without a WSDL service description. + * @link http://php.net/manual/en/class.soapserver.php + * @jms-builtin + */ +class SoapServer { + + /** + * (PHP 5 >= 5.0.1)
+ * SoapServer constructor + * @link http://php.net/manual/en/soapserver.soapserver.php + * @param mixed $wsdl

+ * To use the SoapServer in WSDL mode, pass the URI of a WSDL file. + * Otherwise, pass NULL and set the uri option to the + * target namespace for the server. + *

+ * @param array $options [optional]

+ * Allow setting a default SOAP version (soap_version), + * internal character encoding (encoding), + * and actor URI (actor). + *

+ *

+ * The classmap option can be used to map some WSDL + * types to PHP classes. This option must be an array with WSDL types + * as keys and names of PHP classes as values. + *

+ *

+ * The typemap option is an array of type mappings. + * Type mapping is an array with keys type_name, + * type_ns (namespace URI), from_xml + * (callback accepting one string parameter) and to_xml + * (callback accepting one object parameter). + *

+ *

+ * The cache_wsdl option is one of + * WSDL_CACHE_NONE, + * WSDL_CACHE_DISK, + * WSDL_CACHE_MEMORY or + * WSDL_CACHE_BOTH. + *

+ *

+ * There is also a features option which can be set to + * SOAP_WAIT_ONE_WAY_CALLS, + * SOAP_SINGLE_ELEMENT_ARRAYS, + * SOAP_USE_XSI_ARRAY_TYPE. + *

+ */ + public function SoapServer ($wsdl, array $options = null) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Sets SoapServer persistence mode + * @link http://php.net/manual/en/soapserver.setpersistence.php + * @param int $mode

+ * One of the SOAP_PERSISTENCE_XXX constants. + *

+ *

+ * SOAP_PERSISTENCE_REQUEST - SoapServer data does not persist between + * requests. This is the default behavior of any SoapServer + * object after setClass is called. + *

+ *

+ * SOAP_PERSISTENCE_SESSION - SoapServer data does persists between requests. + * This is accomplished by serializing the SoapServer class data into $_SESSION['_bogus_session_name'], + * because of this session_start must be called before this persistence mode is set. + *

+ * @return void No value is returned. + */ + public function setPersistence ($mode) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Sets the class which handles SOAP requests + * @link http://php.net/manual/en/soapserver.setclass.php + * @param string $class_name

+ * The name of the exported class. + *

+ * @param mixed $args [optional]

+ * These optional parameters will be passed to the default class constructor + * during object creation. + *

+ * @param mixed $_ [optional] + * @return void No value is returned. + */ + public function setClass ($class_name, $args = null, $_ = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Sets the object which will be used to handle SOAP requests + * @link http://php.net/manual/en/soapserver.setobject.php + * @param object $object

+ * The object to handle the requests. + *

+ * @return void No value is returned. + */ + public function setObject ($object) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Adds one or more functions to handle SOAP requests + * @link http://php.net/manual/en/soapserver.addfunction.php + * @param mixed $functions

+ * To export one function, pass the function name into this parameter as + * a string. + *

+ *

+ * To export several functions, pass an array of function names. + *

+ *

+ * To export all the functions, pass a special constant SOAP_FUNCTIONS_ALL. + *

+ *

+ * functions must receive all input arguments in the same + * order as defined in the WSDL file (They should not receive any output parameters + * as arguments) and return one or more values. To return several values they must + * return an array with named output parameters. + *

+ * @return void No value is returned. + */ + public function addFunction ($functions) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Returns list of defined functions + * @link http://php.net/manual/en/soapserver.getfunctions.php + * @return array An array of the defined functions. + */ + public function getFunctions () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Handles a SOAP request + * @link http://php.net/manual/en/soapserver.handle.php + * @param string $soap_request [optional]

+ * The SOAP request. If this argument is omitted, the request is assumed to be + * in the raw POST data of the HTTP request. + *

+ * @return void No value is returned. + */ + public function handle ($soap_request = null) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Issue SoapServer fault indicating an error + * @link http://php.net/manual/en/soapserver.fault.php + * @param string $code

+ * The error code to return + *

+ * @param string $string

+ * A brief description of the error + *

+ * @param string $actor [optional]

+ * A string identifying the actor that caused the fault. + *

+ * @param string $details [optional]

+ * More details of the fault + *

+ * @param string $name [optional]

+ * The name of the fault. This can be used to select a name from a WSDL file. + *

+ * @return void No value is returned. + */ + public function fault ($code, $string, $actor = null, $details = null, $name = null) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Add a SOAP header to the response + * @link http://php.net/manual/en/soapserver.addsoapheader.php + * @param SoapHeader $object

+ * The header to be returned. + *

+ * @return void No value is returned. + */ + public function addSoapHeader (SoapHeader $object) {} + +} + +/** + * Represents a SOAP fault. + * @link http://php.net/manual/en/class.soapfault.php + * @jms-builtin + */ +class SoapFault extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * (PHP 5 >= 5.0.1)
+ * SoapFault constructor + * @link http://php.net/manual/en/soapfault.soapfault.php + * @param string $faultcode

+ * The error code of the SoapFault. + *

+ * @param string $faultstring

+ * The error message of the SoapFault. + *

+ * @param string $faultactor [optional]

+ * A string identifying the actor that caused the error. + *

+ * @param string $detail [optional]

+ * More details about the cause of the error. + *

+ * @param string $faultname [optional]

+ * Can be used to select the proper fault encoding from WSDL. + *

+ * @param string $headerfault [optional]

+ * Can be used during SOAP header handling to report an error in the + * response header. + *

+ */ + public function SoapFault ($faultcode, $faultstring, $faultactor = null, $detail = null, $faultname = null, $headerfault = null) {} + + /** + * (PHP 5 >= 5.0.1)
+ * Obtain a string representation of a SoapFault + * @link http://php.net/manual/en/soapfault.tostring.php + * @return string A string describing the SoapFault. + */ + public function __toString () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Clone the exception + * @link http://php.net/manual/en/exception.clone.php + * @return void No value is returned. + */ + final private function __clone () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Construct the exception + * @link http://php.net/manual/en/exception.construct.php + * @param $message [optional] + * @param $code [optional] + * @param $previous [optional] + */ + public function __construct ($message, $code, $previous) {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception message + * @link http://php.net/manual/en/exception.getmessage.php + * @return string the Exception message as a string. + */ + final public function getMessage () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the Exception code + * @link http://php.net/manual/en/exception.getcode.php + * @return mixed the exception code as integer in + * Exception but possibly as other type in + * Exception descendants (for example as + * string in PDOException). + */ + final public function getCode () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the file in which the exception occurred + * @link http://php.net/manual/en/exception.getfile.php + * @return string the filename in which the exception was created. + */ + final public function getFile () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the line in which the exception occurred + * @link http://php.net/manual/en/exception.getline.php + * @return int the line number where the exception was created. + */ + final public function getLine () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace + * @link http://php.net/manual/en/exception.gettrace.php + * @return array the Exception stack trace as an array. + */ + final public function getTrace () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns previous Exception + * @link http://php.net/manual/en/exception.getprevious.php + * @return Exception the previous Exception if available + * or NULL otherwise. + */ + final public function getPrevious () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Gets the stack trace as a string + * @link http://php.net/manual/en/exception.gettraceasstring.php + * @return string the Exception stack trace as a string. + */ + final public function getTraceAsString () {} + +} + +/** + * Represents parameter to a SOAP call. + * @link http://php.net/manual/en/class.soapparam.php + * @jms-builtin + */ +class SoapParam { + + /** + * (PHP 5 >= 5.0.1)
+ * SoapParam constructor + * @link http://php.net/manual/en/soapparam.soapparam.php + * @param mixed $data

+ * The data to pass or return. This parameter can be passed directly as PHP + * value, but in this case it will be named as paramN and + * the SOAP service may not understand it. + *

+ * @param string $name

+ * The parameter name. + *

+ */ + public function SoapParam ($data, $name) {} + +} + +/** + * Represents a SOAP header. + * @link http://php.net/manual/en/class.soapheader.php + * @jms-builtin + */ +class SoapHeader { + + /** + * (PHP 5 >= 5.0.1)
+ * SoapHeader constructor + * @link http://php.net/manual/en/soapheader.soapheader.php + * @param string $namespace

+ * The namespace of the SOAP header element. + *

+ * @param string $name

+ * The name of the SoapHeader object. + *

+ * @param mixed $data [optional]

+ * A SOAP header's content. It can be a PHP value or a + * SoapVar object. + *

+ * @param bool $mustunderstand [optional] + * @param string $actor [optional]

+ * Value of the actor attribute of the SOAP header + * element. + *

+ */ + public function SoapHeader ($namespace, $name, $data = null, $mustunderstand = false, $actor = null) {} + +} + +/** + * (Unknown)
+ * Set whether to use the SOAP error handler + * @link http://php.net/manual/en/function.use-soap-error-handler.php + * @param bool $handler [optional]

+ * Set to TRUE to send error details to clients. + *

+ * @return bool the original value. + * @jms-builtin + */ +function use_soap_error_handler ($handler = true) {} + +/** + * (Unknown)
+ * Checks if a SOAP call has failed + * @link http://php.net/manual/en/function.is-soap-fault.php + * @param mixed $object

+ * The object to test. + *

+ * @return bool This will return TRUE on error, and FALSE otherwise. + * @jms-builtin + */ +function is_soap_fault ($object) {} + +define ('SOAP_1_1', 1); +define ('SOAP_1_2', 2); +define ('SOAP_PERSISTENCE_SESSION', 1); +define ('SOAP_PERSISTENCE_REQUEST', 2); +define ('SOAP_FUNCTIONS_ALL', 999); +define ('SOAP_ENCODED', 1); +define ('SOAP_LITERAL', 2); +define ('SOAP_RPC', 1); +define ('SOAP_DOCUMENT', 2); +define ('SOAP_ACTOR_NEXT', 1); +define ('SOAP_ACTOR_NONE', 2); +define ('SOAP_ACTOR_UNLIMATERECEIVER', 3); +define ('SOAP_COMPRESSION_ACCEPT', 32); +define ('SOAP_COMPRESSION_GZIP', 0); +define ('SOAP_COMPRESSION_DEFLATE', 16); +define ('SOAP_AUTHENTICATION_BASIC', 0); +define ('SOAP_AUTHENTICATION_DIGEST', 1); +define ('UNKNOWN_TYPE', 999998); +define ('XSD_STRING', 101); +define ('XSD_BOOLEAN', 102); +define ('XSD_DECIMAL', 103); +define ('XSD_FLOAT', 104); +define ('XSD_DOUBLE', 105); +define ('XSD_DURATION', 106); +define ('XSD_DATETIME', 107); +define ('XSD_TIME', 108); +define ('XSD_DATE', 109); +define ('XSD_GYEARMONTH', 110); +define ('XSD_GYEAR', 111); +define ('XSD_GMONTHDAY', 112); +define ('XSD_GDAY', 113); +define ('XSD_GMONTH', 114); +define ('XSD_HEXBINARY', 115); +define ('XSD_BASE64BINARY', 116); +define ('XSD_ANYURI', 117); +define ('XSD_QNAME', 118); +define ('XSD_NOTATION', 119); +define ('XSD_NORMALIZEDSTRING', 120); +define ('XSD_TOKEN', 121); +define ('XSD_LANGUAGE', 122); +define ('XSD_NMTOKEN', 123); +define ('XSD_NAME', 124); +define ('XSD_NCNAME', 125); +define ('XSD_ID', 126); +define ('XSD_IDREF', 127); +define ('XSD_IDREFS', 128); +define ('XSD_ENTITY', 129); +define ('XSD_ENTITIES', 130); +define ('XSD_INTEGER', 131); +define ('XSD_NONPOSITIVEINTEGER', 132); +define ('XSD_NEGATIVEINTEGER', 133); +define ('XSD_LONG', 134); +define ('XSD_INT', 135); +define ('XSD_SHORT', 136); +define ('XSD_BYTE', 137); +define ('XSD_NONNEGATIVEINTEGER', 138); +define ('XSD_UNSIGNEDLONG', 139); +define ('XSD_UNSIGNEDINT', 140); +define ('XSD_UNSIGNEDSHORT', 141); +define ('XSD_UNSIGNEDBYTE', 142); +define ('XSD_POSITIVEINTEGER', 143); +define ('XSD_NMTOKENS', 144); +define ('XSD_ANYTYPE', 145); +define ('XSD_ANYXML', 147); +define ('APACHE_MAP', 200); +define ('SOAP_ENC_OBJECT', 301); +define ('SOAP_ENC_ARRAY', 300); +define ('XSD_1999_TIMEINSTANT', 401); +define ('XSD_NAMESPACE', "http://www.w3.org/2001/XMLSchema"); +define ('XSD_1999_NAMESPACE', "http://www.w3.org/1999/XMLSchema"); +define ('SOAP_SINGLE_ELEMENT_ARRAYS', 1); +define ('SOAP_WAIT_ONE_WAY_CALLS', 2); +define ('SOAP_USE_XSI_ARRAY_TYPE', 4); +define ('WSDL_CACHE_NONE', 0); +define ('WSDL_CACHE_DISK', 1); +define ('WSDL_CACHE_MEMORY', 2); +define ('WSDL_CACHE_BOTH', 3); + +// End of soap v. +?> diff --git a/res/php-5.4-core-api/sockets.php b/res/php-5.4-core-api/sockets.php new file mode 100644 index 0000000..354d593 --- /dev/null +++ b/res/php-5.4-core-api/sockets.php @@ -0,0 +1,1962 @@ + + * Runs the select() system call on the given arrays of sockets with a specified timeout + * @link http://php.net/manual/en/function.socket-select.php + * @param array $read

+ * The sockets listed in the read array will be + * watched to see if characters become available for reading (more + * precisely, to see if a read will not block - in particular, a socket + * resource is also ready on end-of-file, in which case a + * socket_read will return a zero length string). + *

+ * @param array $write

+ * The sockets listed in the write array will be + * watched to see if a write will not block. + *

+ * @param array $except

+ * The sockets listed in the except array will be + * watched for exceptions. + *

+ * @param int $tv_sec

+ * The tv_sec and tv_usec + * together form the timeout parameter. The + * timeout is an upper bound on the amount of time + * elapsed before socket_select return. + * tv_sec may be zero , causing + * socket_select to return immediately. This is useful + * for polling. If tv_sec is NULL (no timeout), + * socket_select can block indefinitely. + *

+ * @param int $tv_usec [optional] + * @return int On success socket_select returns the number of + * socket resources contained in the modified arrays, which may be zero if + * the timeout expires before anything interesting happens. On error FALSE + * is returned. The error code can be retrieved with + * socket_last_error. + *

+ *

+ * Be sure to use the === operator when checking for an + * error. Since the socket_select may return 0 the + * comparison with == would evaluate to TRUE: + * Understanding socket_select's result + * + * $e = NULL; + * if (false === socket_select($r, $w, $e, 0)) { + * echo "socket_select() failed, reason: " . + * socket_strerror(socket_last_error()) . "\n"; + * } + * + * @jms-builtin + */ +function socket_select (array &$read, array &$write, array &$except, $tv_sec, $tv_usec = 0) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Create a socket (endpoint for communication) + * @link http://php.net/manual/en/function.socket-create.php + * @param int $domain

+ * The domain parameter specifies the protocol + * family to be used by the socket. + *

+ * + * Available address/protocol families + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
DomainDescription
AF_INET + * IPv4 Internet based protocols. TCP and UDP are common protocols of + * this protocol family. + *
AF_INET6 + * IPv6 Internet based protocols. TCP and UDP are common protocols of + * this protocol family. + *
AF_UNIX + * Local communication protocol family. High efficiency and low + * overhead make it a great form of IPC (Interprocess Communication). + *
+ * @param int $type

+ * The type parameter selects the type of communication + * to be used by the socket. + *

+ * + * Available socket types + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeDescription
SOCK_STREAM + * Provides sequenced, reliable, full-duplex, connection-based byte streams. + * An out-of-band data transmission mechanism may be supported. + * The TCP protocol is based on this socket type. + *
SOCK_DGRAM + * Supports datagrams (connectionless, unreliable messages of a fixed maximum length). + * The UDP protocol is based on this socket type. + *
SOCK_SEQPACKET + * Provides a sequenced, reliable, two-way connection-based data transmission path for + * datagrams of fixed maximum length; a consumer is required to read an + * entire packet with each read call. + *
SOCK_RAW + * Provides raw network protocol access. This special type of socket + * can be used to manually construct any type of protocol. A common use + * for this socket type is to perform ICMP requests (like ping). + *
SOCK_RDM + * Provides a reliable datagram layer that does not guarantee ordering. + * This is most likely not implemented on your operating system. + *
+ * @param int $protocol

+ * The protocol parameter sets the specific + * protocol within the specified domain to be used + * when communicating on the returned socket. The proper value can be + * retrieved by name by using getprotobyname. If + * the desired protocol is TCP, or UDP the corresponding constants + * SOL_TCP, and SOL_UDP + * can also be used. + *

+ * + * Common protocols + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameDescription
icmp + * The Internet Control Message Protocol is used primarily by gateways + * and hosts to report errors in datagram communication. The "ping" + * command (present in most modern operating systems) is an example + * application of ICMP. + *
udp + * The User Datagram Protocol is a connectionless, unreliable, + * protocol with fixed record lengths. Due to these aspects, UDP + * requires a minimum amount of protocol overhead. + *
tcp + * The Transmission Control Protocol is a reliable, connection based, + * stream oriented, full duplex protocol. TCP guarantees that all data packets + * will be received in the order in which they were sent. If any packet is somehow + * lost during communication, TCP will automatically retransmit the packet until + * the destination host acknowledges that packet. For reliability and performance + * reasons, the TCP implementation itself decides the appropriate octet boundaries + * of the underlying datagram communication layer. Therefore, TCP applications must + * allow for the possibility of partial record transmission. + *
+ * @return resource socket_create returns a socket resource on success, + * or FALSE on error. The actual error code can be retrieved by calling + * socket_last_error. This error code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * @jms-builtin + */ +function socket_create ($domain, $type, $protocol) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Opens a socket on port to accept connections + * @link http://php.net/manual/en/function.socket-create-listen.php + * @param int $port

+ * The port on which to listen on all interfaces. + *

+ * @param int $backlog [optional]

+ * The backlog parameter defines the maximum length + * the queue of pending connections may grow to. + * SOMAXCONN may be passed as + * backlog parameter, see + * socket_listen for more information. + *

+ * @return resource socket_create_listen returns a new socket resource + * on success or FALSE on error. The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * @jms-builtin + */ +function socket_create_listen ($port, $backlog = 128) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Creates a pair of indistinguishable sockets and stores them in an array + * @link http://php.net/manual/en/function.socket-create-pair.php + * @param int $domain

+ * The domain parameter specifies the protocol + * family to be used by the socket. See socket_create + * for the full list. + *

+ * @param int $type

+ * The type parameter selects the type of communication + * to be used by the socket. See socket_create for the + * full list. + *

+ * @param int $protocol

+ * The protocol parameter sets the specific + * protocol within the specified domain to be used + * when communicating on the returned socket. The proper value can be retrieved by + * name by using getprotobyname. If + * the desired protocol is TCP, or UDP the corresponding constants + * SOL_TCP, and SOL_UDP + * can also be used. + *

+ *

+ * See socket_create for the full list of supported + * protocols. + *

+ * @param array $fd

+ * Reference to an array in which the two socket resources will be inserted. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function socket_create_pair ($domain, $type, $protocol, array &$fd) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Accepts a connection on a socket + * @link http://php.net/manual/en/function.socket-accept.php + * @param resource $socket

+ * A valid socket resource created with socket_create. + *

+ * @return resource a new socket resource on success, or FALSE on error. The actual + * error code can be retrieved by calling + * socket_last_error. This error code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * @jms-builtin + */ +function socket_accept ($socket) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Sets nonblocking mode for file descriptor fd + * @link http://php.net/manual/en/function.socket-set-nonblock.php + * @param resource $socket

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function socket_set_nonblock ($socket) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Sets blocking mode on a socket resource + * @link http://php.net/manual/en/function.socket-set-block.php + * @param resource $socket

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function socket_set_block ($socket) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Listens for a connection on a socket + * @link http://php.net/manual/en/function.socket-listen.php + * @param resource $socket

+ * A valid socket resource created with socket_create. + *

+ * @param int $backlog [optional]

+ * A maximum of backlog incoming connections will be + * queued for processing. If a connection request arrives with the queue + * full the client may receive an error with an indication of + * ECONNREFUSED, or, if the underlying protocol supports + * retransmission, the request may be ignored so that retries may succeed. + *

+ *

+ * The maximum number passed to the backlog + * parameter highly depends on the underlying platform. On Linux, it is + * silently truncated to SOMAXCONN. On win32, if + * passed SOMAXCONN, the underlying service provider + * responsible for the socket will set the backlog to a maximum + * reasonable value. There is no standard provision to + * find out the actual backlog value on this platform. + *

+ * @return bool TRUE on success or FALSE on failure. The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + * @jms-builtin + */ +function socket_listen ($socket, $backlog = 0) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Closes a socket resource + * @link http://php.net/manual/en/function.socket-close.php + * @param resource $socket

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function socket_close ($socket) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Write to a socket + * @link http://php.net/manual/en/function.socket-write.php + * @param resource $socket + * @param string $buffer

+ * The buffer to be written. + *

+ * @param int $length [optional]

+ * The optional parameter length can specify an + * alternate length of bytes written to the socket. If this length is + * greater then the buffer length, it is silently truncated to the length + * of the buffer. + *

+ * @return int the number of bytes successfully written to the socket or FALSE on failure. + * The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + *

+ *

+ * It is perfectly valid for socket_write to + * return zero which means no bytes have been written. Be sure to use the + * === operator to check for FALSE in case of an + * error. + * @jms-builtin + */ +function socket_write ($socket, $buffer, $length = 0) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Reads a maximum of length bytes from a socket + * @link http://php.net/manual/en/function.socket-read.php + * @param resource $socket

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param int $length

+ * The maximum number of bytes read is specified by the + * length parameter. Otherwise you can use + * \r, \n, + * or \0 to end reading (depending on the type + * parameter, see below). + *

+ * @param int $type [optional]

+ * Optional type parameter is a named constant: + * PHP_BINARY_READ (Default) - use the system + * recv() function. Safe for reading binary data. + * @return string socket_read returns the data as a string on success, + * or FALSE on error (including if the remote host has closed the + * connection). The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual representation of + * the error. + *

+ *

+ * socket_read returns a zero length string ("") + * when there is no more data to read. + * @jms-builtin + */ +function socket_read ($socket, $length, $type = 'PHP_BINARY_READ') {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Queries the local side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type + * @link http://php.net/manual/en/function.socket-getsockname.php + * @param resource $socket

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param string $addr

+ * If the given socket is of type AF_INET + * or AF_INET6, socket_getsockname + * will return the local IP address in appropriate notation (e.g. + * 127.0.0.1 or fe80::1) in the + * address parameter and, if the optional + * port parameter is present, also the associated port. + *

+ *

+ * If the given socket is of type AF_UNIX, + * socket_getsockname will return the Unix filesystem + * path (e.g. /var/run/daemon.sock) in the + * address parameter. + *

+ * @param int $port [optional]

+ * If provided, this will hold the associated port. + *

+ * @return bool TRUE on success or FALSE on failure. socket_getsockname may also return + * FALSE if the socket type is not any of AF_INET, + * AF_INET6, or AF_UNIX, in which + * case the last socket error code is not updated. + * @jms-builtin + */ +function socket_getsockname ($socket, &$addr, &$port = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Queries the remote side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type + * @link http://php.net/manual/en/function.socket-getpeername.php + * @param resource $socket

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param string $address

+ * If the given socket is of type AF_INET or + * AF_INET6, socket_getpeername + * will return the peers (remote) IP address in + * appropriate notation (e.g. 127.0.0.1 or + * fe80::1) in the address + * parameter and, if the optional port parameter is + * present, also the associated port. + *

+ *

+ * If the given socket is of type AF_UNIX, + * socket_getpeername will return the Unix filesystem + * path (e.g. /var/run/daemon.sock) in the + * address parameter. + *

+ * @param int $port [optional]

+ * If given, this will hold the port associated to + * address. + *

+ * @return bool TRUE on success or FALSE on failure. socket_getpeername may also return + * FALSE if the socket type is not any of AF_INET, + * AF_INET6, or AF_UNIX, in which + * case the last socket error code is not updated. + * @jms-builtin + */ +function socket_getpeername ($socket, &$address, &$port = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Initiates a connection on a socket + * @link http://php.net/manual/en/function.socket-connect.php + * @param resource $socket + * @param string $address

+ * The address parameter is either an IPv4 address + * in dotted-quad notation (e.g. 127.0.0.1) if + * socket is AF_INET, a valid + * IPv6 address (e.g. ::1) if IPv6 support is enabled and + * socket is AF_INET6 + * or the pathname of a Unix domain socket, if the socket family is + * AF_UNIX. + *

+ * @param int $port [optional]

+ * The port parameter is only used and is mandatory + * when connecting to an AF_INET or an + * AF_INET6 socket, and designates + * the port on the remote host to which a connection should be made. + *

+ * @return bool TRUE on success or FALSE on failure. The error code can be retrieved with + * socket_last_error. This code may be passed to + * socket_strerror to get a textual explanation of the + * error. + *

+ *

+ * If the socket is non-blocking then this function returns FALSE with an + * error Operation now in progress. + * @jms-builtin + */ +function socket_connect ($socket, $address, $port = 0) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Return a string describing a socket error + * @link http://php.net/manual/en/function.socket-strerror.php + * @param int $errno

+ * A valid socket error number, likely produced by + * socket_last_error. + *

+ * @return string the error message associated with the errno + * parameter. + * @jms-builtin + */ +function socket_strerror ($errno) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Binds a name to a socket + * @link http://php.net/manual/en/function.socket-bind.php + * @param resource $socket

+ * A valid socket resource created with socket_create. + *

+ * @param string $address

+ * If the socket is of the AF_INET family, the + * address is an IP in dotted-quad notation + * (e.g. 127.0.0.1). + *

+ *

+ * If the socket is of the AF_UNIX family, the + * address is the path of a + * Unix-domain socket (e.g. /tmp/my.sock). + *

+ * @param int $port [optional]

+ * The port parameter is only used when + * binding an AF_INET socket, and designates + * the port on which to listen for connections. + *

+ * @return bool TRUE on success or FALSE on failure. + *

+ *

+ * The error code can be retrieved with socket_last_error. + * This code may be passed to socket_strerror to get a + * textual explanation of the error. + * @jms-builtin + */ +function socket_bind ($socket, $address, $port = 0) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Receives data from a connected socket + * @link http://php.net/manual/en/function.socket-recv.php + * @param resource $socket

+ * The socket must be a socket resource previously + * created by socket_create(). + *

+ * @param string $buf

+ * The data received will be fetched to the variable specified with + * buf. If an error occurs, if the + * connection is reset, or if no data is + * available, buf will be set to NULL. + *

+ * @param int $len

+ * Up to len bytes will be fetched from remote host. + *

+ * @param int $flags

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + *

+ * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
MSG_OOB + * Process out-of-band data. + *
MSG_PEEK + * Receive data from the beginning of the receive queue without + * removing it from the queue. + *
MSG_WAITALL + * Block until at least len are received. + * However, if a signal is caught or the remote host disconnects, the + * function may return less data. + *
MSG_DONTWAIT + * With this flag set, the function returns even if it would normally + * have blocked. + *
+ * @return int socket_recv returns the number of bytes received, + * or FALSE if there was an error. The actual error code can be retrieved by + * calling socket_last_error. This error code may be + * passed to socket_strerror to get a textual explanation + * of the error. + * @jms-builtin + */ +function socket_recv ($socket, &$buf, $len, $flags) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Sends data to a connected socket + * @link http://php.net/manual/en/function.socket-send.php + * @param resource $socket

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param string $buf

+ * A buffer containing the data that will be sent to the remote host. + *

+ * @param int $len

+ * The number of bytes that will be sent to the remote host from + * buf. + *

+ * @param int $flags

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
MSG_OOB + * Send OOB (out-of-band) data. + *
MSG_EOR + * Indicate a record mark. The sent data completes the record. + *
MSG_EOF + * Close the sender side of the socket and include an appropriate + * notification of this at the end of the sent data. The sent data + * completes the transaction. + *
MSG_DONTROUTE + * Bypass routing, use direct interface. + *
+ *

+ * @return int socket_send returns the number of bytes sent, or FALSE on error. + * @jms-builtin + */ +function socket_send ($socket, $buf, $len, $flags) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Receives data from a socket whether or not it is connection-oriented + * @link http://php.net/manual/en/function.socket-recvfrom.php + * @param resource $socket

+ * The socket must be a socket resource previously + * created by socket_create(). + *

+ * @param string $buf

+ * The data received will be fetched to the variable specified with + * buf. + *

+ * @param int $len

+ * Up to len bytes will be fetched from remote host. + *

+ * @param int $flags

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + *

+ * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
MSG_OOB + * Process out-of-band data. + *
MSG_PEEK + * Receive data from the beginning of the receive queue without + * removing it from the queue. + *
MSG_WAITALL + * Block until at least len are received. + * However, if a signal is caught or the remote host disconnects, the + * function may return less data. + *
MSG_DONTWAIT + * With this flag set, the function returns even if it would normally + * have blocked. + *
+ * @param string $name

+ * If the socket is of the type AF_UNIX type, + * name is the path to the file. Else, for + * unconnected sockets, name is the IP address of, + * the remote host, or NULL if the socket is connection-oriented. + *

+ * @param int $port [optional]

+ * This argument only applies to AF_INET and + * AF_INET6 sockets, and specifies the remote port + * from which the data is received. If the socket is connection-oriented, + * port will be NULL. + *

+ * @return int socket_recvfrom returns the number of bytes received, + * or FALSE if there was an error. The actual error code can be retrieved by + * calling socket_last_error. This error code may be + * passed to socket_strerror to get a textual explanation + * of the error. + * @jms-builtin + */ +function socket_recvfrom ($socket, &$buf, $len, $flags, &$name, &$port = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Sends a message to a socket, whether it is connected or not + * @link http://php.net/manual/en/function.socket-sendto.php + * @param resource $socket

+ * A valid socket resource created using socket_create. + *

+ * @param string $buf

+ * The sent data will be taken from buffer buf. + *

+ * @param int $len

+ * len bytes from buf will be + * sent. + *

+ * @param int $flags

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + * + * Possible values for flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
MSG_OOB + * Send OOB (out-of-band) data. + *
MSG_EOR + * Indicate a record mark. The sent data completes the record. + *
MSG_EOF + * Close the sender side of the socket and include an appropriate + * notification of this at the end of the sent data. The sent data + * completes the transaction. + *
MSG_DONTROUTE + * Bypass routing, use direct interface. + *
+ *

+ * @param string $addr

+ * IP address of the remote host. + *

+ * @param int $port [optional]

+ * port is the remote port number at which the data + * will be sent. + *

+ * @return int socket_sendto returns the number of bytes sent to the + * remote host, or FALSE if an error occurred. + * @jms-builtin + */ +function socket_sendto ($socket, $buf, $len, $flags, $addr, $port = 0) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Gets socket options for the socket + * @link http://php.net/manual/en/function.socket-get-option.php + * @param resource $socket

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param int $level

+ * The level parameter specifies the protocol + * level at which the option resides. For example, to retrieve options at + * the socket level, a level parameter of + * SOL_SOCKET would be used. Other levels, such as + * TCP, can be used by + * specifying the protocol number of that level. Protocol numbers can be + * found by using the getprotobyname function. + *

+ * @param int $optname + * Available Socket Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OptionDescriptionType
SO_DEBUG + * Reports whether debugging information is being recorded. + * + * int + *
SO_BROADCAST + * Reports whether transmission of broadcast messages is supported. + * + * int + *
SO_REUSEADDR + * Reports whether local addresses can be reused. + * + * int + *
SO_KEEPALIVE + * Reports whether connections are kept active with periodic transmission + * of messages. If the connected socket fails to respond to these messages, + * the connection is broken and processes writing to that socket are notified + * with a SIGPIPE signal. + * + * int + *
SO_LINGER + *

+ * Reports whether the socket lingers on + * socket_close if data is present. By default, + * when the socket is closed, it attempts to send all unsent data. + * In the case of a connection-oriented socket, + * socket_close will wait for its peer to + * acknowledge the data. + *

+ *

+ * If l_onoff is non-zero and + * l_linger is zero, all the + * unsent data will be discarded and RST (reset) is sent to the + * peer in the case of a connection-oriented socket. + *

+ *

+ * On the other hand, if l_onoff is + * non-zero and l_linger is non-zero, + * socket_close will block until all the data + * is sent or the time specified in l_linger + * elapses. If the socket is non-blocking, + * socket_close will fail and return an error. + *

+ *
+ * array. The array will contain two keys: + * l_onoff and + * l_linger. + *
SO_OOBINLINE + * Reports whether the socket leaves out-of-band data inline. + * + * int + *
SO_SNDBUF + * Reports the size of the send buffer. + * + * int + *
SO_RCVBUF + * Reports the size of the receive buffer. + * + * int + *
SO_ERROR + * Reports information about error status and clears it. + * + * int (cannot be set by socket_set_option) + *
SO_TYPE + * Reports the socket type (e.g. + * SOCK_STREAM). + * + * int (cannot be set by socket_set_option) + *
SO_DONTROUTE + * Reports whether outgoing messages bypass the standard routing facilities. + * + * int + *
SO_RCVLOWAT + * Reports the minimum number of bytes to process for socket + * input operations. + * + * int + *
SO_RCVTIMEO + * Reports the timeout value for input operations. + * + * array. The array will contain two keys: + * sec which is the seconds part on the timeout + * value and usec which is the microsecond part + * of the timeout value. + *
SO_SNDTIMEO + * Reports the timeout value specifying the amount of time that an output + * function blocks because flow control prevents data from being sent. + * + * array. The array will contain two keys: + * sec which is the seconds part on the timeout + * value and usec which is the microsecond part + * of the timeout value. + *
SO_SNDLOWAT + * Reports the minimum number of bytes to process for socket output operations. + * + * int + *
TCP_NODELAY + * Reports whether the Nagle TCP algorithm is disabled. + * + * int + *
MCAST_JOIN_GROUP + * Joins a multicast group. (added in PHP 5.4) + * + * array with keys "group", specifying + * a string with an IPv4 or IPv6 multicast address and + * "interface", specifying either an interface + * number (type int) or a string with + * the interface name, like "eth0". + * 0 can be specified to indicate the interface + * should be selected using routing rules. (can only be used in + * socket_set_option) + *
MCAST_LEAVE_GROUP + * Leaves a multicast group. (added in PHP 5.4) + * + * array. See MCAST_JOIN_GROUP for + * more information. (can only be used in + * socket_set_option) + *
MCAST_BLOCK_SOURCE + * Blocks packets arriving from a specific source to a specific + * multicast group, which must have been previously joined. + * (added in PHP 5.4) + * + * array with the same keys as + * MCAST_JOIN_GROUP, plus one extra key, + * source, which maps to a string + * specifying an IPv4 or IPv6 address of the source to be blocked. + * (can only be used in socket_set_option) + *
MCAST_UNBLOCK_SOURCE + * Unblocks (start receiving again) packets arriving from a specific + * source address to a specific multicast group, which must have been + * previously joined. (added in PHP 5.4) + * + * array with the same format as + * MCAST_BLOCK_SOURCE. + * (can only be used in socket_set_option) + *
MCAST_JOIN_SOURCE_GROUP + * Receive packets destined to a specific multicast group whose source + * address matches a specific value. (added in PHP 5.4) + * + * array with the same format as + * MCAST_BLOCK_SOURCE. + * (can only be used in socket_set_option) + *
MCAST_LEAVE_SOURCE_GROUP + * Stop receiving packets destined to a specific multicast group whose + * soure address matches a specific value. (added in PHP 5.4) + * + * array with the same format as + * MCAST_BLOCK_SOURCE. + * (can only be used in socket_set_option) + *
IP_MULTICAST_IF + * The outgoing interface for IPv4 multicast packets. + * (added in PHP 5.4) + * + * Either int specifying the interface number or a + * string with an interface name, like + * eth0. The value 0 can be used to + * indicate the routing table is to used in the interface selection. + * The function socket_get_option returns an + * interface index. + * Note that, unlike the C API, this option does NOT take an IP + * address. This eliminates the interface difference between + * IP_MULTICAST_IF and + * IPV6_MULTICAST_IF. + *
IPV6_MULTICAST_IF + * The outgoing interface for IPv6 multicast packets. + * (added in PHP 5.4) + * + * The same as IP_MULTICAST_IF. + *
IP_MULTICAST_LOOP + * The multicast loopback policy for IPv4 packets, which + * determines whether multicast packets sent by this socket also reach + * receivers in the same host that have joined the same multicast group + * on the outgoing interface used by this socket. This is the case by + * default. + * (added in PHP 5.4) + * + * int (either 0 or + * 1). For socket_set_option + * any value will be accepted and will be converted to a boolean + * following the usual PHP rules. + *
IPV6_MULTICAST_LOOP + * Analogous to IP_MULTICAST_LOOP, but for IPv6. + * (added in PHP 5.4) + * + * int. See IP_MULTICAST_LOOP. + *
IP_MULTICAST_TTL + * The time-to-live of outgoing IPv4 multicast packets. This should be + * a value between 0 (don't leave the interface) and 255. The default + * value is 1 (only the local network is reached). + * (added in PHP 5.4) + * + * int between 0 and 255. + *
IPV6_MULTICAST_HOPS + * Analogous to IP_MULTICAST_TTL, but for IPv6 + * packets. The value -1 is also accepted, meaning the route default + * should be used. + * (added in PHP 5.4) + * + * int between -1 and 255. + *
+ * @return mixed the value of the given option, or FALSE on errors. + * @jms-builtin + */ +function socket_get_option ($socket, $level, $optname) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Sets socket options for the socket + * @link http://php.net/manual/en/function.socket-set-option.php + * @param resource $socket

+ * A valid socket resource created with socket_create + * or socket_accept. + *

+ * @param int $level

+ * The level parameter specifies the protocol + * level at which the option resides. For example, to retrieve options at + * the socket level, a level parameter of + * SOL_SOCKET would be used. Other levels, such as + * TCP, can be used by specifying the protocol number of that level. + * Protocol numbers can be found by using the + * getprotobyname function. + *

+ * @param int $optname

+ * The available socket options are the same as those for the + * socket_get_option function. + *

+ * @param mixed $optval

+ * The option value. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function socket_set_option ($socket, $level, $optname, $optval) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Shuts down a socket for receiving, sending, or both + * @link http://php.net/manual/en/function.socket-shutdown.php + * @param resource $socket

+ * A valid socket resource created with socket_create. + *

+ * @param int $how [optional]

+ * The value of how can be one of the following: + * + * possible values for how + * + * + * + * + * + * + * + * + * + * + * + * + *
0 + * Shutdown socket reading + *
1 + * Shutdown socket writing + *
2 + * Shutdown socket reading and writing + *
+ *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function socket_shutdown ($socket, $how = 2) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Returns the last error on the socket + * @link http://php.net/manual/en/function.socket-last-error.php + * @param resource $socket [optional]

+ * A valid socket resource created with socket_create. + *

+ * @return int This function returns a socket error code. + * @jms-builtin + */ +function socket_last_error ($socket = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Clears the error on the socket or the last error code + * @link http://php.net/manual/en/function.socket-clear-error.php + * @param resource $socket [optional]

+ * A valid socket resource created with socket_create. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function socket_clear_error ($socket = null) {} + +/** + * (PHP 4 >= 5.4.0)
+ * Import a stream + * @link http://php.net/manual/en/function.socket-import-stream.php + * @param resource $stream

+ * The stream resource to import. + *

+ * @return void FALSE or NULL on failure. + * @jms-builtin + */ +function socket_import_stream ($stream) {} + +/** + * @param $socket + * @param $level + * @param $optname + * @jms-builtin + */ +function socket_getopt ($socket, $level, $optname) {} + +/** + * @param $socket + * @param $level + * @param $optname + * @param $optval + * @jms-builtin + */ +function socket_setopt ($socket, $level, $optname, $optval) {} + +define ('AF_UNIX', 1); +define ('AF_INET', 2); + +/** + * Only available if compiled with IPv6 support. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('AF_INET6', 10); +define ('SOCK_STREAM', 1); +define ('SOCK_DGRAM', 2); +define ('SOCK_RAW', 3); +define ('SOCK_SEQPACKET', 5); +define ('SOCK_RDM', 4); +define ('MSG_OOB', 1); +define ('MSG_WAITALL', 256); +define ('MSG_DONTWAIT', 64); +define ('MSG_PEEK', 2); +define ('MSG_DONTROUTE', 4); + +/** + * Not available on Windows platforms. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('MSG_EOR', 128); + +/** + * Not available on Windows platforms. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('MSG_EOF', 512); +define ('SO_DEBUG', 1); +define ('SO_REUSEADDR', 2); +define ('SO_KEEPALIVE', 9); +define ('SO_DONTROUTE', 5); +define ('SO_LINGER', 13); +define ('SO_BROADCAST', 6); +define ('SO_OOBINLINE', 10); +define ('SO_SNDBUF', 7); +define ('SO_RCVBUF', 8); +define ('SO_SNDLOWAT', 19); +define ('SO_RCVLOWAT', 18); +define ('SO_SNDTIMEO', 21); +define ('SO_RCVTIMEO', 20); +define ('SO_TYPE', 3); +define ('SO_ERROR', 4); +define ('SOL_SOCKET', 1); +define ('SOMAXCONN', 128); + +/** + * Used to disable Nagle TCP algorithm. + * Added in PHP 5.2.7. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('TCP_NODELAY', 1); +define ('PHP_NORMAL_READ', 1); +define ('PHP_BINARY_READ', 2); +define ('MCAST_JOIN_GROUP', 42); +define ('MCAST_LEAVE_GROUP', 45); +define ('MCAST_BLOCK_SOURCE', 43); +define ('MCAST_UNBLOCK_SOURCE', 44); +define ('MCAST_JOIN_SOURCE_GROUP', 46); +define ('MCAST_LEAVE_SOURCE_GROUP', 47); +define ('IP_MULTICAST_IF', 32); +define ('IP_MULTICAST_TTL', 33); +define ('IP_MULTICAST_LOOP', 34); +define ('IPV6_MULTICAST_IF', 17); +define ('IPV6_MULTICAST_HOPS', 18); +define ('IPV6_MULTICAST_LOOP', 19); + +/** + * Operation not permitted. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPERM', 1); + +/** + * No such file or directory. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOENT', 2); + +/** + * Interrupted system call. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EINTR', 4); + +/** + * I/O error. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EIO', 5); + +/** + * No such device or address. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENXIO', 6); + +/** + * Arg list too long. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_E2BIG', 7); + +/** + * Bad file number. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADF', 9); + +/** + * Try again. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EAGAIN', 11); + +/** + * Out of memory. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOMEM', 12); + +/** + * Permission denied. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EACCES', 13); + +/** + * Bad address. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EFAULT', 14); + +/** + * Block device required. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTBLK', 15); + +/** + * Device or resource busy. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBUSY', 16); + +/** + * File exists. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EEXIST', 17); + +/** + * Cross-device link. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EXDEV', 18); + +/** + * No such device. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENODEV', 19); + +/** + * Not a directory. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTDIR', 20); + +/** + * Is a directory. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EISDIR', 21); + +/** + * Invalid argument. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EINVAL', 22); + +/** + * File table overflow. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENFILE', 23); + +/** + * Too many open files. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMFILE', 24); + +/** + * Not a typewriter. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTTY', 25); + +/** + * No space left on device. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSPC', 28); + +/** + * Illegal seek. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESPIPE', 29); + +/** + * Read-only file system. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EROFS', 30); + +/** + * Too many links. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMLINK', 31); + +/** + * Broken pipe. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPIPE', 32); + +/** + * File name too long. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENAMETOOLONG', 36); + +/** + * No record locks available. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOLCK', 37); + +/** + * Function not implemented. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSYS', 38); + +/** + * Directory not empty. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTEMPTY', 39); + +/** + * Too many symbolic links encountered. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ELOOP', 40); + +/** + * Operation would block. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EWOULDBLOCK', 11); + +/** + * No message of desired type. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOMSG', 42); + +/** + * Identifier removed. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EIDRM', 43); + +/** + * Channel number out of range. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECHRNG', 44); + +/** + * Level 2 not synchronized. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL2NSYNC', 45); + +/** + * Level 3 halted. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL3HLT', 46); + +/** + * Level 3 reset. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL3RST', 47); + +/** + * Link number out of range. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ELNRNG', 48); + +/** + * Protocol driver not attached. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EUNATCH', 49); + +/** + * No CSI structure available. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOCSI', 50); + +/** + * Level 2 halted. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EL2HLT', 51); + +/** + * Invalid exchange. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADE', 52); + +/** + * Invalid request descriptor. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADR', 53); + +/** + * Exchange full. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EXFULL', 54); + +/** + * No anode. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOANO', 55); + +/** + * Invalid request code. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADRQC', 56); + +/** + * Invalid slot. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADSLT', 57); + +/** + * Device not a stream. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSTR', 60); + +/** + * No data available. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENODATA', 61); + +/** + * Timer expired. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ETIME', 62); + +/** + * Out of streams resources. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOSR', 63); + +/** + * Machine is not on the network. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENONET', 64); + +/** + * Object is remote. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EREMOTE', 66); + +/** + * Link has been severed. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOLINK', 67); + +/** + * Advertise error. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EADV', 68); + +/** + * Srmount error. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESRMNT', 69); + +/** + * Communication error on send. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECOMM', 70); + +/** + * Protocol error. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPROTO', 71); + +/** + * Multihop attempted. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMULTIHOP', 72); + +/** + * Not a data message. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADMSG', 74); + +/** + * Name not unique on network. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTUNIQ', 76); + +/** + * File descriptor in bad state. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EBADFD', 77); + +/** + * Remote address changed. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EREMCHG', 78); + +/** + * Interrupted system call should be restarted. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ERESTART', 85); + +/** + * Streams pipe error. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESTRPIPE', 86); + +/** + * Too many users. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EUSERS', 87); + +/** + * Socket operation on non-socket. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTSOCK', 88); + +/** + * Destination address required. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EDESTADDRREQ', 89); + +/** + * Message too long. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMSGSIZE', 90); + +/** + * Protocol wrong type for socket. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPROTOTYPE', 91); +define ('SOCKET_ENOPROTOOPT', 92); + +/** + * Protocol not supported. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPROTONOSUPPORT', 93); + +/** + * Socket type not supported. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESOCKTNOSUPPORT', 94); + +/** + * Operation not supported on transport endpoint. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EOPNOTSUPP', 95); + +/** + * Protocol family not supported. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EPFNOSUPPORT', 96); + +/** + * Address family not supported by protocol. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EAFNOSUPPORT', 97); +define ('SOCKET_EADDRINUSE', 98); + +/** + * Cannot assign requested address. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EADDRNOTAVAIL', 99); + +/** + * Network is down. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENETDOWN', 100); + +/** + * Network is unreachable. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENETUNREACH', 101); + +/** + * Network dropped connection because of reset. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENETRESET', 102); + +/** + * Software caused connection abort. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECONNABORTED', 103); + +/** + * Connection reset by peer. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECONNRESET', 104); + +/** + * No buffer space available. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOBUFS', 105); + +/** + * Transport endpoint is already connected. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EISCONN', 106); + +/** + * Transport endpoint is not connected. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOTCONN', 107); + +/** + * Cannot send after transport endpoint shutdown. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ESHUTDOWN', 108); + +/** + * Too many references: cannot splice. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ETOOMANYREFS', 109); + +/** + * Connection timed out. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ETIMEDOUT', 110); + +/** + * Connection refused. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ECONNREFUSED', 111); + +/** + * Host is down. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EHOSTDOWN', 112); + +/** + * No route to host. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EHOSTUNREACH', 113); + +/** + * Operation already in progress. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EALREADY', 114); + +/** + * Operation now in progress. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EINPROGRESS', 115); + +/** + * Is a named type file. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EISNAM', 120); + +/** + * Remote I/O error. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EREMOTEIO', 121); + +/** + * Quota exceeded. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EDQUOT', 122); + +/** + * No medium found. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_ENOMEDIUM', 123); + +/** + * Wrong medium type. + * @link http://php.net/manual/en/sockets.constants.php + */ +define ('SOCKET_EMEDIUMTYPE', 124); +define ('IPPROTO_IP', 0); +define ('IPPROTO_IPV6', 41); +define ('SOL_TCP', 6); +define ('SOL_UDP', 17); + +// End of sockets v. +?> diff --git a/res/php-5.4-core-api/sqlite3.php b/res/php-5.4-core-api/sqlite3.php new file mode 100644 index 0000000..6487f57 --- /dev/null +++ b/res/php-5.4-core-api/sqlite3.php @@ -0,0 +1,512 @@ + + * Opens an SQLite database + * @link http://php.net/manual/en/sqlite3.open.php + * @param string $filename

+ * Path to the SQLite database, or :memory: to use in-memory database. + *

+ * @param int $flags [optional]

+ * Optional flags used to determine how to open the SQLite database. By + * default, open uses SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE. + *

+ * SQLITE3_OPEN_READONLY: Open the database for + * reading only. + *

+ * @param string $encryption_key [optional]

+ * An optional encryption key used when encrypting and decrypting an + * SQLite database. + *

+ * @return void + */ + public function open ($filename, $flags = 'SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE', $encryption_key = null) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Closes the database connection + * @link http://php.net/manual/en/sqlite3.close.php + * @return bool true on success, false on failure. + */ + public function close () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Executes a result-less query against a given database + * @link http://php.net/manual/en/sqlite3.exec.php + * @param string $query

+ * The SQL query to execute (typically an INSERT, UPDATE, or DELETE + * query). + *

+ * @return bool true if the query succeeded, false on failure. + */ + public function exec ($query) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the SQLite3 library version as a string constant and as a number + * @link http://php.net/manual/en/sqlite3.version.php + * @return array an associative array with the keys "versionString" and + * "versionNumber". + */ + public static function version () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the row ID of the most recent INSERT into the database + * @link http://php.net/manual/en/sqlite3.lastinsertrowid.php + * @return int the row ID of the most recent INSERT into the database + */ + public function lastInsertRowID () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the numeric result code of the most recent failed SQLite request + * @link http://php.net/manual/en/sqlite3.lasterrorcode.php + * @return int an integer value representing the numeric result code of the most + * recent failed SQLite request. + */ + public function lastErrorCode () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns English text describing the most recent failed SQLite request + * @link http://php.net/manual/en/sqlite3.lasterrormsg.php + * @return string an English string describing the most recent failed SQLite request. + */ + public function lastErrorMsg () {} + + /** + * (PHP 5 >= 5.3.3)
+ * Sets the busy connection handler + * @link http://php.net/manual/en/sqlite3.busytimeout.php + * @param int $msecs

+ * The milliseconds to sleep. Setting this value to a value less than + * or equal to zero, will turn off an already set timeout handler. + *

+ * @return bool true on success, false on failure. + */ + public function busyTimeout ($msecs) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Attempts to load an SQLite extension library + * @link http://php.net/manual/en/sqlite3.loadextension.php + * @param string $shared_library

+ * The name of the library to load. The library must be located in the + * directory specified in the configure option sqlite3.extension_dir. + *

+ * @return bool true if the extension is successfully loaded, false on failure. + */ + public function loadExtension ($shared_library) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the number of database rows that were changed (or inserted or + deleted) by the most recent SQL statement + * @link http://php.net/manual/en/sqlite3.changes.php + * @return int an integer value corresponding to the number of + * database rows changed (or inserted or deleted) by the most recent SQL + * statement. + */ + public function changes () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns a string that has been properly escaped + * @link http://php.net/manual/en/sqlite3.escapestring.php + * @param string $value

+ * The string to be escaped. + *

+ * @return string a properly escaped string that may be used safely in an SQL + * statement. + */ + public static function escapeString ($value) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Prepares an SQL statement for execution + * @link http://php.net/manual/en/sqlite3.prepare.php + * @param string $query

+ * The SQL query to prepare. + *

+ * @return SQLite3Stmt an SQLite3Stmt object on success&return.falseforfailure;. + */ + public function prepare ($query) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Executes an SQL query + * @link http://php.net/manual/en/sqlite3.query.php + * @param string $query

+ * The SQL query to execute. + *

+ * @return SQLite3Result an SQLite3Result object if the query returns results. Otherwise, + * returns true if the query succeeded, false on failure. + */ + public function query ($query) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Executes a query and returns a single result + * @link http://php.net/manual/en/sqlite3.querysingle.php + * @param string $query

+ * The SQL query to execute. + *

+ * @param bool $entire_row [optional]

+ * By default, querySingle returns the value of the + * first column returned by the query. If + * entire_row is true, then it returns an array + * of the entire first row. + *

+ * @return mixed the value of the first column of results or an array of the entire + * first row (if entire_row is true). + *

+ *

+ * If the query is valid but no results are returned, then null will be + * returned if entire_row is false, otherwise an + * empty array is returned. + *

+ *

+ * Invalid or failing queries will return false. + */ + public function querySingle ($query, $entire_row = false) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Registers a PHP function for use as an SQL scalar function + * @link http://php.net/manual/en/sqlite3.createfunction.php + * @param string $name

+ * Name of the SQL function to be created or redefined. + *

+ * @param mixed $callback

+ * The name of a PHP function or user-defined function to apply as a + * callback, defining the behavior of the SQL function. + *

+ * @param int $argument_count [optional]

+ * The number of arguments that the SQL function takes. If + * this parameter is negative, then the SQL function may take + * any number of arguments. + *

+ * @return bool true upon successful creation of the function, false on failure. + */ + public function createFunction ($name, $callback, $argument_count = -1) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Registers a PHP function for use as an SQL aggregate function + * @link http://php.net/manual/en/sqlite3.createaggregate.php + * @param string $name

+ * Name of the SQL aggregate to be created or redefined. + *

+ * @param mixed $step_callback

+ * The name of a PHP function or user-defined function to apply as a + * callback for every item in the aggregate. + *

+ * @param mixed $final_callback

+ * The name of a PHP function or user-defined function to apply as a + * callback at the end of the aggregate data. + *

+ * @param int $argument_count [optional]

+ * The number of arguments that the SQL aggregate takes. If + * this parameter is negative, then the SQL aggregate may take + * any number of arguments. + *

+ * @return bool true upon successful creation of the aggregate, false on + * failure. + */ + public function createAggregate ($name, $step_callback, $final_callback, $argument_count = -1) {} + + /** + * @param $table + * @param $column + * @param $rowid + * @param $dbname [optional] + */ + public function openBlob ($table, $column, $rowid, $dbname) {} + + /** + * @param $enableExceptions + */ + public function enableExceptions ($enableExceptions) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Instantiates an SQLite3 object and opens an SQLite 3 database + * @link http://php.net/manual/en/sqlite3.construct.php + * @param $filename + * @param $flags + * @param $encryption_key + */ + public function __construct ($filename, $flags, $encryption_key) {} + +} + +/** + * A class that handles prepared statements for the SQLite 3 extension. + * @link http://php.net/manual/en/class.sqlite3stmt.php + * @jms-builtin + */ +class SQLite3Stmt { + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the number of parameters within the prepared statement + * @link http://php.net/manual/en/sqlite3stmt.paramcount.php + * @return int the number of parameters within the prepared statement. + */ + public function paramCount () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Closes the prepared statement + * @link http://php.net/manual/en/sqlite3stmt.close.php + * @return bool true + */ + public function close () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Resets the prepared statement + * @link http://php.net/manual/en/sqlite3stmt.reset.php + * @return bool true if the statement is successfully reset, false on failure. + */ + public function reset () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Clears all current bound parameters + * @link http://php.net/manual/en/sqlite3stmt.clear.php + * @return bool true on successful clearing of bound parameters, false on + * failure. + */ + public function clear () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Executes a prepared statement and returns a result set object + * @link http://php.net/manual/en/sqlite3stmt.execute.php + * @return SQLite3Result an SQLite3Result object on successful execution of the prepared + * statement, false on failure. + */ + public function execute () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Binds a parameter to a statement variable + * @link http://php.net/manual/en/sqlite3stmt.bindparam.php + * @param string $sql_param

+ * An string identifying the statement variable to which the + * parameter should be bound. + *

+ * @param mixed $param

+ * The parameter to bind to a statement variable. + *

+ * @param int $type [optional]

+ * The data type of the parameter to bind. + *

+ * SQLITE3_INTEGER: The value is a signed integer, + * stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of + * the value. + *

+ * @return bool true if the parameter is bound to the statement variable, false + * on failure. + */ + public function bindParam ($sql_param, &$param, $type = null) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Binds the value of a parameter to a statement variable + * @link http://php.net/manual/en/sqlite3stmt.bindvalue.php + * @param string $sql_param

+ * An string identifying the statement variable to which the + * value should be bound. + *

+ * @param mixed $value

+ * The value to bind to a statement variable. + *

+ * @param int $type [optional]

+ * The data type of the value to bind. + *

+ * SQLITE3_INTEGER: The value is a signed integer, + * stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of + * the value. + *

+ * @return bool true if the value is bound to the statement variable, false + * on failure. + */ + public function bindValue ($sql_param, $value, $type = null) {} + + public function readOnly () {} + + /** + * @param $sqlite3 + */ + private function __construct ($sqlite3) {} + +} + +/** + * A class that handles result sets for the SQLite 3 extension. + * @link http://php.net/manual/en/class.sqlite3result.php + * @jms-builtin + */ +class SQLite3Result { + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the number of columns in the result set + * @link http://php.net/manual/en/sqlite3result.numcolumns.php + * @return int the number of columns in the result set. + */ + public function numColumns () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the name of the nth column + * @link http://php.net/manual/en/sqlite3result.columnname.php + * @param int $column_number

+ * The numeric zero-based index of the column. + *

+ * @return string the string name of the column identified by + * column_number. + */ + public function columnName ($column_number) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Returns the type of the nth column + * @link http://php.net/manual/en/sqlite3result.columntype.php + * @param int $column_number

+ * The numeric zero-based index of the column. + *

+ * @return int the data type index of the column identified by + * column_number (one of + * SQLITE3_INTEGER, SQLITE3_FLOAT, + * SQLITE3_TEXT, SQLITE3_BLOB, or + * SQLITE3_NULL). + */ + public function columnType ($column_number) {} + + /** + * (PHP 5 >= 5.3.0)
+ * Fetches a result row as an associative or numerically indexed array or both + * @link http://php.net/manual/en/sqlite3result.fetcharray.php + * @param int $mode [optional]

+ * Controls how the next row will be returned to the caller. This value + * must be one of either SQLITE3_ASSOC, + * SQLITE3_NUM, or SQLITE3_BOTH. + *

+ * SQLITE3_ASSOC: returns an array indexed by column + * name as returned in the corresponding result set + *

+ * @return array a result row as an associatively or numerically indexed array or + * both. + */ + public function fetchArray ($mode = 'SQLITE3_BOTH') {} + + /** + * (PHP 5 >= 5.3.0)
+ * Resets the result set back to the first row + * @link http://php.net/manual/en/sqlite3Result.reset.php + * @return bool true if the result set is successfully reset + * back to the first row, false on failure. + */ + public function reset () {} + + /** + * (PHP 5 >= 5.3.0)
+ * Closes the result set + * @link http://php.net/manual/en/sqlite3result.finalize.php + * @return bool true. + */ + public function finalize () {} + + private function __construct () {} + +} + +/** + * Specifies that the Sqlite3Result::fetchArray + * method shall return an array indexed by column name as returned in the + * corresponding result set. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_ASSOC', 1); + +/** + * Specifies that the Sqlite3Result::fetchArray + * method shall return an array indexed by column number as returned in the + * corresponding result set, starting at column 0. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_NUM', 2); + +/** + * Specifies that the Sqlite3Result::fetchArray + * method shall return an array indexed by both column name and number as + * returned in the corresponding result set, starting at column 0. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_BOTH', 3); + +/** + * Represents the SQLite3 INTEGER storage class. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_INTEGER', 1); + +/** + * Represents the SQLite3 REAL (FLOAT) storage class. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_FLOAT', 2); + +/** + * Represents the SQLite3 TEXT storage class. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_TEXT', 3); + +/** + * Represents the SQLite3 BLOB storage class. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_BLOB', 4); + +/** + * Represents the SQLite3 NULL storage class. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_NULL', 5); + +/** + * Specifies that the SQLite3 database be opened for reading only. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_OPEN_READONLY', 1); + +/** + * Specifies that the SQLite3 database be opened for reading and writing. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_OPEN_READWRITE', 2); + +/** + * Specifies that the SQLite3 database be created if it does not already + * exist. + * @link http://php.net/manual/en/sqlite3.constants.php + */ +define ('SQLITE3_OPEN_CREATE', 4); + +// End of sqlite3 v.0.7-dev +?> diff --git a/res/php-5.4-core-api/ssh2.php b/res/php-5.4-core-api/ssh2.php new file mode 100644 index 0000000..584a3c6 --- /dev/null +++ b/res/php-5.4-core-api/ssh2.php @@ -0,0 +1,799 @@ + + * Connect to an SSH server + * @link http://php.net/manual/en/function.ssh2-connect.php + * @param string $host

+ *

+ * @param int $port [optional]

+ *

+ * @param array $methods [optional]

+ * methods may be an associative array with up to four parameters + * as described below. + *

+ *

+ * + * methods may be an associative array + * with any or all of the following parameters. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IndexMeaningSupported Values*
kex + * List of key exchange methods to advertise, comma separated + * in order of preference. + * + * diffie-hellman-group1-sha1, + * diffie-hellman-group14-sha1, and + * diffie-hellman-group-exchange-sha1 + *
hostkey + * List of hostkey methods to advertise, come separated + * in order of preference. + * + * ssh-rsa and + * ssh-dss + *
client_to_server + * Associative array containing crypt, compression, and + * message authentication code (MAC) method preferences + * for messages sent from client to server. + *
server_to_client + * Associative array containing crypt, compression, and + * message authentication code (MAC) method preferences + * for messages sent from server to client. + *
+ *

+ *

+ * * - Supported Values are dependent on methods supported by underlying library. + * See libssh2 documentation for additional + * information. + *

+ *

+ * + * client_to_server and + * server_to_client may be an associative array + * with any or all of the following parameters. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IndexMeaningSupported Values*
cryptList of crypto methods to advertise, comma separated + * in order of preference. + * rijndael-cbc@lysator.liu.se, + * aes256-cbc, + * aes192-cbc, + * aes128-cbc, + * 3des-cbc, + * blowfish-cbc, + * cast128-cbc, + * arcfour, and + * none** + *
compList of compression methods to advertise, comma separated + * in order of preference. + * zlib and + * none + *
macList of MAC methods to advertise, come separated + * in order of preference. + * hmac-sha1, + * hmac-sha1-96, + * hmac-ripemd160, + * hmac-ripemd160@openssh.com, and + * none** + *
+ *

+ *

+ * Crypt and MAC method "none" + *

+ * For security reasons, none is disabled by the underlying + * libssh2 library unless explicitly enabled + * during build time by using the appropriate ./configure options. See documentation + * for the underlying library for more information. + *

+ *

+ * @param array $callbacks [optional]

+ * callbacks may be an associative array with any + * or all of the following parameters. + * + * Callbacks parameters + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
IndexMeaningPrototype
ignore + * Name of function to call when an + * SSH2_MSG_IGNORE packet is received + * void ignore_cb($message)
debug + * Name of function to call when an + * SSH2_MSG_DEBUG packet is received + * void debug_cb($message, $language, $always_display)
macerror + * Name of function to call when a packet is received but the + * message authentication code failed. If the callback returns + * true, the mismatch will be ignored, otherwise the connection + * will be terminated. + * bool macerror_cb($packet)
disconnect + * Name of function to call when an + * SSH2_MSG_DISCONNECT packet is received + * void disconnect_cb($reason, $message, $language)
+ *

+ * @return resource a resource on success, or false on error. + * @jms-builtin + */ +function ssh2_connect ($host, $port = null, $methods = nullarray , $callbacks = nullarray ) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Return list of negotiated methods + * @link http://php.net/manual/en/function.ssh2-methods-negotiated.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @return array + * @jms-builtin + */ +function ssh2_methods_negotiated ($session) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Retrieve fingerprint of remote server + * @link http://php.net/manual/en/function.ssh2-fingerprint.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @param int $flags [optional]

+ * flags may be either of + * SSH2_FINGERPRINT_MD5 or + * SSH2_FINGERPRINT_SHA1 logically ORed with + * SSH2_FINGERPRINT_HEX or + * SSH2_FINGERPRINT_RAW. + *

+ * @return string the hostkey hash as a string. + * @jms-builtin + */ +function ssh2_fingerprint ($session, $flags = null) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Authenticate as "none" + * @link http://php.net/manual/en/function.ssh2-auth-none.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @param string $username

+ * Remote user name. + *

+ * @return mixed true if the server does accept "none" as an authentication + * method, or an array of accepted authentication methods on failure. + * @jms-builtin + */ +function ssh2_auth_none ($session, $username) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Authenticate over SSH using a plain password + * @link http://php.net/manual/en/function.ssh2-auth-password.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @param string $username

+ * Remote user name. + *

+ * @param string $password

+ * Password for username + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_auth_password ($session, $username, $password) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Authenticate using a public key + * @link http://php.net/manual/en/function.ssh2-auth-pubkey-file.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @param string $username

+ *

+ * @param string $pubkeyfile

+ *

+ * @param string $privkeyfile

+ *

+ * @param string $passphrase [optional]

+ * If privkeyfile is encrypted (which it should + * be), the passphrase must be provided. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_auth_pubkey_file ($session, $username, $pubkeyfile, $privkeyfile, $passphrase = null) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Authenticate using a public hostkey + * @link http://php.net/manual/en/function.ssh2-auth-hostbased-file.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @param string $username

+ *

+ * @param string $hostname

+ *

+ * @param string $pubkeyfile

+ *

+ * @param string $privkeyfile

+ *

+ * @param string $passphrase [optional]

+ * If privkeyfile is encrypted (which it should + * be), the passphrase must be provided. + *

+ * @param string $local_username [optional]

+ * If local_username is omitted, then the value + * for username will be used for it. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_auth_hostbased_file ($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase = null, $local_username = null) {} + +/** @jms-builtin */ +function ssh2_forward_listen () {} + +/** @jms-builtin */ +function ssh2_forward_accept () {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Request an interactive shell + * @link http://php.net/manual/en/function.ssh2-shell.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @param string $term_type [optional]

+ * term_type should correspond to one of the + * entries in the target system's /etc/termcap file. + *

+ * @param array $env [optional]

+ * env may be passed as an associative array of + * name/value pairs to set in the target environment. + *

+ * @param int $width [optional]

+ * Width of the virtual terminal. + *

+ * @param int $height [optional]

+ * Height of the virtual terminal. + *

+ * @param int $width_height_type [optional]

+ * width_height_type should be one of + * SSH2_TERM_UNIT_CHARS or + * SSH2_TERM_UNIT_PIXELS. + *

+ * @return resource + * @jms-builtin + */ +function ssh2_shell ($session, $term_type = null, $env = nullarray , $width = null, $height = null, $width_height_type = null) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Execute a command on a remote server + * @link http://php.net/manual/en/function.ssh2-exec.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @param string $command

+ *

+ * @param string $pty [optional]

+ *

+ * @param array $env [optional]

+ * env may be passed as an associative array of + * name/value pairs to set in the target environment. + *

+ * @param int $width [optional]

+ * Width of the virtual terminal. + *

+ * @param int $height [optional]

+ * Height of the virtual terminal. + *

+ * @param int $width_height_type [optional]

+ * width_height_type should be one of + * SSH2_TERM_UNIT_CHARS or + * SSH2_TERM_UNIT_PIXELS. + *

+ * @return resource a stream on success&return.falseforfailure;. + * @jms-builtin + */ +function ssh2_exec ($session, $command, $pty = null, $env = nullarray , $width = null, $height = null, $width_height_type = null) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Open a tunnel through a remote server + * @link http://php.net/manual/en/function.ssh2-tunnel.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @param string $host

+ *

+ * @param int $port

+ *

+ * @return resource + * @jms-builtin + */ +function ssh2_tunnel ($session, $host, $port) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Request a file via SCP + * @link http://php.net/manual/en/function.ssh2-scp-recv.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @param string $remote_file

+ * Path to the remote file. + *

+ * @param string $local_file

+ * Path to the local file. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_scp_recv ($session, $remote_file, $local_file) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Send a file via SCP + * @link http://php.net/manual/en/function.ssh2-scp-send.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @param string $local_file

+ * Path to the local file. + *

+ * @param string $remote_file

+ * Path to the remote file. + *

+ * @param int $create_mode [optional]

+ * The file will be created with the mode specified by + * create_mode. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_scp_send ($session, $local_file, $remote_file, $create_mode = null) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Fetch an extended data stream + * @link http://php.net/manual/en/function.ssh2-fetch-stream.php + * @param resource $channel

+ *

+ * @param int $streamid

+ * An SSH2 channel stream. + *

+ * @return resource the requested stream resource. + * @jms-builtin + */ +function ssh2_fetch_stream ($channel, $streamid) {} + +/** + * @param $var1 + * @jms-builtin + */ +function ssh2_poll (&$var1) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Initialize SFTP subsystem + * @link http://php.net/manual/en/function.ssh2-sftp.php + * @param resource $session

+ * An SSH connection link identifier, obtained from a call to + * ssh2_connect. + *

+ * @return resource This method returns an SSH2 SFTP resource for use with + * all other ssh2_sftp_*() methods and the + * ssh2.sftp:// fopen wrapper. + * @jms-builtin + */ +function ssh2_sftp ($session) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Rename a remote file + * @link http://php.net/manual/en/function.ssh2-sftp-rename.php + * @param resource $sftp

+ * An SSH2 SFTP resource opened by ssh2_sftp. + *

+ * @param string $from

+ * The current file that is being renamed. + *

+ * @param string $to

+ * The new file name that replaces from. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_sftp_rename ($sftp, $from, $to) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Delete a file + * @link http://php.net/manual/en/function.ssh2-sftp-unlink.php + * @param resource $sftp

+ * An SSH2 SFTP resource opened by ssh2_sftp. + *

+ * @param string $filename

+ *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_sftp_unlink ($sftp, $filename) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Create a directory + * @link http://php.net/manual/en/function.ssh2-sftp-mkdir.php + * @param resource $sftp

+ * An SSH2 SFTP resource opened by ssh2_sftp. + *

+ * @param string $dirname

+ * Path of the new directory. + *

+ * @param int $mode [optional]

+ * Permissions on the new directory. + *

+ * @param bool $recursive [optional]

+ * If recursive is true any parent directories + * required for dirname will be automatically created as well. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_sftp_mkdir ($sftp, $dirname, $mode = null, $recursive = null) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Remove a directory + * @link http://php.net/manual/en/function.ssh2-sftp-rmdir.php + * @param resource $sftp

+ * An SSH2 SFTP resource opened by ssh2_sftp. + *

+ * @param string $dirname

+ *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_sftp_rmdir ($sftp, $dirname) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Stat a file on a remote filesystem + * @link http://php.net/manual/en/function.ssh2-sftp-stat.php + * @param resource $sftp

+ * An SSH2 SFTP resource opened by ssh2_sftp. + *

+ * @param string $path

+ *

+ * @return array See the documentation for stat for details on the + * values which may be returned. + * @jms-builtin + */ +function ssh2_sftp_stat ($sftp, $path) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Stat a symbolic link + * @link http://php.net/manual/en/function.ssh2-sftp-lstat.php + * @param resource $sftp

+ *

+ * @param string $path

+ * Path to the remote symbolic link. + *

+ * @return array See the documentation for stat for details on the + * values which may be returned. + * @jms-builtin + */ +function ssh2_sftp_lstat ($sftp, $path) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Create a symlink + * @link http://php.net/manual/en/function.ssh2-sftp-symlink.php + * @param resource $sftp

+ * An SSH2 SFTP resource opened by ssh2_sftp. + *

+ * @param string $target

+ * Target of the symbolic link. + *

+ * @param string $link

+ *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_sftp_symlink ($sftp, $target, $link) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Return the target of a symbolic link + * @link http://php.net/manual/en/function.ssh2-sftp-readlink.php + * @param resource $sftp

+ * An SSH2 SFTP resource opened by ssh2_sftp. + *

+ * @param string $link

+ * Path of the symbolic link. + *

+ * @return string the target of the symbolic link. + * @jms-builtin + */ +function ssh2_sftp_readlink ($sftp, $link) {} + +/** + * (PECL ssh2 >= 0.9.0)
+ * Resolve the realpath of a provided path string + * @link http://php.net/manual/en/function.ssh2-sftp-realpath.php + * @param resource $sftp

+ * An SSH2 SFTP resource opened by ssh2_sftp. + *

+ * @param string $filename

+ *

+ * @return string the real path as a string. + * @jms-builtin + */ +function ssh2_sftp_realpath ($sftp, $filename) {} + +/** + * (PECL ssh2 >= 0.10)
+ * Initialize Publickey subsystem + * @link http://php.net/manual/en/function.ssh2-publickey-init.php + * @param resource $session

+ *

+ * @return resource an SSH2 Publickey Subsystem resource for use + * with all other ssh2_publickey_*() methods&return.falseforfailure;. + * @jms-builtin + */ +function ssh2_publickey_init ($session) {} + +/** + * (PECL ssh2 >= 0.10)
+ * Add an authorized publickey + * @link http://php.net/manual/en/function.ssh2-publickey-add.php + * @param resource $pkey

+ * Publickey Subsystem resource created by ssh2_publickey_init. + *

+ * @param string $algoname

+ * Publickey algorithm (e.g.): ssh-dss, ssh-rsa + *

+ * @param string $blob

+ * Publickey blob as raw binary data + *

+ * @param bool $overwrite [optional]

+ * If the specified key already exists, should it be overwritten? + *

+ * @param array $attributes [optional]

+ * Associative array of attributes to assign to this public key. + * Refer to ietf-secsh-publickey-subsystem for a list of supported attributes. + * To mark an attribute as mandatory, precede its name with an asterisk. + * If the server is unable to support an attribute marked mandatory, + * it will abort the add process. + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_publickey_add ($pkey, $algoname, $blob, $overwrite = null, $attributes = nullarray ) {} + +/** + * (PECL ssh2 >= 0.10)
+ * Remove an authorized publickey + * @link http://php.net/manual/en/function.ssh2-publickey-remove.php + * @param resource $pkey

+ * Publickey Subsystem Resource + *

+ * @param string $algoname

+ * Publickey algorithm (e.g.): ssh-dss, ssh-rsa + *

+ * @param string $blob

+ * Publickey blob as raw binary data + *

+ * @return bool Returns true on success or false on failure. + * @jms-builtin + */ +function ssh2_publickey_remove ($pkey, $algoname, $blob) {} + +/** + * (PECL ssh2 >= 0.10)
+ * List currently authorized publickeys + * @link http://php.net/manual/en/function.ssh2-publickey-list.php + * @param resource $pkey

+ * Publickey Subsystem resource + *

+ * @return array a numerically indexed array of keys, + * each of which is an associative array containing: + * name, blob, and attrs elements. + *

+ *

+ * + * Publickey elements + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Array KeyMeaning
nameName of algorithm used by this publickey, for example: + * ssh-dss or ssh-rsa.
blobPublickey blob as raw binary data.
attrsAttributes assigned to this publickey. The most common + * attribute, and the only one supported by publickey version 1 + * servers, is comment, which may be any freeform + * string.
+ * @jms-builtin + */ +function ssh2_publickey_list ($pkey) {} + + +/** + * Flag to ssh2_fingerprint requesting hostkey + * fingerprint as an MD5 hash. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_FINGERPRINT_MD5', 0); + +/** + * Flag to ssh2_fingerprint requesting hostkey + * fingerprint as an SHA1 hash. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_FINGERPRINT_SHA1', 1); + +/** + * Flag to ssh2_fingerprint requesting hostkey + * fingerprint as a string of hexits. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_FINGERPRINT_HEX', 0); + +/** + * Flag to ssh2_fingerprint requesting hostkey + * fingerprint as a raw string of 8-bit characters. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_FINGERPRINT_RAW', 2); + +/** + * Flag to ssh2_shell specifying that + * width and height + * are provided as character sizes. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_TERM_UNIT_CHARS', 0); + +/** + * Flag to ssh2_shell specifying that + * width and height + * are provided in pixel units. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_TERM_UNIT_PIXELS', 1); + +/** + * Default terminal type (e.g. vt102, ansi, xterm, vanilla) requested + * by ssh2_shell. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_DEFAULT_TERMINAL', "vanilla"); + +/** + * Default terminal width requested by ssh2_shell. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_DEFAULT_TERM_WIDTH', 80); + +/** + * Default terminal height requested by ssh2_shell. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_DEFAULT_TERM_HEIGHT', 25); + +/** + * Default terminal units requested by ssh2_shell. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_DEFAULT_TERM_UNIT', 0); + +/** + * Flag to ssh2_fetch_stream requesting STDIO subchannel. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_STREAM_STDIO', 0); + +/** + * Flag to ssh2_fetch_stream requesting STDERR subchannel. + * @link http://php.net/manual/en/ssh2.constants.php + */ +define ('SSH2_STREAM_STDERR', 1); +define ('SSH2_POLLIN', 1); +define ('SSH2_POLLEXT', 2); +define ('SSH2_POLLOUT', 4); +define ('SSH2_POLLERR', 8); +define ('SSH2_POLLHUP', 16); +define ('SSH2_POLLNVAL', 32); +define ('SSH2_POLL_SESSION_CLOSED', 16); +define ('SSH2_POLL_CHANNEL_CLOSED', 128); +define ('SSH2_POLL_LISTENER_CLOSED', 128); + +// End of ssh2 v.0.11.0-dev +?> diff --git a/res/php-5.4-core-api/standard.php b/res/php-5.4-core-api/standard.php new file mode 100644 index 0000000..1f0d10f --- /dev/null +++ b/res/php-5.4-core-api/standard.php @@ -0,0 +1,12852 @@ + + * Returns the value of a constant + * @link http://php.net/manual/en/function.constant.php + * @param string $name

+ * The constant name. + *

+ * @return mixed the value of the constant, or NULL if the constant is not + * defined. + * @jms-builtin + */ +function constant ($name) {} + +/** + * (PHP 4, PHP 5)
+ * Convert binary data into hexadecimal representation + * @link http://php.net/manual/en/function.bin2hex.php + * @param string $str

+ * A string. + *

+ * @return string the hexadecimal representation of the given string. + * @jms-builtin + */ +function bin2hex ($str) {} + +/** + * (PHP >= 5.4.0)
+ * Decodes a hexadecimally encoded binary string + * @link http://php.net/manual/en/function.hex2bin.php + * @param string $data

+ * Hexadecimal representation of data. + *

+ * @return string the binary representation of the given data or FALSE on failure. + * @jms-builtin + */ +function hex2bin ($data) {} + +/** + * (PHP 4, PHP 5)
+ * Delay execution + * @link http://php.net/manual/en/function.sleep.php + * @param int $seconds

+ * Halt time in seconds. + *

+ * @return int zero on success, or FALSE on error. + *

+ *

+ * If the call was interrupted by a signal, sleep returns + * a non-zero value. On Windows, this value will always be + * 192 (the value of the + * WAIT_IO_COMPLETION constant within the Windows API). + * On other platforms, the return value will be the number of seconds left to + * sleep. + * @jms-builtin + */ +function sleep ($seconds) {} + +/** + * (PHP 4, PHP 5)
+ * Delay execution in microseconds + * @link http://php.net/manual/en/function.usleep.php + * @param int $micro_seconds

+ * Halt time in micro seconds. A micro second is one millionth of a + * second. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function usleep ($micro_seconds) {} + +/** + * (PHP 5)
+ * Delay for a number of seconds and nanoseconds + * @link http://php.net/manual/en/function.time-nanosleep.php + * @param int $seconds

+ * Must be a non-negative integer. + *

+ * @param int $nanoseconds

+ * Must be a non-negative integer less than 1 billion. + *

+ * @return mixed TRUE on success or FALSE on failure. + *

+ *

+ * If the delay was interrupted by a signal, an associative array will be + * returned with the components: + * seconds - number of seconds remaining in + * the delay + * nanoseconds - number of nanoseconds + * remaining in the delay + * @jms-builtin + */ +function time_nanosleep ($seconds, $nanoseconds) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Make the script sleep until the specified time + * @link http://php.net/manual/en/function.time-sleep-until.php + * @param float $timestamp

+ * The timestamp when the script should wake. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function time_sleep_until ($timestamp) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Parse a time/date generated with strftime + * @link http://php.net/manual/en/function.strptime.php + * @param string $date

+ * The string to parse (e.g. returned from strftime). + *

+ * @param string $format

+ * The format used in date (e.g. the same as + * used in strftime). Note that some of the format + * options available to strftime may not have any + * effect within strptime; the exact subset that are + * supported will vary based on the operating system and C library in + * use. + *

+ *

+ * For more information about the format options, read the + * strftime page. + *

+ * @return array an array or FALSE on failure. + *

+ *

+ * + * The following parameters are returned in the array + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
parametersDescription
"tm_sec"Seconds after the minute (0-61)
"tm_min"Minutes after the hour (0-59)
"tm_hour"Hour since midnight (0-23)
"tm_mday"Day of the month (1-31)
"tm_mon"Months since January (0-11)
"tm_year"Years since 1900
"tm_wday"Days since Sunday (0-6)
"tm_yday"Days since January 1 (0-365)
"unparsed"the date part which was not + * recognized using the specified format
+ * @jms-builtin + */ +function strptime ($date, $format) {} + +/** + * (PHP 4, PHP 5)
+ * Flush the output buffer + * @link http://php.net/manual/en/function.flush.php + * @return void No value is returned. + * @jms-builtin + */ +function flush () {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Wraps a string to a given number of characters + * @link http://php.net/manual/en/function.wordwrap.php + * @param string $str

+ * The input string. + *

+ * @param int $width [optional]

+ * The column width. + *

+ * @param string $break [optional]

+ * The line is broken using the optional + * break parameter. + *

+ * @param bool $cut [optional]

+ * If the cut is set to TRUE, the string is + * always wrapped at or before the specified width. So if you have + * a word that is larger than the given width, it is broken apart. + * (See second example). + *

+ * @return string the given string wrapped at the specified column. + * @jms-builtin + */ +function wordwrap ($str, $width = 75, $break = "\n", $cut = false) {} + +/** + * (PHP 4, PHP 5)
+ * Convert special characters to HTML entities + * @link http://php.net/manual/en/function.htmlspecialchars.php + * @param string $string

+ * The string being converted. + *

+ * @param int $flags [optional]

+ * A bitmask of one or more of the following flags, which specify how to handle quotes, + * invalid code unit sequences and the used document type. The default is + * ENT_COMPAT | ENT_HTML401. + * + * Available flags constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATWill convert double-quotes and leave single-quotes alone.
ENT_QUOTESWill convert both double and single quotes.
ENT_NOQUOTESWill leave both double and single quotes unconverted.
ENT_IGNORE + * Silently discard invalid code unit sequences instead of returning + * an empty string. Using this flag is discouraged as it + * may have security implications. + *
ENT_SUBSTITUTE + * Replace invalid code unit sequences with a Unicode Replacement Character + * U+FFFD (UTF-8) or &#38;#FFFD; (otherwise) instead of returning an empty string. + *
ENT_DISALLOWED + * Replace invalid code points for the given document type with a + * Unicode Replacement Character U+FFFD (UTF-8) or &#38;#FFFD; + * (otherwise) instead of leaving them as is. This may be useful, for + * instance, to ensure the well-formedness of XML documents with + * embedded external content. + *
ENT_HTML401 + * Handle code as HTML 4.01. + *
ENT_XML1 + * Handle code as XML 1. + *
ENT_XHTML + * Handle code as XHTML. + *
ENT_HTML5 + * Handle code as HTML 5. + *
+ *

+ * @param string $encoding [optional]

+ * Defines encoding used in conversion. + * If omitted, the default value for this argument is ISO-8859-1 in + * versions of PHP prior to 5.4.0, and UTF-8 from PHP 5.4.0 onwards. + *

+ *

+ * For the purposes of this function, the encodings + * ISO-8859-1, ISO-8859-15, + * UTF-8, cp866, + * cp1251, cp1252, and + * KOI8-R are effectively equivalent, provided the + * string itself is valid for the encoding, as + * the characters affected by htmlspecialchars occupy + * the same positions in all of these encodings. + *

+ * @param bool $double_encode [optional]

+ * When double_encode is turned off PHP will not + * encode existing html entities, the default is to convert everything. + *

+ * @return string The converted string. + *

+ *

+ * If the input string contains an invalid code unit + * sequence within the given encoding an empty string + * will be returned, unless either the ENT_IGNORE or + * ENT_SUBSTITUTE flags are set. + * @jms-builtin + */ +function htmlspecialchars ($string, $flags = 'ENT_COMPAT | ENT_HTML401', $encoding = 'UTF-8', $double_encode = true) {} + +/** + * (PHP 4, PHP 5)
+ * Convert all applicable characters to HTML entities + * @link http://php.net/manual/en/function.htmlentities.php + * @param string $string

+ * The input string. + *

+ * @param int $flags [optional]

+ * A bitmask of one or more of the following flags, which specify how to handle quotes, + * invalid code unit sequences and the used document type. The default is + * ENT_COMPAT | ENT_HTML401. + * + * Available flags constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATWill convert double-quotes and leave single-quotes alone.
ENT_QUOTESWill convert both double and single quotes.
ENT_NOQUOTESWill leave both double and single quotes unconverted.
ENT_IGNORE + * Silently discard invalid code unit sequences instead of returning + * an empty string. Using this flag is discouraged as it + * may have security implications. + *
ENT_SUBSTITUTE + * Replace invalid code unit sequences with a Unicode Replacement Character + * U+FFFD (UTF-8) or &#38;#FFFD; (otherwise) instead of returning an empty string. + *
ENT_DISALLOWED + * Replace invalid code points for the given document type with a + * Unicode Replacement Character U+FFFD (UTF-8) or &#38;#FFFD; + * (otherwise) instead of leaving them as is. This may be useful, for + * instance, to ensure the well-formedness of XML documents with + * embedded external content. + *
ENT_HTML401 + * Handle code as HTML 4.01. + *
ENT_XML1 + * Handle code as XML 1. + *
ENT_XHTML + * Handle code as XHTML. + *
ENT_HTML5 + * Handle code as HTML 5. + *
+ *

+ * @param string $encoding [optional]

+ * Like htmlspecialchars, + * htmlentities takes an optional third argument + * encoding which defines encoding used in + * conversion. + * If omitted, the default value for this argument is ISO-8859-1 in + * versions of PHP prior to 5.4.0, and UTF-8 from PHP 5.4.0 onwards. + * Although this argument is technically optional, you are highly + * encouraged to specify the correct value for your code. + *

+ * @param bool $double_encode [optional]

+ * When double_encode is turned off PHP will not + * encode existing html entities. The default is to convert everything. + *

+ * @return string the encoded string. + *

+ *

+ * If the input string contains an invalid code unit + * sequence within the given encoding an empty string + * will be returned, unless either the ENT_IGNORE or + * ENT_SUBSTITUTE flags are set. + * @jms-builtin + */ +function htmlentities ($string, $flags = 'ENT_COMPAT | ENT_HTML401', $encoding = 'UTF-8', $double_encode = true) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Convert all HTML entities to their applicable characters + * @link http://php.net/manual/en/function.html-entity-decode.php + * @param string $string

+ * The input string. + *

+ * @param int $flags [optional]

+ * A bitmask of one or more of the following flags, which specify how to handle quotes and + * which document type to use. The default is ENT_COMPAT | ENT_HTML401. + * + * Available flags constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATWill convert double-quotes and leave single-quotes alone.
ENT_QUOTESWill convert both double and single quotes.
ENT_NOQUOTESWill leave both double and single quotes unconverted.
ENT_HTML401 + * Handle code as HTML 4.01. + *
ENT_XML1 + * Handle code as XML 1. + *
ENT_XHTML + * Handle code as XHTML. + *
ENT_HTML5 + * Handle code as HTML 5. + *
+ *

+ * @param string $encoding [optional]

+ * Encoding to use. + * If omitted, the default value for this argument is ISO-8859-1 in + * versions of PHP prior to 5.4.0, and UTF-8 from PHP 5.4.0 onwards. + *

+ * @return string the decoded string. + * @jms-builtin + */ +function html_entity_decode ($string, $flags = 'ENT_COMPAT | ENT_HTML401', $encoding = 'UTF-8') {} + +/** + * (PHP 5 >= 5.1.0)
+ * Convert special HTML entities back to characters + * @link http://php.net/manual/en/function.htmlspecialchars-decode.php + * @param string $string

+ * The string to decode. + *

+ * @param int $flags [optional]

+ * A bitmask of one or more of the following flags, which specify how to handle quotes and + * which document type to use. The default is ENT_COMPAT | ENT_HTML401. + * + * Available flags constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATWill convert double-quotes and leave single-quotes alone.
ENT_QUOTESWill convert both double and single quotes.
ENT_NOQUOTESWill leave both double and single quotes unconverted.
ENT_HTML401 + * Handle code as HTML 4.01. + *
ENT_XML1 + * Handle code as XML 1. + *
ENT_XHTML + * Handle code as XHTML. + *
ENT_HTML5 + * Handle code as HTML 5. + *
+ *

+ * @return string the decoded string. + * @jms-builtin + */ +function htmlspecialchars_decode ($string, $flags = 'ENT_COMPAT | ENT_HTML401') {} + +/** + * (PHP 4, PHP 5)
+ * Returns the translation table used by htmlspecialchars and htmlentities + * @link http://php.net/manual/en/function.get-html-translation-table.php + * @param int $table [optional]

+ * Which table to return. Either HTML_ENTITIES or + * HTML_SPECIALCHARS. + *

+ * @param int $flags [optional]

+ * A bitmask of one or more of the following flags, which specify which quotes the + * table will contain as well as which document type the table is for. The default is + * ENT_COMPAT | ENT_HTML401. + * + * Available flags constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Constant NameDescription
ENT_COMPATTable will contain entities for double-quotes, but not for single-quotes.
ENT_QUOTESTable will contain entities for both double and single quotes.
ENT_NOQUOTESTable will neither contain entities for single quotes nor for double quotes.
ENT_HTML401Table for HTML 4.01.
ENT_XML1Table for XML 1.
ENT_XHTMLTable for XHTML.
ENT_HTML5Table for HTML 5.
+ *

+ * @param string $encoding [optional]

+ * Encoding to use. + * If omitted, the default value for this argument is ISO-8859-1 in + * versions of PHP prior to 5.4.0, and UTF-8 from PHP 5.4.0 onwards. + *

+ * @return array the translation table as an array, with the original characters + * as keys and entities as values. + * @jms-builtin + */ +function get_html_translation_table ($table = 'HTML_SPECIALCHARS', $flags = 'ENT_COMPAT | ENT_HTML401', $encoding = 'UTF-8') {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Calculate the sha1 hash of a string + * @link http://php.net/manual/en/function.sha1.php + * @param string $str

+ * The input string. + *

+ * @param bool $raw_output [optional]

+ * If the optional raw_output is set to TRUE, + * then the sha1 digest is instead returned in raw binary format with a + * length of 20, otherwise the returned value is a 40-character + * hexadecimal number. + *

+ * @return string the sha1 hash as a string. + * @jms-builtin + */ +function sha1 ($str, $raw_output = false) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Calculate the sha1 hash of a file + * @link http://php.net/manual/en/function.sha1-file.php + * @param string $filename

+ * The filename of the file to hash. + *

+ * @param bool $raw_output [optional]

+ * When TRUE, returns the digest in raw binary format with a length of + * 20. + *

+ * @return string a string on success, FALSE otherwise. + * @jms-builtin + */ +function sha1_file ($filename, $raw_output = false) {} + +/** + * (PHP 4, PHP 5)
+ * Calculate the md5 hash of a string + * @link http://php.net/manual/en/function.md5.php + * @param string $str

+ * The string. + *

+ * @param bool $raw_output [optional]

+ * If the optional raw_output is set to TRUE, + * then the md5 digest is instead returned in raw binary format with a + * length of 16. + *

+ * @return string the hash as a 32-character hexadecimal number. + * @jms-builtin + */ +function md5 ($str, $raw_output = false) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Calculates the md5 hash of a given file + * @link http://php.net/manual/en/function.md5-file.php + * @param string $filename

+ * The filename + *

+ * @param bool $raw_output [optional]

+ * When TRUE, returns the digest in raw binary format with a length of + * 16. + *

+ * @return string a string on success, FALSE otherwise. + * @jms-builtin + */ +function md5_file ($filename, $raw_output = false) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Calculates the crc32 polynomial of a string + * @link http://php.net/manual/en/function.crc32.php + * @param string $str

+ * The data. + *

+ * @return int the crc32 checksum of str as an integer. + * @jms-builtin + */ +function crc32 ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Parse a binary IPTC block into single tags. + * @link http://php.net/manual/en/function.iptcparse.php + * @param string $iptcblock

+ * A binary IPTC block. + *

+ * @return array an array using the tagmarker as an index and the value as the + * value. It returns FALSE on error or if no IPTC data was found. + * @jms-builtin + */ +function iptcparse ($iptcblock) {} + +/** + * (PHP 4, PHP 5)
+ * Embeds binary IPTC data into a JPEG image + * @link http://php.net/manual/en/function.iptcembed.php + * @param string $iptcdata

+ * The data to be written. + *

+ * @param string $jpeg_file_name

+ * Path to the JPEG image. + *

+ * @param int $spool [optional]

+ * Spool flag. If the spool flag is over 2 then the JPEG will be + * returned as a string. + *

+ * @return mixed If success and spool flag is lower than 2 then the JPEG will not be + * returned as a string, FALSE on errors. + * @jms-builtin + */ +function iptcembed ($iptcdata, $jpeg_file_name, $spool = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get the size of an image + * @link http://php.net/manual/en/function.getimagesize.php + * @param string $filename

+ * This parameter specifies the file you wish to retrieve information + * about. It can reference a local file or (configuration permitting) a + * remote file using one of the supported streams. + *

+ * @param array $imageinfo [optional]

+ * This optional parameter allows you to extract some extended + * information from the image file. Currently, this will return the + * different JPG APP markers as an associative array. + * Some programs use these APP markers to embed text information in + * images. A very common one is to embed + * IPTC information in the APP13 marker. + * You can use the iptcparse function to parse the + * binary APP13 marker into something readable. + *

+ * @return array an array with 7 elements. + *

+ *

+ * Index 0 and 1 contains respectively the width and the height of the image. + *

+ *

+ * Some formats may contain no image or may contain multiple images. In these + * cases, getimagesize might not be able to properly + * determine the image size. getimagesize will return + * zero for width and height in these cases. + *

+ *

+ * Index 2 is one of the IMAGETYPE_XXX constants indicating + * the type of the image. + *

+ *

+ * Index 3 is a text string with the correct + * height="yyy" width="xxx" string that can be used + * directly in an IMG tag. + *

+ *

+ * mime is the correspondant MIME type of the image. + * This information can be used to deliver images with the correct HTTP + * Content-type header: + * getimagesize and MIME types + * + * $size = getimagesize($filename); + * $fp = fopen($filename, "rb"); + * if ($size && $fp) { + * header("Content-type: {$size['mime']}"); + * fpassthru($fp); + * exit; + * } else { + * // error + * } + * + *

+ *

+ * channels will be 3 for RGB pictures and 4 for CMYK + * pictures. + *

+ *

+ * bits is the number of bits for each color. + *

+ *

+ * For some image types, the presence of channels and + * bits values can be a bit + * confusing. As an example, GIF always uses 3 channels + * per pixel, but the number of bits per pixel cannot be calculated for an + * animated GIF with a global color table. + *

+ *

+ * On failure, FALSE is returned. + * @jms-builtin + */ +function getimagesize ($filename, array &$imageinfo = null) {} + +/** + * (PHP 5 >= 5.4.0)
+ * Get the size of an image from a string + * @link http://php.net/manual/en/function.getimagesizefromstring.php + * @param string $imagedata

+ * The image data, as a string. + *

+ * @param array $imageinfo [optional]

+ * See getimagesize. + *

+ * @return array See getimagesize. + * @jms-builtin + */ +function getimagesizefromstring ($imagedata, array &$imageinfo = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Get Mime-Type for image-type returned by getimagesize, +exif_read_data, exif_thumbnail, exif_imagetype + * @link http://php.net/manual/en/function.image-type-to-mime-type.php + * @param int $imagetype

+ * One of the IMAGETYPE_XXX constants. + *

+ * @return string The returned values are as follows + * + * Returned values Constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
imagetypeReturned value
IMAGETYPE_GIFimage/gif
IMAGETYPE_JPEGimage/jpeg
IMAGETYPE_PNGimage/png
IMAGETYPE_SWFapplication/x-shockwave-flash
IMAGETYPE_PSDimage/psd
IMAGETYPE_BMPimage/bmp
IMAGETYPE_TIFF_II (intel byte order)image/tiff
+ * IMAGETYPE_TIFF_MM (motorola byte order) + * image/tiff
IMAGETYPE_JPCapplication/octet-stream
IMAGETYPE_JP2image/jp2
IMAGETYPE_JPXapplication/octet-stream
IMAGETYPE_JB2application/octet-stream
IMAGETYPE_SWCapplication/x-shockwave-flash
IMAGETYPE_IFFimage/iff
IMAGETYPE_WBMPimage/vnd.wap.wbmp
IMAGETYPE_XBMimage/xbm
IMAGETYPE_ICOimage/vnd.microsoft.icon
+ * @jms-builtin + */ +function image_type_to_mime_type ($imagetype) {} + +/** + * (PHP 5)
+ * Get file extension for image type + * @link http://php.net/manual/en/function.image-type-to-extension.php + * @param int $imagetype

+ * One of the IMAGETYPE_XXX constant. + *

+ * @param bool $include_dot [optional]

+ * Whether to prepend a dot to the extension or not. Default to TRUE. + *

+ * @return string A string with the extension corresponding to the given image type. + * @jms-builtin + */ +function image_type_to_extension ($imagetype, $include_dot = '&true;') {} + +/** + * (PHP 4, PHP 5)
+ * Outputs information about PHP's configuration + * @link http://php.net/manual/en/function.phpinfo.php + * @param int $what [optional]

+ * The output may be customized by passing one or more of the + * following constants bitwise values summed + * together in the optional what parameter. + * One can also combine the respective constants or bitwise values + * together with the or operator. + *

+ *

+ * + * phpinfo options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Name (constant)ValueDescription
INFO_GENERAL1 + * The configuration line, php.ini location, build date, Web + * Server, System and more. + *
INFO_CREDITS2 + * PHP Credits. See also phpcredits. + *
INFO_CONFIGURATION4 + * Current Local and Master values for PHP directives. See + * also ini_get. + *
INFO_MODULES8 + * Loaded modules and their respective settings. See also + * get_loaded_extensions. + *
INFO_ENVIRONMENT16 + * Environment Variable information that's also available in + * $_ENV. + *
INFO_VARIABLES32 + * Shows all + * predefined variables from EGPCS (Environment, GET, + * POST, Cookie, Server). + *
INFO_LICENSE64 + * PHP License information. See also the license FAQ. + *
INFO_ALL-1 + * Shows all of the above. + *
+ *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function phpinfo ($what = 'INFO_ALL') {} + +/** + * (PHP 4, PHP 5)
+ * Gets the current PHP version + * @link http://php.net/manual/en/function.phpversion.php + * @param string $extension [optional]

+ * An optional extension name. + *

+ * @return string If the optional extension parameter is + * specified, phpversion returns the version of that + * extension, or FALSE if there is no version information associated or + * the extension isn't enabled. + * @jms-builtin + */ +function phpversion ($extension = null) {} + +/** + * (PHP 4, PHP 5)
+ * Prints out the credits for PHP + * @link http://php.net/manual/en/function.phpcredits.php + * @param int $flag [optional]

+ * To generate a custom credits page, you may want to use the + * flag parameter. + *

+ *

+ * + * Pre-defined phpcredits flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
namedescription
CREDITS_ALL + * All the credits, equivalent to using: CREDITS_DOCS + + * CREDITS_GENERAL + CREDITS_GROUP + + * CREDITS_MODULES + CREDITS_FULLPAGE. + * It generates a complete stand-alone HTML page with the appropriate tags. + *
CREDITS_DOCSThe credits for the documentation team
CREDITS_FULLPAGE + * Usually used in combination with the other flags. Indicates + * that a complete stand-alone HTML page needs to be + * printed including the information indicated by the other + * flags. + *
CREDITS_GENERAL + * General credits: Language design and concept, PHP authors + * and SAPI module. + *
CREDITS_GROUPA list of the core developers
CREDITS_MODULES + * A list of the extension modules for PHP, and their authors + *
CREDITS_SAPI + * A list of the server API modules for PHP, and their authors + *
+ *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function phpcredits ($flag = 'CREDITS_ALL') {} + +/** + * (PHP 4, PHP 5)
+ * Gets the logo guid + * @link http://php.net/manual/en/function.php-logo-guid.php + * @return string PHPE9568F34-D428-11d2-A769-00AA001ACF42. + * @jms-builtin + */ +function php_logo_guid () {} + +/** @jms-builtin */ +function php_real_logo_guid () {} + +/** @jms-builtin */ +function php_egg_logo_guid () {} + +/** + * (PHP 4, PHP 5)
+ * Gets the Zend guid + * @link http://php.net/manual/en/function.zend-logo-guid.php + * @return string PHPE9568F35-D428-11d2-A769-00AA001ACF42. + * @jms-builtin + */ +function zend_logo_guid () {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Returns the type of interface between web server and PHP + * @link http://php.net/manual/en/function.php-sapi-name.php + * @return string the interface type, as a lowercase string. + *

+ *

+ * Although not exhaustive, the possible return values include + * aolserver, apache, + * apache2filter, apache2handler, + * caudium, cgi (until PHP 5.3), + * cgi-fcgi, cli, + * continuity, embed, + * isapi, litespeed, + * milter, nsapi, + * phttpd, pi3web, roxen, + * thttpd, tux, and webjames. + * @jms-builtin + */ +function php_sapi_name () {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Returns information about the operating system PHP is running on + * @link http://php.net/manual/en/function.php-uname.php + * @param string $mode [optional]

+ * mode is a single character that defines what + * information is returned: + * 'a': This is the default. Contains all modes in + * the sequence "s n r v m". + * @return string the description, as a string. + * @jms-builtin + */ +function php_uname ($mode = "a") {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Return a list of .ini files parsed from the additional ini dir + * @link http://php.net/manual/en/function.php-ini-scanned-files.php + * @return string a comma-separated string of .ini files on success. Each comma is + * followed by a newline. If the directive --with-config-file-scan-dir wasn't set, + * FALSE is returned. If it was set and the directory was empty, an + * empty string is returned. If a file is unrecognizable, the file will + * still make it into the returned string but a PHP error will also result. + * This PHP error will be seen both at compile time and while using + * php_ini_scanned_files. + * @jms-builtin + */ +function php_ini_scanned_files () {} + +/** + * (PHP 5 >= 5.2.4)
+ * Retrieve a path to the loaded php.ini file + * @link http://php.net/manual/en/function.php-ini-loaded-file.php + * @return string The loaded php.ini path, or FALSE if one is not loaded. + * @jms-builtin + */ +function php_ini_loaded_file () {} + +/** + * (PHP 4, PHP 5)
+ * String comparisons using a "natural order" algorithm + * @link http://php.net/manual/en/function.strnatcmp.php + * @param string $str1

+ * The first string. + *

+ * @param string $str2

+ * The second string. + *

+ * @return int Similar to other string comparison functions, this one returns < 0 if + * str1 is less than str2; > + * 0 if str1 is greater than + * str2, and 0 if they are equal. + * @jms-builtin + */ +function strnatcmp ($str1, $str2) {} + +/** + * (PHP 4, PHP 5)
+ * Case insensitive string comparisons using a "natural order" algorithm + * @link http://php.net/manual/en/function.strnatcasecmp.php + * @param string $str1

+ * The first string. + *

+ * @param string $str2

+ * The second string. + *

+ * @return int Similar to other string comparison functions, this one returns < 0 if + * str1 is less than str2 > + * 0 if str1 is greater than + * str2, and 0 if they are equal. + * @jms-builtin + */ +function strnatcasecmp ($str1, $str2) {} + +/** + * (PHP 4, PHP 5)
+ * Count the number of substring occurrences + * @link http://php.net/manual/en/function.substr-count.php + * @param string $haystack

+ * The string to search in + *

+ * @param string $needle

+ * The substring to search for + *

+ * @param int $offset [optional]

+ * The offset where to start counting + *

+ * @param int $length [optional]

+ * The maximum length after the specified offset to search for the + * substring. It outputs a warning if the offset plus the length is + * greater than the haystack length. + *

+ * @return int This function returns an integer. + * @jms-builtin + */ +function substr_count ($haystack, $needle, $offset = 0, $length = null) {} + +/** + * (PHP 4, PHP 5)
+ * Finds the length of the initial segment of a string consisting +entirely of characters contained within a given mask. + * @link http://php.net/manual/en/function.strspn.php + * @param string $subject

+ * The string to examine. + *

+ * @param string $mask

+ * The list of allowable characters. + *

+ * @param int $start [optional]

+ * The position in subject to + * start searching. + *

+ *

+ * If start is given and is non-negative, + * then strspn will begin + * examining subject at + * the start'th position. For instance, in + * the string 'abcdef', the character at + * position 0 is 'a', the + * character at position 2 is + * 'c', and so forth. + *

+ *

+ * If start is given and is negative, + * then strspn will begin + * examining subject at + * the start'th position from the end + * of subject. + *

+ * @param int $length [optional]

+ * The length of the segment from subject + * to examine. + *

+ *

+ * If length is given and is non-negative, + * then subject will be examined + * for length characters after the starting + * position. + *

+ *

+ * If lengthis given and is negative, + * then subject will be examined from the + * starting position up to length + * characters from the end of subject. + *

+ * @return int the length of the initial segment of subject + * which consists entirely of characters in mask. + * @jms-builtin + */ +function strspn ($subject, $mask, $start = null, $length = null) {} + +/** + * (PHP 4, PHP 5)
+ * Find length of initial segment not matching mask + * @link http://php.net/manual/en/function.strcspn.php + * @param string $str1

+ * The first string. + *

+ * @param string $str2

+ * The second string. + *

+ * @param int $start [optional]

+ * The start position of the string to examine. + *

+ * @param int $length [optional]

+ * The length of the string to examine. + *

+ * @return int the length of the segment as an integer. + * @jms-builtin + */ +function strcspn ($str1, $str2, $start = null, $length = null) {} + +/** + * (PHP 4, PHP 5)
+ * Tokenize string + * @link http://php.net/manual/en/function.strtok.php + * @param string $str

+ * The string being split up into smaller strings (tokens). + *

+ * @param string $token

+ * The delimiter used when splitting up str. + *

+ * @return string A string token. + * @jms-builtin + */ +function strtok ($str, $token) {} + +/** + * (PHP 4, PHP 5)
+ * Make a string uppercase + * @link http://php.net/manual/en/function.strtoupper.php + * @param string $string

+ * The input string. + *

+ * @return string the uppercased string. + * @jms-builtin + */ +function strtoupper ($string) {} + +/** + * (PHP 4, PHP 5)
+ * Make a string lowercase + * @link http://php.net/manual/en/function.strtolower.php + * @param string $str

+ * The input string. + *

+ * @return string the lowercased string. + * @jms-builtin + */ +function strtolower ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Find the position of the first occurrence of a substring in a string + * @link http://php.net/manual/en/function.strpos.php + * @param string $haystack

+ * The string to search in. + *

+ * @param mixed $needle

+ * If needle is not a string, it is converted + * to an integer and applied as the ordinal value of a character. + *

+ * @param int $offset [optional]

+ * If specified, search will start this number of characters counted from + * the beginning of the string. Unlike strrpos and + * strripos, the offset cannot be negative. + *

+ * @return int the position of where the needle exists relative to the beginning of + * the haystack string (independent of offset). + * Also note that string positions start at 0, and not 1. + *

+ *

+ * Returns FALSE if the needle was not found. + * @jms-builtin + */ +function strpos ($haystack, $needle, $offset = 0) {} + +/** + * (PHP 5)
+ * Find the position of the first occurrence of a case-insensitive substring in a string + * @link http://php.net/manual/en/function.stripos.php + * @param string $haystack

+ * The string to search in. + *

+ * @param string $needle

+ * Note that the needle may be a string of one or + * more characters. + *

+ *

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @param int $offset [optional]

+ * If specified, search will start this number of characters counted from + * the beginning of the string. Unlike strrpos and + * strripos, the offset cannot be negative. + *

+ * @return int the position of where the needle exists relative to the beginnning of + * the haystack string (independent of offset). + * Also note that string positions start at 0, and not 1. + *

+ *

+ * Returns FALSE if the needle was not found. + * @jms-builtin + */ +function stripos ($haystack, $needle, $offset = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Find the position of the last occurrence of a substring in a string + * @link http://php.net/manual/en/function.strrpos.php + * @param string $haystack

+ * The string to search in. + *

+ * @param string $needle

+ * If needle is not a string, it is converted + * to an integer and applied as the ordinal value of a character. + *

+ * @param int $offset [optional]

+ * If specified, search will start this number of characters counted from the + * beginning of the string. If the value is negative, search will instead start + * from that many characters from the end of the string, searching backwards. + *

+ * @return int the position where the needle exists relative to the beginnning of + * the haystack string (independent of search direction + * or offset). + * Also note that string positions start at 0, and not 1. + *

+ *

+ * Returns FALSE if the needle was not found. + * @jms-builtin + */ +function strrpos ($haystack, $needle, $offset = 0) {} + +/** + * (PHP 5)
+ * Find the position of the last occurrence of a case-insensitive substring in a string + * @link http://php.net/manual/en/function.strripos.php + * @param string $haystack

+ * The string to search in. + *

+ * @param string $needle

+ * If needle is not a string, it is converted + * to an integer and applied as the ordinal value of a character. + *

+ * @param int $offset [optional]

+ * If specified, search will start this number of characters counted from the + * beginning of the string. If the value is negative, search will instead start + * from that many characters from the end of the string, searching backwards. + *

+ * @return int the position where the needle exists relative to the beginnning of + * the haystack string (independent of search direction + * or offset). + * Also note that string positions start at 0, and not 1. + *

+ *

+ * Returns FALSE if the needle was not found. + * @jms-builtin + */ +function strripos ($haystack, $needle, $offset = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Reverse a string + * @link http://php.net/manual/en/function.strrev.php + * @param string $string

+ * The string to be reversed. + *

+ * @return string the reversed string. + * @jms-builtin + */ +function strrev ($string) {} + +/** + * (PHP 4, PHP 5)
+ * Convert logical Hebrew text to visual text + * @link http://php.net/manual/en/function.hebrev.php + * @param string $hebrew_text

+ * A Hebrew input string. + *

+ * @param int $max_chars_per_line [optional]

+ * This optional parameter indicates maximum number of characters per + * line that will be returned. + *

+ * @return string the visual string. + * @jms-builtin + */ +function hebrev ($hebrew_text, $max_chars_per_line = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Convert logical Hebrew text to visual text with newline conversion + * @link http://php.net/manual/en/function.hebrevc.php + * @param string $hebrew_text

+ * A Hebrew input string. + *

+ * @param int $max_chars_per_line [optional]

+ * This optional parameter indicates maximum number of characters per + * line that will be returned. + *

+ * @return string the visual string. + * @jms-builtin + */ +function hebrevc ($hebrew_text, $max_chars_per_line = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Inserts HTML line breaks before all newlines in a string + * @link http://php.net/manual/en/function.nl2br.php + * @param string $string

+ * The input string. + *

+ * @param bool $is_xhtml [optional]

+ * Whenever to use XHTML compatible line breaks or not. + *

+ * @return string the altered string. + * @jms-builtin + */ +function nl2br ($string, $is_xhtml = true) {} + +/** + * (PHP 4, PHP 5)
+ * Returns trailing name component of path + * @link http://php.net/manual/en/function.basename.php + * @param string $path

+ * A path. + *

+ *

+ * On Windows, both slash (/) and backslash + * (\) are used as directory separator character. In + * other environments, it is the forward slash (/). + *

+ * @param string $suffix [optional]

+ * If the name component ends in suffix this will also + * be cut off. + *

+ * @return string the base name of the given path. + * @jms-builtin + */ +function basename ($path, $suffix = null) {} + +/** + * (PHP 4, PHP 5)
+ * Returns parent directory's path + * @link http://php.net/manual/en/function.dirname.php + * @param string $path

+ * A path. + *

+ *

+ * On Windows, both slash (/) and backslash + * (\) are used as directory separator character. In + * other environments, it is the forward slash (/). + *

+ * @return string the path of the parent directory. If there are no slashes in + * path, a dot ('.') is returned, + * indicating the current directory. Otherwise, the returned string is + * path with any trailing + * /component removed. + * @jms-builtin + */ +function dirname ($path) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Returns information about a file path + * @link http://php.net/manual/en/function.pathinfo.php + * @param string $path

+ * The path to be parsed. + *

+ * @param int $options [optional]

+ * If present, specifies a specific element to be returned; one of + * PATHINFO_DIRNAME, + * PATHINFO_BASENAME, + * PATHINFO_EXTENSION or + * PATHINFO_FILENAME. + *

+ *

If options is not specified, returns all + * available elements. + *

+ * @return mixed If the options parameter is not passed, an + * associative array containing the following elements is + * returned: + * dirname, basename, + * extension (if any), and filename. + *

+ *

+ * If the path does not have an extension, no + * extension element will be returned + * (see second example below). + *

+ *

+ * If options is present, returns a + * string containing the requested element. + * @jms-builtin + */ +function pathinfo ($path, $options = 'PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME') {} + +/** + * (PHP 4, PHP 5)
+ * Un-quotes a quoted string + * @link http://php.net/manual/en/function.stripslashes.php + * @param string $str

+ * The input string. + *

+ * @return string a string with backslashes stripped off. + * (\' becomes ' and so on.) + * Double backslashes (\\) are made into a single + * backslash (\). + * @jms-builtin + */ +function stripslashes ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Un-quote string quoted with addcslashes + * @link http://php.net/manual/en/function.stripcslashes.php + * @param string $str

+ * The string to be unescaped. + *

+ * @return string the unescaped string. + * @jms-builtin + */ +function stripcslashes ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Find the first occurrence of a string + * @link http://php.net/manual/en/function.strstr.php + * @param string $haystack

+ * The input string. + *

+ * @param mixed $needle

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @param bool $before_needle [optional]

+ * If TRUE, strstr returns + * the part of the haystack before the first + * occurrence of the needle (excluding the needle). + *

+ * @return string the portion of string, or FALSE if needle + * is not found. + * @jms-builtin + */ +function strstr ($haystack, $needle, $before_needle = false) {} + +/** + * (PHP 4, PHP 5)
+ * Case-insensitive strstr + * @link http://php.net/manual/en/function.stristr.php + * @param string $haystack

+ * The string to search in + *

+ * @param mixed $needle

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @param bool $before_needle [optional]

+ * If TRUE, stristr + * returns the part of the haystack before the + * first occurrence of the needle (excluding needle). + *

+ * @return string the matched substring. If needle is not + * found, returns FALSE. + * @jms-builtin + */ +function stristr ($haystack, $needle, $before_needle = false) {} + +/** + * (PHP 4, PHP 5)
+ * Find the last occurrence of a character in a string + * @link http://php.net/manual/en/function.strrchr.php + * @param string $haystack

+ * The string to search in + *

+ * @param mixed $needle

+ * If needle contains more than one character, + * only the first is used. This behavior is different from that of + * strstr. + *

+ *

+ * If needle is not a string, it is converted to + * an integer and applied as the ordinal value of a character. + *

+ * @return string This function returns the portion of string, or FALSE if + * needle is not found. + * @jms-builtin + */ +function strrchr ($haystack, $needle) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Randomly shuffles a string + * @link http://php.net/manual/en/function.str-shuffle.php + * @param string $str

+ * The input string. + *

+ * @return string the shuffled string. + * @jms-builtin + */ +function str_shuffle ($str) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Return information about words used in a string + * @link http://php.net/manual/en/function.str-word-count.php + * @param string $string

+ * The string + *

+ * @param int $format [optional]

+ * Specify the return value of this function. The current supported values + * are: + * 0 - returns the number of words found + * @param string $charlist [optional]

+ * A list of additional characters which will be considered as 'word' + *

+ * @return mixed an array or an integer, depending on the + * format chosen. + * @jms-builtin + */ +function str_word_count ($string, $format = 0, $charlist = null) {} + +/** + * (PHP 5)
+ * Convert a string to an array + * @link http://php.net/manual/en/function.str-split.php + * @param string $string

+ * The input string. + *

+ * @param int $split_length [optional]

+ * Maximum length of the chunk. + *

+ * @return array If the optional split_length parameter is + * specified, the returned array will be broken down into chunks with each + * being split_length in length, otherwise each chunk + * will be one character in length. + *

+ *

+ * FALSE is returned if split_length is less than 1. + * If the split_length length exceeds the length of + * string, the entire string is returned as the first + * (and only) array element. + * @jms-builtin + */ +function str_split ($string, $split_length = 1) {} + +/** + * (PHP 5)
+ * Search a string for any of a set of characters + * @link http://php.net/manual/en/function.strpbrk.php + * @param string $haystack

+ * The string where char_list is looked for. + *

+ * @param string $char_list

+ * This parameter is case sensitive. + *

+ * @return string a string starting from the character found, or FALSE if it is + * not found. + * @jms-builtin + */ +function strpbrk ($haystack, $char_list) {} + +/** + * (PHP 5)
+ * Binary safe comparison of two strings from an offset, up to length characters + * @link http://php.net/manual/en/function.substr-compare.php + * @param string $main_str

+ * The main string being compared. + *

+ * @param string $str

+ * The secondary string being compared. + *

+ * @param int $offset

+ * The start position for the comparison. If negative, it starts counting + * from the end of the string. + *

+ * @param int $length [optional]

+ * The length of the comparison. The default value is the largest of the + * length of the str compared to the length of + * main_str less the + * offset. + *

+ * @param bool $case_insensitivity [optional]

+ * If case_insensitivity is TRUE, comparison is + * case insensitive. + *

+ * @return int < 0 if main_str from position + * offset is less than str, > + * 0 if it is greater than str, and 0 if they are equal. + * If offset is equal to or greater than the length of + * main_str or length is set and + * is less than 1, substr_compare prints a warning and returns + * FALSE. + * @jms-builtin + */ +function substr_compare ($main_str, $str, $offset, $length = null, $case_insensitivity = false) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Locale based string comparison + * @link http://php.net/manual/en/function.strcoll.php + * @param string $str1

+ * The first string. + *

+ * @param string $str2

+ * The second string. + *

+ * @return int < 0 if str1 is less than + * str2; > 0 if + * str1 is greater than + * str2, and 0 if they are equal. + * @jms-builtin + */ +function strcoll ($str1, $str2) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Formats a number as a currency string + * @link http://php.net/manual/en/function.money-format.php + * @param string $format

+ * The format specification consists of the following sequence: + *

a % character

+ * @param float $number

+ * The number to be formatted. + *

+ * @return string the formatted string. Characters before and after the formatting + * string will be returned unchanged. + * Non-numeric number causes returning NULL and + * emitting E_WARNING. + * @jms-builtin + */ +function money_format ($format, $number) {} + +/** + * (PHP 4, PHP 5)
+ * Return part of a string + * @link http://php.net/manual/en/function.substr.php + * @param string $string

+ * The input string. Must be one character or longer. + *

+ * @param int $start

+ * If start is non-negative, the returned string + * will start at the start'th position in + * string, counting from zero. For instance, + * in the string 'abcdef', the character at + * position 0 is 'a', the + * character at position 2 is + * 'c', and so forth. + *

+ *

+ * If start is negative, the returned string + * will start at the start'th character + * from the end of string. + *

+ *

+ * If string is less than or equal to + * start characters long, FALSE will be returned. + *

+ *

+ * Using a negative start + * + * $rest = substr("abcdef", -1); // returns "f" + * $rest = substr("abcdef", -2); // returns "ef" + * $rest = substr("abcdef", -3, 1); // returns "d" + * + *

+ * @param int $length [optional]

+ * If length is given and is positive, the string + * returned will contain at most length characters + * beginning from start (depending on the length of + * string). + *

+ *

+ * If length is given and is negative, then that many + * characters will be omitted from the end of string + * (after the start position has been calculated when a + * start is negative). If + * start denotes the position of this truncation or + * beyond, false will be returned. + *

+ *

+ * If length is given and is 0, + * FALSE or NULL an empty string will be returned. + *

+ *

+ * If length is omitted, the substring starting from + * start until the end of the string will be + * returned. + *

+ * Using a negative length + * + * $rest = substr("abcdef", 0, -1); // returns "abcde" + * $rest = substr("abcdef", 2, -1); // returns "cde" + * $rest = substr("abcdef", 4, -4); // returns false + * $rest = substr("abcdef", -3, -1); // returns "de" + * + * @return string the extracted part of string; or FALSE on failure, or + * an empty string. + * @jms-builtin + */ +function substr ($string, $start, $length = null) {} + +/** + * (PHP 4, PHP 5)
+ * Replace text within a portion of a string + * @link http://php.net/manual/en/function.substr-replace.php + * @param mixed $string

+ * The input string. + *

+ *

+ * An array of strings can be provided, in which + * case the replacements will occur on each string in turn. In this case, + * the replacement, start + * and length parameters may be provided either as + * scalar values to be applied to each input string in turn, or as + * arrays, in which case the corresponding array element will + * be used for each input string. + *

+ * @param mixed $replacement

+ * The replacement string. + *

+ * @param mixed $start

+ * If start is positive, the replacing will + * begin at the start'th offset into + * string. + *

+ *

+ * If start is negative, the replacing will + * begin at the start'th character from the + * end of string. + *

+ * @param mixed $length [optional]

+ * If given and is positive, it represents the length of the portion of + * string which is to be replaced. If it is + * negative, it represents the number of characters from the end of + * string at which to stop replacing. If it + * is not given, then it will default to strlen( + * string ); i.e. end the replacing at the + * end of string. Of course, if + * length is zero then this function will have the + * effect of inserting replacement into + * string at the given + * start offset. + *

+ * @return mixed The result string is returned. If string is an + * array then array is returned. + * @jms-builtin + */ +function substr_replace ($string, $replacement, $start, $length = null) {} + +/** + * (PHP 4, PHP 5)
+ * Quote meta characters + * @link http://php.net/manual/en/function.quotemeta.php + * @param string $str

+ * The input string. + *

+ * @return string the string with meta characters quoted, or FALSE if an empty + * string is given as str. + * @jms-builtin + */ +function quotemeta ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Make a string's first character uppercase + * @link http://php.net/manual/en/function.ucfirst.php + * @param string $str

+ * The input string. + *

+ * @return string the resulting string. + * @jms-builtin + */ +function ucfirst ($str) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Make a string's first character lowercase + * @link http://php.net/manual/en/function.lcfirst.php + * @param string $str

+ * The input string. + *

+ * @return string the resulting string. + * @jms-builtin + */ +function lcfirst ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Uppercase the first character of each word in a string + * @link http://php.net/manual/en/function.ucwords.php + * @param string $str

+ * The input string. + *

+ * @return string the modified string. + * @jms-builtin + */ +function ucwords ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Translate characters or replace substrings + * @link http://php.net/manual/en/function.strtr.php + * @param string $str

+ * The string being translated. + *

+ * @param string $from

+ * The string being translated to to. + *

+ * @param string $to

+ * The string replacing from. + *

+ * @return string the translated string. + *

+ *

+ * If replace_pairs contains a key which + * is an empty string (""), + * FALSE will be returned. + * @jms-builtin + */ +function strtr ($str, $from, $to) {} + +/** + * (PHP 4, PHP 5)
+ * Quote string with slashes + * @link http://php.net/manual/en/function.addslashes.php + * @param string $str

+ * The string to be escaped. + *

+ * @return string the escaped string. + * @jms-builtin + */ +function addslashes ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Quote string with slashes in a C style + * @link http://php.net/manual/en/function.addcslashes.php + * @param string $str

+ * The string to be escaped. + *

+ * @param string $charlist

+ * A list of characters to be escaped. If + * charlist contains characters + * \n, \r etc., they are + * converted in C-like style, while other non-alphanumeric characters + * with ASCII codes lower than 32 and higher than 126 converted to + * octal representation. + *

+ *

+ * When you define a sequence of characters in the charlist argument + * make sure that you know what characters come between the + * characters that you set as the start and end of the range. + * + * echo addcslashes('foo[ ]', 'A..z'); + * // output: \f\o\o\[ \] + * // All upper and lower-case letters will be escaped + * // ... but so will the [\]^_` + * + * Also, if the first character in a range has a higher ASCII value + * than the second character in the range, no range will be + * constructed. Only the start, end and period characters will be + * escaped. Use the ord function to find the + * ASCII value for a character. + * + * echo addcslashes("zoo['.']", 'z..A'); + * // output: \zoo['\.'] + * + *

+ *

+ * Be careful if you choose to escape characters 0, a, b, f, n, r, + * t and v. They will be converted to \0, \a, \b, \f, \n, \r, \t + * and \v. + * In PHP \0 (NULL), \r (carriage return), \n (newline), \f (form feed), + * \v (vertical tab) and \t (tab) are predefined escape sequences, + * while in C all of these are predefined escape sequences. + *

+ * @return string the escaped string. + * @jms-builtin + */ +function addcslashes ($str, $charlist) {} + +/** + * (PHP 4, PHP 5)
+ * Strip whitespace (or other characters) from the end of a string + * @link http://php.net/manual/en/function.rtrim.php + * @param string $str

+ * The input string. + *

+ * @param string $charlist [optional]

+ * You can also specify the characters you want to strip, by means + * of the charlist parameter. + * Simply list all characters that you want to be stripped. With + * .. you can specify a range of characters. + *

+ * @return string the modified string. + * @jms-builtin + */ +function rtrim ($str, $charlist = null) {} + +/** + * (PHP 4, PHP 5)
+ * Replace all occurrences of the search string with the replacement string + * @link http://php.net/manual/en/function.str-replace.php + * @param mixed $search

+ * The value being searched for, otherwise known as the needle. + * An array may be used to designate multiple needles. + *

+ * @param mixed $replace

+ * The replacement value that replaces found search + * values. An array may be used to designate multiple replacements. + *

+ * @param mixed $subject

+ * The string or array being searched and replaced on, + * otherwise known as the haystack. + *

+ *

+ * If subject is an array, then the search and + * replace is performed with every entry of + * subject, and the return value is an array as + * well. + *

+ * @param int $count [optional]

+ * If passed, this will be set to the number of replacements performed. + *

+ * @return mixed This function returns a string or an array with the replaced values. + * @jms-builtin + */ +function str_replace ($search, $replace, $subject, &$count = null) {} + +/** + * (PHP 5)
+ * Case-insensitive version of str_replace. + * @link http://php.net/manual/en/function.str-ireplace.php + * @param mixed $search

+ * The value being searched for, otherwise known as the + * needle. An array may be used to designate + * multiple needles. + *

+ * @param mixed $replace

+ * The replacement value that replaces found search + * values. An array may be used to designate multiple replacements. + *

+ * @param mixed $subject

+ * The string or array being searched and replaced on, + * otherwise known as the haystack. + *

+ *

+ * If subject is an array, then the search and + * replace is performed with every entry of + * subject, and the return value is an array as + * well. + *

+ * @param int $count [optional]

+ * If passed, this will be set to the number of replacements performed. + *

+ * @return mixed a string or an array of replacements. + * @jms-builtin + */ +function str_ireplace ($search, $replace, $subject, &$count = null) {} + +/** + * (PHP 4, PHP 5)
+ * Repeat a string + * @link http://php.net/manual/en/function.str-repeat.php + * @param string $input

+ * The string to be repeated. + *

+ * @param int $multiplier

+ * Number of time the input string should be + * repeated. + *

+ *

+ * multiplier has to be greater than or equal to 0. + * If the multiplier is set to 0, the function + * will return an empty string. + *

+ * @return string the repeated string. + * @jms-builtin + */ +function str_repeat ($input, $multiplier) {} + +/** + * (PHP 4, PHP 5)
+ * Return information about characters used in a string + * @link http://php.net/manual/en/function.count-chars.php + * @param string $string

+ * The examined string. + *

+ * @param int $mode [optional]

+ * See return values. + *

+ * @return mixed Depending on mode + * count_chars returns one of the following: + * 0 - an array with the byte-value as key and the frequency of + * every byte as value. + * 1 - same as 0 but only byte-values with a frequency greater + * than zero are listed. + * 2 - same as 0 but only byte-values with a frequency equal to + * zero are listed. + * 3 - a string containing all unique characters is returned. + * 4 - a string containing all not used characters is returned. + * @jms-builtin + */ +function count_chars ($string, $mode = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Split a string into smaller chunks + * @link http://php.net/manual/en/function.chunk-split.php + * @param string $body

+ * The string to be chunked. + *

+ * @param int $chunklen [optional]

+ * The chunk length. + *

+ * @param string $end [optional]

+ * The line ending sequence. + *

+ * @return string the chunked string. + * @jms-builtin + */ +function chunk_split ($body, $chunklen = 76, $end = "\r\n") {} + +/** + * (PHP 4, PHP 5)
+ * Strip whitespace (or other characters) from the beginning and end of a string + * @link http://php.net/manual/en/function.trim.php + * @param string $str

+ * The string that will be trimmed. + *

+ * @param string $charlist [optional]

+ * Optionally, the stripped characters can also be specified using + * the charlist parameter. + * Simply list all characters that you want to be stripped. With + * .. you can specify a range of characters. + *

+ * @return string The trimmed string. + * @jms-builtin + */ +function trim ($str, $charlist = null) {} + +/** + * (PHP 4, PHP 5)
+ * Strip whitespace (or other characters) from the beginning of a string + * @link http://php.net/manual/en/function.ltrim.php + * @param string $str

+ * The input string. + *

+ * @param string $charlist [optional]

+ * You can also specify the characters you want to strip, by means of the + * charlist parameter. + * Simply list all characters that you want to be stripped. With + * .. you can specify a range of characters. + *

+ * @return string This function returns a string with whitespace stripped from the + * beginning of str. + * Without the second parameter, + * ltrim will strip these characters: + * " " (ASCII 32 + * (0x20)), an ordinary space. + * "\t" (ASCII 9 + * (0x09)), a tab. + * "\n" (ASCII 10 + * (0x0A)), a new line (line feed). + * "\r" (ASCII 13 + * (0x0D)), a carriage return. + * "\0" (ASCII 0 + * (0x00)), the NUL-byte. + * "\x0B" (ASCII 11 + * (0x0B)), a vertical tab. + * @jms-builtin + */ +function ltrim ($str, $charlist = null) {} + +/** + * (PHP 4, PHP 5)
+ * Strip HTML and PHP tags from a string + * @link http://php.net/manual/en/function.strip-tags.php + * @param string $str

+ * The input string. + *

+ * @param string $allowable_tags [optional]

+ * You can use the optional second parameter to specify tags which should + * not be stripped. + *

+ *

+ * HTML comments and PHP tags are also stripped. This is hardcoded and + * can not be changed with allowable_tags. + *

+ *

+ * This parameter should not contain whitespace. + * strip_tags sees a tag as a case-insensitive + * string between < and the first whitespace or + * >. It means that + * strip_tags("<br/>", "<br>") returns an + * empty string. + *

+ * @return string the stripped string. + * @jms-builtin + */ +function strip_tags ($str, $allowable_tags = null) {} + +/** + * (PHP 4, PHP 5)
+ * Calculate the similarity between two strings + * @link http://php.net/manual/en/function.similar-text.php + * @param string $first

+ * The first string. + *

+ * @param string $second

+ * The second string. + *

+ * @param float $percent [optional]

+ * By passing a reference as third argument, + * similar_text will calculate the similarity in + * percent for you. + *

+ * @return int the number of matching chars in both strings. + * @jms-builtin + */ +function similar_text ($first, $second, &$percent = null) {} + +/** + * (PHP 4, PHP 5)
+ * Split a string by string + * @link http://php.net/manual/en/function.explode.php + * @param string $delimiter

+ * The boundary string. + *

+ * @param string $string

+ * The input string. + *

+ * @param int $limit [optional]

+ * If limit is set and positive, the returned array will contain + * a maximum of limit elements with the last + * element containing the rest of string. + *

+ *

+ * If the limit parameter is negative, all components + * except the last -limit are returned. + *

+ *

+ * If the limit parameter is zero, then this is treated as 1. + *

+ * @return array an array of strings + * created by splitting the string parameter on + * boundaries formed by the delimiter. + *

+ *

+ * If delimiter is an empty string (""), + * explode will return FALSE. + * If delimiter contains a value that is not + * contained in string and a negative + * limit is used, then an empty array will be + * returned, otherwise an array containing + * string will be returned. + * @jms-builtin + */ +function explode ($delimiter, $string, $limit = null) {} + +/** + * (PHP 4, PHP 5)
+ * Join array elements with a string + * @link http://php.net/manual/en/function.implode.php + * @param string $glue

+ * Defaults to an empty string. This is not the preferred usage of + * implode as glue would be + * the second parameter and thus, the bad prototype would be used. + *

+ * @param array $pieces

+ * The array of strings to implode. + *

+ * @return string a string containing a string representation of all the array + * elements in the same order, with the glue string between each element. + * @jms-builtin + */ +function implode ($glue, array $pieces) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of implode + * @link http://php.net/manual/en/function.join.php + * @param $glue + * @param $pieces + * @jms-builtin + */ +function join ($glue, $pieces) {} + +/** + * (PHP 4, PHP 5)
+ * Set locale information + * @link http://php.net/manual/en/function.setlocale.php + * @param int $category

+ * category is a named constant specifying the + * category of the functions affected by the locale setting: + * LC_ALL for all of the below + * @param string $locale

+ * If locale is NULL or the empty string + * "", the locale names will be set from the + * values of environment variables with the same names as the above + * categories, or from "LANG". + *

+ *

+ * If locale is "0", + * the locale setting is not affected, only the current setting is returned. + *

+ *

+ * If locale is an array or followed by additional + * parameters then each array element or parameter is tried to be set as + * new locale until success. This is useful if a locale is known under + * different names on different systems or for providing a fallback + * for a possibly not available locale. + *

+ * @param string $_ [optional]

+ * (Optional string or array parameters to try as locale settings until + * success.) + *

+ * @return string the new current locale, or FALSE if the locale functionality is + * not implemented on your platform, the specified locale does not exist or + * the category name is invalid. + *

+ *

+ * An invalid category name also causes a warning message. Category/locale + * names can be found in RFC 1766 + * and ISO 639. + * Different systems have different naming schemes for locales. + *

+ *

+ * The return value of setlocale depends + * on the system that PHP is running. It returns exactly + * what the system setlocale function returns. + * @jms-builtin + */ +function setlocale ($category, $locale, $_ = null) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Get numeric formatting information + * @link http://php.net/manual/en/function.localeconv.php + * @return array localeconv returns data based upon the current locale + * as set by setlocale. The associative array that is + * returned contains the following fields: + * + * Array element + * Description + * + * + * decimal_point + * Decimal point character + * + * + * thousands_sep + * Thousands separator + * + * + * grouping + * Array containing numeric groupings + * + * + * int_curr_symbol + * International currency symbol (i.e. USD) + * + * + * currency_symbol + * Local currency symbol (i.e. $) + * + * + * mon_decimal_point + * Monetary decimal point character + * + * + * mon_thousands_sep + * Monetary thousands separator + * + * + * mon_grouping + * Array containing monetary groupings + * + * + * positive_sign + * Sign for positive values + * + * + * negative_sign + * Sign for negative values + * + * + * int_frac_digits + * International fractional digits + * + * + * frac_digits + * Local fractional digits + * + * + * p_cs_precedes + * + * TRUE if currency_symbol precedes a positive value, FALSE + * if it succeeds one + * + * + * + * p_sep_by_space + * + * TRUE if a space separates currency_symbol from a positive + * value, FALSE otherwise + * + * + * + * n_cs_precedes + * + * TRUE if currency_symbol precedes a negative value, FALSE + * if it succeeds one + * + * + * + * n_sep_by_space + * + * TRUE if a space separates currency_symbol from a negative + * value, FALSE otherwise + * + * + * p_sign_posn + * + * 0 - Parentheses surround the quantity and currency_symbol + * 1 - The sign string precedes the quantity and currency_symbol + * 2 - The sign string succeeds the quantity and currency_symbol + * 3 - The sign string immediately precedes the currency_symbol + * 4 - The sign string immediately succeeds the currency_symbol + * + * + * n_sign_posn + * + * 0 - Parentheses surround the quantity and currency_symbol + * 1 - The sign string precedes the quantity and currency_symbol + * 2 - The sign string succeeds the quantity and currency_symbol + * 3 - The sign string immediately precedes the currency_symbol + * 4 - The sign string immediately succeeds the currency_symbol + * + * + *

+ *

+ * The p_sign_posn, and n_sign_posn contain a string + * of formatting options. Each number representing one of the above listed conditions. + *

+ *

+ * The grouping fields contain arrays that define the way numbers should be + * grouped. For example, the monetary grouping field for the nl_NL locale (in + * UTF-8 mode with the euro sign), would contain a 2 item array with the + * values 3 and 3. The higher the index in the array, the farther left the + * grouping is. If an array element is equal to CHAR_MAX, + * no further grouping is done. If an array element is equal to 0, the previous + * element should be used. + * @jms-builtin + */ +function localeconv () {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Query language and locale information + * @link http://php.net/manual/en/function.nl-langinfo.php + * @param int $item

+ * item may be an integer value of the element or the + * constant name of the element. The following is a list of constant names + * for item that may be used and their description. + * Some of these constants may not be defined or hold no value for certain + * locales. + * + * nl_langinfo Constants + * + * + * + * + * + * LC_TIME Category Constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * LC_MONETARY Category Constants + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * Returns 0 if parentheses surround the quantity and CURRENCY_SYMBOL. + * @return string the element as a string, or FALSE if item + * is not valid. + * @jms-builtin + */ +function nl_langinfo ($item) {} + +/** + * (PHP 4, PHP 5)
+ * Calculate the soundex key of a string + * @link http://php.net/manual/en/function.soundex.php + * @param string $str

+ * The input string. + *

+ * @return string the soundex key as a string. + * @jms-builtin + */ +function soundex ($str) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Calculate Levenshtein distance between two strings + * @link http://php.net/manual/en/function.levenshtein.php + * @param string $str1

+ * One of the strings being evaluated for Levenshtein distance. + *

+ * @param string $str2

+ * One of the strings being evaluated for Levenshtein distance. + *

+ * @return int This function returns the Levenshtein-Distance between the + * two argument strings or -1, if one of the argument strings + * is longer than the limit of 255 characters. + * @jms-builtin + */ +function levenshtein ($str1, $str2) {} + +/** + * (PHP 4, PHP 5)
+ * Return a specific character + * @link http://php.net/manual/en/function.chr.php + * @param int $ascii

+ * The ascii code. + *

+ * @return string the specified character. + * @jms-builtin + */ +function chr ($ascii) {} + +/** + * (PHP 4, PHP 5)
+ * Return ASCII value of character + * @link http://php.net/manual/en/function.ord.php + * @param string $string

+ * A character. + *

+ * @return int the ASCII value as an integer. + * @jms-builtin + */ +function ord ($string) {} + +/** + * (PHP 4, PHP 5)
+ * Parses the string into variables + * @link http://php.net/manual/en/function.parse-str.php + * @param string $str

+ * The input string. + *

+ * @param array $arr [optional]

+ * If the second parameter arr is present, + * variables are stored in this variable as array elements instead. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function parse_str ($str, array &$arr = null) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Parse a CSV string into an array + * @link http://php.net/manual/en/function.str-getcsv.php + * @param string $input

+ * The string to parse. + *

+ * @param string $delimiter [optional]

+ * Set the field delimiter (one character only). + *

+ * @param string $enclosure [optional]

+ * Set the field enclosure character (one character only). + *

+ * @param string $escape [optional]

+ * Set the escape character (one character only). Defaults as a backslash + * (\) + *

+ * @return array an indexed array containing the fields read. + * @jms-builtin + */ +function str_getcsv ($input, $delimiter = ',', $enclosure = '"', $escape = '\\') {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Pad a string to a certain length with another string + * @link http://php.net/manual/en/function.str-pad.php + * @param string $input

+ * The input string. + *

+ * @param int $pad_length

+ * If the value of pad_length is negative, + * less than, or equal to the length of the input string, no padding + * takes place. + *

+ * @param string $pad_string [optional]

+ * The pad_string may be truncated if the + * required number of padding characters can't be evenly divided by the + * pad_string's length. + *

+ * @param int $pad_type [optional]

+ * Optional argument pad_type can be + * STR_PAD_RIGHT, STR_PAD_LEFT, + * or STR_PAD_BOTH. If + * pad_type is not specified it is assumed to be + * STR_PAD_RIGHT. + *

+ * @return string the padded string. + * @jms-builtin + */ +function str_pad ($input, $pad_length, $pad_string = " ", $pad_type = 'STR_PAD_RIGHT') {} + +/** + * (PHP 4, PHP 5)
+ * Alias of rtrim + * @link http://php.net/manual/en/function.chop.php + * @param $str + * @param $character_mask [optional] + * @jms-builtin + */ +function chop ($str, $character_mask) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of strstr + * @link http://php.net/manual/en/function.strchr.php + * @param $haystack + * @param $needle + * @param boolean $part + * @jms-builtin + */ +function strchr ($haystack, $needle, $beforeNeedle = false) {} + +/** + * (PHP 4, PHP 5)
+ * Return a formatted string + * @link http://php.net/manual/en/function.sprintf.php + * @param string $format

+ * The format string is composed of zero or more directives: + * ordinary characters (excluding %) that are + * copied directly to the result, and conversion + * specifications, each of which results in fetching its + * own parameter. This applies to both sprintf + * and printf. + *

+ *

+ * Each conversion specification consists of a percent sign + * (%), followed by one or more of these + * elements, in order: + * An optional sign specifier that forces a sign + * (- or +) to be used on a number. By default, only the - sign is used + * on a number if it's negative. This specifier forces positive numbers + * to have the + sign attached as well, and was added in PHP 4.3.0. + * @param mixed $args [optional] + * @param mixed $_ [optional] + * @return string a string produced according to the formatting string + * format. + * @jms-builtin + */ +function sprintf ($format, $args = null, $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Output a formatted string + * @link http://php.net/manual/en/function.printf.php + * @param string $format

+ * See sprintf for a description of + * format. + *

+ * @param mixed $args [optional] + * @param mixed $_ [optional] + * @return int the length of the outputted string. + * @jms-builtin + */ +function printf ($format, $args = null, $_ = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Output a formatted string + * @link http://php.net/manual/en/function.vprintf.php + * @param string $format

+ * See sprintf for a description of + * format. + *

+ * @param array $args + * @return int the length of the outputted string. + * @jms-builtin + */ +function vprintf ($format, array $args) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Return a formatted string + * @link http://php.net/manual/en/function.vsprintf.php + * @param string $format

+ * See sprintf for a description of + * format. + *

+ * @param array $args + * @return string Return array values as a formatted string according to + * format (which is described in the documentation + * for sprintf). + * @jms-builtin + */ +function vsprintf ($format, array $args) {} + +/** + * (PHP 5)
+ * Write a formatted string to a stream + * @link http://php.net/manual/en/function.fprintf.php + * @param resource $handle A file system pointer resource + * that is typically created using fopen.

+ * @param string $format

+ * See sprintf for a description of + * format. + *

+ * @param mixed $args [optional] + * @param mixed $_ [optional] + * @return int the length of the string written. + * @jms-builtin + */ +function fprintf ($handle, $format, $args = null, $_ = null) {} + +/** + * (PHP 5)
+ * Write a formatted string to a stream + * @link http://php.net/manual/en/function.vfprintf.php + * @param resource $handle + * @param string $format

+ * See sprintf for a description of + * format. + *

+ * @param array $args + * @return int the length of the outputted string. + * @jms-builtin + */ +function vfprintf ($handle, $format, array $args) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Parses input from a string according to a format + * @link http://php.net/manual/en/function.sscanf.php + * @param string $str

+ * The input string being parsed. + *

+ * @param string $format

+ * The interpreted format for str, which is + * described in the documentation for sprintf with + * following differences: + * Function is not locale-aware. + * F, g, G and + * b are not supported. + * D stands for decimal number. + * i stands for integer with base detection. + * n stands for number of characters processed so far. + *

+ * @param mixed $_ [optional]

+ * Optionally pass in variables by reference that will contain the parsed values. + *

+ * @return mixed If only two parameters were passed to this function, the values parsed will + * be returned as an array. Otherwise, if optional parameters are passed, the + * function will return the number of assigned values. The optional parameters + * must be passed by reference. + *

+ *

+ * If there are more substrings expected in the format + * than there are available within str, + * -1 will be returned. + * @jms-builtin + */ +function sscanf ($str, $format, &$_ = null) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Parses input from a file according to a format + * @link http://php.net/manual/en/function.fscanf.php + * @param resource $handle A file system pointer resource + * that is typically created using fopen.

+ * @param string $format

+ * The specified format as described in the + * sprintf documentation. + *

+ * @param mixed $_ [optional]

+ * The optional assigned values. + *

+ * @return mixed If only two parameters were passed to this function, the values parsed will be + * returned as an array. Otherwise, if optional parameters are passed, the + * function will return the number of assigned values. The optional + * parameters must be passed by reference. + * @jms-builtin + */ +function fscanf ($handle, $format, &$_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Parse a URL and return its components + * @link http://php.net/manual/en/function.parse-url.php + * @param string $url

+ * The URL to parse. Invalid characters are replaced by + * _. + *

+ * @param int $component [optional]

+ * Specify one of PHP_URL_SCHEME, + * PHP_URL_HOST, PHP_URL_PORT, + * PHP_URL_USER, PHP_URL_PASS, + * PHP_URL_PATH, PHP_URL_QUERY + * or PHP_URL_FRAGMENT to retrieve just a specific + * URL component as a string (except when + * PHP_URL_PORT is given, in which case the return + * value will be an integer). + *

+ * @return mixed On seriously malformed URLs, parse_url may return + * FALSE. + *

+ *

+ * If the component parameter is omitted, an + * associative array is returned. At least one element will be + * present within the array. Potential keys within this array are: + * scheme - e.g. http + * host + * port + * user + * pass + * path + * query - after the question mark ? + * fragment - after the hashmark # + *

+ *

+ * If the component parameter is specified, + * parse_url returns a string (or an + * integer, in the case of PHP_URL_PORT) + * instead of an array. If the requested component doesn't exist + * within the given URL, NULL will be returned. + * @jms-builtin + */ +function parse_url ($url, $component = -1) {} + +/** + * (PHP 4, PHP 5)
+ * URL-encodes string + * @link http://php.net/manual/en/function.urlencode.php + * @param string $str

+ * The string to be encoded. + *

+ * @return string a string in which all non-alphanumeric characters except + * -_. have been replaced with a percent + * (%) sign followed by two hex digits and spaces encoded + * as plus (+) signs. It is encoded the same way that the + * posted data from a WWW form is encoded, that is the same way as in + * application/x-www-form-urlencoded media type. This + * differs from the RFC 3986 encoding (see + * rawurlencode) in that for historical reasons, spaces + * are encoded as plus (+) signs. + * @jms-builtin + */ +function urlencode ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Decodes URL-encoded string + * @link http://php.net/manual/en/function.urldecode.php + * @param string $str

+ * The string to be decoded. + *

+ * @return string the decoded string. + * @jms-builtin + */ +function urldecode ($str) {} + +/** + * (PHP 4, PHP 5)
+ * URL-encode according to RFC 3986 + * @link http://php.net/manual/en/function.rawurlencode.php + * @param string $str

+ * The URL to be encoded. + *

+ * @return string a string in which all non-alphanumeric characters except + * -_.~ have been replaced with a percent + * (%) sign followed by two hex digits. This is the + * encoding described in RFC 3986 for + * protecting literal characters from being interpreted as special URL + * delimiters, and for protecting URLs from being mangled by transmission + * media with character conversions (like some email systems). + *

+ * Prior to PHP 5.3.0, rawurlencode encoded tildes (~) as per + * RFC 1738. + *

+ * @jms-builtin + */ +function rawurlencode ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Decode URL-encoded strings + * @link http://php.net/manual/en/function.rawurldecode.php + * @param string $str

+ * The URL to be decoded. + *

+ * @return string the decoded URL, as a string. + * @jms-builtin + */ +function rawurldecode ($str) {} + +/** + * (PHP 5)
+ * Generate URL-encoded query string + * @link http://php.net/manual/en/function.http-build-query.php + * @param mixed $query_data

+ * May be an array or object containing properties. + *

+ *

+ * If query_data is an array, it may be a simple + * one-dimensional structure, or an array of arrays (which in + * turn may contain other arrays). + *

+ *

+ * If query_data is an object, then only public + * properties will be incorporated into the result. + *

+ * @param string $numeric_prefix [optional]

+ * If numeric indices are used in the base array and this parameter is + * provided, it will be prepended to the numeric index for elements in + * the base array only. + *

+ *

+ * This is meant to allow for legal variable names when the data is + * decoded by PHP or another CGI application later on. + *

+ * @param string $arg_separator [optional]

+ * arg_separator.output + * is used to separate arguments, unless this parameter is specified, + * and is then used. + *

+ * @param int $enc_type [optional]

+ * By default, PHP_QUERY_RFC1738. + *

+ *

+ * If enc_type is + * PHP_QUERY_RFC1738, then encoding is performed per + * RFC 1738 and the + * application/x-www-form-urlencoded media type, which + * implies that spaces are encoded as plus (+) signs. + *

+ *

+ * If enc_type is + * PHP_QUERY_RFC3986, then encoding is performed + * according to RFC 3986, and + * spaces will be percent encoded (%20). + *

+ * @return string a URL-encoded string. + * @jms-builtin + */ +function http_build_query ($query_data, $numeric_prefix = null, $arg_separator = null, $enc_type = 'PHP_QUERY_RFC1738') {} + +/** + * (PHP 4, PHP 5)
+ * Returns the target of a symbolic link + * @link http://php.net/manual/en/function.readlink.php + * @param string $path

+ * The symbolic link path. + *

+ * @return string the contents of the symbolic link path or FALSE on error. + * @jms-builtin + */ +function readlink ($path) {} + +/** + * (PHP 4, PHP 5)
+ * Gets information about a link + * @link http://php.net/manual/en/function.linkinfo.php + * @param string $path

+ * Path to the link. + *

+ * @return int linkinfo returns the st_dev field + * of the Unix C stat structure returned by the lstat + * system call. Returns 0 or FALSE in case of error. + * @jms-builtin + */ +function linkinfo ($path) {} + +/** + * (PHP 4, PHP 5)
+ * Creates a symbolic link + * @link http://php.net/manual/en/function.symlink.php + * @param string $target

+ * Target of the link. + *

+ * @param string $link

+ * The link name. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function symlink ($target, $link) {} + +/** + * (PHP 4, PHP 5)
+ * Create a hard link + * @link http://php.net/manual/en/function.link.php + * @param string $target

+ * Target of the link. + *

+ * @param string $link

+ * The link name. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function link ($target, $link) {} + +/** + * (PHP 4, PHP 5)
+ * Deletes a file + * @link http://php.net/manual/en/function.unlink.php + * @param string $filename

+ * Path to the file. + *

+ * @param resource $context [optional] Context support was added + * with PHP 5.0.0. For a description of contexts, refer to + * . + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function unlink ($filename, $context = null) {} + +/** + * (PHP 4, PHP 5)
+ * Execute an external program + * @link http://php.net/manual/en/function.exec.php + * @param string $command

+ * The command that will be executed. + *

+ * @param array $output [optional]

+ * If the output argument is present, then the + * specified array will be filled with every line of output from the + * command. Trailing whitespace, such as \n, is not + * included in this array. Note that if the array already contains some + * elements, exec will append to the end of the array. + * If you do not want the function to append elements, call + * unset on the array before passing it to + * exec. + *

+ * @param int $return_var [optional]

+ * If the return_var argument is present + * along with the output argument, then the + * return status of the executed command will be written to this + * variable. + *

+ * @return string The last line from the result of the command. If you need to execute a + * command and have all the data from the command passed directly back without + * any interference, use the passthru function. + *

+ *

+ * To get the output of the executed command, be sure to set and use the + * output parameter. + * @jms-builtin + */ +function exec ($command, array &$output = null, &$return_var = null) {} + +/** + * (PHP 4, PHP 5)
+ * Execute an external program and display the output + * @link http://php.net/manual/en/function.system.php + * @param string $command

+ * The command that will be executed. + *

+ * @param int $return_var [optional]

+ * If the return_var argument is present, then the + * return status of the executed command will be written to this + * variable. + *

+ * @return string the last line of the command output on success, and FALSE + * on failure. + * @jms-builtin + */ +function system ($command, &$return_var = null) {} + +/** + * (PHP 4, PHP 5)
+ * Escape shell metacharacters + * @link http://php.net/manual/en/function.escapeshellcmd.php + * @param string $command

+ * The command that will be escaped. + *

+ * @return string The escaped string. + * @jms-builtin + */ +function escapeshellcmd ($command) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Escape a string to be used as a shell argument + * @link http://php.net/manual/en/function.escapeshellarg.php + * @param string $arg

+ * The argument that will be escaped. + *

+ * @return string The escaped string. + * @jms-builtin + */ +function escapeshellarg ($arg) {} + +/** + * (PHP 4, PHP 5)
+ * Execute an external program and display raw output + * @link http://php.net/manual/en/function.passthru.php + * @param string $command

+ * The command that will be executed. + *

+ * @param int $return_var [optional]

+ * If the return_var argument is present, the + * return status of the Unix command will be placed here. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function passthru ($command, &$return_var = null) {} + +/** + * (PHP 4, PHP 5)
+ * Execute command via shell and return the complete output as a string + * @link http://php.net/manual/en/function.shell-exec.php + * @param string $cmd

+ * The command that will be executed. + *

+ * @return string The output from the executed command or NULL if an error occurred. + * @jms-builtin + */ +function shell_exec ($cmd) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Execute a command and open file pointers for input/output + * @link http://php.net/manual/en/function.proc-open.php + * @param string $cmd

+ * The command to execute + *

+ * @param array $descriptorspec

+ * An indexed array where the key represents the descriptor number and the + * value represents how PHP will pass that descriptor to the child + * process. 0 is stdin, 1 is stdout, while 2 is stderr. + *

+ *

+ * Each element can be: + * An array describing the pipe to pass to the process. The first + * element is the descriptor type and the second element is an option for + * the given type. Valid types are pipe (the second + * element is either r to pass the read end of the pipe + * to the process, or w to pass the write end) and + * file (the second element is a filename). + * A stream resource representing a real file descriptor (e.g. opened file, + * a socket, STDIN). + *

+ *

+ * The file descriptor numbers are not limited to 0, 1 and 2 - you may + * specify any valid file descriptor number and it will be passed to the + * child process. This allows your script to interoperate with other + * scripts that run as "co-processes". In particular, this is useful for + * passing passphrases to programs like PGP, GPG and openssl in a more + * secure manner. It is also useful for reading status information + * provided by those programs on auxiliary file descriptors. + *

+ * @param array $pipes

+ * Will be set to an indexed array of file pointers that correspond to + * PHP's end of any pipes that are created. + *

+ * @param string $cwd [optional]

+ * The initial working dir for the command. This must be an + * absolute directory path, or NULL + * if you want to use the default value (the working dir of the current + * PHP process) + *

+ * @param array $env [optional]

+ * An array with the environment variables for the command that will be + * run, or NULL to use the same environment as the current PHP process + *

+ * @param array $other_options [optional]

+ * Allows you to specify additional options. Currently supported options + * include: + * suppress_errors (windows only): suppresses errors + * generated by this function when it's set to TRUE + * bypass_shell (windows only): bypass + * cmd.exe shell when set to TRUE + * context: stream context used when opening files + * (created with stream_context_create) + *

+ * @return resource a resource representing the process, which should be freed using + * proc_close when you are finished with it. On failure + * returns FALSE. + * @jms-builtin + */ +function proc_open ($cmd, array $descriptorspec, array &$pipes, $cwd = null, array $env = null, array $other_options = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Close a process opened by proc_open and return the exit code of that process + * @link http://php.net/manual/en/function.proc-close.php + * @param resource $process

+ * The proc_open resource that will + * be closed. + *

+ * @return int the termination status of the process that was run. In case of + * an error then -1 is returned. + * @jms-builtin + */ +function proc_close ($process) {} + +/** + * (PHP 5)
+ * Kills a process opened by proc_open + * @link http://php.net/manual/en/function.proc-terminate.php + * @param resource $process

+ * The proc_open resource that will + * be closed. + *

+ * @param int $signal [optional]

+ * This optional parameter is only useful on POSIX + * operating systems; you may specify a signal to send to the process + * using the kill(2) system call. The default is + * SIGTERM. + *

+ * @return bool the termination status of the process that was run. + * @jms-builtin + */ +function proc_terminate ($process, $signal = 15) {} + +/** + * (PHP 5)
+ * Get information about a process opened by proc_open + * @link http://php.net/manual/en/function.proc-get-status.php + * @param resource $process

+ * The proc_open resource that will + * be evaluated. + *

+ * @return array An array of collected information on success, and FALSE + * on failure. The returned array contains the following elements: + *

+ *

+ *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * @jms-builtin + */ +function proc_get_status ($process) {} + +/** + * (PHP 5)
+ * Change the priority of the current process + * @link http://php.net/manual/en/function.proc-nice.php + * @param int $increment

+ * The increment value of the priority change. + *

+ * @return bool TRUE on success or FALSE on failure. + * If an error occurs, like the user lacks permission to change the priority, + * an error of level E_WARNING is also generated. + * @jms-builtin + */ +function proc_nice ($increment) {} + +/** + * (PHP 4, PHP 5)
+ * Generate a random integer + * @link http://php.net/manual/en/function.rand.php + * @param $min [optional] + * @param $max [optional] + * @return int A pseudo random value between min + * (or 0) and max (or getrandmax, inclusive). + * @jms-builtin + */ +function rand ($min, $max) {} + +/** + * (PHP 4, PHP 5)
+ * Seed the random number generator + * @link http://php.net/manual/en/function.srand.php + * @param int $seed [optional]

+ * Optional seed value + *

+ * @return void No value is returned. + * @jms-builtin + */ +function srand ($seed = null) {} + +/** + * (PHP 4, PHP 5)
+ * Show largest possible random value + * @link http://php.net/manual/en/function.getrandmax.php + * @return int The largest possible random value returned by rand + * @jms-builtin + */ +function getrandmax () {} + +/** + * (PHP 4, PHP 5)
+ * Generate a better random value + * @link http://php.net/manual/en/function.mt-rand.php + * @param $min [optional] + * @param $max [optional] + * @return int A random integer value between min (or 0) + * and max (or mt_getrandmax, inclusive) + * @jms-builtin + */ +function mt_rand ($min, $max) {} + +/** + * (PHP 4, PHP 5)
+ * Seed the better random number generator + * @link http://php.net/manual/en/function.mt-srand.php + * @param int $seed [optional]

+ * An optional seed value + *

+ * @return void No value is returned. + * @jms-builtin + */ +function mt_srand ($seed = null) {} + +/** + * (PHP 4, PHP 5)
+ * Show largest possible random value + * @link http://php.net/manual/en/function.mt-getrandmax.php + * @return int the maximum random value returned by mt_rand + * @jms-builtin + */ +function mt_getrandmax () {} + +/** + * (PHP 4, PHP 5)
+ * Get port number associated with an Internet service and protocol + * @link http://php.net/manual/en/function.getservbyname.php + * @param string $service

+ * The Internet service name, as a string. + *

+ * @param string $protocol

+ * protocol is either "tcp" + * or "udp" (in lowercase). + *

+ * @return int the port number, or FALSE if service or + * protocol is not found. + * @jms-builtin + */ +function getservbyname ($service, $protocol) {} + +/** + * (PHP 4, PHP 5)
+ * Get Internet service which corresponds to port and protocol + * @link http://php.net/manual/en/function.getservbyport.php + * @param int $port

+ * The port number. + *

+ * @param string $protocol

+ * protocol is either "tcp" + * or "udp" (in lowercase). + *

+ * @return string the Internet service name as a string. + * @jms-builtin + */ +function getservbyport ($port, $protocol) {} + +/** + * (PHP 4, PHP 5)
+ * Get protocol number associated with protocol name + * @link http://php.net/manual/en/function.getprotobyname.php + * @param string $name

+ * The protocol name. + *

+ * @return int the protocol number, or FALSE on failure. + * @jms-builtin + */ +function getprotobyname ($name) {} + +/** + * (PHP 4, PHP 5)
+ * Get protocol name associated with protocol number + * @link http://php.net/manual/en/function.getprotobynumber.php + * @param int $number

+ * The protocol number. + *

+ * @return string the protocol name as a string, or FALSE on failure. + * @jms-builtin + */ +function getprotobynumber ($number) {} + +/** + * (PHP 4, PHP 5)
+ * Gets PHP script owner's UID + * @link http://php.net/manual/en/function.getmyuid.php + * @return int the user ID of the current script, or FALSE on error. + * @jms-builtin + */ +function getmyuid () {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Get PHP script owner's GID + * @link http://php.net/manual/en/function.getmygid.php + * @return int the group ID of the current script, or FALSE on error. + * @jms-builtin + */ +function getmygid () {} + +/** + * (PHP 4, PHP 5)
+ * Gets PHP's process ID + * @link http://php.net/manual/en/function.getmypid.php + * @return int the current PHP process ID, or FALSE on error. + * @jms-builtin + */ +function getmypid () {} + +/** + * (PHP 4, PHP 5)
+ * Gets the inode of the current script + * @link http://php.net/manual/en/function.getmyinode.php + * @return int the current script's inode as an integer, or FALSE on error. + * @jms-builtin + */ +function getmyinode () {} + +/** + * (PHP 4, PHP 5)
+ * Gets time of last page modification + * @link http://php.net/manual/en/function.getlastmod.php + * @return int the time of the last modification of the current + * page. The value returned is a Unix timestamp, suitable for + * feeding to date. Returns FALSE on error. + * @jms-builtin + */ +function getlastmod () {} + +/** + * (PHP 4, PHP 5)
+ * Decodes data encoded with MIME base64 + * @link http://php.net/manual/en/function.base64-decode.php + * @param string $data

+ * The encoded data. + *

+ * @param bool $strict [optional]

+ * Returns FALSE if input contains character from outside the base64 + * alphabet. + *

+ * @return string the original data or FALSE on failure. The returned data may be + * binary. + * @jms-builtin + */ +function base64_decode ($data, $strict = false) {} + +/** + * (PHP 4, PHP 5)
+ * Encodes data with MIME base64 + * @link http://php.net/manual/en/function.base64-encode.php + * @param string $data

+ * The data to encode. + *

+ * @return string The encoded data, as a string or FALSE on failure. + * @jms-builtin + */ +function base64_encode ($data) {} + +/** + * (PHP 5)
+ * Uuencode a string + * @link http://php.net/manual/en/function.convert-uuencode.php + * @param string $data

+ * The data to be encoded. + *

+ * @return string the uuencoded data. + * @jms-builtin + */ +function convert_uuencode ($data) {} + +/** + * (PHP 5)
+ * Decode a uuencoded string + * @link http://php.net/manual/en/function.convert-uudecode.php + * @param string $data

+ * The uuencoded data. + *

+ * @return string the decoded data as a string. + * @jms-builtin + */ +function convert_uudecode ($data) {} + +/** + * (PHP 4, PHP 5)
+ * Absolute value + * @link http://php.net/manual/en/function.abs.php + * @param mixed $number

+ * The numeric value to process + *

+ * @return number The absolute value of number. If the + * argument number is + * of type float, the return type is also float, + * otherwise it is integer (as float usually has a + * bigger value range than integer). + * @jms-builtin + */ +function abs ($number) {} + +/** + * (PHP 4, PHP 5)
+ * Round fractions up + * @link http://php.net/manual/en/function.ceil.php + * @param float $value

+ * The value to round + *

+ * @return float value rounded up to the next highest + * integer. + * The return value of ceil is still of type + * float as the value range of float is + * usually bigger than that of integer. + * @jms-builtin + */ +function ceil ($value) {} + +/** + * (PHP 4, PHP 5)
+ * Round fractions down + * @link http://php.net/manual/en/function.floor.php + * @param float $value

+ * The numeric value to round + *

+ * @return float value rounded to the next lowest integer. + * The return value of floor is still of type + * float because the value range of float is + * usually bigger than that of integer. + * @jms-builtin + */ +function floor ($value) {} + +/** + * (PHP 4, PHP 5)
+ * Rounds a float + * @link http://php.net/manual/en/function.round.php + * @param float $val

+ * The value to round + *

+ * @param int $precision [optional]

+ * The optional number of decimal digits to round to. + *

+ * @param int $mode [optional]

+ * One of PHP_ROUND_HALF_UP, + * PHP_ROUND_HALF_DOWN, + * PHP_ROUND_HALF_EVEN, or + * PHP_ROUND_HALF_ODD. + *

+ * @return float The rounded value + * @jms-builtin + */ +function round ($val, $precision = 0, $mode = 'PHP_ROUND_HALF_UP') {} + +/** + * (PHP 4, PHP 5)
+ * Sine + * @link http://php.net/manual/en/function.sin.php + * @param float $arg

+ * A value in radians + *

+ * @return float The sine of arg + * @jms-builtin + */ +function sin ($arg) {} + +/** + * (PHP 4, PHP 5)
+ * Cosine + * @link http://php.net/manual/en/function.cos.php + * @param float $arg

+ * An angle in radians + *

+ * @return float The cosine of arg + * @jms-builtin + */ +function cos ($arg) {} + +/** + * (PHP 4, PHP 5)
+ * Tangent + * @link http://php.net/manual/en/function.tan.php + * @param float $arg

+ * The argument to process in radians + *

+ * @return float The tangent of arg + * @jms-builtin + */ +function tan ($arg) {} + +/** + * (PHP 4, PHP 5)
+ * Arc sine + * @link http://php.net/manual/en/function.asin.php + * @param float $arg

+ * The argument to process + *

+ * @return float The arc sine of arg in radians + * @jms-builtin + */ +function asin ($arg) {} + +/** + * (PHP 4, PHP 5)
+ * Arc cosine + * @link http://php.net/manual/en/function.acos.php + * @param float $arg

+ * The argument to process + *

+ * @return float The arc cosine of arg in radians. + * @jms-builtin + */ +function acos ($arg) {} + +/** + * (PHP 4, PHP 5)
+ * Arc tangent + * @link http://php.net/manual/en/function.atan.php + * @param float $arg

+ * The argument to process + *

+ * @return float The arc tangent of arg in radians. + * @jms-builtin + */ +function atan ($arg) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Inverse hyperbolic tangent + * @link http://php.net/manual/en/function.atanh.php + * @param float $arg

+ * The argument to process + *

+ * @return float Inverse hyperbolic tangent of arg + * @jms-builtin + */ +function atanh ($arg) {} + +/** + * (PHP 4, PHP 5)
+ * Arc tangent of two variables + * @link http://php.net/manual/en/function.atan2.php + * @param float $y

+ * Dividend parameter + *

+ * @param float $x

+ * Divisor parameter + *

+ * @return float The arc tangent of y/x + * in radians. + * @jms-builtin + */ +function atan2 ($y, $x) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Hyperbolic sine + * @link http://php.net/manual/en/function.sinh.php + * @param float $arg

+ * The argument to process + *

+ * @return float The hyperbolic sine of arg + * @jms-builtin + */ +function sinh ($arg) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Hyperbolic cosine + * @link http://php.net/manual/en/function.cosh.php + * @param float $arg

+ * The argument to process + *

+ * @return float The hyperbolic cosine of arg + * @jms-builtin + */ +function cosh ($arg) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Hyperbolic tangent + * @link http://php.net/manual/en/function.tanh.php + * @param float $arg

+ * The argument to process + *

+ * @return float The hyperbolic tangent of arg + * @jms-builtin + */ +function tanh ($arg) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Inverse hyperbolic sine + * @link http://php.net/manual/en/function.asinh.php + * @param float $arg

+ * The argument to process + *

+ * @return float The inverse hyperbolic sine of arg + * @jms-builtin + */ +function asinh ($arg) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Inverse hyperbolic cosine + * @link http://php.net/manual/en/function.acosh.php + * @param float $arg

+ * The value to process + *

+ * @return float The inverse hyperbolic cosine of arg + * @jms-builtin + */ +function acosh ($arg) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Returns exp(number) - 1, computed in a way that is accurate even +when the value of number is close to zero + * @link http://php.net/manual/en/function.expm1.php + * @param float $arg

+ * The argument to process + *

+ * @return float 'e' to the power of arg minus one + * @jms-builtin + */ +function expm1 ($arg) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Returns log(1 + number), computed in a way that is accurate even when +the value of number is close to zero + * @link http://php.net/manual/en/function.log1p.php + * @param float $number

+ * The argument to process + *

+ * @return float log(1 + number) + * @jms-builtin + */ +function log1p ($number) {} + +/** + * (PHP 4, PHP 5)
+ * Get value of pi + * @link http://php.net/manual/en/function.pi.php + * @return float The value of pi as float. + * @jms-builtin + */ +function pi () {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Finds whether a value is a legal finite number + * @link http://php.net/manual/en/function.is-finite.php + * @param float $val

+ * The value to check + *

+ * @return bool TRUE if val is a legal finite + * number within the allowed range for a PHP float on this platform, + * else FALSE. + * @jms-builtin + */ +function is_finite ($val) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Finds whether a value is not a number + * @link http://php.net/manual/en/function.is-nan.php + * @param float $val

+ * The value to check + *

+ * @return bool TRUE if val is 'not a number', + * else FALSE. + * @jms-builtin + */ +function is_nan ($val) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Finds whether a value is infinite + * @link http://php.net/manual/en/function.is-infinite.php + * @param float $val

+ * The value to check + *

+ * @return bool TRUE if val is infinite, else FALSE. + * @jms-builtin + */ +function is_infinite ($val) {} + +/** + * (PHP 4, PHP 5)
+ * Exponential expression + * @link http://php.net/manual/en/function.pow.php + * @param number $base

+ * The base to use + *

+ * @param number $exp

+ * The exponent + *

+ * @return number base raised to the power of exp. + * If both arguments are non-negative integers and the result can be represented + * as an integer, the result will be returned with integer type, + * otherwise it will be returned as a float. + * @jms-builtin + */ +function pow ($base, $exp) {} + +/** + * (PHP 4, PHP 5)
+ * Calculates the exponent of e + * @link http://php.net/manual/en/function.exp.php + * @param float $arg

+ * The argument to process + *

+ * @return float 'e' raised to the power of arg + * @jms-builtin + */ +function exp ($arg) {} + +/** + * (PHP 4, PHP 5)
+ * Natural logarithm + * @link http://php.net/manual/en/function.log.php + * @param float $arg

+ * The value to calculate the logarithm for + *

+ * @param float $base [optional]

+ * The optional logarithmic base to use + * (defaults to 'e' and so to the natural logarithm). + *

+ * @return float The logarithm of arg to + * base, if given, or the + * natural logarithm. + * @jms-builtin + */ +function log ($arg, $base = 'M_E') {} + +/** + * (PHP 4, PHP 5)
+ * Base-10 logarithm + * @link http://php.net/manual/en/function.log10.php + * @param float $arg

+ * The argument to process + *

+ * @return float The base-10 logarithm of arg + * @jms-builtin + */ +function log10 ($arg) {} + +/** + * (PHP 4, PHP 5)
+ * Square root + * @link http://php.net/manual/en/function.sqrt.php + * @param float $arg

+ * The argument to process + *

+ * @return float The square root of arg + * or the special value NAN for negative numbers. + * @jms-builtin + */ +function sqrt ($arg) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Calculate the length of the hypotenuse of a right-angle triangle + * @link http://php.net/manual/en/function.hypot.php + * @param float $x

+ * Length of first side + *

+ * @param float $y

+ * Length of second side + *

+ * @return float Calculated length of the hypotenuse + * @jms-builtin + */ +function hypot ($x, $y) {} + +/** + * (PHP 4, PHP 5)
+ * Converts the number in degrees to the radian equivalent + * @link http://php.net/manual/en/function.deg2rad.php + * @param float $number

+ * Angular value in degrees + *

+ * @return float The radian equivalent of number + * @jms-builtin + */ +function deg2rad ($number) {} + +/** + * (PHP 4, PHP 5)
+ * Converts the radian number to the equivalent number in degrees + * @link http://php.net/manual/en/function.rad2deg.php + * @param float $number

+ * A radian value + *

+ * @return float The equivalent of number in degrees + * @jms-builtin + */ +function rad2deg ($number) {} + +/** + * (PHP 4, PHP 5)
+ * Binary to decimal + * @link http://php.net/manual/en/function.bindec.php + * @param string $binary_string

+ * The binary string to convert + *

+ * @return number The decimal value of binary_string + * @jms-builtin + */ +function bindec ($binary_string) {} + +/** + * (PHP 4, PHP 5)
+ * Hexadecimal to decimal + * @link http://php.net/manual/en/function.hexdec.php + * @param string $hex_string

+ * The hexadecimal string to convert + *

+ * @return number The decimal representation of hex_string + * @jms-builtin + */ +function hexdec ($hex_string) {} + +/** + * (PHP 4, PHP 5)
+ * Octal to decimal + * @link http://php.net/manual/en/function.octdec.php + * @param string $octal_string

+ * The octal string to convert + *

+ * @return number The decimal representation of octal_string + * @jms-builtin + */ +function octdec ($octal_string) {} + +/** + * (PHP 4, PHP 5)
+ * Decimal to binary + * @link http://php.net/manual/en/function.decbin.php + * @param int $number

+ * Decimal value to convert + *

+ *
ConstantDescription
ABDAY_(1-7)Abbreviated name of n-th day of the week.
DAY_(1-7)Name of the n-th day of the week (DAY_1 = Sunday).
ABMON_(1-12)Abbreviated name of the n-th month of the year.
MON_(1-12)Name of the n-th month of the year.
AM_STRString for Ante meridian.
PM_STRString for Post meridian.
D_T_FMTString that can be used as the format string for strftime to represent time and date.
D_FMTString that can be used as the format string for strftime to represent date.
T_FMTString that can be used as the format string for strftime to represent time.
T_FMT_AMPMString that can be used as the format string for strftime to represent time in 12-hour format with ante/post meridian.
ERAAlternate era.
ERA_YEARYear in alternate era format.
ERA_D_T_FMTDate and time in alternate era format (string can be used in strftime).
ERA_D_FMTDate in alternate era format (string can be used in strftime).
ERA_T_FMTTime in alternate era format (string can be used in strftime).
INT_CURR_SYMBOLInternational currency symbol.
CURRENCY_SYMBOLLocal currency symbol.
CRNCYSTRSame value as CURRENCY_SYMBOL.
MON_DECIMAL_POINTDecimal point character.
MON_THOUSANDS_SEPThousands separator (groups of three digits).
MON_GROUPINGLike "grouping" element.
POSITIVE_SIGNSign for positive values.
NEGATIVE_SIGNSign for negative values.
INT_FRAC_DIGITSInternational fractional digits.
FRAC_DIGITSLocal fractional digits.
P_CS_PRECEDESReturns 1 if CURRENCY_SYMBOL precedes a positive value.
P_SEP_BY_SPACEReturns 1 if a space separates CURRENCY_SYMBOL from a positive value.
N_CS_PRECEDESReturns 1 if CURRENCY_SYMBOL precedes a negative value.
N_SEP_BY_SPACEReturns 1 if a space separates CURRENCY_SYMBOL from a negative value.
P_SIGN_POSN
elementtypedescription
commandstring + * The command string that was passed to proc_open. + *
pidintprocess id
runningbool + * TRUE if the process is still running, FALSE if it has + * terminated. + *
signaledbool + * TRUE if the child process has been terminated by + * an uncaught signal. Always set to FALSE on Windows. + *
stoppedbool + * TRUE if the child process has been stopped by a + * signal. Always set to FALSE on Windows. + *
exitcodeint + * The exit code returned by the process (which is only + * meaningful if running is FALSE). + * Only first call of this function return real value, next calls return + * -1. + *
termsigint + * The number of the signal that caused the child process to terminate + * its execution (only meaningful if signaled is TRUE). + *
stopsigint + * The number of the signal that caused the child process to stop its + * execution (only meaningful if stopped is TRUE). + *
+ * Range of inputs on 32-bit machines + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + *
positive numbernegative numberreturn value
00
11
210
21474836461111111111111111111111111111110
2147483647 (largest signed integer)1111111111111111111111111111111 (31 1's)
2147483648-214748364810000000000000000000000000000000
4294967294-211111111111111111111111111111110
4294967295 (largest unsigned integer)-111111111111111111111111111111111 (32 1's)
+ * + * Range of inputs on 64-bit machines + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ... normal progression ... + * + * + * + * + * + * + * + * + * + * + * + *
positive numbernegative numberreturn value
00
11
210
9223372036854775806111111111111111111111111111111111111111111111111111111111111110
9223372036854775807 (largest signed integer)111111111111111111111111111111111111111111111111111111111111111 (63 1's)
-92233720368547758081000000000000000000000000000000000000000000000000000000000000000
-21111111111111111111111111111111111111111111111111111111111111110
-11111111111111111111111111111111111111111111111111111111111111111 (64 1's)
+ * @return string Binary string representation of number + * @jms-builtin + */ +function decbin ($number) {} + +/** + * (PHP 4, PHP 5)
+ * Decimal to octal + * @link http://php.net/manual/en/function.decoct.php + * @param int $number

+ * Decimal value to convert + *

+ * @return string Octal string representation of number + * @jms-builtin + */ +function decoct ($number) {} + +/** + * (PHP 4, PHP 5)
+ * Decimal to hexadecimal + * @link http://php.net/manual/en/function.dechex.php + * @param int $number

+ * Decimal value to convert + *

+ * @return string Hexadecimal string representation of number + * @jms-builtin + */ +function dechex ($number) {} + +/** + * (PHP 4, PHP 5)
+ * Convert a number between arbitrary bases + * @link http://php.net/manual/en/function.base-convert.php + * @param string $number

+ * The number to convert + *

+ * @param int $frombase

+ * The base number is in + *

+ * @param int $tobase

+ * The base to convert number to + *

+ * @return string number converted to base tobase + * @jms-builtin + */ +function base_convert ($number, $frombase, $tobase) {} + +/** + * (PHP 4, PHP 5)
+ * Format a number with grouped thousands + * @link http://php.net/manual/en/function.number-format.php + * @param float $number

+ * The number being formatted. + *

+ * @param int $decimals [optional]

+ * Sets the number of decimal points. + *

+ * @param string $dec_point [optional]

+ * Sets the separator for the decimal point. + *

+ * @param string $thousands_sep [optional]

+ * Sets the thousands separator. + *

+ * @return string A formatted version of number. + * @jms-builtin + */ +function number_format ($number, $decimals = 0, $dec_point = '.', $thousands_sep = ',') {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Returns the floating point remainder (modulo) of the division +of the arguments + * @link http://php.net/manual/en/function.fmod.php + * @param float $x

+ * The dividend + *

+ * @param float $y

+ * The divisor + *

+ * @return float The floating point remainder of + * x/y + * @jms-builtin + */ +function fmod ($x, $y) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Converts a packed internet address to a human readable representation + * @link http://php.net/manual/en/function.inet-ntop.php + * @param string $in_addr

+ * A 32bit IPv4, or 128bit IPv6 address. + *

+ * @return string a string representation of the address or FALSE on failure. + * @jms-builtin + */ +function inet_ntop ($in_addr) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Converts a human readable IP address to its packed in_addr representation + * @link http://php.net/manual/en/function.inet-pton.php + * @param string $address

+ * A human readable IPv4 or IPv6 address. + *

+ * @return string the in_addr representation of the given + * address, or FALSE if a syntactically invalid + * address is given (for example, an IPv4 address + * without dots or an IPv6 address without colons). + * @jms-builtin + */ +function inet_pton ($address) {} + +/** + * (PHP 4, PHP 5)
+ * Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address + * @link http://php.net/manual/en/function.ip2long.php + * @param string $ip_address

+ * A standard format address. + *

+ * @return int the IPv4 address or FALSE if ip_address + * is invalid. + * @jms-builtin + */ +function ip2long ($ip_address) {} + +/** + * (PHP 4, PHP 5)
+ * Converts an (IPv4) Internet network address into a string in Internet standard dotted format + * @link http://php.net/manual/en/function.long2ip.php + * @param string $proper_address

+ * A proper address representation. + *

+ * @return string the Internet IP address as a string. + * @jms-builtin + */ +function long2ip ($proper_address) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the value of an environment variable + * @link http://php.net/manual/en/function.getenv.php + * @param string $varname

+ * The variable name. + *

+ * @return string the value of the environment variable + * varname, or FALSE if the environment + * variable varname does not exist. + * @jms-builtin + */ +function getenv ($varname) {} + +/** + * (PHP 4, PHP 5)
+ * Sets the value of an environment variable + * @link http://php.net/manual/en/function.putenv.php + * @param string $setting

+ * The setting, like "FOO=BAR" + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function putenv ($setting) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Gets options from the command line argument list + * @link http://php.net/manual/en/function.getopt.php + * @param string $options Each character in this string will be used as option characters and + * matched against options passed to the script starting with a single + * hyphen (-). + * For example, an option string "x" recognizes an + * option -x. + * Only a-z, A-Z and 0-9 are allowed. + * @param array $longopts [optional] An array of options. Each element in this array will be used as option + * strings and matched against options passed to the script starting with + * two hyphens (--). + * For example, an longopts element "opt" recognizes an + * option --opt. + * @return array This function will return an array of option / argument pairs or FALSE on + * failure. + *

+ *

+ * The parsing of options will end at the first non-option found, anything + * that follows is discarded. + * @jms-builtin + */ +function getopt ($options, array $longopts = null) {} + +/** + * (PHP 5 >= 5.1.3)
+ * Gets system load average + * @link http://php.net/manual/en/function.sys-getloadavg.php + * @return array an array with three samples (last 1, 5 and 15 + * minutes). + * @jms-builtin + */ +function sys_getloadavg () {} + +/** + * (PHP 4, PHP 5)
+ * Return current Unix timestamp with microseconds + * @link http://php.net/manual/en/function.microtime.php + * @param bool $get_as_float [optional]

+ * If used and set to TRUE, microtime will return a + * float instead of a string, as described in + * the return values section below. + *

+ * @return float|string By default, microtime returns a string in + * the form "msec sec", where sec is the current time + * measured in the number of seconds since the Unix epoch (0:00:00 January 1, + * 1970 GMT), and msec is the number of microseconds that + * have elapsed since sec expressed in seconds. + *

+ *

+ * If get_as_float is set to TRUE, then + * microtime returns a float, which + * represents the current time in seconds since the Unix epoch accurate to the + * nearest microsecond. + * @jms-builtin + */ +function microtime ($get_as_float = false) {} + +/** + * (PHP 4, PHP 5)
+ * Get current time + * @link http://php.net/manual/en/function.gettimeofday.php + * @param bool $return_float [optional]

+ * When set to TRUE, a float instead of an array is returned. + *

+ * @return mixed By default an array is returned. If return_float + * is set, then a float is returned. + *

+ *

+ * Array keys: + * "sec" - seconds since the Unix Epoch + * "usec" - microseconds + * "minuteswest" - minutes west of Greenwich + * "dsttime" - type of dst correction + * @jms-builtin + */ +function gettimeofday ($return_float = false) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the current resource usages + * @link http://php.net/manual/en/function.getrusage.php + * @param int $who [optional]

+ * If who is 1, getrusage will be called with + * RUSAGE_CHILDREN. + *

+ * @return array an associative array containing the data returned from the system + * call. All entries are accessible by using their documented field names. + * @jms-builtin + */ +function getrusage ($who = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Generate a unique ID + * @link http://php.net/manual/en/function.uniqid.php + * @param string $prefix [optional]

+ * Can be useful, for instance, if you generate identifiers + * simultaneously on several hosts that might happen to generate the + * identifier at the same microsecond. + *

+ *

+ * With an empty prefix, the returned string will + * be 13 characters long. If more_entropy is + * TRUE, it will be 23 characters. + *

+ * @param bool $more_entropy [optional]

+ * If set to TRUE, uniqid will add additional + * entropy (using the combined linear congruential generator) at the end + * of the return value, which increases the likelihood that the result + * will be unique. + *

+ * @return string the unique identifier, as a string. + * @jms-builtin + */ +function uniqid ($prefix = "", $more_entropy = false) {} + +/** + * (PHP 4, PHP 5)
+ * Convert a quoted-printable string to an 8 bit string + * @link http://php.net/manual/en/function.quoted-printable-decode.php + * @param string $str

+ * The input string. + *

+ * @return string the 8-bit binary string. + * @jms-builtin + */ +function quoted_printable_decode ($str) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Convert a 8 bit string to a quoted-printable string + * @link http://php.net/manual/en/function.quoted-printable-encode.php + * @param string $str

+ * The input string. + *

+ * @return string the encoded string. + * @jms-builtin + */ +function quoted_printable_encode ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Convert from one Cyrillic character set to another + * @link http://php.net/manual/en/function.convert-cyr-string.php + * @param string $str

+ * The string to be converted. + *

+ * @param string $from

+ * The source Cyrillic character set, as a single character. + *

+ * @param string $to

+ * The target Cyrillic character set, as a single character. + *

+ * @return string the converted string. + * @jms-builtin + */ +function convert_cyr_string ($str, $from, $to) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the name of the owner of the current PHP script + * @link http://php.net/manual/en/function.get-current-user.php + * @return string the username as a string. + * @jms-builtin + */ +function get_current_user () {} + +/** + * (PHP 4, PHP 5)
+ * Limits the maximum execution time + * @link http://php.net/manual/en/function.set-time-limit.php + * @param int $seconds

+ * The maximum execution time, in seconds. If set to zero, no time limit + * is imposed. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function set_time_limit ($seconds) {} + +/** + * (No version information available, might only be in SVN)
+ * Call a header function + * @link http://php.net/manual/en/function.header-register-callback.php + * @param callable $callback

+ * Function called just before the headers are sent. It gets no parameters + * and the return value is ignored. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function header_register_callback (callable $callback) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the value of a PHP configuration option + * @link http://php.net/manual/en/function.get-cfg-var.php + * @param string $option

+ * The configuration option name. + *

+ * @return string the current value of the PHP configuration variable specified by + * option, or FALSE if an error occurs. + * @jms-builtin + */ +function get_cfg_var ($option) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of set_magic_quotes_runtime + * @link http://php.net/manual/en/function.magic-quotes-runtime.php + * @param $new_setting + * @jms-builtin + */ +function magic_quotes_runtime ($new_setting) {} + +/** + * (PHP 4, PHP 5)
+ * Sets the current active configuration setting of magic_quotes_runtime + * @link http://php.net/manual/en/function.set-magic-quotes-runtime.php + * @param bool $new_setting

+ * FALSE for off, TRUE for on. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function set_magic_quotes_runtime ($new_setting) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the current configuration setting of magic_quotes_gpc + * @link http://php.net/manual/en/function.get-magic-quotes-gpc.php + * @return bool 0 if magic_quotes_gpc is off, 1 otherwise. + * Or always returns FALSE as of PHP 5.4.0. + * @jms-builtin + */ +function get_magic_quotes_gpc () {} + +/** + * (PHP 4, PHP 5)
+ * Gets the current active configuration setting of magic_quotes_runtime + * @link http://php.net/manual/en/function.get-magic-quotes-runtime.php + * @return bool 0 if magic_quotes_runtime is off, 1 otherwise. + * Or always returns FALSE as of PHP 5.4.0. + * @jms-builtin + */ +function get_magic_quotes_runtime () {} + +/** + * (PHP 4, PHP 5)
+ * Send an error message somewhere + * @link http://php.net/manual/en/function.error-log.php + * @param string $message

+ * The error message that should be logged. + *

+ * @param int $message_type [optional]

+ * Says where the error should go. The possible message types are as + * follows: + *

+ *

+ * + * error_log log types + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
0 + * message is sent to PHP's system logger, using + * the Operating System's system logging mechanism or a file, depending + * on what the error_log + * configuration directive is set to. This is the default option. + *
1 + * message is sent by email to the address in + * the destination parameter. This is the only + * message type where the fourth parameter, + * extra_headers is used. + *
2 + * No longer an option. + *
3 + * message is appended to the file + * destination. A newline is not automatically + * added to the end of the message string. + *
4 + * message is sent directly to the SAPI logging + * handler. + *
+ *

+ * @param string $destination [optional]

+ * The destination. Its meaning depends on the + * message_type parameter as described above. + *

+ * @param string $extra_headers [optional]

+ * The extra headers. It's used when the message_type + * parameter is set to 1. + * This message type uses the same internal function as + * mail does. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function error_log ($message, $message_type = 0, $destination = null, $extra_headers = null) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Get the last occurred error + * @link http://php.net/manual/en/function.error-get-last.php + * @return array an associative array describing the last error with keys "type", + * "message", "file" and "line". If the error has been caused by a PHP + * internal function then the "message" begins with its name. + * Returns NULL if there hasn't been an error yet. + * @jms-builtin + */ +function error_get_last () {} + +/** + * (PHP 4, PHP 5)
+ * Call the callback given by the first parameter + * @link http://php.net/manual/en/function.call-user-func.php + * @param callable $callback

+ * The callable to be called. + *

+ * @param mixed $parameter [optional]

+ * Zero or more parameters to be passed to the callback. + *

+ *

+ * Note that the parameters for call_user_func are + * not passed by reference. + * call_user_func example and references + * + * error_reporting(E_ALL); + * function increment(&$var) + * { + * $var++; + * } + * $a = 0; + * call_user_func('increment', $a); + * echo $a."\n"; + * call_user_func_array('increment', array( // You can use this instead before PHP 5.3 + * echo $a."\n"; + * + * The above example will output:

+ *
+ * 0
+ * 1
+ * 
+ *

+ * @param mixed $_ [optional] + * @return mixed the return value of the callback, or FALSE on error. + * @jms-builtin + */ +function call_user_func (callable $callback, $parameter = null, $_ = null) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Call a callback with an array of parameters + * @link http://php.net/manual/en/function.call-user-func-array.php + * @param callable $callback

+ * The callable to be called. + *

+ * @param array $param_arr

+ * The parameters to be passed to the callback, as an indexed array. + *

+ * @return mixed the return value of the callback, or FALSE on error. + * @jms-builtin + */ +function call_user_func_array (callable $callback, array $param_arr) {} + +/** + * (PHP 4, PHP 5)
+ * Call a user method on an specific object [deprecated] + * @link http://php.net/manual/en/function.call-user-method.php + * @param string $method_name

+ * The method name being called. + *

+ * @param object $obj

+ * The object that method_name + * is being called on. + *

+ * @param mixed $parameter [optional] + * @param mixed $_ [optional] + * @return mixed + * @jms-builtin + */ +function call_user_method ($method_name, &$obj, $parameter = null, $_ = null) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Call a user method given with an array of parameters [deprecated] + * @link http://php.net/manual/en/function.call-user-method-array.php + * @param string $method_name

+ * The method name being called. + *

+ * @param object $obj

+ * The object that method_name + * is being called on. + *

+ * @param array $params

+ * An array of parameters. + *

+ * @return mixed + * @jms-builtin + */ +function call_user_method_array ($method_name, &$obj, array $params) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Call a static method + * @link http://php.net/manual/en/function.forward-static-call.php + * @param callable $function

+ * The function or method to be called. This parameter may be an array, + * with the name of the class, and the method, or a string, with a function + * name. + *

+ * @param mixed $parameter [optional]

+ * Zero or more parameters to be passed to the function. + *

+ * @param mixed $_ [optional] + * @return mixed the function result, or FALSE on error. + * @jms-builtin + */ +function forward_static_call (callable $function, $parameter = null, $_ = null) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Call a static method and pass the arguments as array + * @link http://php.net/manual/en/function.forward-static-call-array.php + * @param callable $function

+ * The function or method to be called. This parameter may be an array, + * with the name of the class, and the method, or a string, with a function + * name. + *

+ * @param array $parameters + * @return mixed the function result, or FALSE on error. + * @jms-builtin + */ +function forward_static_call_array (callable $function, array $parameters) {} + +/** + * (PHP 4, PHP 5)
+ * Generates a storable representation of a value + * @link http://php.net/manual/en/function.serialize.php + * @param mixed $value

+ * The value to be serialized. serialize + * handles all types, except the resource-type. + * You can even serialize arrays that contain + * references to itself. Circular references inside the array/object you + * are serializing will also be stored. Any other + * reference will be lost. + *

+ *

+ * When serializing objects, PHP will attempt to call the member function + * __sleep() prior to serialization. + * This is to allow the object to do any last minute clean-up, etc. prior + * to being serialized. Likewise, when the object is restored using + * unserialize the __wakeup() member function is called. + *

+ *

+ * Object's private members have the class name prepended to the member + * name; protected members have a '*' prepended to the member name. + * These prepended values have null bytes on either side. + *

+ * @return string a string containing a byte-stream representation of + * value that can be stored anywhere. + * @jms-builtin + */ +function serialize ($value) {} + +/** + * (PHP 4, PHP 5)
+ * Creates a PHP value from a stored representation + * @link http://php.net/manual/en/function.unserialize.php + * @param string $str

+ * The serialized string. + *

+ *

+ * If the variable being unserialized is an object, after successfully + * reconstructing the object PHP will automatically attempt to call the + * __wakeup() member + * function (if it exists). + *

+ *

+ * unserialize_callback_func directive + *

+ * It's possible to set a callback-function which will be called, + * if an undefined class should be instantiated during unserializing. + * (to prevent getting an incomplete object "__PHP_Incomplete_Class".) + * Use your php.ini, ini_set or .htaccess + * to define 'unserialize_callback_func'. Everytime an undefined class + * should be instantiated, it'll be called. To disable this feature just + * empty this setting. + *

+ *

+ * @return mixed The converted value is returned, and can be a boolean, + * integer, float, string, + * array or object. + *

+ *

+ * In case the passed string is not unserializeable, FALSE is returned and + * E_NOTICE is issued. + * @jms-builtin + */ +function unserialize ($str) {} + +/** + * (PHP 4, PHP 5)
+ * Dumps information about a variable + * @link http://php.net/manual/en/function.var-dump.php + * @param mixed $expression

+ * The variable you want to dump. + *

+ * @param mixed $_ [optional] + * @return void No value is returned. + * @jms-builtin + */ +function var_dump ($expression, $_ = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Outputs or returns a parsable string representation of a variable + * @link http://php.net/manual/en/function.var-export.php + * @param mixed $expression

+ * The variable you want to export. + *

+ * @param bool $return [optional]

+ * If used and set to TRUE, var_export will return + * the variable representation instead of outputing it. + *

+ * @return string|null the variable representation when the return + * parameter is used and evaluates to TRUE. Otherwise, this function will + * return NULL. + * @jms-builtin + */ +function var_export ($expression, $return = false) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Dumps a string representation of an internal zend value to output + * @link http://php.net/manual/en/function.debug-zval-dump.php + * @param mixed $variable

+ * The variable being evaluated. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function debug_zval_dump ($variable) {} + +/** + * (PHP 4, PHP 5)
+ * Prints human-readable information about a variable + * @link http://php.net/manual/en/function.print-r.php + * @param mixed $expression

+ * The expression to be printed. + *

+ * @param bool $return [optional]

+ * If you would like to capture the output of print_r, + * use the return parameter. When this parameter is set + * to TRUE, print_r will return the information rather than print it. + *

+ * @return mixed If given a string, integer or float, + * the value itself will be printed. If given an array, values + * will be presented in a format that shows keys and elements. Similar + * notation is used for objects. + *

+ *

+ * When the return parameter is TRUE, this function + * will return a string. Otherwise, the return value is TRUE. + * @jms-builtin + */ +function print_r ($expression, $return = false) {} + +/** + * (PHP 4 >= 4.3.2, PHP 5)
+ * Returns the amount of memory allocated to PHP + * @link http://php.net/manual/en/function.memory-get-usage.php + * @param bool $real_usage [optional]

+ * Set this to TRUE to get the real size of memory allocated from + * system. If not set or FALSE only the memory used by + * emalloc() is reported. + *

+ * @return int the memory amount in bytes. + * @jms-builtin + */ +function memory_get_usage ($real_usage = false) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Returns the peak of memory allocated by PHP + * @link http://php.net/manual/en/function.memory-get-peak-usage.php + * @param bool $real_usage [optional]

+ * Set this to TRUE to get the real size of memory allocated from + * system. If not set or FALSE only the memory used by + * emalloc() is reported. + *

+ * @return int the memory peak in bytes. + * @jms-builtin + */ +function memory_get_peak_usage ($real_usage = false) {} + +/** + * (PHP 4, PHP 5)
+ * Register a function for execution on shutdown + * @link http://php.net/manual/en/function.register-shutdown-function.php + * @param callable $callback

+ * The shutdown callback to register. + *

+ *

+ * The shutdown callbacks are executed as the part of the request, so + * it's possible to send output from them and access output buffers. + *

+ * @param mixed $parameter [optional]

+ * It is possible to pass parameters to the shutdown function by passing + * additional parameters. + *

+ * @param mixed $_ [optional] + * @return void No value is returned. + * @jms-builtin + */ +function register_shutdown_function (callable $callback, $parameter = null, $_ = null) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Register a function for execution on each tick + * @link http://php.net/manual/en/function.register-tick-function.php + * @param callable $function

+ * The function name as a string, or an array consisting of an object and + * a method. + *

+ * @param mixed $arg [optional] + * @param mixed $_ [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function register_tick_function (callable $function, $arg = null, $_ = null) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * De-register a function for execution on each tick + * @link http://php.net/manual/en/function.unregister-tick-function.php + * @param string $function_name

+ * The function name, as a string. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function unregister_tick_function ($function_name) {} + +/** + * (PHP 4, PHP 5)
+ * Syntax highlighting of a file + * @link http://php.net/manual/en/function.highlight-file.php + * @param string $filename

+ * Path to the PHP file to be highlighted. + *

+ * @param bool $return [optional]

+ * Set this parameter to TRUE to make this function return the + * highlighted code. + *

+ * @return mixed If return is set to TRUE, returns the highlighted + * code as a string instead of printing it out. Otherwise, it will return + * TRUE on success, FALSE on failure. + * @jms-builtin + */ +function highlight_file ($filename, $return = false) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of highlight_file + * @link http://php.net/manual/en/function.show-source.php + * @param $file_name + * @param $return [optional] + * @jms-builtin + */ +function show_source ($file_name, $return) {} + +/** + * (PHP 4, PHP 5)
+ * Syntax highlighting of a string + * @link http://php.net/manual/en/function.highlight-string.php + * @param string $str

+ * The PHP code to be highlighted. This should include the opening tag. + *

+ * @param bool $return [optional]

+ * Set this parameter to TRUE to make this function return the + * highlighted code. + *

+ * @return mixed If return is set to TRUE, returns the highlighted + * code as a string instead of printing it out. Otherwise, it will return + * TRUE on success, FALSE on failure. + * @jms-builtin + */ +function highlight_string ($str, $return = false) {} + +/** + * (PHP 5)
+ * Return source with stripped comments and whitespace + * @link http://php.net/manual/en/function.php-strip-whitespace.php + * @param string $filename

+ * Path to the PHP file. + *

+ * @return string The stripped source code will be returned on success, or an empty string + * on failure. + *

+ *

+ * This function works as described as of PHP 5.0.1. Before this it would + * only return an empty string. For more information on this bug and its + * prior behavior, see bug report + * #29606. + * @jms-builtin + */ +function php_strip_whitespace ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the value of a configuration option + * @link http://php.net/manual/en/function.ini-get.php + * @param string $varname

+ * The configuration option name. + *

+ * @return string the value of the configuration option as a string on success, or an + * empty string for null values. Returns FALSE if the + * configuration option doesn't exist. + * @jms-builtin + */ +function ini_get ($varname) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Gets all configuration options + * @link http://php.net/manual/en/function.ini-get-all.php + * @param string $extension [optional]

+ * An optional extension name. If set, the function return only options + * specific for that extension. + *

+ * @param bool $details [optional]

+ * Retrieve details settings or only the current value for each setting. + * Default is TRUE (retrieve details). + *

+ * @return array an associative array with directive name as the array key. + *

+ *

+ * When details is TRUE (default) the array will + * contain global_value (set in + * php.ini), local_value (perhaps set with + * ini_set or .htaccess), and + * access (the access level). + *

+ *

+ * When details is FALSE the value will be the + * current value of the option. + *

+ *

+ * See the manual section + * for information on what access levels mean. + *

+ *

+ * It's possible for a directive to have multiple access levels, which is + * why access shows the appropriate bitmask values. + * @jms-builtin + */ +function ini_get_all ($extension = null, $details = true) {} + +/** + * (PHP 4, PHP 5)
+ * Sets the value of a configuration option + * @link http://php.net/manual/en/function.ini-set.php + * @param string $varname

+ *

+ *

+ * Not all the available options can be changed using + * ini_set. There is a list of all available options + * in the appendix. + *

+ * @param string $newvalue

+ * The new value for the option. + *

+ * @return string the old value on success, FALSE on failure. + * @jms-builtin + */ +function ini_set ($varname, $newvalue) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of ini_set + * @link http://php.net/manual/en/function.ini-alter.php + * @param $varname + * @param $newvalue + * @jms-builtin + */ +function ini_alter ($varname, $newvalue) {} + +/** + * (PHP 4, PHP 5)
+ * Restores the value of a configuration option + * @link http://php.net/manual/en/function.ini-restore.php + * @param string $varname

+ * The configuration option name. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function ini_restore ($varname) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Gets the current include_path configuration option + * @link http://php.net/manual/en/function.get-include-path.php + * @return string the path, as a string. + * @jms-builtin + */ +function get_include_path () {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Sets the include_path configuration option + * @link http://php.net/manual/en/function.set-include-path.php + * @param string $new_include_path

+ * The new value for the include_path + *

+ * @return string the old include_path on + * success or FALSE on failure. + * @jms-builtin + */ +function set_include_path ($new_include_path) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Restores the value of the include_path configuration option + * @link http://php.net/manual/en/function.restore-include-path.php + * @return void No value is returned. + * @jms-builtin + */ +function restore_include_path () {} + +/** + * (PHP 4, PHP 5)
+ * Send a cookie + * @link http://php.net/manual/en/function.setcookie.php + * @param string $name

+ * The name of the cookie. + *

+ * @param string $value [optional]

+ * The value of the cookie. This value is stored on the clients computer; + * do not store sensitive information. Assuming the + * name is 'cookiename', this + * value is retrieved through $_COOKIE['cookiename'] + *

+ * @param int $expire [optional]

+ * The time the cookie expires. This is a Unix timestamp so is + * in number of seconds since the epoch. In other words, you'll + * most likely set this with the time function + * plus the number of seconds before you want it to expire. Or + * you might use mktime. + * time()+60*60*24*30 will set the cookie to + * expire in 30 days. If set to 0, or omitted, the cookie will expire at + * the end of the session (when the browser closes). + *

+ *

+ *

+ * You may notice the expire parameter takes on a + * Unix timestamp, as opposed to the date format Wdy, DD-Mon-YYYY + * HH:MM:SS GMT, this is because PHP does this conversion + * internally. + *

+ *

+ * @param string $path [optional]

+ * The path on the server in which the cookie will be available on. + * If set to '/', the cookie will be available + * within the entire domain. If set to + * '/foo/', the cookie will only be available + * within the /foo/ directory and all + * sub-directories such as /foo/bar/ of + * domain. The default value is the + * current directory that the cookie is being set in. + *

+ * @param string $domain [optional]

+ * The domain that the cookie is available to. Setting the domain to + * 'www.example.com' will make the cookie + * available in the www subdomain and higher subdomains. + * Cookies available to a lower domain, such as + * 'example.com' will be available to higher subdomains, + * such as 'www.example.com'. + * Older browsers still implementing the deprecated + * RFC 2109 may require a leading + * . to match all subdomains. + *

+ * @param bool $secure [optional]

+ * Indicates that the cookie should only be transmitted over a + * secure HTTPS connection from the client. When set to TRUE, the + * cookie will only be set if a secure connection exists. + * On the server-side, it's on the programmer to send this + * kind of cookie only on secure connection (e.g. with respect to + * $_SERVER["HTTPS"]). + *

+ * @param bool $httponly [optional]

+ * When TRUE the cookie will be made accessible only through the HTTP + * protocol. This means that the cookie won't be accessible by + * scripting languages, such as JavaScript. It has been suggested that + * this setting can effectively help to reduce identity theft through + * XSS attacks (although it is not supported by all browsers), but that + * claim is often disputed. Added in PHP 5.2.0. + * TRUE or FALSE + *

+ * @return bool If output exists prior to calling this function, + * setcookie will fail and return FALSE. If + * setcookie successfully runs, it will return TRUE. + * This does not indicate whether the user accepted the cookie. + * @jms-builtin + */ +function setcookie ($name, $value = null, $expire = 0, $path = null, $domain = null, $secure = false, $httponly = false) {} + +/** + * (PHP 5)
+ * Send a cookie without urlencoding the cookie value + * @link http://php.net/manual/en/function.setrawcookie.php + * @param string $name + * @param string $value [optional] + * @param int $expire [optional] + * @param string $path [optional] + * @param string $domain [optional] + * @param bool $secure [optional] + * @param bool $httponly [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function setrawcookie ($name, $value = null, $expire = 0, $path = null, $domain = null, $secure = false, $httponly = false) {} + +/** + * (PHP 4, PHP 5)
+ * Send a raw HTTP header + * @link http://php.net/manual/en/function.header.php + * @param string $string

+ * The header string. + *

+ *

+ * There are two special-case header calls. The first is a header + * that starts with the string "HTTP/" (case is not + * significant), which will be used to figure out the HTTP status + * code to send. For example, if you have configured Apache to + * use a PHP script to handle requests for missing files (using + * the ErrorDocument directive), you may want to + * make sure that your script generates the proper status code. + *

+ *

+ * + * header("HTTP/1.0 404 Not Found"); + * + *

+ *

+ * For FastCGI you must use the following for a 404 response: + * + * header("Status: 404 Not Found"); + * + *

+ *

+ * The second special case is the "Location:" header. Not only does + * it send this header back to the browser, but it also returns a + * REDIRECT (302) status code to the browser + * unless the 201 or + * a 3xx status code has already been set. + *

+ *

+ * + * header("Location: http://www.example.com/"); /* Redirect browser * / + * /* Make sure that code below does not get executed when we redirect. * / + * exit; + * + *

+ * @param bool $replace [optional]

+ * The optional replace parameter indicates + * whether the header should replace a previous similar header, or + * add a second header of the same type. By default it will replace, + * but if you pass in FALSE as the second argument you can force + * multiple headers of the same type. For example: + *

+ *

+ * + * header('WWW-Authenticate: Negotiate'); + * header('WWW-Authenticate: NTLM', false); + * + *

+ * @param int $http_response_code [optional]

+ * Forces the HTTP response code to the specified value. Note that this + * parameter only has an effect if the string is + * not empty. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function header ($string, $replace = true, $http_response_code = null) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Remove previously set headers + * @link http://php.net/manual/en/function.header-remove.php + * @param string $name [optional]

+ * The header name to be removed. + *

+ * This parameter is case-insensitive. + * @return void No value is returned. + * @jms-builtin + */ +function header_remove ($name = null) {} + +/** + * (PHP 4, PHP 5)
+ * Checks if or where headers have been sent + * @link http://php.net/manual/en/function.headers-sent.php + * @param string $file [optional]

+ * If the optional file and + * line parameters are set, + * headers_sent will put the PHP source file name + * and line number where output started in the file + * and line variables. + *

+ * @param int $line [optional]

+ * The line number where the output started. + *

+ * @return bool headers_sent will return FALSE if no HTTP headers + * have already been sent or TRUE otherwise. + * @jms-builtin + */ +function headers_sent (&$file = null, &$line = null) {} + +/** + * (PHP 5)
+ * Returns a list of response headers sent (or ready to send) + * @link http://php.net/manual/en/function.headers-list.php + * @return array a numerically indexed array of headers. + * @jms-builtin + */ +function headers_list () {} + +/** + * (No version information available, might only be in SVN)
+ * Get or Set the HTTP response code + * @link http://php.net/manual/en/function.http-response-code.php + * @param int $response_code [optional]

+ * The optional response_code will set the response code. + *

+ *

+ * + * http_response_code(404); + * + *

+ * @return int The current response code. By default the return value is int(200). + * @jms-builtin + */ +function http_response_code ($response_code = null) {} + +/** + * (PHP 4, PHP 5)
+ * Check whether client disconnected + * @link http://php.net/manual/en/function.connection-aborted.php + * @return int 1 if client disconnected, 0 otherwise. + * @jms-builtin + */ +function connection_aborted () {} + +/** + * (PHP 4, PHP 5)
+ * Returns connection status bitfield + * @link http://php.net/manual/en/function.connection-status.php + * @return int the connection status bitfield, which can be used against the + * CONNECTION_XXX constants to determine the connection + * status. + * @jms-builtin + */ +function connection_status () {} + +/** + * (PHP 4, PHP 5)
+ * Set whether a client disconnect should abort script execution + * @link http://php.net/manual/en/function.ignore-user-abort.php + * @param string $value [optional]

+ * If set, this function will set the ignore_user_abort ini setting + * to the given value. If not, this function will + * only return the previous setting without changing it. + *

+ * @return int the previous setting, as an integer. + * @jms-builtin + */ +function ignore_user_abort ($value = null) {} + +/** + * (PHP 4, PHP 5)
+ * Parse a configuration file + * @link http://php.net/manual/en/function.parse-ini-file.php + * @param string $filename

+ * The filename of the ini file being parsed. + *

+ * @param bool $process_sections [optional]

+ * By setting the process_sections + * parameter to TRUE, you get a multidimensional array, with + * the section names and settings included. The default + * for process_sections is FALSE + *

+ * @param int $scanner_mode [optional]

+ * Can either be INI_SCANNER_NORMAL (default) or + * INI_SCANNER_RAW. If INI_SCANNER_RAW + * is supplied, then option values will not be parsed. + *

+ * @return array The settings are returned as an associative array on success, + * and FALSE on failure. + * @jms-builtin + */ +function parse_ini_file ($filename, $process_sections = false, $scanner_mode = 'INI_SCANNER_NORMAL') {} + +/** + * (PHP 5 >= 5.3.0)
+ * Parse a configuration string + * @link http://php.net/manual/en/function.parse-ini-string.php + * @param string $ini

+ * The contents of the ini file being parsed. + *

+ * @param bool $process_sections [optional]

+ * By setting the process_sections + * parameter to TRUE, you get a multidimensional array, with + * the section names and settings included. The default + * for process_sections is FALSE + *

+ * @param int $scanner_mode [optional]

+ * Can either be INI_SCANNER_NORMAL (default) or + * INI_SCANNER_RAW. If INI_SCANNER_RAW + * is supplied, then option values will not be parsed. + *

+ * @return array The settings are returned as an associative array on success, + * and FALSE on failure. + * @jms-builtin + */ +function parse_ini_string ($ini, $process_sections = false, $scanner_mode = 'INI_SCANNER_NORMAL') {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Tells whether the file was uploaded via HTTP POST + * @link http://php.net/manual/en/function.is-uploaded-file.php + * @param string $filename

+ * The filename being checked. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function is_uploaded_file ($filename) {} + +/** + * (PHP 4 >= 4.0.3, PHP 5)
+ * Moves an uploaded file to a new location + * @link http://php.net/manual/en/function.move-uploaded-file.php + * @param string $filename

+ * The filename of the uploaded file. + *

+ * @param string $destination

+ * The destination of the moved file. + *

+ * @return bool TRUE on success. + *

+ *

+ * If filename is not a valid upload file, + * then no action will occur, and + * move_uploaded_file will return + * FALSE. + *

+ *

+ * If filename is a valid upload file, but + * cannot be moved for some reason, no action will occur, and + * move_uploaded_file will return + * FALSE. Additionally, a warning will be issued. + * @jms-builtin + */ +function move_uploaded_file ($filename, $destination) {} + +/** + * (PHP 4, PHP 5)
+ * Get the Internet host name corresponding to a given IP address + * @link http://php.net/manual/en/function.gethostbyaddr.php + * @param string $ip_address

+ * The host IP address. + *

+ * @return string the host name on success, the unmodified ip_address + * on failure, or FALSE on malformed input. + * @jms-builtin + */ +function gethostbyaddr ($ip_address) {} + +/** + * (PHP 4, PHP 5)
+ * Get the IPv4 address corresponding to a given Internet host name + * @link http://php.net/manual/en/function.gethostbyname.php + * @param string $hostname

+ * The host name. + *

+ * @return string the IPv4 address or a string containing the unmodified + * hostname on failure. + * @jms-builtin + */ +function gethostbyname ($hostname) {} + +/** + * (PHP 4, PHP 5)
+ * Get a list of IPv4 addresses corresponding to a given Internet host +name + * @link http://php.net/manual/en/function.gethostbynamel.php + * @param string $hostname

+ * The host name. + *

+ * @return array an array of IPv4 addresses or FALSE if + * hostname could not be resolved. + * @jms-builtin + */ +function gethostbynamel ($hostname) {} + +/** + * (PHP >= 5.3.0)
+ * Gets the host name + * @link http://php.net/manual/en/function.gethostname.php + * @return string a string with the hostname on success, otherwise FALSE is + * returned. + * @jms-builtin + */ +function gethostname () {} + +/** + * (PHP 5)
+ * Alias of checkdnsrr + * @link http://php.net/manual/en/function.dns-check-record.php + * @param $host + * @param $type [optional] + * @jms-builtin + */ +function dns_check_record ($host, $type) {} + +/** + * (PHP 4, PHP 5)
+ * Check DNS records corresponding to a given Internet host name or IP address + * @link http://php.net/manual/en/function.checkdnsrr.php + * @param string $host

+ * host may either be the IP address in + * dotted-quad notation or the host name. + *

+ * @param string $type [optional]

+ * type may be any one of: A, MX, NS, SOA, + * PTR, CNAME, AAAA, A6, SRV, NAPTR, TXT or ANY. + *

+ * @return bool TRUE if any records are found; returns FALSE if no records + * were found or if an error occurred. + * @jms-builtin + */ +function checkdnsrr ($host, $type = "MX") {} + +/** + * (PHP 5)
+ * Alias of getmxrr + * @link http://php.net/manual/en/function.dns-get-mx.php + * @param $hostname + * @param $mxhosts + * @param $weight [optional] + * @jms-builtin + */ +function dns_get_mx ($hostname, &$mxhosts, &$weight) {} + +/** + * (PHP 4, PHP 5)
+ * Get MX records corresponding to a given Internet host name + * @link http://php.net/manual/en/function.getmxrr.php + * @param string $hostname

+ * The Internet host name. + *

+ * @param array $mxhosts

+ * A list of the MX records found is placed into the array + * mxhosts. + *

+ * @param array $weight [optional]

+ * If the weight array is given, it will be filled + * with the weight information gathered. + *

+ * @return bool TRUE if any records are found; returns FALSE if no records + * were found or if an error occurred. + * @jms-builtin + */ +function getmxrr ($hostname, array &$mxhosts, array &$weight = null) {} + +/** + * (PHP 5)
+ * Fetch DNS Resource Records associated with a hostname + * @link http://php.net/manual/en/function.dns-get-record.php + * @param string $hostname

+ * hostname should be a valid DNS hostname such + * as "www.example.com". Reverse lookups can be generated + * using in-addr.arpa notation, but + * gethostbyaddr is more suitable for + * the majority of reverse lookups. + *

+ *

+ * Per DNS standards, email addresses are given in user.host format (for + * example: hostmaster.example.com as opposed to hostmaster@example.com), + * be sure to check this value and modify if necessary before using it + * with a functions such as mail. + *

+ * @param int $type [optional]

+ * By default, dns_get_record will search for any + * resource records associated with hostname. + * To limit the query, specify the optional type + * parameter. May be any one of the following: + * DNS_A, DNS_CNAME, + * DNS_HINFO, DNS_MX, + * DNS_NS, DNS_PTR, + * DNS_SOA, DNS_TXT, + * DNS_AAAA, DNS_SRV, + * DNS_NAPTR, DNS_A6, + * DNS_ALL or DNS_ANY. + *

+ *

+ * Because of eccentricities in the performance of libresolv + * between platforms, DNS_ANY will not + * always return every record, the slower DNS_ALL + * will collect all records more reliably. + *

+ * @param array $authns [optional]

+ * Passed by reference and, if given, will be populated with Resource + * Records for the Authoritative Name Servers. + *

+ * @param array $addtl [optional]

+ * Passed by reference and, if given, will be populated with any + * Additional Records. + *

+ * @return array This function returns an array of associative arrays, + * or FALSE on failure. Each associative array contains + * at minimum the following keys: + * + * Basic DNS attributes + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
AttributeMeaning
host + * The record in the DNS namespace to which the rest of the associated data refers. + *
class + * dns_get_record only returns Internet class records and as + * such this parameter will always return IN. + *
type + * String containing the record type. Additional attributes will also be contained + * in the resulting array dependant on the value of type. See table below. + *
ttl + * "Time To Live" remaining for this record. This will not equal + * the record's original ttl, but will rather equal the original ttl minus whatever + * length of time has passed since the authoritative name server was queried. + *
+ *

+ *

+ * + * Other keys in associative arrays dependant on 'type' + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TypeExtra Columns
A + * ip: An IPv4 addresses in dotted decimal notation. + *
MX + * pri: Priority of mail exchanger. + * Lower numbers indicate greater priority. + * target: FQDN of the mail exchanger. + * See also dns_get_mx. + *
CNAME + * target: FQDN of location in DNS namespace to which + * the record is aliased. + *
NS + * target: FQDN of the name server which is authoritative + * for this hostname. + *
PTR + * target: Location within the DNS namespace to which + * this record points. + *
TXT + * txt: Arbitrary string data associated with this record. + *
HINFO + * cpu: IANA number designating the CPU of the machine + * referenced by this record. + * os: IANA number designating the Operating System on + * the machine referenced by this record. + * See IANA's Operating System + * Names for the meaning of these values. + *
SOA + * mname: FQDN of the machine from which the resource + * records originated. + * rname: Email address of the administrative contain + * for this domain. + * serial: Serial # of this revision of the requested + * domain. + * refresh: Refresh interval (seconds) secondary name + * servers should use when updating remote copies of this domain. + * retry: Length of time (seconds) to wait after a + * failed refresh before making a second attempt. + * expire: Maximum length of time (seconds) a secondary + * DNS server should retain remote copies of the zone data without a + * successful refresh before discarding. + * minimum-ttl: Minimum length of time (seconds) a + * client can continue to use a DNS resolution before it should request + * a new resolution from the server. Can be overridden by individual + * resource records. + *
AAAA + * ipv6: IPv6 address + *
A6(PHP >= 5.1.0) + * masklen: Length (in bits) to inherit from the target + * specified by chain. + * ipv6: Address for this specific record to merge with + * chain. + * chain: Parent record to merge with + * ipv6 data. + *
SRV + * pri: (Priority) lowest priorities should be used first. + * weight: Ranking to weight which of commonly prioritized + * targets should be chosen at random. + * target and port: hostname and port + * where the requested service can be found. + * For additional information see: RFC 2782 + *
NAPTR + * order and pref: Equivalent to + * pri and weight above. + * flags, services, regex, + * and replacement: Parameters as defined by + * RFC 2915. + *
+ * @jms-builtin + */ +function dns_get_record ($hostname, $type = 'DNS_ANY', array &$authns = null, array &$addtl = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get the integer value of a variable + * @link http://php.net/manual/en/function.intval.php + * @param mixed $var

+ * The scalar value being converted to an integer + *

+ * @param int $base [optional]

+ * The base for the conversion + *

+ * @return int The integer value of var on success, or 0 on + * failure. Empty arrays return 0, non-empty arrays return 1. + *

+ *

+ * The maximum value depends on the system. 32 bit systems have a + * maximum signed integer range of -2147483648 to 2147483647. So for example + * on such a system, intval('1000000000000') will return + * 2147483647. The maximum signed integer value for 64 bit systems is + * 9223372036854775807. + *

+ *

+ * Strings will most likely return 0 although this depends on the + * leftmost characters of the string. The common rules of + * integer casting + * apply. + * @jms-builtin + */ +function intval ($var, $base = 10) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get float value of a variable + * @link http://php.net/manual/en/function.floatval.php + * @param mixed $var

+ * May be any scalar type. floatval should not be used + * on objects, as doing so will emit an E_NOTICE level + * error and return 1. + *

+ * @return float The float value of the given variable. Empty arrays return 0, non-empty + * arrays return 1. + * @jms-builtin + */ +function floatval ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of floatval + * @link http://php.net/manual/en/function.doubleval.php + * @param $var + * @jms-builtin + */ +function doubleval ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Get string value of a variable + * @link http://php.net/manual/en/function.strval.php + * @param mixed $var

+ * The variable that is being converted to a string. + *

+ *

+ * var may be any scalar type or an object that + * implements the __toString() + * method. You cannot use strval on arrays or on + * objects that do not implement the + * __toString() method. + *

+ * @return string The string value of var. + * @jms-builtin + */ +function strval ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Get the type of a variable + * @link http://php.net/manual/en/function.gettype.php + * @param mixed $var

+ * The variable being type checked. + *

+ * @return string Possibles values for the returned string are: + * "boolean" + * "integer" + * "double" (for historical reasons "double" is + * returned in case of a float, and not simply + * "float") + * "string" + * "array" + * "object" + * "resource" + * "NULL" + * "unknown type" + * @jms-builtin + */ +function gettype ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Set the type of a variable + * @link http://php.net/manual/en/function.settype.php + * @param mixed $var

+ * The variable being converted. + *

+ * @param string $type

+ * Possibles values of type are: + * "boolean" (or, since PHP 4.2.0, "bool") + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function settype (&$var, $type) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Finds whether a variable is NULL + * @link http://php.net/manual/en/function.is-null.php + * @param mixed $var

+ * The variable being evaluated. + *

+ * @return bool TRUE if var is null, FALSE + * otherwise. + * @jms-builtin + */ +function is_null ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Finds whether a variable is a resource + * @link http://php.net/manual/en/function.is-resource.php + * @param mixed $var

+ * The variable being evaluated. + *

+ * @return bool TRUE if var is a resource, + * FALSE otherwise. + * @jms-builtin + */ +function is_resource ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Finds out whether a variable is a boolean + * @link http://php.net/manual/en/function.is-bool.php + * @param mixed $var

+ * The variable being evaluated. + *

+ * @return bool TRUE if var is a boolean, + * FALSE otherwise. + * @jms-builtin + */ +function is_bool ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of is_int + * @link http://php.net/manual/en/function.is-long.php + * @param $var + * @jms-builtin + */ +function is_long ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Finds whether the type of a variable is float + * @link http://php.net/manual/en/function.is-float.php + * @param mixed $var

+ * The variable being evaluated. + *

+ * @return bool TRUE if var is a float, + * FALSE otherwise. + * @jms-builtin + */ +function is_float ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Find whether the type of a variable is integer + * @link http://php.net/manual/en/function.is-int.php + * @param mixed $var

+ * The variable being evaluated. + *

+ * @return bool TRUE if var is an integer, + * FALSE otherwise. + * @jms-builtin + */ +function is_int ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of is_int + * @link http://php.net/manual/en/function.is-integer.php + * @param $var + * @jms-builtin + */ +function is_integer ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of is_float + * @link http://php.net/manual/en/function.is-double.php + * @param $var + * @jms-builtin + */ +function is_double ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of is_float + * @link http://php.net/manual/en/function.is-real.php + * @param $var + * @jms-builtin + */ +function is_real ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Finds whether a variable is a number or a numeric string + * @link http://php.net/manual/en/function.is-numeric.php + * @param mixed $var

+ * The variable being evaluated. + *

+ * @return bool TRUE if var is a number or a numeric + * string, FALSE otherwise. + * @jms-builtin + */ +function is_numeric ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Find whether the type of a variable is string + * @link http://php.net/manual/en/function.is-string.php + * @param mixed $var

+ * The variable being evaluated. + *

+ * @return bool TRUE if var is of type string, + * FALSE otherwise. + * @jms-builtin + */ +function is_string ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Finds whether a variable is an array + * @link http://php.net/manual/en/function.is-array.php + * @param mixed $var

+ * The variable being evaluated. + *

+ * @return bool TRUE if var is an array, + * FALSE otherwise. + * @jms-builtin + */ +function is_array ($var) {} + +/** + * (PHP 4, PHP 5)
+ * Finds whether a variable is an object + * @link http://php.net/manual/en/function.is-object.php + * @param mixed $var

+ * The variable being evaluated. + *

+ * @return bool TRUE if var is an object, + * FALSE otherwise. + * @jms-builtin + */ +function is_object ($var) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Finds whether a variable is a scalar + * @link http://php.net/manual/en/function.is-scalar.php + * @param mixed $var

+ * The variable being evaluated. + *

+ * @return bool TRUE if var is a scalar FALSE + * otherwise. + * @jms-builtin + */ +function is_scalar ($var) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Verify that the contents of a variable can be called as a function + * @link http://php.net/manual/en/function.is-callable.php + * @param mixed $name

+ * The callback function to check + *

+ * @param bool $syntax_only [optional]

+ * If set to TRUE the function only verifies that + * name might be a function or method. It will only + * reject simple variables that are not strings, or an array that does + * not have a valid structure to be used as a callback. The valid ones + * are supposed to have only 2 entries, the first of which is an object + * or a string, and the second a string. + *

+ * @param string $callable_name [optional]

+ * Receives the "callable name". In the example below it is + * "someClass::someMethod". Note, however, that despite the implication + * that someClass::SomeMethod() is a callable static method, this is not + * the case. + *

+ * @return bool TRUE if name is callable, FALSE + * otherwise. + * @jms-builtin + */ +function is_callable (callable $name, $syntax_only = false, &$callable_name = null) {} + +/** + * (PHP 4, PHP 5)
+ * Closes process file pointer + * @link http://php.net/manual/en/function.pclose.php + * @param resource $handle

+ * The file pointer must be valid, and must have been returned by a + * successful call to popen. + *

+ * @return int the termination status of the process that was run. In case of + * an error then -1 is returned. + * @jms-builtin + */ +function pclose ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Opens process file pointer + * @link http://php.net/manual/en/function.popen.php + * @param string $command

+ * The command + *

+ * @param string $mode

+ * The mode + *

+ * @return resource a file pointer identical to that returned by + * fopen, except that it is unidirectional (may + * only be used for reading or writing) and must be closed with + * pclose. This pointer may be used with + * fgets, fgetss, and + * fwrite. When the mode is 'r', the returned + * file pointer equals to the STDOUT of the command, when the mode + * is 'w', the returned file pointer equals to the STDIN of the + * command. + *

+ *

+ * If an error occurs, returns FALSE. + * @jms-builtin + */ +function popen ($command, $mode) {} + +/** + * (PHP 4, PHP 5)
+ * Outputs a file + * @link http://php.net/manual/en/function.readfile.php + * @param string $filename

+ * The filename being read. + *

+ * @param bool $use_include_path [optional]

+ * You can use the optional second parameter and set it to TRUE, if + * you want to search for the file in the include_path, too. + *

+ * @param resource $context [optional]

+ * A context stream resource. + *

+ * @return int the number of bytes read from the file. If an error + * occurs, FALSE is returned and unless the function was called as + * @readfile, an error message is printed. + * @jms-builtin + */ +function readfile ($filename, $use_include_path = false, $context = null) {} + +/** + * (PHP 4, PHP 5)
+ * Rewind the position of a file pointer + * @link http://php.net/manual/en/function.rewind.php + * @param resource $handle

+ * The file pointer must be valid, and must point to a file + * successfully opened by fopen. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function rewind ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Removes directory + * @link http://php.net/manual/en/function.rmdir.php + * @param string $dirname

+ * Path to the directory. + *

+ * @param resource $context [optional] Context support was added + * with PHP 5.0.0. For a description of contexts, refer to + * . + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function rmdir ($dirname, $context = null) {} + +/** + * (PHP 4, PHP 5)
+ * Changes the current umask + * @link http://php.net/manual/en/function.umask.php + * @param int $mask [optional]

+ * The new umask. + *

+ * @return int umask without arguments simply returns the + * current umask otherwise the old umask is returned. + * @jms-builtin + */ +function umask ($mask = null) {} + +/** + * (PHP 4, PHP 5)
+ * Closes an open file pointer + * @link http://php.net/manual/en/function.fclose.php + * @param resource $handle

+ * The file pointer must be valid, and must point to a file successfully + * opened by fopen or fsockopen. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function fclose ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Tests for end-of-file on a file pointer + * @link http://php.net/manual/en/function.feof.php + * @param resource $handle The file pointer must be valid, and must point to + * a file successfully opened by fopen or + * fsockopen (and not yet closed by + * fclose).

+ * @return bool TRUE if the file pointer is at EOF or an error occurs + * (including socket timeout); otherwise returns FALSE. + * @jms-builtin + */ +function feof ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Gets character from file pointer + * @link http://php.net/manual/en/function.fgetc.php + * @param resource $handle The file pointer must be valid, and must point to + * a file successfully opened by fopen or + * fsockopen (and not yet closed by + * fclose).

+ * @return string a string containing a single character read from the file pointed + * to by handle. Returns FALSE on EOF. + * @jms-builtin + */ +function fgetc ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Gets line from file pointer + * @link http://php.net/manual/en/function.fgets.php + * @param resource $handle The file pointer must be valid, and must point to + * a file successfully opened by fopen or + * fsockopen (and not yet closed by + * fclose).

+ * @param int $length [optional]

+ * Reading ends when length - 1 bytes have been + * read, on a newline (which is included in the return value), or on EOF + * (whichever comes first). If no length is specified, it will keep + * reading from the stream until it reaches the end of the line. + *

+ *

+ * Until PHP 4.3.0, omitting it would assume 1024 as the line length. + * If the majority of the lines in the file are all larger than 8KB, + * it is more resource efficient for your script to specify the maximum + * line length. + *

+ * @return string a string of up to length - 1 bytes read from + * the file pointed to by handle. If there is no more data + * to read in the file pointer, then FALSE is returned. + *

+ *

+ * If an error occurs, FALSE is returned. + * @jms-builtin + */ +function fgets ($handle, $length = null) {} + +/** + * (PHP 4, PHP 5)
+ * Gets line from file pointer and strip HTML tags + * @link http://php.net/manual/en/function.fgetss.php + * @param resource $handle The file pointer must be valid, and must point to + * a file successfully opened by fopen or + * fsockopen (and not yet closed by + * fclose).

+ * @param int $length [optional]

+ * Length of the data to be retrieved. + *

+ * @param string $allowable_tags [optional]

+ * You can use the optional third parameter to specify tags which should + * not be stripped. + *

+ * @return string a string of up to length - 1 bytes read from + * the file pointed to by handle, with all HTML and PHP + * code stripped. + *

+ *

+ * If an error occurs, returns FALSE. + * @jms-builtin + */ +function fgetss ($handle, $length = null, $allowable_tags = null) {} + +/** + * (PHP 4, PHP 5)
+ * Binary-safe file read + * @link http://php.net/manual/en/function.fread.php + * @param resource $handle A file system pointer resource + * that is typically created using fopen.

+ * @param int $length

+ * Up to length number of bytes read. + *

+ * @return string the read string or FALSE on failure. + * @jms-builtin + */ +function fread ($handle, $length) {} + +/** + * (PHP 4, PHP 5)
+ * Opens file or URL + * @link http://php.net/manual/en/function.fopen.php + * @param string $filename

+ * If filename is of the form "scheme://...", it + * is assumed to be a URL and PHP will search for a protocol handler + * (also known as a wrapper) for that scheme. If no wrappers for that + * protocol are registered, PHP will emit a notice to help you track + * potential problems in your script and then continue as though + * filename specifies a regular file. + *

+ *

+ * If PHP has decided that filename specifies + * a local file, then it will try to open a stream on that file. + * The file must be accessible to PHP, so you need to ensure that + * the file access permissions allow this access. + * If you have enabled safe mode, + * or open_basedir further + * restrictions may apply. + *

+ *

+ * If PHP has decided that filename specifies + * a registered protocol, and that protocol is registered as a + * network URL, PHP will check to make sure that + * allow_url_fopen is + * enabled. If it is switched off, PHP will emit a warning and + * the fopen call will fail. + *

+ *

+ * The list of supported protocols can be found in . Some protocols (also referred to as + * wrappers) support context + * and/or php.ini options. Refer to the specific page for the + * protocol in use for a list of options which can be set. (e.g. + * php.ini value user_agent used by the + * http wrapper). + *

+ *

+ * On the Windows platform, be careful to escape any backslashes + * used in the path to the file, or use forward slashes. + * + * $handle = fopen("c:\\folder\\resource.txt", "r"); + * + *

+ * @param string $mode

+ * The mode parameter specifies the type of access + * you require to the stream. It may be any of the following: + * + * A list of possible modes for fopen + * using mode + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
modeDescription
'r' + * Open for reading only; place the file pointer at the + * beginning of the file. + *
'r+' + * Open for reading and writing; place the file pointer at + * the beginning of the file. + *
'w' + * Open for writing only; place the file pointer at the + * beginning of the file and truncate the file to zero length. + * If the file does not exist, attempt to create it. + *
'w+' + * Open for reading and writing; place the file pointer at + * the beginning of the file and truncate the file to zero + * length. If the file does not exist, attempt to create it. + *
'a' + * Open for writing only; place the file pointer at the end of + * the file. If the file does not exist, attempt to create it. + *
'a+' + * Open for reading and writing; place the file pointer at + * the end of the file. If the file does not exist, attempt to + * create it. + *
'x' + * Create and open for writing only; place the file pointer at the + * beginning of the file. If the file already exists, the + * fopen call will fail by returning FALSE and + * generating an error of level E_WARNING. If + * the file does not exist, attempt to create it. This is equivalent + * to specifying O_EXCL|O_CREAT flags for the + * underlying open(2) system call. + *
'x+' + * Create and open for reading and writing; otherwise it has the + * same behavior as 'x'. + *
'c' + * Open the file for writing only. If the file does not exist, it is + * created. If it exists, it is neither truncated (as opposed to + * 'w'), nor the call to this function fails (as is + * the case with 'x'). The file pointer is + * positioned on the beginning of the file. This may be useful if it's + * desired to get an advisory lock (see flock) + * before attempting to modify the file, as using + * 'w' could truncate the file before the lock + * was obtained (if truncation is desired, + * ftruncate can be used after the lock is + * requested). + *
'c+' + * Open the file for reading and writing; otherwise it has the same + * behavior as 'c'. + *
+ *

+ *

+ * Different operating system families have different line-ending + * conventions. When you write a text file and want to insert a line + * break, you need to use the correct line-ending character(s) for your + * operating system. Unix based systems use \n as the + * line ending character, Windows based systems use \r\n + * as the line ending characters and Macintosh based systems use + * \r as the line ending character. + *

+ *

+ * If you use the wrong line ending characters when writing your files, you + * might find that other applications that open those files will "look + * funny". + *

+ *

+ * Windows offers a text-mode translation flag ('t') + * which will transparently translate \n to + * \r\n when working with the file. In contrast, you + * can also use 'b' to force binary mode, which will not + * translate your data. To use these flags, specify either + * 'b' or 't' as the last character + * of the mode parameter. + *

+ *

+ * The default translation mode depends on the SAPI and version of PHP that + * you are using, so you are encouraged to always specify the appropriate + * flag for portability reasons. You should use the 't' + * mode if you are working with plain-text files and you use + * \n to delimit your line endings in your script, but + * expect your files to be readable with applications such as notepad. You + * should use the 'b' in all other cases. + *

+ *

+ * If you do not specify the 'b' flag when working with binary files, you + * may experience strange problems with your data, including broken image + * files and strange problems with \r\n characters. + *

+ *

+ * For portability, it is strongly recommended that you always + * use the 'b' flag when opening files with fopen. + *

+ *

+ * Again, for portability, it is also strongly recommended that + * you re-write code that uses or relies upon the 't' + * mode so that it uses the correct line endings and + * 'b' mode instead. + *

+ * @param bool $use_include_path [optional]

+ * The optional third use_include_path parameter + * can be set to '1' or TRUE if you want to search for the file in the + * include_path, too. + *

+ * @param resource $context [optional] Context support was added + * with PHP 5.0.0. For a description of contexts, refer to + * . + * @return resource a file pointer resource on success, or FALSE on error. + * @jms-builtin + */ +function fopen ($filename, $mode, $use_include_path = false, $context = null) {} + +/** + * (PHP 4, PHP 5)
+ * Output all remaining data on a file pointer + * @link http://php.net/manual/en/function.fpassthru.php + * @param resource $handle The file pointer must be valid, and must point to + * a file successfully opened by fopen or + * fsockopen (and not yet closed by + * fclose).

+ * @return int If an error occurs, fpassthru returns + * FALSE. Otherwise, fpassthru returns + * the number of characters read from handle + * and passed through to the output. + * @jms-builtin + */ +function fpassthru ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Truncates a file to a given length + * @link http://php.net/manual/en/function.ftruncate.php + * @param resource $handle

+ * The file pointer. + *

+ *

+ * The handle must be open for writing. + *

+ * @param int $size

+ * The size to truncate to. + *

+ *

+ * If size is larger than the file then the file + * is extended with null bytes. + *

+ *

+ * If size is smaller than the file then the file + * is truncated to that size. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ftruncate ($handle, $size) {} + +/** + * (PHP 4, PHP 5)
+ * Gets information about a file using an open file pointer + * @link http://php.net/manual/en/function.fstat.php + * @param resource $handle A file system pointer resource + * that is typically created using fopen.

+ * @return array an array with the statistics of the file; the format of the array + * is described in detail on the stat manual page. + * @jms-builtin + */ +function fstat ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Seeks on a file pointer + * @link http://php.net/manual/en/function.fseek.php + * @param resource $handle A file system pointer resource + * that is typically created using fopen.

+ * @param int $offset

+ * The offset. + *

+ *

+ * To move to a position before the end-of-file, you need to pass + * a negative value in offset and + * set whence + * to SEEK_END. + *

+ * @param int $whence [optional]

+ * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + * SEEK_END - Set position to end-of-file plus offset. + *

+ * @return int Upon success, returns 0; otherwise, returns -1. + * @jms-builtin + */ +function fseek ($handle, $offset, $whence = 'SEEK_SET') {} + +/** + * (PHP 4, PHP 5)
+ * Returns the current position of the file read/write pointer + * @link http://php.net/manual/en/function.ftell.php + * @param resource $handle

+ * The file pointer must be valid, and must point to a file successfully + * opened by fopen or popen. + * ftell gives undefined results for append-only streams + * (opened with "a" flag). + *

+ * @return int the position of the file pointer referenced by + * handle as an integer; i.e., its offset into the file stream. + *

+ *

+ * If an error occurs, returns FALSE. + * @jms-builtin + */ +function ftell ($handle) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Flushes the output to a file + * @link http://php.net/manual/en/function.fflush.php + * @param resource $handle The file pointer must be valid, and must point to + * a file successfully opened by fopen or + * fsockopen (and not yet closed by + * fclose).

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function fflush ($handle) {} + +/** + * (PHP 4, PHP 5)
+ * Binary-safe file write + * @link http://php.net/manual/en/function.fwrite.php + * @param resource $handle A file system pointer resource + * that is typically created using fopen.

+ * @param string $string

+ * The string that is to be written. + *

+ * @param int $length [optional]

+ * If the length argument is given, writing will + * stop after length bytes have been written or + * the end of string is reached, whichever comes + * first. + *

+ *

+ * Note that if the length argument is given, + * then the magic_quotes_runtime + * configuration option will be ignored and no slashes will be + * stripped from string. + *

+ * @return int + * @jms-builtin + */ +function fwrite ($handle, $string, $length = null) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of fwrite + * @link http://php.net/manual/en/function.fputs.php + * @param $fp + * @param $str + * @param $length [optional] + * @jms-builtin + */ +function fputs ($fp, $str, $length) {} + +/** + * (PHP 4, PHP 5)
+ * Makes directory + * @link http://php.net/manual/en/function.mkdir.php + * @param string $pathname

+ * The directory path. + *

+ * @param int $mode [optional]

+ * The mode is 0777 by default, which means the widest possible + * access. For more information on modes, read the details + * on the chmod page. + *

+ *

+ * mode is ignored on Windows. + *

+ *

+ * Note that you probably want to specify the mode as an octal number, + * which means it should have a leading zero. The mode is also modified + * by the current umask, which you can change using + * umask. + *

+ * @param bool $recursive [optional]

+ * Allows the creation of nested directories specified in the + * pathname. + *

+ * @param resource $context [optional] Context support was added + * with PHP 5.0.0. For a description of contexts, refer to + * . + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function mkdir ($pathname, $mode = 0777, $recursive = false, $context = null) {} + +/** + * (PHP 4, PHP 5)
+ * Renames a file or directory + * @link http://php.net/manual/en/function.rename.php + * @param string $oldname

+ *

+ *

+ * The old name. The wrapper used in oldname + * must match the wrapper used in + * newname. + *

+ * @param string $newname

+ * The new name. + *

+ * @param resource $context [optional] Context support was added + * with PHP 5.0.0. For a description of contexts, refer to + * . + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function rename ($oldname, $newname, $context = null) {} + +/** + * (PHP 4, PHP 5)
+ * Copies file + * @link http://php.net/manual/en/function.copy.php + * @param string $source

+ * Path to the source file. + *

+ * @param string $dest

+ * The destination path. If dest is a URL, the + * copy operation may fail if the wrapper does not support overwriting of + * existing files. + *

+ *

+ * If the destination file already exists, it will be overwritten. + *

+ * @param resource $context [optional]

+ * A valid context resource created with + * stream_context_create. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function copy ($source, $dest, $context = null) {} + +/** + * (PHP 4, PHP 5)
+ * Create file with unique file name + * @link http://php.net/manual/en/function.tempnam.php + * @param string $dir

+ * The directory where the temporary filename will be created. + *

+ * @param string $prefix

+ * The prefix of the generated temporary filename. + *

+ * Windows uses only the first three characters of prefix. + * @return string the new temporary filename, or FALSE on + * failure. + * @jms-builtin + */ +function tempnam ($dir, $prefix) {} + +/** + * (PHP 4, PHP 5)
+ * Creates a temporary file + * @link http://php.net/manual/en/function.tmpfile.php + * @return resource a file handle, similar to the one returned by + * fopen, for the new file or FALSE on failure. + * @jms-builtin + */ +function tmpfile () {} + +/** + * (PHP 4, PHP 5)
+ * Reads entire file into an array + * @link http://php.net/manual/en/function.file.php + * @param string $filename

+ * Path to the file. + *

+ * A URL can be used as a + * filename with this function if the fopen wrappers have been enabled. + * See fopen for more details on how to specify the + * filename. See the for links to information + * about what abilities the various wrappers have, notes on their usage, + * and information on any predefined variables they may + * provide. + * @param int $flags [optional]

+ * The optional parameter flags can be one, or + * more, of the following constants: + * FILE_USE_INCLUDE_PATH + * Search for the file in the include_path. + * @param resource $context [optional]

+ * A context resource created with the + * stream_context_create function. + *

+ *

+ * Context support was added + * with PHP 5.0.0. For a description of contexts, refer to + * . + *

+ * @return array the file in an array. Each element of the array corresponds to a + * line in the file, with the newline still attached. Upon failure, + * file returns FALSE. + *

+ *

+ * Each line in the resulting array will include the line ending, unless + * FILE_IGNORE_NEW_LINES is used, so you still need to + * use rtrim if you do not want the line ending + * present. + * @jms-builtin + */ +function file ($filename, $flags = 0, $context = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Reads entire file into a string + * @link http://php.net/manual/en/function.file-get-contents.php + * @param string $filename

+ * Name of the file to read. + *

+ * @param bool $use_include_path [optional]

+ * As of PHP 5 the FILE_USE_INCLUDE_PATH can be used + * to trigger include path + * search. + *

+ * @param resource $context [optional]

+ * A valid context resource created with + * stream_context_create. If you don't need to use a + * custom context, you can skip this parameter by NULL. + *

+ * @param int $offset [optional]

+ * The offset where the reading starts on the original stream. + *

+ *

+ * Seeking (offset) is not supported with remote files. + * Attempting to seek on non-local files may work with small offsets, but this + * is unpredictable because it works on the buffered stream. + *

+ * @param int $maxlen [optional]

+ * Maximum length of data read. The default is to read until end + * of file is reached. Note that this parameter is applied to the + * stream processed by the filters. + *

+ * @return string The function returns the read data or FALSE on failure. + * @jms-builtin + */ +function file_get_contents ($filename, $use_include_path = false, $context = null, $offset = -1, $maxlen = null) {} + +/** + * (PHP 5)
+ * Write a string to a file + * @link http://php.net/manual/en/function.file-put-contents.php + * @param string $filename

+ * Path to the file where to write the data. + *

+ * @param mixed $data

+ * The data to write. Can be either a string, an + * array or a stream resource. + *

+ *

+ * If data is a stream resource, the + * remaining buffer of that stream will be copied to the specified file. + * This is similar with using stream_copy_to_stream. + *

+ *

+ * You can also specify the data parameter as a single + * dimension array. This is equivalent to + * file_put_contents($filename, implode('', $array)). + *

+ * @param int $flags [optional]

+ * The value of flags can be any combination of + * the following flags, joined with the binary OR (|) + * operator. + *

+ *

+ * + * Available flags + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
+ * FILE_USE_INCLUDE_PATH + * + * Search for filename in the include directory. + * See include_path for more + * information. + *
+ * FILE_APPEND + * + * If file filename already exists, append + * the data to the file instead of overwriting it. + *
+ * LOCK_EX + * + * Acquire an exclusive lock on the file while proceeding to the + * writing. + *
+ *

+ * @param resource $context [optional]

+ * A valid context resource created with + * stream_context_create. + *

+ * @return int The function returns the number of bytes that were written to the file, or + * FALSE on failure. + * @jms-builtin + */ +function file_put_contents ($filename, $data, $flags = 0, $context = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Runs the equivalent of the select() system call on the given +arrays of streams with a timeout specified by tv_sec and tv_usec + * @link http://php.net/manual/en/function.stream-select.php + * @param array $read

+ * The streams listed in the read array will be watched to + * see if characters become available for reading (more precisely, to see if + * a read will not block - in particular, a stream resource is also ready on + * end-of-file, in which case an fread will return + * a zero length string). + *

+ * @param array $write

+ * The streams listed in the write array will be + * watched to see if a write will not block. + *

+ * @param array $except

+ * The streams listed in the except array will be + * watched for high priority exceptional ("out-of-band") data arriving. + *

+ *

+ * When stream_select returns, the arrays + * read, write and + * except are modified to indicate which stream + * resource(s) actually changed status. + *

+ * You do not need to pass every array to + * stream_select. You can leave it out and use an + * empty array or NULL instead. Also do not forget that those arrays are + * passed by reference and will be modified after + * stream_select returns. + * @param int $tv_sec

+ * The tv_sec and tv_usec + * together form the timeout parameter, + * tv_sec specifies the number of seconds while + * tv_usec the number of microseconds. + * The timeout is an upper bound on the amount of time + * that stream_select will wait before it returns. + * If tv_sec and tv_usec are + * both set to 0, stream_select will + * not wait for data - instead it will return immediately, indicating the + * current status of the streams. + *

+ *

+ * If tv_sec is NULL stream_select + * can block indefinitely, returning only when an event on one of the + * watched streams occurs (or if a signal interrupts the system call). + *

+ *

+ * Using a timeout value of 0 allows you to + * instantaneously poll the status of the streams, however, it is NOT a + * good idea to use a 0 timeout value in a loop as it + * will cause your script to consume too much CPU time. + *

+ *

+ * It is much better to specify a timeout value of a few seconds, although + * if you need to be checking and running other code concurrently, using a + * timeout value of at least 200000 microseconds will + * help reduce the CPU usage of your script. + *

+ *

+ * Remember that the timeout value is the maximum time that will elapse; + * stream_select will return as soon as the + * requested streams are ready for use. + *

+ * @param int $tv_usec [optional]

+ * See tv_sec description. + *

+ * @return int On success stream_select returns the number of + * stream resources contained in the modified arrays, which may be zero if + * the timeout expires before anything interesting happens. On error FALSE + * is returned and a warning raised (this can happen if the system call is + * interrupted by an incoming signal). + * @jms-builtin + */ +function stream_select (array &$read, array &$write, array &$except, $tv_sec, $tv_usec = 0) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Creates a stream context + * @link http://php.net/manual/en/function.stream-context-create.php + * @param array $options [optional]

+ * Must be an associative array of associative arrays in the format + * $arr['wrapper']['option'] = $value. + *

+ *

+ * Default to an empty array. + *

+ * @param array $params [optional]

+ * Must be an associative array in the format + * $arr['parameter'] = $value. + * Refer to context parameters for + * a listing of standard stream parameters. + *

+ * @return resource A stream context resource. + * @jms-builtin + */ +function stream_context_create (array $options = null, array $params = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Set parameters for a stream/wrapper/context + * @link http://php.net/manual/en/function.stream-context-set-params.php + * @param resource $stream_or_context

+ * The stream or context to apply the parameters too. + *

+ * @param array $params

+ * An array of parameters to set. + *

+ *

+ * params should be an associative array of the structure: + * $params['paramname'] = "paramvalue";. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function stream_context_set_params ($stream_or_context, array $params) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Retrieves parameters from a context + * @link http://php.net/manual/en/function.stream-context-get-params.php + * @param resource $stream_or_context

+ * A stream resource or a + * context resource + *

+ * @return array an associate array containing all context options and parameters. + * @jms-builtin + */ +function stream_context_get_params ($stream_or_context) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Sets an option for a stream/wrapper/context + * @link http://php.net/manual/en/function.stream-context-set-option.php + * @param resource $stream_or_context

+ * The stream or context resource to apply the options too. + *

+ * @param string $wrapper + * @param string $option + * @param mixed $value + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function stream_context_set_option ($stream_or_context, $wrapper, $option, $value) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Retrieve options for a stream/wrapper/context + * @link http://php.net/manual/en/function.stream-context-get-options.php + * @param resource $stream_or_context

+ * The stream or context to get options from + *

+ * @return array an associative array with the options. + * @jms-builtin + */ +function stream_context_get_options ($stream_or_context) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Retrieve the default stream context + * @link http://php.net/manual/en/function.stream-context-get-default.php + * @param array $options [optional] options must be an associative + * array of associative arrays in the format + * $arr['wrapper']['option'] = $value. + *

+ * As of PHP 5.3.0, the stream_context_set_default function + * can be used to set the default context. + *

+ * @return resource A stream context resource. + * @jms-builtin + */ +function stream_context_get_default (array $options = null) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Set the default stream context + * @link http://php.net/manual/en/function.stream-context-set-default.php + * @param array $options

+ * The options to set for the default context. + *

+ *

+ * options must be an associative + * array of associative arrays in the format + * $arr['wrapper']['option'] = $value. + *

+ * @return resource the default stream context. + * @jms-builtin + */ +function stream_context_set_default (array $options) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Attach a filter to a stream + * @link http://php.net/manual/en/function.stream-filter-prepend.php + * @param resource $stream

+ * The target stream. + *

+ * @param string $filtername

+ * The filter name. + *

+ * @param int $read_write [optional]

+ * By default, stream_filter_prepend will + * attach the filter to the read filter chain + * if the file was opened for reading (i.e. File Mode: + * r, and/or +). The filter + * will also be attached to the write filter chain + * if the file was opened for writing (i.e. File Mode: + * w, a, and/or +). + * STREAM_FILTER_READ, + * STREAM_FILTER_WRITE, and/or + * STREAM_FILTER_ALL can also be passed to the + * read_write parameter to override this behavior. + * See stream_filter_append for an example of + * using this parameter. + *

+ * @param mixed $params [optional]

+ * This filter will be added with the specified params + * to the beginning of the list and will therefore be + * called first during stream operations. To add a filter to the end of the + * list, use stream_filter_append. + *

+ * @return resource a resource which can be used to refer to this filter + * instance during a call to stream_filter_remove. + * @jms-builtin + */ +function stream_filter_prepend ($stream, $filtername, $read_write = null, $params = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Attach a filter to a stream + * @link http://php.net/manual/en/function.stream-filter-append.php + * @param resource $stream

+ * The target stream. + *

+ * @param string $filtername

+ * The filter name. + *

+ * @param int $read_write [optional]

+ * By default, stream_filter_append will + * attach the filter to the read filter chain + * if the file was opened for reading (i.e. File Mode: + * r, and/or +). The filter + * will also be attached to the write filter chain + * if the file was opened for writing (i.e. File Mode: + * w, a, and/or +). + * STREAM_FILTER_READ, + * STREAM_FILTER_WRITE, and/or + * STREAM_FILTER_ALL can also be passed to the + * read_write parameter to override this behavior. + *

+ * @param mixed $params [optional]

+ * This filter will be added with the specified + * params to the end of + * the list and will therefore be called last during stream operations. + * To add a filter to the beginning of the list, use + * stream_filter_prepend. + *

+ * @return resource a resource which can be used to refer to this filter + * instance during a call to stream_filter_remove. + * @jms-builtin + */ +function stream_filter_append ($stream, $filtername, $read_write = null, $params = null) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Remove a filter from a stream + * @link http://php.net/manual/en/function.stream-filter-remove.php + * @param resource $stream_filter

+ * The stream filter to be removed. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function stream_filter_remove ($stream_filter) {} + +/** + * (PHP 5)
+ * Open Internet or Unix domain socket connection + * @link http://php.net/manual/en/function.stream-socket-client.php + * @param string $remote_socket

+ * Address to the socket to connect to. + *

+ * @param int $errno [optional]

+ * Will be set to the system level error number if connection fails. + *

+ * @param string $errstr [optional]

+ * Will be set to the system level error message if the connection fails. + *

+ * @param float $timeout [optional]

+ * Number of seconds until the connect() system call + * should timeout. + * This parameter only applies when not making asynchronous + * connection attempts. + *

+ * To set a timeout for reading/writing data over the socket, use the + * stream_set_timeout, as the + * timeout only applies while making connecting + * the socket. + *

+ *

+ * @param int $flags [optional]

+ * Bitmask field which may be set to any combination of connection flags. + * Currently the select of connection flags is limited to + * STREAM_CLIENT_CONNECT (default), + * STREAM_CLIENT_ASYNC_CONNECT and + * STREAM_CLIENT_PERSISTENT. + *

+ * @param resource $context [optional]

+ * A valid context resource created with stream_context_create. + *

+ * @return resource On success a stream resource is returned which may + * be used together with the other file functions (such as + * fgets, fgetss, + * fwrite, fclose, and + * feof), FALSE on failure. + * @jms-builtin + */ +function stream_socket_client ($remote_socket, &$errno = null, &$errstr = null, $timeout = 'ini_get("default_socket_timeout")', $flags = 'STREAM_CLIENT_CONNECT', $context = null) {} + +/** + * (PHP 5)
+ * Create an Internet or Unix domain server socket + * @link http://php.net/manual/en/function.stream-socket-server.php + * @param string $local_socket

+ * The type of socket created is determined by the transport specified + * using standard URL formatting: transport://target. + *

+ *

+ * For Internet Domain sockets (AF_INET) such as TCP and UDP, the + * target portion of the + * remote_socket parameter should consist of a + * hostname or IP address followed by a colon and a port number. For + * Unix domain sockets, the target portion should + * point to the socket file on the filesystem. + *

+ *

+ * Depending on the environment, Unix domain sockets may not be available. + * A list of available transports can be retrieved using + * stream_get_transports. See + * for a list of bulitin transports. + *

+ * @param int $errno [optional]

+ * If the optional errno and errstr + * arguments are present they will be set to indicate the actual system + * level error that occurred in the system-level socket(), + * bind(), and listen() calls. If + * the value returned in errno is + * 0 and the function returned FALSE, it is an + * indication that the error occurred before the bind() + * call. This is most likely due to a problem initializing the socket. + * Note that the errno and + * errstr arguments will always be passed by reference. + *

+ * @param string $errstr [optional]

+ * See errno description. + *

+ * @param int $flags [optional]

+ * A bitmask field which may be set to any combination of socket creation + * flags. + *

+ *

+ * For UDP sockets, you must use STREAM_SERVER_BIND as + * the flags parameter. + *

+ * @param resource $context [optional] + * @return resource the created stream, or FALSE on error. + * @jms-builtin + */ +function stream_socket_server ($local_socket, &$errno = null, &$errstr = null, $flags = 'STREAM_SERVER_BIND | STREAM_SERVER_LISTEN', $context = null) {} + +/** + * (PHP 5)
+ * Accept a connection on a socket created by stream_socket_server + * @link http://php.net/manual/en/function.stream-socket-accept.php + * @param resource $server_socket

+ * The server socket to accept a connection from. + *

+ * @param float $timeout [optional]

+ * Override the default socket accept timeout. Time should be given in + * seconds. + *

+ * @param string $peername [optional]

+ * Will be set to the name (address) of the client which connected, if + * included and available from the selected transport. + *

+ *

+ * Can also be determined later using + * stream_socket_get_name. + *

+ * @return resource a stream to the accepted socket connection or FALSE on failure. + * @jms-builtin + */ +function stream_socket_accept ($server_socket, $timeout = 'ini_get("default_socket_timeout")', &$peername = null) {} + +/** + * (PHP 5)
+ * Retrieve the name of the local or remote sockets + * @link http://php.net/manual/en/function.stream-socket-get-name.php + * @param resource $handle

+ * The socket to get the name of. + *

+ * @param bool $want_peer

+ * If set to TRUE the remote socket name will be returned, if set + * to FALSE the local socket name will be returned. + *

+ * @return string The name of the socket. + * @jms-builtin + */ +function stream_socket_get_name ($handle, $want_peer) {} + +/** + * (PHP 5)
+ * Receives data from a socket, connected or not + * @link http://php.net/manual/en/function.stream-socket-recvfrom.php + * @param resource $socket

+ * The remote socket. + *

+ * @param int $length

+ * The number of bytes to receive from the socket. + *

+ * @param int $flags [optional]

+ * The value of flags can be any combination + * of the following: + * + * Possible values for flags + * + * + * + * + * + * + * + * + *
STREAM_OOB + * Process OOB (out-of-band) data. + *
STREAM_PEEK + * Retrieve data from the socket, but do not consume the buffer. + * Subsequent calls to fread or + * stream_socket_recvfrom will see + * the same data. + *
+ *

+ * @param string $address [optional]

+ * If address is provided it will be populated with + * the address of the remote socket. + *

+ * @return string the read data, as a string + * @jms-builtin + */ +function stream_socket_recvfrom ($socket, $length, $flags = 0, &$address = null) {} + +/** + * (PHP 5)
+ * Sends a message to a socket, whether it is connected or not + * @link http://php.net/manual/en/function.stream-socket-sendto.php + * @param resource $socket

+ * The socket to send data to. + *

+ * @param string $data

+ * The data to be sent. + *

+ * @param int $flags [optional]

+ * The value of flags can be any combination + * of the following: + * + * possible values for flags + * + * + * + * + *
STREAM_OOB + * Process OOB (out-of-band) data. + *
+ *

+ * @param string $address [optional]

+ * The address specified when the socket stream was created will be used + * unless an alternate address is specified in address. + *

+ *

+ * If specified, it must be in dotted quad (or [ipv6]) format. + *

+ * @return int a result code, as an integer. + * @jms-builtin + */ +function stream_socket_sendto ($socket, $data, $flags = 0, $address = null) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Turns encryption on/off on an already connected socket + * @link http://php.net/manual/en/function.stream-socket-enable-crypto.php + * @param resource $stream

+ * The stream resource. + *

+ * @param bool $enable

+ * Enable/disable cryptography on the stream. + *

+ * @param int $crypto_type [optional]

+ * Setup encryption on the stream. + * Valid methods are + * STREAM_CRYPTO_METHOD_SSLv2_CLIENT + * @param resource $session_stream [optional]

+ * Seed the stream with settings from session_stream. + *

+ * @return mixed TRUE on success, FALSE if negotiation has failed or + * 0 if there isn't enough data and you should try again + * (only for non-blocking sockets). + * @jms-builtin + */ +function stream_socket_enable_crypto ($stream, $enable, $crypto_type = null, $session_stream = null) {} + +/** + * (PHP 5 >= 5.2.1)
+ * Shutdown a full-duplex connection + * @link http://php.net/manual/en/function.stream-socket-shutdown.php + * @param resource $stream

+ * An open stream (opened with stream_socket_client, + * for example) + *

+ * @param int $how

+ * One of the following constants: STREAM_SHUT_RD + * (disable further receptions), STREAM_SHUT_WR + * (disable further transmissions) or + * STREAM_SHUT_RDWR (disable further receptions and + * transmissions). + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function stream_socket_shutdown ($stream, $how) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Creates a pair of connected, indistinguishable socket streams + * @link http://php.net/manual/en/function.stream-socket-pair.php + * @param int $domain

+ * The protocol family to be used: STREAM_PF_INET, + * STREAM_PF_INET6 or + * STREAM_PF_UNIX + *

+ * @param int $type

+ * The type of communication to be used: + * STREAM_SOCK_DGRAM, + * STREAM_SOCK_RAW, + * STREAM_SOCK_RDM, + * STREAM_SOCK_SEQPACKET or + * STREAM_SOCK_STREAM + *

+ * @param int $protocol

+ * The protocol to be used: STREAM_IPPROTO_ICMP, + * STREAM_IPPROTO_IP, + * STREAM_IPPROTO_RAW, + * STREAM_IPPROTO_TCP or + * STREAM_IPPROTO_UDP + *

+ * @return array an array with the two socket resources on success, or + * FALSE on failure. + * @jms-builtin + */ +function stream_socket_pair ($domain, $type, $protocol) {} + +/** + * (PHP 5)
+ * Copies data from one stream to another + * @link http://php.net/manual/en/function.stream-copy-to-stream.php + * @param resource $source

+ * The source stream + *

+ * @param resource $dest

+ * The destination stream + *

+ * @param int $maxlength [optional]

+ * Maximum bytes to copy + *

+ * @param int $offset [optional]

+ * The offset where to start to copy data + *

+ * @return int the total count of bytes copied. + * @jms-builtin + */ +function stream_copy_to_stream ($source, $dest, $maxlength = -1, $offset = 0) {} + +/** + * (PHP 5)
+ * Reads remainder of a stream into a string + * @link http://php.net/manual/en/function.stream-get-contents.php + * @param resource $handle

+ * A stream resource (e.g. returned from fopen) + *

+ * @param int $maxlength [optional]

+ * The maximum bytes to read. Defaults to -1 (read all the remaining + * buffer). + *

+ * @param int $offset [optional]

+ * Seek to the specified offset before reading. If this number is negative, + * no seeking will occur and reading will start from the current position. + *

+ * @return string a string or FALSE on failure. + * @jms-builtin + */ +function stream_get_contents ($handle, $maxlength = -1, $offset = -1) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Tells whether the stream supports locking. + * @link http://php.net/manual/en/function.stream-supports-lock.php + * @param resource $stream

+ * The stream to check. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function stream_supports_lock ($stream) {} + +/** + * (PHP 4, PHP 5)
+ * Gets line from file pointer and parse for CSV fields + * @link http://php.net/manual/en/function.fgetcsv.php + * @param resource $handle

+ * A valid file pointer to a file successfully opened by + * fopen, popen, or + * fsockopen. + *

+ * @param int $length [optional]

+ * Must be greater than the longest line (in characters) to be found in + * the CSV file (allowing for trailing line-end characters). It became + * optional in PHP 5. Omitting this parameter (or setting it to 0 in PHP + * 5.0.4 and later) the maximum line length is not limited, which is + * slightly slower. + *

+ * @param string $delimiter [optional]

+ * Set the field delimiter (one character only). + *

+ * @param string $enclosure [optional]

+ * Set the field enclosure character (one character only). + *

+ * @param string $escape [optional]

+ * Set the escape character (one character only). Defaults as a backslash. + *

+ * @return array an indexed array containing the fields read. + *

+ *

+ * A blank line in a CSV file will be returned as an array + * comprising a single null field, and will not be treated + * as an error. + *

+ * If PHP is not properly recognizing + * the line endings when reading files either on or created by a Macintosh + * computer, enabling the + * auto_detect_line_endings + * run-time configuration option may help resolve the problem. + *

+ * fgetcsv returns NULL if an invalid + * handle is supplied or FALSE on other errors, + * including end of file. + * @jms-builtin + */ +function fgetcsv ($handle, $length = 0, $delimiter = ',', $enclosure = '"', $escape = '\\') {} + +/** + * (PHP 5 >= 5.1.0)
+ * Format line as CSV and write to file pointer + * @link http://php.net/manual/en/function.fputcsv.php + * @param resource $handle The file pointer must be valid, and must point to + * a file successfully opened by fopen or + * fsockopen (and not yet closed by + * fclose).

+ * @param array $fields

+ * An array of values. + *

+ * @param string $delimiter [optional]

+ * The optional delimiter parameter sets the field + * delimiter (one character only). + *

+ * @param string $enclosure [optional]

+ * The optional enclosure parameter sets the field + * enclosure (one character only). + *

+ * @return int the length of the written string or FALSE on failure. + * @jms-builtin + */ +function fputcsv ($handle, array $fields, $delimiter = ',', $enclosure = '"') {} + +/** + * (PHP 4, PHP 5)
+ * Portable advisory file locking + * @link http://php.net/manual/en/function.flock.php + * @param resource $handle A file system pointer resource + * that is typically created using fopen.

+ * @param int $operation

+ * operation is one of the following: + * LOCK_SH to acquire a shared lock (reader). + * @param int $wouldblock [optional]

+ * The optional third argument is set to TRUE if the lock would block + * (EWOULDBLOCK errno condition). (not supported on Windows) + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function flock ($handle, $operation, &$wouldblock = null) {} + +/** + * (PHP 4, PHP 5)
+ * Extracts all meta tag content attributes from a file and returns an array + * @link http://php.net/manual/en/function.get-meta-tags.php + * @param string $filename

+ * The path to the HTML file, as a string. This can be a local file or an + * URL. + *

+ *

+ * What get_meta_tags parses + *

+ * 
+ * (pay attention to line endings - PHP uses a native function to + * parse the input, so a Mac file won't work on Unix). + *

+ * @param bool $use_include_path [optional]

+ * Setting use_include_path to TRUE will result + * in PHP trying to open the file along the standard include path as per + * the include_path directive. + * This is used for local files, not URLs. + *

+ * @return array an array with all the parsed meta tags. + *

+ *

+ * The value of the name property becomes the key, the value of the content + * property becomes the value of the returned array, so you can easily use + * standard array functions to traverse it or access single values. + * Special characters in the value of the name property are substituted with + * '_', the rest is converted to lower case. If two meta tags have the same + * name, only the last one is returned. + * @jms-builtin + */ +function get_meta_tags ($filename, $use_include_path = false) {} + +/** + * (PHP 5 >= 5.3.3)
+ * Set read file buffering on the given stream + * @link http://php.net/manual/en/function.stream-set-read-buffer.php + * @param resource $stream

+ * The file pointer. + *

+ * @param int $buffer

+ * The number of bytes to buffer. If buffer + * is 0 then read operations are unbuffered. This ensures that all reads + * with fread are completed before other processes are + * allowed to write to that output stream. + *

+ * @return int 0 on success, or EOF if the request + * cannot be honored. + * @jms-builtin + */ +function stream_set_read_buffer ($stream, $buffer) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Sets write file buffering on the given stream + * @link http://php.net/manual/en/function.stream-set-write-buffer.php + * @param resource $stream

+ * The file pointer. + *

+ * @param int $buffer

+ * The number of bytes to buffer. If buffer + * is 0 then write operations are unbuffered. This ensures that all writes + * with fwrite are completed before other processes are + * allowed to write to that output stream. + *

+ * @return int 0 on success, or EOF if the request cannot be honored. + * @jms-builtin + */ +function stream_set_write_buffer ($stream, $buffer) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of stream_set_write_buffer + * @link http://php.net/manual/en/function.set-file-buffer.php + * @param $fp + * @param $buffer + * @jms-builtin + */ +function set_file_buffer ($fp, $buffer) {} + +/** + * (PHP 5 >= 5.4.0)
+ * Set the stream chunk size + * @link http://php.net/manual/en/function.stream-set-chunk-size.php + * @param resource $fp

+ * The target stream. + *

+ * @param int $chunk_size

+ * The desired new chunk size. + *

+ * @return int the previous chunk size on success. + *

+ *

+ * Will return FALSE if chunk_size is less than 1 or + * greater than PHP_INT_MAX. + * @jms-builtin + */ +function stream_set_chunk_size ($fp, $chunk_size) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of stream_set_blocking + * @link http://php.net/manual/en/function.set-socket-blocking.php + * @param $socket + * @param $mode + * @jms-builtin + */ +function set_socket_blocking ($socket, $mode) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Set blocking/non-blocking mode on a stream + * @link http://php.net/manual/en/function.stream-set-blocking.php + * @param resource $stream

+ * The stream. + *

+ * @param int $mode

+ * If mode is 0, the given stream + * will be switched to non-blocking mode, and if 1, it + * will be switched to blocking mode. This affects calls like + * fgets and fread + * that read from the stream. In non-blocking mode an + * fgets call will always return right away + * while in blocking mode it will wait for data to become available + * on the stream. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function stream_set_blocking ($stream, $mode) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of stream_set_blocking + * @link http://php.net/manual/en/function.socket-set-blocking.php + * @param $socket + * @param $mode + * @jms-builtin + */ +function socket_set_blocking ($socket, $mode) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Retrieves header/meta data from streams/file pointers + * @link http://php.net/manual/en/function.stream-get-meta-data.php + * @param resource $stream

+ * The stream can be any stream created by fopen, + * fsockopen and pfsockopen. + *

+ * @return array The result array contains the following items: + *

+ *

+ * timed_out (bool) - TRUE if the stream + * timed out while waiting for data on the last call to + * fread or fgets. + *

+ *

+ * blocked (bool) - TRUE if the stream is + * in blocking IO mode. See stream_set_blocking. + *

+ *

+ * eof (bool) - TRUE if the stream has reached + * end-of-file. Note that for socket streams this member can be TRUE + * even when unread_bytes is non-zero. To + * determine if there is more data to be read, use + * feof instead of reading this item. + *

+ *

+ * unread_bytes (int) - the number of bytes + * currently contained in the PHP's own internal buffer. + *

+ * You shouldn't use this value in a script. + *

+ * stream_type (string) - a label describing + * the underlying implementation of the stream. + *

+ *

+ * wrapper_type (string) - a label describing + * the protocol wrapper implementation layered over the stream. + * See for more information about wrappers. + *

+ *

+ * wrapper_data (mixed) - wrapper specific + * data attached to this stream. See for + * more information about wrappers and their wrapper data. + *

+ *

+ * filters (array) - and array containing + * the names of any filters that have been stacked onto this stream. + * Documentation on filters can be found in the + * Filters appendix. + *

+ *

+ * mode (string) - the type of access required for + * this stream (see Table 1 of the fopen() reference) + *

+ *

+ * seekable (bool) - whether the current stream can + * be seeked. + *

+ *

+ * uri (string) - the URI/filename associated with this + * stream. + * @jms-builtin + */ +function stream_get_meta_data ($stream) {} + +/** + * (PHP 5)
+ * Gets line from stream resource up to a given delimiter + * @link http://php.net/manual/en/function.stream-get-line.php + * @param resource $handle

+ * A valid file handle. + *

+ * @param int $length

+ * The number of bytes to read from the handle. + *

+ * @param string $ending [optional]

+ * An optional string delimiter. + *

+ * @return string a string of up to length bytes read from the file + * pointed to by handle. + *

+ *

+ * If an error occurs, returns FALSE. + * @jms-builtin + */ +function stream_get_line ($handle, $length, $ending = null) {} + +/** + * (PHP 4 >= 4.3.2, PHP 5)
+ * Register a URL wrapper implemented as a PHP class + * @link http://php.net/manual/en/function.stream-wrapper-register.php + * @param string $protocol

+ * The wrapper name to be registered. + *

+ * @param string $classname

+ * The classname which implements the protocol. + *

+ * @param int $flags [optional]

+ * Should be set to STREAM_IS_URL if + * protocol is a URL protocol. Default is 0, local + * stream. + *

+ * @return bool TRUE on success or FALSE on failure. + *

+ *

+ * stream_wrapper_register will return FALSE if the + * protocol already has a handler. + * @jms-builtin + */ +function stream_wrapper_register ($protocol, $classname, $flags = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Alias of stream_wrapper_register + * @link http://php.net/manual/en/function.stream-register-wrapper.php + * @param $protocol + * @param $classname + * @param $flags [optional] + * @jms-builtin + */ +function stream_register_wrapper ($protocol, $classname, $flags) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Unregister a URL wrapper + * @link http://php.net/manual/en/function.stream-wrapper-unregister.php + * @param string $protocol + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function stream_wrapper_unregister ($protocol) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Restores a previously unregistered built-in wrapper + * @link http://php.net/manual/en/function.stream-wrapper-restore.php + * @param string $protocol + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function stream_wrapper_restore ($protocol) {} + +/** + * (PHP 5)
+ * Retrieve list of registered streams + * @link http://php.net/manual/en/function.stream-get-wrappers.php + * @return array an indexed array containing the name of all stream wrappers + * available on the running system. + * @jms-builtin + */ +function stream_get_wrappers () {} + +/** + * (PHP 5)
+ * Retrieve list of registered socket transports + * @link http://php.net/manual/en/function.stream-get-transports.php + * @return array an indexed array of socket transports names. + * @jms-builtin + */ +function stream_get_transports () {} + +/** + * (PHP 5 >= 5.3.2)
+ * Resolve filename against the include path + * @link http://php.net/manual/en/function.stream-resolve-include-path.php + * @param string $filename

+ * The filename to resolve. + *

+ * @param resource $context [optional]

+ * A valid context resource created with stream_context_create. + *

+ * @return string a string containing the resolved absolute filename, or FALSE on failure. + * @jms-builtin + */ +function stream_resolve_include_path ($filename, $context = null) {} + +/** + * (PHP 5 >= 5.2.4)
+ * Checks if a stream is a local stream + * @link http://php.net/manual/en/function.stream-is-local.php + * @param mixed $stream_or_url

+ * The stream resource or URL to check. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function stream_is_local ($stream_or_url) {} + +/** + * (PHP 5)
+ * Fetches all the headers sent by the server in response to a HTTP request + * @link http://php.net/manual/en/function.get-headers.php + * @param string $url

+ * The target URL. + *

+ * @param int $format [optional]

+ * If the optional format parameter is set to non-zero, + * get_headers parses the response and sets the + * array's keys. + *

+ * @return array an indexed or associative array with the headers, or FALSE on + * failure. + * @jms-builtin + */ +function get_headers ($url, $format = 0) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Set timeout period on a stream + * @link http://php.net/manual/en/function.stream-set-timeout.php + * @param resource $stream

+ * The target stream. + *

+ * @param int $seconds

+ * The seconds part of the timeout to be set. + *

+ * @param int $microseconds [optional]

+ * The microseconds part of the timeout to be set. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function stream_set_timeout ($stream, $seconds, $microseconds = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of stream_set_timeout + * @link http://php.net/manual/en/function.socket-set-timeout.php + * @param $stream + * @param $seconds + * @param $microseconds + * @jms-builtin + */ +function socket_set_timeout ($stream, $seconds, $microseconds) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of stream_get_meta_data + * @link http://php.net/manual/en/function.socket-get-status.php + * @param $fp + * @jms-builtin + */ +function socket_get_status ($fp) {} + +/** + * (PHP 4, PHP 5)
+ * Returns canonicalized absolute pathname + * @link http://php.net/manual/en/function.realpath.php + * @param string $path

+ * The path being checked. + *

+ * Whilst a path must be supplied, the value can be blank or NULL + * In these cases, the value is interpreted as the current directory. + *

+ *

+ * @return string the canonicalized absolute pathname on success. The resulting path + * will have no symbolic link, '/./' or '/../' components. + *

+ *

+ * realpath returns FALSE on failure, e.g. if + * the file does not exist. + *

+ *

+ * The running script must have executable permissions on all directories in + * the hierarchy, otherwise realpath will return + * FALSE. + * @jms-builtin + */ +function realpath ($path) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Match filename against a pattern + * @link http://php.net/manual/en/function.fnmatch.php + * @param string $pattern

+ * The shell wildcard pattern. + *

+ * @param string $string

+ * The tested string. This function is especially useful for filenames, + * but may also be used on regular strings. + *

+ *

+ * The average user may be used to shell patterns or at least in their + * simplest form to '?' and '*' + * wildcards so using fnmatch instead of + * preg_match for + * frontend search expression input may be way more convenient for + * non-programming users. + *

+ * @param int $flags [optional]

+ * The value of flags can be any combination of + * the following flags, joined with the + * binary OR (|) operator. + * + * A list of possible flags for fnmatch + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FlagDescription
FNM_NOESCAPE + * Disable backslash escaping. + *
FNM_PATHNAME + * Slash in string only matches slash in the given pattern. + *
FNM_PERIOD + * Leading period in string must be exactly matched by period in the given pattern. + *
FNM_CASEFOLD + * Caseless match. Part of the GNU extension. + *
+ *

+ * @return bool TRUE if there is a match, FALSE otherwise. + * @jms-builtin + */ +function fnmatch ($pattern, $string, $flags = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Open Internet or Unix domain socket connection + * @link http://php.net/manual/en/function.fsockopen.php + * @param string $hostname

+ * If OpenSSL support is + * installed, you may prefix the hostname + * with either ssl:// or tls:// to + * use an SSL or TLS client connection over TCP/IP to connect to the + * remote host. + *

+ * @param int $port [optional]

+ * The port number. + *

+ * @param int $errno [optional]

+ * If provided, holds the system level error number that occurred in the + * system-level connect() call. + *

+ *

+ * If the value returned in errno is + * 0 and the function returned FALSE, it is an + * indication that the error occurred before the + * connect() call. This is most likely due to a + * problem initializing the socket. + *

+ * @param string $errstr [optional]

+ * The error message as a string. + *

+ * @param float $timeout [optional]

+ * The connection timeout, in seconds. + *

+ *

+ * If you need to set a timeout for reading/writing data over the + * socket, use stream_set_timeout, as the + * timeout parameter to + * fsockopen only applies while connecting the + * socket. + *

+ * @return resource fsockopen returns a file pointer which may be used + * together with the other file functions (such as + * fgets, fgetss, + * fwrite, fclose, and + * feof). If the call fails, it will return FALSE + * @jms-builtin + */ +function fsockopen ($hostname, $port = -1, &$errno = null, &$errstr = null, $timeout = 'ini_get("default_socket_timeout")') {} + +/** + * (PHP 4, PHP 5)
+ * Open persistent Internet or Unix domain socket connection + * @link http://php.net/manual/en/function.pfsockopen.php + * @param string $hostname + * @param int $port [optional] + * @param int $errno [optional] + * @param string $errstr [optional] + * @param float $timeout [optional] + * @return resource + * @jms-builtin + */ +function pfsockopen ($hostname, $port = -1, &$errno = null, &$errstr = null, $timeout = 'ini_get("default_socket_timeout")') {} + +/** + * (PHP 4, PHP 5)
+ * Pack data into binary string + * @link http://php.net/manual/en/function.pack.php + * @param string $format

+ * The format string consists of format codes + * followed by an optional repeater argument. The repeater argument can + * be either an integer value or * for repeating to + * the end of the input data. For a, A, h, H the repeat count specifies + * how many characters of one data argument are taken, for @ it is the + * absolute position where to put the next data, for everything else the + * repeat count specifies how many data arguments are consumed and packed + * into the resulting binary string. + *

+ *

+ * Currently implemented formats are: + * + * pack format characters + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
CodeDescription
aNUL-padded string
ASPACE-padded string
hHex string, low nibble first
HHex string, high nibble first
csigned char
Cunsigned char
ssigned short (always 16 bit, machine byte order)
Sunsigned short (always 16 bit, machine byte order)
nunsigned short (always 16 bit, big endian byte order)
vunsigned short (always 16 bit, little endian byte order)
isigned integer (machine dependent size and byte order)
Iunsigned integer (machine dependent size and byte order)
lsigned long (always 32 bit, machine byte order)
Lunsigned long (always 32 bit, machine byte order)
Nunsigned long (always 32 bit, big endian byte order)
Vunsigned long (always 32 bit, little endian byte order)
ffloat (machine dependent size and representation)
ddouble (machine dependent size and representation)
xNUL byte
XBack up one byte
@NUL-fill to absolute position
+ *

+ * @param mixed $args [optional] + * @param mixed $_ [optional] + * @return string a binary string containing data. + * @jms-builtin + */ +function pack ($format, $args = null, $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Unpack data from binary string + * @link http://php.net/manual/en/function.unpack.php + * @param string $format

+ * See pack for an explanation of the format codes. + *

+ * @param string $data

+ * The packed data. + *

+ * @return array an associative array containing unpacked elements of binary + * string. + * @jms-builtin + */ +function unpack ($format, $data) {} + +/** + * (PHP 4, PHP 5)
+ * Tells what the user's browser is capable of + * @link http://php.net/manual/en/function.get-browser.php + * @param string $user_agent [optional]

+ * The User Agent to be analyzed. By default, the value of HTTP + * User-Agent header is used; however, you can alter this (i.e., look up + * another browser's info) by passing this parameter. + *

+ *

+ * You can bypass this parameter with a NULL value. + *

+ * @param bool $return_array [optional]

+ * If set to TRUE, this function will return an array + * instead of an object. + *

+ * @return mixed The information is returned in an object or an array which will contain + * various data elements representing, for instance, the browser's major and + * minor version numbers and ID string; TRUE/FALSE values for features + * such as frames, JavaScript, and cookies; and so forth. + *

+ *

+ * The cookies value simply means that the browser + * itself is capable of accepting cookies and does not mean the user has + * enabled the browser to accept cookies or not. The only way to test if + * cookies are accepted is to set one with setcookie, + * reload, and check for the value. + * @jms-builtin + */ +function get_browser ($user_agent = null, $return_array = false) {} + +/** + * (PHP 4, PHP 5)
+ * One-way string hashing + * @link http://php.net/manual/en/function.crypt.php + * @param string $str

+ * The string to be hashed. + *

+ * @param string $salt [optional]

+ * An optional salt string to base the hashing on. If not provided, the + * behaviour is defined by the algorithm implementation and can lead to + * unexpected results. + *

+ * @return string the hashed string or a string that is shorter than 13 characters + * and is guaranteed to differ from the salt on failure. + * @jms-builtin + */ +function crypt ($str, $salt = null) {} + +/** + * (PHP 4, PHP 5)
+ * Open directory handle + * @link http://php.net/manual/en/function.opendir.php + * @param string $path

+ * The directory path that is to be opened + *

+ * @param resource $context [optional]

+ * For a description of the context parameter, + * refer to the streams section of + * the manual. + *

+ * @return resource a directory handle resource on success, or + * FALSE on failure. + *

+ *

+ * If path is not a valid directory or the + * directory can not be opened due to permission restrictions or + * filesystem errors, opendir returns FALSE and + * generates a PHP error of level + * E_WARNING. You can suppress the error output of + * opendir by prepending + * '@' to the + * front of the function name. + * @jms-builtin + */ +function opendir ($path, $context = null) {} + +/** + * (PHP 4, PHP 5)
+ * Close directory handle + * @link http://php.net/manual/en/function.closedir.php + * @param resource $dir_handle [optional]

+ * The directory handle resource previously opened + * with opendir. If the directory handle is + * not specified, the last link opened by opendir + * is assumed. + *

+ * @return void + * @jms-builtin + */ +function closedir ($dir_handle = null) {} + +/** + * (PHP 4, PHP 5)
+ * Change directory + * @link http://php.net/manual/en/function.chdir.php + * @param string $directory

+ * The new current directory + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function chdir ($directory) {} + +/** + * (PHP 4, PHP 5)
+ * Gets the current working directory + * @link http://php.net/manual/en/function.getcwd.php + * @return string the current working directory on success, or FALSE on + * failure. + *

+ *

+ * On some Unix variants, getcwd will return + * FALSE if any one of the parent directories does not have the + * readable or search mode set, even if the current directory + * does. See chmod for more information on + * modes and permissions. + * @jms-builtin + */ +function getcwd () {} + +/** + * (PHP 4, PHP 5)
+ * Rewind directory handle + * @link http://php.net/manual/en/function.rewinddir.php + * @param resource $dir_handle [optional]

+ * The directory handle resource previously opened + * with opendir. If the directory handle is + * not specified, the last link opened by opendir + * is assumed. + *

+ * @return void + * @jms-builtin + */ +function rewinddir ($dir_handle = null) {} + +/** + * (PHP 4, PHP 5)
+ * Read entry from directory handle + * @link http://php.net/manual/en/function.readdir.php + * @param resource $dir_handle [optional]

+ * The directory handle resource previously opened + * with opendir. If the directory handle is + * not specified, the last link opened by opendir + * is assumed. + *

+ * @return string the entry name on success or FALSE on failure. + * @jms-builtin + */ +function readdir ($dir_handle = null) {} + +/** + * (PHP 4, PHP 5)
+ * Return an instance of the Directory class + * @link http://php.net/manual/en/function.dir.php + * @param string $directory

+ * Directory to open + *

+ * @param resource $context [optional]

+ * Context support was added + * with PHP 5.0.0. For a description of contexts, refer to + * . + *

+ * @return Directory an instance of Directory, or NULL with + * wrong parameters, or FALSE in case of another error. + * @jms-builtin + */ +function dir ($directory, $context = null) {} + +/** + * (PHP 5)
+ * List files and directories inside the specified path + * @link http://php.net/manual/en/function.scandir.php + * @param string $directory

+ * The directory that will be scanned. + *

+ * @param int $sorting_order [optional]

+ * By default, the sorted order is alphabetical in ascending order. If + * the optional sorting_order is set to + * SCANDIR_SORT_DESCENDING, then the sort order is + * alphabetical in descending order. If it is set to + * SCANDIR_SORT_NONE then the result is unsorted. + *

+ * @param resource $context [optional]

+ * For a description of the context parameter, + * refer to the streams section of + * the manual. + *

+ * @return array an array of filenames on success, or FALSE on + * failure. If directory is not a directory, then + * boolean FALSE is returned, and an error of level + * E_WARNING is generated. + * @jms-builtin + */ +function scandir ($directory, $sorting_order = 'SCANDIR_SORT_ASCENDING', $context = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Find pathnames matching a pattern + * @link http://php.net/manual/en/function.glob.php + * @param string $pattern

+ * The pattern. No tilde expansion or parameter substitution is done. + *

+ * @param int $flags [optional]

+ * Valid flags: + * GLOB_MARK - Adds a slash to each directory returned + * @return array an array containing the matched files/directories, an empty array + * if no file matched or FALSE on error. + *

+ *

+ * On some systems it is impossible to distinguish between empty match and an + * error. + * @jms-builtin + */ +function glob ($pattern, $flags = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Gets last access time of file + * @link http://php.net/manual/en/function.fileatime.php + * @param string $filename

+ * Path to the file. + *

+ * @return int the time the file was last accessed, or FALSE on failure. + * The time is returned as a Unix timestamp. + * @jms-builtin + */ +function fileatime ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gets inode change time of file + * @link http://php.net/manual/en/function.filectime.php + * @param string $filename

+ * Path to the file. + *

+ * @return int the time the file was last changed, or FALSE on failure. + * The time is returned as a Unix timestamp. + * @jms-builtin + */ +function filectime ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gets file group + * @link http://php.net/manual/en/function.filegroup.php + * @param string $filename

+ * Path to the file. + *

+ * @return int the group ID of the file, or FALSE if + * an error occurs. The group ID is returned in numerical format, use + * posix_getgrgid to resolve it to a group name. + * Upon failure, FALSE is returned. + * @jms-builtin + */ +function filegroup ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gets file inode + * @link http://php.net/manual/en/function.fileinode.php + * @param string $filename

+ * Path to the file. + *

+ * @return int the inode number of the file, or FALSE on failure. + * @jms-builtin + */ +function fileinode ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gets file modification time + * @link http://php.net/manual/en/function.filemtime.php + * @param string $filename

+ * Path to the file. + *

+ * @return int the time the file was last modified, or FALSE on failure. + * The time is returned as a Unix timestamp, which is + * suitable for the date function. + * @jms-builtin + */ +function filemtime ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gets file owner + * @link http://php.net/manual/en/function.fileowner.php + * @param string $filename

+ * Path to the file. + *

+ * @return int the user ID of the owner of the file, or FALSE on failure. + * The user ID is returned in numerical format, use + * posix_getpwuid to resolve it to a username. + * @jms-builtin + */ +function fileowner ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gets file permissions + * @link http://php.net/manual/en/function.fileperms.php + * @param string $filename

+ * Path to the file. + *

+ * @return int the file's permissions as a numeric mode. Lower bits of this mode + * are the same as the permissions expected by chmod, + * however on most platforms the return value will also include information on + * the type of file given as filename. The examples + * below demonstrate how to test the return value for specific permissions and + * file types on POSIX systems, including Linux and Mac OS X. + *

+ *

+ * For local files, the specific return value is that of the + * st_mode member of the structure returned by the C + * library's stat function. Exactly which bits are set + * can vary from platform to platform, and looking up your specific platform's + * documentation is recommended if parsing the non-permission bits of the + * return value is required. + * @jms-builtin + */ +function fileperms ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gets file size + * @link http://php.net/manual/en/function.filesize.php + * @param string $filename

+ * Path to the file. + *

+ * @return int the size of the file in bytes, or FALSE (and generates an error + * of level E_WARNING) in case of an error. + * @jms-builtin + */ +function filesize ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gets file type + * @link http://php.net/manual/en/function.filetype.php + * @param string $filename

+ * Path to the file. + *

+ * @return string the type of the file. Possible values are fifo, char, + * dir, block, link, file, socket and unknown. + *

+ *

+ * Returns FALSE if an error occurs. filetype will also + * produce an E_NOTICE message if the stat call fails + * or if the file type is unknown. + * @jms-builtin + */ +function filetype ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Checks whether a file or directory exists + * @link http://php.net/manual/en/function.file-exists.php + * @param string $filename

+ * Path to the file or directory. + *

+ *

+ * On windows, use //computername/share/filename or + * \\computername\share\filename to check files on + * network shares. + *

+ * @return bool TRUE if the file or directory specified by + * filename exists; FALSE otherwise. + *

+ *

+ * This function will return FALSE for symlinks pointing to non-existing + * files. + *

+ *

+ * This function returns FALSE for files inaccessible due to safe mode restrictions. However these + * files still can be included if + * they are located in safe_mode_include_dir. + *

+ *

+ * The check is done using the real UID/GID instead of the effective one. + * @jms-builtin + */ +function file_exists ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Tells whether the filename is writable + * @link http://php.net/manual/en/function.is-writable.php + * @param string $filename

+ * The filename being checked. + *

+ * @return bool TRUE if the filename exists and is + * writable. + * @jms-builtin + */ +function is_writable ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of is_writable + * @link http://php.net/manual/en/function.is-writeable.php + * @param $filename + * @jms-builtin + */ +function is_writeable ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Tells whether a file exists and is readable + * @link http://php.net/manual/en/function.is-readable.php + * @param string $filename

+ * Path to the file. + *

+ * @return bool TRUE if the file or directory specified by + * filename exists and is readable, FALSE otherwise. + * @jms-builtin + */ +function is_readable ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Tells whether the filename is executable + * @link http://php.net/manual/en/function.is-executable.php + * @param string $filename

+ * Path to the file. + *

+ * @return bool TRUE if the filename exists and is executable, or FALSE on + * error. + * @jms-builtin + */ +function is_executable ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Tells whether the filename is a regular file + * @link http://php.net/manual/en/function.is-file.php + * @param string $filename

+ * Path to the file. + *

+ * @return bool TRUE if the filename exists and is a regular file, FALSE + * otherwise. + * @jms-builtin + */ +function is_file ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Tells whether the filename is a directory + * @link http://php.net/manual/en/function.is-dir.php + * @param string $filename

+ * Path to the file. If filename is a relative + * filename, it will be checked relative to the current working + * directory. If filename is a symbolic or hard link + * then the link will be resolved and checked. If you have enabled safe mode, + * or open_basedir further + * restrictions may apply. + *

+ * @return bool TRUE if the filename exists and is a directory, FALSE + * otherwise. + * @jms-builtin + */ +function is_dir ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Tells whether the filename is a symbolic link + * @link http://php.net/manual/en/function.is-link.php + * @param string $filename

+ * Path to the file. + *

+ * @return bool TRUE if the filename exists and is a symbolic link, FALSE + * otherwise. + * @jms-builtin + */ +function is_link ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gives information about a file + * @link http://php.net/manual/en/function.stat.php + * @param string $filename

+ * Path to the file. + *

+ * @return array + * stat and fstat result + * format + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NumericAssociative (since PHP 4.0.6)Description
0devdevice number
1inoinode number *
2modeinode protection mode
3nlinknumber of links
4uiduserid of owner *
5gidgroupid of owner *
6rdevdevice type, if inode device
7sizesize in bytes
8atimetime of last access (Unix timestamp)
9mtimetime of last modification (Unix timestamp)
10ctimetime of last inode change (Unix timestamp)
11blksizeblocksize of filesystem IO **
12blocksnumber of 512-byte blocks allocated **
+ * * On Windows this will always be 0. + *

+ *

+ * ** Only valid on systems supporting the st_blksize type - other + * systems (e.g. Windows) return -1. + *

+ *

+ * In case of error, stat returns FALSE. + * @jms-builtin + */ +function stat ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Gives information about a file or symbolic link + * @link http://php.net/manual/en/function.lstat.php + * @param string $filename

+ * Path to a file or a symbolic link. + *

+ * @return array See the manual page for stat for information on + * the structure of the array that lstat returns. + * This function is identical to the stat function + * except that if the filename parameter is a symbolic + * link, the status of the symbolic link is returned, not the status of the + * file pointed to by the symbolic link. + * @jms-builtin + */ +function lstat ($filename) {} + +/** + * (PHP 4, PHP 5)
+ * Changes file owner + * @link http://php.net/manual/en/function.chown.php + * @param string $filename

+ * Path to the file. + *

+ * @param mixed $user

+ * A user name or number. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function chown ($filename, $user) {} + +/** + * (PHP 4, PHP 5)
+ * Changes file group + * @link http://php.net/manual/en/function.chgrp.php + * @param string $filename

+ * Path to the file. + *

+ * @param mixed $group

+ * A group name or number. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function chgrp ($filename, $group) {} + +/** + * (PHP 5 >= 5.1.2)
+ * Changes user ownership of symlink + * @link http://php.net/manual/en/function.lchown.php + * @param string $filename

+ * Path to the file. + *

+ * @param mixed $user

+ * User name or number. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function lchown ($filename, $user) {} + +/** + * (PHP 5 >= 5.1.2)
+ * Changes group ownership of symlink + * @link http://php.net/manual/en/function.lchgrp.php + * @param string $filename

+ * Path to the symlink. + *

+ * @param mixed $group

+ * The group specified by name or number. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function lchgrp ($filename, $group) {} + +/** + * (PHP 4, PHP 5)
+ * Changes file mode + * @link http://php.net/manual/en/function.chmod.php + * @param string $filename

+ * Path to the file. + *

+ * @param int $mode

+ * Note that mode is not automatically + * assumed to be an octal value, so strings (such as "g+w") will + * not work properly. To ensure the expected operation, + * you need to prefix mode with a zero (0): + *

+ *

+ * + * chmod("/somedir/somefile", 755); // decimal; probably incorrect + * chmod("/somedir/somefile", "u+rwx,go+rx"); // string; incorrect + * chmod("/somedir/somefile", 0755); // octal; correct value of mode + * + *

+ *

+ * The mode parameter consists of three octal + * number components specifying access restrictions for the owner, + * the user group in which the owner is in, and to everybody else in + * this order. One component can be computed by adding up the needed + * permissions for that target user base. Number 1 means that you + * grant execute rights, number 2 means that you make the file + * writeable, number 4 means that you make the file readable. Add + * up these numbers to specify needed rights. You can also read more + * about modes on Unix systems with 'man 1 chmod' + * and 'man 2 chmod'. + *

+ *

+ * + * // Read and write for owner, nothing for everybody else + * chmod("/somedir/somefile", 0600); + * // Read and write for owner, read for everybody else + * chmod("/somedir/somefile", 0644); + * // Everything for owner, read and execute for others + * chmod("/somedir/somefile", 0755); + * // Everything for owner, read and execute for owner's group + * chmod("/somedir/somefile", 0750); + * + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function chmod ($filename, $mode) {} + +/** + * (PHP 4, PHP 5)
+ * Sets access and modification time of file + * @link http://php.net/manual/en/function.touch.php + * @param string $filename

+ * The name of the file being touched. + *

+ * @param int $time [optional]

+ * The touch time. If time is not supplied, + * the current system time is used. + *

+ * @param int $atime [optional]

+ * If present, the access time of the given filename is set to + * the value of atime. Otherwise, it is set to + * the value passed to the time parameter. + * If neither are present, the current system time is used. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function touch ($filename, $time = 'time()', $atime = null) {} + +/** + * (PHP 4, PHP 5)
+ * Clears file status cache + * @link http://php.net/manual/en/function.clearstatcache.php + * @param bool $clear_realpath_cache [optional]

+ * Whether to clear the realpath cache or not. + *

+ * @param string $filename [optional]

+ * Clear the realpath cache for a specific filename; only used if + * clear_realpath_cache is TRUE. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function clearstatcache ($clear_realpath_cache = false, $filename = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Returns the total size of a filesystem or disk partition + * @link http://php.net/manual/en/function.disk-total-space.php + * @param string $directory

+ * A directory of the filesystem or disk partition. + *

+ * @return float the total number of bytes as a float + * or FALSE on failure. + * @jms-builtin + */ +function disk_total_space ($directory) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Returns available space on filesystem or disk partition + * @link http://php.net/manual/en/function.disk-free-space.php + * @param string $directory

+ * A directory of the filesystem or disk partition. + *

+ *

+ * Given a file name instead of a directory, the behaviour of the + * function is unspecified and may differ between operating systems and + * PHP versions. + *

+ * @return float the number of available bytes as a float + * or FALSE on failure. + * @jms-builtin + */ +function disk_free_space ($directory) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of disk_free_space + * @link http://php.net/manual/en/function.diskfreespace.php + * @param $path + * @jms-builtin + */ +function diskfreespace ($path) {} + +/** + * (PHP 5 >= 5.3.2)
+ * Get realpath cache size + * @link http://php.net/manual/en/function.realpath-cache-size.php + * @return int how much memory realpath cache is using. + * @jms-builtin + */ +function realpath_cache_size () {} + +/** + * (PHP 5 >= 5.3.2)
+ * Get realpath cache entries + * @link http://php.net/manual/en/function.realpath-cache-get.php + * @return array an array of realpath cache entries. The keys are original path + * entries, and the values are arrays of data items, containing the resolved + * path, expiration date, and other options kept in the cache. + * @jms-builtin + */ +function realpath_cache_get () {} + +/** + * (PHP 4, PHP 5)
+ * Send mail + * @link http://php.net/manual/en/function.mail.php + * @param string $to

+ * Receiver, or receivers of the mail. + *

+ *

+ * The formatting of this string must comply with + * RFC 2822. Some examples are: + * user@example.com + * user@example.com, anotheruser@example.com + * User <user@example.com> + * User <user@example.com>, Another User <anotheruser@example.com> + *

+ * @param string $subject

+ * Subject of the email to be sent. + *

+ *

+ * Subject must satisfy RFC 2047. + *

+ * @param string $message

+ * Message to be sent. + *

+ *

+ * Each line should be separated with a LF (\n). Lines should not be larger + * than 70 characters. + *

+ *

+ * (Windows only) When PHP is talking to a SMTP server directly, if a full + * stop is found on the start of a line, it is removed. To counter-act this, + * replace these occurrences with a double dot. + * + * $text = str_replace("\n.", "\n..", $text); + * + *

+ * @param string $additional_headers [optional]

+ * String to be inserted at the end of the email header. + *

+ *

+ * This is typically used to add extra headers (From, Cc, and Bcc). + * Multiple extra headers should be separated with a CRLF (\r\n). + *

+ *

+ * When sending mail, the mail must contain + * a From header. This can be set with the + * additional_headers parameter, or a default + * can be set in php.ini. + *

+ *

+ * Failing to do this will result in an error + * message similar to Warning: mail(): "sendmail_from" not + * set in php.ini or custom "From:" header missing. + * The From header sets also + * Return-Path under Windows. + *

+ *

+ * If messages are not received, try using a LF (\n) only. + * Some poor quality Unix mail transfer agents replace LF by CRLF + * automatically (which leads to doubling CR if CRLF is used). + * This should be a last resort, as it does not comply with + * RFC 2822. + *

+ * @param string $additional_parameters [optional]

+ * The additional_parameters parameter + * can be used to pass additional flags as command line options to the + * program configured to be used when sending mail, as defined by the + * sendmail_path configuration setting. For example, + * this can be used to set the envelope sender address when using + * sendmail with the -f sendmail option. + *

+ *

+ * The user that the webserver runs as should be added as a trusted user to the + * sendmail configuration to prevent a 'X-Warning' header from being added + * to the message when the envelope sender (-f) is set using this method. + * For sendmail users, this file is /etc/mail/trusted-users. + *

+ * @return bool TRUE if the mail was successfully accepted for delivery, FALSE otherwise. + *

+ *

+ * It is important to note that just because the mail was accepted for delivery, + * it does NOT mean the mail will actually reach the intended destination. + * @jms-builtin + */ +function mail ($to, $subject, $message, $additional_headers = null, $additional_parameters = null) {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Calculate the hash value needed by EZMLM + * @link http://php.net/manual/en/function.ezmlm-hash.php + * @param string $addr

+ * The email address that's being hashed. + *

+ * @return int The hash value of addr. + * @jms-builtin + */ +function ezmlm_hash ($addr) {} + +/** + * (PHP 4, PHP 5)
+ * Open connection to system logger + * @link http://php.net/manual/en/function.openlog.php + * @param string $ident

+ * The string ident is added to each message. + *

+ * @param int $option

+ * The option argument is used to indicate + * what logging options will be used when generating a log message. + * + * openlog Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
LOG_CONS + * if there is an error while sending data to the system logger, + * write directly to the system console + *
LOG_NDELAY + * open the connection to the logger immediately + *
LOG_ODELAY + * (default) delay opening the connection until the first + * message is logged + *
LOG_PERRORprint log message also to standard error
LOG_PIDinclude PID with each message
+ * You can use one or more of this options. When using multiple options + * you need to OR them, i.e. to open the connection + * immediately, write to the console and include the PID in each message, + * you will use: LOG_CONS | LOG_NDELAY | LOG_PID + *

+ * @param int $facility

+ * The facility argument is used to specify what + * type of program is logging the message. This allows you to specify + * (in your machine's syslog configuration) how messages coming from + * different facilities will be handled. + * + * openlog Facilities + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
LOG_AUTH + * security/authorization messages (use + * LOG_AUTHPRIV instead + * in systems where that constant is defined) + *
LOG_AUTHPRIVsecurity/authorization messages (private)
LOG_CRONclock daemon (cron and at)
LOG_DAEMONother system daemons
LOG_KERNkernel messages
LOG_LOCAL0 ... LOG_LOCAL7reserved for local use, these are not available in Windows
LOG_LPRline printer subsystem
LOG_MAILmail subsystem
LOG_NEWSUSENET news subsystem
LOG_SYSLOGmessages generated internally by syslogd
LOG_USERgeneric user-level messages
LOG_UUCPUUCP subsystem
+ *

+ *

+ * LOG_USER is the only valid log type under Windows + * operating systems + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function openlog ($ident, $option, $facility) {} + +/** + * (PHP 4, PHP 5)
+ * Generate a system log message + * @link http://php.net/manual/en/function.syslog.php + * @param int $priority

+ * priority is a combination of the facility and + * the level. Possible values are: + * + * syslog Priorities (in descending order) + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ConstantDescription
LOG_EMERGsystem is unusable
LOG_ALERTaction must be taken immediately
LOG_CRITcritical conditions
LOG_ERRerror conditions
LOG_WARNINGwarning conditions
LOG_NOTICEnormal, but significant, condition
LOG_INFOinformational message
LOG_DEBUGdebug-level message
+ *

+ * @param string $message

+ * The message to send, except that the two characters + * %m will be replaced by the error message string + * (strerror) corresponding to the present value of + * errno. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function syslog ($priority, $message) {} + +/** + * (PHP 4, PHP 5)
+ * Close connection to system logger + * @link http://php.net/manual/en/function.closelog.php + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function closelog () {} + +/** + * (PHP 4, PHP 5)
+ * Combined linear congruential generator + * @link http://php.net/manual/en/function.lcg-value.php + * @return float A pseudo random float value in the range of (0, 1) + * @jms-builtin + */ +function lcg_value () {} + +/** + * (PHP 4, PHP 5)
+ * Calculate the metaphone key of a string + * @link http://php.net/manual/en/function.metaphone.php + * @param string $str

+ * The input string. + *

+ * @param int $phonemes [optional]

+ * This parameter restricts the returned metaphone key to + * phonemes characters in length. + * The default value of 0 means no restriction. + *

+ * @return string the metaphone key as a string, or FALSE on failure. + * @jms-builtin + */ +function metaphone ($str, $phonemes = 0) {} + +/** + * (PHP 4, PHP 5)
+ * Turn on output buffering + * @link http://php.net/manual/en/function.ob-start.php + * @param callable $output_callback [optional]

+ * An optional output_callback function may be + * specified. This function takes a string as a parameter and should + * return a string. The function will be called when + * the output buffer is flushed (sent) or cleaned (with + * ob_flush, ob_clean or similar + * function) or when the output buffer + * is flushed to the browser at the end of the request. When + * output_callback is called, it will receive the + * contents of the output buffer as its parameter and is expected to + * return a new output buffer as a result, which will be sent to the + * browser. If the output_callback is not a + * callable function, this function will return FALSE. + *

+ *

+ * If the callback function has two parameters, the second parameter is + * filled with a bit-field consisting of + * PHP_OUTPUT_HANDLER_START, + * PHP_OUTPUT_HANDLER_CONT and + * PHP_OUTPUT_HANDLER_END. + *

+ *

+ * If output_callback returns FALSE original + * input is sent to the browser. + *

+ *

+ * The output_callback parameter may be bypassed + * by passing a NULL value. + *

+ *

+ * ob_end_clean, ob_end_flush, + * ob_clean, ob_flush and + * ob_start may not be called from a callback + * function. If you call them from callback function, the behavior is + * undefined. If you would like to delete the contents of a buffer, + * return "" (a null string) from callback function. + * You can't even call functions using the output buffering functions like + * print_r($expression, true) or + * highlight_file($filename, true) from a callback + * function. + *

+ *

+ * In PHP 4.0.4, ob_gzhandler was introduced to + * facilitate sending gz-encoded data to web browsers that support + * compressed web pages. ob_gzhandler determines + * what type of content encoding the browser will accept and will return + * its output accordingly. + *

+ * @param int $chunk_size [optional]

+ * If the optional parameter chunk_size is passed, the + * buffer will be flushed after any output call which causes the buffer's + * length to equal or exceed chunk_size. The default + * value 0 means that the output function will only be + * called when the output buffer is closed. + *

+ *

+ * Prior to PHP 5.4.0, the value 1 was a special case + * value that set the chunk size to 4096 bytes. + *

+ * @param bool $erase [optional]

+ * If the optional parameter erase is set to FALSE, + * the buffer will not be deleted until the script finishes. + * This causes that flushing and cleaning functions would issue a notice + * and return FALSE if called. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ob_start (callable $output_callback = null, $chunk_size = 0, $erase = true) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Flush (send) the output buffer + * @link http://php.net/manual/en/function.ob-flush.php + * @return void No value is returned. + * @jms-builtin + */ +function ob_flush () {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Clean (erase) the output buffer + * @link http://php.net/manual/en/function.ob-clean.php + * @return void No value is returned. + * @jms-builtin + */ +function ob_clean () {} + +/** + * (PHP 4, PHP 5)
+ * Flush (send) the output buffer and turn off output buffering + * @link http://php.net/manual/en/function.ob-end-flush.php + * @return bool TRUE on success or FALSE on failure. Reasons for failure are first that you called the + * function without an active buffer or that for some reason a buffer could + * not be deleted (possible for special buffer). + * @jms-builtin + */ +function ob_end_flush () {} + +/** + * (PHP 4, PHP 5)
+ * Clean (erase) the output buffer and turn off output buffering + * @link http://php.net/manual/en/function.ob-end-clean.php + * @return bool TRUE on success or FALSE on failure. Reasons for failure are first that you called the + * function without an active buffer or that for some reason a buffer could + * not be deleted (possible for special buffer). + * @jms-builtin + */ +function ob_end_clean () {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Flush the output buffer, return it as a string and turn off output buffering + * @link http://php.net/manual/en/function.ob-get-flush.php + * @return string the output buffer or FALSE if no buffering is active. + * @jms-builtin + */ +function ob_get_flush () {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Get current buffer contents and delete current output buffer + * @link http://php.net/manual/en/function.ob-get-clean.php + * @return string the contents of the output buffer and end output buffering. + * If output buffering isn't active then FALSE is returned. + * @jms-builtin + */ +function ob_get_clean () {} + +/** + * (PHP 4 >= 4.0.2, PHP 5)
+ * Return the length of the output buffer + * @link http://php.net/manual/en/function.ob-get-length.php + * @return int the length of the output buffer contents or FALSE if no + * buffering is active. + * @jms-builtin + */ +function ob_get_length () {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Return the nesting level of the output buffering mechanism + * @link http://php.net/manual/en/function.ob-get-level.php + * @return int the level of nested output buffering handlers or zero if output + * buffering is not active. + * @jms-builtin + */ +function ob_get_level () {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get status of output buffers + * @link http://php.net/manual/en/function.ob-get-status.php + * @param bool $full_status [optional]

+ * TRUE to return all active output buffer levels. If FALSE or not + * set, only the top level output buffer is returned. + *

+ * @return array If called without the full_status parameter + * or with full_status = FALSE a simple array + * with the following elements is returned: + *
+ * Array
+ * (
+ * [level] => 2
+ * [type] => 0
+ * [status] => 0
+ * [name] => URL-Rewriter
+ * [del] => 1
+ * )
+ * 
+ * Simple ob_get_status results + * KeyValue + * levelOutput nesting level + * typePHP_OUTPUT_HANDLER_INTERNAL (0) or PHP_OUTPUT_HANDLER_USER (1) + * statusOne of PHP_OUTPUT_HANDLER_START (0), PHP_OUTPUT_HANDLER_CONT (1) or PHP_OUTPUT_HANDLER_END (2) + * nameName of active output handler or ' default output handler' if none is set + * delErase-flag as set by ob_start + *

+ *

+ * If called with full_status = TRUE an array + * with one element for each active output buffer level is returned. + * The output level is used as key of the top level array and each array + * element itself is another array holding status information + * on one active output level. + *

+ * Array
+ * (
+ * [0] => Array
+ * (
+ * [chunk_size] => 0
+ * [size] => 40960
+ * [block_size] => 10240
+ * [type] => 1
+ * [status] => 0
+ * [name] => default output handler
+ * [del] => 1
+ * )
+ * [1] => Array
+ * (
+ * [chunk_size] => 0
+ * [size] => 40960
+ * [block_size] => 10240
+ * [type] => 0
+ * [buffer_size] => 0
+ * [status] => 0
+ * [name] => URL-Rewriter
+ * [del] => 1
+ * )
+ * )
+ * 
+ *

+ *

+ * The full output contains these additional elements: + * Full ob_get_status results + * KeyValue + * chunk_sizeChunk size as set by ob_start + * size... + * blocksize... + * @jms-builtin + */ +function ob_get_status ($full_status = null) {} + +/** + * (PHP 4, PHP 5)
+ * Return the contents of the output buffer + * @link http://php.net/manual/en/function.ob-get-contents.php + * @return string This will return the contents of the output buffer or FALSE, if output + * buffering isn't active. + * @jms-builtin + */ +function ob_get_contents () {} + +/** + * (PHP 4, PHP 5)
+ * Turn implicit flush on/off + * @link http://php.net/manual/en/function.ob-implicit-flush.php + * @param int $flag [optional]

+ * TRUE to turn implicit flushing on, FALSE otherwise. + *

+ * @return void No value is returned. + * @jms-builtin + */ +function ob_implicit_flush ($flag = true) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * List all output handlers in use + * @link http://php.net/manual/en/function.ob-list-handlers.php + * @return array This will return an array with the output handlers in use (if any). If + * output_buffering is enabled or + * an anonymous function was used with ob_start, + * ob_list_handlers will return "default output + * handler". + * @jms-builtin + */ +function ob_list_handlers () {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array by key + * @link http://php.net/manual/en/function.ksort.php + * @param array $array

+ * The input array. + *

+ * @param int $sort_flags [optional]

+ * You may modify the behavior of the sort using the optional + * parameter sort_flags, for details + * see sort. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function ksort (array &$array, $sort_flags = 'SORT_REGULAR') {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array by key in reverse order + * @link http://php.net/manual/en/function.krsort.php + * @param array $array

+ * The input array. + *

+ * @param int $sort_flags [optional]

+ * You may modify the behavior of the sort using the optional parameter + * sort_flags, for details see + * sort. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function krsort (array &$array, $sort_flags = 'SORT_REGULAR') {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array using a "natural order" algorithm + * @link http://php.net/manual/en/function.natsort.php + * @param array $array

+ * The input array. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function natsort (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array using a case insensitive "natural order" algorithm + * @link http://php.net/manual/en/function.natcasesort.php + * @param array $array

+ * The input array. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function natcasesort (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array and maintain index association + * @link http://php.net/manual/en/function.asort.php + * @param array $array

+ * The input array. + *

+ * @param int $sort_flags [optional]

+ * You may modify the behavior of the sort using the optional + * parameter sort_flags, for details + * see sort. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function asort (array &$array, $sort_flags = 'SORT_REGULAR') {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array in reverse order and maintain index association + * @link http://php.net/manual/en/function.arsort.php + * @param array $array

+ * The input array. + *

+ * @param int $sort_flags [optional]

+ * You may modify the behavior of the sort using the optional parameter + * sort_flags, for details see + * sort. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function arsort (array &$array, $sort_flags = 'SORT_REGULAR') {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array + * @link http://php.net/manual/en/function.sort.php + * @param array $array

+ * The input array. + *

+ * @param int $sort_flags [optional]

+ * The optional second parameter sort_flags + * may be used to modify the sorting behavior using these values: + *

+ *

+ * Sorting type flags: + * SORT_REGULAR - compare items normally + * (don't change types) + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function sort (array &$array, $sort_flags = 'SORT_REGULAR') {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array in reverse order + * @link http://php.net/manual/en/function.rsort.php + * @param array $array

+ * The input array. + *

+ * @param int $sort_flags [optional]

+ * You may modify the behavior of the sort using the optional + * parameter sort_flags, for details see + * sort. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function rsort (array &$array, $sort_flags = 'SORT_REGULAR') {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array by values using a user-defined comparison function + * @link http://php.net/manual/en/function.usort.php + * @param array $array

+ * The input array. + *

+ * @param callable $cmp_function

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function usort (array &$array, callable $cmp_function) {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array with a user-defined comparison function and maintain index association + * @link http://php.net/manual/en/function.uasort.php + * @param array $array

+ * The input array. + *

+ * @param callable $cmp_function

+ * See usort and uksort for + * examples of user-defined comparison functions. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function uasort (array &$array, callable $cmp_function) {} + +/** + * (PHP 4, PHP 5)
+ * Sort an array by keys using a user-defined comparison function + * @link http://php.net/manual/en/function.uksort.php + * @param array $array

+ * The input array. + *

+ * @param callable $cmp_function

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function uksort (array &$array, callable $cmp_function) {} + +/** + * (PHP 4, PHP 5)
+ * Shuffle an array + * @link http://php.net/manual/en/function.shuffle.php + * @param array $array

+ * The array. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function shuffle (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Apply a user function to every member of an array + * @link http://php.net/manual/en/function.array-walk.php + * @param array $array

+ * The input array. + *

+ * @param callable $funcname

+ * Typically, funcname takes on two parameters. + * The array parameter's value being the first, and + * the key/index second. + *

+ *

+ * If funcname needs to be working with the + * actual values of the array, specify the first parameter of + * funcname as a + * reference. Then, + * any changes made to those elements will be made in the + * original array itself. + *

+ *

+ * Many internal functions (for example strtolower) + * will throw a warning if more than the expected number of argument + * are passed in and are not usable directly as + * funcname. + *

+ *

+ * Only the values of the array may potentially be + * changed; its structure cannot be altered, i.e., the programmer cannot + * add, unset or reorder elements. If the callback does not respect this + * requirement, the behavior of this function is undefined, and + * unpredictable. + *

+ * @param mixed $userdata [optional]

+ * If the optional userdata parameter is supplied, + * it will be passed as the third parameter to the callback + * funcname. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function array_walk (array &$array, callable $funcname, $userdata = null) {} + +/** + * (PHP 5)
+ * Apply a user function recursively to every member of an array + * @link http://php.net/manual/en/function.array-walk-recursive.php + * @param array $input

+ * The input array. + *

+ * @param callable $funcname

+ * Typically, funcname takes on two parameters. + * The input parameter's value being the first, and + * the key/index second. + *

+ *

+ * If funcname needs to be working with the + * actual values of the array, specify the first parameter of + * funcname as a + * reference. Then, + * any changes made to those elements will be made in the + * original array itself. + *

+ * @param mixed $userdata [optional]

+ * If the optional userdata parameter is supplied, + * it will be passed as the third parameter to the callback + * funcname. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function array_walk_recursive (array &$input, callable $funcname, $userdata = null) {} + +/** + * (PHP 4, PHP 5)
+ * Count all elements in an array, or something in an object + * @link http://php.net/manual/en/function.count.php + * @param mixed $var

+ * The array or the object. + *

+ * @param int $mode [optional]

+ * If the optional mode parameter is set to + * COUNT_RECURSIVE (or 1), count + * will recursively count the array. This is particularly useful for + * counting all the elements of a multidimensional array. + * count does not detect infinite recursion. + *

+ * @return int the number of elements in var. + * If var is not an array or an object with + * implemented Countable interface, + * 1 will be returned. + * There is one exception, if var is NULL, + * 0 will be returned. + *

+ *

+ * count may return 0 for a variable that isn't set, + * but it may also return 0 for a variable that has been initialized with an + * empty array. Use isset to test if a variable is set. + * @jms-builtin + */ +function count ($var, $mode = 'COUNT_NORMAL') {} + +/** + * (PHP 4, PHP 5)
+ * Set the internal pointer of an array to its last element + * @link http://php.net/manual/en/function.end.php + * @param array $array

+ * The array. This array is passed by reference because it is modified by + * the function. This means you must pass it a real variable and not + * a function returning an array because only actual variables may be + * passed by reference. + *

+ * @return mixed the value of the last element or FALSE for empty array. + * @jms-builtin + */ +function end (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Rewind the internal array pointer + * @link http://php.net/manual/en/function.prev.php + * @param array $array

+ * The input array. + *

+ * @return mixed the array value in the previous place that's pointed to by + * the internal array pointer, or FALSE if there are no more + * elements. + * @jms-builtin + */ +function prev (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Advance the internal array pointer of an array + * @link http://php.net/manual/en/function.next.php + * @param array $array

+ * The array being affected. + *

+ * @return mixed the array value in the next place that's pointed to by the + * internal array pointer, or FALSE if there are no more elements. + * @jms-builtin + */ +function next (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Set the internal pointer of an array to its first element + * @link http://php.net/manual/en/function.reset.php + * @param array $array

+ * The input array. + *

+ * @return mixed the value of the first array element, or FALSE if the array is + * empty. + * @jms-builtin + */ +function reset (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Return the current element in an array + * @link http://php.net/manual/en/function.current.php + * @param array $array

+ * The array. + *

+ * @return mixed The current function simply returns the + * value of the array element that's currently being pointed to by the + * internal pointer. It does not move the pointer in any way. If the + * internal pointer points beyond the end of the elements list or the array is + * empty, current returns FALSE. + * @jms-builtin + */ +function current (array $array) {} + +/** + * (PHP 4, PHP 5)
+ * Fetch a key from an array + * @link http://php.net/manual/en/function.key.php + * @param array $array

+ * The array. + *

+ * @return mixed The key function simply returns the + * key of the array element that's currently being pointed to by the + * internal pointer. It does not move the pointer in any way. If the + * internal pointer points beyond the end of the elements list or the array is + * empty, key returns NULL. + * @jms-builtin + */ +function key (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Find lowest value + * @link http://php.net/manual/en/function.min.php + * @param array $values

+ * An array containing the values. + *

+ * @return mixed min returns the numerically lowest of the + * parameter values. + * @jms-builtin + */ +function min (array $values) {} + +/** + * (PHP 4, PHP 5)
+ * Find highest value + * @link http://php.net/manual/en/function.max.php + * @param array $values

+ * An array containing the values. + *

+ * @return mixed max returns the numerically highest of the + * parameter values. If multiple values can be considered of the same size, + * the one that is listed first will be returned. + *

+ *

+ * When max is given multiple arrays, the + * longest array is returned. If all the arrays have the same length, + * max will use lexicographic ordering to find the return + * value. + *

+ *

+ * When given a string it will be cast as an integer + * when comparing. + * @jms-builtin + */ +function max (array $values) {} + +/** + * (PHP 4, PHP 5)
+ * Checks if a value exists in an array + * @link http://php.net/manual/en/function.in-array.php + * @param mixed $needle

+ * The searched value. + *

+ *

+ * If needle is a string, the comparison is done + * in a case-sensitive manner. + *

+ * @param array $haystack

+ * The array. + *

+ * @param bool $strict [optional]

+ * If the third parameter strict is set to TRUE + * then the in_array function will also check the + * types of the + * needle in the haystack. + *

+ * @return bool TRUE if needle is found in the array, + * FALSE otherwise. + * @jms-builtin + */ +function in_array ($needle, array $haystack, $strict = '&false;') {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Searches the array for a given value and returns the corresponding key if successful + * @link http://php.net/manual/en/function.array-search.php + * @param mixed $needle

+ * The searched value. + *

+ *

+ * If needle is a string, the comparison is done + * in a case-sensitive manner. + *

+ * @param array $haystack

+ * The array. + *

+ * @param bool $strict [optional]

+ * If the third parameter strict is set to TRUE + * then the array_search function will search for + * identical elements in the + * haystack. This means it will also check the + * types of the + * needle in the haystack, + * and objects must be the same instance. + *

+ * @return mixed the key for needle if it is found in the + * array, FALSE otherwise. + *

+ *

+ * If needle is found in haystack + * more than once, the first matching key is returned. To return the keys for + * all matching values, use array_keys with the optional + * search_value parameter instead. + * @jms-builtin + */ +function array_search ($needle, array $haystack, $strict = false) {} + +/** + * (PHP 4, PHP 5)
+ * Import variables into the current symbol table from an array + * @link http://php.net/manual/en/function.extract.php + * @param array $var_array

+ * Note that prefix is only required if + * extract_type is EXTR_PREFIX_SAME, + * EXTR_PREFIX_ALL, EXTR_PREFIX_INVALID + * or EXTR_PREFIX_IF_EXISTS. If + * the prefixed result is not a valid variable name, it is not + * imported into the symbol table. Prefixes are automatically separated from + * the array key by an underscore character. + *

+ * @param int $extract_type [optional]

+ * The way invalid/numeric keys and collisions are treated is determined + * by the extract_type. It can be one of the + * following values: + * EXTR_OVERWRITE + * If there is a collision, overwrite the existing variable. + * @param string $prefix [optional] Only overwrite the variable if it already exists in the + * current symbol table, otherwise do nothing. This is useful + * for defining a list of valid variables and then extracting + * only those variables you have defined out of + * $_REQUEST, for example. + * @return int the number of variables successfully imported into the symbol + * table. + * @jms-builtin + */ +function extract (array &$var_array, $extract_type = 'EXTR_OVERWRITE', $prefix = null) {} + +/** + * (PHP 4, PHP 5)
+ * Create array containing variables and their values + * @link http://php.net/manual/en/function.compact.php + * @param mixed $varname

+ * compact takes a variable number of parameters. + * Each parameter can be either a string containing the name of the + * variable, or an array of variable names. The array can contain other + * arrays of variable names inside it; compact + * handles it recursively. + *

+ * @param mixed $_ [optional] + * @return array the output array with all the variables added to it. + * @jms-builtin + */ +function compact ($varname, $_ = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Fill an array with values + * @link http://php.net/manual/en/function.array-fill.php + * @param int $start_index

+ * The first index of the returned array. + *

+ *

+ * If start_index is negative, + * the first index of the returned array will be + * start_index and the following + * indices will start from zero + * (see example). + *

+ * @param int $num

+ * Number of elements to insert. + * Must be greater than zero. + *

+ * @param mixed $value

+ * Value to use for filling + *

+ * @return array the filled array + * @jms-builtin + */ +function array_fill ($start_index, $num, $value) {} + +/** + * (PHP 5 >= 5.2.0)
+ * Fill an array with values, specifying keys + * @link http://php.net/manual/en/function.array-fill-keys.php + * @param array $keys

+ * Array of values that will be used as keys. Illegal values + * for key will be converted to string. + *

+ * @param mixed $value

+ * Value to use for filling + *

+ * @return array the filled array + * @jms-builtin + */ +function array_fill_keys (array $keys, $value) {} + +/** + * (PHP 4, PHP 5)
+ * Create an array containing a range of elements + * @link http://php.net/manual/en/function.range.php + * @param mixed $start

+ * First value of the sequence. + *

+ * @param mixed $limit

+ * The sequence is ended upon reaching the + * limit value. + *

+ * @param number $step [optional]

+ * If a step value is given, it will be used as the + * increment between elements in the sequence. step + * should be given as a positive number. If not specified, + * step will default to 1. + *

+ * @return array an array of elements from start to + * limit, inclusive. + * @jms-builtin + */ +function range ($start, $limit, $step = 1) {} + +/** + * (PHP 4, PHP 5)
+ * Sort multiple or multi-dimensional arrays + * @link http://php.net/manual/en/function.array-multisort.php + * @param array $arr

+ * An array being sorted. + *

+ * @param mixed $arg [optional]

+ * Optionally another array, or sort options for the + * previous array argument: + * SORT_ASC, + * SORT_DESC, + * SORT_REGULAR, + * SORT_NUMERIC, + * SORT_STRING. + *

+ * @param mixed $arg [optional] + * @param mixed $_ [optional]

+ * Additional arg's. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function array_multisort (array &$arr, $arg = 'SORT_ASC', $arg = 'SORT_REGULAR', $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Push one or more elements onto the end of array + * @link http://php.net/manual/en/function.array-push.php + * @param array $array

+ * The input array. + *

+ * @param mixed $var

+ * The pushed value. + *

+ * @param mixed $_ [optional] + * @return int the new number of elements in the array. + * @jms-builtin + */ +function array_push (array &$array, $var, $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Pop the element off the end of array + * @link http://php.net/manual/en/function.array-pop.php + * @param array $array

+ * The array to get the value from. + *

+ * @return mixed the last value of array. + * If array is empty (or is not an array), + * NULL will be returned. + * @jms-builtin + */ +function array_pop (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Shift an element off the beginning of array + * @link http://php.net/manual/en/function.array-shift.php + * @param array $array

+ * The input array. + *

+ * @return mixed the shifted value, or NULL if array is + * empty or is not an array. + * @jms-builtin + */ +function array_shift (array &$array) {} + +/** + * (PHP 4, PHP 5)
+ * Prepend one or more elements to the beginning of an array + * @link http://php.net/manual/en/function.array-unshift.php + * @param array $array

+ * The input array. + *

+ * @param mixed $var

+ * The prepended variable. + *

+ * @param mixed $_ [optional] + * @return int the new number of elements in the array. + * @jms-builtin + */ +function array_unshift (array &$array, $var, $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Remove a portion of the array and replace it with something else + * @link http://php.net/manual/en/function.array-splice.php + * @param array $input

+ * The input array. + *

+ * @param int $offset

+ * If offset is positive then the start of removed + * portion is at that offset from the beginning of the + * input array. If offset + * is negative then it starts that far from the end of the + * input array. + *

+ * @param int $length [optional]

+ * If length is omitted, removes everything + * from offset to the end of the array. If + * length is specified and is positive, then + * that many elements will be removed. If + * length is specified and is negative then + * the end of the removed portion will be that many elements from + * the end of the array. Tip: to remove everything from + * offset to the end of the array when + * replacement is also specified, use + * count($input) for + * length. + *

+ * @param mixed $replacement [optional]

+ * If replacement array is specified, then the + * removed elements are replaced with elements from this array. + *

+ *

+ * If offset and length + * are such that nothing is removed, then the elements from the + * replacement array are inserted in the place + * specified by the offset. Note that keys in + * replacement array are not preserved. + *

+ *

+ * If replacement is just one element it is + * not necessary to put array() + * around it, unless the element is an array itself, an object or NULL. + *

+ * @return array the array consisting of the extracted elements. + * @jms-builtin + */ +function array_splice (array &$input, $offset, $length = 0, $replacement = null) {} + +/** + * (PHP 4, PHP 5)
+ * Extract a slice of the array + * @link http://php.net/manual/en/function.array-slice.php + * @param array $array

+ * The input array. + *

+ * @param int $offset

+ * If offset is non-negative, the sequence will + * start at that offset in the array. If + * offset is negative, the sequence will + * start that far from the end of the array. + *

+ * @param int $length [optional]

+ * If length is given and is positive, then + * the sequence will have up to that many elements in it. If the array + * is shorter than the length, then only the + * available array elements will be present. If + * length is given and is negative then the + * sequence will stop that many elements from the end of the + * array. If it is omitted, then the sequence will have everything + * from offset up until the end of the + * array. + *

+ * @param bool $preserve_keys [optional]

+ * Note that array_slice will reorder and reset the + * numeric array indices by default. You can change this behaviour by setting + * preserve_keys to TRUE. + *

+ * @return array the slice. + * @jms-builtin + */ +function array_slice (array $array, $offset, $length = null, $preserve_keys = false) {} + +/** + * (PHP 4, PHP 5)
+ * Merge one or more arrays + * @link http://php.net/manual/en/function.array-merge.php + * @param array $array1

+ * Initial array to merge. + *

+ * @param array $_ [optional]

+ * Variable list of arrays to merge. + *

+ * @return array the resulting array. + * @jms-builtin + */ +function array_merge (array $array1, array $_ = array()) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Merge two or more arrays recursively + * @link http://php.net/manual/en/function.array-merge-recursive.php + * @param array $array1

+ * Initial array to merge. + *

+ * @param array $_ [optional]

+ * Variable list of arrays to recursively merge. + *

+ * @return array An array of values resulted from merging the arguments together. + * @jms-builtin + */ +function array_merge_recursive (array $array1, array $_ = a) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Replaces elements from passed arrays into the first array + * @link http://php.net/manual/en/function.array-replace.php + * @param array $array

+ * The array in which elements are replaced. + *

+ * @param array $array1

+ * The array from which elements will be extracted. + *

+ * @param array $_ [optional]

+ * More arrays from which elements will be extracted. + * Values from later arrays overwrite the previous values. + *

+ * @return array an array, or NULL if an error occurs. + * @jms-builtin + */ +function array_replace (array $array, array $array1, array $_ = null) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Replaces elements from passed arrays into the first array recursively + * @link http://php.net/manual/en/function.array-replace-recursive.php + * @param array $array

+ * The array in which elements are replaced. + *

+ * @param array $array1

+ * The array from which elements will be extracted. + *

+ * @param array $_ [optional]

+ * Optional. More arrays from which elements will be extracted. + *

+ * @return array an array, or NULL if an error occurs. + * @jms-builtin + */ +function array_replace_recursive (array $array, array $array1, array $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Return all the keys or a subset of the keys of an array + * @link http://php.net/manual/en/function.array-keys.php + * @param array $input

+ * An array containing keys to return. + *

+ * @param mixed $search_value [optional]

+ * If specified, then only keys containing these values are returned. + *

+ * @param bool $strict [optional]

+ * Determines if strict comparison (===) should be used during the search. + *

+ * @return array an array of all the keys in input. + * @jms-builtin + */ +function array_keys (array $input, $search_value = null, $strict = false) {} + +/** + * (PHP 4, PHP 5)
+ * Return all the values of an array + * @link http://php.net/manual/en/function.array-values.php + * @param array $input

+ * The array. + *

+ * @return array an indexed array of values. + * @jms-builtin + */ +function array_values (array $input) {} + +/** + * (PHP 4, PHP 5)
+ * Counts all the values of an array + * @link http://php.net/manual/en/function.array-count-values.php + * @param array $input

+ * The array of values to count + *

+ * @return array an associative array of values from input as + * keys and their count as value. + * @jms-builtin + */ +function array_count_values (array $input) {} + +/** + * (PHP 4, PHP 5)
+ * Return an array with elements in reverse order + * @link http://php.net/manual/en/function.array-reverse.php + * @param array $array

+ * The input array. + *

+ * @param bool $preserve_keys [optional]

+ * If set to TRUE numeric keys are preserved. + * Non-numeric keys are not affected by this setting and will always be preserved. + *

+ * @return array the reversed array. + * @jms-builtin + */ +function array_reverse (array $array, $preserve_keys = false) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Iteratively reduce the array to a single value using a callback function + * @link http://php.net/manual/en/function.array-reduce.php + * @param array $input

+ * The input array. + *

+ * @param callable $function

+ * The callback function. + *

+ * mixedcallback + * mixedresult + * mixeditem + * @param mixed $initial [optional]

+ * If the optional initial is available, it will + * be used at the beginning of the process, or as a final result in case + * the array is empty. + *

+ * @return mixed the resulting value. + *

+ *

+ * If the array is empty and initial is not passed, + * array_reduce returns NULL. + * @jms-builtin + */ +function array_reduce (array $input, callable $function, $initial = null) {} + +/** + * (PHP 4, PHP 5)
+ * Pad array to the specified length with a value + * @link http://php.net/manual/en/function.array-pad.php + * @param array $input

+ * Initial array of values to pad. + *

+ * @param int $pad_size

+ * New size of the array. + *

+ * @param mixed $pad_value

+ * Value to pad if input is less than + * pad_size. + *

+ * @return array a copy of the input padded to size specified + * by pad_size with value + * pad_value. If pad_size is + * positive then the array is padded on the right, if it's negative then + * on the left. If the absolute value of pad_size is less + * than or equal to the length of the input then no + * padding takes place. + * @jms-builtin + */ +function array_pad (array $input, $pad_size, $pad_value) {} + +/** + * (PHP 4, PHP 5)
+ * Exchanges all keys with their associated values in an array + * @link http://php.net/manual/en/function.array-flip.php + * @param array $trans

+ * An array of key/value pairs to be flipped. + *

+ * @return array the flipped array on success and NULL on failure. + * @jms-builtin + */ +function array_flip (array $trans) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Changes all keys in an array + * @link http://php.net/manual/en/function.array-change-key-case.php + * @param array $input

+ * The array to work on + *

+ * @param int $case [optional]

+ * Either CASE_UPPER or + * CASE_LOWER (default) + *

+ * @return array an array with its keys lower or uppercased, or FALSE if + * input is not an array. + * @jms-builtin + */ +function array_change_key_case (array $input, $case = 'CASE_LOWER') {} + +/** + * (PHP 4, PHP 5)
+ * Pick one or more random entries out of an array + * @link http://php.net/manual/en/function.array-rand.php + * @param array $input

+ * The input array. + *

+ * @param int $num_req [optional]

+ * Specifies how many entries you want to pick. Trying to pick more + * elements than there are in the array will result in an + * E_WARNING level error. + *

+ * @return mixed If you are picking only one entry, array_rand + * returns the key for a random entry. Otherwise, it returns an array + * of keys for the random entries. This is done so that you can pick + * random keys as well as values out of the array. + * @jms-builtin + */ +function array_rand (array $input, $num_req = 1) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Removes duplicate values from an array + * @link http://php.net/manual/en/function.array-unique.php + * @param array $array

+ * The input array. + *

+ * @param int $sort_flags [optional]

+ * The optional second parameter sort_flags + * may be used to modify the sorting behavior using these values: + *

+ *

+ * Sorting type flags: + * SORT_REGULAR - compare items normally + * (don't change types) + * @return array the filtered array. + * @jms-builtin + */ +function array_unique (array $array, $sort_flags = 'SORT_STRING') {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Computes the intersection of arrays + * @link http://php.net/manual/en/function.array-intersect.php + * @param array $array1

+ * The array with master values to check. + *

+ * @param array $array2

+ * An array to compare values against. + *

+ * @param array $_ [optional] + * @return array an array containing all of the values in + * array1 whose values exist in all of the parameters. + * @jms-builtin + */ +function array_intersect (array $array1, array $array2, array $_ = null) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Computes the intersection of arrays using keys for comparison + * @link http://php.net/manual/en/function.array-intersect-key.php + * @param array $array1

+ * The array with master keys to check. + *

+ * @param array $array2

+ * An array to compare keys against. + *

+ * @param array $_ [optional] + * @return array an associative array containing all the entries of + * array1 which have keys that are present in all + * arguments. + * @jms-builtin + */ +function array_intersect_key (array $array1, array $array2, array $_ = null) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Computes the intersection of arrays using a callback function on the keys for comparison + * @link http://php.net/manual/en/function.array-intersect-ukey.php + * @param array $array1

+ * Initial array for comparison of the arrays. + *

+ * @param array $array2

+ * First array to compare keys against. + *

+ * @param array $_ [optional] + * @param callable $key_compare_func

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @return array the values of array1 whose keys exist + * in all the arguments. + * @jms-builtin + */ +function array_intersect_ukey (array $array1, array $array2, array $_ = null, callable $key_compare_func) {} + +/** + * (PHP 5)
+ * Computes the intersection of arrays, compares data by a callback function + * @link http://php.net/manual/en/function.array-uintersect.php + * @param array $array1

+ * The first array. + *

+ * @param array $array2

+ * The second array. + *

+ * @param array $_ [optional] + * @param callable $data_compare_func

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @return array an array containing all the values of array1 + * that are present in all the arguments. + * @jms-builtin + */ +function array_uintersect (array $array1, array $array2, array $_ = null, callable $data_compare_func) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Computes the intersection of arrays with additional index check + * @link http://php.net/manual/en/function.array-intersect-assoc.php + * @param array $array1

+ * The array with master values to check. + *

+ * @param array $array2

+ * An array to compare values against. + *

+ * @param array $_ [optional] + * @return array an associative array containing all the values in + * array1 that are present in all of the arguments. + * @jms-builtin + */ +function array_intersect_assoc (array $array1, array $array2, array $_ = null) {} + +/** + * (PHP 5)
+ * Computes the intersection of arrays with additional index check, compares data by a callback function + * @link http://php.net/manual/en/function.array-uintersect-assoc.php + * @param array $array1

+ * The first array. + *

+ * @param array $array2

+ * The second array. + *

+ * @param array $_ [optional] + * @param callable $data_compare_func

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @return array an array containing all the values of + * array1 that are present in all the arguments. + * @jms-builtin + */ +function array_uintersect_assoc (array $array1, array $array2, array $_ = null, callable $data_compare_func) {} + +/** + * (PHP 5)
+ * Computes the intersection of arrays with additional index check, compares indexes by a callback function + * @link http://php.net/manual/en/function.array-intersect-uassoc.php + * @param array $array1

+ * Initial array for comparison of the arrays. + *

+ * @param array $array2

+ * First array to compare keys against. + *

+ * @param array $_ [optional] + * @param callable $key_compare_func

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @return array the values of array1 whose values exist + * in all of the arguments. + * @jms-builtin + */ +function array_intersect_uassoc (array $array1, array $array2, array $_ = null, callable $key_compare_func) {} + +/** + * (PHP 5)
+ * Computes the intersection of arrays with additional index check, compares data and indexes by a callback functions + * @link http://php.net/manual/en/function.array-uintersect-uassoc.php + * @param array $array1

+ * The first array. + *

+ * @param array $array2

+ * The second array. + *

+ * @param array $_ [optional] + * @param callable $data_compare_func

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @param callable $key_compare_func

+ * Key comparison callback function. + *

+ * @return array an array containing all the values of + * array1 that are present in all the arguments. + * @jms-builtin + */ +function array_uintersect_uassoc (array $array1, array $array2, array $_ = null, callable $data_compare_func, callable $key_compare_func) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
+ * Computes the difference of arrays + * @link http://php.net/manual/en/function.array-diff.php + * @param array $array1

+ * The array to compare from + *

+ * @param array $array2

+ * An array to compare against + *

+ * @param array $_ [optional]

+ * More arrays to compare against + *

+ * @return array an array containing all the entries from + * array1 that are not present in any of the other arrays. + * @jms-builtin + */ +function array_diff (array $array1, array $array2, array $_ = null) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Computes the difference of arrays using keys for comparison + * @link http://php.net/manual/en/function.array-diff-key.php + * @param array $array1

+ * The array to compare from + *

+ * @param array $array2

+ * An array to compare against + *

+ * @param array $_ [optional]

+ * More arrays to compare against + *

+ * @return array an array containing all the entries from + * array1 whose keys are not present in any of the + * other arrays. + * @jms-builtin + */ +function array_diff_key (array $array1, array $array2, array $_ = null) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Computes the difference of arrays using a callback function on the keys for comparison + * @link http://php.net/manual/en/function.array-diff-ukey.php + * @param array $array1

+ * The array to compare from + *

+ * @param array $array2

+ * An array to compare against + *

+ * @param array $_ [optional]

+ * More arrays to compare against + *

+ * @param callable $key_compare_func

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @return array an array containing all the entries from + * array1 that are not present in any of the other arrays. + * @jms-builtin + */ +function array_diff_ukey (array $array1, array $array2, array $_ = null, callable $key_compare_func) {} + +/** + * (PHP 5)
+ * Computes the difference of arrays by using a callback function for data comparison + * @link http://php.net/manual/en/function.array-udiff.php + * @param array $array1

+ * The first array. + *

+ * @param array $array2

+ * The second array. + *

+ * @param array $_ [optional] + * @param callable $data_compare_func

+ * The callback comparison function. + *

+ *

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @return array an array containing all the values of array1 + * that are not present in any of the other arguments. + * @jms-builtin + */ +function array_udiff (array $array1, array $array2, array $_ = null, callable $data_compare_func) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Computes the difference of arrays with additional index check + * @link http://php.net/manual/en/function.array-diff-assoc.php + * @param array $array1

+ * The array to compare from + *

+ * @param array $array2

+ * An array to compare against + *

+ * @param array $_ [optional]

+ * More arrays to compare against + *

+ * @return array an array containing all the values from + * array1 that are not present in any of the other arrays. + * @jms-builtin + */ +function array_diff_assoc (array $array1, array $array2, array $_ = null) {} + +/** + * (PHP 5)
+ * Computes the difference of arrays with additional index check, compares data by a callback function + * @link http://php.net/manual/en/function.array-udiff-assoc.php + * @param array $array1

+ * The first array. + *

+ * @param array $array2

+ * The second array. + *

+ * @param array $_ [optional] + * @param callable $data_compare_func

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @return array array_udiff_assoc returns an array + * containing all the values from array1 + * that are not present in any of the other arguments. + * Note that the keys are used in the comparison unlike + * array_diff and array_udiff. + * The comparison of arrays' data is performed by using an user-supplied + * callback. In this aspect the behaviour is opposite to the behaviour of + * array_diff_assoc which uses internal function for + * comparison. + * @jms-builtin + */ +function array_udiff_assoc (array $array1, array $array2, array $_ = null, callable $data_compare_func) {} + +/** + * (PHP 5)
+ * Computes the difference of arrays with additional index check which is performed by a user supplied callback function + * @link http://php.net/manual/en/function.array-diff-uassoc.php + * @param array $array1

+ * The array to compare from + *

+ * @param array $array2

+ * An array to compare against + *

+ * @param array $_ [optional]

+ * More arrays to compare against + *

+ * @param callable $key_compare_func

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @return array an array containing all the entries from + * array1 that are not present in any of the other arrays. + * @jms-builtin + */ +function array_diff_uassoc (array $array1, array $array2, array $_ = null, callable $key_compare_func) {} + +/** + * (PHP 5)
+ * Computes the difference of arrays with additional index check, compares data and indexes by a callback function + * @link http://php.net/manual/en/function.array-udiff-uassoc.php + * @param array $array1

+ * The first array. + *

+ * @param array $array2

+ * The second array. + *

+ * @param array $_ [optional] + * @param callable $data_compare_func

+ * The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. + *

+ * intcallbackmixedamixedb + * @param callable $key_compare_func

+ * The comparison of keys (indices) is done also by the callback function + * key_compare_func. This behaviour is unlike what + * array_udiff_assoc does, since the latter compares + * the indices by using an internal function. + *

+ * @return array an array containing all the values from + * array1 that are not present in any of the other + * arguments. + * @jms-builtin + */ +function array_udiff_uassoc (array $array1, array $array2, array $_ = null, callable $data_compare_func, callable $key_compare_func) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
+ * Calculate the sum of values in an array + * @link http://php.net/manual/en/function.array-sum.php + * @param array $array

+ * The input array. + *

+ * @return number the sum of values as an integer or float. + * @jms-builtin + */ +function array_sum (array $array) {} + +/** + * (PHP 5 >= 5.1.0)
+ * Calculate the product of values in an array + * @link http://php.net/manual/en/function.array-product.php + * @param array $array

+ * The array. + *

+ * @return number the product as an integer or float. + * @jms-builtin + */ +function array_product (array $array) {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Filters elements of an array using a callback function + * @link http://php.net/manual/en/function.array-filter.php + * @param array $input

+ * The array to iterate over + *

+ * @param callable $callback [optional]

+ * The callback function to use + *

+ *

+ * If no callback is supplied, all entries of + * input equal to FALSE (see + * converting to + * boolean) will be removed. + *

+ * @return array the filtered array. + * @jms-builtin + */ +function array_filter (array $input, callable $callback = "") {} + +/** + * (PHP 4 >= 4.0.6, PHP 5)
+ * Applies the callback to the elements of the given arrays + * @link http://php.net/manual/en/function.array-map.php + * @param callable $callback

+ * Callback function to run for each element in each array. + *

+ * @param array $arr1

+ * An array to run through the callback function. + *

+ * @param array $_ [optional] + * @return array an array containing all the elements of arr1 + * after applying the callback function to each one. + * @jms-builtin + */ +function array_map (callable $callback, array $arr1, array $_ = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Split an array into chunks + * @link http://php.net/manual/en/function.array-chunk.php + * @param array $input

+ * The array to work on + *

+ * @param int $size

+ * The size of each chunk + *

+ * @param bool $preserve_keys [optional]

+ * When set to TRUE keys will be preserved. + * Default is FALSE which will reindex the chunk numerically + *

+ * @return array a multidimensional numerically indexed array, starting with zero, + * with each dimension containing size elements. + * @jms-builtin + */ +function array_chunk (array $input, $size, $preserve_keys = false) {} + +/** + * (PHP 5)
+ * Creates an array by using one array for keys and another for its values + * @link http://php.net/manual/en/function.array-combine.php + * @param array $keys

+ * Array of keys to be used. Illegal values for key will be + * converted to string. + *

+ * @param array $values

+ * Array of values to be used + *

+ * @return array the combined array, FALSE if the number of elements + * for each array isn't equal. + * @jms-builtin + */ +function array_combine (array $keys, array $values) {} + +/** + * (PHP 4 >= 4.0.7, PHP 5)
+ * Checks if the given key or index exists in the array + * @link http://php.net/manual/en/function.array-key-exists.php + * @param mixed $key

+ * Value to check. + *

+ * @param array $search

+ * An array with keys to check. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function array_key_exists ($key, array $search) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of current + * @link http://php.net/manual/en/function.pos.php + * @param $arg + * @jms-builtin + */ +function pos (&$arg) {} + +/** + * (PHP 4, PHP 5)
+ * Alias of count + * @link http://php.net/manual/en/function.sizeof.php + * @param $var + * @param $mode [optional] + * @jms-builtin + */ +function sizeof ($var, $mode) {} + +/** + * @param $key + * @param $search + * @jms-builtin + */ +function key_exists ($key, $search) {} + +/** + * (PHP 4, PHP 5)
+ * Checks if assertion is FALSE + * @link http://php.net/manual/en/function.assert.php + * @param mixed $assertion

+ * The assertion. + *

+ * @return bool FALSE if the assertion is false, TRUE otherwise. + * @jms-builtin + */ +function assert ($assertion) {} + +/** + * (PHP 4, PHP 5)
+ * Set/get the various assert flags + * @link http://php.net/manual/en/function.assert-options.php + * @param int $what

+ * + * Assert Options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * NULL) + * + * + *
OptionINI SettingDefault valueDescription
ASSERT_ACTIVEassert.active1enable assert evaluation
ASSERT_WARNINGassert.warning1issue a PHP warning for each failed assertion
ASSERT_BAILassert.bail0terminate execution on failed assertions
ASSERT_QUIET_EVALassert.quiet_eval0 + * disable error_reporting during assertion expression + * evaluation + *
ASSERT_CALLBACKassert.callbackCallback to call on failed assertions
+ *

+ * @param mixed $value [optional]

+ * An optional new value for the option. + *

+ * @return mixed the original setting of any option or FALSE on errors. + * @jms-builtin + */ +function assert_options ($what, $value = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Compares two "PHP-standardized" version number strings + * @link http://php.net/manual/en/function.version-compare.php + * @param string $version1

+ * First version number. + *

+ * @param string $version2

+ * Second version number. + *

+ * @param string $operator [optional]

+ * If you specify the third optional operator + * argument, you can test for a particular relationship. The + * possible operators are: <, + * lt, <=, + * le, >, + * gt, >=, + * ge, ==, + * =, eq, + * !=, <>, + * ne respectively. + *

+ *

+ * This parameter is case-sensitive, so values should be lowercase. + *

+ * @return mixed By default, version_compare returns + * -1 if the first version is lower than the second, + * 0 if they are equal, and + * 1 if the second is lower. + *

+ *

+ * When using the optional operator argument, the + * function will return TRUE if the relationship is the one specified + * by the operator, FALSE otherwise. + * @jms-builtin + */ +function version_compare ($version1, $version2, $operator = null) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Convert a pathname and a project identifier to a System V IPC key + * @link http://php.net/manual/en/function.ftok.php + * @param string $pathname

+ * Path to an accessible file. + *

+ * @param string $proj

+ * Project identifier. This must be a one character string. + *

+ * @return int On success the return value will be the created key value, otherwise + * -1 is returned. + * @jms-builtin + */ +function ftok ($pathname, $proj) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Perform the rot13 transform on a string + * @link http://php.net/manual/en/function.str-rot13.php + * @param string $str

+ * The input string. + *

+ * @return string the ROT13 version of the given string. + * @jms-builtin + */ +function str_rot13 ($str) {} + +/** + * (PHP 5)
+ * Retrieve list of registered filters + * @link http://php.net/manual/en/function.stream-get-filters.php + * @return array an indexed array containing the name of all stream filters + * available. + * @jms-builtin + */ +function stream_get_filters () {} + +/** + * (PHP 5)
+ * Register a user defined stream filter + * @link http://php.net/manual/en/function.stream-filter-register.php + * @param string $filtername

+ * The filter name to be registered. + *

+ * @param string $classname

+ * To implement a filter, you need to define a class as an extension of + * php_user_filter with a number of member + * functions. When performing read/write operations on the stream + * to which your filter is attached, PHP will pass the data through your + * filter (and any other filters attached to that stream) so that the + * data may be modified as desired. You must implement the methods + * exactly as described in php_user_filter - doing + * otherwise will lead to undefined behaviour. + *

+ * @return bool TRUE on success or FALSE on failure. + *

+ *

+ * stream_filter_register will return FALSE if the + * filtername is already defined. + * @jms-builtin + */ +function stream_filter_register ($filtername, $classname) {} + +/** + * (PHP 5)
+ * Return a bucket object from the brigade for operating on + * @link http://php.net/manual/en/function.stream-bucket-make-writeable.php + * @param resource $brigade + * @return object + * @jms-builtin + */ +function stream_bucket_make_writeable ($brigade) {} + +/** + * (PHP 5)
+ * Prepend bucket to brigade + * @link http://php.net/manual/en/function.stream-bucket-prepend.php + * @param resource $brigade + * @param resource $bucket + * @return void + * @jms-builtin + */ +function stream_bucket_prepend ($brigade, $bucket) {} + +/** + * (PHP 5)
+ * Append bucket to brigade + * @link http://php.net/manual/en/function.stream-bucket-append.php + * @param resource $brigade + * @param resource $bucket + * @return void + * @jms-builtin + */ +function stream_bucket_append ($brigade, $bucket) {} + +/** + * (PHP 5)
+ * Create a new bucket for use on the current stream + * @link http://php.net/manual/en/function.stream-bucket-new.php + * @param resource $stream + * @param string $buffer + * @return object + * @jms-builtin + */ +function stream_bucket_new ($stream, $buffer) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Add URL rewriter values + * @link http://php.net/manual/en/function.output-add-rewrite-var.php + * @param string $name

+ * The variable name. + *

+ * @param string $value

+ * The variable value. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function output_add_rewrite_var ($name, $value) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Reset URL rewriter values + * @link http://php.net/manual/en/function.output-reset-rewrite-vars.php + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function output_reset_rewrite_vars () {} + +/** + * (PHP 5 >= 5.2.1)
+ * Returns directory path used for temporary files + * @link http://php.net/manual/en/function.sys-get-temp-dir.php + * @return string the path of the temporary directory. + * @jms-builtin + */ +function sys_get_temp_dir () {} + +define ('CONNECTION_ABORTED', 1); +define ('CONNECTION_NORMAL', 0); +define ('CONNECTION_TIMEOUT', 2); +define ('INI_USER', 1); +define ('INI_PERDIR', 2); +define ('INI_SYSTEM', 4); +define ('INI_ALL', 7); + +/** + * Normal INI scanner mode (since PHP 5.3). + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('INI_SCANNER_NORMAL', 0); + +/** + * Raw INI scanner mode (since PHP 5.3). + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('INI_SCANNER_RAW', 1); +define ('PHP_URL_SCHEME', 0); +define ('PHP_URL_HOST', 1); +define ('PHP_URL_PORT', 2); +define ('PHP_URL_USER', 3); +define ('PHP_URL_PASS', 4); +define ('PHP_URL_PATH', 5); +define ('PHP_URL_QUERY', 6); +define ('PHP_URL_FRAGMENT', 7); +define ('PHP_QUERY_RFC1738', 1); +define ('PHP_QUERY_RFC3986', 2); +define ('M_E', 2.718281828459); +define ('M_LOG2E', 1.442695040889); +define ('M_LOG10E', 0.43429448190325); +define ('M_LN2', 0.69314718055995); +define ('M_LN10', 2.302585092994); + +/** + * Round halves up + * @link http://php.net/manual/en/math.constants.php + */ +define ('M_PI', 3.1415926535898); +define ('M_PI_2', 1.5707963267949); +define ('M_PI_4', 0.78539816339745); +define ('M_1_PI', 0.31830988618379); +define ('M_2_PI', 0.63661977236758); +define ('M_SQRTPI', 1.7724538509055); +define ('M_2_SQRTPI', 1.1283791670955); +define ('M_LNPI', 1.1447298858494); +define ('M_EULER', 0.57721566490153); +define ('M_SQRT2', 1.4142135623731); +define ('M_SQRT1_2', 0.70710678118655); +define ('M_SQRT3', 1.7320508075689); +define ('INF', INF); +define ('NAN', NAN); +define ('PHP_ROUND_HALF_UP', 1); + +/** + * Round halves down + * @link http://php.net/manual/en/math.constants.php + */ +define ('PHP_ROUND_HALF_DOWN', 2); + +/** + * Round halves to even numbers + * @link http://php.net/manual/en/math.constants.php + */ +define ('PHP_ROUND_HALF_EVEN', 3); + +/** + * Round halves to odd numbers + * @link http://php.net/manual/en/math.constants.php + */ +define ('PHP_ROUND_HALF_ODD', 4); +define ('INFO_GENERAL', 1); + +/** + * PHP Credits. See also phpcredits. + * @link http://php.net/manual/en/info.constants.php + */ +define ('INFO_CREDITS', 2); + +/** + * Current Local and Master values for PHP directives. See + * also ini_get. + * @link http://php.net/manual/en/info.constants.php + */ +define ('INFO_CONFIGURATION', 4); + +/** + * Loaded modules and their respective settings. + * @link http://php.net/manual/en/info.constants.php + */ +define ('INFO_MODULES', 8); + +/** + * Environment Variable information that's also available in + * $_ENV. + * @link http://php.net/manual/en/info.constants.php + */ +define ('INFO_ENVIRONMENT', 16); + +/** + * Shows all + * predefined variables from EGPCS (Environment, GET, + * POST, Cookie, Server). + * @link http://php.net/manual/en/info.constants.php + */ +define ('INFO_VARIABLES', 32); + +/** + * PHP License information. See also the license faq. + * @link http://php.net/manual/en/info.constants.php + */ +define ('INFO_LICENSE', 64); + +/** + * Unused + * @link http://php.net/manual/en/info.constants.php + */ +define ('INFO_ALL', 4294967295); + +/** + * A list of the core developers + * @link http://php.net/manual/en/info.constants.php + */ +define ('CREDITS_GROUP', 1); + +/** + * General credits: Language design and concept, PHP + * authors and SAPI module. + * @link http://php.net/manual/en/info.constants.php + */ +define ('CREDITS_GENERAL', 2); + +/** + * A list of the server API modules for PHP, and their authors. + * @link http://php.net/manual/en/info.constants.php + */ +define ('CREDITS_SAPI', 4); + +/** + * A list of the extension modules for PHP, and their authors. + * @link http://php.net/manual/en/info.constants.php + */ +define ('CREDITS_MODULES', 8); + +/** + * The credits for the documentation team. + * @link http://php.net/manual/en/info.constants.php + */ +define ('CREDITS_DOCS', 16); + +/** + * Usually used in combination with the other flags. Indicates + * that a complete stand-alone HTML page needs to be + * printed including the information indicated by the other + * flags. + * @link http://php.net/manual/en/info.constants.php + */ +define ('CREDITS_FULLPAGE', 32); + +/** + * The credits for the quality assurance team. + * @link http://php.net/manual/en/info.constants.php + */ +define ('CREDITS_QA', 64); + +/** + * The configuration line, php.ini location, build date, Web + * Server, System and more. + * @link http://php.net/manual/en/info.constants.php + */ +define ('CREDITS_ALL', 4294967295); +define ('HTML_SPECIALCHARS', 0); +define ('HTML_ENTITIES', 1); +define ('ENT_COMPAT', 2); +define ('ENT_QUOTES', 3); +define ('ENT_NOQUOTES', 0); +define ('ENT_IGNORE', 4); +define ('ENT_SUBSTITUTE', 8); +define ('ENT_DISALLOWED', 128); +define ('ENT_HTML401', 0); +define ('ENT_XML1', 16); +define ('ENT_XHTML', 32); +define ('ENT_HTML5', 48); +define ('STR_PAD_LEFT', 0); +define ('STR_PAD_RIGHT', 1); +define ('STR_PAD_BOTH', 2); +define ('PATHINFO_DIRNAME', 1); +define ('PATHINFO_BASENAME', 2); +define ('PATHINFO_EXTENSION', 4); + +/** + * Since PHP 5.2.0. + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('PATHINFO_FILENAME', 8); +define ('CHAR_MAX', 127); +define ('LC_CTYPE', 0); +define ('LC_NUMERIC', 1); +define ('LC_TIME', 2); +define ('LC_COLLATE', 3); +define ('LC_MONETARY', 4); +define ('LC_ALL', 6); +define ('LC_MESSAGES', 5); +define ('SEEK_SET', 0); +define ('SEEK_CUR', 1); +define ('SEEK_END', 2); +define ('LOCK_SH', 1); +define ('LOCK_EX', 2); +define ('LOCK_UN', 3); +define ('LOCK_NB', 4); + +/** + * A connection with an external resource has been established. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_CONNECT', 2); + +/** + * Additional authorization is required to access the specified resource. + * Typical issued with severity level of + * STREAM_NOTIFY_SEVERITY_ERR. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_AUTH_REQUIRED', 3); + +/** + * Authorization has been completed (with or without success). + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_AUTH_RESULT', 10); + +/** + * The mime-type of resource has been identified, + * refer to message for a description of the + * discovered type. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_MIME_TYPE_IS', 4); + +/** + * The size of the resource has been discovered. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_FILE_SIZE_IS', 5); + +/** + * The external resource has redirected the stream to an alternate + * location. Refer to message. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_REDIRECTED', 6); + +/** + * Indicates current progress of the stream transfer in + * bytes_transferred and possibly + * bytes_max as well. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_PROGRESS', 7); + +/** + * A generic error occurred on the stream, consult + * message and message_code + * for details. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_FAILURE', 9); + +/** + * There is no more data available on the stream. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_COMPLETED', 8); + +/** + * A remote address required for this stream has been resolved, or the resolution + * failed. See severity for an indication of which happened. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_RESOLVE', 1); + +/** + * Normal, non-error related, notification. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_SEVERITY_INFO', 0); + +/** + * Non critical error condition. Processing may continue. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_SEVERITY_WARN', 1); + +/** + * A critical error occurred. Processing cannot continue. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_NOTIFY_SEVERITY_ERR', 2); + +/** + * Used with stream_filter_append and + * stream_filter_prepend to indicate + * that the specified filter should only be applied when + * reading + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_FILTER_READ', 1); + +/** + * Used with stream_filter_append and + * stream_filter_prepend to indicate + * that the specified filter should only be applied when + * writing + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_FILTER_WRITE', 2); + +/** + * This constant is equivalent to + * STREAM_FILTER_READ | STREAM_FILTER_WRITE + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_FILTER_ALL', 3); + +/** + * Client socket opened with stream_socket_client + * should remain persistent between page loads. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_CLIENT_PERSISTENT', 1); + +/** + * Open client socket asynchronously. This option must be used + * together with the STREAM_CLIENT_CONNECT flag. + * Used with stream_socket_client. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_CLIENT_ASYNC_CONNECT', 2); + +/** + * Open client socket connection. Client sockets should always + * include this flag. Used with stream_socket_client. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_CLIENT_CONNECT', 4); +define ('STREAM_CRYPTO_METHOD_SSLv2_CLIENT', 0); +define ('STREAM_CRYPTO_METHOD_SSLv3_CLIENT', 1); +define ('STREAM_CRYPTO_METHOD_SSLv23_CLIENT', 2); +define ('STREAM_CRYPTO_METHOD_TLS_CLIENT', 3); +define ('STREAM_CRYPTO_METHOD_SSLv2_SERVER', 4); +define ('STREAM_CRYPTO_METHOD_SSLv3_SERVER', 5); +define ('STREAM_CRYPTO_METHOD_SSLv23_SERVER', 6); +define ('STREAM_CRYPTO_METHOD_TLS_SERVER', 7); + +/** + * Used with stream_socket_shutdown to disable + * further receptions. Added in PHP 5.2.1. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_SHUT_RD', 0); + +/** + * Used with stream_socket_shutdown to disable + * further transmissions. Added in PHP 5.2.1. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_SHUT_WR', 1); + +/** + * Used with stream_socket_shutdown to disable + * further receptions and transmissions. Added in PHP 5.2.1. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_SHUT_RDWR', 2); + +/** + * Internet Protocol Version 4 (IPv4). + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_PF_INET', 2); + +/** + * Internet Protocol Version 6 (IPv6). + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_PF_INET6', 10); + +/** + * Unix system internal protocols. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_PF_UNIX', 1); + +/** + * Provides a IP socket. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_IP', 0); + +/** + * Provides a TCP socket. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_TCP', 6); + +/** + * Provides a UDP socket. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_UDP', 17); + +/** + * Provides a ICMP socket. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_ICMP', 1); + +/** + * Provides a RAW socket. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_IPPROTO_RAW', 255); + +/** + * Provides sequenced, two-way byte streams with a transmission mechanism + * for out-of-band data (TCP, for example). + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_STREAM', 1); + +/** + * Provides datagrams, which are connectionless messages (UDP, for + * example). + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_DGRAM', 2); + +/** + * Provides a raw socket, which provides access to internal network + * protocols and interfaces. Usually this type of socket is just available + * to the root user. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_RAW', 3); + +/** + * Provides a sequenced packet stream socket. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_SEQPACKET', 5); + +/** + * Provides a RDM (Reliably-delivered messages) socket. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_SOCK_RDM', 4); +define ('STREAM_PEEK', 2); +define ('STREAM_OOB', 1); + +/** + * Tells a stream created with stream_socket_server + * to bind to the specified target. Server sockets should always include this flag. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_SERVER_BIND', 4); + +/** + * Tells a stream created with stream_socket_server + * and bound using the STREAM_SERVER_BIND flag to start + * listening on the socket. Connection-orientated transports (such as TCP) + * must use this flag, otherwise the server socket will not be enabled. + * Using this flag for connect-less transports (such as UDP) is an error. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_SERVER_LISTEN', 8); + +/** + * Search for filename in + * include_path (since PHP 5). + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('FILE_USE_INCLUDE_PATH', 1); + +/** + * Strip EOL characters (since PHP 5). + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('FILE_IGNORE_NEW_LINES', 2); + +/** + * Skip empty lines (since PHP 5). + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('FILE_SKIP_EMPTY_LINES', 4); + +/** + * Append content to existing file. + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('FILE_APPEND', 8); +define ('FILE_NO_DEFAULT_CONTEXT', 16); + +/** + *

+ * Text mode (since PHP 5.2.7). + *

+ * This constant has no effect, and is only available for + * forward compatibility. + *

+ *

+ * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('FILE_TEXT', 0); + +/** + *

+ * Binary mode (since PHP 5.2.7). + *

+ * This constant has no effect, and is only available for + * forward compatibility. + *

+ *

+ * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('FILE_BINARY', 0); + +/** + * Disable backslash escaping. + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('FNM_NOESCAPE', 2); + +/** + * Slash in string only matches slash in the given pattern. + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('FNM_PATHNAME', 1); + +/** + * Leading period in string must be exactly matched by period in the given pattern. + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('FNM_PERIOD', 4); + +/** + * Caseless match. Part of the GNU extension. + * @link http://php.net/manual/en/filesystem.constants.php + */ +define ('FNM_CASEFOLD', 16); + +/** + * Return Code indicating that the + * userspace filter returned buckets in $out. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('PSFS_PASS_ON', 2); + +/** + * Return Code indicating that the + * userspace filter did not return buckets in $out + * (i.e. No data available). + * @link http://php.net/manual/en/stream.constants.php + */ +define ('PSFS_FEED_ME', 1); + +/** + * Return Code indicating that the + * userspace filter encountered an unrecoverable error + * (i.e. Invalid data received). + * @link http://php.net/manual/en/stream.constants.php + */ +define ('PSFS_ERR_FATAL', 0); + +/** + * Regular read/write. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('PSFS_FLAG_NORMAL', 0); + +/** + * An incremental flush. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('PSFS_FLAG_FLUSH_INC', 1); + +/** + * Final flush prior to closing. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('PSFS_FLAG_FLUSH_CLOSE', 2); +define ('ABDAY_1', 131072); +define ('ABDAY_2', 131073); +define ('ABDAY_3', 131074); +define ('ABDAY_4', 131075); +define ('ABDAY_5', 131076); +define ('ABDAY_6', 131077); +define ('ABDAY_7', 131078); +define ('DAY_1', 131079); +define ('DAY_2', 131080); +define ('DAY_3', 131081); +define ('DAY_4', 131082); +define ('DAY_5', 131083); +define ('DAY_6', 131084); +define ('DAY_7', 131085); +define ('ABMON_1', 131086); +define ('ABMON_2', 131087); +define ('ABMON_3', 131088); +define ('ABMON_4', 131089); +define ('ABMON_5', 131090); +define ('ABMON_6', 131091); +define ('ABMON_7', 131092); +define ('ABMON_8', 131093); +define ('ABMON_9', 131094); +define ('ABMON_10', 131095); +define ('ABMON_11', 131096); +define ('ABMON_12', 131097); +define ('MON_1', 131098); +define ('MON_2', 131099); +define ('MON_3', 131100); +define ('MON_4', 131101); +define ('MON_5', 131102); +define ('MON_6', 131103); +define ('MON_7', 131104); +define ('MON_8', 131105); +define ('MON_9', 131106); +define ('MON_10', 131107); +define ('MON_11', 131108); +define ('MON_12', 131109); +define ('AM_STR', 131110); +define ('PM_STR', 131111); +define ('D_T_FMT', 131112); +define ('D_FMT', 131113); +define ('T_FMT', 131114); +define ('T_FMT_AMPM', 131115); +define ('ERA', 131116); +define ('ERA_D_T_FMT', 131120); +define ('ERA_D_FMT', 131118); +define ('ERA_T_FMT', 131121); +define ('ALT_DIGITS', 131119); +define ('CRNCYSTR', 262159); +define ('RADIXCHAR', 65536); +define ('THOUSEP', 65537); +define ('YESEXPR', 327680); +define ('NOEXPR', 327681); +define ('CODESET', 14); +define ('CRYPT_SALT_LENGTH', 37); +define ('CRYPT_STD_DES', 1); +define ('CRYPT_EXT_DES', 1); +define ('CRYPT_MD5', 1); +define ('CRYPT_BLOWFISH', 1); +define ('CRYPT_SHA256', 1); +define ('CRYPT_SHA512', 1); +define ('DIRECTORY_SEPARATOR', "/"); + +/** + * Available since PHP 4.3.0. Semicolon on Windows, colon otherwise. + * @link http://php.net/manual/en/dir.constants.php + */ +define ('PATH_SEPARATOR', ":"); + +/** + * Available since PHP 5.4.0. + * @link http://php.net/manual/en/dir.constants.php + */ +define ('SCANDIR_SORT_ASCENDING', 0); + +/** + * Available since PHP 5.4.0. + * @link http://php.net/manual/en/dir.constants.php + */ +define ('SCANDIR_SORT_DESCENDING', 1); + +/** + * Available since PHP 5.4.0. + * @link http://php.net/manual/en/dir.constants.php + */ +define ('SCANDIR_SORT_NONE', 2); +define ('GLOB_BRACE', 1024); +define ('GLOB_MARK', 2); +define ('GLOB_NOSORT', 4); +define ('GLOB_NOCHECK', 16); +define ('GLOB_NOESCAPE', 64); +define ('GLOB_ERR', 1); +define ('GLOB_ONLYDIR', 8192); +define ('GLOB_AVAILABLE_FLAGS', 9303); + +/** + * system is unusable + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_EMERG', 0); + +/** + * action must be taken immediately + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_ALERT', 1); + +/** + * critical conditions + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_CRIT', 2); + +/** + * error conditions + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_ERR', 3); + +/** + * warning conditions + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_WARNING', 4); + +/** + * normal, but significant, condition + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_NOTICE', 5); + +/** + * informational message + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_INFO', 6); + +/** + * debug-level message + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_DEBUG', 7); + +/** + * kernel messages + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_KERN', 0); + +/** + * generic user-level messages + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_USER', 8); + +/** + * mail subsystem + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_MAIL', 16); + +/** + * other system daemons + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_DAEMON', 24); + +/** + * security/authorization messages (use LOG_AUTHPRIV instead + * in systems where that constant is defined) + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_AUTH', 32); + +/** + * messages generated internally by syslogd + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_SYSLOG', 40); + +/** + * line printer subsystem + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_LPR', 48); + +/** + * USENET news subsystem + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_NEWS', 56); + +/** + * UUCP subsystem + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_UUCP', 64); + +/** + * clock daemon (cron and at) + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_CRON', 72); + +/** + * security/authorization messages (private) + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_AUTHPRIV', 80); +define ('LOG_LOCAL0', 128); +define ('LOG_LOCAL1', 136); +define ('LOG_LOCAL2', 144); +define ('LOG_LOCAL3', 152); +define ('LOG_LOCAL4', 160); +define ('LOG_LOCAL5', 168); +define ('LOG_LOCAL6', 176); +define ('LOG_LOCAL7', 184); + +/** + * include PID with each message + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_PID', 1); + +/** + * if there is an error while sending data to the system logger, + * write directly to the system console + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_CONS', 2); + +/** + * (default) delay opening the connection until the first + * message is logged + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_ODELAY', 4); + +/** + * open the connection to the logger immediately + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_NDELAY', 8); +define ('LOG_NOWAIT', 16); + +/** + * print log message also to standard error + * @link http://php.net/manual/en/network.constants.php + */ +define ('LOG_PERROR', 32); +define ('EXTR_OVERWRITE', 0); +define ('EXTR_SKIP', 1); +define ('EXTR_PREFIX_SAME', 2); +define ('EXTR_PREFIX_ALL', 3); +define ('EXTR_PREFIX_INVALID', 4); +define ('EXTR_PREFIX_IF_EXISTS', 5); +define ('EXTR_IF_EXISTS', 6); +define ('EXTR_REFS', 256); + +/** + * SORT_ASC is used with + * array_multisort to sort in ascending order. + * @link http://php.net/manual/en/array.constants.php + */ +define ('SORT_ASC', 4); + +/** + * SORT_DESC is used with + * array_multisort to sort in descending order. + * @link http://php.net/manual/en/array.constants.php + */ +define ('SORT_DESC', 3); + +/** + * SORT_REGULAR is used to compare items normally. + * @link http://php.net/manual/en/array.constants.php + */ +define ('SORT_REGULAR', 0); + +/** + * SORT_NUMERIC is used to compare items numerically. + * @link http://php.net/manual/en/array.constants.php + */ +define ('SORT_NUMERIC', 1); + +/** + * SORT_STRING is used to compare items as strings. + * @link http://php.net/manual/en/array.constants.php + */ +define ('SORT_STRING', 2); + +/** + * SORT_LOCALE_STRING is used to compare items as + * strings, based on the current locale. Added in PHP 4.4.0 and 5.0.2. + * @link http://php.net/manual/en/array.constants.php + */ +define ('SORT_LOCALE_STRING', 5); + +/** + * SORT_NATURAL is used to compare items as + * strings using "natural ordering" like natsort. Added in PHP 5.4.0. + * @link http://php.net/manual/en/array.constants.php + */ +define ('SORT_NATURAL', 6); + +/** + * SORT_FLAG_CASE can be combined + * (bitwise OR) with + * SORT_STRING or + * SORT_NATURAL to sort strings case-insensitively. Added in PHP 5.4.0. + * @link http://php.net/manual/en/array.constants.php + */ +define ('SORT_FLAG_CASE', 8); + +/** + * CASE_LOWER is used with + * array_change_key_case and is used to convert array + * keys to lower case. This is also the default case for + * array_change_key_case. + * @link http://php.net/manual/en/array.constants.php + */ +define ('CASE_LOWER', 0); + +/** + * CASE_UPPER is used with + * array_change_key_case and is used to convert array + * keys to upper case. + * @link http://php.net/manual/en/array.constants.php + */ +define ('CASE_UPPER', 1); +define ('COUNT_NORMAL', 0); +define ('COUNT_RECURSIVE', 1); +define ('ASSERT_ACTIVE', 1); +define ('ASSERT_CALLBACK', 2); +define ('ASSERT_BAIL', 3); +define ('ASSERT_WARNING', 4); +define ('ASSERT_QUIET_EVAL', 5); + +/** + * Flag indicating if the stream + * used the include path. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_USE_PATH', 1); +define ('STREAM_IGNORE_URL', 2); + +/** + * Flag indicating if the wrapper + * is responsible for raising errors using trigger_error + * during opening of the stream. If this flag is not set, you + * should not raise any errors. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_REPORT_ERRORS', 8); + +/** + * This flag is useful when your extension really must be able to randomly + * seek around in a stream. Some streams may not be seekable in their + * native form, so this flag asks the streams API to check to see if the + * stream does support seeking. If it does not, it will copy the stream + * into temporary storage (which may be a temporary file or a memory + * stream) which does support seeking. + * Please note that this flag is not useful when you want to seek the + * stream and write to it, because the stream you are accessing might + * not be bound to the actual resource you requested. + * If the requested resource is network based, this flag will cause the + * opener to block until the whole contents have been downloaded. + * @link http://php.net/manual/en/internals2.ze1.streams.constants.php + */ +define ('STREAM_MUST_SEEK', 16); +define ('STREAM_URL_STAT_LINK', 1); +define ('STREAM_URL_STAT_QUIET', 2); +define ('STREAM_MKDIR_RECURSIVE', 1); +define ('STREAM_IS_URL', 1); +define ('STREAM_OPTION_BLOCKING', 1); +define ('STREAM_OPTION_READ_TIMEOUT', 4); +define ('STREAM_OPTION_READ_BUFFER', 2); +define ('STREAM_OPTION_WRITE_BUFFER', 3); +define ('STREAM_BUFFER_NONE', 0); +define ('STREAM_BUFFER_LINE', 1); +define ('STREAM_BUFFER_FULL', 2); + +/** + * Stream casting, when stream_cast is called + * otherwise (see above). + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_CAST_AS_STREAM', 0); + +/** + * Stream casting, for when stream_select is + * calling stream_cast. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_CAST_FOR_SELECT', 3); + +/** + * Used with stream_metadata, to specify touch call. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_META_TOUCH', 1); + +/** + * Used with stream_metadata, to specify chown call. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_META_OWNER', 3); + +/** + * Used with stream_metadata, to specify chown call. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_META_OWNER_NAME', 2); + +/** + * Used with stream_metadata, to specify chgrp call. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_META_GROUP', 5); + +/** + * Used with stream_metadata, to specify chgrp call. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_META_GROUP_NAME', 4); + +/** + * Used with stream_metadata, to specify chmod call. + * @link http://php.net/manual/en/stream.constants.php + */ +define ('STREAM_META_ACCESS', 6); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_GIF', 1); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPEG', 2); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_PNG', 3); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_SWF', 4); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_PSD', 5); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_BMP', 6); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_TIFF_II', 7); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_TIFF_MM', 8); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPC', 9); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JP2', 10); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPX', 11); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JB2', 12); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_SWC', 13); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_IFF', 14); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_WBMP', 15); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_JPEG2000', 9); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_XBM', 16); + +/** + * Image type constant used by the + * image_type_to_mime_type and + * image_type_to_extension functions. + * (Available as of PHP 5.3.0) + * @link http://php.net/manual/en/image.constants.php + */ +define ('IMAGETYPE_ICO', 17); +define ('IMAGETYPE_UNKNOWN', 0); +define ('IMAGETYPE_COUNT', 18); + +/** + * IPv4 Address Resource + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_A', 1); + +/** + * Authoritative Name Server Resource + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_NS', 2); + +/** + * Alias (Canonical Name) Resource + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_CNAME', 16); + +/** + * Start of Authority Resource + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_SOA', 32); + +/** + * Pointer Resource + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_PTR', 2048); + +/** + * Host Info Resource (See IANA's + * Operating System Names + * for the meaning of these values) + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_HINFO', 4096); + +/** + * Mail Exchanger Resource + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_MX', 16384); + +/** + * Text Resource + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_TXT', 32768); +define ('DNS_SRV', 33554432); +define ('DNS_NAPTR', 67108864); + +/** + * IPv6 Address Resource + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_AAAA', 134217728); +define ('DNS_A6', 16777216); + +/** + * Any Resource Record. On most systems + * this returns all resource records, however + * it should not be counted upon for critical + * uses. Try DNS_ALL instead. + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_ANY', 268435456); + +/** + * Iteratively query the name server for + * each available record type. + * @link http://php.net/manual/en/network.constants.php + */ +define ('DNS_ALL', 251713587); + +// End of standard v.5.4.3-4~precise+1 +?> diff --git a/res/php-5.4-core-api/suhosin.php b/res/php-5.4-core-api/suhosin.php new file mode 100644 index 0000000..adf4ac2 --- /dev/null +++ b/res/php-5.4-core-api/suhosin.php @@ -0,0 +1,28 @@ + + * Cookie name. + *

+ * @param string $value

+ * Cookie value. + *

+ * @return string the encrypted string or false on failure. + * @jms-builtin + */ +function suhosin_encrypt_cookie ($name, $value) {} + +/** + * Returns an array containing the raw cookie values + * @link http://php.net/manual/en/function.suhosin-get-raw-cookies.php + * @return array an array containing the raw cookie values. + * @jms-builtin + */ +function suhosin_get_raw_cookies () {} + +// End of suhosin v.0.9.32.1 +?> diff --git a/res/php-5.4-core-api/svn.php b/res/php-5.4-core-api/svn.php new file mode 100644 index 0000000..4bf7649 --- /dev/null +++ b/res/php-5.4-core-api/svn.php @@ -0,0 +1,1305 @@ + + * Checks out a working copy from the repository + * @link http://php.net/manual/en/function.svn-checkout.php + * @param string $repos

+ * String URL path to directory in repository to check out. + *

+ * @param string $targetpath

+ * String local path to directory to check out in to + *

+ * &svn.relativepath; + * @param int $revision [optional]

+ * Integer revision number of repository to check out. Default is + * HEAD, the most recent revision. + *

+ * @param int $flags [optional]

+ * Any combination of SVN_NON_RECURSIVE and + * SVN_IGNORE_EXTERNALS. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function svn_checkout ($repos, $targetpath, $revision = null, $flags = 0) {} + +/** + * (PECL svn >= 0.1.0)
+ * Returns the contents of a file in a repository + * @link http://php.net/manual/en/function.svn-cat.php + * @param string $repos_url

+ * String URL path to item in a repository. + *

+ * @param int $revision_no [optional]

+ * Integer revision number of item to retrieve, default is the HEAD + * revision. + *

+ * @return string the string contents of the item from the repository on + * success, and false on failure. + * @jms-builtin + */ +function svn_cat ($repos_url, $revision_no = null) {} + +/** + * (PECL svn >= 0.1.0)
+ * Returns list of directory contents in repository URL, optionally at revision number + * @link http://php.net/manual/en/function.svn-ls.php + * @param string $repos_url + * @param int $revision_no [optional] + * @param bool $recurse [optional]

+ * Enables recursion. + *

+ * @param bool $peg [optional] + * @return array On success, this function returns an array file listing in the format + * of: + *
+ * [0] => Array
+ * (
+ * [created_rev] => integer revision number of last edit
+ * [last_author] => string author name of last edit
+ * [size] => integer byte file size of file
+ * [time] => string date of last edit in form 'M d H:i'
+ * or 'M d Y', depending on how old the file is
+ * [time_t] => integer unix timestamp of last edit
+ * [name] => name of file/directory
+ * [type] => type, can be 'file' or 'dir'
+ * )
+ * [1] => ...
+ * 
+ * @jms-builtin + */ +function svn_ls ($repos_url, $revision_no = 'SVN_REVISION_HEAD', $recurse = false, $peg = false) {} + +/** + * (PECL svn >= 0.1.0)
+ * Returns the commit log messages of a repository URL + * @link http://php.net/manual/en/function.svn-log.php + * @param string $repos_url

+ * Repository URL of the item to retrieve log history from. + *

+ * @param int $start_revision [optional]

+ * Revision number of the first log to retrieve. Use + * SVN_REVISION_HEAD to retrieve the log from + * the most recent revision. + *

+ * @param int $end_revision [optional]

+ * Revision number of the last log to retrieve. Defaults to + * start_revision if specified or to + * SVN_REVISION_INITIAL otherwise. + *

+ * @param int $limit [optional]

+ * Number of logs to retrieve. + *

+ * @param int $flags [optional]

+ * Any combination of SVN_OMIT_MESSAGES, + * SVN_DISCOVER_CHANGED_PATHS and + * SVN_STOP_ON_COPY. + *

+ * @return array On success, this function returns an array file listing in the format + * of: + *
+ * [0] => Array, ordered most recent (highest) revision first
+ * (
+ * [rev] => integer revision number
+ * [author] => string author name
+ * [msg] => string log message
+ * [date] => string date formatted per ISO 8601, i.e. date('c')
+ * [paths] => Array, describing changed files
+ * (
+ * [0] => Array
+ * (
+ * [action] => string letter signifying change
+ * [path] => absolute repository path of changed file
+ * )
+ * [1] => ...
+ * )
+ * )
+ * [1] => ...
+ * 
+ *

+ *

+ * The output will always be a numerically indexed array of arrays, + * even when there are none or only one log message(s). + *

+ *

+ * The value of action is a subset of the + * status output + * in the first column, where possible values are: + *

+ * + * Actions + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
LetterDescription
MItem/props was modified
AItem was added
DItem was deleted
RItem was replaced
+ *

+ * If no changes were made to the item, an empty array is returned. + * @jms-builtin + */ +function svn_log ($repos_url, $start_revision = null, $end_revision = null, $limit = 0, $flags = 'SVN_DISCOVER_CHANGED_PATHS | SVN_STOP_ON_COPY') {} + +/** + * (PECL svn >= 0.1.0)
+ * Sets an authentication parameter + * @link http://php.net/manual/en/function.svn-auth-set-parameter.php + * @param string $key

+ * String key name. Use the authentication constants + * defined by this extension to specify a key. + *

+ * @param string $value

+ * String value to set to parameter at key. Format of value varies + * with the parameter. + *

+ * @return void + * @jms-builtin + */ +function svn_auth_set_parameter ($key, $value) {} + +/** + * (PECL svn >= 0.1.0)
+ * Retrieves authentication parameter + * @link http://php.net/manual/en/function.svn-auth-get-parameter.php + * @param string $key

+ * String key name. Use the authentication constants + * defined by this extension to specify a key. + *

+ * @return string the string value of the parameter at key; + * returns null if parameter does not exist. + * @jms-builtin + */ +function svn_auth_get_parameter ($key) {} + +/** + * (PECL svn >= 0.1.0)
+ * Returns the version of the SVN client libraries + * @link http://php.net/manual/en/function.svn-client-version.php + * @return string String version number, usually in form of x.y.z. + * @jms-builtin + */ +function svn_client_version () {} + +/** @jms-builtin */ +function svn_config_ensure () {} + +/** + * (PECL svn >= 0.1.0)
+ * Recursively diffs two paths + * @link http://php.net/manual/en/function.svn-diff.php + * @param string $path1

+ * First path to diff. This can be a URL to a file/directory in an SVN + * repository or a local file/directory path. + *

+ * &svn.relativepath; + * If a local file path has only backslashes and no forward slashes, + * this extension will fail to find the path. Always + * replace all backslashes with forward slashes when using this + * function. + * @param int $rev1

+ * First path's revision number. Use SVN_REVISION_HEAD + * to specify the most recent revision. + *

+ * @param string $path2

+ * Second path to diff. See path1 for description. + *

+ * @param int $rev2

+ * Second path's revision number. See rev1 + * for description. + *

+ * @return array an array-list consisting of two streams: the first is the diff output + * and the second contains error stream output. The streams can be + * read using fread. Returns false or null on + * error. + *

+ *

+ * The diff output will, by default, be in the form of Subversion's + * custom unified diff format, but an + * external + * diff engine may be + * used depending on Subversion's configuration. + * @jms-builtin + */ +function svn_diff ($path1, $rev1, $path2, $rev2) {} + +/** + * (PECL svn >= 0.1.0)
+ * Recursively cleanup a working copy directory, finishing incomplete operations and removing locks + * @link http://php.net/manual/en/function.svn-cleanup.php + * @param string $workingdir

+ * String path to local working directory to cleanup + *

+ * &svn.relativepath; + * @return bool true on success or false on failure. + * @jms-builtin + */ +function svn_cleanup ($workingdir) {} + +/** + * (PECL svn >= 0.3.0)
+ * Revert changes to the working copy + * @link http://php.net/manual/en/function.svn-revert.php + * @param string $path

+ * The path to the working repository. + *

+ * @param bool $recursive [optional]

+ * Optionally make recursive changes. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function svn_revert ($path, $recursive = false) {} + +/** @jms-builtin */ +function svn_resolved () {} + +/** + * (PECL svn >= 0.1.0)
+ * Sends changes from the local working copy to the repository + * @link http://php.net/manual/en/function.svn-commit.php + * @param string $log

+ * String log text to commit + *

+ * @param array $targets

+ * Array of local paths of files to be committed + *

+ * This parameter must be an array, a string for a single + * target is not acceptable. + * &svn.relativepath; + * @param bool $dontrecurse [optional]

+ * Boolean flag to disable recursive committing of + * directories in the targets array. + * Default is false. + *

+ * @return array array in form of: + *

+ *
+ * array(
+ * 0 => integer revision number of commit
+ * 1 => string ISO 8601 date and time of commit
+ * 2 => name of committer
+ * )
+ * 
+ *

+ * Returns false on failure. + * @jms-builtin + */ +function svn_commit ($log, array $targets, $dontrecurse = false) {} + +/** @jms-builtin */ +function svn_lock () {} + +/** @jms-builtin */ +function svn_unlock () {} + +/** + * (PECL svn >= 0.1.0)
+ * Schedules the addition of an item in a working directory + * @link http://php.net/manual/en/function.svn-add.php + * @param string $path

+ * Path of item to add. + *

+ * &svn.relativepath; + * @param bool $recursive [optional]

+ * If item is directory, whether or not to recursively add + * all of its contents. Default is true + *

+ * @param bool $force [optional]

+ * If true, Subversion will recurse into already versioned directories + * in order to add unversioned files that may be hiding in those + * directories. Default is false + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function svn_add ($path, $recursive = true, $force = false) {} + +/** + * (PECL svn >= 0.1.0)
+ * Returns the status of working copy files and directories + * @link http://php.net/manual/en/function.svn-status.php + * @param string $path

+ * Local path to file or directory to retrieve status of. + *

+ * &svn.relativepath; + * @param int $flags [optional]

+ * Any combination of SVN_NON_RECURSIVE, + * SVN_ALL (regardless of modification status), + * SVN_SHOW_UPDATES (entries will be added for items + * that are out-of-date), SVN_NO_IGNORE (disregard + * svn:ignore properties when scanning for new files) + * and SVN_IGNORE_EXTERNALS. + *

+ * @return array a numerically indexed array of associative arrays detailing + * the status of items in the repository: + *

+ *
+ * Array (
+ * [0] => Array (
+ * // information on item
+ * )
+ * [1] => ...
+ * )
+ * 
+ *

+ * The information on the item is an associative array that can contain + * the following keys: + *

+ * path + * String path to file/directory of this entry on local filesystem. + * text_status + * Status of item's text. &svn.referto.status; + * repos_text_status + * Status of item's text in repository. Only accurate if + * update was set to true. + * &svn.referto.status; + * prop_status + * Status of item's properties. &svn.referto.status; + * repos_prop_status + * Status of item's property in repository. Only accurate if + * update was set to true. &svn.referto.status; + * locked + * Whether or not the item is locked. (Only set if true.) + * copied + * Whether or not the item was copied (scheduled for addition with + * history). (Only set if true.) + * switched + * Whether or not the item was switched using the switch command. + * (Only set if true) + *

+ * These keys are only set if the item is versioned: + *

+ * name + * Base name of item in repository. + * url + * URL of item in repository. + * repos + * Base URL of repository. + * revision + * Integer revision of item in working copy. + * kind + * Type of item, i.e. file or directory. &svn.referto.type; + * schedule + * Scheduled action for item, i.e. addition or deletion. Constants + * for these magic numbers are not available, they can + * be emulated by using: + * + * if (!defined('svn_wc_schedule_normal')) { + * define('svn_wc_schedule_normal', 0); // nothing special + * define('svn_wc_schedule_add', 1); // item will be added + * define('svn_wc_schedule_delete', 2); // item will be deleted + * define('svn_wc_schedule_replace', 3); // item will be added and deleted + * } + * + * deleted + * Whether or not the item was deleted, but parent revision lags + * behind. (Only set if true.) + * absent + * Whether or not the item is absent, that is, Subversion knows that + * there should be something there but there isn't. (Only set if + * true.) + * incomplete + * Whether or not the entries file for a directory is incomplete. + * (Only set if true.) + * cmt_date + * Integer Unix timestamp of last commit date. (Unaffected by update.) + * cmt_rev + * Integer revision of last commit. (Unaffected by update.) + * cmt_author + * String author of last commit. (Unaffected by update + * @jms-builtin + */ +function svn_status ($path, $flags = 0) {} + +/** + * (PECL svn >= 0.1.0)
+ * Update working copy + * @link http://php.net/manual/en/function.svn-update.php + * @param string $path

+ * Path to local working copy. + *

+ * &svn.relativepath; + * @param int $revno [optional]

+ * Revision number to update to, default is SVN_REVISION_HEAD. + *

+ * @param bool $recurse [optional]

+ * Whether or not to recursively update directories. + *

+ * @return int new revision number on success, returns false on failure. + * @jms-builtin + */ +function svn_update ($path, $revno = 'SVN_REVISION_HEAD', $recurse = true) {} + +/** + * (PECL svn >= 0.2.0)
+ * Imports an unversioned path into a repository + * @link http://php.net/manual/en/function.svn-import.php + * @param string $path

+ * Path of file or directory to import. + *

+ * &svn.relativepath; + * @param string $url

+ * Repository URL to import into. + *

+ * @param bool $nonrecursive

+ * Whether or not to refrain from recursively processing directories. + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function svn_import ($path, $url, $nonrecursive) {} + +/** @jms-builtin */ +function svn_info () {} + +/** + * (PECL svn >= 0.3.0)
+ * Export the contents of a SVN directory + * @link http://php.net/manual/en/function.svn-export.php + * @param string $frompath

+ * The path to the current repository. + *

+ * @param string $topath

+ * The path to the new repository. + *

+ * @param bool $working_copy [optional]

+ * If true, it will export uncommitted files from the working copy. + *

+ * @param int $revision_no [optional] + * @return bool true on success or false on failure. + * @jms-builtin + */ +function svn_export ($frompath, $topath, $working_copy = true, $revision_no = -1) {} + +/** @jms-builtin */ +function svn_copy () {} + +/** @jms-builtin */ +function svn_switch () {} + +/** + * (PECL svn >= 0.3.0)
+ * Get the SVN blame for a file + * @link http://php.net/manual/en/function.svn-blame.php + * @param string $repository_url

+ * The repository URL. + *

+ * @param int $revision_no [optional]

+ * The revision number. + *

+ * @return array An array of SVN blame information separated by line + * which includes the revision number, line number, line of code, + * author, and date. + * @jms-builtin + */ +function svn_blame ($repository_url, $revision_no = 'SVN_REVISION_HEAD') {} + +/** + * (PECL svn >= 0.4.0)
+ * Delete items from a working copy or repository. + * @link http://php.net/manual/en/function.svn-delete.php + * @param string $path

+ * Path of item to delete. + *

+ * &svn.relativepath; + * @param bool $force [optional]

+ * If true, the file will be deleted even if it has local modifications. + * Otherwise, local modifications will result in a failure. Default is + * false + *

+ * @return bool true on success or false on failure. + * @jms-builtin + */ +function svn_delete ($path, $force = false) {} + +/** + * (PECL svn >= 0.4.0)
+ * Creates a directory in a working copy or repository + * @link http://php.net/manual/en/function.svn-mkdir.php + * @param string $path

+ * The path to the working copy or repository. + *

+ * @param string $log_message [optional] + * @return bool true on success or false on failure. + * @jms-builtin + */ +function svn_mkdir ($path, $log_message = null) {} + +/** @jms-builtin */ +function svn_move () {} + +/** @jms-builtin */ +function svn_proplist () {} + +/** @jms-builtin */ +function svn_propget () {} + +/** + * (PECL svn >= 0.1.0)
+ * Create a new subversion repository at path + * @link http://php.net/manual/en/function.svn-repos-create.php + * @param string $path

+ * Its description + *

+ * @param array $config [optional]

+ * Its description + *

+ * @param array $fsconfig [optional]

+ * Its description + *

+ * @return resource What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_repos_create ($path, array $config = null, array $fsconfig = null) {} + +/** + * (PECL svn >= 0.1.0)
+ * Run recovery procedures on the repository located at path. + * @link http://php.net/manual/en/function.svn-repos-recover.php + * @param string $path

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_repos_recover ($path) {} + +/** + * (PECL svn >= 0.1.0)
+ * Make a hot-copy of the repos at repospath; copy it to destpath + * @link http://php.net/manual/en/function.svn-repos-hotcopy.php + * @param string $repospath

+ * Its description + *

+ * @param string $destpath

+ * Its description + *

+ * @param bool $cleanlogs

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_repos_hotcopy ($repospath, $destpath, $cleanlogs) {} + +/** + * (PECL svn >= 0.1.0)
+ * Open a shared lock on a repository. + * @link http://php.net/manual/en/function.svn-repos-open.php + * @param string $path

+ * Its description + *

+ * @return resource What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_repos_open ($path) {} + +/** + * (PECL svn >= 0.1.0)
+ * Gets a handle on the filesystem for a repository + * @link http://php.net/manual/en/function.svn-repos-fs.php + * @param resource $repos

+ * Its description + *

+ * @return resource What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_repos_fs ($repos) {} + +/** + * (PECL svn >= 0.2.0)
+ * Create a new transaction + * @link http://php.net/manual/en/function.svn-repos-fs-begin-txn-for-commit.php + * @param resource $repos

+ * Its description + *

+ * @param int $rev

+ * Its description + *

+ * @param string $author

+ * Its description + *

+ * @param string $log_msg

+ * Its description + *

+ * @return resource What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_repos_fs_begin_txn_for_commit ($repos, $rev, $author, $log_msg) {} + +/** + * (PECL svn >= 0.2.0)
+ * Commits a transaction and returns the new revision + * @link http://php.net/manual/en/function.svn-repos-fs-commit-txn.php + * @param resource $txn

+ * Its description + *

+ * @return int What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_repos_fs_commit_txn ($txn) {} + +/** + * (PECL svn >= 0.1.0)
+ * Get a handle on a specific version of the repository root + * @link http://php.net/manual/en/function.svn-fs-revision-root.php + * @param resource $fs

+ * Its description + *

+ * @param int $revnum

+ * Its description + *

+ * @return resource What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_revision_root ($fs, $revnum) {} + +/** + * (PECL svn >= 0.1.0)
+ * Determines what kind of item lives at path in a given repository fsroot + * @link http://php.net/manual/en/function.svn-fs-check-path.php + * @param resource $fsroot

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return int What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_check_path ($fsroot, $path) {} + +/** + * (PECL svn >= 0.1.0)
+ * Fetches the value of a named property + * @link http://php.net/manual/en/function.svn-fs-revision-prop.php + * @param resource $fs

+ * Its description + *

+ * @param int $revnum

+ * Its description + *

+ * @param string $propname

+ * Its description + *

+ * @return string What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_revision_prop ($fs, $revnum, $propname) {} + +/** + * (PECL svn >= 0.1.0)
+ * Enumerates the directory entries under path; returns a hash of dir names to file type + * @link http://php.net/manual/en/function.svn-fs-dir-entries.php + * @param resource $fsroot

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return array What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_dir_entries ($fsroot, $path) {} + +/** + * (PECL svn >= 0.1.0)
+ * Returns the revision in which path under fsroot was created + * @link http://php.net/manual/en/function.svn-fs-node-created-rev.php + * @param resource $fsroot

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return int What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_node_created_rev ($fsroot, $path) {} + +/** + * (PECL svn >= 0.1.0)
+ * Returns the number of the youngest revision in the filesystem + * @link http://php.net/manual/en/function.svn-fs-youngest-rev.php + * @param resource $fs

+ * Its description + *

+ * @return int What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_youngest_rev ($fs) {} + +/** + * (PECL svn >= 0.1.0)
+ * Returns a stream to access the contents of a file from a given version of the fs + * @link http://php.net/manual/en/function.svn-fs-file-contents.php + * @param resource $fsroot

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return resource What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_file_contents ($fsroot, $path) {} + +/** + * (PECL svn >= 0.1.0)
+ * Returns the length of a file from a given version of the fs + * @link http://php.net/manual/en/function.svn-fs-file-length.php + * @param resource $fsroot

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return int What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_file_length ($fsroot, $path) {} + +/** + * (PECL svn >= 0.2.0)
+ * Creates and returns a transaction root + * @link http://php.net/manual/en/function.svn-fs-txn-root.php + * @param resource $txn

+ * Its description + *

+ * @return resource What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_txn_root ($txn) {} + +/** + * (PECL svn >= 0.2.0)
+ * Creates a new empty file, returns true if all is ok, false otherwise + * @link http://php.net/manual/en/function.svn-fs-make-file.php + * @param resource $root

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_make_file ($root, $path) {} + +/** + * (PECL svn >= 0.2.0)
+ * Creates a new empty directory, returns true if all is ok, false otherwise + * @link http://php.net/manual/en/function.svn-fs-make-dir.php + * @param resource $root

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_make_dir ($root, $path) {} + +/** + * (PECL svn >= 0.2.0)
+ * Creates and returns a stream that will be used to replace + * @link http://php.net/manual/en/function.svn-fs-apply-text.php + * @param resource $root

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return resource What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_apply_text ($root, $path) {} + +/** + * (PECL svn >= 0.2.0)
+ * Copies a file or a directory, returns true if all is ok, false otherwise + * @link http://php.net/manual/en/function.svn-fs-copy.php + * @param resource $from_root

+ * Its description + *

+ * @param string $from_path

+ * Its description + *

+ * @param resource $to_root

+ * Its description + *

+ * @param string $to_path

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_copy ($from_root, $from_path, $to_root, $to_path) {} + +/** + * (PECL svn >= 0.2.0)
+ * Deletes a file or a directory, return true if all is ok, false otherwise + * @link http://php.net/manual/en/function.svn-fs-delete.php + * @param resource $root

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_delete ($root, $path) {} + +/** + * (PECL svn >= 0.2.0)
+ * Create a new transaction + * @link http://php.net/manual/en/function.svn-fs-begin-txn2.php + * @param resource $repos

+ * Its description + *

+ * @param int $rev

+ * Its description + *

+ * @return resource What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_begin_txn2 ($repos, $rev) {} + +/** + * (PECL svn >= 0.2.0)
+ * Return true if the path points to a directory, false otherwise + * @link http://php.net/manual/en/function.svn-fs-is-dir.php + * @param resource $root

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_is_dir ($root, $path) {} + +/** + * (PECL svn >= 0.2.0)
+ * Return true if the path points to a file, false otherwise + * @link http://php.net/manual/en/function.svn-fs-is-file.php + * @param resource $root

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_is_file ($root, $path) {} + +/** + * (PECL svn >= 0.1.0)
+ * Returns the value of a property for a node + * @link http://php.net/manual/en/function.svn-fs-node-prop.php + * @param resource $fsroot

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @param string $propname

+ * Its description + *

+ * @return string What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_node_prop ($fsroot, $path, $propname) {} + +/** + * (PECL svn >= 0.2.0)
+ * Return true if everything is ok, false otherwise + * @link http://php.net/manual/en/function.svn-fs-change-node-prop.php + * @param resource $root

+ * Its description + *

+ * @param string $path

+ * Its description + *

+ * @param string $name

+ * Its description + *

+ * @param string $value

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_change_node_prop ($root, $path, $name, $value) {} + +/** + * (PECL svn >= 0.2.0)
+ * Return true if content is different, false otherwise + * @link http://php.net/manual/en/function.svn-fs-contents-changed.php + * @param resource $root1

+ * Its description + *

+ * @param string $path1

+ * Its description + *

+ * @param resource $root2

+ * Its description + *

+ * @param string $path2

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_contents_changed ($root1, $path1, $root2, $path2) {} + +/** + * (PECL svn >= 0.2.0)
+ * Return true if props are different, false otherwise + * @link http://php.net/manual/en/function.svn-fs-props-changed.php + * @param resource $root1

+ * Its description + *

+ * @param string $path1

+ * Its description + *

+ * @param resource $root2

+ * Its description + *

+ * @param string $path2

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_props_changed ($root1, $path1, $root2, $path2) {} + +/** + * (PECL svn >= 0.2.0)
+ * Abort a transaction, returns true if everything is okay, false otherwise + * @link http://php.net/manual/en/function.svn-fs-abort-txn.php + * @param resource $txn

+ * Its description + *

+ * @return bool What the function returns, first on success, then on failure. See + * also the &return.success; entity + * @jms-builtin + */ +function svn_fs_abort_txn ($txn) {} + + +/** + * Property for default username to use when performing basic authentication + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_AUTH_PARAM_DEFAULT_USERNAME', "svn:auth:username"); + +/** + * Property for default password to use when performing basic authentication + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_AUTH_PARAM_DEFAULT_PASSWORD', "svn:auth:password"); +define ('SVN_AUTH_PARAM_NON_INTERACTIVE', "svn:auth:non-interactive"); +define ('SVN_AUTH_PARAM_DONT_STORE_PASSWORDS', "svn:auth:dont-store-passwords"); +define ('SVN_AUTH_PARAM_NO_AUTH_CACHE', "svn:auth:no-auth-cache"); +define ('SVN_AUTH_PARAM_SSL_SERVER_FAILURES', "svn:auth:ssl:failures"); +define ('SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO', "svn:auth:ssl:cert-info"); +define ('SVN_AUTH_PARAM_CONFIG', "svn:auth:config-category-servers"); +define ('SVN_AUTH_PARAM_SERVER_GROUP', "svn:auth:server-group"); +define ('SVN_AUTH_PARAM_CONFIG_DIR', "svn:auth:config-dir"); + +/** + * Custom property for ignoring SSL cert verification errors + * @link http://php.net/manual/en/svn.constants.php + */ +define ('PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS', "php:svn:auth:ignore-ssl-verify-errors"); + +/** + * Configuration key that determines filesystem type + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_FS_CONFIG_FS_TYPE', "fs-type"); + +/** + * Filesystem is Berkeley-DB implementation + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_FS_TYPE_BDB', "bdb"); + +/** + * Filesystem is native-filesystem implementation + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_FS_TYPE_FSFS', "fsfs"); + +/** + * svn:date + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_PROP_REVISION_DATE', "svn:date"); + +/** + * svn:original-date + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_PROP_REVISION_ORIG_DATE', "svn:original-date"); + +/** + * svn:author + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_PROP_REVISION_AUTHOR', "svn:author"); + +/** + * svn:log + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_PROP_REVISION_LOG', "svn:log"); +define ('SVN_REVISION_INITIAL', 1); + +/** + * Magic number (-1) specifying the HEAD revision + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_REVISION_HEAD', -1); +define ('SVN_REVISION_BASE', -2); +define ('SVN_REVISION_COMMITTED', -3); +define ('SVN_REVISION_PREV', -4); +define ('SVN_REVISION_UNSPECIFIED', -5); +define ('SVN_NON_RECURSIVE', 1); +define ('SVN_DISCOVER_CHANGED_PATHS', 2); +define ('SVN_OMIT_MESSAGES', 4); +define ('SVN_STOP_ON_COPY', 8); +define ('SVN_ALL', 16); +define ('SVN_SHOW_UPDATES', 32); +define ('SVN_NO_IGNORE', 64); + +/** + * Status does not exist + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_NONE', 1); + +/** + * Item is not versioned in working copy + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_UNVERSIONED', 2); + +/** + * Item exists, nothing else is happening + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_NORMAL', 3); + +/** + * Item is scheduled for addition + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_ADDED', 4); + +/** + * Item is versioned but missing from the working copy + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_MISSING', 5); + +/** + * Item is scheduled for deletion + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_DELETED', 6); + +/** + * Item was deleted and then re-added + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_REPLACED', 7); + +/** + * Item (text or properties) was modified + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_MODIFIED', 8); + +/** + * Item's local modifications were merged with repository modifications + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_MERGED', 9); + +/** + * Item's local modifications conflicted with repository modifications + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_CONFLICTED', 10); + +/** + * Item is unversioned but configured to be ignored + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_IGNORED', 11); + +/** + * Unversioned item is in the way of a versioned resource + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_OBSTRUCTED', 12); + +/** + * Unversioned path that is populated using svn:externals + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_EXTERNAL', 13); + +/** + * Directory does not contain complete entries list + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_WC_STATUS_INCOMPLETE', 14); + +/** + * Absent + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_NODE_NONE', 0); + +/** + * File + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_NODE_FILE', 1); + +/** + * Directory + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_NODE_DIR', 2); + +/** + * Something Subversion cannot identify + * @link http://php.net/manual/en/svn.constants.php + */ +define ('SVN_NODE_UNKNOWN', 3); +define ('SVN_WC_SCHEDULE_NORMAL', 0); +define ('SVN_WC_SCHEDULE_ADD', 1); +define ('SVN_WC_SCHEDULE_DELETE', 2); +define ('SVN_WC_SCHEDULE_REPLACE', 3); + +// End of svn v.1.0.1 +?> diff --git a/res/php-5.4-core-api/sybase_ct.php b/res/php-5.4-core-api/sybase_ct.php new file mode 100644 index 0000000..be9544e --- /dev/null +++ b/res/php-5.4-core-api/sybase_ct.php @@ -0,0 +1,232 @@ + diff --git a/res/php-5.4-core-api/sysvmsg.php b/res/php-5.4-core-api/sysvmsg.php new file mode 100644 index 0000000..b7a6b84 --- /dev/null +++ b/res/php-5.4-core-api/sysvmsg.php @@ -0,0 +1,275 @@ + + * Create or attach to a message queue + * @link http://php.net/manual/en/function.msg-get-queue.php + * @param int $key

+ * Message queue numeric ID + *

+ * @param int $perms [optional]

+ * Queue permissions. Default to 0666. If the message queue already + * exists, the perms will be ignored. + *

+ * @return resource a resource handle that can be used to access the System V message queue. + * @jms-builtin + */ +function msg_get_queue ($key, $perms = 0666) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Send a message to a message queue + * @link http://php.net/manual/en/function.msg-send.php + * @param resource $queue + * @param int $msgtype + * @param mixed $message + * @param bool $serialize [optional]

+ * The optional serialize controls how the + * message is sent. serialize + * defaults to TRUE which means that the message is + * serialized using the same mechanism as the session module before being + * sent to the queue. This allows complex arrays and objects to be sent to + * other PHP scripts, or if you are using the WDDX serializer, to any WDDX + * compatible client. + *

+ * @param bool $blocking [optional]

+ * If the message is too large to fit in the queue, your script will wait + * until another process reads messages from the queue and frees enough + * space for your message to be sent. + * This is called blocking; you can prevent blocking by setting the + * optional blocking parameter to FALSE, in which + * case msg_send will immediately return FALSE if the + * message is too big for the queue, and set the optional + * errorcode to MSG_EAGAIN, + * indicating that you should try to send your message again a little + * later on. + *

+ * @param int $errorcode [optional] + * @return bool TRUE on success or FALSE on failure. + *

+ *

+ * Upon successful completion the message queue data structure is updated as + * follows: msg_lspid is set to the process-ID of the + * calling process, msg_qnum is incremented by 1 and + * msg_stime is set to the current time. + * @jms-builtin + */ +function msg_send ($queue, $msgtype, $message, $serialize = true, $blocking = true, &$errorcode = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Receive a message from a message queue + * @link http://php.net/manual/en/function.msg-receive.php + * @param resource $queue + * @param int $desiredmsgtype

+ * If desiredmsgtype is 0, the message from the front + * of the queue is returned. If desiredmsgtype is + * greater than 0, then the first message of that type is returned. + * If desiredmsgtype is less than 0, the first + * message on the queue with the lowest type less than or equal to the + * absolute value of desiredmsgtype will be read. + * If no messages match the criteria, your script will wait until a suitable + * message arrives on the queue. You can prevent the script from blocking + * by specifying MSG_IPC_NOWAIT in the + * flags parameter. + *

+ * @param int $msgtype

+ * The type of the message that was received will be stored in this + * parameter. + *

+ * @param int $maxsize

+ * The maximum size of message to be accepted is specified by the + * maxsize; if the message in the queue is larger + * than this size the function will fail (unless you set + * flags as described below). + *

+ * @param mixed $message

+ * The received message will be stored in message, + * unless there were errors receiving the message. + *

+ * @param bool $unserialize [optional]

+ * If set to + * TRUE, the message is treated as though it was serialized using the + * same mechanism as the session module. The message will be unserialized + * and then returned to your script. This allows you to easily receive + * arrays or complex object structures from other PHP scripts, or if you + * are using the WDDX serializer, from any WDDX compatible source. + *

+ *

+ * If unserialize is FALSE, the message will be + * returned as a binary-safe string. + *

+ * @param int $flags [optional]

+ * The optional flags allows you to pass flags to the + * low-level msgrcv system call. It defaults to 0, but you may specify one + * or more of the following values (by adding or ORing them together). + * + * Flag values for msg_receive + * + * + * + * + * + * + * + * + * + * + * + * + *
MSG_IPC_NOWAITIf there are no messages of the + * desiredmsgtype, return immediately and do not + * wait. The function will fail and return an integer value + * corresponding to MSG_ENOMSG. + *
MSG_EXCEPTUsing this flag in combination with a + * desiredmsgtype greater than 0 will cause the + * function to receive the first message that is not equal to + * desiredmsgtype.
MSG_NOERROR + * If the message is longer than maxsize, + * setting this flag will truncate the message to + * maxsize and will not signal an error. + *
+ *

+ * @param int $errorcode [optional]

+ * If the function fails, the optional errorcode + * will be set to the value of the system errno variable. + *

+ * @return bool TRUE on success or FALSE on failure. + *

+ *

+ * Upon successful completion the message queue data structure is updated as + * follows: msg_lrpid is set to the process-ID of the + * calling process, msg_qnum is decremented by 1 and + * msg_rtime is set to the current time. + * @jms-builtin + */ +function msg_receive ($queue, $desiredmsgtype, &$msgtype, $maxsize, &$message, $unserialize = true, $flags = 0, &$errorcode = null) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Destroy a message queue + * @link http://php.net/manual/en/function.msg-remove-queue.php + * @param resource $queue

+ * Message queue resource handle + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function msg_remove_queue ($queue) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Returns information from the message queue data structure + * @link http://php.net/manual/en/function.msg-stat-queue.php + * @param resource $queue

+ * Message queue resource handle + *

+ * @return array The return value is an array whose keys and values have the following + * meanings: + * + * Array structure for msg_stat_queue + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
msg_perm.uid + * The uid of the owner of the queue. + *
msg_perm.gid + * The gid of the owner of the queue. + *
msg_perm.mode + * The file access mode of the queue. + *
msg_stime + * The time that the last message was sent to the queue. + *
msg_rtime + * The time that the last message was received from the queue. + *
msg_ctime + * The time that the queue was last changed. + *
msg_qnum + * The number of messages waiting to be read from the queue. + *
msg_qbytes + * The maximum number of bytes allowed in one message queue. On + * Linux, this value may be read and modified via + * /proc/sys/kernel/msgmnb. + *
msg_lspid + * The pid of the process that sent the last message to the queue. + *
msg_lrpid + * The pid of the process that received the last message from the queue. + *
+ * @jms-builtin + */ +function msg_stat_queue ($queue) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Set information in the message queue data structure + * @link http://php.net/manual/en/function.msg-set-queue.php + * @param resource $queue

+ * Message queue resource handle + *

+ * @param array $data

+ * You specify the values you require by setting the value of the keys + * that you require in the data array. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function msg_set_queue ($queue, array $data) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Check whether a message queue exists + * @link http://php.net/manual/en/function.msg-queue-exists.php + * @param int $key

+ * Queue key. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function msg_queue_exists ($key) {} + +define ('MSG_IPC_NOWAIT', 1); +define ('MSG_EAGAIN', 11); +define ('MSG_ENOMSG', 42); +define ('MSG_NOERROR', 2); +define ('MSG_EXCEPT', 4); + +// End of sysvmsg v. +?> diff --git a/res/php-5.4-core-api/sysvsem.php b/res/php-5.4-core-api/sysvsem.php new file mode 100644 index 0000000..d890f23 --- /dev/null +++ b/res/php-5.4-core-api/sysvsem.php @@ -0,0 +1,69 @@ + + * Get a semaphore id + * @link http://php.net/manual/en/function.sem-get.php + * @param int $key + * @param int $max_acquire [optional]

+ * The number of processes that can acquire the semaphore simultaneously + * is set to max_acquire. + *

+ * @param int $perm [optional]

+ * The semaphore permissions. Actually this value is + * set only if the process finds it is the only process currently + * attached to the semaphore. + *

+ * @param int $auto_release [optional]

+ * Specifies if the semaphore should be automatically released on request + * shutdown. + *

+ * @return resource a positive semaphore identifier on success, or FALSE on + * error. + * @jms-builtin + */ +function sem_get ($key, $max_acquire = 1, $perm = 0666, $auto_release = 1) {} + +/** + * (PHP 4, PHP 5)
+ * Acquire a semaphore + * @link http://php.net/manual/en/function.sem-acquire.php + * @param resource $sem_identifier

+ * sem_identifier is a semaphore resource, + * obtained from sem_get. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function sem_acquire ($sem_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Release a semaphore + * @link http://php.net/manual/en/function.sem-release.php + * @param resource $sem_identifier

+ * A Semaphore resource handle as returned by + * sem_get. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function sem_release ($sem_identifier) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Remove a semaphore + * @link http://php.net/manual/en/function.sem-remove.php + * @param resource $sem_identifier

+ * A semaphore resource identifier as returned + * by sem_get. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function sem_remove ($sem_identifier) {} + +// End of sysvsem v. +?> diff --git a/res/php-5.4-core-api/sysvshm.php b/res/php-5.4-core-api/sysvshm.php new file mode 100644 index 0000000..6d585de --- /dev/null +++ b/res/php-5.4-core-api/sysvshm.php @@ -0,0 +1,120 @@ + + * Creates or open a shared memory segment + * @link http://php.net/manual/en/function.shm-attach.php + * @param int $key

+ * A numeric shared memory segment ID + *

+ * @param int $memsize [optional]

+ * The memory size. If not provided, default to the + * sysvshm.init_mem in the php.ini, otherwise 10000 + * bytes. + *

+ * @param int $perm [optional]

+ * The optional permission bits. Default to 0666. + *

+ * @return resource a shared memory segment identifier. + * @jms-builtin + */ +function shm_attach ($key, $memsize = null, $perm = 0666) {} + +/** + * (PHP 4, PHP 5)
+ * Removes shared memory from Unix systems + * @link http://php.net/manual/en/function.shm-remove.php + * @param resource $shm_identifier

+ * The shared memory identifier as returned by + * shm_attach + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function shm_remove ($shm_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Disconnects from shared memory segment + * @link http://php.net/manual/en/function.shm-detach.php + * @param resource $shm_identifier

+ * A shared memory resource handle as returned by + * shm_attach + *

+ * @return bool shm_detach always returns TRUE. + * @jms-builtin + */ +function shm_detach ($shm_identifier) {} + +/** + * (PHP 4, PHP 5)
+ * Inserts or updates a variable in shared memory + * @link http://php.net/manual/en/function.shm-put-var.php + * @param resource $shm_identifier

+ * A shared memory resource handle as returned by + * shm_attach + *

+ * @param int $variable_key

+ * The variable key. + *

+ * @param mixed $variable

+ * The variable. All variable types + * that serialize supports may be used: generally + * this means all types except for resources and some internal objects + * that cannot be serialized. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function shm_put_var ($shm_identifier, $variable_key, $variable) {} + +/** + * (PHP 5 >= 5.3.0)
+ * Check whether a specific entry exists + * @link http://php.net/manual/en/function.shm-has-var.php + * @param resource $shm_identifier

+ * Shared memory segment, obtained from shm_attach. + *

+ * @param int $variable_key

+ * The variable key. + *

+ * @return bool TRUE if the entry exists, otherwise FALSE + * @jms-builtin + */ +function shm_has_var ($shm_identifier, $variable_key) {} + +/** + * (PHP 4, PHP 5)
+ * Returns a variable from shared memory + * @link http://php.net/manual/en/function.shm-get-var.php + * @param resource $shm_identifier

+ * Shared memory segment, obtained from shm_attach. + *

+ * @param int $variable_key

+ * The variable key. + *

+ * @return mixed the variable with the given key. + * @jms-builtin + */ +function shm_get_var ($shm_identifier, $variable_key) {} + +/** + * (PHP 4, PHP 5)
+ * Removes a variable from shared memory + * @link http://php.net/manual/en/function.shm-remove-var.php + * @param resource $shm_identifier

+ * The shared memory identifier as returned by + * shm_attach + *

+ * @param int $variable_key

+ * The variable key. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function shm_remove_var ($shm_identifier, $variable_key) {} + +// End of sysvshm v. +?> diff --git a/res/php-5.4-core-api/tidy.php b/res/php-5.4-core-api/tidy.php new file mode 100644 index 0000000..2782c57 --- /dev/null +++ b/res/php-5.4-core-api/tidy.php @@ -0,0 +1,761 @@ + + * Returns the value of the specified configuration option for the tidy document + * @link http://php.net/manual/en/tidy.getopt.php + * @param string $option

+ * You will find a list with each configuration option and their types + * at: http://tidy.sourceforge.net/docs/quickref.html. + *

+ * @return mixed the value of the specified option. + * The return type depends on the type of the specified one. + */ + public function getOpt ($option) {} + + /** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Execute configured cleanup and repair operations on parsed markup + * @link http://php.net/manual/en/tidy.cleanrepair.php + * @return bool TRUE on success or FALSE on failure. + */ + public function cleanRepair () {} + + /** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Parse markup in file or URI + * @link http://php.net/manual/en/tidy.parsefile.php + * @param string $filename

+ * If the filename parameter is given, this function + * will also read that file and initialize the object with the file, + * acting like tidy_parse_file. + *

+ * @param mixed $config [optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * For an explanation about each option, see + * http://tidy.sourceforge.net/docs/quickref.html. + *

+ * @param string $encoding [optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @param bool $use_include_path [optional]

+ * Search for the file in the include_path. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function parseFile ($filename, $config = null, $encoding = null, $use_include_path = false) {} + + /** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Parse a document stored in a string + * @link http://php.net/manual/en/tidy.parsestring.php + * @param string $input

+ * The data to be parsed. + *

+ * @param mixed $config [optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * For an explanation about each option, visit http://tidy.sourceforge.net/docs/quickref.html. + *

+ * @param string $encoding [optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @return bool a new tidy instance. + */ + public function parseString ($input, $config = null, $encoding = null) {} + + /** + * (PHP 5, PECL tidy >= 0.7.0)
+ * Repair a string using an optionally provided configuration file + * @link http://php.net/manual/en/tidy.repairstring.php + * @param string $data

+ * The data to be repaired. + *

+ * @param mixed $config [optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * Check http://tidy.sourceforge.net/docs/quickref.html for + * an explanation about each option. + *

+ * @param string $encoding [optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @return string the repaired string. + */ + public function repairString ($data, $config = null, $encoding = null) {} + + /** + * (PHP 5, PECL tidy >= 0.7.0)
+ * Repair a file and return it as a string + * @link http://php.net/manual/en/tidy.repairfile.php + * @param string $filename

+ * The file to be repaired. + *

+ * @param mixed $config [optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * Check http://tidy.sourceforge.net/docs/quickref.html for an + * explanation about each option. + *

+ * @param string $encoding [optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @param bool $use_include_path [optional]

+ * Search for the file in the include_path. + *

+ * @return string the repaired contents as a string. + */ + public function repairFile ($filename, $config = null, $encoding = null, $use_include_path = false) {} + + /** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Run configured diagnostics on parsed and repaired markup + * @link http://php.net/manual/en/tidy.diagnose.php + * @return bool TRUE on success or FALSE on failure. + */ + public function diagnose () {} + + /** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Get release date (version) for Tidy library + * @link http://php.net/manual/en/tidy.getrelease.php + * @return string a string with the release date of the Tidy library. + */ + public function getRelease () {} + + /** + * (PHP 5, PECL tidy >= 0.7.0)
+ * Get current Tidy configuration + * @link http://php.net/manual/en/tidy.getconfig.php + * @return array an array of configuration options. + *

+ *

+ * For an explanation about each option, visit http://tidy.sourceforge.net/docs/quickref.html. + */ + public function getConfig () {} + + /** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Get status of specified document + * @link http://php.net/manual/en/tidy.getstatus.php + * @return int 0 if no error/warning was raised, 1 for warnings or accessibility + * errors, or 2 for errors. + */ + public function getStatus () {} + + /** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Get the Detected HTML version for the specified document + * @link http://php.net/manual/en/tidy.gethtmlver.php + * @return int the detected HTML version. + *

+ *

+ * This function is not yet implemented in the Tidylib itself, so it always + * return 0. + */ + public function getHtmlVer () {} + + /** + * (PHP 5 >= 5.1.0)
+ * Returns the documentation for the given option name + * @link http://php.net/manual/en/tidy.getoptdoc.php + * @param string $optname

+ * The option name + *

+ * @return string a string if the option exists and has documentation available, or + * FALSE otherwise. + */ + public function getOptDoc ($optname) {} + + /** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Indicates if the document is a XHTML document + * @link http://php.net/manual/en/tidy.isxhtml.php + * @return bool This function returns TRUE if the specified tidy + * object is a XHTML document, or FALSE otherwise. + *

+ *

+ * This function is not yet implemented in the Tidylib itself, so it always + * return FALSE. + */ + public function isXhtml () {} + + /** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Indicates if the document is a generic (non HTML/XHTML) XML document + * @link http://php.net/manual/en/tidy.isxml.php + * @return bool This function returns TRUE if the specified tidy + * object is a generic XML document (non HTML/XHTML), + * or FALSE otherwise. + *

+ *

+ * This function is not yet implemented in the Tidylib itself, so it always + * return FALSE. + */ + public function isXml () {} + + /** + * (PHP 5, PECL tidy 0.5.2-1.0.0)
+ * Returns a tidyNode object representing the root of the tidy parse tree + * @link http://php.net/manual/en/tidy.root.php + * @return tidyNode the tidyNode object. + */ + public function root () {} + + /** + * (PHP 5, PECL tidy 0.5.2-1.0.0)
+ * Returns a tidyNode object starting from the <head> tag of the tidy parse tree + * @link http://php.net/manual/en/tidy.head.php + * @return tidyNode the tidyNode object. + */ + public function head () {} + + /** + * (PHP 5, PECL tidy 0.5.2-1.0.0)
+ * Returns a tidyNode object starting from the <html> tag of the tidy parse tree + * @link http://php.net/manual/en/tidy.html.php + * @return tidyNode the tidyNode object. + */ + public function html () {} + + /** + * (PHP 5, PECL tidy 0.5.2-1.0)
+ * Returns a tidyNode object starting from the <body> tag of the tidy parse tree + * @link http://php.net/manual/en/tidy.body.php + * @return tidyNode the detected HTML version. + *

+ *

+ * This function is not yet implemented in the Tidylib itself, so it always + * return 0. + */ + public function body () {} + + /** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Constructs a new tidy object + * @link http://php.net/manual/en/tidy.construct.php + * @param string $filename [optional]

+ * If the filename parameter is given, this function + * will also read that file and initialize the object with the file, + * acting like tidy_parse_file. + *

+ * @param mixed $config [optional]

+ * The config config can be passed either as an + * array or as a string. If a string is passed, it is interpreted as the + * name of the configuration file, otherwise, it is interpreted as the + * options themselves. + *

+ *

+ * For an explanation about each option, visit http://tidy.sourceforge.net/docs/quickref.html. + *

+ * @param string $encoding [optional]

+ * The encoding parameter sets the encoding for + * input/output documents. The possible values for encoding are: + * ascii, latin0, latin1, + * raw, utf8, iso2022, + * mac, win1252, ibm858, + * utf16, utf16le, utf16be, + * big5, and shiftjis. + *

+ * @param bool $use_include_path [optional]

+ * Search for the file in the include_path. + *

+ */ + public function __construct ($filename = null, $config = null, $encoding = null, $use_include_path = null) {} + +} + +/** + * An HTML node in an HTML file, as detected by tidy. + * @link http://php.net/manual/en/class.tidynode.php + * @jms-builtin + */ +final class tidyNode { + + /** + * (PHP 5 >= 5.0.1)
+ * Checks if a node has children + * @link http://php.net/manual/en/tidynode.haschildren.php + * @return bool TRUE if the node has children, FALSE otherwise. + */ + public function hasChildren () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Checks if a node has siblings + * @link http://php.net/manual/en/tidynode.hassiblings.php + * @return bool TRUE if the node has siblings, FALSE otherwise. + */ + public function hasSiblings () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Checks if a node represents a comment + * @link http://php.net/manual/en/tidynode.iscomment.php + * @return bool TRUE if the node is a comment, FALSE otherwise. + */ + public function isComment () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Checks if a node is part of a HTML document + * @link http://php.net/manual/en/tidynode.ishtml.php + * @return bool TRUE if the node is part of a HTML document, FALSE otherwise. + */ + public function isHtml () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Checks if a node represents text (no markup) + * @link http://php.net/manual/en/tidynode.istext.php + * @return bool TRUE if the node represent a text, FALSE otherwise. + */ + public function isText () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Checks if this node is JSTE + * @link http://php.net/manual/en/tidynode.isjste.php + * @return bool TRUE if the node is JSTE, FALSE otherwise. + */ + public function isJste () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Checks if this node is ASP + * @link http://php.net/manual/en/tidynode.isasp.php + * @return bool TRUE if the node is ASP, FALSE otherwise. + */ + public function isAsp () {} + + /** + * (PHP 5 >= 5.0.1)
+ * Checks if a node is PHP + * @link http://php.net/manual/en/tidynode.isphp.php + * @return bool TRUE if the current node is PHP code, FALSE otherwise. + */ + public function isPhp () {} + + /** + * (PHP 5 >= 5.2.2)
+ * Returns the parent node of the current node + * @link http://php.net/manual/en/tidynode.getparent.php + * @return tidyNode a tidyNode if the node has a parent, or NULL + * otherwise. + */ + public function getParent () {} + + private function __construct () {} + +} + +/** + * @param $option + * @jms-builtin + */ +function tidy_getopt ($option) {} + +/** + * @param $input + * @param $config_options [optional] + * @param $encoding [optional] + * @jms-builtin + */ +function tidy_parse_string ($input, $config_options, $encoding) {} + +/** + * @param $file + * @param $config_options [optional] + * @param $encoding [optional] + * @param $use_include_path [optional] + * @jms-builtin + */ +function tidy_parse_file ($file, $config_options, $encoding, $use_include_path) {} + +/** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Return a string representing the parsed tidy markup + * @link http://php.net/manual/en/function.tidy-get-output.php + * @param tidy $object

+ * The Tidy object. + *

+ * @return string the parsed tidy markup. + * @jms-builtin + */ +function tidy_get_output (tidy $object) {} + +/** @jms-builtin */ +function tidy_get_error_buffer () {} + +/** @jms-builtin */ +function tidy_clean_repair () {} + +/** + * @param $data + * @param $config_file [optional] + * @param $encoding [optional] + * @jms-builtin + */ +function tidy_repair_string ($data, $config_file, $encoding) {} + +/** + * @param $filename + * @param $config_file [optional] + * @param $encoding [optional] + * @param $use_include_path [optional] + * @jms-builtin + */ +function tidy_repair_file ($filename, $config_file, $encoding, $use_include_path) {} + +/** @jms-builtin */ +function tidy_diagnose () {} + +/** @jms-builtin */ +function tidy_get_release () {} + +/** @jms-builtin */ +function tidy_get_config () {} + +/** @jms-builtin */ +function tidy_get_status () {} + +/** @jms-builtin */ +function tidy_get_html_ver () {} + +/** @jms-builtin */ +function tidy_is_xhtml () {} + +/** @jms-builtin */ +function tidy_is_xml () {} + +/** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Returns the Number of Tidy errors encountered for specified document + * @link http://php.net/manual/en/function.tidy-error-count.php + * @param tidy $object

+ * The Tidy object. + *

+ * @return int the number of errors. + * @jms-builtin + */ +function tidy_error_count (tidy $object) {} + +/** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Returns the Number of Tidy warnings encountered for specified document + * @link http://php.net/manual/en/function.tidy-warning-count.php + * @param tidy $object

+ * The Tidy object. + *

+ * @return int the number of warnings. + * @jms-builtin + */ +function tidy_warning_count (tidy $object) {} + +/** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Returns the Number of Tidy accessibility warnings encountered for specified document + * @link http://php.net/manual/en/function.tidy-access-count.php + * @param tidy $object

+ * The Tidy object. + *

+ * @return int the number of warnings. + * @jms-builtin + */ +function tidy_access_count (tidy $object) {} + +/** + * (PHP 5, PECL tidy >= 0.5.2)
+ * Returns the Number of Tidy configuration errors encountered for specified document + * @link http://php.net/manual/en/function.tidy-config-count.php + * @param tidy $object

+ * The Tidy object. + *

+ * @return int the number of errors. + * @jms-builtin + */ +function tidy_config_count (tidy $object) {} + +/** + * @param $resource + * @param $optname + * @jms-builtin + */ +function tidy_get_opt_doc ($resource, $optname) {} + +/** @jms-builtin */ +function tidy_get_root () {} + +/** @jms-builtin */ +function tidy_get_head () {} + +/** @jms-builtin */ +function tidy_get_html () {} + +/** + * @param $tidy + * @jms-builtin + */ +function tidy_get_body ($tidy) {} + + +/** + * description + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_TAG_UNKNOWN', 0); +define ('TIDY_TAG_A', 1); +define ('TIDY_TAG_ABBR', 2); +define ('TIDY_TAG_ACRONYM', 3); +define ('TIDY_TAG_ADDRESS', 4); +define ('TIDY_TAG_ALIGN', 5); +define ('TIDY_TAG_APPLET', 6); +define ('TIDY_TAG_AREA', 7); +define ('TIDY_TAG_B', 8); +define ('TIDY_TAG_BASE', 9); +define ('TIDY_TAG_BASEFONT', 10); +define ('TIDY_TAG_BDO', 11); +define ('TIDY_TAG_BGSOUND', 12); +define ('TIDY_TAG_BIG', 13); +define ('TIDY_TAG_BLINK', 14); +define ('TIDY_TAG_BLOCKQUOTE', 15); +define ('TIDY_TAG_BODY', 16); +define ('TIDY_TAG_BR', 17); +define ('TIDY_TAG_BUTTON', 18); +define ('TIDY_TAG_CAPTION', 19); +define ('TIDY_TAG_CENTER', 20); +define ('TIDY_TAG_CITE', 21); +define ('TIDY_TAG_CODE', 22); +define ('TIDY_TAG_COL', 23); +define ('TIDY_TAG_COLGROUP', 24); +define ('TIDY_TAG_COMMENT', 25); +define ('TIDY_TAG_DD', 26); +define ('TIDY_TAG_DEL', 27); +define ('TIDY_TAG_DFN', 28); +define ('TIDY_TAG_DIR', 29); +define ('TIDY_TAG_DIV', 30); +define ('TIDY_TAG_DL', 31); +define ('TIDY_TAG_DT', 32); +define ('TIDY_TAG_EM', 33); +define ('TIDY_TAG_EMBED', 34); +define ('TIDY_TAG_FIELDSET', 35); +define ('TIDY_TAG_FONT', 36); +define ('TIDY_TAG_FORM', 37); +define ('TIDY_TAG_FRAME', 38); +define ('TIDY_TAG_FRAMESET', 39); +define ('TIDY_TAG_H1', 40); +define ('TIDY_TAG_H2', 41); +define ('TIDY_TAG_H3', 42); +define ('TIDY_TAG_H4', 43); +define ('TIDY_TAG_H5', 44); +define ('TIDY_TAG_H6', 45); +define ('TIDY_TAG_HEAD', 46); +define ('TIDY_TAG_HR', 47); +define ('TIDY_TAG_HTML', 48); +define ('TIDY_TAG_I', 49); +define ('TIDY_TAG_IFRAME', 50); +define ('TIDY_TAG_ILAYER', 51); +define ('TIDY_TAG_IMG', 52); +define ('TIDY_TAG_INPUT', 53); +define ('TIDY_TAG_INS', 54); +define ('TIDY_TAG_ISINDEX', 55); +define ('TIDY_TAG_KBD', 56); +define ('TIDY_TAG_KEYGEN', 57); +define ('TIDY_TAG_LABEL', 58); +define ('TIDY_TAG_LAYER', 59); +define ('TIDY_TAG_LEGEND', 60); +define ('TIDY_TAG_LI', 61); +define ('TIDY_TAG_LINK', 62); +define ('TIDY_TAG_LISTING', 63); +define ('TIDY_TAG_MAP', 64); +define ('TIDY_TAG_MARQUEE', 65); +define ('TIDY_TAG_MENU', 66); +define ('TIDY_TAG_META', 67); +define ('TIDY_TAG_MULTICOL', 68); +define ('TIDY_TAG_NOBR', 69); +define ('TIDY_TAG_NOEMBED', 70); +define ('TIDY_TAG_NOFRAMES', 71); +define ('TIDY_TAG_NOLAYER', 72); +define ('TIDY_TAG_NOSAVE', 73); +define ('TIDY_TAG_NOSCRIPT', 74); +define ('TIDY_TAG_OBJECT', 75); +define ('TIDY_TAG_OL', 76); +define ('TIDY_TAG_OPTGROUP', 77); +define ('TIDY_TAG_OPTION', 78); +define ('TIDY_TAG_P', 79); +define ('TIDY_TAG_PARAM', 80); +define ('TIDY_TAG_PLAINTEXT', 81); +define ('TIDY_TAG_PRE', 82); +define ('TIDY_TAG_Q', 83); +define ('TIDY_TAG_RB', 84); +define ('TIDY_TAG_RBC', 85); +define ('TIDY_TAG_RP', 86); +define ('TIDY_TAG_RT', 87); +define ('TIDY_TAG_RTC', 88); +define ('TIDY_TAG_RUBY', 89); +define ('TIDY_TAG_S', 90); +define ('TIDY_TAG_SAMP', 91); +define ('TIDY_TAG_SCRIPT', 92); +define ('TIDY_TAG_SELECT', 93); +define ('TIDY_TAG_SERVER', 94); +define ('TIDY_TAG_SERVLET', 95); +define ('TIDY_TAG_SMALL', 96); +define ('TIDY_TAG_SPACER', 97); +define ('TIDY_TAG_SPAN', 98); +define ('TIDY_TAG_STRIKE', 99); +define ('TIDY_TAG_STRONG', 100); +define ('TIDY_TAG_STYLE', 101); +define ('TIDY_TAG_SUB', 102); +define ('TIDY_TAG_SUP', 103); +define ('TIDY_TAG_TABLE', 104); +define ('TIDY_TAG_TBODY', 105); +define ('TIDY_TAG_TD', 106); +define ('TIDY_TAG_TEXTAREA', 107); +define ('TIDY_TAG_TFOOT', 108); +define ('TIDY_TAG_TH', 109); +define ('TIDY_TAG_THEAD', 110); +define ('TIDY_TAG_TITLE', 111); +define ('TIDY_TAG_TR', 112); +define ('TIDY_TAG_TT', 113); +define ('TIDY_TAG_U', 114); +define ('TIDY_TAG_UL', 115); +define ('TIDY_TAG_VAR', 116); +define ('TIDY_TAG_WBR', 117); +define ('TIDY_TAG_XMP', 118); + +/** + * root node + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_ROOT', 0); + +/** + * doctype + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_DOCTYPE', 1); + +/** + * HTML comment + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_COMMENT', 2); + +/** + * Processing Instruction + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_PROCINS', 3); + +/** + * Text + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_TEXT', 4); + +/** + * start tag + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_START', 5); + +/** + * end tag + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_END', 6); + +/** + * empty tag + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_STARTEND', 7); + +/** + * CDATA + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_CDATA', 8); + +/** + * XML section + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_SECTION', 9); + +/** + * ASP code + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_ASP', 10); + +/** + * JSTE code + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_JSTE', 11); + +/** + * PHP code + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_PHP', 12); + +/** + * XML declaration + * @link http://php.net/manual/en/tidy.constants.php + */ +define ('TIDY_NODETYPE_XMLDECL', 13); + +// End of tidy v.2.0 +?> diff --git a/res/php-5.4-core-api/tokenizer.php b/res/php-5.4-core-api/tokenizer.php new file mode 100644 index 0000000..55ec739 --- /dev/null +++ b/res/php-5.4-core-api/tokenizer.php @@ -0,0 +1,163 @@ + + * Split given source into PHP tokens + * @link http://php.net/manual/en/function.token-get-all.php + * @param string $source

+ * The PHP source to parse. + *

+ * @return array An array of token identifiers. Each individual token identifier is either + * a single character (i.e.: ;, ., + * >, !, etc...), + * or a three element array containing the token index in element 0, the string + * content of the original token in element 1 and the line number in element 2. + * @jms-builtin + */ +function token_get_all ($source) {} + +/** + * (PHP 4 >= 4.2.0, PHP 5)
+ * Get the symbolic name of a given PHP token + * @link http://php.net/manual/en/function.token-name.php + * @param int $token

+ * The token value. + *

+ * @return string The symbolic name of the given token. + * @jms-builtin + */ +function token_name ($token) {} + +define ('T_REQUIRE_ONCE', 258); +define ('T_REQUIRE', 259); +define ('T_EVAL', 260); +define ('T_INCLUDE_ONCE', 261); +define ('T_INCLUDE', 262); +define ('T_LOGICAL_OR', 263); +define ('T_LOGICAL_XOR', 264); +define ('T_LOGICAL_AND', 265); +define ('T_PRINT', 266); +define ('T_SR_EQUAL', 267); +define ('T_SL_EQUAL', 268); +define ('T_XOR_EQUAL', 269); +define ('T_OR_EQUAL', 270); +define ('T_AND_EQUAL', 271); +define ('T_MOD_EQUAL', 272); +define ('T_CONCAT_EQUAL', 273); +define ('T_DIV_EQUAL', 274); +define ('T_MUL_EQUAL', 275); +define ('T_MINUS_EQUAL', 276); +define ('T_PLUS_EQUAL', 277); +define ('T_BOOLEAN_OR', 278); +define ('T_BOOLEAN_AND', 279); +define ('T_IS_NOT_IDENTICAL', 280); +define ('T_IS_IDENTICAL', 281); +define ('T_IS_NOT_EQUAL', 282); +define ('T_IS_EQUAL', 283); +define ('T_IS_GREATER_OR_EQUAL', 284); +define ('T_IS_SMALLER_OR_EQUAL', 285); +define ('T_SR', 286); +define ('T_SL', 287); +define ('T_INSTANCEOF', 288); +define ('T_UNSET_CAST', 289); +define ('T_BOOL_CAST', 290); +define ('T_OBJECT_CAST', 291); +define ('T_ARRAY_CAST', 292); +define ('T_STRING_CAST', 293); +define ('T_DOUBLE_CAST', 294); +define ('T_INT_CAST', 295); +define ('T_DEC', 296); +define ('T_INC', 297); +define ('T_CLONE', 298); +define ('T_NEW', 299); +define ('T_EXIT', 300); +define ('T_IF', 301); +define ('T_ELSEIF', 302); +define ('T_ELSE', 303); +define ('T_ENDIF', 304); +define ('T_LNUMBER', 305); +define ('T_DNUMBER', 306); +define ('T_STRING', 307); +define ('T_STRING_VARNAME', 308); +define ('T_VARIABLE', 309); +define ('T_NUM_STRING', 310); +define ('T_INLINE_HTML', 311); +define ('T_CHARACTER', 312); +define ('T_BAD_CHARACTER', 313); +define ('T_ENCAPSED_AND_WHITESPACE', 314); +define ('T_CONSTANT_ENCAPSED_STRING', 315); +define ('T_ECHO', 316); +define ('T_DO', 317); +define ('T_WHILE', 318); +define ('T_ENDWHILE', 319); +define ('T_FOR', 320); +define ('T_ENDFOR', 321); +define ('T_FOREACH', 322); +define ('T_ENDFOREACH', 323); +define ('T_DECLARE', 324); +define ('T_ENDDECLARE', 325); +define ('T_AS', 326); +define ('T_SWITCH', 327); +define ('T_ENDSWITCH', 328); +define ('T_CASE', 329); +define ('T_DEFAULT', 330); +define ('T_BREAK', 331); +define ('T_CONTINUE', 332); +define ('T_GOTO', 333); +define ('T_FUNCTION', 334); +define ('T_CONST', 335); +define ('T_RETURN', 336); +define ('T_TRY', 337); +define ('T_CATCH', 338); +define ('T_THROW', 339); +define ('T_USE', 340); +define ('T_INSTEADOF', 341); +define ('T_GLOBAL', 342); +define ('T_PUBLIC', 343); +define ('T_PROTECTED', 344); +define ('T_PRIVATE', 345); +define ('T_FINAL', 346); +define ('T_ABSTRACT', 347); +define ('T_STATIC', 348); +define ('T_VAR', 349); +define ('T_UNSET', 350); +define ('T_ISSET', 351); +define ('T_EMPTY', 352); +define ('T_HALT_COMPILER', 353); +define ('T_CLASS', 354); +define ('T_TRAIT', 355); +define ('T_INTERFACE', 356); +define ('T_EXTENDS', 357); +define ('T_IMPLEMENTS', 358); +define ('T_OBJECT_OPERATOR', 359); +define ('T_DOUBLE_ARROW', 360); +define ('T_LIST', 361); +define ('T_ARRAY', 362); +define ('T_CALLABLE', 363); +define ('T_CLASS_C', 364); +define ('T_TRAIT_C', 365); +define ('T_METHOD_C', 366); +define ('T_FUNC_C', 367); +define ('T_LINE', 368); +define ('T_FILE', 369); +define ('T_COMMENT', 370); +define ('T_DOC_COMMENT', 371); +define ('T_OPEN_TAG', 372); +define ('T_OPEN_TAG_WITH_ECHO', 373); +define ('T_CLOSE_TAG', 374); +define ('T_WHITESPACE', 375); +define ('T_START_HEREDOC', 376); +define ('T_END_HEREDOC', 377); +define ('T_DOLLAR_OPEN_CURLY_BRACES', 378); +define ('T_CURLY_OPEN', 379); +define ('T_PAAMAYIM_NEKUDOTAYIM', 380); +define ('T_NAMESPACE', 381); +define ('T_NS_C', 382); +define ('T_DIR', 383); +define ('T_NS_SEPARATOR', 384); +define ('T_DOUBLE_COLON', 380); + +// End of tokenizer v.0.1 +?> diff --git a/res/php-5.4-core-api/wddx.php b/res/php-5.4-core-api/wddx.php new file mode 100644 index 0000000..dd386e0 --- /dev/null +++ b/res/php-5.4-core-api/wddx.php @@ -0,0 +1,89 @@ + + * Serialize a single value into a WDDX packet + * @link http://php.net/manual/en/function.wddx-serialize-value.php + * @param mixed $var

+ * The value to be serialized + *

+ * @param string $comment [optional]

+ * An optional comment string that appears in the packet header. + *

+ * @return string the WDDX packet, or FALSE on error. + * @jms-builtin + */ +function wddx_serialize_value ($var, $comment = null) {} + +/** + * (PHP 4, PHP 5)
+ * Serialize variables into a WDDX packet + * @link http://php.net/manual/en/function.wddx-serialize-vars.php + * @param mixed $var_name

+ * Can be either a string naming a variable or an array containing + * strings naming the variables or another array, etc. + *

+ * @param mixed $_ [optional] + * @return string the WDDX packet, or FALSE on error. + * @jms-builtin + */ +function wddx_serialize_vars ($var_name, $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Starts a new WDDX packet with structure inside it + * @link http://php.net/manual/en/function.wddx-packet-start.php + * @param string $comment [optional]

+ * An optional comment string. + *

+ * @return resource a packet ID for use in later functions, or FALSE on error. + * @jms-builtin + */ +function wddx_packet_start ($comment = null) {} + +/** + * (PHP 4, PHP 5)
+ * Ends a WDDX packet with the specified ID + * @link http://php.net/manual/en/function.wddx-packet-end.php + * @param resource $packet_id

+ * A WDDX packet, returned by wddx_packet_start. + *

+ * @return string the string containing the WDDX packet. + * @jms-builtin + */ +function wddx_packet_end ($packet_id) {} + +/** + * (PHP 4, PHP 5)
+ * Add variables to a WDDX packet with the specified ID + * @link http://php.net/manual/en/function.wddx-add-vars.php + * @param resource $packet_id

+ * A WDDX packet, returned by wddx_packet_start. + *

+ * @param mixed $var_name

+ * Can be either a string naming a variable or an array containing + * strings naming the variables or another array, etc. + *

+ * @param mixed $_ [optional] + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function wddx_add_vars ($packet_id, $var_name, $_ = null) {} + +/** + * (PHP 4, PHP 5)
+ * Unserializes a WDDX packet + * @link http://php.net/manual/en/function.wddx-deserialize.php + * @param string $packet

+ * A WDDX packet, as a string or stream. + *

+ * @return mixed the deserialized value which can be a string, a number or an + * array. Note that structures are deserialized into associative arrays. + * @jms-builtin + */ +function wddx_deserialize ($packet) {} + +// End of wddx v. +?> diff --git a/res/php-5.4-core-api/xdebug.php b/res/php-5.4-core-api/xdebug.php new file mode 100644 index 0000000..d4883c1 --- /dev/null +++ b/res/php-5.4-core-api/xdebug.php @@ -0,0 +1,114 @@ + diff --git a/res/php-5.4-core-api/xml.php b/res/php-5.4-core-api/xml.php new file mode 100644 index 0000000..593cc9f --- /dev/null +++ b/res/php-5.4-core-api/xml.php @@ -0,0 +1,612 @@ + + * Create an XML parser + * @link http://php.net/manual/en/function.xml-parser-create.php + * @param string $encoding [optional]

+ * The optional encoding specifies the character + * encoding for the input/output in PHP 4. Starting from PHP 5, the input + * encoding is automatically detected, so that the + * encoding parameter specifies only the output + * encoding. In PHP 4, the default output encoding is the same as the + * input charset. If empty string is passed, the parser attempts to identify + * which encoding the document is encoded in by looking at the heading 3 or + * 4 bytes. In PHP 5.0.0 and 5.0.1, the default output charset is + * ISO-8859-1, while in PHP 5.0.2 and upper is UTF-8. The supported + * encodings are ISO-8859-1, UTF-8 and + * US-ASCII. + *

+ * @return resource a resource handle for the new XML parser. + * @jms-builtin + */ +function xml_parser_create ($encoding = null) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Create an XML parser with namespace support + * @link http://php.net/manual/en/function.xml-parser-create-ns.php + * @param string $encoding [optional]

+ * The optional encoding specifies the character + * encoding for the input/output in PHP 4. Starting from PHP 5, the input + * encoding is automatically detected, so that the + * encoding parameter specifies only the output + * encoding. In PHP 4, the default output encoding is the same as the + * input charset. In PHP 5.0.0 and 5.0.1, the default output charset is + * ISO-8859-1, while in PHP 5.0.2 and upper is UTF-8. The supported + * encodings are ISO-8859-1, UTF-8 and + * US-ASCII. + *

+ * @param string $separator [optional]

+ * With a namespace aware parser tag parameters passed to the various + * handler functions will consist of namespace and tag name separated by + * the string specified in seperator. + *

+ * @return resource a resource handle for the new XML parser. + * @jms-builtin + */ +function xml_parser_create_ns ($encoding = null, $separator = ':') {} + +/** + * (PHP 4, PHP 5)
+ * Use XML Parser within an object + * @link http://php.net/manual/en/function.xml-set-object.php + * @param resource $parser

+ * A reference to the XML parser to use inside the object. + *

+ * @param object $object

+ * The object where to use the XML parser. + *

+ * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function xml_set_object ($parser, &$object) {} + +/** + * (PHP 4, PHP 5)
+ * Set up start and end element handlers + * @link http://php.net/manual/en/function.xml-set-element-handler.php + * @param resource $parser

+ * A reference to the XML parser to set up start and end element handler functions. + *

+ * @param callable $start_element_handler

+ * The function named by start_element_handler + * must accept three parameters: + * start_element_handler + * resourceparser + * stringname + * arrayattribs + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @param callable $end_element_handler

+ * The function named by end_element_handler + * must accept two parameters: + * end_element_handler + * resourceparser + * stringname + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function xml_set_element_handler ($parser, callable $start_element_handler, callable $end_element_handler) {} + +/** + * (PHP 4, PHP 5)
+ * Set up character data handler + * @link http://php.net/manual/en/function.xml-set-character-data-handler.php + * @param resource $parser

+ * A reference to the XML parser to set up character data handler function. + *

+ * @param callable $handler

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * two parameters: + * handler + * resourceparser + * stringdata + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function xml_set_character_data_handler ($parser, callable $handler) {} + +/** + * (PHP 4, PHP 5)
+ * Set up processing instruction (PI) handler + * @link http://php.net/manual/en/function.xml-set-processing-instruction-handler.php + * @param resource $parser

+ * A reference to the XML parser to set up processing instruction (PI) handler function. + *

+ * @param callable $handler

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * three parameters: + * handler + * resourceparser + * stringtarget + * stringdata + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function xml_set_processing_instruction_handler ($parser, callable $handler) {} + +/** + * (PHP 4, PHP 5)
+ * Set up default handler + * @link http://php.net/manual/en/function.xml-set-default-handler.php + * @param resource $parser

+ * A reference to the XML parser to set up default handler function. + *

+ * @param callable $handler

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * two parameters: + * handler + * resourceparser + * stringdata + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function xml_set_default_handler ($parser, callable $handler) {} + +/** + * (PHP 4, PHP 5)
+ * Set up unparsed entity declaration handler + * @link http://php.net/manual/en/function.xml-set-unparsed-entity-decl-handler.php + * @param resource $parser

+ * A reference to the XML parser to set up unparsed entity declaration handler function. + *

+ * @param callable $handler

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept six + * parameters: + * handler + * resourceparser + * stringentity_name + * stringbase + * stringsystem_id + * stringpublic_id + * stringnotation_name + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the + * handler. + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function xml_set_unparsed_entity_decl_handler ($parser, callable $handler) {} + +/** + * (PHP 4, PHP 5)
+ * Set up notation declaration handler + * @link http://php.net/manual/en/function.xml-set-notation-decl-handler.php + * @param resource $parser

+ * A reference to the XML parser to set up notation declaration handler function. + *

+ * @param callable $handler

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * five parameters: + * handler + * resourceparser + * stringnotation_name + * stringbase + * stringsystem_id + * stringpublic_id + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function xml_set_notation_decl_handler ($parser, callable $handler) {} + +/** + * (PHP 4, PHP 5)
+ * Set up external entity reference handler + * @link http://php.net/manual/en/function.xml-set-external-entity-ref-handler.php + * @param resource $parser

+ * A reference to the XML parser to set up external entity reference handler function. + *

+ * @param callable $handler

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * five parameters, and should return an integer value.If the + * value returned from the handler is FALSE (which it will be if no + * value is returned), the XML parser will stop parsing and + * xml_get_error_code will return + * XML_ERROR_EXTERNAL_ENTITY_HANDLING. + * handler + * resourceparser + * stringopen_entity_names + * stringbase + * stringsystem_id + * stringpublic_id + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function xml_set_external_entity_ref_handler ($parser, callable $handler) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Set up start namespace declaration handler + * @link http://php.net/manual/en/function.xml-set-start-namespace-decl-handler.php + * @param resource $parser

+ * A reference to the XML parser. + *

+ * @param callable $handler

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * three parameters, and should return an integer value. If the + * value returned from the handler is FALSE (which it will be if no + * value is returned), the XML parser will stop parsing and + * xml_get_error_code will return + * XML_ERROR_EXTERNAL_ENTITY_HANDLING. + * handler + * resourceparser + * stringprefix + * stringuri + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function xml_set_start_namespace_decl_handler ($parser, callable $handler) {} + +/** + * (PHP 4 >= 4.0.5, PHP 5)
+ * Set up end namespace declaration handler + * @link http://php.net/manual/en/function.xml-set-end-namespace-decl-handler.php + * @param resource $parser

+ * A reference to the XML parser. + *

+ * @param callable $handler

+ * handler is a string containing the name of a + * function that must exist when xml_parse is called + * for parser. + *

+ *

+ * The function named by handler must accept + * two parameters, and should return an integer value. If the + * value returned from the handler is FALSE (which it will be if no + * value is returned), the XML parser will stop parsing and + * xml_get_error_code will return + * XML_ERROR_EXTERNAL_ENTITY_HANDLING. + * handler + * resourceparser + * stringprefix + * parser + * The first parameter, parser, is a + * reference to the XML parser calling the handler. + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function xml_set_end_namespace_decl_handler ($parser, callable $handler) {} + +/** + * (PHP 4, PHP 5)
+ * Start parsing an XML document + * @link http://php.net/manual/en/function.xml-parse.php + * @param resource $parser

+ * A reference to the XML parser to use. + *

+ * @param string $data

+ * Chunk of data to parse. A document may be parsed piece-wise by + * calling xml_parse several times with new data, + * as long as the is_final parameter is set and + * TRUE when the last data is parsed. + *

+ * @param bool $is_final [optional]

+ * If set and TRUE, data is the last piece of + * data sent in this parse. + *

+ * @return int 1 on success or 0 on failure. + *

+ *

+ * For unsuccessful parses, error information can be retrieved with + * xml_get_error_code, + * xml_error_string, + * xml_get_current_line_number, + * xml_get_current_column_number and + * xml_get_current_byte_index. + *

+ *

+ * Entity errors are reported at the end of the data thus only if + * is_final is set and TRUE. + * @jms-builtin + */ +function xml_parse ($parser, $data, $is_final = false) {} + +/** + * (PHP 4, PHP 5)
+ * Parse XML data into an array structure + * @link http://php.net/manual/en/function.xml-parse-into-struct.php + * @param resource $parser

+ * A reference to the XML parser. + *

+ * @param string $data

+ * A string containing the XML data. + *

+ * @param array $values

+ * An array containing the values of the XML data + *

+ * @param array $index [optional]

+ * An array containing pointers to the location of the appropriate values in the $values. + *

+ * @return int xml_parse_into_struct returns 0 for failure and 1 for + * success. This is not the same as FALSE and TRUE, be careful with + * operators such as ===. + * @jms-builtin + */ +function xml_parse_into_struct ($parser, $data, array &$values, array &$index = null) {} + +/** + * (PHP 4, PHP 5)
+ * Get XML parser error code + * @link http://php.net/manual/en/function.xml-get-error-code.php + * @param resource $parser

+ * A reference to the XML parser to get error code from. + *

+ * @return int This function returns FALSE if parser does + * not refer to a valid parser, or else it returns one of the error + * codes listed in the error codes + * section. + * @jms-builtin + */ +function xml_get_error_code ($parser) {} + +/** + * (PHP 4, PHP 5)
+ * Get XML parser error string + * @link http://php.net/manual/en/function.xml-error-string.php + * @param int $code

+ * An error code from xml_get_error_code. + *

+ * @return string a string with a textual description of the error + * code, or FALSE if no description was found. + * @jms-builtin + */ +function xml_error_string ($code) {} + +/** + * (PHP 4, PHP 5)
+ * Get current line number for an XML parser + * @link http://php.net/manual/en/function.xml-get-current-line-number.php + * @param resource $parser

+ * A reference to the XML parser to get line number from. + *

+ * @return int This function returns FALSE if parser does + * not refer to a valid parser, or else it returns which line the + * parser is currently at in its data buffer. + * @jms-builtin + */ +function xml_get_current_line_number ($parser) {} + +/** + * (PHP 4, PHP 5)
+ * Get current column number for an XML parser + * @link http://php.net/manual/en/function.xml-get-current-column-number.php + * @param resource $parser

+ * A reference to the XML parser to get column number from. + *

+ * @return int This function returns FALSE if parser does + * not refer to a valid parser, or else it returns which column on + * the current line (as given by + * xml_get_current_line_number) the parser is + * currently at. + * @jms-builtin + */ +function xml_get_current_column_number ($parser) {} + +/** + * (PHP 4, PHP 5)
+ * Get current byte index for an XML parser + * @link http://php.net/manual/en/function.xml-get-current-byte-index.php + * @param resource $parser

+ * A reference to the XML parser to get byte index from. + *

+ * @return int This function returns FALSE if parser does + * not refer to a valid parser, or else it returns which byte index + * the parser is currently at in its data buffer (starting at 0). + * @jms-builtin + */ +function xml_get_current_byte_index ($parser) {} + +/** + * (PHP 4, PHP 5)
+ * Free an XML parser + * @link http://php.net/manual/en/function.xml-parser-free.php + * @param resource $parser A reference to the XML parser to free. + * @return bool This function returns FALSE if parser does not + * refer to a valid parser, or else it frees the parser and returns TRUE. + * @jms-builtin + */ +function xml_parser_free ($parser) {} + +/** + * (PHP 4, PHP 5)
+ * Set options in an XML parser + * @link http://php.net/manual/en/function.xml-parser-set-option.php + * @param resource $parser

+ * A reference to the XML parser to set an option in. + *

+ * @param int $option

+ * Which option to set. See below. + *

+ *

+ * The following options are available: + * + * XML parser options + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Option constantData typeDescription
XML_OPTION_CASE_FOLDINGinteger + * Controls whether case-folding is enabled for this + * XML parser. Enabled by default. + *
XML_OPTION_SKIP_TAGSTARTinteger + * Specify how many characters should be skipped in the beginning of a + * tag name. + *
XML_OPTION_SKIP_WHITEinteger + * Whether to skip values consisting of whitespace characters. + *
XML_OPTION_TARGET_ENCODINGstring + * Sets which target encoding to + * use in this XML parser.By default, it is set to the same as the + * source encoding used by xml_parser_create. + * Supported target encodings are ISO-8859-1, + * US-ASCII and UTF-8. + *
+ *

+ * @param mixed $value

+ * The option's new value. + *

+ * @return bool This function returns FALSE if parser does not + * refer to a valid parser, or if the option could not be set. Else the + * option is set and TRUE is returned. + * @jms-builtin + */ +function xml_parser_set_option ($parser, $option, $value) {} + +/** + * (PHP 4, PHP 5)
+ * Get options from an XML parser + * @link http://php.net/manual/en/function.xml-parser-get-option.php + * @param resource $parser A reference to the XML parser to get an option from. + * @param int $option Which option to fetch. XML_OPTION_CASE_FOLDING + * and XML_OPTION_TARGET_ENCODING are available. + * See xml_parser_set_option for their description. + * @return mixed This function returns FALSE if parser does + * not refer to a valid parser or if option isn't + * valid (generates also a E_WARNING). + * Else the option's value is returned. + * @jms-builtin + */ +function xml_parser_get_option ($parser, $option) {} + +/** + * (PHP 4, PHP 5)
+ * Encodes an ISO-8859-1 string to UTF-8 + * @link http://php.net/manual/en/function.utf8-encode.php + * @param string $data

+ * An ISO-8859-1 string. + *

+ * @return string the UTF-8 translation of data. + * @jms-builtin + */ +function utf8_encode ($data) {} + +/** + * (PHP 4, PHP 5)
+ * Converts a string with ISO-8859-1 characters encoded with UTF-8 +to single-byte ISO-8859-1 + * @link http://php.net/manual/en/function.utf8-decode.php + * @param string $data

+ * An UTF-8 encoded string. + *

+ * @return string the ISO-8859-1 translation of data. + * @jms-builtin + */ +function utf8_decode ($data) {} + +define ('XML_ERROR_NONE', 0); +define ('XML_ERROR_NO_MEMORY', 1); +define ('XML_ERROR_SYNTAX', 2); +define ('XML_ERROR_NO_ELEMENTS', 3); +define ('XML_ERROR_INVALID_TOKEN', 4); +define ('XML_ERROR_UNCLOSED_TOKEN', 5); +define ('XML_ERROR_PARTIAL_CHAR', 6); +define ('XML_ERROR_TAG_MISMATCH', 7); +define ('XML_ERROR_DUPLICATE_ATTRIBUTE', 8); +define ('XML_ERROR_JUNK_AFTER_DOC_ELEMENT', 9); +define ('XML_ERROR_PARAM_ENTITY_REF', 10); +define ('XML_ERROR_UNDEFINED_ENTITY', 11); +define ('XML_ERROR_RECURSIVE_ENTITY_REF', 12); +define ('XML_ERROR_ASYNC_ENTITY', 13); +define ('XML_ERROR_BAD_CHAR_REF', 14); +define ('XML_ERROR_BINARY_ENTITY_REF', 15); +define ('XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF', 16); +define ('XML_ERROR_MISPLACED_XML_PI', 17); +define ('XML_ERROR_UNKNOWN_ENCODING', 18); +define ('XML_ERROR_INCORRECT_ENCODING', 19); +define ('XML_ERROR_UNCLOSED_CDATA_SECTION', 20); +define ('XML_ERROR_EXTERNAL_ENTITY_HANDLING', 21); +define ('XML_OPTION_CASE_FOLDING', 1); +define ('XML_OPTION_TARGET_ENCODING', 2); +define ('XML_OPTION_SKIP_TAGSTART', 3); +define ('XML_OPTION_SKIP_WHITE', 4); + +/** + * Holds the SAX implementation method. + * Can be libxml or expat. + * @link http://php.net/manual/en/xml.constants.php + */ +define ('XML_SAX_IMPL', "libxml"); + +// End of xml v. +?> diff --git a/res/php-5.4-core-api/xmlreader.php b/res/php-5.4-core-api/xmlreader.php new file mode 100644 index 0000000..2eb4f48 --- /dev/null +++ b/res/php-5.4-core-api/xmlreader.php @@ -0,0 +1,319 @@ + + * Close the XMLReader input + * @link http://php.net/manual/en/xmlreader.close.php + * @return bool TRUE on success or FALSE on failure. + */ + public function close () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Get the value of a named attribute + * @link http://php.net/manual/en/xmlreader.getattribute.php + * @param string $name

+ * The name of the attribute. + *

+ * @return string The value of the attribute, or NULL if no attribute with the given + * name is found or not positioned on an element node. + */ + public function getAttribute ($name) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Get the value of an attribute by index + * @link http://php.net/manual/en/xmlreader.getattributeno.php + * @param int $index

+ * The position of the attribute. + *

+ * @return string The value of the attribute, or an empty string if no attribute exists + * at index or not positioned of element. + */ + public function getAttributeNo ($index) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Get the value of an attribute by localname and URI + * @link http://php.net/manual/en/xmlreader.getattributens.php + * @param string $localName

+ * The local name. + *

+ * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return string The value of the attribute, or an empty string if no attribute with the + * given localName and + * namespaceURI is found or not positioned of element. + */ + public function getAttributeNs ($localName, $namespaceURI) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Indicates if specified property has been set + * @link http://php.net/manual/en/xmlreader.getparserproperty.php + * @param int $property

+ * One of the parser option + * constants. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function getParserProperty ($property) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Indicates if the parsed document is valid + * @link http://php.net/manual/en/xmlreader.isvalid.php + * @return bool TRUE on success or FALSE on failure. + */ + public function isValid () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Lookup namespace for a prefix + * @link http://php.net/manual/en/xmlreader.lookupnamespace.php + * @param string $prefix

+ * String containing the prefix. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function lookupNamespace ($prefix) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Move cursor to an attribute by index + * @link http://php.net/manual/en/xmlreader.movetoattributeno.php + * @param int $index

+ * The position of the attribute. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function moveToAttributeNo ($index) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Move cursor to a named attribute + * @link http://php.net/manual/en/xmlreader.movetoattribute.php + * @param string $name

+ * The name of the attribute. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function moveToAttribute ($name) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Move cursor to a named attribute + * @link http://php.net/manual/en/xmlreader.movetoattributens.php + * @param string $localName

+ * The local name. + *

+ * @param string $namespaceURI

+ * The namespace URI. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function moveToAttributeNs ($localName, $namespaceURI) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Position cursor on the parent Element of current Attribute + * @link http://php.net/manual/en/xmlreader.movetoelement.php + * @return bool TRUE if successful and FALSE if it fails or not positioned on + * Attribute when this method is called. + */ + public function moveToElement () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Position cursor on the first Attribute + * @link http://php.net/manual/en/xmlreader.movetofirstattribute.php + * @return bool TRUE on success or FALSE on failure. + */ + public function moveToFirstAttribute () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Position cursor on the next Attribute + * @link http://php.net/manual/en/xmlreader.movetonextattribute.php + * @return bool TRUE on success or FALSE on failure. + */ + public function moveToNextAttribute () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Set the URI containing the XML to parse + * @link http://php.net/manual/en/xmlreader.open.php + * @param string $URI

+ * URI pointing to the document. + *

+ * @param string $encoding [optional]

+ * The document encoding or NULL. + *

+ * @param int $options [optional]

+ * A bitmask of the LIBXML_* + * constants. + *

+ * @return bool TRUE on success or FALSE on failure. If called statically, returns an + * XMLReader or FALSE on failure. + */ + public function open ($URI, $encoding = null, $options = 0) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Move to next node in document + * @link http://php.net/manual/en/xmlreader.read.php + * @return bool TRUE on success or FALSE on failure. + */ + public function read () {} + + /** + * (PHP 5 >= 5.1.2)
+ * Move cursor to next node skipping all subtrees + * @link http://php.net/manual/en/xmlreader.next.php + * @param string $localname [optional]

+ * The name of the next node to move to. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function next ($localname = null) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Retrieve XML from current node + * @link http://php.net/manual/en/xmlreader.readinnerxml.php + * @return string the contents of the current node as a string. Empty string on failure. + */ + public function readInnerXml () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Retrieve XML from current node, including it self + * @link http://php.net/manual/en/xmlreader.readouterxml.php + * @return string the contents of current node, including itself, as a string. Empty string on failure. + */ + public function readOuterXml () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Reads the contents of the current node as a string + * @link http://php.net/manual/en/xmlreader.readstring.php + * @return string the content of the current node as a string. Empty string on + * failure. + */ + public function readString () {} + + /** + * (PHP 5 >= 5.2.0)
+ * Validate document against XSD + * @link http://php.net/manual/en/xmlreader.setschema.php + * @param string $filename

+ * The filename of the XSD schema. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setSchema ($filename) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Set parser options + * @link http://php.net/manual/en/xmlreader.setparserproperty.php + * @param int $property

+ * One of the parser option + * constants. + *

+ * @param bool $value

+ * If set to TRUE the option will be enabled otherwise will + * be disabled. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setParserProperty ($property, $value) {} + + /** + * (PHP 5 >= 5.2.0)
+ * Set the filename or URI for a RelaxNG Schema + * @link http://php.net/manual/en/xmlreader.setrelaxngschema.php + * @param string $filename

+ * filename or URI pointing to a RelaxNG Schema. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setRelaxNGSchema ($filename) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Set the data containing a RelaxNG Schema + * @link http://php.net/manual/en/xmlreader.setrelaxngschemasource.php + * @param string $source

+ * String containing the RelaxNG Schema. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setRelaxNGSchemaSource ($source) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Set the data containing the XML to parse + * @link http://php.net/manual/en/xmlreader.xml.php + * @param string $source

+ * String containing the XML to be parsed. + *

+ * @param string $encoding [optional]

+ * The document encoding or NULL. + *

+ * @param int $options [optional]

+ * A bitmask of the LIBXML_* + * constants. + *

+ * @return bool TRUE on success or FALSE on failure. If called statically, returns an + * XMLReader or FALSE on failure. + */ + public function XML ($source, $encoding = null, $options = 0) {} + + /** + * (PHP 5 >= 5.1.2)
+ * Returns a copy of the current node as a DOM object + * @link http://php.net/manual/en/xmlreader.expand.php + * @param DOMNode $basenode [optional] + * @return DOMNode The resulting DOMNode or FALSE on error. + */ + public function expand (DOMNode $basenode = null) {} + +} +// End of xmlreader v.0.1 +?> diff --git a/res/php-5.4-core-api/xmlrpc.php b/res/php-5.4-core-api/xmlrpc.php new file mode 100644 index 0000000..05b5a6d --- /dev/null +++ b/res/php-5.4-core-api/xmlrpc.php @@ -0,0 +1,181 @@ + + * Generates XML for a PHP value + * @link http://php.net/manual/en/function.xmlrpc-encode.php + * @param mixed $value + * @return string + * @jms-builtin + */ +function xmlrpc_encode ($value) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Decodes XML into native PHP types + * @link http://php.net/manual/en/function.xmlrpc-decode.php + * @param string $xml

+ * XML response returned by XMLRPC method. + *

+ * @param string $encoding [optional]

+ * Input encoding supported by iconv. + *

+ * @return mixed either an array, or an integer, or a string, or a boolean according + * to the response returned by the XMLRPC method. + * @jms-builtin + */ +function xmlrpc_decode ($xml, $encoding = "iso-8859-1") {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Decodes XML into native PHP types + * @link http://php.net/manual/en/function.xmlrpc-decode-request.php + * @param string $xml + * @param string $method + * @param string $encoding [optional] + * @return mixed + * @jms-builtin + */ +function xmlrpc_decode_request ($xml, &$method, $encoding = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Generates XML for a method request + * @link http://php.net/manual/en/function.xmlrpc-encode-request.php + * @param string $method

+ * Name of the method to call. + *

+ * @param mixed $params

+ * Method parameters compatible with method signature. + *

+ * @param array $output_options [optional]

+ * Array specifying output options may contain (default values are + * emphasised): + *

output_type: php, xml

+ * @return string a string containing the XML representation of the request. + * @jms-builtin + */ +function xmlrpc_encode_request ($method, $params, array $output_options = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Gets xmlrpc type for a PHP value + * @link http://php.net/manual/en/function.xmlrpc-get-type.php + * @param mixed $value

+ * PHP value + *

+ * @return string the XML-RPC type. + * @jms-builtin + */ +function xmlrpc_get_type ($value) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Sets xmlrpc type, base64 or datetime, for a PHP string value + * @link http://php.net/manual/en/function.xmlrpc-set-type.php + * @param string $value

+ * Value to set the type + *

+ * @param string $type

+ * 'base64' or 'datetime' + *

+ * @return bool TRUE on success or FALSE on failure. + * If successful, value is converted to an object. + * @jms-builtin + */ +function xmlrpc_set_type (&$value, $type) {} + +/** + * (PHP 4 >= 4.3.0, PHP 5)
+ * Determines if an array value represents an XMLRPC fault + * @link http://php.net/manual/en/function.xmlrpc-is-fault.php + * @param array $arg

+ * Array returned by xmlrpc_decode. + *

+ * @return bool TRUE if the argument means fault, FALSE otherwise. Fault + * description is available in $arg["faultString"], fault + * code is in $arg["faultCode"]. + * @jms-builtin + */ +function xmlrpc_is_fault (array $arg) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Creates an xmlrpc server + * @link http://php.net/manual/en/function.xmlrpc-server-create.php + * @return resource + * @jms-builtin + */ +function xmlrpc_server_create () {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Destroys server resources + * @link http://php.net/manual/en/function.xmlrpc-server-destroy.php + * @param resource $server + * @return int + * @jms-builtin + */ +function xmlrpc_server_destroy ($server) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Register a PHP function to resource method matching method_name + * @link http://php.net/manual/en/function.xmlrpc-server-register-method.php + * @param resource $server + * @param string $method_name + * @param string $function + * @return bool + * @jms-builtin + */ +function xmlrpc_server_register_method ($server, $method_name, $function) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Parses XML requests and call methods + * @link http://php.net/manual/en/function.xmlrpc-server-call-method.php + * @param resource $server + * @param string $xml + * @param mixed $user_data + * @param array $output_options [optional] + * @return string + * @jms-builtin + */ +function xmlrpc_server_call_method ($server, $xml, $user_data, array $output_options = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Decodes XML into a list of method descriptions + * @link http://php.net/manual/en/function.xmlrpc-parse-method-descriptions.php + * @param string $xml + * @return array + * @jms-builtin + */ +function xmlrpc_parse_method_descriptions ($xml) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Adds introspection documentation + * @link http://php.net/manual/en/function.xmlrpc-server-add-introspection-data.php + * @param resource $server + * @param array $desc + * @return int + * @jms-builtin + */ +function xmlrpc_server_add_introspection_data ($server, array $desc) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5)
+ * Register a PHP function to generate documentation + * @link http://php.net/manual/en/function.xmlrpc-server-register-introspection-callback.php + * @param resource $server + * @param string $function + * @return bool + * @jms-builtin + */ +function xmlrpc_server_register_introspection_callback ($server, $function) {} + +// End of xmlrpc v.0.51 +?> diff --git a/res/php-5.4-core-api/xmlwriter.php b/res/php-5.4-core-api/xmlwriter.php new file mode 100644 index 0000000..51cde06 --- /dev/null +++ b/res/php-5.4-core-api/xmlwriter.php @@ -0,0 +1,815 @@ + + * Create new xmlwriter using source uri for output + * @link http://php.net/manual/en/function.xmlwriter-open-uri.php + * @param string $uri

+ * The URI of the resource for the output. + *

+ * @return bool Object oriented style: Returns TRUE on success or FALSE on failure. + *

+ *

+ * Procedural style: Returns a new xmlwriter resource for later use with the + * xmlwriter functions on success, FALSE on error. + */ + public function openUri ($uri) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create new xmlwriter using memory for string output + * @link http://php.net/manual/en/function.xmlwriter-open-memory.php + * @return bool Object oriented style: Returns TRUE on success or FALSE on failure. + *

+ *

+ * Procedural style: Returns a new xmlwriter resource for later use with the + * xmlwriter functions on success, FALSE on error. + */ + public function openMemory () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Toggle indentation on/off + * @link http://php.net/manual/en/function.xmlwriter-set-indent.php + * @param bool $indent

+ * Whether indentation is enabled. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setIndent ($indent) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Set string used for indenting + * @link http://php.net/manual/en/function.xmlwriter-set-indent-string.php + * @param string $indentString

+ * The indentation string. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setIndentString ($indentString) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 1.0.0)
+ * Create start comment + * @link http://php.net/manual/en/function.xmlwriter-start-comment.php + * @return bool TRUE on success or FALSE on failure. + */ + public function startComment () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 1.0.0)
+ * Create end comment + * @link http://php.net/manual/en/function.xmlwriter-end-comment.php + * @return bool TRUE on success or FALSE on failure. + */ + public function endComment () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create start attribute + * @link http://php.net/manual/en/function.xmlwriter-start-attribute.php + * @param string $name

+ * The attribute name. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function startAttribute ($name) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * End attribute + * @link http://php.net/manual/en/function.xmlwriter-end-attribute.php + * @return bool TRUE on success or FALSE on failure. + */ + public function endAttribute () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write full attribute + * @link http://php.net/manual/en/function.xmlwriter-write-attribute.php + * @param string $name

+ * The name of the attribute. + *

+ * @param string $value

+ * The value of the attribute. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writeAttribute ($name, $value) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create start namespaced attribute + * @link http://php.net/manual/en/function.xmlwriter-start-attribute-ns.php + * @param string $prefix

+ * The namespace prefix. + *

+ * @param string $name

+ * The attribute name. + *

+ * @param string $uri

+ * The namespace URI. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function startAttributeNs ($prefix, $name, $uri) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write full namespaced attribute + * @link http://php.net/manual/en/function.xmlwriter-write-attribute-ns.php + * @param string $prefix

+ * The namespace prefix. + *

+ * @param string $name

+ * The attribute name. + *

+ * @param string $uri

+ * The namespace URI. + *

+ * @param string $content

+ * The attribute value. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writeAttributeNs ($prefix, $name, $uri, $content) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create start element tag + * @link http://php.net/manual/en/function.xmlwriter-start-element.php + * @param string $name

+ * The element name. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function startElement ($name) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * End current element + * @link http://php.net/manual/en/function.xmlwriter-end-element.php + * @return bool TRUE on success or FALSE on failure. + */ + public function endElement () {} + + /** + * (PHP 5 >= 5.2.0, PECL xmlwriter >= 2.0.4)
+ * End current element + * @link http://php.net/manual/en/function.xmlwriter-full-end-element.php + * @return bool TRUE on success or FALSE on failure. + */ + public function fullEndElement () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create start namespaced element tag + * @link http://php.net/manual/en/function.xmlwriter-start-element-ns.php + * @param string $prefix

+ * The namespace prefix. + *

+ * @param string $name

+ * The element name. + *

+ * @param string $uri

+ * The namespace URI. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function startElementNs ($prefix, $name, $uri) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write full element tag + * @link http://php.net/manual/en/function.xmlwriter-write-element.php + * @param string $name

+ * The element name. + *

+ * @param string $content [optional]

+ * The element contents. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writeElement ($name, $content = null) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write full namespaced element tag + * @link http://php.net/manual/en/function.xmlwriter-write-element-ns.php + * @param string $prefix

+ * The namespace prefix. + *

+ * @param string $name

+ * The element name. + *

+ * @param string $uri

+ * The namespace URI. + *

+ * @param string $content [optional]

+ * The element contents. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writeElementNs ($prefix, $name, $uri, $content = null) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create start PI tag + * @link http://php.net/manual/en/function.xmlwriter-start-pi.php + * @param string $target

+ * The target of the processing instruction. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function startPi ($target) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * End current PI + * @link http://php.net/manual/en/function.xmlwriter-end-pi.php + * @return bool TRUE on success or FALSE on failure. + */ + public function endPi () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Writes a PI + * @link http://php.net/manual/en/function.xmlwriter-write-pi.php + * @param string $target

+ * The target of the processing instruction. + *

+ * @param string $content

+ * The content of the processing instruction. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writePi ($target, $content) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create start CDATA tag + * @link http://php.net/manual/en/function.xmlwriter-start-cdata.php + * @return bool TRUE on success or FALSE on failure. + */ + public function startCdata () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * End current CDATA + * @link http://php.net/manual/en/function.xmlwriter-end-cdata.php + * @return bool TRUE on success or FALSE on failure. + */ + public function endCdata () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write full CDATA tag + * @link http://php.net/manual/en/function.xmlwriter-write-cdata.php + * @param string $content

+ * The contents of the CDATA. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writeCdata ($content) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write text + * @link http://php.net/manual/en/function.xmlwriter-text.php + * @param string $content

+ * The contents of the text. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function text ($content) {} + + /** + * (PHP 5 >= 5.2.0, PECL xmlwriter >= 2.0.4)
+ * Write a raw XML text + * @link http://php.net/manual/en/function.xmlwriter-write-raw.php + * @param string $content

+ * The text string to write. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writeRaw ($content) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create document tag + * @link http://php.net/manual/en/function.xmlwriter-start-document.php + * @param string $version [optional]

+ * The version number of the document as part of the XML declaration. + *

+ * @param string $encoding [optional]

+ * The encoding of the document as part of the XML declaration. + *

+ * @param string $standalone [optional]

+ * yes or no. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function startDocument ($version = 1.0, $encoding = null, $standalone = null) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * End current document + * @link http://php.net/manual/en/function.xmlwriter-end-document.php + * @return bool TRUE on success or FALSE on failure. + */ + public function endDocument () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write full comment tag + * @link http://php.net/manual/en/function.xmlwriter-write-comment.php + * @param string $content

+ * The contents of the comment. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writeComment ($content) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create start DTD tag + * @link http://php.net/manual/en/function.xmlwriter-start-dtd.php + * @param string $qualifiedName

+ * The qualified name of the document type to create. + *

+ * @param string $publicId [optional]

+ * The external subset public identifier. + *

+ * @param string $systemId [optional]

+ * The external subset system identifier. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function startDtd ($qualifiedName, $publicId = null, $systemId = null) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * End current DTD + * @link http://php.net/manual/en/function.xmlwriter-end-dtd.php + * @return bool TRUE on success or FALSE on failure. + */ + public function endDtd () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write full DTD tag + * @link http://php.net/manual/en/function.xmlwriter-write-dtd.php + * @param string $name

+ * The DTD name. + *

+ * @param string $publicId [optional]

+ * The external subset public identifier. + *

+ * @param string $systemId [optional]

+ * The external subset system identifier. + *

+ * @param string $subset [optional]

+ * The content of the DTD. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writeDtd ($name, $publicId = null, $systemId = null, $subset = null) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create start DTD element + * @link http://php.net/manual/en/function.xmlwriter-start-dtd-element.php + * @param string $qualifiedName

+ * The qualified name of the document type to create. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function startDtdElement ($qualifiedName) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * End current DTD element + * @link http://php.net/manual/en/function.xmlwriter-end-dtd-element.php + * @return bool TRUE on success or FALSE on failure. + */ + public function endDtdElement () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write full DTD element tag + * @link http://php.net/manual/en/function.xmlwriter-write-dtd-element.php + * @param string $name

+ * The name of the DTD element. + *

+ * @param string $content

+ * The content of the element. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writeDtdElement ($name, $content) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create start DTD AttList + * @link http://php.net/manual/en/function.xmlwriter-start-dtd-attlist.php + * @param string $name

+ * The attribute list name. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function startDtdAttlist ($name) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * End current DTD AttList + * @link http://php.net/manual/en/function.xmlwriter-end-dtd-attlist.php + * @return bool TRUE on success or FALSE on failure. + */ + public function endDtdAttlist () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write full DTD AttList tag + * @link http://php.net/manual/en/function.xmlwriter-write-dtd-attlist.php + * @param string $name

+ * The name of the DTD attribute list. + *

+ * @param string $content

+ * The content of the DTD attribute list. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function writeDtdAttlist ($name, $content) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Create start DTD Entity + * @link http://php.net/manual/en/function.xmlwriter-start-dtd-entity.php + * @param string $name

+ * The name of the entity. + *

+ * @param bool $isparam + * @return bool TRUE on success or FALSE on failure. + */ + public function startDtdEntity ($name, $isparam) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * End current DTD Entity + * @link http://php.net/manual/en/function.xmlwriter-end-dtd-entity.php + * @return bool TRUE on success or FALSE on failure. + */ + public function endDtdEntity () {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Write full DTD Entity tag + * @link http://php.net/manual/en/function.xmlwriter-write-dtd-entity.php + * @param string $name

+ * The name of the entity. + *

+ * @param string $content

+ * The content of the entity. + *

+ * @param bool $pe + * @param string $pubid + * @param string $sysid + * @param string $ndataid + * @return bool TRUE on success or FALSE on failure. + */ + public function writeDtdEntity ($name, $content, $pe, $pubid, $sysid, $ndataid) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 0.1.0)
+ * Returns current buffer + * @link http://php.net/manual/en/function.xmlwriter-output-memory.php + * @param bool $flush [optional]

+ * Whether to flush the output buffer or not. Default is TRUE. + *

+ * @return string the current buffer as a string. + */ + public function outputMemory ($flush = true) {} + + /** + * (PHP 5 >= 5.1.2, PECL xmlwriter >= 1.0.0)
+ * Flush current buffer + * @link http://php.net/manual/en/function.xmlwriter-flush.php + * @param bool $empty [optional]

+ * Whether to empty the buffer or not. Default is TRUE. + *

+ * @return mixed If you opened the writer in memory, this function returns the generated XML buffer, + * Else, if using URI, this function will write the buffer and return the number of + * written bytes. + */ + public function flush ($empty = true) {} + +} + +/** + * @param $uri + * @jms-builtin + */ +function xmlwriter_open_uri ($uri) {} + +/** @jms-builtin */ +function xmlwriter_open_memory () {} + +/** + * @param $xmlwriter + * @param $indent + * @jms-builtin + */ +function xmlwriter_set_indent ($xmlwriter, $indent) {} + +/** + * @param $xmlwriter + * @param $indentString + * @jms-builtin + */ +function xmlwriter_set_indent_string ($xmlwriter, $indentString) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_start_comment ($xmlwriter) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_end_comment ($xmlwriter) {} + +/** + * @param $xmlwriter + * @param $name + * @jms-builtin + */ +function xmlwriter_start_attribute ($xmlwriter, $name) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_end_attribute ($xmlwriter) {} + +/** + * @param $xmlwriter + * @param $name + * @param $value + * @jms-builtin + */ +function xmlwriter_write_attribute ($xmlwriter, $name, $value) {} + +/** + * @param $xmlwriter + * @param $prefix + * @param $name + * @param $uri + * @jms-builtin + */ +function xmlwriter_start_attribute_ns ($xmlwriter, $prefix, $name, $uri) {} + +/** + * @param $xmlwriter + * @param $prefix + * @param $name + * @param $uri + * @param $content + * @jms-builtin + */ +function xmlwriter_write_attribute_ns ($xmlwriter, $prefix, $name, $uri, $content) {} + +/** + * @param $xmlwriter + * @param $name + * @jms-builtin + */ +function xmlwriter_start_element ($xmlwriter, $name) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_end_element ($xmlwriter) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_full_end_element ($xmlwriter) {} + +/** + * @param $xmlwriter + * @param $prefix + * @param $name + * @param $uri + * @jms-builtin + */ +function xmlwriter_start_element_ns ($xmlwriter, $prefix, $name, $uri) {} + +/** + * @param $xmlwriter + * @param $name + * @param $content [optional] + * @jms-builtin + */ +function xmlwriter_write_element ($xmlwriter, $name, $content) {} + +/** + * @param $xmlwriter + * @param $prefix + * @param $name + * @param $uri + * @param $content [optional] + * @jms-builtin + */ +function xmlwriter_write_element_ns ($xmlwriter, $prefix, $name, $uri, $content) {} + +/** + * @param $xmlwriter + * @param $target + * @jms-builtin + */ +function xmlwriter_start_pi ($xmlwriter, $target) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_end_pi ($xmlwriter) {} + +/** + * @param $xmlwriter + * @param $target + * @param $content + * @jms-builtin + */ +function xmlwriter_write_pi ($xmlwriter, $target, $content) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_start_cdata ($xmlwriter) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_end_cdata ($xmlwriter) {} + +/** + * @param $xmlwriter + * @param $content + * @jms-builtin + */ +function xmlwriter_write_cdata ($xmlwriter, $content) {} + +/** + * @param $xmlwriter + * @param $content + * @jms-builtin + */ +function xmlwriter_text ($xmlwriter, $content) {} + +/** + * @param $xmlwriter + * @param $content + * @jms-builtin + */ +function xmlwriter_write_raw ($xmlwriter, $content) {} + +/** + * @param $xmlwriter + * @param $version [optional] + * @param $encoding [optional] + * @param $standalone [optional] + * @jms-builtin + */ +function xmlwriter_start_document ($xmlwriter, $version, $encoding, $standalone) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_end_document ($xmlwriter) {} + +/** + * @param $xmlwriter + * @param $content + * @jms-builtin + */ +function xmlwriter_write_comment ($xmlwriter, $content) {} + +/** + * @param $xmlwriter + * @param $qualifiedName + * @param $publicId [optional] + * @param $systemId [optional] + * @jms-builtin + */ +function xmlwriter_start_dtd ($xmlwriter, $qualifiedName, $publicId, $systemId) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_end_dtd ($xmlwriter) {} + +/** + * @param $xmlwriter + * @param $name + * @param $publicId [optional] + * @param $systemId [optional] + * @param $subset [optional] + * @jms-builtin + */ +function xmlwriter_write_dtd ($xmlwriter, $name, $publicId, $systemId, $subset) {} + +/** + * @param $xmlwriter + * @param $qualifiedName + * @jms-builtin + */ +function xmlwriter_start_dtd_element ($xmlwriter, $qualifiedName) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_end_dtd_element ($xmlwriter) {} + +/** + * @param $xmlwriter + * @param $name + * @param $content + * @jms-builtin + */ +function xmlwriter_write_dtd_element ($xmlwriter, $name, $content) {} + +/** + * @param $xmlwriter + * @param $name + * @jms-builtin + */ +function xmlwriter_start_dtd_attlist ($xmlwriter, $name) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_end_dtd_attlist ($xmlwriter) {} + +/** + * @param $xmlwriter + * @param $name + * @param $content + * @jms-builtin + */ +function xmlwriter_write_dtd_attlist ($xmlwriter, $name, $content) {} + +/** + * @param $xmlwriter + * @param $name + * @param $isparam + * @jms-builtin + */ +function xmlwriter_start_dtd_entity ($xmlwriter, $name, $isparam) {} + +/** + * @param $xmlwriter + * @jms-builtin + */ +function xmlwriter_end_dtd_entity ($xmlwriter) {} + +/** + * @param $xmlwriter + * @param $name + * @param $content + * @jms-builtin + */ +function xmlwriter_write_dtd_entity ($xmlwriter, $name, $content) {} + +/** + * @param $xmlwriter + * @param $flush [optional] + * @jms-builtin + */ +function xmlwriter_output_memory ($xmlwriter, $flush) {} + +/** + * @param $xmlwriter + * @param $empty [optional] + * @jms-builtin + */ +function xmlwriter_flush ($xmlwriter, $empty) {} + +// End of xmlwriter v.0.1 +?> diff --git a/res/php-5.4-core-api/xsl.php b/res/php-5.4-core-api/xsl.php new file mode 100644 index 0000000..c3a3a82 --- /dev/null +++ b/res/php-5.4-core-api/xsl.php @@ -0,0 +1,193 @@ + + * Import stylesheet + * @link http://php.net/manual/en/xsltprocessor.importstylesheet.php + * @param object $stylesheet

+ * The imported style sheet as a DOMDocument or + * SimpleXMLElement object. + *

+ * @return void No value is returned. + */ + public function importStylesheet ($stylesheet) {} + + /** + * (PHP 5)
+ * Transform to a DOMDocument + * @link http://php.net/manual/en/xsltprocessor.transformtodoc.php + * @param DOMNode $doc

+ * The node to be transformed. + *

+ * @return DOMDocument The resulting DOMDocument or FALSE on error. + */ + public function transformToDoc (DOMNode $doc) {} + + /** + * (PHP 5)
+ * Transform to URI + * @link http://php.net/manual/en/xsltprocessor.transformtouri.php + * @param DOMDocument $doc

+ * The document to transform. + *

+ * @param string $uri

+ * The target URI for the transformation. + *

+ * @return int the number of bytes written or FALSE if an error occurred. + */ + public function transformToUri (DOMDocument $doc, $uri) {} + + /** + * (PHP 5)
+ * Transform to XML + * @link http://php.net/manual/en/xsltprocessor.transformtoxml.php + * @param DOMDocument $doc

+ * The transformed document. + *

+ * @return string The result of the transformation as a string or FALSE on error. + */ + public function transformToXml (DOMDocument $doc) {} + + /** + * (PHP 5)
+ * Set value for a parameter + * @link http://php.net/manual/en/xsltprocessor.setparameter.php + * @param string $namespace

+ * The namespace URI of the XSLT parameter. + *

+ * @param string $name

+ * The local name of the XSLT parameter. + *

+ * @param string $value

+ * The new value of the XSLT parameter. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setParameter ($namespace, $name, $value) {} + + /** + * (PHP 5)
+ * Get value of a parameter + * @link http://php.net/manual/en/xsltprocessor.getparameter.php + * @param string $namespaceURI

+ * The namespace URI of the XSLT parameter. + *

+ * @param string $localName

+ * The local name of the XSLT parameter. + *

+ * @return string The value of the parameter or NULL if it's not set. + */ + public function getParameter ($namespaceURI, $localName) {} + + /** + * (PHP 5)
+ * Remove parameter + * @link http://php.net/manual/en/xsltprocessor.removeparameter.php + * @param string $namespaceURI

+ * The namespace URI of the XSLT parameter. + *

+ * @param string $localName

+ * The local name of the XSLT parameter. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function removeParameter ($namespaceURI, $localName) {} + + /** + * (PHP 5 >= 5.0.4)
+ * Determine if PHP has EXSLT support + * @link http://php.net/manual/en/xsltprocessor.hasexsltsupport.php + * @return bool TRUE on success or FALSE on failure. + */ + public function hasExsltSupport () {} + + /** + * (PHP 5 >= 5.0.4)
+ * Enables the ability to use PHP functions as XSLT functions + * @link http://php.net/manual/en/xsltprocessor.registerphpfunctions.php + * @param mixed $restrict [optional]

+ * Use this parameter to only allow certain functions to be called from + * XSLT. + *

+ *

+ * This parameter can be either a string (a function name) or an array of + * functions. + *

+ * @return void No value is returned. + */ + public function registerPHPFunctions ($restrict = null) {} + + /** + * (PHP >= 5.3.0)
+ * Sets profiling output file + * @link http://php.net/manual/en/xsltprocessor.setprofiling.php + * @param string $filename

+ * Path to the file to dump profiling information. + *

+ * @return bool TRUE on success or FALSE on failure. + */ + public function setProfiling ($filename) {} + + /** + * (PHP >= 5.4.0)
+ * Set security preferences + * @link http://php.net/manual/en/xsltprocessor.setsecurityprefs.php + * @param int $securityPrefs + * @return int + */ + public function setSecurityPrefs ($securityPrefs) {} + + /** + * (PHP >= 5.4.0)
+ * Get security preferences + * @link http://php.net/manual/en/xsltprocessor.getsecurityprefs.php + * @return int + */ + public function getSecurityPrefs () {} + +} +define ('XSL_CLONE_AUTO', 0); +define ('XSL_CLONE_NEVER', -1); +define ('XSL_CLONE_ALWAYS', 1); +define ('XSL_SECPREF_NONE', 0); +define ('XSL_SECPREF_READ_FILE', 2); +define ('XSL_SECPREF_WRITE_FILE', 4); +define ('XSL_SECPREF_CREATE_DIRECTORY', 8); +define ('XSL_SECPREF_READ_NETWORK', 16); +define ('XSL_SECPREF_WRITE_NETWORK', 32); +define ('XSL_SECPREF_DEFAULT', 44); + +/** + * libxslt version like 10117. Available as of PHP 5.1.2. + * @link http://php.net/manual/en/xsl.constants.php + */ +define ('LIBXSLT_VERSION', 10126); + +/** + * libxslt version like 1.1.17. Available as of PHP 5.1.2. + * @link http://php.net/manual/en/xsl.constants.php + */ +define ('LIBXSLT_DOTTED_VERSION', "1.1.26"); + +/** + * libexslt version like 813. Available as of PHP 5.1.2. + * @link http://php.net/manual/en/xsl.constants.php + */ +define ('LIBEXSLT_VERSION', 815); + +/** + * libexslt version like 1.1.17. Available as of PHP 5.1.2. + * @link http://php.net/manual/en/xsl.constants.php + */ +define ('LIBEXSLT_DOTTED_VERSION', "1.1.26"); + +// End of xsl v.0.1 +?> diff --git a/res/php-5.4-core-api/zend.php b/res/php-5.4-core-api/zend.php new file mode 100644 index 0000000..fbb3d0d --- /dev/null +++ b/res/php-5.4-core-api/zend.php @@ -0,0 +1,879 @@ + + * Options can be: priority, application_id, name, status, recurring. + * @param int max_jobs Maximum jobs to retrive. Default is -1, getting all jobs available. + * @param bool with_globals_and_output. Whether gets the global variables dataand job output. + * Default is false. + * @return array. Jobs that satisfies filter_options. + */ + function getJobsInQueue($filter_options=null, $max_jobs=-1, $with_globals_and_output=false) {} + + + /** + * Return the number of jobs in the queue according to the options given in the filter_options parameter + * @param array $filter_options Array of optional filter options to filter the jobs we want to get from the queue. If not set, all jobs will be counted.
+ * Options can be: priority, application_id, host, name, status, recurring. + * @return int. Number of jobs that satisfy filter_options. + */ + function getNumOfJobsInQueue($filter_options=null) {} + + + /** + * Return all the hosts that jobs were submitted from. + * @return array. + */ + function getAllhosts() {} + + + /** + * Return all the application ids exists in queue. + * @return array. + */ + function getAllApplicationIDs() {} + + + + /** + * Return finished jobs (either failed or successed) between time range allowing paging. + * Jobs are sorted by job id descending. + * + * @param int $status. Filter to jobs by status, 1-success, 0-failed either logical or execution. + * @param UNIX timestamp $start_time. Get only jobs finished after $start_time. + * @param UNIX timestamp $end_time. Get only jobs finished before $end_time. + * @param int $index. Get jobs starting from the $index-th place. + * @param int $count. Get only $count jobs. + * @param int $total. Pass by reference. Return the total number of jobs statisifed the query criteria. + * + * @return array of jobs. + */ + function getHistoricJobs($status, $start_time, $end_time, $index, $count, &$total) {} + + + /** + * Suspends queue operation + * @return bool - TRUE if successful FALSE otherwise + */ + function suspendQueue() {} + + + /** + * Resumes queue operation + * @return bool - TRUE if successful FALSE otherwise + */ + function resumeQueue() {} + + + /** + * Return description of the last error occured in the queue object. After every + * method invoked an error string describing the error is store in the queue object. + * @return string. + */ + function getLastError() {} + + + /** + * Sets a new maximum time for keeping historic jobs + * @return bool - TRUE if successful FALSE otherwise + */ + function setMaxHistoryTime() {} +} + +/** + * Describing a job in a queue + * In order to add/modify a job in the queue, a Job class must be created/retrieved and than saved in a queue + * + * For simplicity, a job can be added directly to a queue and without creating an instant of a Queue object + * @jms-builtin + */ +class ZendAPI_Job { + + /** + * Unique id of the Job in the job queue + * + * @var int + */ + var $_id; + + /** + * Full path of the script that this job calls when it's processed + * + * @var string + */ + var $_script; + + /** + * The host that the job was submit from + * + * @var string + */ + var $_host; + + /** + * A short string describing the job + * + * @var string + */ + var $_name; + + + /** + * The job output after executing + * + * @var string + */ + var $_output; + + /** + * The status of the job + * By default, the job status is waiting to being execute. + * The status is determent by the queue and can not be modify by the user. + * + * @var int + */ + var $_status = JOB_QUEUE_STATUS_WAITING; + + /** + * The application id of the job + * If the application id is not set, this job may get an application id automatically from the queue + * (if the queue was assigned one). By default it is null (which indicates no application id is assigned) + * + * @var string + */ + var $_application_id = null; + + /** + * The priority of the job, options are the priority constants + * By default the priority is set to normal (JOB_QUEUE_PRIORITY_NORMAL) + * + * @var int + */ + var $_priority = JOB_QUEUE_PRIORITY_NORMAL; + + /** + * Array holding all the variables that the user wants the job's script to have when it's called + * The structure is variable_name => variable_value + i.e. if the user_variables array is array('my_var' => 8), when the script is called, + a global variable called $my_var will have the int value of 8 + * By default there are no variables that we want to add to the job's script + * + * @var array + */ + var $_user_variables = array(); + + /** + * Bit mask holding the global variables that the user want the job's script to have when it's called + * Options are prefixed with "JOB_QUEUE_SAVE_" and may be: + POST|GET|COOKIE|SESSION|RAW_POST|SERVER|FILES|ENV + * By default there are no global variables we want to add to the job's script + * i.e. In order to save the current GET and COOKIE global variables, + this property should be JOB_QUEUE_SAVE_GET|JOB_QUEUE_SAVE_COOKIE (or the integer 6) + In that case (of GET and COOKIE), when the job is added, the current $_GET and + $_COOKIE variables should be saved, and when the job's script is called, + those global variables should be populated + * + * @var int + */ + var $_global_variables = 0; + + /** + * The job may have a dependency (another job that must be performed before this job) + * This property hold the id of the job that must be performed. if this variable is an array of integers, + it means that there are several jobs that must be performed before this job + * By default there are no dependencies + * + * @var mixed (int|array) + */ + var $_predecessor = null; + + /** + * The time that this job should be performed, this variables is the UNIX timestamp. + * If set to 0, it means that the job should be performed now (or at least as soon as possible) + * By default there is no scheduled time, which means we want to perform the job as soon as possible + * + * @var int + */ + var $_scheduled_time = 0; + + /** + * The job running frequency in seconds. The job should run every _internal seconds + * This property applys only to recurrent job. + * By default, its value is 0 e.g. run it only once. + * + * @var int + */ + var $_interval = 0; + + /** + * UNIX timestamp that it's the last time this job should occurs. If _interval was set, and _end_time + * was not, then this job will run forever. + * By default there is no end_time, so recurrent job will run forever. If the job is not recurrent + * (occurs only once) then the job will run at most once. If end_time has reached and the job was not + * execute yet, it will not run. + * + * @var int + */ + var $_end_time = null; + + + /** + * A bit that determine whether job can be deleted from history. When set, removeJob will not + * delete the job from history. + * + * @var int + */ + var $_preserved = 0; + + + /** + * Instantiate a Job object, describe all the information and properties of a job + * + * @param script $script relative path (relative to document root supplied in ini file) of the script this job should call when it's executing + * @return Job + */ + function ZendAPI_Job($script) {} + + + /** + * Add the job the the specified queue (without instantiating a JobQueue object) + * This function should be used for extreme simplicity of the user when adding a single job, + when the user want to insert more than one job and/or manipulating other jobs (or job tasks) + he should create and use the JobQueue object + * Actually what this function do is to create a new JobQueue, login to it (with the given parameters), + add this job to it and logout + * + * @param string $jobqueue_url Full address of the queue we want to connect to + * @param string $password For authentication, the queue password + * @return int The added job id or false on failure + */ + function addJobToQueue($jobqueue_url, $password) {} + + + /** + * Set a new priority to the job + * + * @param int $priority Priority options are constants with the "JOB_QUEUE_PRIORITY_" prefix + */ + function setJobPriority($priority) {} + + // All properties SET functions + function setJobName($name) {} + function setScript($script) {} + function setApplicationID($app_id) {} + function setUserVariables($vars) {} + function setGlobalVariables($vars) {} + function setJobDependency($job_id) {} + function setScheduledTime($timestamp) {} + function setRecurrenceData($interval, $end_time=null) {} + function setPreserved($preserved) {} + + /** + * Get the job properties + * + * @return array The same format of job options array as in the Job constructor + */ + function getProperties() {} + + /** + * Get the job output + * + * @return An HTML representing the job output + */ + function getOutput() {} + + // All properties GET functions + function getID() {} + function getHost() {} + function getScript() {} + function getJobPriority() {} + function getJobName() {} + function getApplicationID() {} + function getUserVariables() {} + function getGlobalVariables() {} + function getJobDependency() {} + function getScheduledTime() {} + function getInterval() {} + function getEndTime() {} + function getPreserved() {} + + /** + * Get the current status of the job + * If this job was created and not returned from a queue (using the JobQueue::GetJob() function), + * the function will return false + * The status is one of the constants with the "JOB_QUEUE_STATUS_" prefix. + * E.g. job was performed and failed, job is waiting etc. + * + * @return int + */ + function getJobStatus() {} + + /** + * Get how much seconds there are until the next time the job will run. + * If the job is not recurrence or it past its end time, then return 0. + * + * @return int + */ + function getTimeToNextRepeat() {} + + /** + * For recurring job get the status of the last execution. For simple job, + * getLastPerformedStatus is equivalent to getJobStatus. + * jobs that haven't been executed yet will return STATUS_WAITING + * @return int + */ + function getLastPerformedStatus() {} + +} + + +/** + * Disable/enable the Code Acceleration functionality at run time. + * @param status bool If false, Acceleration is disabled, if true - enabled + * @return void + * @jms-builtin + */ +function accelerator_set_status($status) {} + +/** + * Disables output caching for currently running scripts. + * @return void + * @jms-builtin + */ +function output_cache_disable() {} + +/** + * Does not allow the cache to perform compression on the output of the current page. + * This output will not be compressed, even if the global set tings would normally allow + * compression on files of this type. + * @return void + * @jms-builtin + */ +function output_cache_disable_compression() {} + +/** + * Gets the code’s return value from the cache if it is there, if not - run function and cache the value. + * @param key string cache key + * @param function string PHP expression + * @param lifetime int data lifetime in cache (seconds) + * @return string function's return + * @jms-builtin + */ +function output_cache_fetch($key, $function, $lifetime) {} + +/** + * If they cache for the key exists, output it, otherwise capture expression output, cache and pass it out. + * @param key string cache key + * @param function string PHP expression + * @param lifetime int data lifetime in cache (seconds) + * @return expression output + * @jms-builtin + */ +function output_cache_output($key, $function, $lifetime) {} + +/** + * Removes all the cache data for the given filename. + * @param filename string full script path on local filesystem + * @return bool true if OK, false if something went wrong + * @jms-builtin + */ +function output_cache_remove($filename) {} + +/** + * Remove cache data for the script with given URL (all dependent data is removed) + * @param url string the local url for the script + * @return bool true if OK + * @jms-builtin + */ +function output_cache_remove_url($url) {} + +/** + * Remove item from PHP API cache by key + * @param key string cache key as given to output_cache_get/output_cache_put + * @return bool true if OK + * @jms-builtin + */ +function output_cache_remove_key($key) {} + +/** + * Puts data in cache according to the assigned key. + * @param key string cache key + * @param data mixed cached data (must not contain objects or resources) + * @return bool true if OK + * @jms-builtin + */ +function output_cache_put($key, $data) {} + +/** + * Gets cached data according to the assigned key. + * @param key string cache key + * @param lifetime int cache validity time (seconds) + * @return mixed cached data if cache exists, false otherwise + * @jms-builtin + */ +function output_cache_get($key, $lifetime) {} + +/** + * If data for assigned key exists, this function outputs it and returns a value of true. + * If not, it starts capturing the output. To be used in pair with output_cache_stop. + * @param key string cache key + * @param lifetime int cache validity time (seconds) + * @return bool true if cached data exists + * @jms-builtin + */ +function output_cache_exists($key, $lifetime) {} + +/** + * If output was captured by output_cache_exists, this function stops the output capture and stores + * the data under the key that was given to output_cache_exists(). + * @return void + * @jms-builtin + */ +function output_cache_stop() {} + + +/** + * Should be called from a custom error handler to pass the error to the monitor. + * The user function needs to accept two parameters: the error code, and a string describing the error. + * Then there are two optional parameters that may be supplied: the filename in which the error occurred + * and the line number in which the error occurred. + * @param errno int + * @param errstr string + * @param errfile string + * @param errline integer + * @return void + * @jms-builtin + */ +function monitor_pass_error($errno, $errstr, $errfile, $errline) {} + +/** + * Limited in the database to 255 chars + * @param hint string + * @return void + * @jms-builtin + */ +function monitor_set_aggregation_hint($hint) {} + +/** + * Creates a custom event with class $class, text $text and possibly severity and other user data + * @param class string + * @param text string + * @param severe int[optional] + * @param user_data mixed[optional] + * @return void + * @jms-builtin + */ +function monitor_custom_event($class, $text, $severe = null, $user_data = null) {} + +/** + * Create an HTTPERROR event + * @param error_code int the http error code to be associated with this event + * @param url string the URL to be associated with this event + * @param severe int[optional] the severety of the event: 0 - not severe, 1 - severe + * @return void + * @jms-builtin + */ +function monitor_httperror_event($error_code, $url, $severe = null) {} + +/** + * Returns an array containing information about + *
  • module loading status (and cause of error if module failed to load) + *
  • module license status (and cause of error if license not valid) + * @return array + * @jms-builtin + */ +function monitor_license_info() {} + +/** + * Allow you to register a user function as an event handler.When a monitor event is triggerd + * all the user event handler are called and the return value from the handler is saved in + * an array keyed by the name the event handler was registered under. The event handlers + * results array is saved in the event_extra_data table. + * @param event_handler_func string The callback function that will be call when the event is triggered, object methods may also be invoked statically using t +his function by passing array($objectname, $methodname) to the function parameter + * @param handler_register_name string[optional] The name this function is registered under - if none is supplied, the function will be registerd under it's own name + * @param event_type_mask int The mask of event types that the handler should be called on by default it's set to MONITOR_EVENT_ALL. + * @return bool TRUE on sucess and FALSE if an error occurs. + * @jms-builtin + */ +function register_event_handler($event_handler_func, $handler_register_name, $event_type_mask) {} + +/** + * Allow you to unregister an event handler. + * @param handler_name string the name you registered with the handler you now wish to unregister. + * @return bool TRUE on sucess and FALSE if no handler we registered under the given name. + * @jms-builtin + */ +function unregister_event_handler($handler_name) {} + +/** + * Send a file using ZDS + * @param filename string path to the file + * @param mime_type string[optional] MIME type of the file, if omitted, taken from configured MIME types file + * @param custom_headers string[optional] user defined headers that will be send instead of regular ZDS headers. few basic essential headers will be send anyway + * @return bool FALSE if sending file failed, does not return otherwise + * @jms-builtin + */ +function zend_send_file($filename, $mime_type, $custom_headers) {} + +/** + * Send a buffer using ZDS + * @param buffer string the content that will be send + * @param mime_type string[optional] MIME type of the buffer, if omitted, taken from configured MIME types file + * @param custom_headers string[optional] user defined headers that will be send instead of regular ZDS headers. few basic essential headers will be send anyway + * @return bool FALSE if sending file failed, does not return otherwise + * @jms-builtin + */ +function zend_send_buffer($buffer, $mime_type, $custom_headers) {} + + +/** @jms-builtin */ +class java { + /** + * Create Java object + * + * @return java + * @param classname string + * @vararg ... + */ + function java($classname) {} + +}; + +/** @jms-builtin */ +class JavaException { + /** + * Get Java exception that led to this exception + * + * @return object + */ + function getCause() {} + +}; + + +/** + * Create Java object + * + * @return object + * @param class string + * @vararg ... + * @jms-builtin + */ +function java($class) {} + + +/** + * Return Java exception object for last exception + * @return object Java Exception object, if there was an exception, false otherwise + * @jms-builtin + */ +function java_last_exception_get() {} + +/** + * Clear last Java exception object record. + * @return void + * @jms-builtin + */ +function java_last_exception_clear() {} + +/** + * Set case sensitivity for Java calls. + * @param ignore bool if set, Java attribute and method names would be resolved disregarding case. NOTE: this does not make any Java functions case insensi +tive, just things like $foo->bar and $foo->bar() would match Bar too. + * @return void + * @jms-builtin + */ +function java_set_ignore_case($ignore) {} + +/** + * Set encoding for strings received by Java from PHP. Default is UTF-8. + * @param encoding string + * @return array + * @jms-builtin + */ +function java_set_encoding($encoding) {} + +/** + * Control if exceptions are thrown on Java exception. Only for PHP5. + * @param throw bool If true, PHP exception is thrown when Java exception happens. If set to false, use java_last_exception_get() to check for exception. + * @return void + * @jms-builtin + */ +function java_throw_exceptions($throw) {} + +/** + * Reload Jar's that were dynamically loaded + * + * @return array + * @param new_jarpath string + * @jms-builtin + */ +function java_reload($new_jarpath) {} + +/** + * Add to Java's classpath in runtime + * + * @return array + * @param new_classpath string + * @jms-builtin + */ +function java_require($new_classpath) {} + + +/** + * Shown if loader is enabled + * @return bool + * @jms-builtin + */ +function zend_loader_enabled() {} + +/** + * Returns true if the current file is a Zend-encoded file. + * @return bool + * @jms-builtin + */ +function zend_loader_file_encoded() {} + +/** + * Returns license (array with fields) if the current file has a valid license and is encoded, otherwise it returns false. + * @return array + * @jms-builtin + */ +function zend_loader_file_licensed() {} + +/** + * Returns the name of the file currently being executed. + * @return string + * @jms-builtin + */ +function zend_loader_current_file() {} + +/** + * Dynamically loads a license for applications encoded with Zend SafeGuard. The Override controls if it will override old licenses for the same product. + * @param license_file string + * @param override bool[optional] + * @return bool + * @jms-builtin + */ +function zend_loader_install_license($license_file, $override) {} + +/** + * Obfuscate and return the given function name with the internal obfuscation function. + * @param function_name string + * @return string + * @jms-builtin + */ +function zend_obfuscate_function_name($function_name) {} + +/** + * Obfuscate and return the given class name with the internal obfuscation function. + * @param class_name string + * @return string + * @jms-builtin + */ +function zend_obfuscate_class_name($class_name) {} + +/** + * Returns the current obfuscation level support (set by zend_optimizer.obfuscation_level_support) + * @return int + * @jms-builtin + */ +function zend_current_obfuscation_level() {} + +/** + * Start runtime-obfuscation support that allows limited mixing of obfuscated and un-obfuscated code. + * @return void + * @jms-builtin + */ +function zend_runtime_obfuscate() {} + +/** + * Returns array of the host ids. If all_ids is true, then all IDs are returned, otehrwise only IDs considered "primary" are returned. + * @param all_ids bool[optional] + * @return array + * @jms-builtin + */ +function zend_get_id($all_ids = false) {} + +/** + * Returns Optimizer version. Alias: zend_loader_version() + * @return string + * @jms-builtin + */ +function zend_optimizer_version() {} + + +// End of Zend Extensions + +?> diff --git a/res/php-5.4-core-api/zip.php b/res/php-5.4-core-api/zip.php new file mode 100644 index 0000000..789d635 --- /dev/null +++ b/res/php-5.4-core-api/zip.php @@ -0,0 +1,670 @@ + + * Open a ZIP file archive + * @link http://php.net/manual/en/ziparchive.open.php + * @param string $filename

    + * The file name of the ZIP archive to open. + *

    + * @param int $flags [optional]

    + * The mode to use to open the archive. + *

    + * ZIPARCHIVE::OVERWRITE + *

    + * @return mixed Error codes + *

    + * Returns TRUE on success or the error code. + *

    + * ZIPARCHIVE::ER_EXISTS + *

    + *

    + * File already exists. + *

    + *

    + * ZIPARCHIVE::ER_INCONS + *

    + *

    + * Zip archive inconsistent. + *

    + *

    + * ZIPARCHIVE::ER_INVAL + *

    + *

    + * Invalid argument. + *

    + *

    + * ZIPARCHIVE::ER_MEMORY + *

    + *

    + * Malloc failure. + *

    + *

    + * ZIPARCHIVE::ER_NOENT + *

    + *

    + * No such file. + *

    + *

    + * ZIPARCHIVE::ER_NOZIP + *

    + *

    + * Not a zip archive. + *

    + *

    + * ZIPARCHIVE::ER_OPEN + *

    + *

    + * Can't open file. + *

    + *

    + * ZIPARCHIVE::ER_READ + *

    + *

    + * Read error. + *

    + *

    + * ZIPARCHIVE::ER_SEEK + *

    + *

    + * Seek error. + *

    + *

    + */ + public function open ($filename, $flags = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Close the active archive (opened or newly created) + * @link http://php.net/manual/en/ziparchive.close.php + * @return bool TRUE on success or FALSE on failure. + */ + public function close () {} + + /** + * (PHP 5 >= 5.2.7)
    + * Returns the status error message, system and/or zip messages + * @link http://php.net/manual/en/ziparchive.getstatusstring.php + * @return string a string with the status message on success or FALSE on failure. + */ + public function getStatusString () {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.8.0)
    + * Add a new directory + * @link http://php.net/manual/en/ziparchive.addemptydir.php + * @param string $dirname

    + * The directory to add. + *

    + * @return bool TRUE on success or FALSE on failure. + */ + public function addEmptyDir ($dirname) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Add a file to a ZIP archive using its contents + * @link http://php.net/manual/en/ziparchive.addfromstring.php + * @param string $localname

    + * The name of the entry to create. + *

    + * @param string $contents

    + * The contents to use to create the entry. It is used in a binary + * safe mode. + *

    + * @return bool TRUE on success or FALSE on failure. + */ + public function addFromString ($localname, $contents) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Adds a file to a ZIP archive from the given path + * @link http://php.net/manual/en/ziparchive.addfile.php + * @param string $filename

    + * The path to the file to add. + *

    + * @param string $localname [optional]

    + * If supplied, this is the local name inside the ZIP archive that will override the filename. + *

    + * @param int $start [optional]

    + * This parameter is not used but is required to extend ZipArchive. + *

    + * @param int $length [optional]

    + * This parameter is not used but is required to extend ZipArchive. + *

    + * @return bool TRUE on success or FALSE on failure. + */ + public function addFile ($filename, $localname = null, $start = 0, $length = 0) {} + + /** + * @param $pattern + * @param $flags [optional] + * @param $options [optional] + */ + public function addGlob ($pattern, $flags, $options) {} + + /** + * @param $pattern + * @param $path [optional] + * @param $options [optional] + */ + public function addPattern ($pattern, $path, $options) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.5.0)
    + * Renames an entry defined by its index + * @link http://php.net/manual/en/ziparchive.renameindex.php + * @param int $index

    + * Index of the entry to rename. + *

    + * @param string $newname

    + * New name. + *

    + * @return bool TRUE on success or FALSE on failure. + */ + public function renameIndex ($index, $newname) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.5.0)
    + * Renames an entry defined by its name + * @link http://php.net/manual/en/ziparchive.renamename.php + * @param string $name

    + * Name of the entry to rename. + *

    + * @param string $newname

    + * New name. + *

    + * @return bool TRUE on success or FALSE on failure. + */ + public function renameName ($name, $newname) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.4.0)
    + * Set the comment of a ZIP archive + * @link http://php.net/manual/en/ziparchive.setarchivecomment.php + * @param string $comment

    + * The contents of the comment. + *

    + * @return mixed TRUE on success or FALSE on failure. + */ + public function setArchiveComment ($comment) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Returns the Zip archive comment + * @link http://php.net/manual/en/ziparchive.getarchivecomment.php + * @param int $flags [optional]

    + * If flags is set to ZIPARCHIVE::FL_UNCHANGED, the original unchanged + * comment is returned. + *

    + * @return string the Zip archive comment or FALSE on failure. + */ + public function getArchiveComment ($flags = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.4.0)
    + * Set the comment of an entry defined by its index + * @link http://php.net/manual/en/ziparchive.setcommentindex.php + * @param int $index

    + * Index of the entry. + *

    + * @param string $comment

    + * The contents of the comment. + *

    + * @return mixed TRUE on success or FALSE on failure. + */ + public function setCommentIndex ($index, $comment) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.4.0)
    + * Set the comment of an entry defined by its name + * @link http://php.net/manual/en/ziparchive.setcommentname.php + * @param string $name

    + * Name of the entry. + *

    + * @param string $comment

    + * The contents of the comment. + *

    + * @return mixed TRUE on success or FALSE on failure. + */ + public function setCommentName ($name, $comment) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.4.0)
    + * Returns the comment of an entry using the entry index + * @link http://php.net/manual/en/ziparchive.getcommentindex.php + * @param int $index

    + * Index of the entry + *

    + * @param int $flags [optional]

    + * If flags is set to ZIPARCHIVE::FL_UNCHANGED, the original unchanged + * comment is returned. + *

    + * @return string the comment on success or FALSE on failure. + */ + public function getCommentIndex ($index, $flags = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.4.0)
    + * Returns the comment of an entry using the entry name + * @link http://php.net/manual/en/ziparchive.getcommentname.php + * @param string $name

    + * Name of the entry + *

    + * @param int $flags [optional]

    + * If flags is set to ZIPARCHIVE::FL_UNCHANGED, the original unchanged + * comment is returned. + *

    + * @return string the comment on success or FALSE on failure. + */ + public function getCommentName ($name, $flags = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.5.0)
    + * delete an entry in the archive using its index + * @link http://php.net/manual/en/ziparchive.deleteindex.php + * @param int $index

    + * Index of the entry to delete. + *

    + * @return bool TRUE on success or FALSE on failure. + */ + public function deleteIndex ($index) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.5.0)
    + * delete an entry in the archive using its name + * @link http://php.net/manual/en/ziparchive.deletename.php + * @param string $name

    + * Name of the entry to delete. + *

    + * @return bool TRUE on success or FALSE on failure. + */ + public function deleteName ($name) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.5.0)
    + * Get the details of an entry defined by its name. + * @link http://php.net/manual/en/ziparchive.statname.php + * @param name $name

    + * Name of the entry + *

    + * @param int $flags [optional]

    + * The flags argument specifies how the name lookup should be done. + * Also, ZIPARCHIVE::FL_UNCHANGED may be ORed to it to request + * information about the original file in the archive, + * ignoring any changes made. + *

    + * ZIPARCHIVE::FL_NOCASE + *

    + * @return mixed an array containing the entry details or FALSE on failure. + */ + public function statName ($name, $flags = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Get the details of an entry defined by its index. + * @link http://php.net/manual/en/ziparchive.statindex.php + * @param int $index

    + * Index of the entry + *

    + * @param int $flags [optional]

    + * ZIPARCHIVE::FL_UNCHANGED may be ORed to it to request + * information about the original file in the archive, + * ignoring any changes made. + *

    + * @return mixed an array containing the entry details or FALSE on failure. + */ + public function statIndex ($index, $flags = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.5.0)
    + * Returns the index of the entry in the archive + * @link http://php.net/manual/en/ziparchive.locatename.php + * @param string $name

    + * The name of the entry to look up + *

    + * @param int $flags [optional]

    + * The flags are specified by ORing the following values, + * or 0 for none of them. + *

    + * ZIPARCHIVE::FL_NOCASE + *

    + * @return mixed the index of the entry on success or FALSE on failure. + */ + public function locateName ($name, $flags = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.5.0)
    + * Returns the name of an entry using its index + * @link http://php.net/manual/en/ziparchive.getnameindex.php + * @param int $index

    + * Index of the entry. + *

    + * @param int $flags [optional]

    + * If flags is set to ZIPARCHIVE::FL_UNCHANGED, the original unchanged + * name is returned. + *

    + * @return string the name on success or FALSE on failure. + */ + public function getNameIndex ($index, $flags = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Revert all global changes done in the archive. + * @link http://php.net/manual/en/ziparchive.unchangearchive.php + * @return mixed TRUE on success or FALSE on failure. + */ + public function unchangeArchive () {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Undo all changes done in the archive + * @link http://php.net/manual/en/ziparchive.unchangeall.php + * @return mixed TRUE on success or FALSE on failure. + */ + public function unchangeAll () {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Revert all changes done to an entry at the given index + * @link http://php.net/manual/en/ziparchive.unchangeindex.php + * @param int $index

    + * Index of the entry. + *

    + * @return mixed TRUE on success or FALSE on failure. + */ + public function unchangeIndex ($index) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.5.0)
    + * Revert all changes done to an entry with the given name. + * @link http://php.net/manual/en/ziparchive.unchangename.php + * @param string $name

    + * Name of the entry. + *

    + * @return mixed TRUE on success or FALSE on failure. + */ + public function unchangeName ($name) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Extract the archive contents + * @link http://php.net/manual/en/ziparchive.extractto.php + * @param string $destination

    + * Location where to extract the files. + *

    + * @param mixed $entries [optional]

    + * The entries to extract. It accepts either a single entry name or + * an array of names. + *

    + * @return bool TRUE on success or FALSE on failure. + */ + public function extractTo ($destination, $entries = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Returns the entry contents using its name + * @link http://php.net/manual/en/ziparchive.getfromname.php + * @param string $name

    + * Name of the entry + *

    + * @param int $length [optional]

    + * The length to be read from the entry. If 0, then the + * entire entry is read. + *

    + * @param int $flags [optional]

    + * The flags to use to open the archive. the following values may + * be ORed to it. + *

    + * ZIPARCHIVE::FL_UNCHANGED + *

    + * @return mixed the contents of the entry on success or FALSE on failure. + */ + public function getFromName ($name, $length = 0, $flags = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.3.0)
    + * Returns the entry contents using its index + * @link http://php.net/manual/en/ziparchive.getfromindex.php + * @param int $index

    + * Index of the entry + *

    + * @param int $length [optional]

    + * The length to be read from the entry. If 0, then the + * entire entry is read. + *

    + * @param int $flags [optional]

    + * The flags to use to open the archive. the following values may + * be ORed to it. + *

    + * ZIPARCHIVE::FL_UNCHANGED + *

    + * @return mixed the contents of the entry on success or FALSE on failure. + */ + public function getFromIndex ($index, $length = 0, $flags = null) {} + + /** + * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    + * Get a file handler to the entry defined by its name (read only). + * @link http://php.net/manual/en/ziparchive.getstream.php + * @param string $name

    + * The name of the entry to use. + *

    + * @return resource a file pointer (resource) on success or FALSE on failure. + */ + public function getStream ($name) {} + +} + +/** + * (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
    + * Open a ZIP file archive + * @link http://php.net/manual/en/function.zip-open.php + * @param string $filename

    + * The file name of the ZIP archive to open. + *

    + * @return resource a resource handle for later use with + * zip_read and zip_close + * or returns the number of error if filename does not + * exist or in case of other error. + * @jms-builtin + */ +function zip_open ($filename) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
    + * Close a ZIP file archive + * @link http://php.net/manual/en/function.zip-close.php + * @param resource $zip

    + * A ZIP file previously opened with zip_open. + *

    + * @return void No value is returned. + * @jms-builtin + */ +function zip_close ($zip) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
    + * Read next entry in a ZIP file archive + * @link http://php.net/manual/en/function.zip-read.php + * @param resource $zip

    + * A ZIP file previously opened with zip_open. + *

    + * @return resource a directory entry resource for later use with the + * zip_entry_... functions, or FALSE if + * there are no more entries to read, or an error code if an error + * occurred. + * @jms-builtin + */ +function zip_read ($zip) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
    + * Open a directory entry for reading + * @link http://php.net/manual/en/function.zip-entry-open.php + * @param resource $zip

    + * A valid resource handle returned by zip_open. + *

    + * @param resource $zip_entry

    + * A directory entry returned by zip_read. + *

    + * @param string $mode [optional]

    + * Any of the modes specified in the documentation of + * fopen. + *

    + *

    + * Currently, mode is ignored and is always + * "rb". This is due to the fact that zip support + * in PHP is read only access. + *

    + * @return bool TRUE on success or FALSE on failure. + *

    + *

    + * Unlike fopen and other similar functions, + * the return value of zip_entry_open only + * indicates the result of the operation and is not needed for + * reading or closing the directory entry. + * @jms-builtin + */ +function zip_entry_open ($zip, $zip_entry, $mode = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
    + * Close a directory entry + * @link http://php.net/manual/en/function.zip-entry-close.php + * @param resource $zip_entry

    + * A directory entry previously opened zip_entry_open. + *

    + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function zip_entry_close ($zip_entry) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
    + * Read from an open directory entry + * @link http://php.net/manual/en/function.zip-entry-read.php + * @param resource $zip_entry

    + * A directory entry returned by zip_read. + *

    + * @param int $length [optional]

    + * The number of bytes to return. If not specified, this function will + * attempt to read 1024 bytes. + *

    + *

    + * This should be the uncompressed length you wish to read. + *

    + * @return string the data read, or FALSE if the end of the file is + * reached. + * @jms-builtin + */ +function zip_entry_read ($zip_entry, $length = null) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
    + * Retrieve the actual file size of a directory entry + * @link http://php.net/manual/en/function.zip-entry-filesize.php + * @param resource $zip_entry

    + * A directory entry returned by zip_read. + *

    + * @return int The size of the directory entry. + * @jms-builtin + */ +function zip_entry_filesize ($zip_entry) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
    + * Retrieve the name of a directory entry + * @link http://php.net/manual/en/function.zip-entry-name.php + * @param resource $zip_entry

    + * A directory entry returned by zip_read. + *

    + * @return string The name of the directory entry. + * @jms-builtin + */ +function zip_entry_name ($zip_entry) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
    + * Retrieve the compressed size of a directory entry + * @link http://php.net/manual/en/function.zip-entry-compressedsize.php + * @param resource $zip_entry

    + * A directory entry returned by zip_read. + *

    + * @return int The compressed size. + * @jms-builtin + */ +function zip_entry_compressedsize ($zip_entry) {} + +/** + * (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
    + * Retrieve the compression method of a directory entry + * @link http://php.net/manual/en/function.zip-entry-compressionmethod.php + * @param resource $zip_entry

    + * A directory entry returned by zip_read. + *

    + * @return string The compression method. + * @jms-builtin + */ +function zip_entry_compressionmethod ($zip_entry) {} + +// End of zip v.1.9.1 +?> diff --git a/res/php-5.4-core-api/zlib.php b/res/php-5.4-core-api/zlib.php new file mode 100644 index 0000000..bbe94d2 --- /dev/null +++ b/res/php-5.4-core-api/zlib.php @@ -0,0 +1,443 @@ + + * Output a gz-file + * @link http://php.net/manual/en/function.readgzfile.php + * @param string $filename

    + * The file name. This file will be opened from the filesystem and its + * contents written to standard output. + *

    + * @param int $use_include_path [optional]

    + * You can set this optional parameter to 1, if you + * want to search for the file in the include_path too. + *

    + * @return int the number of (uncompressed) bytes read from the file. If + * an error occurs, FALSE is returned and unless the function was + * called as @readgzfile, an error message is + * printed. + * @jms-builtin + */ +function readgzfile ($filename, $use_include_path = 0) {} + +/** + * (PHP 4, PHP 5)
    + * Rewind the position of a gz-file pointer + * @link http://php.net/manual/en/function.gzrewind.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function gzrewind ($zp) {} + +/** + * (PHP 4, PHP 5)
    + * Close an open gz-file pointer + * @link http://php.net/manual/en/function.gzclose.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @return bool TRUE on success or FALSE on failure. + * @jms-builtin + */ +function gzclose ($zp) {} + +/** + * (PHP 4, PHP 5)
    + * Test for EOF on a gz-file pointer + * @link http://php.net/manual/en/function.gzeof.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @return int TRUE if the gz-file pointer is at EOF or an error occurs; + * otherwise returns FALSE. + * @jms-builtin + */ +function gzeof ($zp) {} + +/** + * (PHP 4, PHP 5)
    + * Get character from gz-file pointer + * @link http://php.net/manual/en/function.gzgetc.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @return string The uncompressed character or FALSE on EOF (unlike gzeof). + * @jms-builtin + */ +function gzgetc ($zp) {} + +/** + * (PHP 4, PHP 5)
    + * Get line from file pointer + * @link http://php.net/manual/en/function.gzgets.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @param int $length

    + * The length of data to get. + *

    + * @return string The uncompressed string, or FALSE on error. + * @jms-builtin + */ +function gzgets ($zp, $length) {} + +/** + * (PHP 4, PHP 5)
    + * Get line from gz-file pointer and strip HTML tags + * @link http://php.net/manual/en/function.gzgetss.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @param int $length

    + * The length of data to get. + *

    + * @param string $allowable_tags [optional]

    + * You can use this optional parameter to specify tags which should not + * be stripped. + *

    + * @return string The uncompressed and striped string, or FALSE on error. + * @jms-builtin + */ +function gzgetss ($zp, $length, $allowable_tags = null) {} + +/** + * (PHP 4, PHP 5)
    + * Binary-safe gz-file read + * @link http://php.net/manual/en/function.gzread.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @param int $length

    + * The number of bytes to read. + *

    + * @return string The data that have been read. + * @jms-builtin + */ +function gzread ($zp, $length) {} + +/** + * (PHP 4, PHP 5)
    + * Open gz-file + * @link http://php.net/manual/en/function.gzopen.php + * @param string $filename

    + * The file name. + *

    + * @param string $mode

    + * As in fopen (rb or + * wb) but can also include a compression level + * (wb9) or a strategy: f for + * filtered data as in wb6f, h for + * Huffman only compression as in wb1h. + * (See the description of deflateInit2 + * in zlib.h for + * more information about the strategy parameter.) + *

    + * @param int $use_include_path [optional]

    + * You can set this optional parameter to 1, if you + * want to search for the file in the include_path too. + *

    + * @return resource a file pointer to the file opened, after that, everything you read + * from this file descriptor will be transparently decompressed and what you + * write gets compressed. + *

    + *

    + * If the open fails, the function returns FALSE. + * @jms-builtin + */ +function gzopen ($filename, $mode, $use_include_path = 0) {} + +/** + * (PHP 4, PHP 5)
    + * Output all remaining data on a gz-file pointer + * @link http://php.net/manual/en/function.gzpassthru.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @return int The number of uncompressed characters read from gz + * and passed through to the input, or FALSE on error. + * @jms-builtin + */ +function gzpassthru ($zp) {} + +/** + * (PHP 4, PHP 5)
    + * Seek on a gz-file pointer + * @link http://php.net/manual/en/function.gzseek.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @param int $offset

    + * The seeked offset. + *

    + * @param int $whence [optional]

    + * whence values are: + * SEEK_SET - Set position equal to offset bytes. + * SEEK_CUR - Set position to current location plus offset. + *

    + *

    + * If whence is not specified, it is assumed to be + * SEEK_SET. + *

    + * @return int Upon success, returns 0; otherwise, returns -1. Note that seeking + * past EOF is not considered an error. + * @jms-builtin + */ +function gzseek ($zp, $offset, $whence = 'SEEK_SET') {} + +/** + * (PHP 4, PHP 5)
    + * Tell gz-file pointer read/write position + * @link http://php.net/manual/en/function.gztell.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @return int The position of the file pointer or FALSE if an error occurs. + * @jms-builtin + */ +function gztell ($zp) {} + +/** + * (PHP 4, PHP 5)
    + * Binary-safe gz-file write + * @link http://php.net/manual/en/function.gzwrite.php + * @param resource $zp

    + * The gz-file pointer. It must be valid, and must point to a file + * successfully opened by gzopen. + *

    + * @param string $string

    + * The string to write. + *

    + * @param int $length [optional]

    + * The number of uncompressed bytes to write. If supplied, writing will + * stop after length (uncompressed) bytes have been + * written or the end of string is reached, + * whichever comes first. + *

    + *

    + * Note that if the length argument is given, + * then the magic_quotes_runtime + * configuration option will be ignored and no slashes will be + * stripped from string. + *

    + * @return int the number of (uncompressed) bytes written to the given gz-file + * stream. + * @jms-builtin + */ +function gzwrite ($zp, $string, $length = null) {} + +/** + * (PHP 4, PHP 5)
    + * Alias of gzwrite + * @link http://php.net/manual/en/function.gzputs.php + * @param $fp + * @param $str + * @param $length [optional] + * @jms-builtin + */ +function gzputs ($fp, $str, $length) {} + +/** + * (PHP 4, PHP 5)
    + * Read entire gz-file into an array + * @link http://php.net/manual/en/function.gzfile.php + * @param string $filename

    + * The file name. + *

    + * @param int $use_include_path [optional]

    + * You can set this optional parameter to 1, if you + * want to search for the file in the include_path too. + *

    + * @return array An array containing the file, one line per cell. + * @jms-builtin + */ +function gzfile ($filename, $use_include_path = 0) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
    + * Compress a string + * @link http://php.net/manual/en/function.gzcompress.php + * @param string $data

    + * The data to compress. + *

    + * @param int $level [optional]

    + * The level of compression. Can be given as 0 for no compression up to 9 + * for maximum compression. + *

    + *

    + * If -1 is used, the default compression of the zlib library is used which is 6. + *

    + * @return string The compressed string or FALSE if an error occurred. + * @jms-builtin + */ +function gzcompress ($data, $level = -1) {} + +/** + * (PHP 4 >= 4.0.1, PHP 5)
    + * Uncompress a compressed string + * @link http://php.net/manual/en/function.gzuncompress.php + * @param string $data

    + * The data compressed by gzcompress. + *

    + * @param int $length [optional]

    + * The maximum length of data to decode. + *

    + * @return string The original uncompressed data or FALSE on error. + *

    + *

    + * The function will return an error if the uncompressed data is more than + * 32768 times the length of the compressed input data + * or more than the optional parameter length. + * @jms-builtin + */ +function gzuncompress ($data, $length = 0) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
    + * Deflate a string + * @link http://php.net/manual/en/function.gzdeflate.php + * @param string $data

    + * The data to deflate. + *

    + * @param int $level [optional]

    + * The level of compression. Can be given as 0 for no compression up to 9 + * for maximum compression. If not given, the default compression level will + * be the default compression level of the zlib library. + *

    + * @return string The deflated string or FALSE if an error occurred. + * @jms-builtin + */ +function gzdeflate ($data, $level = -1) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
    + * Inflate a deflated string + * @link http://php.net/manual/en/function.gzinflate.php + * @param string $data

    + * The data compressed by gzdeflate. + *

    + * @param int $length [optional]

    + * The maximum length of data to decode. + *

    + * @return string The original uncompressed data or FALSE on error. + *

    + *

    + * The function will return an error if the uncompressed data is more than + * 32768 times the length of the compressed input data + * or more than the optional parameter length. + * @jms-builtin + */ +function gzinflate ($data, $length = 0) {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
    + * Create a gzip compressed string + * @link http://php.net/manual/en/function.gzencode.php + * @param string $data

    + * The data to encode. + *

    + * @param int $level [optional]

    + * The level of compression. Can be given as 0 for no compression up to 9 + * for maximum compression. If not given, the default compression level will + * be the default compression level of the zlib library. + *

    + * @param int $encoding_mode [optional]

    + * The encoding mode. Can be FORCE_GZIP (the default) + * or FORCE_DEFLATE. + *

    + *

    + * If you use FORCE_DEFLATE, you get a standard zlib + * deflated string (inclusive zlib headers) after the gzip file header but + * without the trailing crc32 checksum. + *

    + * @return string The encoded string, or FALSE if an error occurred. + * @jms-builtin + */ +function gzencode ($data, $level = -1, $encoding_mode = 'FORCE_GZIP') {} + +/** + * (No version information available, might only be in SVN)
    + * Decodes a gzip compressed string + * @link http://php.net/manual/en/function.gzdecode.php + * @param string $data

    + * The data to decode, encoded by gzencode. + *

    + * @param int $length [optional]

    + * The maximum length of data to decode. + *

    + * @return string The decoded string, or FALSE if an error occurred. + * @jms-builtin + */ +function gzdecode ($data, $length = null) {} + +/** + * (PHP 5 >= 5.4.0)
    + * Compress data with the specified encoding + * @link http://php.net/manual/en/function.zlib-encode.php + * @param string $data

    + *

    + * @param string $encoding

    + *

    + * @param string $level [optional]

    + *

    + * @return string + * @jms-builtin + */ +function zlib_encode ($data, $encoding, $level = -1) {} + +/** + * (PHP 5 >= 5.4.0)
    + * Uncompress any raw/gzip/zlib encoded data + * @link http://php.net/manual/en/function.zlib-decode.php + * @param string $data

    + *

    + * @param string $max_decoded_len [optional]

    + *

    + * @return string + * @jms-builtin + */ +function zlib_decode ($data, $max_decoded_len = null) {} + +/** + * (PHP 4 >= 4.3.2, PHP 5)
    + * Returns the coding type used for output compression + * @link http://php.net/manual/en/function.zlib-get-coding-type.php + * @return string Possible return values are gzip, deflate, + * or FALSE. + * @jms-builtin + */ +function zlib_get_coding_type () {} + +/** + * (PHP 4 >= 4.0.4, PHP 5)
    + * ob_start callback function to gzip output buffer + * @link http://php.net/manual/en/function.ob-gzhandler.php + * @param string $buffer + * @param int $mode + * @return string + * @jms-builtin + */ +function ob_gzhandler ($buffer, $mode) {} + +define ('FORCE_GZIP', 31); +define ('FORCE_DEFLATE', 15); +define ('ZLIB_ENCODING_RAW', -15); +define ('ZLIB_ENCODING_GZIP', 31); +define ('ZLIB_ENCODING_DEFLATE', 15); + +// End of zlib v.2.0 +?> diff --git a/res/test_database.sqlite b/res/test_database.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..7567159a445e07544794d3ec1865c012f36aa12d GIT binary patch literal 1096704 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

    ?<{fr6ds?1zbE1CN%(pao}PrC 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 kst7<$0% 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�YlV|qgxItjXFaY1p|sGVqcvE#% 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

    RYv{4jQsz|Fgt<4?tOrxH0Lcj|BD8vKY~065-+C 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 literal 0 HcmV?d00001 diff --git a/src/Scrutinizer/PhpAnalyzer/Analyzer.php b/src/Scrutinizer/PhpAnalyzer/Analyzer.php new file mode 100644 index 0000000..c7844f0 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Analyzer.php @@ -0,0 +1,226 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer; + +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; +use Scrutinizer\PhpAnalyzer\Model\FileCollection; +use Scrutinizer\PhpAnalyzer\Model\PackageVersion; +use Scrutinizer\PhpAnalyzer\Model\Repository\EntityTypeProvider; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; +use Doctrine\ORM\EntityManager; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Pass\CallbackAnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\Pass\ConfigurablePassInterface; +use Scrutinizer\PhpAnalyzer\Pass\RepeatedPass; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Exception\AnalysisFailedException; +use Scrutinizer\PhpAnalyzer\Pass\TypeScanningPass; +use Scrutinizer\PhpAnalyzer\Pass\TypeInferencePass; +use Scrutinizer\PhpAnalyzer\Pass\CallGraphPass; + +class Analyzer +{ + /** @var LoggerInterface */ + public $logger; + + private $passConfig; + private $typeRegistry; + private $baseConfig = array(); + private $pathConfigs = array(); + private $packageVersions = array(); + + public static function create(EntityManager $em, PassConfig $passConfig = null) + { + $typeProvider = new EntityTypeProvider($em); + $typeRegistry = new TypeRegistry($typeProvider); + + return new self($typeRegistry, $passConfig); + } + + public function __construct(TypeRegistry $registry = null, PassConfig $passConfig = null, LoggerInterface $logger = null) + { + $this->passConfig = $passConfig ?: new PassConfig(); + $this->typeRegistry = $registry ?: new TypeRegistry(); + $this->logger = $logger ?: new NullLogger(); + } + + public function getPackageVersions() + { + return $this->packageVersions; + } + + public function setRootPackageVersion(PackageVersion $packageVersion) + { + $versions = array($packageVersion); + + $addDeps = function(PackageVersion $v) use (&$versions, &$addDeps) { + foreach ($v->getDependencies() as $dep) { + if (in_array($dep, $versions, true)) { + continue; + } + + $versions[] = $dep; + $addDeps($dep); + } + }; + $addDeps($packageVersion); + + $this->setPackageVersions($versions); + } + + public function setPackageVersions(array $packageVersions) + { + $this->packageVersions = $packageVersions; + $this->getTypeRegistry()->setPackageVersions($packageVersions); + } + + /** + * The arrays for baseConfig, and pathConfigs are already expected to be + * run through the merging process. + * + * This method will not merge the base config into the path configs anymore. + * However, we will once more resolve these configs using the current pass + * config. This is necessary as the passed configs until now were only run + * through the ConfigProcessor which does not add default values for all + * passes. The additional pass through the PassConfig ensures that each config + * is processed individually. + * + * The base config is required here because if there is no path config that + * matches a given path, then the base config is chosen. + * + * @param array $baseConfig + * @param array $pathConfigs if none are given, the base config is always used + */ + public function setConfigurationValues(array $baseConfig, array $pathConfigs = array()) + { + $this->baseConfig = $this->passConfig->resolveValues($baseConfig); + + $this->pathConfigs = array(); + foreach ($pathConfigs as $k => $values) { + $paths = $values['paths']; + unset($values['paths']); + + $this->pathConfigs[$k] = $this->passConfig->resolveValues($values); + $this->pathConfigs[$k]['paths'] = $paths; + } + } + + public function setLogger(LoggerInterface $logger) + { + $this->logger = $logger; + } + + /** + * Returns the active type registry. + * + * @return TypeRegistry + */ + public function getTypeRegistry() + { + return $this->typeRegistry; + } + + /** + * @return PassConfig + */ + public function getPassConfig() + { + return $this->passConfig; + } + + public function analyze(FileCollection $files) + { + PhpTypeType::setTypeRegistry($this->typeRegistry); + + // If no configuration is given, we run with the default config. + if ( ! $this->baseConfig) { + $this->setConfigurationValues(array()); + } + + foreach ($this->passConfig->getPasses() as $pass) { + $this->logger->debug(sprintf('Running Pass "%s"', get_class($pass))); + $startTime = time(); + $configKey = null; + + if ($pass instanceof ConfigurablePassInterface) { + $configKey = $pass->getConfiguration()->buildTree()->getName(); + } + + if ($pass instanceof AnalyzerAwareInterface) { + $pass->setAnalyzer($this); + } + + // The repeated pass has it's own processing logic which is completely + // independent of the analyzer. + if ($pass instanceof RepeatedPass) { + $pass->analyze($files); + + continue; + } + + if ($pass instanceof CallbackAnalysisPassInterface) { + $pass->beforeAnalysis(); + } + + foreach ($files as $file) { + /** @var $file File */ + + if ($pass instanceof ConfigurablePassInterface) { + $hasPathConfig = false; + foreach ($this->pathConfigs as $pathConfig) { + foreach ($pathConfig['paths'] as $path) { + if (fnmatch($path, $file->getName())) { + $pass->setConfigurationValues($pathConfig[$configKey]); + $hasPathConfig = true; + + break 2; + } + } + } + + if ( ! $hasPathConfig) { + $pass->setConfigurationValues($this->baseConfig[$configKey]); + } + } + + $this->logger->debug(sprintf('Analyzing File "%s"', $file->getName())); + try { + $pass->analyze($file); + } catch (\Exception $ex) { + // There are a few passes where we need to stop when an exception occurs. These are passes which + // are so essential for the following passes that we cannot run any of them if those basic passes + // did not complete successfully. For all other passes, we will simply log the error, and continue + // execution. + if ($pass instanceof TypeScanningPass || $pass instanceof TypeInferencePass || $pass instanceof CallGraphPass) { + throw AnalysisFailedException::fromException($ex, $file); + } + + $this->logger->error('An error occurred during review of "'.$file->getName().'": '.$ex->getMessage(), array('exception' => $ex)); + } + } + + if ($pass instanceof CallbackAnalysisPassInterface) { + $pass->afterAnalysis(); + } + + $this->logger->debug(sprintf('"%s" finished after %.2f minutes.', get_class($pass), (time() - $startTime)/60)); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/AnalyzerAwareInterface.php b/src/Scrutinizer/PhpAnalyzer/AnalyzerAwareInterface.php new file mode 100644 index 0000000..2d66426 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/AnalyzerAwareInterface.php @@ -0,0 +1,29 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer; + +interface AnalyzerAwareInterface +{ + /** + * @param Analyzer $analyzer + * + * @return void + */ + public function setAnalyzer(Analyzer $analyzer); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/ArgumentCheckerInterface.php b/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/ArgumentCheckerInterface.php new file mode 100644 index 0000000..32108b9 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/ArgumentCheckerInterface.php @@ -0,0 +1,51 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ArgumentChecker; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; + +/** + * Interface for method/function call checkers. + * + * @author Johannes M. Schmitt + */ +interface ArgumentCheckerInterface +{ + /** + * Returns the missing arguments for the given function/method call. + * + * @param AbstractFunction $function The function/method that is being called. + * @param \PHPParser_Node_Arg[] $args The given arguments. + * + * @return string[] The names of the parameters that are missing. + */ + public function getMissingArguments(AbstractFunction $function, array $args, MethodContainer $clazz = null); + + /** + * Returns an associative array of parameter names mapped to expected types. + * + * @param AbstractFunction $function The called function/method. + * @param PhpType[] $argTypes The passed types. + * + * @return array + */ + public function getMismatchedArgumentTypes(AbstractFunction $function, array $argTypes, MethodContainer $clazz = null); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/ChainableArgumentChecker.php b/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/ChainableArgumentChecker.php new file mode 100644 index 0000000..cca3559 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/ChainableArgumentChecker.php @@ -0,0 +1,78 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ArgumentChecker; + +/** + * Allows to chain several checkers. + * + * @author Johannes M. Schmitt + */ +abstract class ChainableArgumentChecker implements ArgumentCheckerInterface +{ + protected $registry; + protected $typeChecker; + + /** @var ChainableArgumentChecker */ + private $first; + + /** @var ChainableArgumentChecker */ + private $next; + + public function __construct(\Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry $registry, \Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeChecker $typeChecker) + { + $this->registry = $registry; + $this->typeChecker = $typeChecker; + $this->first = $this; + } + + public final function append(ChainableArgumentChecker $checker) + { + if (null !== $this->next) { + $this->next->append($checker); + + return; + } + + $this->next = $checker; + $checker->first = $this; + } + + protected final function first() + { + return $this->first; + } + + protected final function nextGetMissingArguments(\Scrutinizer\PhpAnalyzer\Model\AbstractFunction $function, array $args, \Scrutinizer\PhpAnalyzer\Model\MethodContainer $clazz = null) + { + if (null === $this->next) { + return array(); + } + + return $this->next->getMissingArguments($function, $args, $clazz); + } + + protected final function nextGetMismatchedArgumentTypes(\Scrutinizer\PhpAnalyzer\Model\AbstractFunction $function, array $types, \Scrutinizer\PhpAnalyzer\Model\MethodContainer $clazz = null) + { + if (null === $this->next) { + return array(); + } + + return $this->next->getMismatchedArgumentTypes($function, $types, $clazz); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/DefaultArgumentChecker.php b/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/DefaultArgumentChecker.php new file mode 100644 index 0000000..9a99dbf --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/DefaultArgumentChecker.php @@ -0,0 +1,71 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ArgumentChecker; + +use Scrutinizer\PhpAnalyzer\Model\Parameter; + +/** + * Default checker which uses the basic semantics of the PHP language. + * + * @author Johannes M. Schmitt + */ +class DefaultArgumentChecker extends ChainableArgumentChecker +{ + public function getMissingArguments(\Scrutinizer\PhpAnalyzer\Model\AbstractFunction $function, array $args, \Scrutinizer\PhpAnalyzer\Model\MethodContainer $clazz = null) + { + if ($function->hasVariableParameters()) { + return $this->nextGetMissingArguments($function, $args); + } + + $missingArgs = array(); + foreach ($function->getParameters() as $param) { + /** @var $param Parameter */ + + if ( ! isset($args[$index = $param->getIndex()]) && ! $param->isOptional()) { + $missingArgs[$index] = $param->getName(); + } + } + + return $missingArgs; + } + + public function getMismatchedArgumentTypes(\Scrutinizer\PhpAnalyzer\Model\AbstractFunction $function, array $argTypes, \Scrutinizer\PhpAnalyzer\Model\MethodContainer $clazz = null) + { + if ($function->hasVariableParameters()) { + return $this->nextGetMismatchedArgumentTypes($function, $argTypes); + } + + $mismatchedTypes = array(); + foreach ($function->getParameters() as $param) { + /** @var $param Parameter */ + + $index = $param->getIndex(); + + if ( ! isset($argTypes[$index])) { + continue; + } + + if ( ! $this->typeChecker->mayBePassed($param->getPhpType(), $argTypes[$index])) { + $mismatchedTypes[$index] = $param->getPhpType(); + } + } + + return $mismatchedTypes; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/OverloadedCoreFunctionChecker.php b/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/OverloadedCoreFunctionChecker.php new file mode 100644 index 0000000..1179beb --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/OverloadedCoreFunctionChecker.php @@ -0,0 +1,105 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ArgumentChecker; + +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; + +/** + * Checker which is aware of the behavior of some of PHP's core functions. + * + * @author Johannes M. Schmitt + */ +class OverloadedCoreFunctionChecker extends ChainableArgumentChecker +{ + public function getMissingArguments(AbstractFunction $function, array $args, MethodContainer $clazz = null) + { + if ( ! $function instanceof GlobalFunction) { + return $this->nextGetMissingArguments($function, $args, $clazz); + } + + switch ($function->getName()) { + case 'array_udiff_assoc': + case 'array_udiff': + case 'array_uintersect_assoc': + case 'array_uintersect': + return array_slice(array('array1', 'array2', 'data_compare_func'), count($args)); + + case 'array_udiff_uassoc': + case 'array_uintersect_uassoc': + return array_slice(array('array1', 'array2', 'data_compare_func', 'key_compare_func'), count($args)); + + default: + return $this->nextGetMissingArguments($function, $args, $clazz); + } + } + + public function getMismatchedArgumentTypes(AbstractFunction $function, array $argTypes, MethodContainer $clazz = null) + { + if ( ! $function instanceof GlobalFunction) { + return $this->nextGetMismatchedArgumentTypes($function, $argTypes, $clazz); + } + + $expectedTypes = array(); + switch (strtolower($function->getName())) { + case 'array_udiff_assoc': + case 'array_udiff': + case 'array_uintersect_assoc': + case 'array_uintersect': + // If less than three arguments are passed, then there is some parameter + // missing. An error for this has already been raised, so just bail out here. + if (count($argTypes) < 3) { + return array(); + } + + $expectedTypes = array_fill(0, count($argTypes) - 1, $this->registry->getNativeType('array')); + $expectedTypes[] = $this->registry->getNativeType('callable'); + break; + + case 'array_udiff_uassoc': + case 'array_uintersect_uassoc': + // Same as above, an error has already been raised in this case. + if (count($argTypes) < 4) { + return array(); + } + + $expectedTypes = array_fill(0, count($argTypes) - 2, $this->registry->getNativeType('array')); + $expectedTypes[] = $this->registry->getNativeType('callable'); + $expectedTypes[] = $this->registry->getNativeType('callable'); + break; + + default: + return $this->nextGetMismatchedArgumentTypes($function, $argTypes, $clazz); + } + + $mismatchedTypes = array(); + foreach ($expectedTypes as $i => $expectedType) { + if ( ! isset($argTypes[$i])) { + throw new \LogicException(sprintf('There is no actual type at index "%d".', $i)); + } + + if ( ! $this->typeChecker->mayBePassed($expectedType, $argTypes[$i])) { + $mismatchedTypes[$i] = $expectedType; + } + } + + return $mismatchedTypes; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/PhpUnitAssertionChecker.php b/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/PhpUnitAssertionChecker.php new file mode 100644 index 0000000..8b39d44 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ArgumentChecker/PhpUnitAssertionChecker.php @@ -0,0 +1,63 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ArgumentChecker; + +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\Method; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; + +/** + * PhpUnit Assertion Checker + * + * This checker basically skips all arguments checks for any of PHPUnit's + * assertion functions. There are two reasons for skipping assertions: + * + * 1. Currently, we perform no reverse interpretation of assertion functions. As + * a result, we frequently get false-positives in tests. + * + * 2. Assertion arguments do no need to be checked anyway, as they should be + * executed on each run of the test suite and their calls should be save + * except from maybe a few edge cases which are negligible for now. + * + * @author Johannes M. Schmitt + */ +class PhpUnitAssertionChecker extends ChainableArgumentChecker +{ + public function getMissingArguments(AbstractFunction $function, array $args, MethodContainer $clazz = null) + { + return $this->nextGetMissingArguments($function, $args, $clazz); + } + + public function getMismatchedArgumentTypes(AbstractFunction $function, array $argTypes, MethodContainer $clazz = null) + { + if (null === $clazz || ! $function instanceof Method) { + return $this->nextGetMismatchedArgumentTypes($function, $argTypes, $clazz); + } + + if ( ! $clazz->isSubtypeOf($this->registry->getClassOrCreate('PHPUnit_Framework_TestCase'))) { + return $this->nextGetMismatchedArgumentTypes($function, $argTypes, $clazz); + } + + if (0 !== stripos($function->getName(), 'assert')) { + return $this->nextGetMismatchedArgumentTypes($function, $argTypes, $clazz); + } + + return array(); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/CliApp.php b/src/Scrutinizer/PhpAnalyzer/CliApp.php new file mode 100644 index 0000000..2856821 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/CliApp.php @@ -0,0 +1,35 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer; + +use Scrutinizer\PhpAnalyzer\Command\BuildTestDatabaseCommand; +use Scrutinizer\PhpAnalyzer\Command\RunCommand; +use Symfony\Component\Console\Application; + +class CliApp extends Application +{ + protected function getDefaultCommands() + { + $commands = parent::getDefaultCommands(); + $commands[] = new BuildTestDatabaseCommand(); + $commands[] = new RunCommand(); + + return $commands; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php new file mode 100644 index 0000000..bf400bf --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php @@ -0,0 +1,66 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Command; + +use Doctrine\ORM\Tools\SchemaTool; +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\Model\Package; +use Scrutinizer\PhpAnalyzer\Model\PackageScanner; +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Util\TestUtils; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +class BuildTestDatabaseCommand extends Command +{ + protected function configure() + { + $this + ->setName('build-test-database') + ->setDescription('Builds the test database.') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + if (is_file($dbFile = __DIR__.'/../../../../res/test_database.sqlite')) { + unlink($dbFile); + } + + $em = TestUtils::createTestEntityManager(); + $tool = new SchemaTool($em); + $tool->createSchema($em->getMetadataFactory()->getAllMetadata()); + + $analyzer = Analyzer::create($em, PassConfig::createForTypeScanning()); + $packageScanner = new PackageScanner($analyzer); + + $output->write('Scanning PHP 5.3 files... '); + $package = new Package('PHP'); + $packageVersion = $package->createVersion('5.3'); + $packageVersion->setUuid(uniqid(mt_rand(), true)); + $packageScanner->scanDirectory($packageVersion, __DIR__.'/../res/php-5.3-core-api'); + $output->writeln('Done'); + + $output->write('Persisting PHP 5.3 files... '); + $em->persist($package); + $em->flush(); + $output->writeln('Done'); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Command/OutputLogger.php b/src/Scrutinizer/PhpAnalyzer/Command/OutputLogger.php new file mode 100644 index 0000000..2d167e9 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Command/OutputLogger.php @@ -0,0 +1,43 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Command; + +use Psr\Log\AbstractLogger; +use Symfony\Component\Console\Output\OutputInterface; + +class OutputLogger extends AbstractLogger +{ + private $output; + private $verbose; + + public function __construct(OutputInterface $output, $verbose) + { + $this->output = $output; + $this->verbose = $verbose; + } + + public function log($level, $message, array $context = array()) + { + if ($level === 'debug' && ! $this->verbose) { + return; + } + + $this->output->writeln($message); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php new file mode 100644 index 0000000..f37166e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -0,0 +1,86 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Command; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\FileCollection; +use Scrutinizer\PhpAnalyzer\Util\TestUtils; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +class RunCommand extends Command +{ + protected function configure() + { + $this + ->setName('run') + ->setDescription('Runs the PHP Analyzer on source code.') + ->addArgument('dir', InputArgument::REQUIRED, 'The directory to scan.') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $dir = $input->getArgument('dir'); + if ( ! is_dir($dir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist.', $dir)); + } + $dir = realpath($dir); + + $output->writeln('Caution: This command is currently only designed for small libraries; it might be slow and/or memory expensive to analyze bigger libraries.'); + + $output->write('Scanning directory... '); + $files = FileCollection::createFromDirectory($dir); + $output->writeln(sprintf('found %d files', count($files))); + + $output->writeln('Starting analysis...'); + $analyzer = Analyzer::create(TestUtils::createTestEntityManager()); + $analyzer->setLogger(new OutputLogger($output, $input->getOption('verbose'))); + $analyzer->analyze($files); + $output->writeln('---------------------------------------------'); + $output->writeln(''); + + foreach ($files as $file) { + /** @var $file File */ + + if ( ! $file->hasComments()) { + continue; + } + + $output->writeln(''); + $output->writeln($file->getName()); + $output->writeln(str_repeat('=', strlen($file->getName()))); + + $comments = $file->getComments(); + ksort($comments); + + foreach ($comments as $line => $lineComments) { + foreach ($lineComments as $comment) { + $output->writeln('Line '.$line.': '.$comment); + } + } + } + + $output->writeln(''); + $output->writeln('Done'); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Config/ArrayNodeDefinition.php b/src/Scrutinizer/PhpAnalyzer/Config/ArrayNodeDefinition.php new file mode 100644 index 0000000..7bb2a2b --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Config/ArrayNodeDefinition.php @@ -0,0 +1,58 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Config; + +use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition as BaseArrayNodeDefinition; + +class ArrayNodeDefinition extends BaseArrayNodeDefinition +{ + public function canBeEnabled() + { + $this + ->treatFalseLike(array('enabled' => false)) + ->treatNullLike(array('enabled' => true)) + ->treatTrueLike(array('enabled' => true)) + ->children() + ->booleanNode('enabled') + ->defaultFalse() + ->attribute('label', 'Enabled') + ->end() + ->end() + ; + + return $this; + } + + public function canBeDisabled() + { + $this + ->treatFalseLike(array('enabled' => false)) + ->treatNullLike(array('enabled' => true)) + ->treatTrueLike(array('enabled' => true)) + ->children() + ->booleanNode('enabled') + ->defaultTrue() + ->attribute('label', 'Enabled') + ->end() + ->end() + ; + + return $this; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Config/NodeBuilder.php b/src/Scrutinizer/PhpAnalyzer/Config/NodeBuilder.php new file mode 100644 index 0000000..1ee0b88 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Config/NodeBuilder.php @@ -0,0 +1,31 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Config; + +use Symfony\Component\Config\Definition\Builder\NodeBuilder as DefaultNodeBuilder; + +class NodeBuilder extends DefaultNodeBuilder +{ + public function __construct() + { + parent::__construct(); + + $this->nodeMapping['array'] = 'Scrutinizer\PhpAnalyzer\Config\ArrayNodeDefinition'; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowAnalysis.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowAnalysis.php new file mode 100644 index 0000000..c441f0f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowAnalysis.php @@ -0,0 +1,819 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ControlFlow; + +use JMS\PhpManipulator\PhpParser\BlockNode; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\Traversal\CallbackInterface; + +/** + * Creates the control flow graph for PHP code. + * + * The graph is computed in a single pass without performing inter-procedural flow analysis. + * + * @author Johannes M. Schmitt + */ +class ControlFlowAnalysis implements CallbackInterface +{ + /** @var ControlFlowGraph */ + private $graph; + + /** @var integer */ + private $astPositionCounter; + + /** @var integer */ + private $priorityCounter; + + /** @var \PHPParser_Node */ + private $root; + + /** @var \SplStack<\PHPParser_Node> */ + private $exceptionHandlers; + + /** + * Computes the control flow graph starting at the given root node. + * + * @param \PHPParser_Node $node + * + * @return ControlFlowGraph + */ + public static function computeGraph(\PHPParser_Node $node) + { + $cfa = new self(); + $cfa->process($node); + + return $cfa->getGraph(); + } + + /** + * Computes the fall-through node for the given node. + * + * Most of the time, this will equal the given node itself. Notable exceptions are + * FOR, and DO nodes. + * + * @return \PHPParser_Node + */ + private static function computeFallThrough(\PHPParser_Node $node) { + if ($node instanceof \PHPParser_Node_Stmt_For && $node->init) { + return self::computeFallThrough($node->init[0]); + } + + if ($node instanceof \PHPParser_Node_Stmt_Do) { + return self::computeFallThrough($node->stmts); + } + + return $node; + } + + public function getGraph() + { + return $this->graph; + } + + public function process(\PHPParser_Node $root) + { + $this->root = $root; + $this->astPositionCounter = 0; + $this->exceptionHandlers = new \SplStack(); + + $this->graph = new ControlFlowGraph(self::computeFallThrough($root)); + NodeTraversal::traverseWithCallback($root, $this); + + $this->assignPriorities(); + } + + /** + * This method will stop traversal depending on the parent node. + * + * Principally, we are only interested in adding edges between nodes that change control flow. Notable ones are + * loops (WHILE, FOR, etc.) and IF-ELSE statements; other statements typically transfer control to their next sibling. + * + * With regard to expression trees, we currently do not perform any sort of control flow within them, even if there + * are short circuiting operators or conditionals. Instead, we synthesize lattices up when performing data flow + * analysis by finding the meet at each expression node. + * + * @param NodeTraversal $t + * @param \PHPParser_Node $node + * @param \PHPParser_Node $parent + * + * @return boolean + */ + public function shouldTraverse(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + $node->setAttribute('position', $this->astPositionCounter++); + + if ($node instanceof \PHPParser_Node_Stmt_TryCatch) { + $this->exceptionHandlers->push($node); + + return true; + } + + if (null !== $parent) { + // Do not traverse into classes, interfaces, or traits as control flow never gets passed in. + if (NodeUtil::isMethodContainer($parent)) { + return false; + } + + // Generally, the above also applies to closures except when they are the scope's root. + if (NodeUtil::isScopeCreator($parent) && $parent !== $this->root) { + return false; + } + + // Skip conditions. + if ($parent instanceof \PHPParser_Node_Stmt_For || $parent instanceof \PHPParser_Node_Stmt_Foreach) { + return $parent->stmts === $node; + } + + // Skip conditions. + if ($parent instanceof \PHPParser_Node_Stmt_If + || $parent instanceof \PHPParser_Node_Stmt_ElseIf + || $parent instanceof \PHPParser_Node_Stmt_While + || $parent instanceof \PHPParser_Node_Stmt_Do + || $parent instanceof \PHPParser_Node_Stmt_Switch + || $parent instanceof \PHPParser_Node_Stmt_Case) { + return $parent->cond !== $node; + } + + // Skip exception type. + if ($parent instanceof \PHPParser_Node_Stmt_Catch) { + return $parent->stmts === $node; + } + + // Skip expressions, see above. + if ($parent instanceof \PHPParser_Node_Expr && ! $parent instanceof \PHPParser_Node_Expr_Closure) { + return false; + } + + if ($parent instanceof \PHPParser_Node_Stmt_Continue + || $parent instanceof \PHPParser_Node_Stmt_Break + || $parent instanceof \PHPParser_Node_Stmt_Return + || $parent instanceof \PHPParser_Node_Stmt_Echo + || $parent instanceof \PHPParser_Node_Stmt_Use + || $parent instanceof \PHPParser_Node_Stmt_Unset + || $parent instanceof \PHPParser_Node_Stmt_Declare + || $parent instanceof \PHPParser_Node_Stmt_Global + || $parent instanceof \PHPParser_Node_Stmt_Static + || $parent instanceof \PHPParser_Node_Stmt_StaticVar + || $parent instanceof \PHPParser_Node_Stmt_Throw) { + return false; + } + + // Skip parameters. + if (NodeUtil::isScopeCreator($parent) && $node !== $parent->stmts) { + return false; + } + + // If we are reaching the CATCH, or FINALLY node, they current exception handler cannot catch anymore + // exceptions, and we therefore can remove it. + // TODO: Add Support for FINALLY (PHP 5.5) + if ($parent instanceof \PHPParser_Node_Stmt_TryCatch && $parent->catches[0] === $node + && $parent === $this->exceptionHandlers->top()) { + $this->exceptionHandlers->pop(); + } + } + + return true; + } + + private function assignPriorities() + { + $this->priorityCounter = 0; + $entry = $this->graph->getEntryPoint(); + $this->prioritizeFromEntryNode($entry); + + // At this point, all reachable nodes have been given a priority. There might still unreachable nodes which do + // not yet have been assigned a priority. Presumably, it does not matter anyway what priority they get since + // should not happen in real code. + foreach ($nodes = $this->graph->getNodes() as $astNode) { + /** @var $candidate GraphNode */ + $candidate = $nodes[$astNode]; + if (null !== $candidate->getAttribute('priority')) { + continue; + } + + $candidate->setAttribute('priority', ++$this->priorityCounter); + } + + // The implicit return is always last. + $this->graph->getImplicitReturn()->setAttribute('priority', ++$this->priorityCounter); + } + + private function prioritizeFromEntryNode(GraphNode $entry) + { + $worklist = array(); + $worklist[] = array($entry, $entry->getAstNode()->getAttribute('position', 0)); + + while ( ! empty($worklist)) { + list($current,) = array_shift($worklist); + /** @var $current GraphNode */ + + if (null !== $current->getAttribute('priority')) { + continue; + } + + $current->setAttribute('priority', ++$this->priorityCounter); + foreach ($current->getOutEdges() as $edge) { + /** @var $edge GraphEdge */ + $destNode = $edge->getDest(); + + // Implicit return is always the last node. + if ($this->graph->isImplicitReturn($destNode)) { + $position = $this->astPositionCounter + 1; + } else { + $position = $destNode->getAstNode()->getAttribute('position'); + if (null === $position) { + throw new \RuntimeException(NodeUtil::getStringRepr($destNode->getAstNode()).' has no position.'); + } + } + + $worklist[] = array($destNode, $position); + } + + usort($worklist, function($a, $b) { + return $a[1] - $b[1]; + }); + } + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + switch (true) { + case NodeUtil::isScopeCreator($node): + $this->handleScopeCreator($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Namespace: + $this->handleNamespace($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_If: + $this->handleIf($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Else: + case $node instanceof \PHPParser_Node_Stmt_ElseIf: + // these are already handled by the IF statement + return; + + case $node instanceof \PHPParser_Node_Stmt_While: + $this->handleWhile($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Do: + $this->handleDo($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_For: + $this->handleFor($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Foreach: + $this->handleForeach($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Switch: + $this->handleSwitch($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Case: + $this->handleCase($node); + break; + + case $node instanceof BlockNode: + $this->handleStmtList($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Throw: + $this->handleThrow($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_TryCatch: + $this->handleTryCatch($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Catch: + $this->handleCatch($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Break: + $this->handleBreak($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Continue: + $this->handleContinue($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Return: + $this->handleReturn($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Goto: + $this->handleGoto($node); + break; + + case $node instanceof \PHPParser_Node_Stmt: + $this->handleStmt($node); + break; + + case $node instanceof \PHPParser_Node_Expr_Exit: + $this->handleExit($node); + break; + + case $node instanceof \PHPParser_Node_Expr: + $this->handleExpr($node); + break; + } + } + + private function handleExit(\PHPParser_Node_Expr_Exit $node) + { + $this->graph->connectToImplicitReturn($node, GraphEdge::TYPE_UNCOND); + } + + private function handleExpr(\PHPParser_Node_Expr $node) + { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $this->computeFollowNode($node)); + $this->connectToPossibleExceptionHandler($node, $node); + } + + private function handleNamespace(\PHPParser_Node_Stmt_Namespace $node) + { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $node->stmts); + } + + private function handleScopeCreator(\PHPParser_node $node) + { + // Go to next sibling unless the node is the scope's root. + if ($node !== $this->root) { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $this->computeFollowNode($node)); + + return; + } + + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $node->stmts); + } + + private function handleGoto(\PHPParser_Node_Stmt_Goto $node) + { + $parent = $node->getAttribute('parent'); + + while ( ! NodeUtil::isScopeCreator($parent)) { + $newParent = $parent->getAttribute('parent'); + if (null === $newParent) { + break; + } + + $parent = $newParent; + } + + $nodes = \PHPParser_Finder::create(array($parent))->find('Stmt_Label[name='.$node->name.']'); + if (!$nodes) { + return; + } + + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $nodes[0]); + } + + private function handleStmtList(BlockNode $node) + { + foreach ($node as $child) { + if ($child instanceof \PHPParser_Node) { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, self::computeFallThrough($child)); + + return; + } + } + + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $this->computeFollowNode($node)); + } + + private function handleStmt(\PHPParser_Node $node) + { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $this->computeFollowNode($node)); + $this->connectToPossibleExceptionHandler($node, $node); + } + + private function handleTryCatch(\PHPParser_Node_Stmt_TryCatch $node) + { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, self::computeFallThrough($node->stmts)); + + for ($i=0,$c=count($node->catches); $i<$c; $i++) { + $isLast = $i+1 === $c; + + if ($isLast) { + if (false === $this->exceptionHandlers->isEmpty()) { + $this->graph->connectIfNotConnected($node->catches[$i], GraphEdge::TYPE_ON_FALSE, $this->exceptionHandlers->top()->catches[0]); + } + + continue; + } + + $this->graph->connectIfNotConnected($node->catches[$i], GraphEdge::TYPE_ON_FALSE, $node->catches[$i+1]); + } + } + + private function handleCatch(\PHPParser_Node_Stmt_Catch $node) + { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_TRUE, self::computeFallThrough($node->stmts)); + } + + private function handleBreak(\PHPParser_Node_Stmt_Break $node) + { + if (null === $parent = $this->findContinueOrBreakTarget($node)) { + // The BREAK target was not found. This normally indicates some sort of error, but + // could also mean that the number of break levels was dynamic (on some versions of PHP). + return; + } + + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $this->computeFollowNode($parent)); + } + + private function handleContinue(\PHPParser_Node_Stmt_Continue $node) + { + if (null === $parent = $this->findContinueOrBreakTarget($node)) { + // Same as as for BREAK, see above. + return; + } + + if ($parent instanceof \PHPParser_Node_Stmt_For && $parent->loop) { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $parent->loop[0]); + + return; + } + + // continue has the same effect like break on a SWITCH statement. + if ($parent instanceof \PHPParser_Node_Stmt_Switch) { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $this->computeFollowNode($parent)); + + return; + } + + // By default, just connect to the parent which will handle the continuing flow. + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $parent); + } + + private function findContinueOrBreakTarget(\PHPParser_Node $node) + { + if (null !== $node->num && !$node->num instanceof \PHPParser_Node_Scalar_LNumber) { + return null; + } + + // Continously look up the ancestor tree for the BREAK target, and connect to it. + $curNb = 0; + $num = null === $node->num ? 1 : $node->num->value; + if (0 === $num) { + $num = 1; + } + + $parent = $node->getAttribute('parent'); + while (null !== $parent) { + if ($parent instanceof \PHPParser_Node_Stmt_For + || $parent instanceof \PHPParser_Node_Stmt_Foreach + || $parent instanceof \PHPParser_Node_Stmt_While + || $parent instanceof \PHPParser_Node_Stmt_Do + || $parent instanceof \PHPParser_Node_Stmt_Switch) { + $curNb += 1; + + if ($curNb >= $num) { + break; + } + } + + $parent = $parent->getAttribute('parent'); + } + + return $parent; + } + + private function handleReturn(\PHPParser_Node_Stmt_Return $node) + { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, null); + + if ($node->expr) { + $this->connectToPossibleExceptionHandler($node, $node->expr); + } + } + + private function handleThrow(\PHPParser_Node_Stmt_Throw $node) + { + $this->connectToPossibleExceptionHandler($node, $node); + } + + private function handleSwitch(\PHPParser_Node_Stmt_Switch $node) + { + // Transfer to the first non-DEFAULT CASE. If there are none, transfer + // to the DEFAULT. + if ($node->cases) { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $node->cases[0]); + } else { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, $this->computeFollowNode($node)); + } + + $this->connectToPossibleExceptionHandler($node, $node->cond); + } + + private function handleCase(\PHPParser_Node_Stmt_Case $node) + { + if (null !== $node->cond) { + // Case is a bit tricky... First it goes into the body if condition is true. + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_TRUE, $node->stmts); + + // Look for the next CASE + $next = $node->getAttribute('next'); + while (null !== $next && !$next instanceof \PHPParser_Node_Stmt_Case) { + $next = $next->getAttribute('next'); + } + + if (null !== $next) { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_FALSE, $next); + } else { // No more cases, and no default found; go to the follow of SWITCH + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_FALSE, $this->computeFollowNode($node)); + } + + $this->connectToPossibleExceptionHandler($node, $node->cond); + + return; + } + + // DEFAULT CASE + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_UNCOND, self::computeFallThrough($node->stmts)); + } + + /** + * Handles a for (init; cond; iter) { body } + * + * @param \PHPParser_Node_Stmt_For $node + */ + private function handleFor(\PHPParser_Node_Stmt_For $node) + { + if ($node->init) { + // After initialization, we transfer to the FOR which is in charge of + // checking the condition (for the first time). + for ($i=0, $c=count($node->init); $i<$c; $i++) { + if ($i+1 === $c) { // The last init condition is connected to the FOR loop. + $this->graph->connectIfNotConnected($node->init[$i], GraphEdge::TYPE_UNCOND, $node); + } else { + $this->graph->connectIfNotConnected($node->init[$i], GraphEdge::TYPE_UNCOND, $node->init[$i+1]); + } + + $this->connectToPossibleExceptionHandler($node->init[$i], $node->init[$i]); + } + } + + // The edge that transfer control to the beginning of the loop body. + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_TRUE, self::computeFallThrough($node->stmts)); + + // the edge to the end of the loop. + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_FALSE, $this->computeFollowNode($node)); + + if ($node->loop) { + // The end of the body will have a unconditional branch to our iter + // (handled by calling computeFollowNode of the last instruction of the body. Our iter will jump to the forNode + // again to another condition check.) + $this->graph->connectIfNotConnected($node->loop[0], GraphEdge::TYPE_UNCOND, $node); + + foreach ($node->loop as $loop) { + $this->connectToPossibleExceptionHandler($loop, $loop); + } + } + + foreach ($node->cond as $cond) { + $this->connectToPossibleExceptionHandler($node, $cond); + } + } + + private function handleForeach(\PHPParser_Node_Stmt_Foreach $node) + { + // The edge that transfer control to the beginning of the loop body. + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_TRUE, self::computeFallThrough($node->stmts)); + + // the edge to the end of the loop + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_FALSE, $this->computeFollowNode($node)); + + $this->connectToPossibleExceptionHandler($node, $node->expr); + } + + private function handleWhile(\PHPParser_Node_Stmt_While $node) + { + // Control goes to the first statement if the condition evaluates to true. + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_TRUE, self::computeFallThrough($node->stmts)); + + // Control goes to the following node if the condition evaluates to false. + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_FALSE, $this->computeFollowNode($node)); + $this->connectToPossibleExceptionHandler($node, $node->cond); + } + + private function handleDo(\PHPParser_Node_Stmt_Do $node) + { + // The first edge can be the initial iteration as well as the iterations after. + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_TRUE, self::computeFallThrough($node->stmts)); + + // the edge that leaves the do loop if the condition fails. + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_FALSE, $this->computeFollowNode($node)); + $this->connectToPossibleExceptionHandler($node, $node->cond); + } + + private function handleIf(\PHPParser_Node_Stmt_If $node) + { + $this->graph->connectIfNotConnected($node, GraphEdge::TYPE_ON_TRUE, self::computeFallThrough($node->stmts)); + + $lastIf = $node; + + if ($node->elseifs) { + foreach ($node->elseifs as $elseIf) { + $this->graph->connectIfNotConnected($lastIf, GraphEdge::TYPE_ON_FALSE, $elseIf); + $this->graph->connectIfNotConnected($elseIf, GraphEdge::TYPE_ON_TRUE, self::computeFallThrough($elseIf->stmts)); + $lastIf = $elseIf; + } + } + + if (null === $node->else) { + $this->graph->connectIfNotConnected($lastIf, GraphEdge::TYPE_ON_FALSE, $this->computeFollowNode($node)); + } else { + $this->graph->connectIfNotConnected($lastIf, GraphEdge::TYPE_ON_FALSE, self::computeFallThrough($node->else->stmts)); + } + + $this->connectToPossibleExceptionHandler($node, $node->cond); + } + + /** + * Determines if the subtree might throw an exception. + * + * @return boolean + */ + public static function mayThrowException(\PHPParser_Node $node = null) + { + if (null === $node) { + return false; + } + + // TODO: This list is probably incomplete + if ($node instanceof \PHPParser_Node_Expr_StaticCall + || $node instanceof \PHPParser_Node_Expr_FuncCall + || $node instanceof \PHPParser_Node_Expr_MethodCall + || $node instanceof \PHPParser_Node_Expr_New + || $node instanceof \PHPParser_Node_Stmt_Throw + || $node instanceof \PHPParser_Node_Expr_Include + || $node instanceof \PHPParser_Node_Expr_Clone) { + return true; + } + + if ($node instanceof \PHPParser_Node_Expr_Closure) { + return false; + } + + if ($node instanceof \PHPParser_Node_Expr_Array) { + foreach ($node->items as $item) { + if (self::mayThrowException($item->key) || self::mayThrowException($item->value)) { + return true; + } + } + + return false; + } + + foreach ($node as $subNode) { + if (!$subNode instanceof \PHPParser_Node) { + continue; + } + + if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + if (!$aSubNode instanceof \PHPParser_Node) { + continue; + } + + if (self::mayThrowException($aSubNode)) { + return true; + } + } + + continue; + } + + if (self::mayThrowException($subNode)) { + return true; + } + } + + return false; + } + + private function connectToPossibleExceptionHandler(\PHPParser_Node $cfgNode, \PHPParser_Node $target) { + if (!self::mayThrowException($target)) { + return; + } + + if ($this->exceptionHandlers->isEmpty()) { + return; + } + + foreach ($this->exceptionHandlers as $handler) { + assert($handler instanceof \PHPParser_Node_Stmt_TryCatch); + + $catches = $handler->catches; + $this->graph->connectIfNotConnected($cfgNode, GraphEdge::TYPE_ON_EX, $catches[0]); + break; + } + } + + /** + * @param \PHPParser_Node $fromNode The original source node + * @param \PHPParser_Node $node The node for which follow should be computed + */ + private function computeFollowNode(\PHPParser_Node $fromNode, \PHPParser_Node $node = null) + { + if (null === $node) { + $node = $fromNode; + } + + /* + * This is the case where: + * + * 1. Parent is null implies that we are transferring control to the end of + * the script. + * + * 2. Parent is a function implies that we are transferring control back to + * the caller of the function. + * + * 3. If the node is a return statement, we should also transfer control + * back to the caller of the function. + * + * 4. If the node is root then we have reached the end of what we have been + * asked to traverse. + * + * In all cases we should transfer control to a "symbolic return" node. + * This will make life easier for DFAs. + */ + $parent = $node->getAttribute('parent'); + if (null === $parent + || $parent instanceof \PHPParser_Node_Stmt_ClassMethod + || $parent instanceof \PHPParser_Node_Stmt_Function + || $parent instanceof \PHPParser_Node_Expr_Closure + || $node === $this->root) { + return null; + } + + // If we are just before a IF/WHILE/DO/FOR: + switch (true) { + // The follow() of any of the path from IF would be what follows IF. + case $parent instanceof \PHPParser_Node_Stmt_If: + return $this->computeFollowNode($fromNode, $parent); + + case $parent instanceof \PHPParser_Node_Stmt_Case: + // After the body of a CASE, the control goes to the body of the next + // CASE, without having to go to the next CASE condition. + $next = $parent->getAttribute('next'); + while (null !== $next && !$next instanceof \PHPParser_Node_Stmt_Case) { + $next = $next->getAttribute('next'); + } + + if (null !== $next) { + return $next->stmts; + } + + return $this->computeFollowNode($fromNode, $parent); + + case $parent instanceof \PHPParser_Node_Stmt_Foreach: + case $parent instanceof \PHPParser_Node_Stmt_While: + case $parent instanceof \PHPParser_Node_Stmt_Do: + return $parent; + + case $parent instanceof \PHPParser_Node_Stmt_For: + if ($parent->loop) { + return $parent->loop[0]; + } + + return $this->computeFollowNode($fromNode, $parent); + + // TODO: Add support fo FINALLY. + case $parent instanceof \PHPParser_Node_Stmt_TryCatch: + return $this->computeFollowNode($fromNode, $parent); + } + + $nextSibling = $node->getAttribute('next'); + if (null !== $nextSibling) { + return self::computeFallThrough($nextSibling); + } + + // If there are no more siblings, control is transfered up the AST. + return $this->computeFollowNode($fromNode, $parent); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowGraph.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowGraph.php new file mode 100644 index 0000000..748893f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowGraph.php @@ -0,0 +1,205 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ControlFlow; + +use JMS\PhpManipulator\PhpParser\BlockNode; + +class ControlFlowGraph +{ + /** + * Node used to mark an implicit return when control is transferred outside the scope of this graph. + * + * @var GraphNode + */ + private $implicitReturn; + private $entryPoint; + + /** + * @var \SplObjectStorage + */ + private $nodes; + + /** + * @param object $entryPoint + */ + public function __construct($entryPoint) + { + $this->nodes = new \SplObjectStorage(); + $this->implicitReturn = $this->createGraphNode(); + $this->entryPoint = $this->createGraphNode($entryPoint); + } + + public function getImplicitReturn() + { + return $this->implicitReturn; + } + + public function getEntryPoint() + { + return $this->entryPoint; + } + + public function getNodes() + { + return $this->nodes; + } + + public function getDirectedGraphNodes() + { + $nodes = array(); + foreach ($this->nodes as $astNode) { + $nodes[] = $this->nodes[$astNode]; + } + + return $nodes; + } + + /** + * Returns an array of predecessor nodes. + * + * @param GraphNode $destNode + * + * @return array + */ + public function getDirectedPredNodes(GraphNode $destNode) + { + $nodes = array(); + foreach ($destNode->getInEdges() as $edge) { + $nodes[] = $edge->getSource(); + } + + return $nodes; + } + + public function getDirectedSuccNodes(GraphNode $sourceNode) + { + $nodes = array(); + foreach ($sourceNode->getOutEdges() as $edge) { + $nodes[] = $edge->getDest(); + } + + return $nodes; + } + + public function getOutEdges($value) + { + assert('is_object($value)'); + + if (!isset($this->nodes[$value])) { + return array(); + } + + return $this->nodes[$value]->getOutEdges(); + } + + public function getInEdges($value) + { + assert('is_object($value)'); + + if (!isset($this->nodes[$value])) { + return array(); + } + + return $this->nodes[$value]->getInEdges(); + } + + public function getNode($value) + { + if (null === $value) { + return $this->implicitReturn; + } + + assert('is_object($value)'); + + return isset($this->nodes[$value]) ? $this->nodes[$value] : null; + } + + public function hasNode($value) + { + assert('is_object($value)'); + + return isset($this->nodes[$value]); + } + + public function isImplicitReturn(GraphNode $node) + { + return $node === $this->implicitReturn; + } + + public function connectToImplicitReturn($sourceValue, $edgeType) + { + $this->connect($sourceValue, $edgeType, null); + } + + public function connect($sourceValue, $edgeType, $destValue) + { + $source = $this->createGraphNode($sourceValue); + $dest = $this->createGraphNode($destValue); + $edge = new GraphEdge($source, $edgeType, $dest); + + $source->addOutEdge($edge); + $dest->addInEdge($edge); + } + + public function connectIfNotConnected($sourceValue, $edgeType, $destValue) + { + $source = $this->createGraphNode($sourceValue); + $dest = $this->createGraphNode($destValue); + + if ($this->isConnected($source, $dest, $edgeType)) { + return; + } + + $edge = new GraphEdge($source, $edgeType, $dest); + $source->addOutEdge($edge); + $dest->addInEdge($edge); + } + + public function isConnected(GraphNode $a, GraphNode $b, $edgeType) + { + foreach ($a->getOutEdges() as $edge) { + if ($edge->getType() !== $edgeType) { + continue; + } + + if ($edge->getDest() === $b) { + return true; + } + } + + return false; + } + + private function createGraphNode($value = null) + { + if (null === $value) { + if (null === $this->implicitReturn) { + $this->implicitReturn = new GraphNode(); + } + + return $this->implicitReturn; + } + + if (!isset($this->nodes[$value])) { + $this->nodes[$value] = new GraphNode($value); + } + + return $this->nodes[$value]; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/EdgeCallbackInterface.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/EdgeCallbackInterface.php new file mode 100644 index 0000000..442f1a8 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/EdgeCallbackInterface.php @@ -0,0 +1,36 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ControlFlow; + +interface EdgeCallbackInterface +{ + /** + * Update the state of the destination node when the given edge is traversed. + * + * For the fixed-point computation to work, only the destination node may be modified. + * The source node and the edge must not be modified. + * + * @param \PHPParser_Node $source The start node. + * @param integer $edgeType The edge. + * @param \PHPParser_Node $destination The end node. + * + * @return boolean Whether the state of the destination node changed. + */ + function traverseEdge(\PHPParser_Node $source, $edgeType, \PHPParser_Node $destination); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/FixedPointGraphTraversal.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/FixedPointGraphTraversal.php new file mode 100644 index 0000000..cd83559 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/FixedPointGraphTraversal.php @@ -0,0 +1,90 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ControlFlow; + +/** + * Utility class for fixed-point computations on the control flow graph. + * + * The edges over the control flow graph are traversed until it reaches a steady state. + * + * @author Johannes M. Schmitt + */ +class FixedPointGraphTraversal +{ + private $callback; + + public function __construct(EdgeCallbackInterface $callback) + { + $this->callback = $callback; + } + + public function computeFixedPointForGraph(ControlFlowGraph $graph) + { + $nodes = array(); + foreach ($graph->getNodes() as $astNode) { + $nodes[] = $astNode; + } + + $this->computeFixedPoint($graph, $nodes); + } + + public function computeFixedPointWithEntry(ControlFlowGraph $graph, \PHPParser_Node $entry) + { + $entrySet = array(); + $entrySet[] = $entry; + + $this->computeFixedPoint($graph, $entrySet); + } + + public function computeFixedPoint(ControlFlowGraph $graph, array $entrySet) + { + $cycleCount = 0; + $nodeCount = count($graph->getNodes()); + + // Choose a bail-out heristically in case the computation doesn't converge + $maxIterations = max($nodeCount * $nodeCount * $nodeCount, 100); + + $workSet = array(); + foreach ($entrySet as $n) { + $workSet[] = $graph->getNode($n); + } + + while (count($workSet) > 0) { + $source = array_shift($workSet); + $sourceValue = $source->getAstNode(); + + $outEdges = $source->getOutEdges(); + foreach ($outEdges as $edge) { + $destNode = $edge->getDest(); + $destValue = $destNode->getAstNode(); + + if ($this->callback->traverseEdge($sourceValue, $edge->getType(), $destValue) + && ! in_array($destNode, $workSet, true)) { + $workSet[] = $destNode; + } + } + + $cycleCount += 1; + + if ($cycleCount > $maxIterations) { + throw new \RuntimeException(sprintf('Fixed point computation is not halting. Aborting after %d iterations.', $cycleCount)); + } + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphEdge.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphEdge.php new file mode 100644 index 0000000..719bbd7 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphEdge.php @@ -0,0 +1,103 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ControlFlow; + +class GraphEdge +{ + /** Edge is taken if the condition is true. */ + const TYPE_ON_TRUE = 1; + /** Edge is taken if the condition is false. */ + const TYPE_ON_FALSE = 2; + /** Unconditional branch. */ + const TYPE_UNCOND = 3; + /** Exception related. */ + const TYPE_ON_EX = 4; + + private $source; + private $type; + private $dest; + private $attributes = array(); + + public static function getLiteral($type) + { + switch ($type) { + case self::TYPE_ON_TRUE: + return 'ON_TRUE'; + + case self::TYPE_ON_FALSE: + return 'ON_FALSE'; + + case self::TYPE_UNCOND: + return 'UNCOND'; + + case self::TYPE_ON_EX: + return 'ON_EX'; + + default: + throw new \LogicException(sprintf('Unknown type "%s".', $type)); + } + } + + public function __construct(GraphNode $source, $type, GraphNode $dest) + { + $this->source = $source; + $this->type = $type; + $this->dest = $dest; + } + + public function getSource() + { + return $this->source; + } + + public function getType() + { + return $this->type; + } + + public function getDest() + { + return $this->dest; + } + + public function isConditional() + { + return self::TYPE_ON_TRUE === $this->type || self::TYPE_ON_FALSE === $this->type; + } + + public function setAttribute($key, $value) + { + $this->attributes[$key] = $value; + } + + public function hasAttribute($key) + { + return array_key_exists($key, $this->attributes); + } + + public function getAttribute($key, $default = null) + { + return array_key_exists($key, $this->attributes) ? $this->attributes[$key] : null; + } + + public function removeAttribute($key) + { + unset($this->attributes[$key]); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphNode.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphNode.php new file mode 100644 index 0000000..37f7872 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphNode.php @@ -0,0 +1,86 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ControlFlow; + +class GraphNode +{ + private $astNode; + private $inEdges = array(); + private $outEdges = array(); + private $attributes = array(); + + /** + * @param object $node + */ + public function __construct($node = null) + { + $this->astNode = $node; + } + + public function getAstNode() + { + return $this->astNode; + } + + /** + * @return GraphEdge[] + */ + public function getInEdges() + { + return $this->inEdges; + } + + /** + * @return GraphEdge[] + */ + public function getOutEdges() + { + return $this->outEdges; + } + + public function addInEdge(GraphEdge $edge) + { + $this->inEdges[] = $edge; + } + + public function addOutEdge(GraphEdge $edge) + { + $this->outEdges[] = $edge; + } + + public function setAttribute($key, $value) + { + $this->attributes[$key] = $value; + } + + public function hasAttribute($key) + { + return array_key_exists($key, $this->attributes); + } + + public function getAttribute($key, $default = null) + { + return array_key_exists($key, $this->attributes) ? $this->attributes[$key] : null; + } + + public function removeAttribute($key) + { + unset($this->attributes[$key]); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphReachability.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphReachability.php new file mode 100644 index 0000000..4238c1f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphReachability.php @@ -0,0 +1,82 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ControlFlow; + +class GraphReachability implements EdgeCallbackInterface +{ + const ATTR_REACHABILITY = 'reachability'; + + const REACHABLE = 1; + const UNREACHABLE = 2; + + private $graph; + + public static function computeWithEntry(ControlFlowGraph $graph, \PHPParser_Node $entry) + { + $r = new self($graph); + $r->compute($entry); + + return $r; + } + + public function __construct(ControlFlowGraph $graph) + { + $this->graph = $graph; + } + + public function compute(\PHPParser_Node $entry) + { + foreach ($this->graph->getDirectedGraphNodes() as $node) { + $node->setAttribute(self::ATTR_REACHABILITY, self::UNREACHABLE); + } + + $this->graph->getEntryPoint()->setAttribute(self::ATTR_REACHABILITY, self::REACHABLE); + + $t = new FixedPointGraphTraversal($this); + $t->computeFixedPointWithEntry($this->graph, $entry); + } + + public function recompute(\PHPParser_Node $reachableNode) + { + $newReachable = $this->graph->getNode($reachableNode); + assert('$newReachable->getAttribute(self::ATTR_REACHABILITY) === self::UNREACHABLE'); + + $newReachable->setAttribute(self::ATTR_REACHABILITY, self::REACHABLE); + + $t = new FixedPointGraphTraversal($this); + $t->computeFixedPointWithEntry($this->graph, $reachableNode); + } + + public function traverseEdge(\PHPParser_Node $source, $edgeType, \PHPParser_Node $dest = null) + { + if ($this->graph->getNode($source)->getAttribute(self::ATTR_REACHABILITY) === self::REACHABLE) { + $destNode = $this->graph->getNode($dest); + + // We need to check whether the node has already been declared as reachable + // in order to not run in endless cycles if the graph is circular. + if (self::UNREACHABLE === $destNode->getAttribute(self::ATTR_REACHABILITY)) { + $destNode->setAttribute(self::ATTR_REACHABILITY, self::REACHABLE); + + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphvizSerializer.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphvizSerializer.php new file mode 100644 index 0000000..6a9b096 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/GraphvizSerializer.php @@ -0,0 +1,85 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ControlFlow; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; + +class GraphvizSerializer +{ + private $ids; + private $idCount; + + public function serialize(ControlFlowGraph $graph) + { + $dot = "digraph G {\n"; + + $this->ids = new \SplObjectStorage(); + $this->idCount = 0; + + $dot .= " ".$this->getId($graph->getImplicitReturn())." [shape=box,label=\"implicit return\",style=filled]\n"; + $entryPoint = $graph->getEntryPoint(); + + $nodes = $graph->getNodes(); + foreach ($nodes as $astNode) { + $node = $nodes[$astNode]; + $id = $this->getId($node); + + $dot .= sprintf(' %s [shape=box,label="%s"', $id, str_replace('"', '\\"', NodeUtil::getStringRepr($astNode))); + + if ($node === $entryPoint) { + $dot .= ",style=filled"; + } + + $dot .= "]\n"; + + foreach ($node->getOutEdges() as $edge) { + $dot .= sprintf(" %s -> %s", $id, $this->getId($edge->getDest())); + + switch ($edge->getType()) { + case GraphEdge::TYPE_ON_FALSE: + $dot .= ' [label="false"]'; + break; + + case GraphEdge::TYPE_ON_TRUE: + $dot .= ' [label="true"]'; + break; + + case GraphEdge::TYPE_ON_EX: + $dot .= ' [label="exception"]'; + break; + } + + $dot .= "\n"; + } + } + + $dot .= "}"; + + return $dot; + } + + private function getId(GraphNode $node) + { + if (!isset($this->ids[$node])) { + $this->ids[$node] = ++$this->idCount; + } + + return "B".$this->ids[$node]; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/PathChecker.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/PathChecker.php new file mode 100644 index 0000000..c845de2 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/PathChecker.php @@ -0,0 +1,238 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\ControlFlow; + +/** + * Checks the path between two nodes for the given predicate. + * + * The implementation of discoverBackEdges follows the DFS-Visit algorithm in + * "Introduction to Algorithms" by Cormen, Leiseron, Rivest, and Stein, 2nd + * ed., on page 541. The calculation of back edges is described on page 546. + * + * @author Johannes M. Schmitt + */ +class PathChecker +{ + // No yet visited. + const STATUS_WHITE = 'white'; + + // Being visted. + const STATUS_GRAY = 'gray'; + + // Finished visiting. + const STATUS_BLACK = 'black'; + + const STATUS_BACK_EDGE = 'back_edge'; + const STATUS_VISITED_EDGE = 'visited_edge'; + + const ATTR_STATUS = 'check_path_status'; + + private $graph; + private $start; + private $end; + private $nodePredicate; + private $edgePredicate; + private $inclusive; + + /** + * Given a graph G with nodes A and B, this algorithm determines if all paths + * from A to B contain at least one node satisfying a given predicate. + * + * Note that nodePredicate is not necessarily called for all nodes in G nor is + * edgePredicate called for all edges in G. + * + * Also note that this algorithm does not assess whether there actually is a path + * from A to B, but all edges if not ignored by the edge predicate are assumed + * to form a path from A to B. + * + * @param ControlFlowGraph $graph Graph G to analyze. + * @param GraphNode $a The node A. + * @param GraphNode $b The node B. + * @param callable $nodePredicate Predicate which at least one node on each path from an + * A node to B (inclusive) must match. + * @param callable $edgePredicate Edges to consider as part of the graph. Edges in + * graph that don't match edgePredicate will be ignored. + * @param boolean $inclusive Includes node A and B in the test for the node predicate. + */ + public function __construct(ControlFlowGraph $graph, GraphNode $a, GraphNode $b, $nodePredicate = null, $edgePredicate = null, $inclusive = true) + { + if (null === $nodePredicate) { + $nodePredicate = function() { return true; }; + } + + if (!is_callable($nodePredicate)) { + throw new \InvalidArgumentException('$nodePredicate is not callable.'); + } + + if (null === $edgePredicate) { + $edgePredicate = function() { return true; }; + } + + if (!is_callable($edgePredicate)) { + throw new \InvalidArgumentException('$edgePredicate is not callable.'); + } + + $this->graph = $graph; + $this->start = $a; + $this->end = $b; + $this->nodePredicate = $nodePredicate; + $this->edgePredicate = $edgePredicate; + $this->inclusive = $inclusive; + } + + /** + * @return boolean true iff all paths contain at least one node that satisfy the + * predicate + */ + public function allPathsSatisfyPredicate() + { + $this->setUp(); + $result = $this->checkAllPathsWithoutBackEdges($this->start, $this->end); + $this->tearDown(); + + return $result; + } + + public function somePathsSatisfyPredicate() + { + $this->setUp(); + $result = $this->checkSomePathsWithoutBackEdges($this->start, $this->end); + + return $result; + } + + private function setUp() + { + foreach ($this->graph->getDirectedGraphNodes() as $node) { + $node->setAttribute(self::ATTR_STATUS, self::STATUS_WHITE); + + foreach ($node->getOutEdges() as $e) { + $e->removeAttribute(self::ATTR_STATUS); + } + } + + $this->discoverBackEdges($this->start); + } + + private function discoverBackEdges(GraphNode $u) + { + $u->setAttribute(self::ATTR_STATUS, self::STATUS_GRAY); + + foreach ($u->getOutEdges() as $e) { + if ( ! call_user_func($this->edgePredicate, $e)) { + continue; + } + + $v = $e->getDest(); + switch ($v->getAttribute(self::ATTR_STATUS)) { + case self::STATUS_WHITE: + $this->discoverBackEdges($v); + break; + + case self::STATUS_GRAY: + $e->setAttribute(self::ATTR_STATUS, self::STATUS_BACK_EDGE); + break; + } + } + + $u->setAttribute(self::ATTR_STATUS, self::STATUS_BLACK); + } + + /** + * Verify that all non-looping paths from $a to $b pass + * through at least one node where $nodePredicate is true. + * + * @param GraphNode $a + * @param GraphNode $b + */ + private function checkAllPathsWithoutBackEdges(GraphNode $a, GraphNode $b) + { + if (call_user_func($this->nodePredicate, $a->getAstNode()) + && ($this->inclusive || ($a !== $this->start && $a !== $this->end))) { + return true; + } + + if ($a === $b) { + return false; + } + + foreach ($a->getOutEdges() as $e) { + if ($e->getAttribute(self::ATTR_STATUS) === self::STATUS_BACK_EDGE) { + continue; + } + + if ($e->getAttribute(self::ATTR_STATUS) === self::STATUS_VISITED_EDGE) { + continue; + } + $e->setAttribute(self::ATTR_STATUS, self::STATUS_VISITED_EDGE); + + if (!call_user_func($this->edgePredicate, $e)) { + continue; + } + + $next = $e->getDest(); + if (!$this->checkAllPathsWithoutBackEdges($next, $b)) { + return false; + } + } + + return true; + } + + /** + * Verify that some non-looping paths from $a to $b pass + * through at least one node where $nodePredicate is true. + * + * @param GraphNode $a + * @param GraphNode $b + */ + private function checkSomePathsWithoutBackEdges(GraphNode $a, GraphNode $b) + { + if (call_user_func($this->nodePredicate, $a->getAstNode()) + && ($this->inclusive || ($a !== $this->start && $a !== $this->end))) { + return true; + } + + if ($a === $b) { + return false; + } + + foreach ($a->getOutEdges() as $e) { + if ($e->getAttribute(self::ATTR_STATUS) === self::STATUS_BACK_EDGE) { + continue; + } + + if ($e->getAttribute(self::ATTR_STATUS) === self::STATUS_VISITED_EDGE) { + continue; + } + $e->setAttribute(self::ATTR_STATUS, self::STATUS_VISITED_EDGE); + + if (!call_user_func($this->edgePredicate, $e)) { + continue; + } + + $next = $e->getDest(); + if ($this->checkSomePathsWithoutBackEdges($next, $b)) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/BinaryJoinOp.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/BinaryJoinOp.php new file mode 100644 index 0000000..d335f18 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/BinaryJoinOp.php @@ -0,0 +1,65 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow; + +/** + * Breaks down all join operations into binary join operations. + * + * This will make implementing your join operation a bit easier as you just have to take care of a single case. + * + * @author Johannes M. Schmitt + */ +final class BinaryJoinOp +{ + private $joinOp; + + public function __construct(callable $callable) + { + $this->joinOp = $callable; + } + + public function __invoke(array $values) + { + switch ($nbValues = count($values)) { + case 0: + throw new \LogicException('$values must not be empty.'); + + case 1: + return $values[0]; + + case 2: + return call_user_func($this->joinOp, $values[0], $values[1]); + + default: + // Finds the mid point of the list. This favors splitting the list into two lists of even length. For + // example, a list with six elements is split into one list with two elements and another list with four + // elements instead of two lists with three elements each. + $mid = $nbValues >> 1; + if ($nbValues > 4) { + $mid &= -2; + } + + return call_user_func( + $this->joinOp, + $this->__invoke(array_slice($values, 0, $mid)), + $this->__invoke(array_slice($values, $mid)) + ); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/BranchedForwardDataFlowAnalysis.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/BranchedForwardDataFlowAnalysis.php new file mode 100644 index 0000000..b95c0ee --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/BranchedForwardDataFlowAnalysis.php @@ -0,0 +1,112 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow; + +use Scrutinizer\PhpAnalyzer\ControlFlow\GraphNode; + +/** + * Forward flowing data flow analysis which takes branches (TRUE, FALSE, EX, UNCOND) into account. + * + * @author Johannes M. Schmitt + */ +abstract class BranchedForwardDataFlowAnalysis extends DataFlowAnalysis +{ + protected function initialize() + { + $this->clearWorkSet(); + + foreach ($this->cfg->getDirectedGraphNodes() as $node) { + $outEdgeCount = count($node->getOutEdges()); + $outLattices = array(); + for ($i=0; $i < $outEdgeCount; $i++) { + $outLattices[] = $this->createInitialEstimateLattice(); + } + + $node->setAttribute(self::ATTR_FLOW_STATE_IN, $this->createInitialEstimateLattice()); + $node->setAttribute(self::ATTR_FLOW_STATE_OUT, $outLattices); + $this->addToWorkSet($node); + } + } + + protected final function isForward() + { + return true; + } + + protected final function flowThrough($node, LatticeElementInterface $input) + { + throw new \LogicException('Use branchedFlowThrough() when conducting a branched forward data flow analysis.'); + } + + /** + * Computes, and returns an array of outputs for each branch edge. + * + * @param object $node + * @param LatticeElementInterface $input + * + * @return LatticeElementInterface[] A list of output values depending on the edge's branch type. + */ + abstract protected function branchedFlowThrough($node, LatticeElementInterface $input); + + protected final function flow(GraphNode $node) + { + $outBefore = $node->getAttribute(self::ATTR_FLOW_STATE_OUT); + $outAfter = $this->branchedFlowThrough($node->getAstNode(), $node->getAttribute(self::ATTR_FLOW_STATE_IN)); + $node->setAttribute(self::ATTR_FLOW_STATE_OUT, $outAfter); + assert('count($outBefore) === count($outAfter)'); + + for ($i=0,$c=count($outBefore); $i<$c; $i++) { + if (false === $outBefore[$i]->equals($outAfter[$i])) { + return true; + } + } + + return false; + } + + protected function joinInputs(GraphNode $node) + { + if ($this->cfg->getEntryPoint() === $node) { + $node->setAttribute(self::ATTR_FLOW_STATE_IN, $this->createEntryLattice()); + + return; + } + + $predNodes = $this->cfg->getDirectedPredNodes($node); + if (!$predNodes) { + return; + } + + $values = array(); + foreach ($predNodes as $predNode) { + $succNodes = $this->cfg->getDirectedSuccNodes($predNode); + $index = array_search($node, $succNodes, true); + + $outStates = $predNode->getAttribute(self::ATTR_FLOW_STATE_OUT); + $values[] = $outStates[$index]; + } + + if (!$values) { + return; + } + + $newInState = call_user_func($this->joinOp, $values); + $node->setAttribute(self::ATTR_FLOW_STATE_IN, $newInState); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/DataFlowAnalysis.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/DataFlowAnalysis.php new file mode 100644 index 0000000..a4ab0d7 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/DataFlowAnalysis.php @@ -0,0 +1,275 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowGraph; +use Scrutinizer\PhpAnalyzer\ControlFlow\GraphNode; +use Scrutinizer\PhpAnalyzer\Exception\MaxIterationsExceededException; + +/** + * Provides a framework for data flow analysis. + * + * @author Johannes M. Schmitt + */ +abstract class DataFlowAnalysis +{ + const MAX_STEPS = 200000; + + const ATTR_FLOW_STATE_IN = 'flow_state_in'; + const ATTR_FLOW_STATE_OUT = 'flow_state_out'; + + private $orderedWorkSet = array(); + private $nodeComparator; + + protected $cfg; + protected $joinOp; + + public function __construct(ControlFlowGraph $graph, callable $joinOp) + { + $this->cfg = $graph; + $this->joinOp = $joinOp; + $this->nodeComparator = $this->getComparator(); + } + + public function getControlFlowGraph() + { + return $this->cfg; + } + + public function getJoinOp() + { + return $this->joinOp; + } + + public function getOrderedWorkSet() + { + return $this->orderedWorkSet; + } + + public function getExitLatticeElement() + { + return $this->cfg->getImplicitReturn()->getAttribute(self::ATTR_FLOW_STATE_IN); + } + + public function join(LatticeElementInterface $a, LatticeElementInterface $b) + { + return call_user_func($this->joinOp, array($a, $b)); + } + + /** + * Whether this implement conducts a forward analysis. + * + * @return boolean + */ + abstract protected function isForward(); + + /** + * Computes the output state for a given node and input state. + * + * @param object $node + * @param LatticeElementInterface $lattice should be read-only + * + * @return LatticeElementInterface + */ + abstract protected function flowThrough($node, LatticeElementInterface $lattice); + + /** + * Gets the state of the initial estimation at each node. + * + * @return LatticeElementInterface Initial state. + */ + abstract protected function createInitialEstimateLattice(); + + /** + * Gets the incoming state of the entry node. + * + * @return LatticeElementInterface Entry state. + */ + abstract protected function createEntryLattice(); + + /** + * Computes a fixed-point solution. + * + * At the beginning each node gets assigned the initial estimate lattice. The entry node gets assigned the entry + * lattice. After that, the initial work set is built, join operations are executed, and new lattices are calculated. + * + * This process repeats as long as we have not reached a fixed point solution. Should the calculation not converge + * after the defined number of steps, an exception is thrown stating that no fixed point solution was found within + * reasonable time. + * + * @param integer $maxSteps + */ + public final function analyze($maxSteps = self::MAX_STEPS) + { + $this->initialize(); + $step = 0; + + while ( ! empty($this->orderedWorkSet)) { + if ($step > $maxSteps) { + throw new MaxIterationsExceededException(sprintf('Data Flow Analysis did not terminate after %d iterations.', $maxSteps)); + } + + $curNode = array_shift($this->orderedWorkSet); + $this->joinInputs($curNode); + + if ($this->flow($curNode)) { + // If there is a change in the current node, we want to grab the list + // of nodes that this node affects. + $nextNodes = $this->isForward() ? $this->cfg->getDirectedSuccNodes($curNode) + : $this->cfg->getDirectedPredNodes($curNode); + + foreach ($nextNodes as $nextNode) { + if ($this->cfg->isImplicitReturn($nextNode)) { + continue; + } + + // There is no point in adding a node multiple times. + if (!in_array($nextNode, $this->orderedWorkSet, true)) { + $this->orderedWorkSet[] = $nextNode; + } + } + usort($this->orderedWorkSet, $this->nodeComparator); + } + + $step += 1; + } + + if ($this->isForward()) { + $this->joinInputs($this->cfg->getImplicitReturn()); + } + } + + protected final function addToWorkSet(GraphNode $node) + { + if (in_array($node, $this->orderedWorkSet, true)) { + return; + } + + $this->orderedWorkSet[] = $node; + usort($this->orderedWorkSet, $this->nodeComparator); + } + + protected final function clearWorkSet() + { + $this->orderedWorkSet = array(); + } + + protected function initialize() + { + $this->orderedWorkSet = array(); + foreach ($this->cfg->getDirectedGraphNodes() as $node) { + $node->setAttribute(self::ATTR_FLOW_STATE_IN, $this->createInitialEstimateLattice()); + $node->setAttribute(self::ATTR_FLOW_STATE_OUT, $this->createInitialEstimateLattice()); + $this->orderedWorkSet[] = $node; + } + + $implicitReturn = $this->cfg->getImplicitReturn(); + $implicitReturn->setAttribute(self::ATTR_FLOW_STATE_IN, $this->createInitialEstimateLattice()); + $implicitReturn->setAttribute(self::ATTR_FLOW_STATE_OUT, $this->createInitialEstimateLattice()); + + usort($this->orderedWorkSet, $this->nodeComparator); + } + + protected function joinInputs(GraphNode $node) + { + // forward analysis + if ($this->isForward()) { + // For the entry point, create an initial lattice state. + if ($node === $this->cfg->getEntryPoint()) { + $node->setAttribute(self::ATTR_FLOW_STATE_IN, $this->createEntryLattice()); + + return; + } + + $inNodes = $this->cfg->getDirectedPredNodes($node); + $nbNodes = count($inNodes); + + // If only one in node, its out state is automatically this node's in state. + if (1 === $nbNodes) { + $node->setAttribute(self::ATTR_FLOW_STATE_IN, $inNodes[0]->getAttribute(self::ATTR_FLOW_STATE_OUT)); + } else if ($nbNodes > 1) { + $values = array(); + foreach ($inNodes as $inNode) { + $values[] = $inNode->getAttribute(self::ATTR_FLOW_STATE_OUT); + } + + $newInState = call_user_func($this->joinOp, $values); + if (!$newInState instanceof LatticeElementInterface) { + throw new \RuntimeException(sprintf('The join operation must return a lattice element, but returned %s.', gettype($newInState))); + } + $node->setAttribute(self::ATTR_FLOW_STATE_IN, $newInState); + } + + return; + } + + // backward analysis + $inNodes = $this->cfg->getDirectedSuccNodes($node); + $nbNodes = count($inNodes); + + if (1 === $nbNodes) { + if ($this->cfg->isImplicitReturn($inNodes[0])) { + $node->setAttribute(self::ATTR_FLOW_STATE_OUT, $this->createEntryLattice()); + } else { + $node->setAttribute(self::ATTR_FLOW_STATE_OUT, $inNodes[0]->getAttribute(self::ATTR_FLOW_STATE_IN)); + } + } else if ($nbNodes > 1) { + $values = array(); + foreach ($inNodes as $inNode) { + $values[] = $inNode->getAttribute(self::ATTR_FLOW_STATE_IN); + } + + $newOutState = call_user_func($this->joinOp, $values); + if (!$newOutState instanceof LatticeElementInterface) { + throw new \RuntimeException(sprintf('The join operation must return a lattice element, but returned %s.', gettype($newOutState))); + } + $node->setAttribute(self::ATTR_FLOW_STATE_OUT, $newOutState); + } + } + + protected function flow(GraphNode $node) + { + if ($this->isForward()) { + $outBefore = $node->getAttribute(self::ATTR_FLOW_STATE_OUT); + $outAfter = $this->flowThrough($node->getAstNode(), $node->getAttribute(self::ATTR_FLOW_STATE_IN)); + $node->setAttribute(self::ATTR_FLOW_STATE_OUT, $outAfter); + + return false === $outBefore->equals($outAfter); + } + + $inBefore = $node->getAttribute(self::ATTR_FLOW_STATE_IN); + $inAfter = $this->flowThrough($node->getAstNode(), $node->getAttribute(self::ATTR_FLOW_STATE_OUT)); + $node->setAttribute(self::ATTR_FLOW_STATE_IN, $inAfter); + + return false === $inBefore->equals($inAfter); + } + + private function getComparator() + { + if ($this->isForward()) { + return function(GraphNode $n1, GraphNode $n2) { + return $n1->getAttribute('priority') - $n2->getAttribute('priority'); + }; + } + + return function(GraphNode $n1, GraphNode $n2) { + return $n2->getAttribute('priority') - $n1->getAttribute('priority'); + }; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/LatticeElementInterface.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/LatticeElementInterface.php new file mode 100644 index 0000000..90a28d4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/LatticeElementInterface.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow; + +/** + * Minimal interface required for data flow analysis. + * + * @author Johannes M. Schmitt + */ +interface LatticeElementInterface +{ + /** + * Compares two lattices for equality. + * + * This should perform a deep equality check by comparing the state of both objects, and must not be performed by + * using referential equality. + * + * @param LatticeElementInterface $a + * + * @return boolean + */ + function equals(LatticeElementInterface $a); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/BitSet.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/BitSet.php new file mode 100644 index 0000000..96f81b1 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/BitSet.php @@ -0,0 +1,108 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\LiveVariableAnalysis; + +/** + * Abstraction over a simple BitSet. + * + * This implementation is not complete, but only contains those methods that we need for the analysis. + * + * @author Johannes M. Schmitt + */ +class BitSet implements \Countable +{ + private $values = array(); + + public function __construct($initialSize = 0) + { + for ($i=0; $i<$initialSize; $i++) { + $this->values[] = 0; + } + } + + public function performOr(BitSet $that) + { + assert('count($this) === count($that)'); + + for ($i=0,$c=count($this->values); $i<$c; $i++) { + $this->values[$i] = $this->values[$i] | $that->values[$i]; + } + } + + public function all() + { + return $this->values; + } + + public function set($index) + { + $this->values[$index] = 1; + } + + public function get($index) + { + assert('isset($this->values[$index])'); + + return $this->values[$index]; + } + + public function __toString() + { + $maxIndex = max(array_keys($this->values)); + $str = ''; + for ($i = 0; $i<=$maxIndex; $i++) { + if (isset($this->values[$i]) && 1 === $this->values[$i]) { + $str .= '1'; + } else { + $str .= '0'; + } + } + + return $str; + } + + public function andNot(BitSet $that) + { + assert('count($this) === count($that)'); + + for ($i=0,$c=count($this->values); $i<$c; $i++) { + $this->values[$i] = $this->values[$i] & ~$that->values[$i]; + } + } + + public function equals(BitSet $that) + { + if (count($this->values) !== $c = count($that)) { + return false; + } + + for ($i=0; $i<$c; $i++) { + if ($this->values[$i] !== $that->values[$i]) { + return false; + } + } + + return true; + } + + public function count() + { + return count($this->values); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/LiveVariableLattice.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/LiveVariableLattice.php new file mode 100644 index 0000000..558f915 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/LiveVariableLattice.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\LiveVariableAnalysis; + +use Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Variable; + +class LiveVariableLattice implements LatticeElementInterface +{ + public $liveSet; + + public function __construct($numVars) + { + $this->liveSet = new BitSet($numVars); + } + + public function equals(LatticeElementInterface $that) + { + if (!$that instanceof LiveVariableLattice) { + return false; + } + + return $this->liveSet->equals($that->liveSet); + } + + public function isLive($varOrIndex) + { + if ($varOrIndex instanceof Variable) { + $varOrIndex = $varOrIndex->getIndex(); + } + + assert('is_integer($varOrIndex)'); + + return 1 === $this->liveSet->get($varOrIndex); + } + + public function __clone() + { + $this->liveSet = clone $this->liveSet; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/LiveVariablesAnalysis.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/LiveVariablesAnalysis.php new file mode 100644 index 0000000..424f83d --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/LiveVariablesAnalysis.php @@ -0,0 +1,339 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\LiveVariableAnalysis; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowGraph; +use Scrutinizer\PhpAnalyzer\ControlFlow\GraphEdge; +use Scrutinizer\PhpAnalyzer\DataFlow\DataFlowAnalysis; +use Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use JMS\PhpManipulator\PhpParser\BlockNode; + +class LiveVariablesAnalysis extends DataFlowAnalysis +{ + private $scope; + private $escaped; + + public function __construct(ControlFlowGraph $graph, Scope $scope) + { + parent::__construct($graph, function(array $in) { + /** @var $in LiveVariableLattice[] */ + + $result = clone $in[0]; + for ($i=1,$c=count($in); $i<$c; $i++) { + $result->liveSet->performOr($in[$i]->liveSet); + } + + return $result; + }); + + $this->scope = $scope; + $this->escaped = new \SplObjectStorage(); + } + + public function isForward() + { + return false; + } + + public function getVarIndex($varName) + { + $var = $this->scope->getVar($varName); + if (null === $var) { + throw new \InvalidArgumentException(sprintf('There is no variable named "%s" in the current scope. Available variables: %s', $varName, implode(', ', $this->scope->getVarNames()))); + } + + return $var->getIndex(); + } + + public function getEscapedLocals() + { + return $this->escaped; + } + + protected function createEntryLattice() + { + return new LiveVariableLattice($this->scope->getVarCount()); + } + + protected function createInitialEstimateLattice() + { + return new LiveVariableLattice($this->scope->getVarCount()); + } + + protected function flowThrough($node, LatticeElementInterface $input) + { + /** @var $node \PHPParser_Node */ + /** @var $input LiveVariableLattice */ + + $gen = new BitSet(count($input->liveSet)); + $kill = new BitSet(count($input->liveSet)); + + // Make kills conditional if the node can end abruptly by an exception. + $conditional = false; + foreach ($this->cfg->getOutEdges($node) as $edge) { + /** @var $edge GraphEdge */ + + if (GraphEdge::TYPE_ON_EX === $edge->getType()) { + $conditional = true; + } + } + + $this->computeGenKill($node, $gen, $kill, $conditional); + + $result = clone $input; + // L_in = L_out - Kill + Gen + $result->liveSet->andNot($kill); + $result->liveSet->performOr($gen); + + return $result; + } + + /** + * Computes the GEN and KILL set. + * + * @param boolean $conditional + */ + private function computeGenKill(\PHPParser_Node $node, BitSet $gen, BitSet $kill, $conditional) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_Closure: + foreach ($node->uses as $use) { + assert($use instanceof \PHPParser_Node_Expr_ClosureUse); + $this->addToSetIfLocal($use->var, $gen); + } + + return; + + case $node instanceof BlockNode: + case NodeUtil::isScopeCreator($node): + return; + + case $node instanceof \PHPParser_Node_Stmt_While: + case $node instanceof \PHPParser_Node_Stmt_Do: + case $node instanceof \PHPParser_Node_Stmt_If: + $this->computeGenKill($node->cond, $gen, $kill, $conditional); + + return; + + case $node instanceof \PHPParser_Node_Stmt_Foreach: + if (null !== $node->keyVar) { + if ($node->keyVar instanceof \PHPParser_Node_Expr_Variable) { + $this->addToSetIfLocal($node->keyVar, $kill); + $this->addToSetIfLocal($node->keyVar, $gen); + } else { + $this->computeGenKill($node->keyVar, $gen, $kill, $conditional); + } + } + + if ($node->valueVar instanceof \PHPParser_Node_Expr_Variable) { + $this->addToSetIfLocal($node->valueVar, $kill); + $this->addToSetIfLocal($node->valueVar, $gen); + } else { + $this->computeGenKill($node->valueVar, $gen, $kill, $conditional); + } + + $this->computeGenKill($node->expr, $gen, $kill, $conditional); + + return; + + case $node instanceof \PHPParser_Node_Stmt_For: + foreach ($node->cond as $cond) { + $this->computeGenKill($cond, $gen, $kill, $conditional); + } + + return; + + case $node instanceof \PHPParser_Node_Expr_BooleanAnd: + case $node instanceof \PHPParser_Node_Expr_BooleanOr: + $this->computeGenKill($node->left, $gen, $kill, $conditional); + // May short circuit. + $this->computeGenKill($node->right, $gen, $kill, true); + + return; + + case $node instanceof \PHPParser_Node_Expr_Ternary: + $this->computeGenKill($node->cond, $gen, $kill, $conditional); + // Assume both sides are conditional. + if (null !== $node->if) { + $this->computeGenKill($node->if, $gen, $kill, true); + } + $this->computeGenKill($node->else, $gen, $kill, true); + + return; + + case $node instanceof \PHPParser_Node_Param: + $this->markAllParametersEscaped(); + + return; + + case $node instanceof \PHPParser_Node_Expr_Variable: + if ( ! is_string($node->name)) { + $this->addAllToSetIfLocal($gen); + + return; + } + + $this->addToSetIfLocal($node->name, $gen); + + return; + + case $node instanceof \PHPParser_Node_Expr_Include: + $this->computeGenKill($node->expr, $gen, $kill, $conditional); + + if ($node->type === \PHPParser_Node_Expr_Include::TYPE_INCLUDE + || $node->type === \PHPParser_Node_Expr_Include::TYPE_REQUIRE) { + $this->addAllToSetIfLocal($gen); + } + + return; + + case NodeUtil::isMaybeFunctionCall($node, 'get_defined_vars'): + $this->addAllToSetIfLocal($gen); + break; + + case NodeUtil::isMaybeFunctionCall($node, 'compact'): + foreach ($node->args as $arg) { + $this->computeGenKill($arg, $gen, $kill, $conditional); + } + + $varNames = array(); + $isDynamic = false; + foreach ($node->args as $arg) { + if ($arg->value instanceof \PHPParser_Node_Scalar_String) { + $varNames[] = $arg->value->value; + + continue; + } + + if ($arg->value instanceof \PHPParser_Node_Expr_Array) { + foreach ($arg->value->items as $item) { + assert($item instanceof \PHPParser_Node_Expr_ArrayItem); + + if ($item->value instanceof \PHPParser_Node_Scalar_String) { + $varNames[] = $item->value->value; + + continue; + } + + $isDynamic = true; + break 2; + } + + continue; + } + + $isDynamic = true; + break; + } + + $this->addAllToSetIfLocal($gen, $isDynamic ? null : $varNames); + + return; + + case $node instanceof \PHPParser_Node_Expr_AssignList: + foreach ($node->vars as $var) { + if (!$var instanceof \PHPParser_Node_Expr_Variable) { + continue; + } + + if (!$conditional) { + $this->addToSetIfLocal($var->name, $kill); + } + + $this->addToSetIfLocal($var->name, $gen); + } + + $this->computeGenKill($node->expr, $gen, $kill, $conditional); + + return; + + // AssignList is already handled in the previous CASE block. + case NodeUtil::isAssignmentOp($node) + && $node->var instanceof \PHPParser_Node_Expr_Variable: + if ($node->var->name instanceof \PHPParser_Node_Expr) { + $this->computeGenKill($node->var->name, $gen, $kill, $conditional); + } + + if ( ! $conditional) { + $this->addToSetIfLocal($node->var->name, $kill); + } + + if ( ! $node instanceof \PHPParser_Node_Expr_Assign) { + // Assignments such as a += 1 reads a first. + $this->addToSetIfLocal($node->var->name, $gen); + } + + $this->computeGenKill($node->expr, $gen, $kill, $conditional); + + return; + + default: + foreach ($node as $subNode) { + if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + if (!$aSubNode instanceof \PHPParser_Node) { + continue; + } + + $this->computeGenKill($aSubNode, $gen, $kill, $conditional); + } + + continue; + } else if (!$subNode instanceof \PHPParser_Node) { + continue; + } + + $this->computeGenKill($subNode, $gen, $kill, $conditional); + } + } + } + + private function addAllToSetIfLocal(BitSet $set, array $vars = null) + { + foreach ($vars ?: $this->scope->getVarNames() as $name) { + $this->addToSetIfLocal($name, $set); + } + } + + private function addToSetIfLocal($varName, BitSet $set) + { + if (!is_string($varName)) { + return; + } + + if (false === $this->scope->isDeclared($varName)) { + return; + } + + $var = $this->scope->getVar($varName); + if (!isset($this->escaped[$var])) { + $set->set($var->getIndex()); + } + } + + private function markAllParametersEscaped() + { + $lp = $this->scope->getRootNode()->params; + foreach ($lp as $param) { + $this->escaped->attach($this->scope->getVar($param->name)); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/BooleanOutcomePair.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/BooleanOutcomePair.php new file mode 100644 index 0000000..d320ec4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/BooleanOutcomePair.php @@ -0,0 +1,136 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference; + +/** + * Small helper class for handling the outcome of binary operations. + * + * We do keep track of two sets of boolean literals: + * + * 1. toBooleanOutcomes: These are boolean literals as converted from any types. + * 2. booleanValues: These are boolean literals from just boolean types. + * + * TODO: Verify that toBooleanOutcomes, and booleanValues are not necessary anymore, + * and remove accordingly. + * + * @author Johannes M. Schmitt + */ +class BooleanOutcomePair +{ + public $toBooleanOutcomes; + public $booleanValues; + + private $inference; + + // The scope if only half of the expression executed, when applicable. + private $leftScope; + + // The scope when the whole expression executed. + private $rightScope; + + // The scope when we don't know how much of the expression is executed. + private $joinedScope; + + /** + * Creates the boolean outcome pair. + * + * This is used when we determine the outcome of short-circuiting binary + * operations such as &&, and, ||, or. + * + * @param boolean $condition + * + * @return BooleanOutcomePair + */ + public static function fromPairs(TypeInference $inference, BooleanOutcomePair $left, BooleanOutcomePair $right, $condition) + { + return new self($inference, + self::getBooleanOutcomes($left->toBooleanOutcomes, $right->toBooleanOutcomes, $condition), + self::getBooleanOutcomes($left->booleanValues, $right->booleanValues, $condition), + $left->getJoinedFlowScope(), + $right->getJoinedFlowScope()); + } + + /** + * Determines the boolean literal set that is possible for short-circuiting binary operations. + * + * @param array $leftValues possible boolean values for left expression + * @param array $rightValues possible boolean values for right expression + * @param boolean $condition the boolean value that causes the right side to be evaluated + * + * @return array the possible set for the entire expression + */ + private static function getBooleanOutcomes(array $leftValues, array $rightValues, $condition) + { + if (!in_array(!$condition, $leftValues, true)) { + return $rightValues; + } + + if (!in_array(!$condition, $rightValues, true)) { + $rightValues[] = !$condition; + } + + return $rightValues; + } + + public function __construct(TypeInference $inference, array $toBooleanOutcomes, array $booleanValues, LinkedFlowScope $leftScope, LinkedFlowScope $rightScope) + { + $this->inference = $inference; + $this->toBooleanOutcomes = $toBooleanOutcomes; + $this->booleanValues = $booleanValues; + $this->leftScope = $leftScope; + $this->rightScope = $rightScope; + } + + /** + * Gets the safe estimated scope without knowing if all of the + * subexpressions will be evaluated. + */ + public function getJoinedFlowScope() + { + if (null === $this->joinedScope) { + if ($this->leftScope === $this->rightScope) { + $this->joinedScope = $this->rightScope; + } else { + $this->joinedScope = $this->inference->join($this->leftScope, $this->rightScope); + } + } + + return $this->joinedScope; + } + + /** + * Gets the outcome scope if we do know the outcome of the entire + * expression. + * + * @param \PHPParser_Node $nodeType + * @param boolean $outcome + */ + public function getOutcomeFlowScope(\PHPParser_Node $node = null, $outcome) + { + if ((($node instanceof \PHPParser_Node_Expr_BooleanAnd + || $node instanceof \PHPParser_Node_Expr_LogicalAnd) && $outcome) + || (($node instanceof \PHPParser_Node_Expr_BooleanOr + || $node instanceof \PHPParser_Node_Expr_LogicalOr) && !$outcome)) { + // We know that the whole expression must have executed. + return $this->rightScope; + } + + return $this->getJoinedFlowScope(); + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FlatFlowScopeCache.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FlatFlowScopeCache.php new file mode 100644 index 0000000..960e44d --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FlatFlowScopeCache.php @@ -0,0 +1,195 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference; + +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; + +/** + * A cached flow scope, i.e. a "flat" scope. + * + * This class allows flow scopes to perform fast lookups which is especially useful if we have a long, + * and deep flow scope chain as we do not need to traverse through all parent scopes. + * + * @author Johannes M. Schmitt + */ +class FlatFlowScopeCache +{ + /** + * Represents either the scope for the method/function, or the global + * scope. + * + * @var Scope + */ + public $functionScope; + + /** + * The linked flow scope that this cache represents. + * + * @var LinkedFlowScope + */ + public $linkedEquivalent; + + /** + * Maps symbol names (properties prefixed with $, variables without prefix) + * to PhpTypes. + * + * @var array + */ + public $symbols = array(); + + /** + * Dirty Symbols are not looked up in the LinkedFlowScope as we assume + * that they have been redefined in another LinkedFlowScope. Saves us + * some time. + * + * @var array + */ + public $dirtySymbols = array(); + + /** + * Helper Constructor. + * + * This creates the bottom cache from the function scope that we started + * with. Note that "function" scope also applies to methods and closures, + * it is the same thing eventually. + * + * Keep in mind that Scope significantly depends on the ScopeCreator that + * was used. We need the TypedScopeCreator, otherwise the analysis will not + * yield desirable results. + * + * @param \Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope $scope + * + * @return FlatFlowScopeCache + */ + public static function createFromSyntacticScope(Scope $scope) + { + $cache = new self(); + $cache->functionScope = $scope; + + // Symbols are left empty intentionally. + + return $cache; + } + + /** + * Helper Constructor. + * + * Called to cache in the middle of a long scope chain. This allows us to "condense" all the scopes between + * a given scope and the top scope into a single scope which makes lookups a lot faster as we don't need to + * traverse up the chain. + * + * @param LinkedFlowScope $scope + * @return FlatFlowScopeCache + */ + public static function createFromLinkedScope(LinkedFlowScope $directParent) + { + $cache = new self(); + $cache->functionScope = $directParent->cache->functionScope; + $cache->symbols = $directParent->allFlowSlots(); + $cache->linkedEquivalent = $directParent; + + return $cache; + } + + /** + * Helper Constructor. + * + * This is called when we join two flow scope chains. For example, when we combine the outcomes of the ON_TRUE + * and the ON_FALSE branch of an IF clause. + * + * @param \Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\LinkedFlowScope $joinedScopeA + * @param \Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\LinkedFlowScope $joinedScopeB + * + * @return FlatFlowScopeCache + */ + public static function createFromLinkedScopes(LinkedFlowScope $joinedScopeA, LinkedFlowScope $joinedScopeB) + { + $cache = new self(); + + // Always prefer the "real" scope to the faked-out bottom scope. + $cache->functionScope = $joinedScopeA->flowsFromBottom() ? + $joinedScopeB->getFunctionScope() : $joinedScopeA->getFunctionScope(); + + $slotsA = $cache->symbols = $joinedScopeA->allFlowSlots(); + $slotsB = $joinedScopeB->allFlowSlots(); + + // There are 5 different join cases: + // 1) The type is declared in joinedScopeA, not in joinedScopeB, + // and not in functionScope. Just use the one in A. + // 2) The type is declared in joinedScopeB, not in joinedScopeA, + // and not in functionScope. Just use the one in B. + // 3) The type is declared in functionScope and joinedScopeA, but + // not in joinedScopeB. Join the two types. + // 4) The type is declared in functionScope and joinedScopeB, but + // not in joinedScopeA. Join the two types. + // 5) The type is declared in joinedScopeA and joinedScopeB. Join + // the two types. + $symbolNames = array_unique(array_merge(array_keys($slotsA), array_keys($slotsB))); + foreach ($symbolNames as $name) { + $slotA = isset($slotsA[$name]) ? $slotsA[$name] : null; + $slotB = isset($slotsB[$name]) ? $slotsB[$name] : null; + + $joinedType = null; + if (null === $slotB || $slotB->getType() === null) { + $fnSlot = $joinedScopeB->getFunctionScope()->getVar($name); + $fnSlotType = null === $fnSlot ? null : $fnSlot->getType(); + + if (null === $fnSlotType) { + // Case #1 -- The symbol was already inserted from A slots. + } else { + // Case #3 + $joinedType = $slotA->getType()->getLeastSuperType($fnSlotType); + } + } else if (null === $slotA || $slotA->getType() === null) { + $fnSlot = $joinedScopeA->getFunctionScope()->getVar($name); + $fnSlotType = null === $fnSlot ? null : $fnSlot->getType(); + + if (null === $fnSlotType) { + // Case #2 + $cache->symbols[$name] = $slotB; + } else { + // Case #4 + $joinedType = $slotB->getType()->getLeastSuperType($fnSlotType); + } + } else { + // Case #5 + $joinedType = $slotA->getType()->getLeastSuperType($slotB->getType()); + } + + if (null !== $joinedType) { + $cache->symbols[$name] = new SimpleSlot($name, $joinedType, true); + } + } + + return $cache; + } + + private final function __construct() + { + } + + public function getSlot($name) + { + if (isset($this->symbols[$name])) { + return $this->symbols[$name]; + } + + return $this->functionScope->getVar($name); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FlowScopeInterface.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FlowScopeInterface.php new file mode 100644 index 0000000..6f69f65 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FlowScopeInterface.php @@ -0,0 +1,26 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference; + +use Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\StaticScopeInterface; + +interface FlowScopeInterface extends LatticeElementInterface, StaticScopeInterface +{ +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ArrayFunctionInterpreter.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ArrayFunctionInterpreter.php new file mode 100644 index 0000000..855f175 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ArrayFunctionInterpreter.php @@ -0,0 +1,489 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnionType; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; + +/** + * Function Interpreter for the different array_??? functions. + * + * Since arrays are heavily used in PHP, it is important to get their types right. + * Otherwise all the other efforts that we are doing in the type inference fall + * a bit short as soon as a flow goes through one of these functions. + * + * @author Johannes M. Schmitt + */ +class ArrayFunctionInterpreter implements FunctionInterpreterInterface +{ + private $registry; + + public function __construct(\Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry $registry) + { + $this->registry = $registry; + } + + public function getPreciserFunctionReturnTypeKnowingArguments(GlobalFunction $function, array $argValues, array $argTypes) + { + switch ($function->getName()) { + case 'array_change_key_case': + return $this->casePreserveIncomingArray($argTypes, 'false'); + + case 'array_chunk': + case 'array_combine': + // TODO + break; + + case 'array_diff_assoc': + case 'array_diff_key': + case 'array_diff_uassoc': + case 'array_diff_ukey': + case 'array_diff': + return $this->casePreserveIncomingArray($argTypes); + + case 'array_fill_keys': + case 'array_fill': + case 'array_filter': + case 'array_flip': + // TODO + break; + + case 'array_intersect_assoc': + case 'array_intersect_key': + case 'array_intersect_uassoc': + case 'array_intersect_ukey': + case 'array_intersect': + return $this->casePreserveIncomingArray($argTypes); + + case 'array_keys': + return $this->caseArrayKeys($argTypes); + + case 'array_merge_recursive': + case 'array_replace_recursive': + case 'array_merge': + case 'array_replace': + return $this->caseArrayMergeReplace($argTypes, $function->getName()); + + case 'array_pad': + return $this->caseArrayPad($argTypes); + + case 'array_pop': + return $this->caseArrayPop($argTypes); + + case 'array_rand': + // TODO + break; + + case 'array_reverse': + return $this->casePreserveIncomingArray($argTypes); + + case 'array_search': + return $this->caseArraySearch($argTypes); + + case 'array_shift': + return $this->caseElementTypeOrElse($argTypes, 'null'); + + case 'array_slice': + case 'array_splice': + return $this->casePreserveIncomingArray($argTypes); + + case 'array_udiff_assoc': + case 'array_udiff_uassoc': + case 'array_udiff': + case 'array_uintersect_assoc': + case 'array_uintersect_uassoc': + case 'array_uintersect': + return $this->casePreserveIncomingArray($argTypes); + + case 'array_unique': + return $this->casePreserveIncomingArray($argTypes); + + case 'array_values': + return $this->caseArrayValues($argTypes); + + case 'compact': + // TODO + break; + + case 'current': + case 'end': + case 'next': + case 'pos': + case 'prev': + case 'reset': + return $this->caseElementTypeOrElse($argTypes, 'false'); + + case 'each': + case 'extract': + case 'key': + case 'range': + // TODO + break; + } + + return null; + } + + private function caseArraySearch(array $types) + { + if ( ! isset($types[1])) { + return $this->registry->getNativeType('none'); + } + + if ($types[1]->isArrayType()) { + return $this->registry->createUnionType(array('false', $types[1]->getKeyType())); + } + + if ($types[1]->isUnionType()) { + $keyTypes = $this->getKeyTypes($types[1]); + $keyTypes[] = 'false'; + + return $this->registry->createUnionType($keyTypes); + } + } + + private function caseArrayPad(array $types) + { + if (3 !== count($types)) { + return $this->registry->getNativeType('none'); + } + + if ($types[0]->isArrayType()) { + return $this->registry->getArrayType( + $this->registry->createUnionType(array($types[0]->getElementType(), $types[2])), + $this->registry->createUnionType(array($types[0]->getKeyType(), 'integer'))); + } + + if ($types[0]->isUnionType()) { + $elementTypes = $this->getElementTypes($types[0]); + if ( ! $elementTypes) { + return; + } + + $elementTypes[] = $types[2]; + + $keyTypes = $this->getKeyTypes($types[0]); + $keyTypes[] = 'integer'; + + return $this->registry->getArrayType( + $this->registry->createUnionType($elementTypes), + $this->registry->createUnionType($keyTypes)); + } + } + + /** + * Returns the result type for array_merge, array_replace, and their recursive + * variants. + * + * @param array $types + * @param string $itemMergeMethod + * + * @return PhpType + */ + private function caseArrayMergeReplace(array $types, $itemMergeMethod) + { + if ( ! isset($types[0])) { + return $this->registry->getNativeType('null'); + } + + $keyTypes = array(); + $elementTypes = array(); + $rawItemTypes = array(); + $allTypesArrays = true; + for ($i=0,$c=count($types); $i<$c; $i++) { + if (null === $types[$i]) { + continue; + } + + if ($types[$i]->isArrayType()) { + $keyTypes[] = $types[$i]->getKeyType(); + $elementTypes[] = $types[$i]->getElementType(); + $rawItemTypes[] = $types[$i]->getItemTypes(); + + continue; + } + + if ($types[$i]->isUnionType()) { + foreach ($types[$i]->getAlternates() as $alt) { + if ( ! $alt->isArrayType()) { + $allTypesArrays = false; + + continue; + } + + $keyTypes[] = $alt->getKeyType(); + $elementTypes[] = $alt->getElementType(); + $rawItemTypes[] = $alt->getItemTypes(); + } + + continue; + } + + $allTypesArrays = false; + } + + // No arrays found in arguments. + if ( ! $keyTypes) { + return; + } + + return $this->registry->getArrayType( + $this->registry->createUnionType($elementTypes), + $this->registry->createUnionType($keyTypes), + $allTypesArrays ? $this->mergeItemTypes($itemMergeMethod, $rawItemTypes) : array()); + } + + private function mergeItemTypes($method, array $rawItems) + { + if (count($rawItems) === 1) { + return $rawItems[0]; + } + + switch ($method) { + case 'array_merge': + case 'array_replace': + return call_user_func_array($method, $rawItems); + + case 'array_merge_recursive': + case 'array_replace_recursive': + // For some reason, PHP does not like to operate on objects. + $translationMap = array(); + foreach ($rawItems as &$rawItemArg) { + $this->prepareItemTypes($rawItemArg, $translationMap); + } + $mergeResult = call_user_func_array($method, $rawItems); + + // This is a bit of overhead as we not necessarily need to create the + // Array type for the root, but anyway it should be minimal. + return $this->synthesizeItemTypes($mergeResult, $translationMap)->getItemTypes(); + + default: + throw new \LogicException('Unsupported merge method '.$method); + } + } + + private function synthesizeItemTypes(array $mergeResult, array $translationMap) + { + $keyTypes = array(); + $elementTypes = array(); + $itemTypes = array(); + + foreach ($mergeResult as $k => $v) { + if (is_integer($k)) { + $keyTypes[] = 'integer'; + } else { + $keyTypes[] = 'string'; + } + + if (is_string($v)) { + $itemTypes[$k] = $translationMap[$v]; + $elementTypes[] = $itemTypes[$k]; + continue; + } else if (is_array($v)) { + $itemTypes[$k] = $this->synthesizeItemTypes($v, $translationMap); + $elementTypes[] = $itemTypes[$k]; + continue; + } + + throw new \LogicException(sprintf('Unsupported item type '.gettype($v))); + } + + return $this->registry->getArrayType( + $this->registry->createUnionType($elementTypes), + $this->registry->createUnionType($keyTypes), + $itemTypes + ); + } + + private function prepareItemTypes(array &$rawItems, array &$translationMap) + { + static $i = 0; + + foreach ($rawItems as $k => $v) { + assert($v instanceof \Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType); + + if ($v->isArrayType()) { + $rawItems[$k] = $v->getItemTypes(); + $this->prepareItemTypes($rawItems[$k], $translationMap); + + continue; + } + + $translationMap['type'.++$i] = $v; + $rawItems[$k] = 'type'.$i; + } + } + + private function extractItemTypes(array $itemTypes) + { + $extractedItemTypes = array(); + foreach ($itemTypes as $name => $itemType) { + if ($itemType->isArrayType()) { + $extractedItemTypes[$name] = $this->extractItemTypes($itemType->getItemTypes()); + continue; + } + + $extractedItemTypes[$name] = $itemType; + } + + return $extractedItemTypes; + } + + private function caseElementTypeOrElse(array $types, $emptyType = null) + { + if ( ! isset($types[0])) { + return $this->registry->getNativeType('none'); + } + + if ($types[0]->isArrayType()) { + return $emptyType ? $this->registry->createUnionType(array($types[0]->getElementType(), $emptyType)) + : $types[0]->getElementType(); + } + + if ($types[0]->isUnionType()) { + $elementTypes = $this->getElementTypes($types[0]); + if ( ! $elementTypes) { + return; + } + + if ($emptyType) { + $elementTypes[] = $emptyType; + } + + return $this->registry->createUnionType($elementTypes); + } + } + + private function casePreserveIncomingArray(array $types) + { + if ( ! isset($types[0])) { + return $this->registry->getNativeType('none'); + } + + if ($types[0]->isArrayType()) { + return $types[0]; + } + + if ($types[0]->isUnionType()) { + return $this->getByArrayRestrictedUnion($types[0]); + } + } + + private function caseArrayValues(array $types) + { + if ( ! isset($types[0])) { + return $this->registry->getNativeType('none'); + } + + if ($types[0]->isArrayType()) { + return $this->registry->getArrayType($types[0]->getElementType(), $this->registry->getNativeType('integer')); + } + + if ($types[0]->isUnionType()) { + $elementTypes = $this->getElementTypes($types[0]); + if ( ! $elementTypes) { + return; + } + + return $this->registry->getArrayType($this->registry->createUnionType($elementTypes), $this->registry->getNativeType('integer')); + } + } + + private function caseArrayKeys(array $types) + { + if ( ! isset($types[0])) { + return $this->registry->getNativeType('none'); + } + + if ($types[0]->isArrayType()) { + return $this->registry->getArrayType($types[0]->getKeyType(), $this->registry->getNativeType('integer')); + } + + if ($types[0]->isUnionType()) { + $keyTypes = $this->getKeyTypes($types[0]); + if (!$keyTypes) { + return; + } + + return $this->registry->getArrayType($this->registry->createUnionType($keyTypes), $this->registry->getNativeType('integer')); + } + } + + private function caseArrayPop(array $types) + { + if ( ! isset($types[0])) { + return $this->registry->getNativeType('none'); + } + + if ($types[0]->isArrayType()) { + return $this->registry->createNullableType($types[0]->getElementType()); + } + + if ($types[0]->isUnionType()) { + return $this->getByArrayRestrictedUnion($types[0], 'null'); + } + } + + private function getKeyTypes(UnionType $type) + { + $keyTypes = array(); + foreach ($type->getAlternates() as $alt) { + if ( ! $alt->isArrayType()) { + continue; + } + $keyTypes[] = $alt->getKeyType(); + } + + return $keyTypes; + } + + private function getElementTypes(UnionType $type) + { + $elementTypes = array(); + foreach ($type->getAlternates() as $alt) { + if ( ! $alt->isArrayType()) { + continue; + } + $elementTypes[] = $alt->getElementType(); + } + + return $elementTypes; + } + + private function getByArrayRestrictedUnion(UnionType $type, $typeOfNonArrayTypes = null) + { + $types = array(); + $hasNoArray = false; + + foreach ($type->getAlternates() as $alt) { + if ( ! $alt->isArrayType()) { + $hasNoArray = true; + continue; + } + $types[] = $alt; + } + + if (null !== $typeOfNonArrayTypes && $hasNoArray) { + $types[] = $typeOfNonArrayTypes; + } + + return $this->registry->createUnionType($types); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ChainableFunctionInterpreter.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ChainableFunctionInterpreter.php new file mode 100644 index 0000000..cb28a45 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ChainableFunctionInterpreter.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter; + +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; + +class ChainableFunctionInterpreter implements FunctionInterpreterInterface +{ + private $interpreters; + + /** + * @param array $interpreters + */ + public function __construct(array $interpreters) + { + $this->interpreters = $interpreters; + } + + public function getPreciserFunctionReturnTypeKnowingArguments(GlobalFunction $function, array $argValues, array $argTypes) + { + foreach ($this->interpreters as $interpreter) { + if (null !== $restrictedType = $interpreter->getPreciserFunctionReturnTypeKnowingArguments($function, $argValues, $argTypes)) { + return $restrictedType; + } + } + + return null; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/CoreFunctionInterpreter.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/CoreFunctionInterpreter.php new file mode 100644 index 0000000..3a6053c --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/CoreFunctionInterpreter.php @@ -0,0 +1,113 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; + +/** + * Makes return types for several PHP core functions more precise. + * + * @author Johannes M. Schmitt + */ +class CoreFunctionInterpreter implements FunctionInterpreterInterface +{ + private $registry; + + public function __construct(TypeRegistry $registry) + { + $this->registry = $registry; + } + + public function getPreciserFunctionReturnTypeKnowingArguments(GlobalFunction $function, array $argValues, array $argTypes) + { + switch ($function->getName()) { + case 'version_compare': + switch (count($argTypes)) { + case 2: + return $this->registry->getNativeType('integer'); + + case 3: + return $this->registry->getNativeType('boolean'); + + default: + return $this->registry->resolveType('integer|boolean'); + } + + case 'unserialize': + return $this->registry->getNativeType('unknown_checked'); + + case 'var_export': + if (count($argValues) !== 2) { + return null; + } + + if (\Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::isBoolean($argValues[1]) + && \Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::getBooleanValue($argValues[1]) === true) { + return $this->registry->getNativeType('string'); + } + + return null; + + case 'min': + case 'max': + switch (count($argTypes)) { + case 0: + return null; + + case 1: + if ($argTypes[0]->isArrayType()) { + return $argTypes[0]->getElementType(); + } + + return null; + + default: + // TODO: We could make this a bit smarter as some types are always considered + // greater/smaller than other types. + // See http://de1.php.net/manual/en/language.operators.comparison.php + return $this->registry->createUnionType($argTypes); + } + + case 'str_replace': + case 'preg_filter': + case 'preg_replace': + case 'preg_replace_callback': + if (isset($argTypes[2])) { + if ($argTypes[2]->isUnknownType()) { + return $this->registry->getNativeType('unknown'); + } + + if ($argTypes[2]->isArrayType()) { + return $this->registry->resolveType('array'); + } + + $nullableScalar = $this->registry->createNullableType($this->registry->getNativeType('scalar')); + if ($argTypes[2]->isSubtypeOf($nullableScalar)) { + return $this->registry->getNativeType('string'); + } + } + + return null; // Use the non-restricted type if we don't know. + + default: + return null; + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/FunctionInterpreterInterface.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/FunctionInterpreterInterface.php new file mode 100644 index 0000000..d608515 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/FunctionInterpreterInterface.php @@ -0,0 +1,40 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter; + +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +/** + * Interface for abstract interpretation of function return types. + * + * @author Johannes M. Schmitt + */ +interface FunctionInterpreterInterface +{ + /** + * Returns the return type of the passed function. + * + * @param GlobalFunction $function + * @param array $argTypes + * + * @return PhpType|null + */ + function getPreciserFunctionReturnTypeKnowingArguments(GlobalFunction $function, array $argValues, array $argTypes); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowScope.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowScope.php new file mode 100644 index 0000000..e799b84 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowScope.php @@ -0,0 +1,389 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference; + +use Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\StaticSlotInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +/** + * LinkFlowScope. + * + * Although the properties are public in this class, they should not be accessed + * from outside of the TypeInference/ sub-namespace. + */ +class LinkedFlowScope implements FlowScopeInterface +{ + const MAX_DEPTH = 300; + + // The closest flow scope cache. + /** @var FlatFlowScopeCache */ + public $cache; + + // The parent flow scope. + public $parent; + + // The distance between this flow scope and the closest flat flow scope. + public $depth; + + // A FlatFlowScopeCache equivalent to this scope. + public $flattened; + + // Flow scopes assume that all their ancestors are immutable. + // So once a child scope is created, this flow scope may not be modified. + public $frozen; + + // The last slot defined in this flow instruction, and the head of the + // linked list of slots. We use this for example to compare scopes. + /** @var LinkedFlowSlot */ + public $lastSlot; + + public static function createLatticeElement(Scope $scope) + { + return new LinkedFlowScope(FlatFlowScopeCache::createFromSyntacticScope($scope)); + } + + public static function createFromLinkedFlowScope(LinkedFlowScope $directParent) + { + return new self($directParent->cache, $directParent); + } + + public function __construct(FlatFlowScopeCache $cache, LinkedFlowScope $directParent = null) + { + $this->cache = $cache; + + if (null === $directParent) { + $this->lastSlot = null; + $this->depth = 0; + $this->parent = $this->cache->linkedEquivalent; + } else { + $this->lastSlot = $directParent->lastSlot; + $this->depth = $directParent->depth + 1; + $this->parent = $directParent; + } + } + + /** + * Remove flow scopes that add nothing to the flow. + * + * This function is not compatible with ``findUniqueRefinedSlot`` because there + * we assume that this scope is a direct descendant of the blind scope. For + * optimized scopes, this is not necessarily true anymore though. So, just use + * this if you are sure that you do not need to use ``findUniqueRefinedSlot``. + * + * @return LinkedFlowScope + */ + public function optimize() + { + $current = $this; + while (null !== $current->parent + && $current->lastSlot === $current->parent->lastSlot) { + $current = $current->parent; + } + + return $current; + } + + /** + * @return LinkedFlowScope + */ + public function createChildFlowScope() + { + $this->frozen = true; + + if ($this->depth > self::MAX_DEPTH) { + if (null === $this->flattened) { + $this->flattened = FlatFlowScopeCache::createFromLinkedScope($this); + } + + return new LinkedFlowScope($this->flattened); + } + + return LinkedFlowScope::createFromLinkedFlowScope($this); + } + + public function flowsFromBottom() + { + return $this->cache->functionScope->isBottom(); + } + + /** + * @return Scope + */ + public function getFunctionScope() + { + return $this->cache->functionScope; + } + + /** + * Gets all the symbols that have been defined before this point + * in the current flow. Does not return slots that have not changed during + * the flow. + * + * For example, consider the code: + * + * ```php + * + * $x = 3; + * function() { + * $y = 5; + * $y = 6; // FLOW POINT + * $z = $y; + * + * return $z; + * }; + * ``` + * + * A FlowScope at FLOW POINT will return a slot for y, but not a slot for x or z. + */ + public function allFlowSlots() + { + $slots = array(); + + for ($slot = $this->lastSlot; $slot !== null; $slot = $slot->parent) { + if (!isset($slots[$slot->getName()])) { + $slots[$slot->getName()] = $slot; + } + } + + foreach ($this->cache->symbols as $name => $slot) { + if (!isset($slots[$name])) { + $slots[$name] = $slot; + } + } + + return $slots; + } + + public function inferSlotType($name, PhpType $type) + { + assert(!$this->frozen); + + $this->lastSlot = new LinkedFlowSlot($name, $type, $this->lastSlot); + $this->depth += 1; + + if ( ! in_array($name, $this->cache->dirtySymbols, true)) { + $this->cache->dirtySymbols[] = $name; + } + } + + public function inferQualifiedSlot(\PHPParser_Node $node, $symbol, PhpType $bottomType, PhpType $inferredType) + { + $functionScope = $this->getFunctionScope(); + + if ($functionScope->isLocal()) { + if ( ! $functionScope->isDeclared($symbol) && ! $functionScope->isBottom()) { + $functionScope->declareVar($symbol, $bottomType)->setNameNode($node); + } + + $this->inferSlotType($symbol, $inferredType); + } + } + + public function getTypeOfThis() + { + return $this->cache->functionScope->getTypeOfThis(); + } + + public function getRootNode() + { + return $this->cache->functionScope->getRootNode(); + } + + public function getParentScope() + { + return $this->cache->functionScope->getParentScope(); + } + + /** + * @param string $name + * + * @return SimpleSlot|null + */ + public function getSlot($name) + { + if (in_array($name, $this->cache->dirtySymbols, true)) { + for ($slot = $this->lastSlot; $slot !== null; $slot = $slot->parent) { + if ($slot->getName() === $name) { + return $slot; + } + } + } + + return $this->cache->getSlot($name); + } + + public function hasSlot($name) + { + return null !== $this->getSlot($name); + } + + /** + * Iterate through all the linked flow scopes before this one. + * + * If there's one and only one slot defined between this scope and the blind scope, return it. + * + * @return StaticSlotInterface|null + */ + public function findUniqueRefinedSlot(LinkedFlowScope $blindScope) + { + $result = null; + + $currentScope = $this; + while ($currentScope !== $blindScope) { + $currentSlot = $currentScope->lastSlot; + while (null !== $currentSlot + && (null === $currentScope->parent + || $currentScope->parent->lastSlot !== $currentSlot)) { + if (null === $result) { + $result = $currentSlot; + } else if ($currentSlot->getName() !== $result->getName()) { + return null; + } + + $currentSlot = $currentSlot->parent; + } + + $currentScope = $currentScope->parent; + } + + return $result; + } + + /** + * Completes the given scope with type information inferred from the local flow where necessary. + */ + public function completeScope(Scope $scope) + { + foreach ($scope->getVars() as $name => $var) { + if ($var->isTypeInferred()) { + $type = $var->getType(); + if (null === $type) { + $flowType = $this->getSlot($name)->getType(); + $var->setType($flowType); + } + } + } + } + + public function equals(LatticeElementInterface $that) + { + if (!$that instanceof LinkedFlowScope) { + return false; + } + + if ($this->optimize() === $that->optimize()) { + return true; + } + + // If two flow scopes are in the same function, then they could have two possible function scopes: + // 1) the real function scope, or + // 2) the BOTTOM scope. + // If they have different function scopes, we theoretically should iterate through all the variable in each + // scope and compare. However, 99.9% of the time, they're not equal. The other 0.1% of the time, we can just + // assume that they are equal. Eventually, it just means that data flow analysis has to propagate the entry + // lattice a bit further than it really needs to, but the end result is not affected. + if ($this->getFunctionScope() !== $that->getFunctionScope()) { + return false; + } + + if ($this->cache === $that->cache) { + // If the two flow scopes have the same cache, then we can check equality a lot faster: by just looking at + // the "dirty" elements in the cache, and comparing them in both scopes. + foreach ($this->cache->dirtySymbols as $name) { + if ($this->diffSlots($this->getSlot($name), $that->getSlot($name))) { + return false; + } + } + + return true; + } + + $myFlowSlots = $this->allFlowSlots(); + $otherFlowSlots = $that->allFlowSlots(); + + foreach ($myFlowSlots as $name => $slot) { + if ($this->diffSlots($slot, isset($otherFlowSlots[$name]) ? $otherFlowSlots[$name] : null)) { + return false; + } + unset($otherFlowSlots[$name]); + } + + foreach ($otherFlowSlots as $name => $slot) { + if ($this->diffSlots($slot, isset($myFlowSlots[$name]) ? $myFlowSlots[$name] : null)) { + return false; + } + } + + return true; + } + + /** + * Determines whether two slots are considered meaningfully different. + */ + public function diffSlots(StaticSlotInterface $slotA = null, StaticSlotInterface $slotB = null) + { + $aIsNull = null === $slotA || null === $slotA->getType(); + $bIsNull = null === $slotB || null === $slotB->getType(); + + if ($aIsNull && $bIsNull) { + return false; + } + + if ($aIsNull ^ $bIsNull) { + return true; + } + + return $slotA->getType()->differsFrom($slotB->getType()); + } + + public function __toString() + { + $repr = 'LinkedFlowScope('.substr(sha1(spl_object_hash($this)), 0, 6).", \n"; + + $getDirtySymbolType = function($name) { + for ($slot = $this->lastSlot; $slot !== null; $slot = $slot->parent) { + if ($slot->getName() === $name) { + return (string) $slot->getType(); + } + } + + return null; + }; + $getDirtySymbolType->bindTo($this); + + $dirtySymbols = array(); + foreach ($this->cache->dirtySymbols as $name) { + $dirtySymbols[$name] = $getDirtySymbolType($name); + } + $repr .= " dirtySlots = ".json_encode($dirtySymbols).",\n"; + + $repr .= " cachedSlots = ".json_encode(array_map(function($v) { + return (string) $v->getType(); + }, $this->cache->symbols)).",\n"; + + $repr .= " functionSlots = ".json_encode(array_map(function($v) { + return (string) $v->getType(); + }, $this->cache->functionScope->getVars()))."\n"; + $repr .= ")"; + + return $repr; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowSlot.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowSlot.php new file mode 100644 index 0000000..3e9d686 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowSlot.php @@ -0,0 +1,33 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +class LinkedFlowSlot extends SimpleSlot +{ + public $parent; + + public function __construct($name, PhpType $type, LinkedFlowSlot $parent = null) + { + parent::__construct($name, $type, true); + + $this->parent = $parent; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/ChainableMethodInterpreter.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/ChainableMethodInterpreter.php new file mode 100644 index 0000000..cb849bf --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/ChainableMethodInterpreter.php @@ -0,0 +1,43 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter; + +class ChainableMethodInterpreter implements \Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter\MethodInterpreterInterface +{ + private $interpreters; + + /** + * @param array $interpreters + */ + public function __construct(array $interpreters) + { + $this->interpreters = $interpreters; + } + + public function getPreciserMethodReturnTypeKnowingArguments(\Scrutinizer\PhpAnalyzer\Model\ContainerMethodInterface $method, array $argValues, array $argTypes) + { + foreach ($this->interpreters as $interpreter) { + if (null !== $restrictedType = $interpreter->getPreciserMethodReturnTypeKnowingArguments($method, $argValues, $argTypes)) { + return $restrictedType; + } + } + + return null; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/CoreMethodInterpreter.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/CoreMethodInterpreter.php new file mode 100644 index 0000000..099a053 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/CoreMethodInterpreter.php @@ -0,0 +1,43 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter; + +class CoreMethodInterpreter implements MethodInterpreterInterface +{ + private $registry; + + public function __construct(\Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry $registry) + { + $this->registry = $registry; + } + + public function getPreciserMethodReturnTypeKnowingArguments(\Scrutinizer\PhpAnalyzer\Model\ContainerMethodInterface $method, array $argValues, array $argTypes) + { + switch (strtolower($method->getQualifiedName())) { + case 'simplexmlelement::asxml': + if ( ! isset($argValues[0])) { + return $this->registry->resolveType('string|false'); + } + + return $this->registry->getNativeType('boolean'); + } + + return null; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/MethodInterpreterInterface.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/MethodInterpreterInterface.php new file mode 100644 index 0000000..97cf3c0 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/MethodInterpreterInterface.php @@ -0,0 +1,41 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\Model\ContainerMethodInterface; + +/** + * Interface for Method Interpreters + * + * @author Johannes M. Schmitt + */ +interface MethodInterpreterInterface +{ + /** + * Returns a more precise return type for a given method. + * + * @param ContainerMethodInterface $method + * @param \PHPParser_Node[] $argValues + * @param PhpType[] $argTypes + * + * @return PhpType|null + */ + public function getPreciserMethodReturnTypeKnowingArguments(ContainerMethodInterface $method, array $argValues, array $argTypes); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/PhpUnitMethodInterpreter.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/PhpUnitMethodInterpreter.php new file mode 100644 index 0000000..0973e2f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/PhpUnitMethodInterpreter.php @@ -0,0 +1,49 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter; + +class PhpUnitMethodInterpreter implements MethodInterpreterInterface +{ + private $registry; + + public function __construct(\Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry $registry) + { + $this->registry = $registry; + } + + public function getPreciserMethodReturnTypeKnowingArguments(\Scrutinizer\PhpAnalyzer\Model\ContainerMethodInterface $method, array $argValues, array $argTypes) + { + $container = $method->getContainer(); + if ($container->isSubTypeOf($this->registry->getClassOrCreate('PHPUnit_Framework_TestCase'))) { + switch (strtolower($method->getName())) { + case 'getmock': + return $this->registry->getNativeType('unknown'); + } + } + + if ($container->isSubTypeOf($this->registry->getClassOrCreate('PHPUnit_Framework_MockObject_MockBuilder'))) { + switch (strtolower($method->getName())) { + case 'getmock': + return $this->registry->getNativeType('unknown'); + } + } + + return null; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/AbstractTypeRestrictionVisitor.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/AbstractTypeRestrictionVisitor.php new file mode 100644 index 0000000..f9198da --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/AbstractTypeRestrictionVisitor.php @@ -0,0 +1,76 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnionType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\VisitorInterface; + +abstract class AbstractTypeRestrictionVisitor implements VisitorInterface +{ + /** @var TypeRegistry */ + protected $registry; + + public function __construct(TypeRegistry $registry) + { + $this->registry = $registry; + } + + /** + * Abstracts away the similarities between visiting the UNKNOWN, and the + * ALL type. + * + * @param PhpType $topType + * @return PhpType the restricted type + */ + abstract protected function visitTopType(PhpType $topType); + + public function visitAllType() + { + return $this->visitTopType($this->registry->getNativeType('all')); + } + + public function visitUnknownType() + { + return $this->visitTopType($this->registry->getNativeType('unknown')); + } + + public function visitUnionType(UnionType $type) + { + $restricted = null; + foreach ($type->getAlternates() as $alternate) { + $restrictedAlternate = $alternate->visit($this); + if (null !== $restrictedAlternate) { + if (null === $restricted) { + $restricted = $restrictedAlternate; + } else { + $restricted = $restrictedAlternate->getLeastSupertype($restricted); + } + } + } + + return $restricted; + } + + public function visitNoType() + { + return $this->registry->getNativeType('none'); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/ChainableReverseAbstractInterpreter.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/ChainableReverseAbstractInterpreter.php new file mode 100644 index 0000000..c9a2098 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/ChainableReverseAbstractInterpreter.php @@ -0,0 +1,265 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\LinkedFlowScope; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypeInference; + +abstract class ChainableReverseAbstractInterpreter implements ReverseInterpreterInterface +{ + /** @var ChainableReverseAbstractInterpreter */ + private $firstLink; + + /** @var ChainableReverseAbstractInterpreter */ + private $nextLink; + + protected $typeRegistry; + + public function __construct(TypeRegistry $registry) + { + $this->typeRegistry = $registry; + $this->firstLink = $this; + } + + /** + * Appends an interpreter, returning the updated last link. + * + * @param ChainableReverseAbstractInterpreter $lastLink + * @return ChainableReverseAbstractInterpreter The updated last link + */ + public function append(ChainableReverseAbstractInterpreter $lastLink) + { + assert(null === $lastLink->nextLink); + + $this->nextLink = $lastLink; + $lastLink->firstLink = $this; + + return $lastLink; + } + + public function getFirst() + { + return $this->firstLink; + } + + /** + * @param \PHPParser_Node $condition + * @param LinkedFlowScope $blindScope + * @param boolean $outcome + * + * @return LinkedFlowScope + */ + protected function firstPreciserScopeKnowingConditionOutcome(\PHPParser_Node $condition, + LinkedFlowScope $blindScope, $outcome) + { + return $this->firstLink->getPreciserScopeKnowingConditionOutcome($condition, $blindScope, $outcome); + } + + /** + * Delegates the calculation of the preciser scope to the next link. + * If there is no next link, returns the blind scope. + * + * @return LinkedFlowScope + */ + protected function nextPreciserScopeKnowingConditionOutcome(\PHPParser_Node $condition, + LinkedFlowScope $blindScope, $outcome) + { + return $this->nextLink !== null ? $this->nextLink->getPreciserScopeKnowingConditionOutcome( + $condition, $blindScope, $output) : $blindScope; + } + + /** + * Returns the type of the given node in the flow scope. + * + * If the node cannot be matched to a slot, or simply is not capable of being + * refined, then this method returns null. + * + * @return PhpType|null + */ + public function getTypeIfRefinable(\PHPParser_Node $node, LinkedFlowScope $scope) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_ArrayDimFetch: + $varType = $this->getTypeIfRefinable($node->var, $scope); + if ($varType && $varType->isArrayType()) { + $dim = \Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::getValue($node->dim); + if ($dim->isEmpty()) { + return null; + } + + return $dim->flatMap([$varType, 'getItemType']) + ->getOrCall([$varType, 'getElementType']); + } + + return null; + + // Handle the common pattern of assigning the result of an expression + // inside of a condition, e.g. ``if (null !== $obj = $this->findObj())``. + case $node instanceof \PHPParser_Node_Expr_Assign: + case $node instanceof \PHPParser_Node_Expr_AssignRef: + if (TypeInference::hasQualifiedName($node->var) + && (null !== $qualifiedName = TypeInference::getQualifiedName($node->var)) + && null !== $nameVar = $scope->getSlot($node->var->name)) { + if (null !== $nameType = $nameVar->getType()) { + return $nameType; + } + + return $node->var->getAttribute('type'); + } + + return null; + + case $node instanceof \PHPParser_Node_Expr_Variable: + if (is_string($node->name)) { + $nameVar = $scope->getSlot($node->name); + + if (null !== $nameVar) { + if (null !== $nameVar->getType()) { + return $nameVar->getType(); + } + + return $node->getAttribute('type'); + } + } + + return null; + + case $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch: + case $node instanceof \PHPParser_Node_Expr_PropertyFetch: + if (null === $qualifiedName = TypeInference::getQualifiedName($node)) { + return null; + } + + $propVar = $scope->getSlot($qualifiedName); + if (null !== $propVar && null !== $propVar->getType()) { + return $propVar->getType(); + } + + if (null !== $type = $node->getAttribute('type')) { + return $type; + } + + return null; + } + + return null; + } + + /** + * Returns a version of $type that is restricted by some knowledge + * about the result of the gettype function. + * + * @param PhpType $type + * @param string $value + * @param boolean $resultEqualsValue + */ + protected function getRestrictedByGettypeResult(PhpType $type = null, $value, $resultEqualsValue) + { + if (null === $type) { + if ($resultEqualsValue) { + $result = $this->getNativeTypeForGettypeResult($value); + + return $result ?: $this->typeRegistry->getNativeType('unknown'); + } + + return null; + } + + return $type->visit(new RestrictByGettypeResultVisitor($this->typeRegistry, $value, $resultEqualsValue)); + } + + protected function getRestrictedByGetClassResult(PhpType $type = null, $value, $resultEqualsValue) + { + if (null === $type) { + if ($resultEqualsValue) { + return $this->typeRegistry->getClassOrCreate($value); + } + + return null; + } + + return $type->visit(new RestrictByGetClassResultVisitor($this->typeRegistry, $value, $resultEqualsValue)); + } + + private function getNativeTypeForGettypeResult($resultName) + { + return self::getNativeTypeForGettypeResultHelper($this->typeRegistry, $resultName); + } + + public static function getNativeTypeForGettypeResultHelper(TypeRegistry $registry, $resultName) + { + switch ($resultName) { + case 'integer': + case 'double': + case 'array': + case 'object': + case 'boolean': + case 'string': + return $registry->getNativeType($resultName); + + case 'NULL': + return $registry->getNativeType('null'); + + default: + return null; + } + } + + /** + * Declares a refined type in {@code scope} for the name represented by + * {@code node}. It must be possible to refine the type of the given node in + * the given scope, as determined by {@link #getTypeIfRefinable}. + */ + protected function declareNameInScope(LinkedFlowScope $scope, \PHPParser_Node $node, PhpType $type) { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_Variable: + if (is_string($node->name)) { + $scope->inferSlotType($node->name, $type); + } + break; + + case $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch: + case $node instanceof \PHPParser_Node_Expr_PropertyFetch: + if (null !== $qualifiedName = TypeInference::getQualifiedName($node)) { + $origType = $node->getAttribute('type') ?: $this->typeRegistry->getNativeType('unknown'); + $scope->inferQualifiedSlot($node, $qualifiedName, $origType, $type); + } + break; + + // Something like: if (is_array($functions = getFunctionNames())) { } + case $node instanceof \PHPParser_Node_Expr_Assign: + case $node instanceof \PHPParser_Node_Expr_AssignRef: + $this->declareNameInScope($scope, $node->var, $type); + break; + + case $node instanceof \PHPParser_Node_Expr_ArrayDimFetch: + $dim = \Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::getValue($node->dim); + if ($dim->isDefined() + && (null !== $slotType = $node->var->getAttribute('type')) + && $slotType->isArrayType()) { + $newSlotType = $slotType->inferItemType($dim->get(), $type); + $this->declareNameInScope($scope, $node->var, $newSlotType); + } + + break; + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByFalseTypeResultVisitor.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByFalseTypeResultVisitor.php new file mode 100644 index 0000000..f33611b --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByFalseTypeResultVisitor.php @@ -0,0 +1,83 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ArrayType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\CallableType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ObjectType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ResourceType; + +abstract class RestrictByFalseTypeResultVisitor extends AbstractTypeRestrictionVisitor +{ + public function visitNoObjectType() + { + return $this->registry->getNativeType('object'); + } + + public function visitBooleanType() + { + return $this->registry->getNativeType('boolean'); + } + + public function visitIntegerType() + { + return $this->registry->getNativeType('integer'); + } + + public function visitDoubleType() + { + return $this->registry->getNativeType('double'); + } + + public function visitObjectType(ObjectType $type) + { + return $type; + } + + public function visitStringType() + { + return $this->registry->getNativeType('string'); + } + + public function visitNullType() + { + return $this->registry->getNativeType('null'); + } + + public function visitArrayType(ArrayType $type) + { + return $type; + } + + public function visitCallableType(CallableType $type) + { + return $type; + } + + public function visitResourceType(ResourceType $type) + { + return $type; + } + + protected function visitTopType(PhpType $type) + { + return $type; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByGetClassResultVisitor.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByGetClassResultVisitor.php new file mode 100644 index 0000000..fe8d684 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByGetClassResultVisitor.php @@ -0,0 +1,185 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ArrayType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\CallableType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NamedType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ObjectType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnionType; +use Scrutinizer\PhpAnalyzer\Model\Clazz; + +class RestrictByGetClassResultVisitor extends RestrictByTrueTypeResultVisitor +{ + private $value; + private $resultEqualsValue; + + public function __construct(TypeRegistry $registry, $value, $resultEqualsValue) + { + parent::__construct($registry); + + $this->value = $value; + $this->resultEqualsValue = $resultEqualsValue; + } + + public function visitBooleanType() + { + if ($this->resultEqualsValue) { + return $this->registry->getNativeType('none'); + } + + return $this->registry->getNativeType('boolean'); + } + + public function visitNullType() + { + if ($this->resultEqualsValue) { + return $this->registry->getNativeType('none'); + } + + return $this->registry->getNativeType('null'); + } + + public function visitResourceType(\Scrutinizer\PhpAnalyzer\PhpParser\Type\ResourceType $type) + { + if ($this->resultEqualsValue) { + return $this->registry->getNativeType('none'); + } + + return $type; + } + + public function visitIntegerType() + { + if ($this->resultEqualsValue) { + return $this->registry->getNativeType('none'); + } + + return $this->registry->getNativeType('integer'); + } + + public function visitDoubleType() + { + if ($this->resultEqualsValue) { + return $this->registry->getNativeType('none'); + } + + return $this->registry->getNativeType('double'); + } + + public function visitStringType() + { + if ($this->resultEqualsValue) { + return $this->registry->getNativeType('none'); + } + + return $this->registry->getNativeType('string'); + } + + public function visitArrayType(ArrayType $type) + { + if ($this->resultEqualsValue) { + return $this->registry->getNativeType('none'); + } + + return $type; + } + + public function visitCallableType(CallableType $type) + { + if ($this->resultEqualsValue) { + return $this->registry->getNativeType('none'); + } + + return $type; + } + + public function visitObjectType(ObjectType $type) + { + $className = $this->getClassName($type); + if (null !== $className && $className === $this->value) { + return $this->resultEqualsValue ? $type : $this->registry->getNativeType('none'); + } + + return $type; + } + + public function visitNoObjectType() + { + if ($this->resultEqualsValue) { + return $this->registry->getClassOrCreate($this->value); + } + + return $this->registry->getNativeType('object'); + } + + public function visitUnionType(UnionType $type) + { + if ( ! $this->resultEqualsValue) { + $types = array(); + foreach ($type->getAlternates() as $alt) { + if ($this->getClassName($alt) === $this->value) { + continue; + } + + $types[] = $alt; + } + + return $this->registry->createUnionType($types); + } + + foreach ($type->getAlternates() as $alt) { + if ($alt->isNoObjectType()) { + return $this->registry->getClassOrCreate($this->value); + } + + $className = $this->getClassName($alt); + if (null !== $className && $className === $this->value) { + return $alt; + } + } + + return $this->registry->getNativeType('none'); + } + + public function visitTopType(PhpType $topType) + { + if ($this->resultEqualsValue) { + return $this->registry->getClassOrCreate($this->value); + } + + return $topType; + } + + private function getClassName(PhpType $type) + { + if ($type instanceof NamedType) { + return $type->getReferenceName(); + } + + $methodContainer = $type->toMaybeObjectType(); + if ($methodContainer instanceof Clazz) { + return $methodContainer->getName(); + } + + return null; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByGettypeResultVisitor.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByGettypeResultVisitor.php new file mode 100644 index 0000000..81bd445 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByGettypeResultVisitor.php @@ -0,0 +1,119 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ArrayType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\CallableType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ObjectType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ResourceType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; + +class RestrictByGettypeResultVisitor extends AbstractTypeRestrictionVisitor +{ + private $value; + private $resultEqualsValue; + + public function __construct(TypeRegistry $registry, $value, $resultEqualsValue) + { + parent::__construct($registry); + + $this->value = $value; + $this->resultEqualsValue = $resultEqualsValue; + } + + public function visitNoObjectType() + { + return $this->matches('object') ? $this->registry->getNativeType('object') : null; + } + + public function visitBooleanType() + { + return $this->matches('boolean') ? $this->registry->getNativeType('boolean') : null; + } + + public function visitNullType() + { + return $this->matches('NULL') ? $this->registry->getNativeType('null') : null; + } + + public function visitIntegerType() + { + return $this->matches('integer') ? $this->registry->getNativeType('integer') : null; + } + + public function visitDoubleType() + { + return $this->matches('double') ? $this->registry->getNativeType('double') : null; + } + + public function visitObjectType(ObjectType $type) + { + return $this->matches('object') ? $type : null; + } + + public function visitStringType() + { + return $this->matches('string') ? $this->registry->getNativeType('string') : null; + } + + public function visitArrayType(ArrayType $type) + { + return $this->matches('array') ? $type : null; + } + + public function visitCallableType(CallableType $type) + { + if ($this->matches('array')) { + return $this->registry->getNativeType('array'); + } + if ($this->matches('object')) { + return $this->registry->getNativeType('object'); + } + if ($this->matches('string')) { + return $this->registry->getNativeType('string'); + } + + return null; + } + + public function visitResourceType(ResourceType $type) + { + return $this->matches('resource') ? $type : null; + } + + protected function visitTopType(PhpType $topType) + { + $result = $topType; + + if ($this->resultEqualsValue) { + $typeByName = ChainableReverseAbstractInterpreter::getNativeTypeForGettypeResultHelper($this->registry, $this->value); + if (null !== $typeByName) { + $result = $typeByName; + } + } + + return $result; + } + + private function matches($result) + { + return ($result === $this->value) === $this->resultEqualsValue; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByTrueTypeResultVisitor.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByTrueTypeResultVisitor.php new file mode 100644 index 0000000..125af0e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/RestrictByTrueTypeResultVisitor.php @@ -0,0 +1,71 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ArrayType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\CallableType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ResourceType; + +abstract class RestrictByTrueTypeResultVisitor extends AbstractTypeRestrictionVisitor +{ + public function visitNoObjectType() + { + return null; + } + + public function visitBooleanType() + { + return null; + } + + public function visitNullType() + { + return null; + } + + public function visitIntegerType() + { + return null; + } + + public function visitDoubleType() + { + return null; + } + + public function visitStringType() + { + return null; + } + + public function visitArrayType(ArrayType $type) + { + return null; + } + + public function visitCallableType(CallableType $type) + { + return null; + } + + public function visitResourceType(ResourceType $type) + { + return null; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/ReverseInterpreterInterface.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/ReverseInterpreterInterface.php new file mode 100644 index 0000000..cd13888 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/ReverseInterpreterInterface.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter; + +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FlowScopeInterface; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\LinkedFlowScope; + +interface ReverseInterpreterInterface +{ + /** + * Calculates a precise version of the scope knowing the outcome of the + * condition. + * + * @param \PHPParser_Node $condition the condition's expression + * @param LinkedFlowScope $blindScope the scope without knowledge about the outcome of the + * condition + * @param boolean $outcome the outcome of the condition + * + * @return FlowScopeInterface + */ + function getPreciserScopeKnowingConditionOutcome(\PHPParser_Node $condition, + LinkedFlowScope $blindScope, $outcome); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/SemanticReverseAbstractInterpreter.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/SemanticReverseAbstractInterpreter.php new file mode 100644 index 0000000..3534395 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/SemanticReverseAbstractInterpreter.php @@ -0,0 +1,813 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\LinkedFlowScope; + +/** + * Our default reverse abstract interpreter. + * + * This reverse abstract interpreter uses the semantics of the PHP language as a + * means to reverse interpret computations. For example, we are going to infer + * the type of variables knowing the outcome to certain conditions. + * + * For this interpreter to work, the input nodes must already be typed. Without + * type information, this is of limited use. + * + * @author Johannes M. Schmitt + */ +class SemanticReverseAbstractInterpreter extends ChainableReverseAbstractInterpreter +{ + public function getPreciserScopeKnowingConditionOutcome(\PHPParser_Node $node, LinkedFlowScope $blindScope, $outcome) + { + // Here, we are checking some special type related functions, such as + // gettype(), the is_??? flavors, or get_class(). + if ($node instanceof \PHPParser_Node_Expr_Equal + || $node instanceof \PHPParser_Node_Expr_NotEqual + || $node instanceof \PHPParser_Node_Expr_Identical + || $node instanceof \PHPParser_Node_Expr_NotIdentical + || $node instanceof \PHPParser_Node_Stmt_Case) { + if (null !== $rs = $this->checkForTypeFunctionCall($node, $blindScope, $outcome)) { + return $rs; + } + } + + switch (true) { + case $node instanceof \PHPParser_Node_Expr_BooleanAnd: + case $node instanceof \PHPParser_Node_Expr_LogicalAnd: + if ($outcome) { + return $this->caseAndOrNotShortCircuiting($node->left, $node->right, $blindScope, true); + } + + return $this->caseAndOrMaybeShortCircuiting($node->left, $node->right, $blindScope, true); + + case $node instanceof \PHPParser_Node_Expr_BooleanOr: + case $node instanceof \PHPParser_Node_Expr_LogicalOr: + if (!$outcome) { + return $this->caseAndOrNotShortCircuiting($node->left, $node->right, $blindScope, false); + } + + return $this->caseAndOrMaybeShortCircuiting($node->left, $node->right, $blindScope, false); + + case $node instanceof \PHPParser_Node_Expr_Equal: + if ($outcome) { + return $this->caseEquality($node->left, $node->right, $blindScope, 'Equality'); + } + + return $this->caseEquality($node->left, $node->right, $blindScope, 'Inequality'); + + case $node instanceof \PHPParser_Node_Expr_NotEqual: + if ($outcome) { + return $this->caseEquality($node->left, $node->right, $blindScope, 'Inequality'); + } + + return $this->caseEquality($node->left, $node->right, $blindScope, 'Equality'); + + case $node instanceof \PHPParser_Node_Expr_Identical: + if ($outcome) { + return $this->caseEquality($node->left, $node->right, $blindScope, 'ShallowEquality'); + } + + return $this->caseEquality($node->left, $node->right, $blindScope, 'ShallowInequality'); + + case $node instanceof \PHPParser_Node_Expr_NotIdentical: + if ($outcome) { + return $this->caseEquality($node->left, $node->right, $blindScope, 'ShallowInequality'); + } + + return $this->caseEquality($node->left, $node->right, $blindScope, 'ShallowEquality'); + + case $node instanceof \PHPParser_Node_Expr_Variable: + case $node instanceof \PHPParser_Node_Expr_PropertyFetch: + case $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch: + return $this->caseVariableOrGetProp($node, $blindScope, $outcome); + + case $node instanceof \PHPParser_Node_Expr_Assign: + return $this->firstPreciserScopeKnowingConditionOutcome($node->var, + $this->firstPreciserScopeKnowingConditionOutcome($node->expr, $blindScope, $outcome), $outcome); + + case $node instanceof \PHPParser_Node_Expr_BooleanNot: + return $this->firstPreciserScopeKnowingConditionOutcome( + $node->expr, $blindScope, !$outcome); + + case $node instanceof \PHPParser_Node_Expr_SmallerOrEqual: + case $node instanceof \PHPParser_Node_Expr_Smaller: + case $node instanceof \PHPParser_Node_Expr_GreaterOrEqual: + case $node instanceof \PHPParser_Node_Expr_Greater: + return $this->caseComparison($node, $blindScope, $outcome); + + case $node instanceof \PHPParser_Node_Expr_Instanceof: + return $this->caseInstanceOf($node->expr, $node->class, $blindScope, $outcome); + + case $node instanceof \PHPParser_Node_Expr_FuncCall: + if (NodeUtil::isTypeFunctionCall($node) && isset($node->args[0]) + && null !== $informed = $this->caseTypeFunctionCall($node->name, $node->args[0], $blindScope, $outcome)) { + return $informed; + } + break; + + case $node instanceof \PHPParser_Node_Stmt_Case: + $left = $node->getAttribute('parent')->cond; + $right = $node->cond; + + if ($outcome) { + // In PHP, a case does a loose comparison (==) + return $this->caseEquality($left, $right, $blindScope, 'Equality'); + } + + return $this->caseEquality($left, $right, $blindScope, 'Inequality'); + +// case $node instanceof \PHPParser_Node_Expr_Empty: +// // TODO +// return $this->caseEmpty(); + +// case $node instanceof \PHPParser_Node_Expr_Isset: +// // TODO +// return $this->caseIsset(); + } + + return $this->nextPreciserScopeKnowingConditionOutcome($node, $blindScope, $outcome); + } + + private function caseTypeFunctionCall(\PHPParser_Node $name, \PHPParser_Node_Arg $arg, LinkedFlowScope $blindScope, $outcome) + { + if (!$name instanceof \PHPParser_Node_Name) { + return null; + } + + $type = $this->getTypeIfRefinable($arg->value, $blindScope); + + $restrictedType = null; + $functionName = implode("\\", $name->parts); + + switch ($functionName) { + case 'is_array': + $restrictedType = $this->restrictByValueType($type, $outcome, 'array'); + break; + + case 'is_bool': + $restrictedType = $this->restrictByValueType($type, $outcome, 'boolean'); + break; + + case 'is_callable': + $restrictedType = $this->restrictByCallable($type, $outcome); + break; + + case 'is_double': + case 'is_float': + case 'is_real': + $restrictedType = $this->restrictByValueType($type, $outcome, 'double'); + break; + + case 'is_int': + case 'is_integer': + case 'is_long': + $restrictedType = $this->restrictByValueType($type, $outcome, 'integer'); + break; + + case 'is_null': + $restrictedType = $this->restrictByValueType($type, $outcome, 'null'); + break; + + case 'is_numeric': + $restrictedType = $this->restrictByNumericType($type, $outcome); + break; + + case 'is_object': + $restrictedType = $this->restrictByObjectType($type, $outcome); + break; + +// case 'is_resource': +// $restrictedType = $this->restrictByTypeForResource($type, $outcome); +// break; + + case 'is_scalar': + $restrictedType = $this->restrictByScalarType($type, $outcome); + break; + + case 'is_string': + $restrictedType = $this->restrictByValueType($type, $outcome, 'string'); + break; + + default: + // let the next abstract interpreter handle it + return null; + } + + if (null !== $restrictedType) { + $informed = $blindScope->createChildFlowScope(); + $this->declareNameInScope($informed, $arg->value, $restrictedType); + + return $informed; + } + + return $blindScope; + } + + private function restrictByScalarType(PhpType $type = null, $outcome) + { + if ($outcome) { + return $this->typeRegistry->getNativeType('scalar'); + } + + if (null === $type) { + return null; + } + + if ($type->isIntegerType() || $type->isDoubleType() || $type->isStringType() + || $type->isBooleanType()) { + return $this->typeRegistry->getNativeType('none'); + } + + if ($type->isUnionType()) { + return $type->getRestrictedUnion($this->typeRegistry->getNativeType('scalar')); + } + + if ($type->isAllType()) { + return $this->typeRegistry->createUnionType(array('object', 'array', 'null')); + } + + return $type; + } + + private function restrictByNumericType(PhpType $type = null, $outcome) + { + if ($outcome) { + return $this->typeRegistry->getNativeType('numeric'); + } + + if (null === $type) { + return null; + } + + // String is excluded here since not all strings are necessarily numeric. + // So, even if the condition evaluates to false, we could technically + // still have a string inside the if (just that it is not numeric). + if ($type->isIntegerType() || $type->isDoubleType()) { + return $this->typeRegistry->getNativeType('none'); + } + + if ($type->isUnionType()) { + // Again, we do not restrict by string as explained above. + return $type->getRestrictedUnion($this->typeRegistry->createUnionType(array('integer', 'double'))); + } + + if ($type->isAllType()) { + return $this->typeRegistry->createUnionType(array('object', 'string', 'null', 'array', 'boolean')); + } + + return $type; + } + + private function restrictByObjectType(PhpType $type = null, $outcome) + { + if ($outcome) { + if (null === $type || $type->isUnknownType()) { + return $this->typeRegistry->getNativeType('object'); + } + + return $type->getGreatestSubtype($this->typeRegistry->getNativeType('object')); + } + + if (null === $type || $type->isAllType()) { + return $this->typeRegistry->createAllTypeExcept(array('object')); + } + + if ($type->isObjectType() || $type->isNoObjectType()) { + return $this->typeRegistry->getNativeType('none'); + } + + if ($type->isUnionType()) { + return $type->getRestrictedUnion($this->typeRegistry->getNativeType('object')); + } + + return $type; + } + + private function restrictByValueType(PhpType $type = null, $outcome, $typeName) + { + // If the type function evaluates to true, we can always say what + // the type is afterwards even if we do not know the input. + if ($outcome) { + return $this->typeRegistry->getNativeType($typeName); + } + + if (null === $type) { + return null; + } + + // If we know the outcome is false, and only the given type is passed, + // e.g. is_array() receives only arrays, then this condition always + // evaluates to false. + if ($type->{'is'.$typeName.'Type'}()) { + return $this->typeRegistry->getNativeType('none'); + } + + // If a union type is passed, the value can be whatever the union type + // represents minus the checked type. + if ($type->isUnionType()) { + return $type->getRestrictedUnion($this->typeRegistry->getNativeType($typeName)); + } + + // If an all type is passed, the value can be all value types minus the + // checked value type. + if ($type->isAllType()) { + $allTypes = array('object', 'integer', 'double', 'string', 'null', 'array', 'boolean'); + unset($allTypes[array_search($typeName, $allTypes, true)]); + + return $this->typeRegistry->createUnionType($allTypes); + } + + // If nothing from above is applicable, just return the type. It is an + // indication that the condition is always false, for example + // is_array() receives always non-array values. + return $type; + } + + private function restrictByCallable(PhpType $type = null, $outcome) + { + if (null === $type) { + return $outcome ? $this->typeRegistry->getNativeType('callable') : null; + } + + if ($outcome) { + if ($type->isUnknownType() || $type->isAllType()) { + return $this->typeRegistry->getNativeType('callable'); + } + + if ($type->isUnionType()) { + $types = array(); + foreach ($type->getAlternates() as $altType) { + if ($altType->canBeCalled()) { + $types[] = $altType; + } + } + + return $this->typeRegistry->createUnionType($types); + } + + return $type->canBeCalled() ? $type : $this->typeRegistry->getNativeType('none'); + } + + if ($type->isCallableType()) { + return $this->typeRegistry->getNativeType('none'); + } + + if ($type->isUnionType()) { + $types = array(); + foreach ($type->getAlternates() as $altType) { + if ($altType->isCallableType()) { + continue; + } + + $types[] = $altType; + } + + return $this->typeRegistry->createUnionType($types); + } + + return $type; + } + + private function caseVariableOrGetProp(\PHPParser_Node $node, LinkedFlowScope $blindScope, $outcome) + { + // First, we check if there is a defining expression for this node (only in case of a variable). + // In addition, we also narrow down the type of the variable itself. + if (null !== $defExpr = $node->getAttribute('defining_expr')) { + $blindScope = $this->firstPreciserScopeKnowingConditionOutcome($defExpr, $blindScope, $outcome); + } + + if (null !== $type = $this->getTypeIfRefinable($node, $blindScope)) { + $restrictedType = $type->getRestrictedTypeGivenToBooleanOutcome($outcome); + $informed = $blindScope->createChildFlowScope(); + $this->declareNameInScope($informed, $node, $restrictedType); + + return $informed; + } + + return $blindScope; + } + + private function caseInstanceOf(\PHPParser_Node $left, \PHPParser_Node $right, LinkedFlowScope $blindScope, $outcome) + { + // If the left side of the instanceof expression is not a variable, or a + // property, just return here as we cannot infer anything. + if (null === $leftType = $this->getTypeIfRefinable($left, $blindScope)) { + return $blindScope; + } + + // If the class is variable, we can just ensure that if the condition + // evaluates to true, the true scope contains an object, but not of + // which class that object is. + if (!$right instanceof \PHPParser_Node_Name_FullyQualified) { + if ($outcome) { + $restrictedType = $leftType->getGreatestSubtype($this->typeRegistry->getNativeType('object')); + $informed = $blindScope->createChildFlowScope(); + $this->declareNameInScope($informed, $left, $restrictedType); + + return $informed; + } + + // For the false scope, we cannot infer anything. + return $blindScope; + } + + // If we reach this, we have a concrete class on the right side. + $rightType = $right->getAttribute('type'); + + if ($outcome) { + $restrictedType = $leftType->isUnknownType() ? $rightType : $leftType->getGreatestSubtype($rightType); + $informed = $blindScope->createChildFlowScope(); + $this->declareNameInScope($informed, $left, $restrictedType); + + return $informed; + } + + $restrictedType = null; + if ( ! $leftType->isUnknownType() && $leftType->isSubtypeOf($rightType)) { + $restrictedType = $this->typeRegistry->getNativeType('none'); + } else if ($leftType->isUnionType()) { + $restrictedType = $leftType->getRestrictedUnion($rightType); + } + + if (null === $restrictedType) { + return $blindScope; + } + + $informed = $blindScope->createChildFlowScope(); + $this->declareNameInScope($informed, $left, $restrictedType); + + return $informed; + } + + /** + * There are a few special cases in PHP, which we need to handle differently. + * + * The default behavior is to fallback to caseEquality when outcome is true. + * + * @param \PHPParser_Node $comparison + * @param LinkedFlowScope $blindScope + * @param boolean $outcome + * @throws \LogicException + */ + private function caseComparison(\PHPParser_Node $comparison, LinkedFlowScope $blindScope, $outcome) + { + // Use the default behavior first. + if ($outcome) { + $newScope = $this->caseEquality($comparison->left, $comparison->right, $blindScope, 'Inequality'); + } else { + $newScope = $blindScope; + } + + // Now, check the exception cases where the default fails. + list($leftType, $leftIsRefinable) = $this->getTypeStatus($comparison->left, $blindScope); + list($rightType, $rightIsRefinable) = $this->getTypeStatus($comparison->right, $blindScope); + if (null === $leftType || null === $rightType) { + return $blindScope; + } + + $leftTypeRefined = $rightTypeRefined = null; + + // The onFalse branch of a SmallerOrEqual comparison can never contain a null type on left side. + // Example: if ($a <= $foo) { } else { /* $a can never be null here. */ } + if (!$outcome && $comparison instanceof \PHPParser_Node_Expr_SmallerOrEqual && $leftType->isNullable()) { + $leftTypeRefined = $leftType->restrictByNotNull(); + } + // The onFalse branch of a GreaterOrEqual comparison can never contain a null type on right side. + // Example: if ($foo >= $a) { } else { /* $a can never be null here. */ } + if (!$outcome && $comparison instanceof \PHPParser_Node_Expr_GreaterOrEqual && $rightType->isNullable()) { + $rightTypeRefined = $rightType->restrictByNotNull(); + } + + // The onTrue branch of a Greater comparison can never contain a null type on left side. + // Example: if ($a > $foo) { /* $a can never be null here. */ } else { } + if ($outcome && $comparison instanceof \PHPParser_Node_Expr_Greater && $leftType->isNullable()) { + $leftTypeRefined = $leftType->restrictByNotNull(); + } + // The onTrue branch of a Smaller comparison can never contain a null type on right side. + // Example: if ($foo < $a) { /* $a can never be null here. */ } else { } + if ($outcome && $comparison instanceof \PHPParser_Node_Expr_Smaller && $rightType->isNullable()) { + $rightTypeRefined = $rightType->restrictByNotNull(); + } + + if (($leftIsRefinable && $leftTypeRefined) + || ($rightIsRefinable && $rightTypeRefined)) { + // Do not create a new flowscope if the default behavior has already created one. + $newScope = $newScope === $blindScope ? $blindScope->createChildFlowScope() : $newScope; + + if ($leftIsRefinable && $leftTypeRefined) { + $this->declareNameInScope($newScope, $comparison->left, $leftTypeRefined); + } + if ($rightIsRefinable && $rightTypeRefined) { + $this->declareNameInScope($newScope, $comparison->right, $rightTypeRefined); + } + } + + return $newScope; + } + + private function caseEquality(\PHPParser_Node $left, \PHPParser_Node $right, + LinkedFlowScope $blindScope, $mergeMethod) + { + list($leftType, $leftIsRefineable) = $this->getTypeStatus($left, $blindScope); + list($rightType, $rightIsRefineable) = $this->getTypeStatus($right, $blindScope); + if (null === $leftType || null === $rightType) { + return $blindScope; + } + + // Merge Types. + $merged = $leftType->{'getTypesUnder'.$mergeMethod}($rightType); + + // Check whether one side can be refined, and if so create a new scope. + if (null !== $merged) { + $refineLeft = $leftIsRefineable && null !== $merged[0]; + $refineRight = $rightIsRefineable && null !== $merged[1]; + + if ($refineLeft || $refineRight) { + $informed = $blindScope->createChildFlowScope(); + + if ($refineLeft) { + $this->declareNameInScope($informed, $left, $merged[0]); + } + + if ($refineRight) { + $this->declareNameInScope($informed, $right, $merged[1]); + } + + return $informed; + } + } + + return $blindScope; + } + + private function getTypeStatus(\PHPParser_Node $node, LinkedFlowScope $scope) + { + if (null !== $type = $this->getTypeIfRefinable($node, $scope)) { + return array($type, true); + } + + return array($node->getAttribute('type'), false); + } + + private function checkForTypeFunctionCall(\PHPParser_Node $node, LinkedFlowScope $blindScope, $outcome) + { + if ($node instanceof \PHPParser_Node_Stmt_Case) { + $left = $node->getAttribute('parent')->cond; + $right = $node->cond; + } else { + $left = $node->left; + $right = $node->right; + } + + // Handle gettype() function calls. + $gettypeNode = $stringNode = null; + if (NodeUtil::isGetTypeFunctionCall($left) + && $right instanceof \PHPParser_Node_Scalar_String) { + $gettypeNode = $left; + $stringNode = $right; + } else if (NodeUtil::isGetTypeFunctionCall($right) + && $left instanceof \PHPParser_Node_Scalar_String) { + $gettypeNode = $right; + $stringNode = $left; + } + + if (null !== $gettypeNode && null !== $stringNode + && isset($gettypeNode->args[0])) { + $operandNode = $gettypeNode->args[0]->value; + $operandType = $this->getTypeIfRefinable($operandNode, $blindScope); + + if (null !== $operandType) { + $resultEqualsValue = $node instanceof \PHPParser_Node_Expr_Equal + || $node instanceof \PHPParser_Node_Expr_Identical + || $node instanceof \PHPParser_Node_Stmt_Case; + if (!$outcome) { + $resultEqualsValue = !$resultEqualsValue; + } + + return $this->caseGettypeFunctionCall($operandNode, $operandType, $stringNode->value, $resultEqualsValue, $blindScope); + } + } + + // Handle get_class() function calls. + $getClassNode = $stringNode = null; + if ('get_class' === NodeUtil::getFunctionName($left) + && $right instanceof \PHPParser_Node_Scalar_String) { + $getClassNode = $left; + $stringNode = $right; + } else if ('get_class' === NodeUtil::getFunctionName($right) + && $left instanceof \PHPParser_Node_Scalar_String) { + $getClassNode = $right; + $stringNode = $left; + } + + if (null !== $getClassNode && null !== $stringNode + && isset($getClassNode->args[0])) { + $operandNode = $getClassNode->args[0]->value; + $operandType = $this->getTypeIfRefinable($operandNode, $blindScope); + + if (null !== $operandType) { + $resultEqualsValue = $node instanceof \PHPParser_Node_Expr_Equal + || $node instanceof \PHPParser_Node_Expr_Identical + || $node instanceof \PHPParser_Node_Stmt_Case; + + if ( ! $outcome) { + $resultEqualsValue = !$resultEqualsValue; + } + + return $this->caseGetClassFunctionCall($operandNode, $operandType, $stringNode->value, $resultEqualsValue, $blindScope); + } + } + + // Handle is_??? and assert function calls as well as instanceof checks. + $typeFunctionNode = $booleanNode = null; + if ((NodeUtil::isTypeFunctionCall($left) || NodeUtil::isMaybeFunctionCall($left, 'assert') + || $left instanceof \PHPParser_Node_Expr_Instanceof) + && NodeUtil::isBoolean($right)) { + $typeFunctionNode = $left; + $booleanNode = $right; + } else if ((NodeUtil::isTypeFunctionCall($right) || NodeUtil::isMaybeFunctionCall($right, 'assert') + || $right instanceof \PHPParser_Node_Expr_Instanceof) + && NodeUtil::isBoolean($left)) { + $typeFunctionNode = $right; + $booleanNode = $left; + } + + if (null !== $booleanNode && null !== $typeFunctionNode) { + $expectedOutcome = NodeUtil::getBooleanValue($booleanNode) ? $outcome : !$outcome; + + if ($typeFunctionNode instanceof \PHPParser_Node_Expr_Instanceof) { + return $this->firstPreciserScopeKnowingConditionOutcome($typeFunctionNode, $blindScope, $expectedOutcome); + } + + if (isset($typeFunctionNode->args[0])) { + if (NodeUtil::isMaybeFunctionCall($typeFunctionNode, 'assert')) { + return $this->firstPreciserScopeKnowingConditionOutcome($typeFunctionNode->args[0]->value, $blindScope, $expectedOutcome); + } + + return $this->caseTypeFunctionCall( + $typeFunctionNode->name, + $typeFunctionNode->args[0], + $blindScope, + $expectedOutcome); + } + } + + return null; + } + + private function caseAndOrNotShortCircuiting(\PHPParser_Node $left, \PHPParser_Node $right, LinkedFlowScope $scope, $condition) + { + // left type + if (null !== $leftType = $this->getTypeIfRefinable($left, $scope)) { + $leftIsRefinable = true; + + if (NodeUtil::isName($left) && null !== $defExpr = $left->getAttribute('defining_expr')) { + $scope = $this->firstPreciserScopeKnowingConditionOutcome($defExpr, $scope, $condition); + } + } else { + $leftIsRefinable = false; + $leftType = $left->getAttribute('type'); + $scope = $this->firstPreciserScopeKnowingConditionOutcome($left, $scope, $condition); + } + + // restricting left type + if (null !== $leftType) { + $leftType = $leftType->getRestrictedTypeGivenToBooleanOutcome($condition); + } + + if (null === $leftType) { + return $this->firstPreciserScopeKnowingConditionOutcome($right, $scope, $condition); + } + + // right type + if (null !== $rightType = $this->getTypeIfRefinable($right, $scope)) { + $rightIsRefinable = true; + + if (NodeUtil::isName($right) && null !== $defExpr = $right->getAttribute('defining_expr')) { + $scope = $this->firstPreciserScopeKnowingConditionOutcome($defExpr, $scope, $condition); + } + } else { + $rightIsRefinable = false; + $rightType = $right->getAttribute('type'); + $scope = $this->firstPreciserScopeKnowingConditionOutcome($right, $scope, $condition); + } + + if ($condition) { + if (null !== $rightType) { + $rightType = $rightType->getRestrictedTypeGivenToBooleanOutcome($condition); + } + + // creating new scope + if ((null !== $leftType && $leftIsRefinable) + || (null !== $rightType && $rightIsRefinable)) { + $informed = $scope->createChildFlowScope(); + + if ($leftIsRefinable && null !== $leftType) { + $this->declareNameInScope($informed, $left, $leftType); + } + if ($rightIsRefinable && null !== $rightType) { + $this->declareNameInScope($informed, $right, $rightType); + } + + return $informed; + } + } + + return $scope; + } + + /** + * Handles the case where a AND/OR condition may be short circuiting. + * + * @param \PHPParser_Node $left + * @param \PHPParser_Node $right + * @param \Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\LinkedFlowScope $blindScope + * @param boolean $condition + * + * @return \Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\LinkedFlowScope + */ + private function caseAndOrMaybeShortCircuiting(\PHPParser_Node $left, + \PHPParser_Node $right, LinkedFlowScope $blindScope, $condition) + { + $leftScope = $this->narrowMaybeConditionScope($left, $blindScope, ! $condition); + if (null === $leftVar = $leftScope->findUniqueRefinedSlot($blindScope)) { + return $blindScope; + } + + $rightScope = $this->narrowMaybeConditionScope($left, $blindScope, $condition); + $rightScope = $this->narrowMaybeConditionScope($right, $rightScope, ! $condition); + + $rightVar = $rightScope->findUniqueRefinedSlot($blindScope); + if (null === $rightVar || $leftVar->getName() !== $rightVar->getName()) { + return $blindScope; + } + + $type = $leftVar->getType()->getLeastSupertype($rightVar->getType()); + $informed = $blindScope->createChildFlowScope(); + $informed->inferSlotType($leftVar->getName(), $type); + + return $informed; + } + + private function narrowMaybeConditionScope(\PHPParser_Node $expr, LinkedFlowScope $blindScope, $condition) + { + // In contrast to a non-short-circuiting condition scope, for may-be short-circuiting scopes, + // we make the simplification to not narrow down the expression, and the defining expression + // by always using the defining expression in case the variable is of boolean type and never + // if it has a different type. + if (NodeUtil::isName($expr) && (null !== $defExpr = $expr->getAttribute('defining_expr')) + && (null !== $exprType = $expr->getAttribute('type')) + && $exprType->isBooleanType()) { + return $this->firstPreciserScopeKnowingConditionOutcome($defExpr, $blindScope, $condition); + } + + return $this->firstPreciserScopeKnowingConditionOutcome($expr, $blindScope, $condition); + } + + private function caseGetClassFunctionCall(\PHPParser_Node $node, PhpType $type, $value, $resultEqualsValue, LinkedFlowScope $blindScope) + { + $restrictedType = $this->getRestrictedByGetClassResult($type, $value, $resultEqualsValue); + if (null === $restrictedType) { + return $blindScope; + } + + $informed = $blindScope->createChildFlowScope(); + $this->declareNameInScope($informed, $node, $restrictedType); + + return $informed; + } + + private function caseGettypeFunctionCall(\PHPParser_Node $node, PhpType $type, $value, $resultEqualsValue, LinkedFlowScope $blindScope) + { + $restrictedType = $this->getRestrictedByGettypeResult($type, $value, $resultEqualsValue); + + // cannot narrow the scope + if (null === $restrictedType) { + return $blindScope; + } + + $informed = $blindScope->createChildFlowScope(); + $this->declareNameInScope($informed, $node, $restrictedType); + + return $informed; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/AbstractScopeBuilder.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/AbstractScopeBuilder.php new file mode 100644 index 0000000..2683421 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/AbstractScopeBuilder.php @@ -0,0 +1,334 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ScopeBuilder; + +use Scrutinizer\PhpAnalyzer\PhpParser\DocCommentParser; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use Scrutinizer\PhpAnalyzer\PhpParser\Traversal\CallbackInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ArrayType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnionTypeBuilder; + +abstract class AbstractScopeBuilder implements CallbackInterface +{ + /** @var Scope */ + protected $scope; + + protected $typeRegistry; + protected $commentParser; + + protected $importedClasses = array(); + + public function __construct(Scope $scope, TypeRegistry $registry) + { + $this->scope = $scope; + $this->typeRegistry = $registry; + $this->commentParser = new DocCommentParser($registry); + } + + public function shouldTraverse(NodeTraversal $traversal, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if (NodeUtil::isScopeCreator($node) && null !== $parent) { + if ($node instanceof \PHPParser_Node_Expr_Closure) { + $node->setAttribute('type', $this->typeRegistry->getClassOrCreate('Closure')); + } + + return false; + } + + return true; + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + $className = null; + $classParent = $node; + while ($classParent = $classParent->getAttribute('parent')) { + if ($classParent instanceof \PHPParser_Node_Stmt_Class) { + $className = implode("\\", $classParent->namespacedName->parts); + break; + } + } + + $this->commentParser->setCurrentClassName($className); + $this->commentParser->setImportedNamespaces($this->importedClasses); + $this->attachLiteralTypes($node, $parent); + + switch (true) { + case $node instanceof \PHPParser_Node_Stmt_PropertyProperty: + $this->checkPropertyAssignment($node); + break; + + case $node instanceof \PHPParser_Node_Param: + $this->checkParameterAssignment($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Catch: + $exType = $this->typeRegistry->getClassOrCreate(implode("\\", $node->type->parts)); + + if ($this->scope->isDeclared($node->var)) { + $var = $this->scope->getVar($node->var); + if ($varType = $var->getType()) { + $exType = $this->typeRegistry->createUnionType(array($varType, $exType)); + } + $var->setType($exType); + $var->setTypeInferred(false); + } else { + $var = $this->scope->declareVar($node->var, $exType, false); + $var->setNameNode($node); + } + + break; + + case $node instanceof \PHPParser_Node_Stmt_StaticVar: + if (!$this->scope->isDeclared($node->name)) { + $type = $node->default ? $node->default->getAttribute('type') : null; + $this->scope->declareVar($node->name, $type, null !== $type); + } + break; + + case $node instanceof \PHPParser_Node_Expr_Assign: + if ($node->var instanceof \PHPParser_Node_Expr_Variable + && is_string($node->var->name) + && !$this->scope->isDeclared($node->var->name)) { + $this->scope->declareVar($node->var->name); + } + break; + } + } + + private function checkParameterAssignment(\PHPParser_Node_Param $node) + { + $builder = new UnionTypeBuilder($this->typeRegistry); + if (null !== $node->default) { + $this->attachLiteralTypes($node->default); + $type = $node->default->getAttribute('type'); + + if ($type) { + $builder->addAlternate($type); + } + } + + if ('array' === $node->type) { + $type = $this->typeRegistry->getNativeType('array'); + + // If the annotated type also contains the array type, we use the annotated + // type as it is potentially more specific, e.g. "array" or "array|null". + $annotatedType = $this->commentParser->getTypeFromParamAnnotation($node->getAttribute('parent'), $node->name); + if (null !== $containedArrayType = $this->getContainedArrayType($annotatedType)) { + $type = $containedArrayType; + } + + $builder->addAlternate($type); + } else if ($node->type instanceof \PHPParser_Node_Name) { + $builder->addAlternate($this->typeRegistry->getClassOrCreate(implode("\\", $node->type->parts))); + } + $type = $builder->build(); + + if ($type->isNoType()) { + $type = $this->commentParser->getTypeFromParamAnnotation($node->getAttribute('parent'), $node->name); + } else if ($type->isNullType()) { + $commentType = $this->commentParser->getTypeFromParamAnnotation($node->getAttribute('parent'), $node->name); + if ($commentType) { + $type = $this->typeRegistry->createNullableType($commentType); + } else { + $type = null; + } + } else if ($type->isBooleanType()) { + $commentType = $this->commentParser->getTypeFromParamAnnotation($node->getAttribute('parent'), $node->name); + if ($commentType) { + $type = $this->typeRegistry->createUnionType(array($type, $commentType)); + } + } + + if (null === $type) { + $type = $this->typeRegistry->getNativeType('unknown'); + } + $node->setAttribute('type', $type); + + // This could be the case if the same name is used twice as parameter. + if (false === $this->scope->isDeclared($node->name)) { + $var = $this->scope->declareVar($node->name, $type, null === $type); + $var->setNameNode($node); + $var->setReference($node->byRef); + } else { + $var = $this->scope->getVar($node->name); + if ($varType = $var->getType()) { + $var->setType($this->typeRegistry->createUnionType(array($varType, $type))); + } else if (null !== $type) { + $var->setType($type); + $var->setTypeInferred(true); + } + $var->setReference($node->byRef); + } + } + + /** + * Returns the array type contained in the given type, or null if no array + * type is available. + * + * @param PhpType|null $type + * + * @return ArrayType|null + */ + private function getContainedArrayType(PhpType $type = null) + { + if (null === $type) { + return null; + } + + if ($type->isArrayType()) { + return $type; + } + + if ( ! $type->isUnionType()) { + return null; + } + + foreach ($type->getAlternates() as $alt) { + if ($alt->isArrayType()) { + return $alt; + } + } + + return null; + } + + /** + * Checks properties for types. + * + * The following precedence is used: + * + * 1. Checks rhs for type + * 2. Checks for a "@var" annotation + */ + private function checkPropertyAssignment(\PHPParser_Node_Stmt_PropertyProperty $node) + { + if (null !== $node->default && null !== $type = $node->default->getAttribute('type')) { + // If we receive a generic array, let's see if there is a @var annotation + // that is more specific about the type. + if ($type instanceof ArrayType + && null === $type->getElementType()) { + $newType = $this->commentParser->getTypeFromVarAnnotation($node); + + if ($newType instanceof ArrayType && null !== $type->getElementType()) { + $type = $newType; + } + } + + $node->setAttribute('type', $type); + } else if (null !== $type = $this->commentParser->getTypeFromVarAnnotation($node)) { + $node->setAttribute('type', $type); + } + } + + private function attachLiteralTypes(\PHPParser_Node $node, \PHPParser_Node $parent = null) + { + switch (true) { + case $node instanceof \PHPParser_Node_Name_FullyQualified: + $node->setAttribute('type', $this->typeRegistry->getClassOrCreate(implode("\\", $node->parts))); + break; + + case $node instanceof \PHPParser_Node_Name: + if ($parent instanceof \PHPParser_Node_Expr_New + || $parent instanceof \PHPParser_Node_Expr_StaticPropertyFetch + || $parent instanceof \PHPParser_Node_Expr_StaticCall + || $parent instanceof \PHPParser_Node_Expr_Instanceof + || $parent instanceof \PHPParser_Node_Stmt_Catch) { + $name = implode("\\", $node->parts); + $lowerName = strtolower($name); + + if ('static' === $name) { + $node->setAttribute('type', $this->typeRegistry->getThisType($this->scope->getTypeOfThis())); + } else if ('self' === $name) { + $node->setAttribute('type', $this->scope->getTypeOfThis()); + } else if ('parent' === $name) { + $thisType = $this->scope->getTypeOfThis()->toMaybeObjectType(); + if (null === $thisType || ! $thisType->isClass() || null === $thisType->getSuperClassType()) { + $node->setAttribute('type', $this->typeRegistry->getNativeType('unknown')); + } else { + $node->setAttribute('type', $thisType->getSuperClassType()); + } + } else { + $node->setAttribute('type', $this->typeRegistry->getClassOrCreate($name)); + } + } + break; + + case $node instanceof \PHPParser_Node_Expr_Array: + case $node instanceof \PHPParser_Node_Expr_Cast_Array: + // We only do attach the generic array type on the first build. + // For subsequent builds, other passes likely have already made + // the array type more specific. + if (null === $node->getAttribute('type')) { + $node->setAttribute('type', $this->typeRegistry->getNativeType('array')); + } + break; + + case $node instanceof \PHPParser_Node_Expr_UnaryMinus: + case $node instanceof \PHPParser_Node_Expr_UnaryPlus: + case $node instanceof \PHPParser_Node_Scalar_LNumber: + case $node instanceof \PHPParser_Node_Scalar_LineConst: + $node->setAttribute('type', $this->typeRegistry->getNativeType('integer')); + break; + + case $node instanceof \PHPParser_Node_Scalar_DNumber: + $node->setAttribute('type', $this->typeRegistry->getNativeType('double')); + break; + + case $node instanceof \PHPParser_Node_Scalar_String: + case $node instanceof \PHPParser_Node_Scalar_FileConst: + case $node instanceof \PHPParser_Node_Scalar_DirConst: + $node->setAttribute('type', $this->typeRegistry->getNativeType('string')); + break; + + case $node instanceof \PHPParser_Node_Expr_ClassConstFetch: + if ($node->class instanceof \PHPParser_Node_Name + && in_array($node->class->parts[0], array('self', 'static')) + && (null !== $thisType = $this->scope->getTypeOfThis()) + && (null !== $objType = $thisType->toMaybeObjectType()) + && ($objType->isClass() || $objType->isInterface()) + && $objType->hasConstant($node->name)) { + $node->setAttribute('type', $objType->getConstant($node->name)->getPhpType()); + } + + break; + + case $node instanceof \PHPParser_Node_Expr_ConstFetch: + $nameParts = $node->name->parts; + + if (1 === count($nameParts)) { + $name = strtolower($nameParts[0]); + + if ('true' === $name) { + $node->setAttribute('type', $this->typeRegistry->getNativeType('boolean')); + } else if ('false' === $name) { + $node->setAttribute('type', $this->typeRegistry->getNativeType('false')); + } else if ('null' === $name) { + $node->setAttribute('type', $this->typeRegistry->getNativeType('null')); + } + } + + break; + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/GlobalScopeBuilder.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/GlobalScopeBuilder.php new file mode 100644 index 0000000..35a4069 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/GlobalScopeBuilder.php @@ -0,0 +1,35 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ScopeBuilder; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; + +class GlobalScopeBuilder extends AbstractScopeBuilder +{ + public function shouldTraverse(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if ($node instanceof \PHPParser_Node_Stmt_Namespace) { + $this->importedClasses = array('' => $node->name ? implode("\\", $node->name->parts) : ''); + } else if ($node instanceof \PHPParser_Node_Stmt_UseUse) { + $this->importedClasses[$node->alias] = implode("\\", $node->name->parts); + } + + return parent::shouldTraverse($t, $node, $parent); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/LocalScopeBuilder.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/LocalScopeBuilder.php new file mode 100644 index 0000000..8f6c55e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/ScopeBuilder/LocalScopeBuilder.php @@ -0,0 +1,88 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ScopeBuilder; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; + +class LocalScopeBuilder extends AbstractScopeBuilder +{ + public function shouldTraverse(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if (!isset($this->importedClasses[''])) { + $this->gatherNamespaceInfo($node); + } + + return parent::shouldTraverse($t, $node, $parent); + } + + private function gatherNamespaceInfo(\PHPParser_Node $node) + { + // search for a namespace node + $namespaceNode = $node; + while (!$namespaceNode instanceof \PHPParser_Node_Stmt_Namespace) { + $node = $namespaceNode->getAttribute('parent'); + if (!$node) { + break; + } + + $namespaceNode = $node; + } + + if (!$namespaceNode instanceof \PHPParser_Node_Stmt_Namespace) { + $this->importedClasses[''] = ''; + } else { + $this->importedClasses[''] = null === $namespaceNode->name ? '' : implode("\\", $namespaceNode->name->parts); + } + + $this->scanUseStmts($namespaceNode); + } + + private function scanUseStmts(\PHPParser_Node $node) + { + if ($node instanceof \PHPParser_Node_Stmt_UseUse) { + $this->importedClasses[$node->alias] = implode("\\", $node->name->parts); + } + + // For these nodes we will bail-out early as they cannot contain use + // statements anyway. This list is not complete, but should still speed + // up the search significantly. + if ($node instanceof \PHPParser_Node_Stmt_Class + || $node instanceof \PHPParser_Node_Stmt_Function + || $node instanceof \PHPParser_Node_Stmt_Interface + || $node instanceof \PHPParser_Node_Stmt_Trait + || $node instanceof \PHPParser_Node_Expr_Closure) { + return; + } + + // Scan children for use statements. + foreach ($node as $subNode) { + if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + if (!$aSubNode instanceof \PHPParser_Node) { + continue; + } + + $this->scanUseStmts($aSubNode); + } + } else if ($subNode instanceof \PHPParser_Node) { + $this->scanUseStmts($subNode); + } + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/SimpleSlot.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/SimpleSlot.php new file mode 100644 index 0000000..e24af1e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/SimpleSlot.php @@ -0,0 +1,62 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference; + +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\StaticSlotInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +class SimpleSlot implements StaticSlotInterface +{ + private $name; + private $type; + private $typeInferred; + private $reference = false; + + public function __construct($name, PhpType $type, $typeInferred) + { + $this->name = $name; + $this->type = $type; + $this->typeInferred = $typeInferred; + } + + public function getName() + { + return $this->name; + } + + public function getType() + { + return $this->type; + } + + public function isTypeInferred() + { + return $this->typeInferred; + } + + public function isReference() + { + return $this->reference; + } + + public function setReference($bool) + { + $this->reference = (boolean) $bool; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/TypeInference.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/TypeInference.php new file mode 100644 index 0000000..30fc56e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/TypeInference.php @@ -0,0 +1,1451 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference; + +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowGraph; +use Scrutinizer\PhpAnalyzer\ControlFlow\GraphEdge; +use Scrutinizer\PhpAnalyzer\DataFlow\BinaryJoinOp; +use Scrutinizer\PhpAnalyzer\DataFlow\BranchedForwardDataFlowAnalysis; +use Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Variable; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ArrayType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NamedType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ThisType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnionType; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter\FunctionInterpreterInterface; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter\ReverseInterpreterInterface; +use Scrutinizer\PhpAnalyzer\Model\ClassProperty; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\ContainerMethodInterface; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use JMS\PhpManipulator\PhpParser\BlockNode; + +class TypeInference extends BranchedForwardDataFlowAnalysis +{ + /** @var LoggerInterface */ + private $logger; + + /** @var TypeRegistry */ + private $typeRegistry; + + /** @var ReverseInterpreterInterface */ + private $reverseInterpreter; + + /** @var FunctionInterpreterInterface */ + private $functionInterpreter; + + /** @var MethodInterpreter\MethodInterpreterInterface */ + private $methodInterpreter; + + /** @var \Scrutinizer\PhpAnalyzer\PhpParser\DocCommentParser */ + private $commentParser; + + /** @var Scope */ + private $syntacticScope; + + /** @var LinkedFlowScope */ + private $functionScope; + + /** @var LinkedFlowScope */ + private $bottomScope; + + /** + * Returns whether the given node has a uniquely identifying name. + * + * @param \PHPParser_Node $node + * + * @return boolean + */ + public static function hasQualifiedName(\PHPParser_Node $node) + { + return null !== self::getQualifiedName($node); + } + + /** + * Returns a name that uniquely identifies a slot in the flow scope. + * + * @param \PHPParser_Node $node + * + * @return string|null + */ + public static function getQualifiedName(\PHPParser_Node $node) + { + if ($node instanceof \PHPParser_Node_Expr_Variable) { + return is_string($node->name) ? $node->name : null; + } + + if ($node instanceof \PHPParser_Node_Expr_StaticPropertyFetch) { + if ( ! $node->class instanceof \PHPParser_Node_Name) { + return null; + } + + if ( ! is_string($node->name)) { + return null; + } + + $objType = $node->class->getAttribute('type'); + if (null === $objType || null === $resolvedObjType = $objType->toMaybeObjectType()) { + if ($objType instanceof NamedType) { + return $objType->getReferenceName().'::$'.$node->name; + } + + return null; + } + + // If this property has been declared correctly, then we fetch the declaring class + // to make type inference a bit more precise. Otherwise, we will simply fallback + // to using the current class name, and assume that it will be implicitly declared. + if ($resolvedObjType->isClass() && $resolvedObjType->hasProperty($node->name)) { + return $resolvedObjType->getProperty($node->name)->getDeclaringClass().'::$'.$node->name; + } + + return $resolvedObjType->getName().'::$'.$node->name; + } + + if ($node instanceof \PHPParser_Node_Expr_PropertyFetch) { + if ( ! $node->var instanceof \PHPParser_Node_Expr_Variable) { + return null; + } + + if ( ! is_string($node->name)) { + return null; + } + + if ( ! is_string($node->var->name)) { + return null; + } + + return $node->var->name.'->'.$node->name; + } + + return null; + } + + public static function createJoinOperation() + { + return new BinaryJoinOp(function(LinkedFlowScope $a, LinkedFlowScope $b) { + $a->frozen = true; + $b->frozen = true; + + if ($a->optimize() === $b->optimize()) { + return $a->createChildFlowScope(); + } + + return new LinkedFlowScope(FlatFlowScopeCache::createFromLinkedScopes($a, $b)); + }); + } + + public function __construct(ControlFlowGraph $cfg, ReverseInterpreterInterface $reverseInterpreter, FunctionInterpreterInterface $functionInterpreter, MethodInterpreter\MethodInterpreterInterface $methodInterpreter, \Scrutinizer\PhpAnalyzer\PhpParser\DocCommentParser $commentParser, Scope $functionScope, TypeRegistry $registry, LoggerInterface $logger = null) + { + parent::__construct($cfg, self::createJoinOperation()); + + $this->reverseInterpreter = $reverseInterpreter; + $this->functionInterpreter = $functionInterpreter; + $this->methodInterpreter = $methodInterpreter; + $this->syntacticScope = $functionScope; + $this->commentParser = $commentParser; + $this->functionScope = LinkedFlowScope::createLatticeElement($functionScope); + $this->bottomScope = LinkedFlowScope::createLatticeElement( + Scope::createBottomScope($functionScope->getRootNode(), $functionScope->getTypeOfThis())); + $this->typeRegistry = $registry; + $this->logger = $logger ?: new NullLogger(); + } + + protected function createInitialEstimateLattice() + { + return $this->bottomScope; + } + + protected function createEntryLattice() + { + return $this->functionScope; + } + + /** + * Calculates the out lattices for the different branches. + * + * Right now, we just treat ON_EX edges like UNCOND edges. If we want to be perfect, we would have to actually join + * all the out lattices of this flow with the in lattice, and then make that the out lattice for the ON_EX edge. + * However, that would add some extra computation for an edge case. So, the current behavior looks like a "good enough" + * approximation. + * + * @param \PHPParser_Node $source + * @param LatticeElementInterface $input + * + * @return array + */ + protected function branchedFlowThrough($source, LatticeElementInterface $input) + { + assert($source instanceof \PHPParser_Node); + assert($input instanceof LinkedFlowScope); + + // If we have not walked a path from the entry node to this node, we cannot infer anything + // about this scope. So, just skip it for now, we will come back later. + if ($input === $this->bottomScope) { + $output = $input; + } else { + $output = $input->createChildFlowScope(); + $output = $this->traverse($source, $output); + } + + $condition = $conditionFlowScope = $conditionOutcomes = null; + $result = array(); + foreach ($this->cfg->getOutEdges($source) as $branchEdge) { + $branch = $branchEdge->getType(); + $newScope = $output; + + switch ($branch) { + case GraphEdge::TYPE_ON_TRUE: + if ($source instanceof \PHPParser_Node_Stmt_Foreach) { + $informed = $this->traverse($source->expr, $output->createChildFlowScope()); + $exprType = $this->getType($source->expr); + + if (null !== $source->keyVar && $source->keyVar instanceof \PHPParser_Node_Expr_Variable) { + $keyType = null; + if ($exprType->isArrayType()) { + $keyType = $exprType->toMaybeArrayType()->getKeyType(); + } + + // If we do not have the precise key type available, we can always + // assume it to be either a string, or an integer. + $this->redeclareSimpleVar($informed, $source->keyVar, $keyType ?: $this->typeRegistry->getNativeType('generic_array_key')); + } + + $valueType = $this->typeRegistry->getNativeType('unknown'); + if ($exprType->isArrayType()) { + $valueType = $exprType->toMaybeArrayType()->getElementType(); + } else if ($exprType->toMaybeObjectType()) { + $valueType = $exprType->toMaybeObjectType()->getTraversableElementType(); + } + $source->valueVar->setAttribute('type', $valueType); + $this->redeclareSimpleVar($informed, $source->valueVar, $valueType); + + $newScope = $informed; + + break; + } + + // FALL THROUGH + + case GraphEdge::TYPE_ON_FALSE: + if (null === $condition) { + $condition = NodeUtil::getConditionExpression($source); + if (null === $condition && $source instanceof \PHPParser_Node_Stmt_Case + // Do ignore DEFAULT statements. + && null !== $source->cond) { + $condition = $source; + + // conditionFlowScope is cached from previous iterations of the loop + if (null === $conditionFlowScope) { + $conditionFlowScope = $this->traverse($source->cond, $output->createChildFlowScope()); + } + } + } + + if (null !== $condition) { + if ($condition instanceof \PHPParser_Node_Expr_BooleanAnd + || $condition instanceof \PHPParser_Node_Expr_LogicalAnd + || $condition instanceof \PHPParser_Node_Expr_BooleanOr + || $condition instanceof \PHPParser_Node_Expr_LogicalOr) { + // When handling the short-circuiting binary operators, the outcome scope on true can be + // different than the outcome scope on false. + // + // TODO: + // The "right" way to do this is to carry the known outcome all the way through the + // recursive traversal, so that we can construct a different flow scope based on the outcome. + // However, this would require a bunch of code and a bunch of extra computation for an edge + // case. This seems to be a "good enough" approximation. + + // conditionOutcomes is cached from previous iterations of the loop. + if (null === $conditionOutcomes) { + $conditionOutcomes = ($condition instanceof \PHPParser_Node_Expr_BooleanAnd + || $condition instanceof \PHPParser_Node_Expr_LogicalAnd) + ? $this->traverseAnd($condition, $output->createChildFlowScope()) + : $this->traverseOr($condition, $output->createChildFlowScope()); + } + + $newScope = $this->reverseInterpreter->getPreciserScopeKnowingConditionOutcome( + $condition, $conditionOutcomes->getOutcomeFlowScope( + $condition, $branch === GraphEdge::TYPE_ON_TRUE), + $branch === GraphEdge::TYPE_ON_TRUE); + } else { + // conditionFlowScope is cached from previous iterations of the loop. + if (null === $conditionFlowScope) { + // In case of a FOR loop, $condition might be an array of expressions. PHP will execute + // all expressions, but only the last one is used to determine the expression outcome. + if (is_array($condition)) { + $conditionFlowScope = $output->createChildFlowScope(); + foreach ($condition as $cond) { + $conditionFlowScope = $this->traverse($cond, $conditionFlowScope); + } + } else { + $conditionFlowScope = $this->traverse($condition, $output->createChildFlowScope()); + } + } + + // See above comment regarding the handling of FOR loops. + $relevantCondition = $condition; + if (is_array($condition)) { + $relevantCondition = end($condition); + } + + $newScope = $this->reverseInterpreter->getPreciserScopeKnowingConditionOutcome( + $relevantCondition, $conditionFlowScope, $branch === GraphEdge::TYPE_ON_TRUE); + } + } + break; + } + + if (null === $newScope) { + throw new \LogicException('$newScope must not be null for source '.get_class($source).' and branch '.GraphEdge::getLiteral($branch).'.'); + } + + $result[] = $newScope->optimize(); + } + + return $result; + } + + private function traverse(\PHPParser_Node $node, LinkedFlowScope $scope) + { + if (null !== $docComment = $node->getDocComment()) { + foreach ($this->commentParser->getTypesFromInlineComment($docComment) as $name => $type) { + $scope->inferSlotType($name, $type); + } + } + + switch (true) { + case $node instanceof \PHPParser_Node_Expr_Clone: + $scope = $this->traverseClone($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_Assign: + case $node instanceof \PHPParser_Node_Expr_AssignRef: + $scope = $this->traverseAssign($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_AssignList: + $scope = $this->traverseAssignList($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch: + case $node instanceof \PHPParser_Node_Expr_PropertyFetch: + $scope = $this->traverseGetProp($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_LogicalAnd: + case $node instanceof \PHPParser_Node_Expr_BooleanAnd: + $scope = $this->traverseAnd($node, $scope)->getJoinedFlowScope() + ->createChildFlowScope(); + break; + + case $node instanceof \PHPParser_Node_Expr_Array: + $scope = $this->traverseArray($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_LogicalOr: + case $node instanceof \PHPParser_Node_Expr_BooleanOr: + $scope = $this->traverseOr($node, $scope)->getJoinedFlowScope() + ->createChildFlowScope(); + break; + + case $node instanceof \PHPParser_Node_Expr_Ternary: + $scope = $this->traverseTernary($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_FuncCall: + case $node instanceof \PHPParser_Node_Expr_MethodCall: + case $node instanceof \PHPParser_Node_Expr_StaticCall: + $scope = $this->traverseCall($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_New: + $scope = $this->traverseNew($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_UnaryPlus: + case $node instanceof \PHPParser_Node_Expr_UnaryMinus: + $scope = $this->traverseUnaryPlusMinus($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_BooleanNot: + $scope = $this->traverse($node->expr, $scope); + $node->setAttribute('type', $this->typeRegistry->getNativeType('boolean')); + break; + + case $node instanceof \PHPParser_Node_Expr_Identical: + case $node instanceof \PHPParser_Node_Expr_Equal: + case $node instanceof \PHPParser_Node_Expr_Greater: + case $node instanceof \PHPParser_Node_Expr_GreaterOrEqual: + case $node instanceof \PHPParser_Node_Expr_NotEqual: + case $node instanceof \PHPParser_Node_Expr_NotIdentical: + case $node instanceof \PHPParser_Node_Expr_Smaller: + case $node instanceof \PHPParser_Node_Expr_SmallerOrEqual: + case $node instanceof \PHPParser_Node_Expr_LogicalXor: + case $node instanceof \PHPParser_Node_Expr_Empty: + case $node instanceof \PHPParser_Node_Expr_Cast_Bool: + case $node instanceof \PHPParser_Node_Expr_Isset: + case $node instanceof \PHPParser_Node_Expr_Instanceof: + $scope = $this->traverseChildren($node, $scope); + $node->setAttribute('type', $this->typeRegistry->getNativeType('boolean')); + break; + + case $node instanceof \PHPParser_Node_Expr_Cast_Int: + case $node instanceof \PHPParser_Node_Expr_Mod: + case $node instanceof \PHPParser_Node_Expr_BitwiseXor: + case $node instanceof \PHPParser_Node_Expr_BitwiseOr: + case $node instanceof \PHPParser_Node_Expr_BitwiseNot: + case $node instanceof \PHPParser_Node_Expr_BitwiseAnd: + case $node instanceof \PHPParser_Node_Expr_ShiftLeft: + case $node instanceof \PHPParser_Node_Expr_ShiftRight: + $scope = $this->traverseChildren($node, $scope); + $node->setAttribute('type', $this->typeRegistry->getNativeType('integer')); + break; + + case $node instanceof \PHPParser_Node_Expr_Cast_Double: + $scope = $this->traverseChildren($node, $scope); + $node->setAttribute('type', $this->typeRegistry->getNativeType('double')); + break; + + case $node instanceof \PHPParser_Node_Expr_AssignPlus: + $scope = $this->traversePlus($node, $node->var, $node->expr, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_Plus: + $scope = $this->traversePlus($node, $node->left, $node->right, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_AssignDiv: + case $node instanceof \PHPParser_Node_Expr_AssignMinus: + case $node instanceof \PHPParser_Node_Expr_AssignMul: + case $node instanceof \PHPParser_Node_Expr_Div: + case $node instanceof \PHPParser_Node_Expr_Minus: + case $node instanceof \PHPParser_Node_Expr_Mul: + $scope = $this->traverseChildren($node, $scope); + + if (isset($node->left, $node->right)) { + $left = $node->left; + $right = $node->right; + } else if (isset($node->var, $node->expr)) { + $left = $node->var; + $right = $node->expr; + } else { + throw new \LogicException('Previous statements were exhaustive.'); + } + + if ($this->getType($left)->isIntegerType() && $this->getType($right)->isIntegerType()) { + $type = $this->typeRegistry->getNativeType('integer'); + } else if ($this->getType($left)->isDoubleType() || $this->getType($right)->isDoubleType()) { + $type = $this->typeRegistry->getNativeType('double'); + } else { + $type = $this->typeRegistry->getNativeType('number'); + } + + $node->setAttribute('type', $type); + $this->updateScopeForTypeChange($scope, $left, $this->getType($left), $type); + + break; + + case $node instanceof \PHPParser_Node_Expr_PostDec: + case $node instanceof \PHPParser_Node_Expr_PostInc: + case $node instanceof \PHPParser_Node_Expr_PreDec: + case $node instanceof \PHPParser_Node_Expr_PreInc: + $scope = $this->traverseChildren($node, $scope); + + if ($this->getType($node->var)->isIntegerType()) { + $node->setAttribute('type', $this->typeRegistry->getNativeType('integer')); + } else if ($this->getType($node->var)->isDoubleType()) { + $node->setAttribute('type', $this->typeRegistry->getNativeType('double')); + } else { + $node->setAttribute('type', $this->typeRegistry->getNativeType('number')); + } + + break; + + case $node instanceof \PHPParser_Node_Expr_Cast_String: + case $node instanceof \PHPParser_Node_Expr_Concat: + $scope = $this->traverseChildren($node, $scope); + $node->setAttribute('type', $this->typeRegistry->getNativeType('string')); + break; + + case $node instanceof \PHPParser_Node_Stmt_Return: + $scope = $this->traverseReturn($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_Variable: + $scope = $this->traverseVariable($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Stmt_Echo: + case $node instanceof \PHPParser_Node_Expr_ArrayItem: + case $node instanceof \PHPParser_Node_Stmt_Throw: + $scope = $this->traverseChildren($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Arg: + $scope = $this->traverseChildren($node, $scope); + $node->setAttribute('type', $node->value->getAttribute('type')); + break; + + case $node instanceof \PHPParser_Node_Stmt_Switch: + $scope = $this->traverse($node->cond, $scope); + break; + + case $node instanceof \PHPParser_Node_Stmt_Catch: + $scope = $this->traverseCatch($node, $scope); + break; + + case $node instanceof \PHPParser_Node_Expr_ArrayDimFetch: + $scope = $this->traverseArrayDimFetch($node, $scope); + break; + } + + return $scope; + } + + private function traversePlus(\PHPParser_Node_Expr $plusExpr, \PHPParser_Node_Expr $left, \PHPParser_Node_Expr $right, LinkedFlowScope $scope) + { + $scope = $this->traverseChildren($plusExpr, $scope); + + $leftType = $this->getType($left); + $rightType = $this->getType($right); + + // If both sides are unknown, we leave the outcome at unknown type. The alternative would be to assume the union, + // integer, double, and array types, which would most likely never be the case in the real world, and just result + // in weird error messages without any real benefit. + if ($leftType->isUnknownType() && $rightType->isUnknownType()) { + $resultType = $this->typeRegistry->getNativeType('unknown'); + } else { + $joinTypes = array(); + if ( ! $leftType->isUnknownType()) { + $joinTypes[] = $leftType; + } + if ( ! $rightType->isUnknownType()) { + $joinTypes[] = $rightType; + } + $joinedType = $this->typeRegistry->createUnionType($joinTypes); + + switch (true) { + // If only integer is available, then that is the resulting type. + // In rare circumstances, we might get a double even if both input types + // are integers, namely if there is an overflow. However, this seems + // like an appropriate approximation. + case $joinedType->isIntegerType(): + $resultType = $joinedType; + break; + + // If one, or both types are doubles, then the resulting type is a double + // as whatever is not a double will be cast to one. + case $joinedType->isSubtypeOf($this->typeRegistry->createUnionType(array('integer', 'double'))): + $resultType = $this->typeRegistry->getNativeType('double'); + break; + + // If all types are scalars, we assume the result to be either an integer, or a double. + // This is in line with Zend engine's behavior which tries to cast the scalar to a number. + case $joinedType->isSubtypeOf($this->typeRegistry->createUnionType(array('scalar', 'null'))): + $resultType = $this->typeRegistry->getNativeType('number'); + break; + + // If we reach this, it get's tricky as array types might be involved :/ + default: + // If we do have something else than an array, then we go + // assume the result type to be unknown. Everything else, would + // be a weird combination of types which should never happen + // in the real world and if we indeed run into this in real + // code making anything more sophisticated here would also not + // help us in any way. + if ( ! $joinedType->isSubtypeOf($this->typeRegistry->getNativeType('array'))) { + $resultType = $this->typeRegistry->getNativeType('unknown'); + } else if ($joinedType->isArrayType()) { + $resultType = $joinedType; + } else if ($joinedType->isUnionType()) { + $keyTypes = array(); + $elementTypes = array(); + + foreach ($joinedType->getAlternates() as $alt) { + if ($alt->isNoType()) { + continue; + } + + if ( ! $alt->isArrayType()) { + throw new \LogicException(sprintf('All alternates must be arrays, but got "%s".', $alt)); + } + + $keyTypes[] = $alt->getKeyType(); + + $elementType = $alt->getElementType(); + if ( ! $elementType->isUnknownType()) { + $elementTypes[] = $elementType; + } + } + + $keyType = empty($keyTypes) ? $this->typeRegistry->getNativeType('generic_array_key') + : $this->typeRegistry->createUnionType($keyTypes); + $elementType = empty($elementTypes) ? $this->typeRegistry->getNativeType('generic_array_value') + : $this->typeRegistry->createUnionType($elementTypes); + + + $resultType = $this->typeRegistry->getArrayType($elementType, $keyType); + } else { + throw new \LogicException(sprintf('The previous conditions were exhaustive, but got joined type of "%s".', $joinedType)); + } + } + } + + $plusExpr->setAttribute('type', $resultType); + $this->updateScopeForTypeChange($scope, $left, $leftType, $resultType); + + return $scope; + } + + private function traverseClone(\PHPParser_Node_Expr_Clone $node, LinkedFlowScope $scope) + { + $scope = $this->traverse($node->expr, $scope); + + if ($type = $this->getType($node->expr)) { + $type = $type->restrictByNotNull(); + + if ($type instanceof NamedType || $type->isObjectType()) { + $node->setAttribute('type', $type); + } else if ($type->isUnionType()) { + $node->setAttribute('type', $type); + } else { + $node->setAttribute('type', $this->typeRegistry->getNativeType('object')); + } + } else { + $node->setAttribute('type', $this->typeRegistry->getNativeType('object')); + } + + return $scope; + } + + private function traverseCall(\PHPParser_Node $node, LinkedFlowScope $scope) + { + assert($node instanceof \PHPParser_Node_Expr_MethodCall + || $node instanceof \PHPParser_Node_Expr_FuncCall + || $node instanceof \PHPParser_Node_Expr_StaticCall); + + $scope = $this->traverseChildren($node, $scope); + + // Propagate type for constants + if (NodeUtil::isConstantDefinition($node)) { + $constantName = $node->args[0]->value->value; + + if ($constant = $this->typeRegistry->getConstant($constantName)) { + $constant->setPhpType($this->getType($node->args[1]->value)); + } + } + + // If the assert function is called inside a block node, we are just going to assume + // that some sort of exception is thrown if the assert fails (and it will not silently + // be ignored). + // TODO: This needs to be extracted as a general concept where we can have different + // effects for functions/methods. For example, array_pop affects the known item + // types of arrays on which it is called. + if ($node->getAttribute('parent') instanceof BlockNode + && NodeUtil::isMaybeFunctionCall($node, 'assert') + && isset($node->args[0])) { + $scope = $this->reverseInterpreter->getPreciserScopeKnowingConditionOutcome($node->args[0]->value, $scope, true); + } + + $returnType = null; + if (null !== $function = $this->typeRegistry->getCalledFunctionByNode($node)) { + $node->setAttribute('returns_by_ref', $function->isReturnByRef()); + + $argValues = $argTypes = array(); + foreach ($node->args as $arg) { + $argValues[] = $arg->value; + $argTypes[] = $this->getType($arg); + } + + if ($function instanceof ContainerMethodInterface) { + $objType = $function->getContainer(); + + $maybeReturnType = $function->getReturnType(); + if (null !== $restrictedType = $this->methodInterpreter->getPreciserMethodReturnTypeKnowingArguments($function, $argValues, $argTypes)) { + $maybeReturnType = $restrictedType; + } + + $returnType = $this->updateThisReference( + $node instanceof \PHPParser_Node_Expr_MethodCall ? $node->var : $node->class, + $scope->getTypeOfThis(), + $objType, + $maybeReturnType); + } else if ($function instanceof GlobalFunction) { + if (null !== $restrictedType = $this->functionInterpreter->getPreciserFunctionReturnTypeKnowingArguments($function, $argValues, $argTypes)) { + $returnType = $restrictedType; + } else if (null === $returnType) { + $returnType = $function->getReturnType(); + } + } else { + throw new \LogicException(sprintf('Unknown function "%s".', get_class($function))); + } + } + $node->setAttribute('type', $returnType ?: $this->typeRegistry->getNativeType('unknown')); + + return $scope; + } + + /** + * Updates the context of returned ThisType types. + * + * ```php + * class A { + * public function returnsThis() { + * return $this; // this + * } + * } + * + * class B extends A { + * public function returnsSomething() { + * $rs = $this->returnsThis(); + * + * return $rs; // this + * } + * + * public function returnsSomethingElse() + * { + * $rs = parent::returnsThis(); + * + * return $rs; // this + * } + * } + * + * class C extends B { } + * + * $c = new C(); + * $c->returnsThis(); // object + * $c->returnsSomething(); // object + * ``` + * + * We have two basic cases: + * + * 1. The called node refers to the current scope ($this->, self::, + * parent::, static::, or SuperTypeName::). + * 2. The node was called from the "outside" $foo->...(). + * + * In the first case, we need to preserve the wrapping with ThisType with + * an updated creation context. In the second case, we have to unwrap the + * ThisType. + * + * @param \PHPParser_Node $calledNode + * @param PhpType $thisType Type of the current context + * @param PhpType $calledType Type of the $calledNode + * @param PhpType $returnType + * + * @return PhpType + */ + private function updateThisReference(\PHPParser_Node $calledNode, PhpType $thisType = null, PhpType $calledType, PhpType $returnType = null) + { + // Delays execution until necessary. + $needsWrapping = function() use ($calledNode, $thisType, $calledType) { + if (null === $thisType) { + return false; + } + + switch (true) { + case $calledNode instanceof \PHPParser_Node_Expr_Variable: + return 'this' === $calledNode->name; + + case $calledNode instanceof \PHPParser_Node_Name: + if (in_array(strtolower(implode("\\", $calledNode->parts)), array('self', 'static', 'parent'), true)) { + return true; + } + + // This handles the following case: + // + // class A { public function foo() { return $this; } } + // class B extends A { public function bar() { return A::foo(); } } + // $x = (new B())->bar(); + // + // $x is resolved to object. + if (null !== $thisType && $thisType->isSubtypeOf($calledType)) { + return true; + } + + return false; + + default: + return false; + } + }; + + switch (true) { + case $returnType instanceof ThisType: + return $needsWrapping() ? $this->typeRegistry->getThisType($thisType) : $calledType; + + case $returnType instanceof UnionType: + $types = array(); + foreach ($returnType->getAlternates() as $alt) { + if ($alt instanceof ThisType) { + $types[] = $needsWrapping() ? $this->typeRegistry->getThisType($thisType) : $calledType; + + continue; + } + + $types[] = $alt; + } + + return $this->typeRegistry->createUnionType($types); + + default: + return $returnType; + } + } + + /** + * On the first run of the type inference engine, arrays always have + * the generic array type at this point. This is assigned by the + * {@see AbstractScopeBuilder::attachLiteralTypes}. + * + * We try to make this more specific by introspecting the values of + * the items which are assigned. + * + * @param \PHPParser_Node_Expr_Array $node + * @param LinkedFlowScope $scope + * + * @return LinkedFlowScope + */ + private function traverseArray(\PHPParser_Node_Expr_Array $node, LinkedFlowScope $scope) + { + $keyTypes = $elementTypes = $itemTypes = array(); + + $lastNumericKey = -1; + $containsDynamicKey = false; + foreach ($node->items as $item) { + assert($item instanceof \PHPParser_Node_Expr_ArrayItem); + + $scope = $this->traverse($item, $scope); + + if (null === $item->key) { + $keyTypes[] = 'integer'; + } else if (null !== $type = $item->key->getAttribute('type')) { + $keyTypes[] = $type; + } else { + // If the key type is not available, then we will just assume both + // possible types. It's not that bad after all. + $keyTypes[] = 'string'; + $keyTypes[] = 'integer'; + } + + $itemName = null; + $keyValue = NodeUtil::getValue($item->key); + if (null === $item->key && ! $containsDynamicKey) { + $itemName = ++$lastNumericKey; + } else if ($keyValue->isDefined()) { + // We cast everything to a string (even integers), and then process + // both cases: 1) numeric key, and 2) anything else + $keyValue = (string) $keyValue->get(); + + if (ctype_digit($keyValue)) { // Case 1) + $itemName = (integer) $keyValue; + + // PHP will always use the next highest number starting from the + // greatest numeric value that the array contains when no explicit + // key has been defined; so, we need to keep track of this. + if ($itemName > $lastNumericKey) { + $lastNumericKey = $itemName; + } + } else { // Case 2) + $itemName = $keyValue; + } + } else { + $containsDynamicKey = true; + } + + if (null !== $type = $item->value->getAttribute('type')) { + if (null !== $itemName) { + $itemTypes[$itemName] = $type; + } + + $elementTypes[] = $type; + } + } + + $node->setAttribute('type', $this->typeRegistry->getArrayType( + $elementTypes ? $this->typeRegistry->createUnionType($elementTypes) : null, + $keyTypes ? $this->typeRegistry->createUnionType($keyTypes) : null, + $itemTypes)); + + return $scope; + } + + private function traverseArrayDimFetch(\PHPParser_Node_Expr_ArrayDimFetch $node, LinkedFlowScope $scope) + { + $scope = $this->traverseChildren($node, $scope); + + $varType = $this->getType($node->var); + if ($varType->isStringType()) { + $node->setAttribute('type', $this->typeRegistry->getNativeType('string')); + } else if ($varType->isArrayType()) { + $itemType = NodeUtil::getValue($node->dim) + ->flatMap([$varType, 'getItemType']) + ->getOrCall([$varType, 'getElementType']); + + $node->setAttribute('type', $itemType); + } else { + $node->setAttribute('type', $this->typeRegistry->getNativeType('unknown')); + } + + return $this->dereferencePointer($node->var, $scope); + } + + private function traverseCatch(\PHPParser_Node_Stmt_Catch $node, LinkedFlowScope $scope) + { + $className = implode("\\", $node->type->parts); + $type = $this->typeRegistry->getClassOrCreate($className); + $scope->inferSlotType($node->var, $type); + + return $scope; + } + + /** + * Traverse a return value. + */ + private function traverseReturn(\PHPParser_Node_Stmt_Return $node, LinkedFlowScope $scope) + { + $scope = $this->traverseChildren($node, $scope); + + if (null === $node->expr) { + $node->setAttribute('type', $this->typeRegistry->getNativeType('null')); + } else { + $node->setAttribute('type', $this->getType($node->expr)); + } + + return $scope; + } + + private function traverseVariable(\PHPParser_Node_Expr_Variable $node, LinkedFlowScope $scope) + { + if ('this' === $node->name) { + if (null === $scope->getTypeOfThis()) { + $node->setAttribute('type', $this->typeRegistry->getNativeType('none')); + + return $scope; + } + + $node->setAttribute('type', $this->typeRegistry->getThisType($scope->getTypeOfThis())); + + return $scope; + } + + if (is_string($node->name)) { + $slot = $scope->getSlot($node->name); + if ($slot && $type = $slot->getType()) { + $node->setAttribute('type', $type); + } + } else { + $scope = $this->traverseChildren($node, $scope); + } + + return $scope; + } + + private function traverseUnaryPlusMinus(\PHPParser_Node $node, LinkedFlowScope $scope) + { + $scope = $this->traverse($node->expr, $scope); + + $exprType = $node->expr->getAttribute('type'); + $type = null; + if ($exprType) { + if ($exprType->isIntegerType()) { + $type = $this->typeRegistry->getNativeType('integer'); + } else if ($exprType->isDoubleType()) { + $type = $this->typeRegistry->getNativeType('double'); + } + } + + $node->setAttribute('type', $type ?: $this->typeRegistry->getNativeType('number')); + + return $scope; + } + + private function traverseNew(\PHPParser_Node_Expr_New $node, LinkedFlowScope $scope) + { + $scope = $this->traverse($node->class, $scope); + + $type = null; + if ($node->class instanceof \PHPParser_Node_Name) { + $type = $node->class->getAttribute('type'); + } + if (null === $type) { + $type = $this->typeRegistry->getNativeType('object'); + } + $node->setAttribute('type', $type); + + foreach ($node->args as $arg) { + $scope = $this->traverse($arg, $scope); + } + + return $scope; + } + + private function traverseAnd(\PHPParser_Node $node, LinkedFlowScope $scope) + { + return $this->traverseShortCircuitingBinOp($node, $scope, true); + } + + private function traverseTernary(\PHPParser_Node_Expr_Ternary $n, LinkedFlowScope $scope) + { + if (null === $n->if) { // $a ?: $b + $condition = new \PHPParser_Node_Expr_NotIdentical(new \PHPParser_Node_Expr_ConstFetch(new \PHPParser_Node_Name(array('null'))), $n->cond); + $trueNode = $n->cond; + $falseNode = $n->else; + } else { // $a ? $b : $c + $condition = $n->cond; + $trueNode = $n->if; + $falseNode = $n->else; + } + + // verify the condition + $scope = $this->traverse($condition, $scope); + + // reverse abstract interpret the condition to produce two new scopes + $trueScope = $this->reverseInterpreter->getPreciserScopeKnowingConditionOutcome($condition, $scope, true); + $falseScope = $this->reverseInterpreter->getPreciserScopeKnowingConditionOutcome($condition, $scope, false); + + // traverse the true node with the trueScope + $this->traverse($trueNode, $trueScope->createChildFlowScope()); + + // traverse the false node with the falseScope + $this->traverse($falseNode, $falseScope->createChildFlowScope()); + + // meet true and false node's types and assign + $trueType = $trueNode->getAttribute('type'); + $falseType = $falseNode->getAttribute('type'); + + // For statements such as $a ?: $b, the true type ($a) can never be null. + if (null === $n->if && $trueType) { + $trueType = $trueType->restrictByNotNull(); + } + + if (null !== $trueType && null !== $falseType) { + $n->setAttribute('type', $trueType->getLeastSupertype($falseType)); + } else { + $n->setAttribute('type', null); + } + + return $scope->createChildFlowScope(); + } + + private function traverseOr(\PHPParser_Node $n, LinkedFlowScope $scope) { + return $this->traverseShortCircuitingBinOp($n, $scope, false); + } + + private function traverseShortCircuitingBinOp(\PHPParser_Node $node, LinkedFlowScope $scope, $condition) + { + $left = $node->left; + $right = $node->right; + + // Type the left node. + $leftLiterals = $this->traverseWithinShortCircuitingBinOp($left, $scope->createChildFlowScope()); + $leftType = $left->getAttribute('type'); + + // As these operations are short circuiting, we can reverse interpreter the left node as we know the + // outcome to its evaluation if we are ever going to reach the right node. + $rightScope = $this->reverseInterpreter->getPreciserScopeKnowingConditionOutcome($left, + $leftLiterals->getOutcomeFlowScope($left, $condition), $condition); + + // Now, type the right node in the updated scope. + $rightLiterals = $this->traverseWithinShortCircuitingBinOp($right, $rightScope->createChildFlowScope()); + $rightType = $right->getAttribute('type'); + + if (null === $leftType || null === $rightType) { + return new BooleanOutcomePair( + $this, + array(true, false), + array(true, false), + $leftLiterals->getJoinedFlowScope(), + $rightLiterals->getJoinedFlowScope()); + } + + // In PHP, binary operations are always of boolean type. + $node->setAttribute('type', $this->typeRegistry->getNativeType('boolean')); + + if ($leftLiterals->toBooleanOutcomes === array(!$condition)) { + // Use the restricted left type, since the right side never gets evaluated. + return $leftLiterals; + } + + // Use the join of the restricted left type knowing the outcome of the + // ToBoolean predicate of the right type. + return BooleanOutcomePair::fromPairs($this, $leftLiterals, $rightLiterals, $condition); + } + + private function traverseWithinShortCircuitingBinOp(\PHPParser_Node $node, LinkedFlowScope $scope) + { + if ($node instanceof \PHPParser_Node_Expr_BooleanAnd) { + return $this->traverseAnd($node, $scope); + } + + if ($node instanceof \PHPParser_Node_Expr_BooleanOr) { + return $this->traverseOr($node, $scope); + } + + $scope = $this->traverse($node, $scope); + + if (null === $type = $node->getAttribute('type')) { + return new BooleanOutcomePair($this, array(true, false), array(true, false), $scope, $scope); + } + + return new BooleanOutcomePair($this, $type->getPossibleOutcomesComparedToBoolean(), + $this->typeRegistry->getNativeType('boolean')->isSubTypeOf($type) ? array(true, false) : array(), + $scope, $scope); + } + + private function traverseGetProp(\PHPParser_Node $node, LinkedFlowScope $scope) + { + assert($node instanceof \PHPParser_Node_Expr_PropertyFetch + || $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch); + + $objNode = $node instanceof \PHPParser_Node_Expr_PropertyFetch ? $node->var : $node->class; + $property = $node->name; + $scope = $this->traverseChildren($node, $scope); + + if (is_string($property)) { + $node->setAttribute('type', $this->getPropertyType($objNode->getAttribute('type'), $property, $node, $scope)); + } else { + $node->setAttribute('type', $this->typeRegistry->getNativeType(TypeRegistry::NATIVE_UNKNOWN)); + } + + return $this->dereferencePointer($objNode, $scope); + } + + private function traverseAssign(\PHPParser_Node_Expr $node, LinkedFlowScope $scope) + { + assert($node instanceof \PHPParser_Node_Expr_Assign + || $node instanceof \PHPParser_Node_Expr_AssignRef); + + $scope = $this->traverseChildren($node, $scope); + + $leftType = $node->var->getAttribute('type'); + $rightType = $this->getType($node->expr); + $node->setAttribute('type', $rightType); + + $castTypes = $this->commentParser->getTypesFromInlineComment($node->getDocComment()); + + $this->updateScopeForTypeChange($scope, $node->var, $leftType, $rightType, $castTypes); + + return $scope; + } + + private function traverseAssignList(\PHPParser_Node_Expr_AssignList $node, LinkedFlowScope $scope) + { + $scope = $this->traverse($node->expr, $scope); + + $exprType = $this->getType($node->expr); + $isArray = $exprType->isArrayType(); + + $checkedUnknown = $this->typeRegistry->getNativeType('unknown_checked'); + $castTypes = $this->commentParser->getTypesFromInlineComment($node->getDocComment()); + + foreach ($node->vars as $i => $var) { + if (null === $var) { + continue; + } + + $newType = $isArray ? $exprType->getItemType($i)->getOrElse($checkedUnknown) : $checkedUnknown; + $this->updateScopeForTypeChange($scope, $var, null, $newType, $castTypes); + } + + return $scope; + } + + private function traverseChildren(\PHPParser_Node $node, LinkedFlowScope $scope) + { + foreach ($node as $subNode) { + if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + $scope = $this->traverse($aSubNode, $scope); + } + } else if ($subNode instanceof \PHPParser_Node) { + $scope = $this->traverse($subNode, $scope); + } + } + + return $scope; + } + + private function dereferencePointer(\PHPParser_Node $node, LinkedFlowScope $scope) + { + if ($this->hasQualifiedName($node)) { + if ($type = $node->getAttribute('type')) { + $narrowed = $type->restrictByNotNull(); + + if ($type !== $narrowed) { + $scope = $this->narrowScope($scope, $node, $narrowed); + } + } + } + + return $scope; + } + + private function narrowScope(LinkedFlowScope $scope, \PHPParser_Node $node, PhpType $narrowed) + { + $scope = $scope->createChildFlowScope(); + if ($node instanceof \PHPParser_Node_Expr_PropertyFetch + || $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch) { + $scope->inferQualifiedSlot($node, $this->getQualifiedName($node), $this->getType($node), $narrowed); + } else { + $this->redeclareSimpleVar($scope, $node, $narrowed); + } + + return $scope; + } + + private function redeclareSimpleVar(LinkedFlowScope $scope, \PHPParser_Node $nameNode, PhpType $varType = null) + { + if (!self::hasQualifiedName($nameNode)) { + return; + } + + if (null === $varType) { + $varType = $this->typeRegistry->getNativeType('unknown'); + } + + $varName = self::getQualifiedName($nameNode); + $scope->inferSlotType($varName, $varType); + } + + private function updateScopeForTypeChange(LinkedFlowScope $scope, \PHPParser_Node $left, PhpType $leftType = null, PhpType $resultType = null, array $castTypes = array()) + { + assert('null !== $resultType'); + + switch (true) { + case $left instanceof \PHPParser_Node_Expr_Variable + && is_string($left->name): + $var = $this->syntacticScope->getVar($left->name); + + // If an explicit type has been annotated for the variable, we + // use this instead of whatever the type inference engine has found. + if (isset($castTypes[$left->name])) { + $resultType = $castTypes[$left->name]; + } + + $this->redeclareSimpleVar($scope, $left, $resultType); + $left->setAttribute('type', $resultType); + + if (null !== $var && $var->isTypeInferred()) { + $oldType = $var->getType(); + $newType = null === $oldType ? $resultType : $oldType->getLeastSupertype($resultType); + $var->setType($newType); + } + break; + + case $left instanceof \PHPParser_Node_Expr_ArrayDimFetch: + if ($left->var instanceof \PHPParser_Node_Expr_Variable + && is_string($left->var->name)) { + $varType = $this->getType($left->var); + + // If the variable type is not known yet, then it has not yet + // been initialized. In such a case, it must be an array. + if (null === $varType || $varType->isUnknownType()) { + $this->redeclareSimpleVar($scope, $left->var, $this->getRefinedArrayType($this->typeRegistry->getNativeType('array'), $resultType, $left)); + } else if ($varType->isArrayType()) { + $this->redeclareSimpleVar($scope, $left->var, $this->getRefinedArrayType($varType, $resultType, $left)); + } + } else if (($left->var instanceof \PHPParser_Node_Expr_PropertyFetch + || $left->var instanceof \PHPParser_Node_Expr_StaticPropertyFetch + ) && null !== $qualifiedName = self::getQualifiedName($left->var)) { + $bottomType = $this->getType($left->var); + + if (null === $bottomType || $bottomType->isUnknownType()) { + $refinedArrayType = $this->getRefinedArrayType( + $this->typeRegistry->getNativeType('array'), $resultType, $left); + $scope->inferQualifiedSlot($left->var, $qualifiedName, + $bottomType, $refinedArrayType); + $left->setAttribute('type', $refinedArrayType); + $this->ensurePropertyDefined($left->var, $refinedArrayType); + } else if ($bottomType->isArrayType()) { + $refinedArrayType = $this->getRefinedArrayType($bottomType, $resultType, $left); + $scope->inferQualifiedSlot($left->var, $qualifiedName, $bottomType, $refinedArrayType); + + $left->setAttribute('type', $refinedArrayType); + $this->ensurePropertyDefined($left->var, $refinedArrayType); + } + } + + break; + + case $left instanceof \PHPParser_Node_Expr_PropertyFetch: + case $left instanceof \PHPParser_Node_Expr_StaticPropertyFetch: + if (null === $qualifiedName = self::getQualifiedName($left)) { + break; + } + + $bottomType = $leftType ?: $this->typeRegistry->getNativeType('unknown'); + $scope->inferQualifiedSlot($left, $qualifiedName, $bottomType, $resultType); + + $left->setAttribute('type', $resultType); + $this->ensurePropertyDefined($left, $resultType); + break; + } + } + + /** + * Refines an array type with the information about the used key, and assigned element type. + * + * This also defines the type for the item key if available and non-dynamic. + * + * @param PhpType $varType + * @param PhpType $resultType + * @param \PHPParser_Node_Expr_ArrayDimFetch $node + * + * @return ArrayType + */ + private function getRefinedArrayType(PhpType $varType, PhpType $resultType, \PHPParser_Node_Expr_ArrayDimFetch $node) + { + $usedKeyType = $this->getKeyTypeForDimFetch($node); + + $keyType = $varType->getKeyType(); + if ($keyType === $this->typeRegistry->getNativeType('generic_array_key')) { + $refinedKeyType = $usedKeyType; + } else { + $refinedKeyType = $keyType->getLeastSupertype($usedKeyType); + } + + $elementType = $varType->getElementType(); + if ($elementType === $this->typeRegistry->getNativeType('generic_array_value')) { + $refinedElementType = $resultType; + } else { + $refinedElementType = $elementType->getLeastSupertype($resultType); + } + + $refinedType = $this->typeRegistry->getArrayType($refinedElementType, $refinedKeyType); + + // Infer the type of the key if a concrete value is available. + NodeUtil::getValue($node->dim)->map(function($keyName) use (&$refinedType, $resultType) { + $refinedType = $refinedType->inferItemType($keyName, $resultType); + }); + + return $refinedType; + } + + private function getKeyTypeForDimFetch(\PHPParser_Node_Expr_ArrayDimFetch $node) + { + if (null === $node->dim) { + return $this->typeRegistry->getNativeType('integer'); + } + + if ($type = $node->dim->getAttribute('type')) { + return $type; + } + + return $this->typeRegistry->getNativeType('generic_array_key'); + } + + private function ensurePropertyDefined($left, $resultType) + { + if ($resultType->isUnknownType()) { + return; + } + + $property = $this->typeRegistry->getFetchedPropertyByNode($left); + if (null !== $property) { + assert($property instanceof ClassProperty); + + // Specifically ignore anything that is being set in a tearDown() method. + // TODO: We should think about introducing a general concept for this which takes + // inter procedural control flow into account. + $scopeRoot = $this->syntacticScope->getRootNode(); + if ( ! $scopeRoot instanceof BlockNode && ! $scopeRoot instanceof \PHPParser_Node_Expr_Closure) { + $testCase = $this->typeRegistry->getClassOrCreate('PHPUnit_Framework_TestCase'); + $method = $this->typeRegistry->getFunctionByNode($scopeRoot); + if ($property->getDeclaringClassType()->isSubtypeOf($testCase) + && (null !== $thisType = $this->syntacticScope->getTypeOfThis()) + && $thisType->isSubtypeOf($testCase) + && null !== $method && strtolower($method->getName()) === 'teardown') { + return; + } + } + + if (null !== $type = $property->getPhpType()) { + $newType = $this->typeRegistry->createUnionType(array($type, $resultType)); + } else { + $newType = $resultType; + } + + $property->setPhpType($newType); + if ($astNode = $property->getAstNode()) { + $astNode->setAttribute('type', $newType); + } + } + } + + /** + * This method gets the PhpType from the Node argument and verifies that it is + * present. If not type is present, it will be logged, and unknown is returned. + * + * @return PhpType + */ + private function getType(\PHPParser_Node $node) + { + $type = $node->getAttribute('type'); + + if (null === $type) { + // Theoretically, we should never enter this branch because all + // interesting nodes should have received a type by the scope builder, + // or the type inference engine. It is not worth throwing an exception, + // but we should at least log it, and fix it over time. + $this->logger->debug(sprintf('Encountered untyped node "%s"; assuming unknown type.', get_class($node))); + + return $this->typeRegistry->getNativeType('unknown'); + } + + return $type; + } + + private function getPropertyType(PhpType $objType = null, $propName, \PHPParser_Node $n, LinkedFlowScope $scope) + { + // Check whether the scope contains inferred type information about the property, + // or fallback to the wider property type if not available. Scopes could + // contain information about properties if we have reverse interpreted + // the property previously. + $qualifiedName = self::getQualifiedName($n); + $var = $scope->getSlot($qualifiedName); + + if (null !== $var && null !== $varType = $var->getType()) { + if ($varType->equals($this->typeRegistry->getNativeType('unknown')) + && $var !== $this->syntacticScope->getSlot($qualifiedName)) { + // If the type of this qualified name has been checked in this scope, + // then use CHECKED_UNKNOWN_TYPE instead to indicate that. + // TODO: The checked unknown type has not really proved useful in + // practice. Consider removing it entirely. + return $this->typeRegistry->getNativeType('unknown_checked'); + } + + return $varType; + } + + $propertyType = null; + if (null !== $objType && (null !== $objType = $objType->toMaybeObjectType()) + && $objType instanceof Clazz && $objType->hasProperty($propName)) { + $propertyType = $objType->getProperty($propName)->getPhpType(); + } + + return $propertyType ?: $this->typeRegistry->getNativeType('unknown'); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/TypedScopeCreator.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/TypedScopeCreator.php new file mode 100644 index 0000000..98d9d1e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/TypeInference/TypedScopeCreator.php @@ -0,0 +1,97 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\TypeInference; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\ScopeCreatorInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ScopeBuilder\GlobalScopeBuilder; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ScopeBuilder\LocalScopeBuilder; + +/** + * Creates the symbol table of variables available in the current scope and their types. + * + * Scopes created by this class are very different from scopes created by the SyntacticScopeCreator. These scopes have + * type information, and include some qualified names in addition to variables. + * + * @author Johannes M. Schmitt + */ +final class TypedScopeCreator implements ScopeCreatorInterface +{ + private $typeRegistry; + + public function __construct(TypeRegistry $registry) + { + $this->typeRegistry = $registry; + } + + public function createScope(\PHPParser_Node $node, Scope $parent = null) + { + $thisType = $this->getThisType($node, $parent); + + // Constructing the global scope is very different than constructing inner scopes, because only global scopes + // can contain named classes that show up in the type registry. + $newScope = null; + if (null === $parent) { + $newScope = new Scope($node, null, $thisType); + + $builder = new GlobalScopeBuilder($newScope, $this->typeRegistry); + NodeTraversal::traverseWithCallback($node, $builder); + } else { + $newScope = new Scope($node, $parent, $thisType); + $builder = new LocalScopeBuilder($newScope, $this->typeRegistry); + NodeTraversal::traverseWithCallback($node, $builder); + } + + if (null !== $thisType) { + $newScope->declareVar('this', $thisType); + } + + return $newScope; + } + + private function getThisType(\PHPParser_Node $node, Scope $parentScope = null) + { + $parent = $node; + while (null !== $parent) { + // As of PHP 5.4, closures inherit the this type of their parent scope. Since there is currently no way to + // configure the PHP version that we build against, we will simply always infer the ThisType. Other passes, + // can then perform checks whether ``$this`` may be accessed, allowing us to produce better error messages. + if ($parent instanceof \PHPParser_Node_Expr_Closure) { + if (null === $parentScope) { + return null; + } + + return $parentScope->getTypeOfThis(); + } + + if (NodeUtil::isMethodContainer($parent)) { + $name = implode("\\", $parent->namespacedName->parts); + + return $this->typeRegistry->getClassOrCreate($name); + } + + $parent = $parent->getAttribute('parent'); + } + + return null; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/Definition.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/Definition.php new file mode 100644 index 0000000..c81359d --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/Definition.php @@ -0,0 +1,81 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability; + +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Variable; + +/** + * Represents a local variable definition. + * + * It contains a reference to the actual parser node which defines the variable + * as well as a reference to any other `Variable`s that it depends on. + * + * For example, given the code ``$a = $b + foo($c);``, the node would be + * PHPParser_Node_Expr_Assign, the dependent variable would be ``$b`` + * and ``$c``. + * + * @author Johannes M. Schmitt + */ +class Definition +{ + private $node; + private $expr; + private $dependentVariables; + + public function __construct(\PHPParser_Node $node, \PHPParser_Node $expr = null) + { + $this->node = $node; + $this->expr = $expr; + $this->dependentVariables = array(); + } + + public function getExpr() + { + return $this->expr; + } + + public function getDependentVariables() + { + return $this->dependentVariables; + } + + public function dependsOn(Variable $var) + { + return in_array($var, $this->dependentVariables, true); + } + + public function addDependentVar(Variable $var) + { + if (in_array($var, $this->dependentVariables, true)) { + return; + } + + $this->dependentVariables[] = $var; + } + + public function getNode() + { + return $this->node; + } + + public function equals(Definition $that) + { + return $this->node === $that->node; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/DefinitionLattice.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/DefinitionLattice.php new file mode 100644 index 0000000..720f4ab --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/DefinitionLattice.php @@ -0,0 +1,128 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability; + +use Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Variable; + +/** + * Definition Lattice element. + * + * This class contains the comparison logic. + * + * @author Johannes M. Schmitt + */ +class DefinitionLattice implements LatticeElementInterface, \ArrayAccess, \IteratorAggregate +{ + private $definitions; + + /** + * @param Variable[] $vars the initial set of variables + */ + public function __construct(array $vars = array()) + { + $this->definitions = new \SplObjectStorage(); + + foreach ($vars as $var) { + assert($var instanceof Variable); + + // Every variable in the scope is defined once in the beginning of the + // function: all the declared variable are undefined, all functions + // have been assigned and all arguments have their value from the caller. + $this->definitions[$var] = new Definition($var->getScope()->getRootNode()); + } + } + + public function getIterator() + { + return new \IteratorIterator($this->definitions); + } + + public function offsetExists($offset) + { + return isset($this->definitions[$offset]); + } + + public function offsetGet($offset) + { + return $this->definitions[$offset]; + } + + public function offsetSet($offset, $value) + { + $this->definitions[$offset] = $value; + } + + public function offsetUnset($offset) + { + unset($this->definitions[$offset]); + } + + public function getDefinitions() + { + return $this->definitions; + } + + public function __clone() + { + $this->definitions = clone $this->definitions; + } + + public function equals(LatticeElementInterface $that) + { + if ( ! $that instanceof DefinitionLattice) { + return false; + } + + if (count($this->definitions) !== count($that->definitions)) { + return false; + } + + foreach ($this->definitions as $var) { + if ( ! isset($that->definitions[$var])) { + return false; + } + + $thisDef = $this->definitions[$var]; + $thatDef = $that->definitions[$var]; + if (null === $thisDef ^ null === $thatDef) { + return false; + } else if (null !== $thisDef && false === $thisDef->equals($thatDef)) { + return false; + } + } + + return true; + } + + public function __toString() + { + $str = 'DefinitionLattice('; + + $defs = array(); + foreach ($this->definitions as $var) { + $defs[$var->getName()] = (null === $this->definitions[$var]) ? null + : NodeUtil::getStringRepr($this->definitions[$var]->getNode()); + } + $str .= json_encode($defs).')'; + + return $str; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/MayBeReachingUseAnalysis.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/MayBeReachingUseAnalysis.php new file mode 100644 index 0000000..c61f37a --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/MayBeReachingUseAnalysis.php @@ -0,0 +1,269 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; + +/** + * Analyzes the may-be usage of the definition of variables. + * + * For a given variable defining node, this allows us to find all the nodes where the variable + * with the given definition is being used. If the variable is being overwritten, the overwritten + * instances are not being returned. + * + * NOTE: We should migrate this to a BranchforwardDataFlowAnalysis keeping track of possible + * definitions. This is necessary to take into account ON_EX edges. + * + * @author Johannes M. Schmitt + */ +class MayBeReachingUseAnalysis extends \Scrutinizer\PhpAnalyzer\DataFlow\DataFlowAnalysis +{ + /** @var \Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope */ + private $scope; + + public static function createJoinOperation() + { + return function(array $values) { + $result = new UseLattice(); + foreach ($values as $lattice) { + assert($lattice instanceof UseLattice); + $result->add($lattice); + } + + return $result; + }; + } + + public function __construct(\Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowGraph $cfg, \Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope $scope) + { + parent::__construct($cfg, self::createJoinOperation()); + $this->scope = $scope; + } + + public function getUses($name, \PHPParser_Node $defNode) + { + if (null === $graphNode = $this->cfg->getNode($defNode)) { + throw new \InvalidArgumentException('$defNode must be part of the control flow graph.'); + } + + if (null === $var = $this->scope->getVar($name)) { + return array(); + } + + $outState = $graphNode->getAttribute(self::ATTR_FLOW_STATE_OUT); + + return isset($outState[$var]) ? $outState[$var] : array(); + } + + protected function isForward() + { + return false; + } + + protected function createEntryLattice() + { + return new UseLattice(); + } + + protected function createInitialEstimateLattice() + { + return new UseLattice(); + } + + protected function flowThrough($node, \Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface $input) + { + assert($node instanceof \PHPParser_Node); + assert($input instanceof UseLattice); + + $output = clone $input; + $this->computeMayUse($node, $node, $output, false); + + return $output; + } + + /** + * @param boolean $conditional + */ + private function computeMayUse(\PHPParser_Node $node, \PHPParser_Node $cfgNode, UseLattice $output, $conditional) + { + switch (true) { + case $node instanceof \JMS\PhpManipulator\PhpParser\BlockNode: + case NodeUtil::isScopeCreator($node): + return; + + case NodeUtil::isName($node): + $this->addToUseIfLocal($node, $cfgNode, $output); + + return; + + case $node instanceof \PHPParser_Node_Stmt_Catch: + $this->computeMayUse($node->stmts, $cfgNode, $output, $conditional); + $this->addDefToVarNodes($node->var, $node, $node, $output); + $this->removeFromUseIfLocal($node->var, $output); + + return; + + case $node instanceof \PHPParser_Node_Stmt_While: + case $node instanceof \PHPParser_Node_Stmt_Do: + case $node instanceof \PHPParser_Node_Stmt_If: + case $node instanceof \PHPParser_Node_Stmt_ElseIf: + case $node instanceof \PHPParser_Node_Stmt_For: + if (null !== $cond = NodeUtil::getConditionExpression($node)) { + $this->computeMayUse($cond, $cfgNode, $output, $conditional); + } + + return; + + case $node instanceof \PHPParser_Node_Stmt_Foreach: + if ( ! $conditional) { + if (null !== $node->keyVar && NodeUtil::isName($node->keyVar)) { + $this->removeFromUseIfLocal($node->keyVar->name, $output); + } + if (NodeUtil::isName($node->valueVar)) { + $this->removeFromUseIfLocal($node->valueVar->name, $output); + } + } + + $this->computeMayUse($node->expr, $cfgNode, $output, $conditional); + + return; + + case $node instanceof \PHPParser_Node_Expr_BooleanAnd: + case $node instanceof \PHPParser_Node_Expr_LogicalAnd: + case $node instanceof \PHPParser_Node_Expr_BooleanOr: + case $node instanceof \PHPParser_Node_Expr_LogicalOr: + $this->computeMayUse($node->right, $cfgNode, $output, true); + $this->computeMayUse($node->left, $cfgNode, $output, $conditional); + + return; + + case $node instanceof \PHPParser_Node_Expr_Ternary: + $this->computeMayUse($node->else, $cfgNode, $output, true); + if (null !== $node->if) { + $this->computeMayUse($node->if, $cfgNode, $output, true); + } + $this->computeMayUse($node->cond, $cfgNode, $output, $conditional); + + return; + + default: + if (NodeUtil::isAssignmentOp($node)) { + if ($node instanceof \PHPParser_Node_Expr_AssignList) { + foreach ($node->vars as $var) { + if (null === $var) { + continue; + } + + if ( ! $conditional) { + $this->removeFromUseIfLocal($var->name, $output); + } + } + $this->computeMayUse($node->expr, $cfgNode, $output, $conditional); + + return; + } + + if (NodeUtil::isName($node->var)) { + $this->addDefToVarNodes($node->var->name, $node->var, $node->expr, $output); + + if ( ! $conditional) { + $this->removeFromUseIfLocal($node->var->name, $output); + } + + // Handle the cases where we assign, and read at the same time, e.g. + // ``$a += 5``. + if ( ! $node instanceof \PHPParser_Node_Expr_Assign + && ! $node instanceof \PHPParser_Node_Expr_AssignRef) { + $this->addToUseIfLocal($node->var, $cfgNode, $output); + } + + $this->computeMayUse($node->expr, $cfgNode, $output, $conditional); + + return; + } + + return; + } + + $inOrder = array(); + foreach ($node as $subNode) { + if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + if ( ! $aSubNode instanceof \PHPParser_Node) { + continue; + } + + $inOrder[] = $aSubNode; + } + } else if ($subNode instanceof \PHPParser_Node) { + $inOrder[] = $subNode; + } + } + + foreach (array_reverse($inOrder) as $subNode) { + $this->computeMayUse($subNode, $cfgNode, $output, $conditional); + } + } + } + + private function addDefToVarNodes($name, \PHPParser_Node $defNode, \PHPParser_Node $defExpr, UseLattice $uses) + { + if (null === $var = $this->scope->getVar($name)) { + return; + } + + $maybeUsingVarNodes = $uses->getUsingVarNodes($var); + $defNode->setAttribute('maybe_using_vars', $maybeUsingVarNodes); + + foreach ($maybeUsingVarNodes as $varNode) { + $maybeDefiningExprs = $varNode->getAttribute('maybe_defining_exprs', array()); + if (in_array($defExpr, $maybeDefiningExprs, true)) { + continue; + } + + $maybeDefiningExprs[] = $defExpr; + $varNode->setAttribute('maybe_defining_exprs', $maybeDefiningExprs); + } + } + + private function addToUseIfLocal(\PHPParser_Node $varNode, \PHPParser_Node $cfgNode, UseLattice $uses) + { + if ( ! NodeUtil::isName($varNode)) { + return; + } + $name = $varNode->name; + + $var = $this->scope->getVar($name); + if (null === $var) { + return; + } + + $uses->addUse($var, $cfgNode, $varNode); + } + + private function removeFromUseIfLocal($name, UseLattice $uses) + { + $var = $this->scope->getVar($name); + if (null === $var) { + return; + } + + unset($uses[$var]); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingDefAnalysis.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingDefAnalysis.php new file mode 100644 index 0000000..556daea --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingDefAnalysis.php @@ -0,0 +1,337 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability; + +use Psr\Log\LoggerInterface; +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowGraph; +use Scrutinizer\PhpAnalyzer\ControlFlow\GraphEdge; +use Scrutinizer\PhpAnalyzer\DataFlow\BinaryJoinOp; +use Scrutinizer\PhpAnalyzer\DataFlow\BranchedForwardDataFlowAnalysis; +use Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface; +use JMS\PhpManipulator\PhpParser\BlockNode; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\PreOrderCallback; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; + +/** + * Calculates must-be reachability of variable definitions. + * + * It allows us to trace back each variable to its defining statement. + * + * In contrast to a maybe-reaching analysis, this analysis only takes paths into account which we can determine for sure, + * and where no alternative paths exist. + * + * @author Johannes M. Schmitt + */ +class MustBeReachingDefAnalysis extends BranchedForwardDataFlowAnalysis +{ + /** The scope of the function/method we are analyzing. */ + private $scope; + + private $logger; + + /** + * Returns the join operation for this data-flow analysis. + * + * The algorithm simply checks whether the definition for a variable differs in both lattices. + * If that is the case, we reset the definition of the variable as it means that the variable + * has more than one possible definition. + * + * @return callable + */ + public static function createJoinOperation() + { + return new BinaryJoinOp(function(DefinitionLattice $a, DefinitionLattice $b) { + $result = new DefinitionLattice(); + + foreach ($a as $var) { + if (null === $a[$var]) { + $result[$var] = null; + continue; + } + + if ( ! isset($b[$var])) { + $result[$var] = $a[$var]; + continue; + } + + if (null === $b[$var] || false === $a[$var]->equals($b[$var])) { + $result[$var] = null; + continue; + } + + $result[$var] = $a[$var]; + } + + foreach ($b as $var) { + if (isset($result[$var])) { + continue; + } + + $result[$var] = $b[$var]; + } + + return $result; + }); + } + + public function __construct(ControlFlowGraph $cfg, Scope $scope) + { + parent::__construct($cfg, self::createJoinOperation()); + + $this->scope = $scope; + } + + public function setLogger(LoggerInterface $logger) + { + $this->logger = $logger; + } + + protected function createEntryLattice() + { + return new DefinitionLattice($this->scope->getVars()); + } + + protected function createInitialEstimateLattice() + { + return new DefinitionLattice(); + } + + /** + * Returns the defining node for a given variable. + * + * @param string $varName The name of the variable to get the definition for. + * @param \PHPParser_Node $usageNode The cfg node where the variable is used. + * + * @return \PHPParser_Node|null The node that must be defining the variable if available. + */ + public function getDefiningNode($varName, \PHPParser_Node $usageNode) + { + if ( ! $this->cfg->hasNode($usageNode)) { + throw new \InvalidArgumentException('$usageNode must be part of the control flow graph.'); + } + + if (null === $var = $this->scope->getVar($varName)) { + return null; + } + + $graphNode = $this->cfg->getNode($usageNode); + $definition = $graphNode->getAttribute(self::ATTR_FLOW_STATE_IN)[$var]; + + return null === $definition ? null : $definition->getNode(); + } + + protected function branchedFlowThrough($node, LatticeElementInterface $input) + { + $result = array(); + $conditionalOutput = null; + foreach ($this->cfg->getOutEdges($node) as $edge) { + switch ($edge->getType()) { + case GraphEdge::TYPE_ON_FALSE: + case GraphEdge::TYPE_ON_TRUE: + case GraphEdge::TYPE_ON_EX: + if (null === $conditionalOutput) { + $conditionalOutput = clone $input; + $this->computeMustDef($node, $node, $conditionalOutput, true); + } + $output = clone $conditionalOutput; + break; + + default: + $output = clone $input; + $this->computeMustDef($node, $node, $output, false); + } + + $result[] = $output; + } + + return $result; + } + + private function computeMustDef(\PHPParser_Node $node, \PHPParser_Node $cfgNode, DefinitionLattice $output, $conditional) + { + switch (true) { + case $node instanceof BlockNode: + case NodeUtil::isScopeCreator($node); + return; + + case $node instanceof \PHPParser_Node_Stmt_While: + case $node instanceof \PHPParser_Node_Stmt_Do: + case $node instanceof \PHPParser_Node_Stmt_For: + case $node instanceof \PHPParser_Node_Stmt_If: + if (null !== $cond = NodeUtil::getConditionExpression($node)) { + $this->computeMustDef($cond, $cfgNode, $output, $conditional); + } + + return; + + case $node instanceof \PHPParser_Node_Stmt_Foreach: + if (null !== $node->keyVar + && $node->keyVar instanceof \PHPParser_Node_Expr_Variable + && is_string($node->keyVar->name)) { + $this->addToDefIfLocal($node->keyVar->name, $cfgNode, $node->expr, $output); + } + + if ($node->valueVar instanceof \PHPParser_Node_Expr_Variable + && is_string($node->valueVar->name)) { + $this->addToDefIfLocal($node->valueVar->name, $cfgNode, $node->expr, $output); + } + + return; + + case $node instanceof \PHPParser_Node_Stmt_Catch: + $this->addToDefIfLocal($node->var, $cfgNode, null, $output); + return; + + case $node instanceof \PHPParser_Node_Expr_BooleanAnd: + case $node instanceof \PHPParser_Node_Expr_BooleanOr: + case $node instanceof \PHPParser_Node_Expr_LogicalAnd: + case $node instanceof \PHPParser_Node_Expr_LogicalOr: + $this->computeMustDef($node->left, $cfgNode, $output, $conditional); + $this->computeMustDef($node->right, $cfgNode, $output, true); + + return; + + case $node instanceof \PHPParser_Node_Expr_Ternary: + $this->computeMustDef($node->cond, $cfgNode, $output, $conditional); + if (null !== $node->if) { + $this->computeMustDef($node->if, $cfgNode, $output, true); + } + $this->computeMustDef($node->else, $cfgNode, $output, true); + + return; + + case NodeUtil::isName($node): + if ((null !== $var = $this->scope->getVar($node->name)) + && isset($output[$var]) + && null !== $output[$var]) { + $node->setAttribute('defining_expr', $output[$var]->getExpr()); + } + + return; + + default: + if (NodeUtil::isAssignmentOp($node)) { + if ($node instanceof \PHPParser_Node_Expr_AssignList) { + $this->computeMustDef($node->expr, $cfgNode, $output, $conditional); + + foreach ($node->vars as $var) { + if (null === $var) { + continue; + } + + $this->addToDefIfLocal($var->name, $conditional ? null: $cfgNode, $node->expr, $output); + } + + return; + } + + if (NodeUtil::isName($node->var)) { + $this->computeMustDef($node->expr, $cfgNode, $output, $conditional); + $this->addToDefIfLocal($node->var->name, $conditional ? null : $cfgNode, + $node->expr, $output); + + return; + } + } + + if (($node instanceof \PHPParser_Node_Expr_PostDec + || $node instanceof \PHPParser_Node_Expr_PostInc + || $node instanceof \PHPParser_Node_Expr_PreDec + || $node instanceof \PHPParser_Node_Expr_PreInc + ) && NodeUtil::isName($node->var)) { + $this->addToDefIfLocal($node->var->name, $conditional ? null : $cfgNode, null, $output); + + return; + } + + foreach ($node as $subNode) { + if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + if ( ! $aSubNode instanceof \PHPParser_Node) { + continue; + } + + $this->computeMustDef($aSubNode, $cfgNode, $output, $conditional); + } + } else if ($subNode instanceof \PHPParser_Node) { + $this->computeMustDef($subNode, $cfgNode, $output, $conditional); + } + } + } + } + + private function addToDefIfLocal($name, \PHPParser_Node $node = null, \PHPParser_Node $rValue = null, DefinitionLattice $definitions) + { + $var = $this->scope->getVar($name); + + if (null === $var) { + return; + } + + // Invalidate other definitions if they depended on this variable as it has been changed. + foreach ($definitions as $otherVar) { + if (null === $otherDef = $definitions[$otherVar]) { + continue; + } + + if ($otherDef->dependsOn($var)) { + $definitions[$otherVar] = null; + } + } + + // The node can be null if we are dealing with a conditional definition. For conditional + // definitions, this analysis cannot do much. + if (null === $node) { + $definitions[$var] = null; + + return; + } + + $definition = new Definition($node, $rValue); + if (null !== $rValue) { + NodeTraversal::traverseWithCallback($rValue, new PreOrderCallback(function($t, \PHPParser_Node $node) use ($definition) { + if (NodeUtil::isScopeCreator($node)) { + return false; + } + + if ( ! NodeUtil::isName($node)) { + return; + } + + if (null === $var = $this->scope->getVar($node->name)) { + if (null !== $this->logger) { + $this->logger->debug(sprintf('Could not find variable "%s" in the current scope. ' + .'This could imply an error in SyntacticScopeCreator.', $node->name)); + } + + // We simply assume that the variable was declared so that we can properly + // invalidate the definition if it is changed. For this analysis, it does not + // matter whether it actually exists. A later pass will add a warning anyway. + $var = $this->scope->declareVar($node->name); + } + + $definition->addDependentVar($var); + })); + } + + $definitions[$var] = $definition; + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/UseLattice.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/UseLattice.php new file mode 100644 index 0000000..94e3294 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/VariableReachability/UseLattice.php @@ -0,0 +1,172 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability; + +/** + * Keeps track of the different uses for each variable. + * + * Also, this class contains comparison logic with other lattices. + * + * @author Johannes M. Schmitt + */ +class UseLattice implements \Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface, \ArrayAccess, \IteratorAggregate +{ + private $uses; + private $varNodes; + + public function __construct() + { + $this->uses = new \SplObjectStorage(); + $this->varNodes = new \SplObjectStorage(); + } + + public function __clone() + { + $this->uses = clone $this->uses; + $this->varNodes = clone $this->varNodes; + } + + public function offsetExists($offset) + { + return isset($this->uses[$offset]); + } + + public function offsetSet($offset, $value) + { + throw new \LogicException('offsetSet() is not available; please use addUse() instead.'); + } + + public function offsetGet($offset) + { + return $this->uses[$offset]; + } + + public function offsetUnset($offset) + { + // We do not remove variable nodes here, as this CFG node might be referenced by another + // variable. This should not matter too much as the variables per CFG node are fixed anyway. + unset($this->uses[$offset]); + } + + public function getUsingVarNodes(\Scrutinizer\PhpAnalyzer\PhpParser\Scope\Variable $var) + { + if ( ! isset($this->uses[$var]) || null === $this->uses[$var]) { + return array(); + } + + $varNodes = array(); + foreach ($this->uses[$var] as $cfgNode) { + foreach ($this->varNodes[$cfgNode] as $varNode) { + if (in_array($varNode, $varNodes, true)) { + continue; + } + + $varNodes[] = $varNode; + } + } + + return $varNodes; + } + + public function add(UseLattice $that) + { + foreach ($that as $var) { + $currentUses = isset($this[$var]) ? $this[$var] : array(); + foreach ($that->uses[$var] as $cfgNode) { + if ( ! in_array($cfgNode, $currentUses, true)) { + $currentUses[] = $cfgNode; + } + + foreach ($that->varNodes[$cfgNode] as $varNode) { + $this->addVarNode($cfgNode, $varNode); + } + } + $this->uses[$var] = $currentUses; + } + } + + public function getIterator() + { + return new \IteratorIterator($this->uses); + } + + public function addUse(\Scrutinizer\PhpAnalyzer\PhpParser\Scope\Variable $var, \PHPParser_Node $cfgNode, \PHPParser_Node $varNode) + { + if ( ! isset($this->uses[$var])) { + $this->uses[$var] = array($cfgNode); + $this->addVarNode($cfgNode, $varNode); + + return; + } + + if (in_array($cfgNode, $this->uses[$var], true)) { + $this->addVarNode($cfgNode, $varNode); + + return; + } + + $uses = $this->uses[$var]; + $uses[] = $cfgNode; + $this->uses[$var] = $uses; + + $this->addVarNode($cfgNode, $varNode); + } + + private function addVarNode(\PHPParser_Node $cfgNode, \PHPParser_Node $varNode) + { + $currentVars = isset($this->varNodes[$cfgNode]) ? $this->varNodes[$cfgNode] : array(); + if (in_array($varNode, $currentVars, true)) { + return; + } + + $currentVars[] = $varNode; + $this->varNodes[$cfgNode] = $currentVars; + } + + public function equals(\Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface $that) + { + if ( ! $that instanceof UseLattice) { + return false; + } + + if (count($this->uses) !== count($that->uses)) { + return false; + } + + foreach ($this->uses as $var) { + if ( ! isset($that->uses[$var])) { + return false; + } + + $thisUses = $this->uses[$var]; + $thatUses = $that->uses[$var]; + if (count($thisUses) !== count($thatUses)) { + return false; + } + + foreach ($thisUses as $node) { + if ( ! in_array($node, $thatUses, true)) { + return false; + } + } + } + + return true; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Exception/AnalysisFailedException.php b/src/Scrutinizer/PhpAnalyzer/Exception/AnalysisFailedException.php new file mode 100644 index 0000000..21c4e87 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Exception/AnalysisFailedException.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Exception; + +use Scrutinizer\PhpAnalyzer\Model\File; + +class AnalysisFailedException extends RuntimeException +{ + private $analyzedFile; + + public static function fromException(\Exception $ex, File $file) + { + $message = 'An error occurred while analyzing "'.$file->getName().'": '.$ex->getMessage(); + $ex = new self($message, (integer) $ex->getCode(), $ex); + $ex->setAnalyzedFile($file); + + return $ex; + } + + public function setAnalyzedFile(File $file) + { + $this->analyzedFile = $file; + } + + public function getAnalyzedFile() + { + return $this->analyzedFile; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Exception/Exception.php b/src/Scrutinizer/PhpAnalyzer/Exception/Exception.php new file mode 100644 index 0000000..3339bde --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Exception/Exception.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Exception; + +interface Exception +{ +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Exception/MaxIterationsExceededException.php b/src/Scrutinizer/PhpAnalyzer/Exception/MaxIterationsExceededException.php new file mode 100644 index 0000000..aff41ee --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Exception/MaxIterationsExceededException.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Exception; + +class MaxIterationsExceededException extends RuntimeException +{ +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Exception/MaxMemoryExceededException.php b/src/Scrutinizer/PhpAnalyzer/Exception/MaxMemoryExceededException.php new file mode 100644 index 0000000..ba951fe --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Exception/MaxMemoryExceededException.php @@ -0,0 +1,54 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Exception; + +/** + * Exception when the maximum allowed memory is exceeded. + * + * @author Johannes M. Schmitt + */ +class MaxMemoryExceededException extends RuntimeException +{ + private $currentUsage; + private $maxUsage; + + public static function create($currentUsage, $maxUsage) + { + $ex = new self(sprintf('The maximum allowed memory usage %.3fMB has been exceeded; used %.3fMB.', $maxUsage / 1024 / 1024, $currentUsage / 1024 / 1024)); + $ex->currentUsage = $currentUsage; + $ex->maxUsage = $maxUsage; + + return $ex; + } + + public function __construct($msg, $code = 0, \Exception $previous = null) + { + parent::__construct($msg, $code, $previous); + } + + public function getCurrentUsage() + { + return $this->currentUsage; + } + + public function getMaxUsage() + { + return $this->maxUsage; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Exception/RuntimeException.php b/src/Scrutinizer/PhpAnalyzer/Exception/RuntimeException.php new file mode 100644 index 0000000..4e48b5e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Exception/RuntimeException.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Exception; + +class RuntimeException extends \RuntimeException implements Exception +{ +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/AbstractFunction.php b/src/Scrutinizer/PhpAnalyzer/Model/AbstractFunction.php new file mode 100644 index 0000000..ac8a851 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/AbstractFunction.php @@ -0,0 +1,219 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\CallSite; + +/** + * Abstract Base Class for Functions, Methods, and Closures. + * + * @ORM\MappedSuperclass + * + * @author Johannes M. Schmitt + */ +abstract class AbstractFunction +{ + /** @ORM\Column(type = "PhpType", nullable = true) */ + private $returnType; + + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "boolean") */ + private $returnByRef = false; + + /** @ORM\Column(type = "boolean") */ + private $variableParameters = false; + + private $astNode; + + public function __construct($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function getReturnType() + { + return $this->returnType; + } + + public function getAstNode() + { + return $this->astNode; + } + + public function setAstNode(\PHPParser_Node $node) + { + $this->astNode = $node; + } + + public function setReturnType(PhpType $type) + { + $this->returnType = $type; + } + + public function isReturnByRef() + { + return $this->returnByRef; + } + + public function setReturnByRef($bool) + { + $this->returnByRef = (boolean) $bool; + } + + /** + * Returns whether this function may have variable parameters. + * + * For example, this could be the case if ``func_get_args`` et.al. + * are being used inside the function body. + * + * @return boolean + */ + public function hasVariableParameters() + { + return $this->variableParameters; + } + + public function setVariableParameters($bool) + { + $this->variableParameters = (boolean) $bool; + } + + public function getInCallSites() + { + return new ArrayCollection(array_merge($this->getInMethodCallSites()->getValues(), $this->getInFunctionCallSites()->getValues())); + } + + public function getOutCallSites() + { + return new ArrayCollection(array_merge($this->getOutMethodCallSites()->getValues(), $this->getOutFunctionCallSites()->getValues())); + } + + public function addCallSite(CallSite $site) + { + if ($site->getSource() === $this) { + $target = $site->getTarget(); + if ($target instanceof Method) { + $this->getOutMethodCallSites()->add($site); + } else if ($target instanceof GlobalFunction) { + $this->getOutFunctionCallSites()->add($site); + } else { + throw new \LogicException('Previous ifs were exhaustive.'); + } + } else if ($site->getTarget() === $this) { + $source = $site->getSource(); + if ($source instanceof Method) { + $this->getInMethodCallSites()->add($site); + } else if ($source instanceof GlobalFunction) { + $this->getInFunctionCallSites()->add($site); + } else { + throw new \LogicException('Previous ifs were exhaustive.'); + } + } else { + throw new \InvalidArgumentException('$site is neither originating, nor targeting this function.'); + } + } + + public function removeCallSite(CallSite $site) + { + if ($site->getSource() === $this) { + $target = $site->getTarget(); + if ($target instanceof Method) { + return $this->getOutMethodCallSites()->removeElement($site); + } else if ($target instanceof GlobalFunction) { + return $this->getOutFunctionCallSites()->removeElement($site); + } + + throw new \LogicException('Previous ifs were exhaustive.'); + } else if ($site->getTarget() === $this) { + $source = $site->getSource(); + if ($source instanceof Method) { + return $this->getInMethodCallSites()->removeElement($site); + } else if ($source instanceof GlobalFunction) { + return $this->getInFunctionCallSites()->removeElement($site); + } + + throw new \LogicException('Previous ifs were exhaustive.'); + } + + throw new \InvalidArgumentException('$site is neither originating, nor targeting this function.'); + } + + /** + * @return ArrayCollection + */ + abstract public function getInMethodCallSites(); + + /** + * @return ArrayCollection + */ + abstract public function getInFunctionCallSites(); + + /** + * @return ArrayCollection + */ + abstract public function getOutMethodCallSites(); + + /** + * @return ArrayCollection + */ + abstract public function getOutFunctionCallSites(); + + /** + * @return ArrayCollection + */ + abstract public function getParameters(); + + /** + * @param Parameter $parameter + * @return void + */ + abstract public function addParameter(Parameter $parameter); + + /** + * @param string|Parameter $nameOrParameter + * @return boolean + */ + abstract public function hasParameter($nameOrParameter); + + /** + * @param string|integer $name + * @return Parameter + */ + abstract public function getParameter($nameOrIndex); + + /** + * @return boolean + */ + abstract public function isFunction(); + + /** + * @return boolean + */ + abstract public function isMethod(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/Argument.php b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/Argument.php new file mode 100644 index 0000000..40770ee --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/Argument.php @@ -0,0 +1,100 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\CallGraph; + +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "callsite_arguments") + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes M. Schmitt + */ +class Argument +{ + /** @ORM\Id @ORM\GeneratedValue(strategy = "AUTO") @ORM\Column(type = "integer") */ + private $id; + + /** @ORM\Column(type = "smallint", name = "index_nb") */ + private $index; + + /** @ORM\Column(type = "PhpType") */ + private $phpType; + + /** @ORM\ManyToOne(targetEntity = "CallSite", inversedBy = "args") */ + private $callSite; + + // NOT PERSISTED + private $astNode; + + public function __construct($index) + { + $this->index = (integer) $index; + } + + public function getId() + { + return $this->id; + } + + public function getIndex() + { + return $this->index; + } + + public function getPhpType() + { + return $this->phpType; + } + + public function setPhpType(PhpType $type) + { + $this->phpType = $type; + } + + public function getAstNode() + { + return $this->astNode; + } + + public function setAstNode(\PHPParser_Node $node) + { + $this->astNode = $node; + } + + public function setCallSite(CallSite $site) + { + if (null !== $this->callSite && $this->callSite !== $site) { + throw new \InvalidArgumentException('The call site cannot be changed.'); + } + $this->callSite = $site; + } + + public function getCallSite() + { + return $this->callSite; + } + + public function __clone() + { + $this->callSite = null; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/CallSite.php b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/CallSite.php new file mode 100644 index 0000000..cceade2 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/CallSite.php @@ -0,0 +1,119 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\CallGraph; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\Method; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "call_sites") + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @ORM\InheritanceType("SINGLE_TABLE") + * @ORM\DiscriminatorColumn(name = "type", type = "string", length = 3) + * @ORM\DiscriminatorMap({ + * "f2f" = "Scrutinizer\PhpAnalyzer\Model\CallGraph\FunctionToFunctionCallSite", + * "f2m" = "Scrutinizer\PhpAnalyzer\Model\CallGraph\FunctionToMethodCallSite", + * "m2f" = "Scrutinizer\PhpAnalyzer\Model\CallGraph\MethodToFunctionCallSite", + * "m2m" = "Scrutinizer\PhpAnalyzer\Model\CallGraph\MethodToMethodCallSite", + * }) + * + * @author Johannes + */ +abstract class CallSite +{ + /** @ORM\Id @ORM\GeneratedValue(strategy = "AUTO") @ORM\Column(type = "integer") */ + private $id; + + /** @ORM\OneToMany(targetEntity = "Argument", mappedBy = "callSite", cascade = {"persist", "remove"}, orphanRemoval = true) */ + private $args; + + // NOT PERSISTED + private $astNode; + + public static function create(AbstractFunction $source, AbstractFunction $target, array $args = array()) + { + switch (true) { + case $source instanceof GlobalFunction && $target instanceof GlobalFunction: + return new FunctionToFunctionCallSite($source, $target, $args); + + case $source instanceof GlobalFunction && $target instanceof Method: + return new FunctionToMethodCallSite($source, $target, $args); + + case $source instanceof Method && $target instanceof GlobalFunction: + return new MethodToFunctionCallSite($source, $target, $args); + + case $source instanceof Method && $target instanceof Method: + return new MethodToMethodCallSite($source, $target, $args); + + default: + throw new \LogicException('Previous statements were exhaustive.'); + } + } + + /** + * @param array $args + */ + public function __construct(AbstractFunction $source, AbstractFunction $target, array $args = array()) + { + $this->setSource($source); + $this->setTarget($target); + $source->addCallSite($this); + $target->addCallSite($this); + + foreach ($args as $arg) { + $arg->setCallSite($this); + } + + $this->args = new ArrayCollection($args); + } + + public function getId() + { + return $this->id; + } + + public function getArgs() + { + return $this->args; + } + + public function getAstNode() + { + return $this->astNode; + } + + public function setAstNode(\PHPParser_Node $node) + { + $this->astNode = $node; + } + + /** @return Method|GlobalFunction */ + abstract public function getSource(); + + /** @return Method|GlobalFunction */ + abstract public function getTarget(); + + abstract protected function setSource(AbstractFunction $function); + abstract protected function setTarget(AbstractFunction $function); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/FunctionToFunctionCallSite.php b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/FunctionToFunctionCallSite.php new file mode 100644 index 0000000..2da78ee --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/FunctionToFunctionCallSite.php @@ -0,0 +1,65 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\CallGraph; + +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; + +/** + * @ORM\Entity(readOnly = true) + * + * @author Johannes + */ +class FunctionToFunctionCallSite extends CallSite +{ + /** @ORM\ManyToOne(targetEntity = "Scrutinizer\PhpAnalyzer\Model\GlobalFunction", inversedBy = "outFunctionCallSites") */ + private $sourceFunction; + + /** @ORM\ManyToOne(targetEntity = "Scrutinizer\PhpAnalyzer\Model\GlobalFunction", inversedBy = "inFunctionCallSites") */ + private $targetFunction; + + public function getSource() + { + return $this->sourceFunction; + } + + public function getTarget() + { + return $this->targetFunction; + } + + protected function setSource(AbstractFunction $function) + { + if (!$function instanceof GlobalFunction) { + throw new \InvalidArgumentException(sprintf('Expected $function of type GlobalFunction, but got "%s" instead.', get_class($function))); + } + + $this->sourceFunction = $function; + } + + protected function setTarget(AbstractFunction $function) + { + if (!$function instanceof GlobalFunction) { + throw new \InvalidArgumentException(sprintf('Expected $function of type GlobalFunction, but got "%s" instead.', get_class($function))); + } + + $this->targetFunction = $function; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/FunctionToMethodCallSite.php b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/FunctionToMethodCallSite.php new file mode 100644 index 0000000..1dc6462 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/FunctionToMethodCallSite.php @@ -0,0 +1,66 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\CallGraph; + +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\Method; + +/** + * @ORM\Entity(readOnly = true) + * + * @author Johannes + */ +class FunctionToMethodCallSite extends CallSite +{ + /** @ORM\ManyToOne(targetEntity = "Scrutinizer\PhpAnalyzer\Model\GlobalFunction", inversedBy = "outMethodCallSites") */ + private $sourceFunction; + + /** @ORM\ManyToOne(targetEntity = "Scrutinizer\PhpAnalyzer\Model\Method", inversedBy = "inFunctionCallSites") */ + private $targetMethod; + + public function getSource() + { + return $this->sourceFunction; + } + + public function getTarget() + { + return $this->targetMethod; + } + + protected function setSource(AbstractFunction $function) + { + if (!$function instanceof GlobalFunction) { + throw new \InvalidArgumentException(sprintf('Expected $function of type GlobalFunction, but got "%s" instead.', get_class($function))); + } + + $this->sourceFunction = $function; + } + + protected function setTarget(AbstractFunction $function) + { + if (!$function instanceof Method) { + throw new \InvalidArgumentException(sprintf('Expected $function of type Method, but got "%s" instead.', get_class($function))); + } + + $this->targetMethod = $function; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/MethodToFunctionCallSite.php b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/MethodToFunctionCallSite.php new file mode 100644 index 0000000..1aa2dae --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/MethodToFunctionCallSite.php @@ -0,0 +1,66 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\CallGraph; + +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\Method; + +/** + * @ORM\Entity(readOnly = true) + * + * @author Johannes + */ +class MethodToFunctionCallSite extends CallSite +{ + /** @ORM\ManyToOne(targetEntity = "Scrutinizer\PhpAnalyzer\Model\Method", inversedBy = "outFunctionCallSites") */ + private $sourceMethod; + + /** @ORM\ManyToOne(targetEntity = "Scrutinizer\PhpAnalyzer\Model\GlobalFunction", inversedBy = "inMethodCallSites") */ + private $targetFunction; + + public function getSource() + { + return $this->sourceMethod; + } + + public function getTarget() + { + return $this->targetFunction; + } + + protected function setSource(AbstractFunction $function) + { + if (!$function instanceof Method) { + throw new \InvalidArgumentException(sprintf('Expected $function of type Method, but got "%s" instead.', get_class($function))); + } + + $this->sourceMethod = $function; + } + + protected function setTarget(AbstractFunction $function) + { + if (!$function instanceof GlobalFunction) { + throw new \InvalidArgumentException(sprintf('Expected $function of type GlobalFunction, but got "%s" instead.', get_class($function))); + } + + $this->targetFunction = $function; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/MethodToMethodCallSite.php b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/MethodToMethodCallSite.php new file mode 100644 index 0000000..f60851c --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/CallGraph/MethodToMethodCallSite.php @@ -0,0 +1,65 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\CallGraph; + +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\Method; + +/** + * @ORM\Entity(readOnly = true) + * + * @author Johannes + */ +class MethodToMethodCallSite extends CallSite +{ + /** @ORM\ManyToOne(targetEntity = "Scrutinizer\PhpAnalyzer\Model\Method", inversedBy = "outMethodCallSites") */ + private $sourceMethod; + + /** @ORM\ManyToOne(targetEntity = "Scrutinizer\PhpAnalyzer\Model\Method", inversedBy = "inMethodCallSites") */ + private $targetMethod; + + public function getSource() + { + return $this->sourceMethod; + } + + public function getTarget() + { + return $this->targetMethod; + } + + protected function setSource(AbstractFunction $function) + { + if (!$function instanceof Method) { + throw new \InvalidArgumentException(sprintf('Expected $function of type Method, but got "%s" instead.', get_class($function))); + } + + $this->sourceMethod = $function; + } + + protected function setTarget(AbstractFunction $function) + { + if (!$function instanceof Method) { + throw new \InvalidArgumentException(sprintf('Expected $function of type Method, but got "%s" instead.', get_class($function))); + } + + $this->targetMethod = $function; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/ClassConstant.php b/src/Scrutinizer/PhpAnalyzer/Model/ClassConstant.php new file mode 100644 index 0000000..49b2a4c --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/ClassConstant.php @@ -0,0 +1,92 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "class_constants", uniqueConstraints = { + * @ORM\UniqueConstraint(columns = {"class_id", "name"}), + * @ORM\UniqueConstraint(columns = {"class_id", "constant_id"}) + * }) + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes + */ +class ClassConstant implements ContainerConstantInterface +{ + /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue(strategy = "AUTO") */ + private $id; + + /** @ORM\ManyToOne(targetEntity = "Clazz", inversedBy = "constants") */ + private $class; + + /** @ORM\ManyToOne(targetEntity = "Constant", cascade = {"persist"}) */ + private $constant; + + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "string", nullable = true) */ + private $declaringClass; + + public function __construct(Clazz $class, Constant $constant, $declaringClass = null) + { + $this->class = $class; + $this->constant = $constant; + $this->name = $constant->getName(); + + if ($class->getName() === $declaringClass) { + $declaringClass = null; + } + + $this->declaringClass = $declaringClass; + } + + public function getClass() + { + return $this->class; + } + + public function getConstant() + { + return $this->constant; + } + + public function getName() + { + return $this->name; + } + + public function getDeclaringClass() + { + return $this->declaringClass ?: $this->class->getName(); + } + + public function isInherited() + { + return null !== $this->declaringClass; + } + + public function __call($method, $args) + { + return call_user_func_array(array($this->constant, $method), $args); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/ClassMethod.php b/src/Scrutinizer/PhpAnalyzer/Model/ClassMethod.php new file mode 100644 index 0000000..1b6c375 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/ClassMethod.php @@ -0,0 +1,147 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "class_methods", uniqueConstraints = { + * @ORM\UniqueConstraint(columns = {"class_id", "name"}), + * @ORM\UniqueConstraint(columns = {"class_id", "method_id"}) + * }) + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes + */ +class ClassMethod implements ContainerMethodInterface +{ + /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue(strategy = "AUTO") */ + private $id; + + /** @ORM\ManyToOne(targetEntity = "Clazz", inversedBy = "methods") */ + private $class; + + /** @ORM\ManyToOne(targetEntity = "Method", cascade = {"persist"}) */ + private $method; + + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "string", nullable = true) */ + private $declaringClass; + + public function __construct(Clazz $class, Method $method, $declaringClass = null) + { + $this->class = $class; + $this->method = $method; + $this->name = strtolower($method->getName()); + + if ($class->getName() === $declaringClass) { + $declaringClass = null; + } + + $this->declaringClass = $declaringClass; + } + + public function getClass() + { + return $this->class; + } + + public function getContainer() + { + return $this->class; + } + + public function getMethod() + { + return $this->method; + } + + public function getName() + { + return $this->name; + } + + public function getDeclaringClass() + { + return $this->declaringClass ?: $this->class->getName(); + } + + public function getQualifiedName() + { + return $this->getDeclaringClass().'::'.$this->method->getName(); + } + + /** + * Whether a method is constrained by a language-level contract. + * + * This is either an interface contract, or a contract given by an abstract + * method of a super class. + * + * @return boolean + */ + public function isConstrainedByContract() + { + // Abstract methods are not constrained by a contract, but are the + // contract themself. + if ($this->method->isAbstract()) { + return false; + } + + $class = $this->getDeclaringClassType(); + while (null !== $class = $class->getSuperClassType()) { + if ( ! $class->hasMethod($this->name)) { + break; + } + + if ($class->getMethod($this->name)->isAbstract()) { + return true; + } + } + + foreach ($this->getDeclaringClassType()->getImplementedInterfaceTypes() as $interface) { + if ($interface->hasMethod($this->name)) { + return true; + } + } + + return false; + } + + public function getDeclaringClassType() + { + if ($this->declaringClass) { + return $this->class->getTypeRegistry()->getClass($this->declaringClass); + } + + return $this->class; + } + + public function isInherited() + { + return null !== $this->declaringClass; + } + + public function __call($method, $args) + { + return call_user_func_array(array($this->method, $method), $args); + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/Model/ClassProperty.php b/src/Scrutinizer/PhpAnalyzer/Model/ClassProperty.php new file mode 100644 index 0000000..3d34e1f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/ClassProperty.php @@ -0,0 +1,101 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "class_properties", uniqueConstraints = { + * @ORM\UniqueConstraint(columns = {"class_id", "name"}), + * @ORM\UniqueConstraint(columns = {"class_id", "property_id"}) + * }) + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes + */ +class ClassProperty implements ContainerPropertyInterface +{ + /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue(strategy = "AUTO") */ + private $id; + + /** @ORM\ManyToOne(targetEntity = "Clazz", inversedBy = "properties") */ + private $class; + + /** @ORM\ManyToOne(targetEntity = "Property", cascade = {"persist"}) */ + private $property; + + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "string", nullable = true) */ + private $declaringClass; + + public function __construct(Clazz $class, Property $property, $declaringClass = null) + { + $this->class = $class; + $this->property = $property; + $this->name = $property->getName(); + + if ($class->getName() === $declaringClass) { + $declaringClass = null; + } + + $this->declaringClass = $declaringClass; + } + + public function getClass() + { + return $this->class; + } + + public function getProperty() + { + return $this->property; + } + + public function getName() + { + return $this->name; + } + + public function getDeclaringClass() + { + return $this->declaringClass ?: $this->class->getName(); + } + + public function getDeclaringClassType() + { + if ($this->declaringClass) { + return $this->class->getTypeRegistry()->getClass($this->declaringClass); + } + + return $this->class; + } + + public function isInherited() + { + return null !== $this->declaringClass; + } + + public function __call($method, $args) + { + return call_user_func_array(array($this->property, $method), $args); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Clazz.php b/src/Scrutinizer/PhpAnalyzer/Model/Clazz.php new file mode 100644 index 0000000..e64dfd0 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Clazz.php @@ -0,0 +1,440 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ProxyObjectType; + +/** + * @ORM\Entity(readOnly = true) + * + * @author Johannes + */ +class Clazz extends MethodContainer implements ConstantContainerInterface +{ + const MODIFIER_FINAL = 1; + const MODIFIER_ABSTRACT = 2; + + /** @ORM\Column(type = "string") */ + private $superClass; + + /** @ORM\Column(type = "simple_array") */ + private $superClasses = array(); + + /** @ORM\Column(type = "simple_array") */ + private $implementedInterfaces = array(); + + /** @ORM\OneToMany(targetEntity = "ClassMethod", mappedBy="class", indexBy = "name", orphanRemoval = true, cascade = {"persist", "remove"}, fetch = "EAGER") */ + private $methods; + + /** @ORM\OneToMany(targetEntity = "ClassProperty", mappedBy="class", indexBy = "name", orphanRemoval = true, cascade = {"persist", "remove"}, fetch = "EAGER") */ + private $properties; + + /** @ORM\OneToMany(targetEntity = "ClassConstant", mappedBy = "class", indexBy = "name", orphanRemoval = true, cascade = {"persist", "remove"}, fetch = "EAGER") */ + private $constants; + + /** @ORM\Column(type = "smallint") */ + private $modifier = 0; + + public function __construct($name) + { + parent::__construct($name); + + $this->methods = new ArrayCollection(); + $this->properties = new ArrayCollection(); + $this->constants = new ArrayCollection(); + } + + public function setSuperClass($class) + { + $this->superClass = $class; + } + + public function setModifier($modifier) + { + $this->modifier = (integer) $modifier; + } + + public function getSuperClass() + { + return $this->superClass; + } + + public function getSuperClasses() + { + return $this->superClasses; + } + + public function setSuperClasses(array $names) + { + $this->superClasses = $names; + } + + public function getSuperClassType() + { + if (null === $this->superClass) { + return null; + } + + return $this->registry->getClass($this->superClass); + } + + /** + * @return array + */ + public function getImplementedInterfaceTypes() + { + $types = array(); + foreach ($this->implementedInterfaces as $name) { + if (null === $class = $this->registry->getClass($name)) { + continue; + } + + $types[] = $class; + } + + return $types; + } + + public function getImplementedInterfaces() + { + return $this->implementedInterfaces; + } + + public function addImplementedInterface($name) + { + $this->implementedInterfaces[] = $name; + } + + public function setImplementedInterfaces(array $names) + { + $this->implementedInterfaces = $names; + } + + public function isImplementing($name) + { + $lowerName = strtolower($name); + foreach ($this->implementedInterfaces as $iFace) { + if ($lowerName === strtolower($iFace)) { + return true; + } + } + + return false; + } + + /** + * @return ContainerMethodInterface|null + */ + public function getContractDefiningMethod($name) + { + $class = $this; + do { + if ( ! $class->hasMethod($name)) { + return null; + } + + if ($class->getMethod($name)->isAbstract()) { + return $class->getMethod($name); + } + } while (null !== $class = $class->getSuperClassType()); + + foreach ($this->getImplementedInterfaceTypes() as $interface) { + if ($interface->hasMethod($name)) { + return $interface->getMethod($name); + } + } + + return null; + } + + public function hasImplementedInterface($name) + { + return in_array($name, $this->implementedInterfaces, true); + } + + public function isTraversable() + { + if (!$this->isNormalized()) { + return true; + } + + return $this->hasImplementedInterface('Traversable'); + } + + public function isUtilityClass() + { + if (null !== $this->superClass + && ($superClassType = $this->getSuperClassType()) + && ($superClassType = $superClassType->toMaybeObjectType()) + && !$superClassType->isUtilityClass()) { + return false; + } + + $hasStaticMembers = false; + foreach ($this->getMethods() as $method) { + if ($method->isConstructor() && !$method->isPublic()) { + continue; + } + + if (!$method->isStatic()) { + return false; + } + + $hasStaticMembers = true; + } + + return $hasStaticMembers; + } + + /** + * Returns the type of the parameter type of the Traversable. + */ + public function getTraversableElementType() + { + if (null === $this->registry) { + throw new \LogicException('Registry is not set for type: '.$this.' ('.get_class($this).')'); + } + + if ($this->hasImplementedInterface('IteratorAggregate')) { + // Maybe that method is implemented by a sub-class, and this class + // has only implemented the interface. + if (!$this->hasMethod('getIterator')) { + return $this->registry->getNativeType('unknown'); + } + + // TODO: We need to add support for parameterized types. + // So that, we can assign a parameter type to iterators, + // and check this here. + return $this->registry->getNativeType('unknown'); + } else if ($this->hasImplementedInterface('Iterator')) { + if (!$this->hasMethod('current')) { + return $this->registry->getNativeType('unknown'); + } + + return $this->getMethod('current')->getReturnType(); + } + + return $this->isNormalized() ? + $this->registry->getNativeType('none') + : $this->registry->getNativeType('unknown'); + } + + public function isSubTypeOf(PhpType $that) + { + if (PhpType::isSubTypeOf($that)) { + return true; + } + + if ($that->isNoObjectType()) { + return true; + } + + if ($that->isCallableType()) { + return true; + } + + if (false === $that->isObjectType()) { + return false; + } + + if (false === $this->isNormalized()) { + return true; + } + + if ($that->isInterface()) { + $name = strtolower($that->toMaybeObjectType()->getName()); + foreach ($this->implementedInterfaces as $iName) { + if ($name === strtolower($iName)) { + return true; + } + } + + return false; + } + + // means it is a normal class + if ($that->isClass()) { + $name = strtolower($that->toMaybeObjectType()->getName()); + foreach ($this->superClasses as $sName) { + if ($name === strtolower($sName)) { + return true; + } + } + + return false; + } + + if ($that instanceof ProxyObjectType) { + $name = strtolower($that->getReferenceName()); + foreach ($this->implementedInterfaces as $iName) { + if ($name === strtolower($iName)) { + return true; + } + } + + foreach ($this->superClasses as $sName) { + if ($name === strtolower($sName)) { + return true; + } + } + + return false; + } + + return false; + } + + public function canBeCalled() + { + if ( ! $this->isNormalized()) { + return true; + } + + return $this->hasMethod('__invoke'); + } + + public function addMethod(Method $method, $declaringClass = null) + { + $classMethod = new ClassMethod($this, $method, $declaringClass); + $this->methods->set(strtolower($method->getName()), $classMethod); + } + + public function hasMethod($name) + { + return $this->methods->containsKey(strtolower($name)); + } + + public function equals(PhpType $type) + { + if ($type->isClass() && strtolower($type->toMaybeObjectType()->getName()) === strtolower($this->getName())) { + return true; + } + + if ($type instanceof ProxyObjectType && strtolower($type->getReferenceName()) === strtolower($this->getName())) { + return true; + } + + return false; + } + + public function getMethod($name) + { + return $this->methods->get(strtolower($name)); + } + + public function getMethodNames() + { + $names = array(); + foreach ($this->methods as $classMethod) { + $names[] = $classMethod->getMethod()->getName(); + } + + return $names; + } + + public function isFinal() + { + return self::MODIFIER_FINAL === ($this->modifier & self::MODIFIER_FINAL); + } + + public function isAbstract() + { + return self::MODIFIER_ABSTRACT === ($this->modifier & self::MODIFIER_ABSTRACT); + } + + public function getModifier() + { + return $this->modifier; + } + + public function getMethods() + { + return $this->methods; + } + + public function getProperties() + { + return $this->properties; + } + + public function hasProperty($name) + { + return $this->properties->containsKey($name); + } + + public function getProperty($name) + { + return $this->properties->get($name); + } + + public function getPropertyNames() + { + return $this->properties->getKeys(); + } + + public function addProperty(Property $property, $declaringClass = null) + { + $classProperty = new ClassProperty($this, $property, $declaringClass); + $this->properties->set($property->getName(), $classProperty); + } + + public function getConstants() + { + return $this->constants; + } + + public function hasConstant($name) + { + return $this->constants->containsKey($name); + } + + public function getConstant($name) + { + return $this->constants->get($name); + } + + public function addConstant(Constant $constant, $declaringClass = null) + { + $classConstant = new ClassConstant($this, $constant, $declaringClass); + $this->constants->set($constant->getName(), $classConstant); + } + + public function setPackageVersion(PackageVersion $packageVersion) + { + parent::setPackageVersion($packageVersion); + + foreach ($this->properties as $property) { + if ($property->isInherited()) { + continue; + } + + $property->setPackageVersion($packageVersion); + } + foreach ($this->constants as $constant) { + if ($constant->isInherited()) { + continue; + } + + $constant->setPackageVersion($packageVersion); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Comment.php b/src/Scrutinizer/PhpAnalyzer/Model/Comment.php new file mode 100644 index 0000000..9964e02 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Comment.php @@ -0,0 +1,195 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use JMS\Serializer\Annotation as Serializer; + +/** + * Holds information about an error, or warning that one of the analyzer passes + * has found. + * + * @Serializer\ExclusionPolicy("ALL") + * @author Johannes M. Schmitt + */ +class Comment +{ + /** + * Comments of this type should be used for diagnostics which likely result + * in a fatal program error at run-time. + */ + const LEVEL_ERROR = 'error'; + + /** + * Comments of this type should be used for diagnostics which will not cause + * the program to abort. + */ + const LEVEL_WARNING = 'warning'; + + /** @Serializer\SerializedName("id") @Serializer\Expose */ + private $key; + + private $level; + + /** @Serializer\SerializedName("message") @Serializer\Expose */ + private $messageFormat; + + /** @Serializer\SerializedName("params") @Serializer\Expose */ + private $context; + + /** @Serializer\Expose */ + private $tool = 'php_analyzer'; + + /** + * Determines in which part of the context should be considered when making + * equality decisions. By default, the entire context will be considered. + * + * @var array|null + */ + private $variesIn; + + private $otherOccurrences = array(); + + public static function error($key, $messageFormat, array $context = array()) + { + return new self(self::LEVEL_ERROR, $key, $messageFormat, $context); + } + + public static function warning($key, $messageFormat, array $context = array()) + { + return new self(self::LEVEL_WARNING, $key, $messageFormat, $context); + } + + private function __construct($level, $key, $messageFormat, array $context) + { + $this->level = $level; + $this->key = $key; + $this->messageFormat = $messageFormat; + $this->context = $context; + } + + public function equals(Comment $that) + { + if ($this->key !== $that->key) { + return false; + } + + if (null === $this->variesIn) { + return $this->context === $that->context; + } + + foreach ($this->variesIn as $var) { + if ( ! isset($that->context[$var])) { + return false; + } + + if ($this->context[$var] !== $that->context[$var]) { + return false; + } + } + + return true; + } + + public function getKey() + { + return $this->key; + } + + public function getLevel() + { + return $this->level; + } + + public function getMessageFormat() + { + return $this->messageFormat; + } + + public function getOtherOccurrences() + { + return $this->otherOccurrences; + } + + public function setOtherOccurrences(array $lines) + { + $this->otherOccurrences = array_unique($lines); + } + + public function varyIn(array $vars) + { + foreach ($vars as $var) { + if ( ! isset($this->context[$var])) { + throw new \InvalidArgumentException(sprintf('The var "%s" does not exist.', $var)); + } + } + + $this->variesIn = $vars; + + return $this; + } + + /** + * Returns the context of this comment. + * + * The context may contain additional data which describes the problem. + * + * @return array + */ + public function getContext() + { + return $this->context; + } + + public function setContext(array $context) + { + $this->context = $context; + } + + public function __toString() + { + $replaceMap = array(); + foreach ($this->context as $key => $value) { + $replaceMap['%'.$key.'%'] = $value; + } + + $msg = strtr($this->messageFormat, $replaceMap); + + switch (count($this->otherOccurrences)) { + case 0: + break; + + case 1: + $msg .= ' Please also check line '.$this->otherOccurrences[0].'.'; + break; + + case 2: + case 3: + $occ = $this->otherOccurrences; + $last = array_pop($occ); + $msg .= ' I also found this on lines '.implode(', ', $occ).', and '.$last.'.'; + break; + + default: + $msg .= ' I found this a couple of more times on lines: '.implode(", ", $this->otherOccurrences).'.'; + break; + } + + return $msg; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/CommentCollection.php b/src/Scrutinizer/PhpAnalyzer/Model/CommentCollection.php new file mode 100644 index 0000000..7aa79f9 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/CommentCollection.php @@ -0,0 +1,59 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +class CommentCollection implements \Countable +{ + private $comments = array(); + + public function add($line, Comment $comment) + { + // Make sure that the same comment is not getting added twice to a line. + // This might regularly be the case if the same error is found in two + // different code elements which are placed on the same line. + if (isset($this->comments[$line])) { + foreach ($this->comments[$line] as $existingComment) { + if ($existingComment->equals($comment)) { + return; + } + } + } + + $this->comments[$line][] = $comment; + } + + public function all($line = null) + { + if (null !== $line) { + return isset($this->comments[$line]) ? $this->comments[$line] : array(); + } + + return $this->comments; + } + + public function replace(array $comments) + { + $this->comments = $comments; + } + + public function count() + { + return count($this->comments); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Constant.php b/src/Scrutinizer/PhpAnalyzer/Model/Constant.php new file mode 100644 index 0000000..22d0f23 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Constant.php @@ -0,0 +1,86 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "constants") + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes M. Schmitt + */ +class Constant +{ + /** @ORM\Id @ORM\Column(type = "integer") @ORM\GeneratedValue(strategy = "AUTO") */ + private $id; + + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "PhpType") */ + private $phpType; + + /** @ORM\ManyToOne(targetEntity = "PackageVersion") */ + private $packageVersion; + + private $astNode; + + public function __construct($name) + { + $this->name = $name; + } + + public function getId() + { + return $this->id; + } + + public function getName() + { + return $this->name; + } + + public function getPhpType() + { + return $this->phpType; + } + + public function getAstNode() + { + return $this->astNode; + } + + public function setAstNode(\PHPParser_Node $node) + { + $this->astNode = $node; + } + + public function setPhpType(PhpType $type) + { + $this->phpType = $type; + } + + public function setPackageVersion(PackageVersion $packageVersion) + { + $this->packageVersion = $packageVersion; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/ConstantContainerInterface.php b/src/Scrutinizer/PhpAnalyzer/Model/ConstantContainerInterface.php new file mode 100644 index 0000000..fb12df0 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/ConstantContainerInterface.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +interface ConstantContainerInterface +{ + /** + * Returns all constants. + * + * @return ContainerConstantInterface[] + */ + function getConstants(); + + /** + * Returns whether a constants exists + * + * @param string $name case-sensitive + * @return boolean + */ + function hasConstant($name); + + /** + * Adds a constant. + * + * @param \Scrutinizer\PhpAnalyzer\Model\Constant $constant + * @param string $declaringClass + */ + function addConstant(Constant $constant, $declaringClass = null); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/ContainerConstantInterface.php b/src/Scrutinizer/PhpAnalyzer/Model/ContainerConstantInterface.php new file mode 100644 index 0000000..bb03321 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/ContainerConstantInterface.php @@ -0,0 +1,42 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +interface ContainerConstantInterface +{ + /** + * @return string + */ + function getName(); + + /** + * @return Constant + */ + function getConstant(); + + /** + * @return string + */ + function getDeclaringClass(); + + /** + * @return boolean + */ + function isInherited(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/ContainerMethodInterface.php b/src/Scrutinizer/PhpAnalyzer/Model/ContainerMethodInterface.php new file mode 100644 index 0000000..e9974f4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/ContainerMethodInterface.php @@ -0,0 +1,66 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +interface ContainerMethodInterface +{ + /** + * @return Method + */ + function getMethod(); + + /** + * @return string + */ + function getDeclaringClass(); + + /** + * @return string + */ + function getName(); + + /** + * Returns a qualified name for this method of the format "FQCN::methodName". + * + * @return string + */ + function getQualifiedName(); + + /** + * @return boolean + */ + function isInherited(); + + /** + * The container that this method was called on. + * + * This is not necessary equal to the container that this method is + * actually declared in. + * + * ```php + * class A { public function a() { } } + * class B extends A { } + * $b = new B(); + * $b->a(); // For this call object would be returned. + * ``` + * + * @return MethodContainer + */ + function getContainer(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/ContainerPropertyInterface.php b/src/Scrutinizer/PhpAnalyzer/Model/ContainerPropertyInterface.php new file mode 100644 index 0000000..91c2475 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/ContainerPropertyInterface.php @@ -0,0 +1,42 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +interface ContainerPropertyInterface +{ + /** + * @return string + */ + function getName(); + + /** + * @return Property + */ + function getProperty(); + + /** + * @return string + */ + function getDeclaringClass(); + + /** + * @return boolean + */ + function isInherited(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/File.php b/src/Scrutinizer/PhpAnalyzer/Model/File.php new file mode 100644 index 0000000..a5c6fb7 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/File.php @@ -0,0 +1,327 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use JMS\PhpManipulator\PhpParser\BlockNode; +use JMS\PhpManipulator\PhpParser\NormalizingNodeVisitor; +use Scrutinizer\Util\DiffUtils; +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\ExclusionPolicy("ALL") + */ +class File +{ + private static $phpParser; + + /** @Serializer\Expose @Serializer\SerializedName("path") */ + private $name; + + /** @Serializer\Expose */ + private $content; + + private $comments; + private $changedLines = array(); + private $diff; + private $chunks; + private $attributes = array(); + private $originalFile; + private $fixedFile; + + public static function create($name, $content, $originalContent = null) + { + if (null === self::$phpParser) { + self::initStatic(); + } + + if ('.php' === substr($name, -4)) { + $file = self::createPhpFile($name, $content); + } else { + $file = new File($name, $content); + } + + if (null !== $originalContent) { + $file->setDiff(DiffUtils::generate($originalContent, $content)); + } + + return $file; + } + + private static function createPhpFile($name, $content) + { + $file = new PhpFile($name, $content); + + try { + $ast = self::$phpParser->parse(new \PHPParser_Lexer($content)); + } catch (\PHPParser_Error $parserEx) { + // This at least allows to run all the passes. For those that + // need an AST to work, they will obviously not do anything + // useful, but maybe some can. + // TODO: Implement some heuristics to attempt to fix the code. + $ast = array(new BlockNode(array())); + + $lineNb = $parserEx->getRawLine(); + if (-1 === $lineNb) { + // This is such a serious error that we at least need to + // report it somehow even if the line is off. + $file->addComment(1, Comment::error( + 'unparsable_code', + "Cannot point out a specific line, but got the following parsing error when trying this code:\n\n%message%", + array('message' => $parserEx->getRawMessage()))); + } else { + $file->addComment($lineNb, Comment::error( + 'unparsable_code_with_line', + "This code did not parse for me. Apparently, there is an error somewhere around this line:\n\n%message%", + array('message' => $parserEx->getRawMessage()))); + } + } + + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); + $traverser->addVisitor(new NormalizingNodeVisitor()); + $ast = $traverser->traverse($ast); + + // Wrap the AST in a block node if it has more than one root + if (count($ast) > 1) { + $ast = array(new BlockNode($ast)); + } else if (0 === count($ast)) { + $ast = array(new BlockNode(array())); + } + + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NodeConnector()); + + // do not assign the AST here as the traverser clones nodes resulting + // in different references for "parent", "next", "previous", etc. + $traverser->traverse($ast); + + $file->setAst($ast[0]); + + return $file; + } + + private static function initStatic() + { + self::$phpParser = new \PHPParser_Parser(); + } + + public function __construct($name, $code) + { + $this->name = $name; + $this->content = $code; + $this->comments = new CommentCollection(); + } + + public function getContent() + { + return $this->content; + } + + public function getName() + { + return $this->name; + } + + public function hasFixedFile() + { + return null !== $this->fixedFile; + } + + public function hasFixedFileWithChanges() + { + return null !== $this->fixedFile + && $this->fixedFile->getContent() !== $this->content; + } + + public function getOrCreateFixedFile() + { + if (null !== $this->fixedFile) { + return $this->fixedFile; + } + + return $this->fixedFile = $this->createFixedFile(); + } + + protected function createFixedFile() + { + return new FixedFile($this->content); + } + + public function getFixedFile() + { + return $this->fixedFile; + } + + public function addComment($line, Comment $comment) + { + $this->comments->add($line, $comment); + } + + public function hasComments() + { + return count($this->comments) > 0; + } + + /** + * @Serializer\VirtualProperty + * @Serializer\SerializedName("comments") + */ + public function getFlatComments() + { + return $this->comments->all(); + } + + public function getComments($line = null) + { + return $this->comments->all($line); + } + + public function setComments(array $comments) + { + $this->comments->replace($comments); + } + + public function setLineChanged($line) + { + $this->changedLines[$line] = true; + } + + public function isLineChanged($line) + { + // always return true if no chunks have been set, and no lines + // have been manually marked as changed + if (null === $this->diff && !$this->changedLines) { + return true; + } + + return isset($this->changedLines[$line]); + } + + public function setDiff($diff) + { + $this->diff = $diff; + $this->chunks = DiffUtils::parse($diff); + + foreach ($this->chunks as $chunk) { + $i = $chunk['new_start_index']; + + foreach ($chunk['diff'] as $change) { + if ('removed' === $change['type']) { + continue; + } + + if ('added' === $change['type']) { + $this->setLineChanged($i); + } + + $i += 1; + } + } + } + + public function getDiff() + { + return $this->diff; + } + + public function getChunks() + { + return $this->chunks; + } + + public function hasOriginalFile() + { + return null !== $this->diff; + } + + public function getOriginalFile() + { + if (null === $this->diff) { + throw new \LogicException('getOriginalFile() is only available after setDiff() has been called.'); + } + + if (null !== $this->originalFile) { + return $this->originalFile; + } + + if ($this->isNew()) { + return self::create($this->name, ''); + } + + // TODO: What about files which have been renamed? + return $this->originalFile = self::create($this->name, DiffUtils::reverseApply($this->content, $this->diff)); + } + + public function isNew() + { + if (null === $this->diff) { + throw new \LogicException('isNew() is only available after setDiff() was called.'); + } + + return 1 === count($this->chunks) && $this->chunks[0]['original_start_index'] === 0 + && $this->chunks[0]['original_size'] === 0; + } + + public function setAttribute($key, $value) + { + $this->attributes[$key] = $value; + } + + public function hasAttribute($key) + { + return isset($this->attributes[$key]); + } + + public function removeAttribute($key) + { + unset($this->attributes[$key]); + } + + public function getAttribute($key, $default = null) + { + return isset($this->attributes[$key]) ? $this->attributes[$key] : $default; + } + + public function getAttributes() + { + return $this->attributes; + } + + public function setAttributes(array $attributes) + { + $this->attributes = $attributes; + } + + /** + * @Serializer\VirtualProperty + */ + public function getProposedPatch() + { + if (empty($this->fixedFile)) { + return null; + } + + $after = $this->fixedFile->getContent(); + if ($this->content === $after) { + return null; + } + + return DiffUtils::generate($this->content, $after); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php new file mode 100644 index 0000000..d9d8e60 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php @@ -0,0 +1,471 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Scrutinizer\PhpAnalyzer\Exception\MaxMemoryExceededException; +use Symfony\Component\Finder\Finder; +use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; +use Symfony\Component\Finder\Iterator\FilenameFilterIterator; +use Symfony\Component\Finder\SplFileInfo; + +class FileCollection implements \IteratorAggregate, \Countable +{ + private $files = array(); + private $size = 0; + + public static function createFromContent($fileName, $content) + { + return new self(array(File::create($fileName, $content))); + } + + /** + * @param string $zipFile + * @param string|null $namePattern + * + * @return FileCollection + */ + public static function createFromZipFile($zipFile, $namePattern = null, array $filter = array()) + { + if ( ! is_file($zipFile)) { + throw new \InvalidArgumentException('The zip file "%s" does not exist.'); + } + + $iterator = new ZipFileIterator($zipFile); + $iterator = new ExcludeDirectoryFilterIterator($iterator, array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg')); + + if (null !== $namePattern) { + $iterator = new FilenameFilterIterator($iterator, array($namePattern), array()); + } + + $paths = isset($filter['paths']) ? (array) $filter['paths'] : array(); + $excludedPaths = isset($filter['excluded_paths']) ? (array) $filter['excluded_paths'] : array(); + if ($paths || $excludedPaths) { + $iterator = new \CallbackFilterIterator($iterator, self::createFilterCallback($paths, $excludedPaths)); + } + + return self::createFromTraversable($iterator); + } + + /** + * @param string $dir + * @param string|null $namePattern + */ + public static function createFromDirectory($dir, $namePattern = null, array $filter = array()) + { + if (!is_dir($dir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist.', $dir)); + } + + $dir = realpath($dir); + $finder = Finder::create()->in($dir)->ignoreVCS(true)->files(); + if (null !== $namePattern) { + $finder->name($namePattern); + } + + $paths = isset($filter['paths']) ? (array) $filter['paths'] : array(); + $excludedPaths = isset($filter['excluded_paths']) ? (array) $filter['excluded_paths'] : array(); + if ($paths || $excludedPaths) { + $finder->filter(self::createFilterCallback($paths, $excludedPaths)); + } + + return self::createFromTraversable($finder, $dir.'/'); + } + + private static function createFilterCallback(array $paths, array $excludedPaths) + { + return function(SplFileInfo $file) use ($paths, $excludedPaths) { + $relPathname = $file->getRelativePathname(); + + if ($paths) { + $matches = false; + foreach ($paths as $path) { + if ( ! fnmatch($path, $relPathname)) { + continue; + } + + $matches = true; + break; + } + + if (! $matches) { + return false; + } + } + + foreach ($excludedPaths as $path) { + if (fnmatch($path, $relPathname)) { + return false; + } + } + + return true; + }; + } + + public static function createFromTraversable(\Traversable $traversable, $basePath = '') + { + $prefixLength = strlen($basePath); + $col = new self(); + + $i = 0; + $memoryThreshold = self::getMemoryThreshold(); + foreach ($traversable as $file) { + assert($file instanceof SplFileInfo); + $col->add(File::create(substr($file->getRealPath(), $prefixLength), $file->getContents())); + + if ($i % 50 === 0 && $memoryThreshold < $memoryUsage = memory_get_usage()) { + throw MaxMemoryExceededException::create($memoryUsage, $memoryThreshold); + } + + $i += 1; + } + + if ($memoryThreshold < $memoryUsage = memory_get_usage()) { + throw MaxMemoryExceededException::create($memoryUsage, $memoryThreshold); + } + + return $col; + } + + /** + * Determines the maximum allowed memory usage. + * + * The return value depends on the underlying system. We try to determine + * the maximum value in such a way that the analysis is just using RAM + * without going to SWAP as this would severely slow down everything. + * + * TODO: We probably need a better place for this. + */ + public static function getMemoryThreshold() + { + if (0 === stripos(PHP_OS, 'win')) { + return 1024 * 1024 * 1024 * 1.8; // 1.8 GB + } + + exec('free -m', $output, $returnVar); + if (0 === $returnVar) { + if (preg_match('#buffers/cache:\s+[^\s]+\s+([^\s]+)#', implode("\n", $output), $match)) { + // Values are in mega bytes. + list(, $freeMemory) = $match; + + // Allow it to use all free memory, but at least 512M. + return max(1024 * 1024 * $freeMemory, 1024 * 1024 * 512); + } + } + + // If we cannot infer something about the free memory, then we + // gonna use 3 GB as this is fulfilled by all machines this is + // running on at the moment. + return 1024 * 1024 * 1024 * 3; // 3 GB + } + + public function __construct(array $initialFiles = array()) + { + foreach ($initialFiles as $file) { + $this->add($file); + } + } + + public function getSize() + { + return $this->size; + } + + public function add(File $file) + { + if (isset($this->files[$name = $file->getName()])) { + throw new \InvalidArgumentException(sprintf('There already exists a file named "%s".', $name)); + } + + $this->files[$name] = $file; + $this->size += strlen($file->getContent()); + } + + public function all() + { + return $this->files; + } + + public function count() + { + return count($this->files); + } + + public function get($name) + { + if (!isset($this->files[$name])) { + throw new \InvalidArgumentException(sprintf('The file "%s" does not exist.', $name)); + } + + return $this->files[$name]; + } + + public function getIterator() + { + return new \ArrayIterator($this->files); + } +} + +class ZipFileIterator implements \Iterator +{ + private $file; + private $archive; + private $entry; + private $key; + + public function __construct($file) + { + if ( ! is_file($file)) { + throw new \InvalidArgumentException(sprintf('The file "%s" does not exist.', $file)); + } + + $this->file = $file; + } + + public function key() + { + return $this->key; + } + + public function valid() + { + return false !== $this->entry; + } + + public function current() + { + return new CompressedZipFile($this->entry); + } + + public function next() + { + while (false !== $this->entry = zip_read($this->archive)) { + if ('/' !== substr(zip_entry_name($this->entry), -1)) { + break; + } + } + + $this->key += 1; + } + + public function rewind() + { + if (null !== $this->archive) { + zip_close($this->archive); + $this->archive = null; + } + + if ( ! is_resource($archive = zip_open($this->file))) { + throw new \RuntimeException('Could not open zip file.'); + } + $this->archive = $archive; + $this->key = -1; + + $this->next(); + } + + public function isDir() + { + return false; + } + + public function getSubPath() + { + return dirname(zip_entry_name($this->entry)); + } + + public function getFilename() + { + return basename(zip_entry_name($this->entry)); + } +} + +class CompressedZipFile extends SplFileInfo +{ + private $entry; + private $name; + + public function __construct($entry) + { + $this->entry = $entry; + $this->name = zip_entry_name($entry); + } + + public function getATime() + { + throw new \LogicException('Not implemented.'); + } + + public function getBasename($suffix = null) + { + return basename($this->name, $suffix); + } + + public function getCTime() + { + throw new \LogicException('Not implemented.'); + } + + public function getExtension() + { + if ( ! preg_match('#\.([^\.]+)$#', $this->name, $match)) { + return null; + } + + return $match[1]; + } + + public function getFileInfo($className = null) + { + throw new \LogicException('Not implemented.'); + } + + public function getFilename() + { + return basename($this->name); + } + + public function getGroup() + { + throw new \LogicException('Not implemented.'); + } + + public function getINode() + { + throw new \LogicException('Not implemented.'); + } + + public function getLinkTarget() + { + throw new \LogicException('Not implemented.'); + } + + public function getMTime() + { + throw new \LogicException('Not implemented.'); + } + + public function getOwner() + { + throw new \LogicException('Not implemented.'); + } + + public function getPath() + { + return dirname($this->name); + } + + public function getPathInfo($className = null) + { + throw new \LogicException('Not implemented.'); + } + + public function getPathname() + { + return $this->name; + } + + public function getPerms() + { + throw new \LogicException('Not implemented.'); + } + + public function getRealPath() + { + return $this->name; + } + + public function getSize() + { + return zip_entry_filesize($this->entry); + } + + public function getType() + { + throw new \LogicException('Not implemented.'); + } + + public function isDir() + { + return false; + } + + public function isExecutable() + { + return false; + } + + public function isFile() + { + return true; + } + + public function isLink() + { + return false; + } + + public function isReadable() + { + return true; + } + + public function isWritable() + { + return false; + } + + /** + * @param boolean $useIncludePath + */ + public function openFile($openMode = 'r', $useIncludePath = false, $context = null) + { + throw new \LogicException('Not implemented.'); + } + + public function setFileClass($className = null) + { + throw new \LogicException('Not implemented.'); + } + + public function setInfoClass($className = null) + { + throw new \LogicException('Not implemented.'); + } + + public function __toString() + { + return $this->name; + } + + public function getRelativePath() + { + return $this->getPath(); + } + + public function getRelativePathname() + { + return $this->getPathname(); + } + + public function getContents() + { + return zip_entry_read($this->entry, zip_entry_filesize($this->entry)); + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/Model/FixedFile.php b/src/Scrutinizer/PhpAnalyzer/Model/FixedFile.php new file mode 100644 index 0000000..51f71a4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/FixedFile.php @@ -0,0 +1,63 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +class FixedFile implements \Serializable +{ + private $content; + private $changeMessages = array(); + + public function __construct($content) + { + $this->content = $content; + } + + public function setContent($content) + { + $this->content = $content; + } + + public function getContent() + { + return $this->content; + } + + public function getChangeMessages() + { + return $this->changeMessages; + } + + /** + * @param string $msg + */ + public function addChangeMessage($msg) + { + $this->changeMessages[] = $msg; + } + + public function serialize() + { + return serialize(array($this->content, $this->changeMessages)); + } + + public function unserialize($str) + { + list($this->content, $this->changeMessages) = unserialize($str); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/FixedPhpFile.php b/src/Scrutinizer/PhpAnalyzer/Model/FixedPhpFile.php new file mode 100644 index 0000000..2df671e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/FixedPhpFile.php @@ -0,0 +1,78 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use JMS\PhpManipulator\PhpParser\ParseUtils; +use Scrutinizer\PhpAnalyzer\Pass\TypeInferencePass; + +class FixedPhpFile extends FixedFile +{ + private $ast; + private $typeInferencePass; + + public function __construct(Analyzer $analyzer, $content) + { + parent::__construct($content); + + $this->typeInferencePass = new TypeInferencePass(); + $this->typeInferencePass->setAnalyzer($analyzer); + + $this->updateAst(); + } + + public function getAst() + { + if (null === $this->ast) { + throw new \LogicException('There is no AST. Possibly we could not parse the code, or this instance has just been unserialized. Please check with hasAst() prior to calling this method.'); + } + + return $this->ast; + } + + public function hasAst() + { + return null !== $this->ast; + } + + public function setContent($content) + { + parent::setContent($content); + $this->updateAst(); + } + + private function updateAst() + { + try { + $this->ast = ParseUtils::parse($this->getContent()); + + NodeTraversal::traverseWithCallback($this->ast, + $this->typeInferencePass, + $this->typeInferencePass->getScopeCreator()); + + NodeTraversal::traverseWithCallback($this->ast, + $this->typeInferencePass, + $this->typeInferencePass->getScopeCreator()); + } catch (\PHPParser_Error $ex) { + // The original content of the file is not valid PHP code. We just ignore this. + // Passes that require an AST, have to check with hasAst() manually. + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/FunctionParameter.php b/src/Scrutinizer/PhpAnalyzer/Model/FunctionParameter.php new file mode 100644 index 0000000..d224862 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/FunctionParameter.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "function_parameters") + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes M. Schmitt + */ +class FunctionParameter extends Parameter +{ + /** @ORM\Id @ORM\GeneratedValue(strategy = "AUTO") @ORM\Column(type = "integer") */ + private $id; + + /** @ORM\ManyToOne(targetEntity="GlobalFunction", inversedBy = "parameters") */ + private $function; + + public function getId() + { + return $this->id; + } + + public function setFunction(GlobalFunction $function) + { + $this->function = $function; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/GlobalConstant.php b/src/Scrutinizer/PhpAnalyzer/Model/GlobalConstant.php new file mode 100644 index 0000000..af7753c --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/GlobalConstant.php @@ -0,0 +1,93 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "global_constants", uniqueConstraints = { + * @ORM\UniqueConstraint(columns = {"packageVersion_id", "name"}) + * }) + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes M. Schmitt + */ +class GlobalConstant +{ + /** @ORM\Id @ORM\GeneratedValue(strategy = "AUTO") @ORM\Column(type = "integer") */ + private $id; + + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "PhpType") */ + private $phpType; + + /** @ORM\ManyToOne(targetEntity = "PackageVersion", inversedBy = "constants") */ + private $packageVersion; + + private $astNode; + + public function __construct($name) + { + $this->name = $name; + } + + public function getId() + { + return $this->id; + } + + public function getName() + { + return $this->name; + } + + public function getPhpType() + { + return $this->phpType; + } + + public function getPackageVersion() + { + return $this->packageVersion; + } + + public function getAstNode() + { + return $this->astNode; + } + + public function setAstNode(\PHPParser_Node $node) + { + $this->astNode = $node; + } + + public function setPhpType(PhpType $type) + { + $this->phpType = $type; + } + + public function setPackageVersion(PackageVersion $packageVersion) + { + $this->packageVersion = $packageVersion; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/GlobalFunction.php b/src/Scrutinizer/PhpAnalyzer/Model/GlobalFunction.php new file mode 100644 index 0000000..f599f4b --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/GlobalFunction.php @@ -0,0 +1,179 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "global_functions", uniqueConstraints = { + * @ORM\UniqueConstraint(columns = {"packageVersion_id", "name"}) + * }) + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes + */ +class GlobalFunction extends AbstractFunction +{ + /** @ORM\Id @ORM\GeneratedValue(strategy = "AUTO") @ORM\Column(type = "integer") */ + private $id; + + /** @ORM\ManyToOne(targetEntity = "PackageVersion", inversedBy = "functions") */ + private $packageVersion; + + /** @ORM\OneToMany(targetEntity = "FunctionParameter", indexBy = "name", cascade = {"persist", "remove"}, mappedBy = "function", fetch = "EAGER") */ + private $parameters; + + /** @ORM\OneToMany(targetEntity = "Scrutinizer\PhpAnalyzer\Model\CallGraph\MethodToFunctionCallSite", mappedBy = "targetFunction", cascade = {"persist", "remove"}) */ + private $inMethodCallSites; + + /** @ORM\OneToMany(targetEntity = "Scrutinizer\PhpAnalyzer\Model\CallGraph\FunctionToFunctionCallSite", mappedBy = "targetFunction", cascade = {"persist", "remove"}) */ + private $inFunctionCallSites; + + /** @ORM\OneToMany(targetEntity = "Scrutinizer\PhpAnalyzer\Model\CallGraph\FunctionToMethodCallSite", mappedBy = "sourceFunction", cascade = {"persist", "remove"}, orphanRemoval = true) */ + private $outMethodCallSites; + + /** @ORM\OneToMany(targetEntity = "Scrutinizer\PhpAnalyzer\Model\CallGraph\FunctionToFunctionCallSite", mappedBy = "sourceFunction", cascade = {"persist", "remove"}, orphanRemoval = true) */ + private $outFunctionCallSites; + + // NON-PERSISTENT FIELDS + private $importedNamespaces = array(); + + public function __construct($name) + { + parent::__construct($name); + + $this->parameters = new ArrayCollection(); + $this->inMethodCallSites = new ArrayCollection(); + $this->inFunctionCallSites = new ArrayCollection(); + $this->outMethodCallSites = new ArrayCollection(); + $this->outFunctionCallSites = new ArrayCollection(); + } + + public function getShortName() + { + if (false === $pos = strrpos($this->getName(), '\\')) { + return $this->getName(); + } + + return substr($this->getName(), $pos + 1); + } + + public function isFunction() + { + return true; + } + + public function isMethod() + { + return false; + } + + public function getInMethodCallSites() + { + return $this->inMethodCallSites; + } + + public function getInFunctionCallSites() + { + return $this->inFunctionCallSites; + } + + public function getOutMethodCallSites() + { + return $this->outMethodCallSites; + } + + public function getOutFunctionCallSites() + { + return $this->outFunctionCallSites; + } + + public function getParameters() + { + return $this->parameters; + } + + public function addParameter(Parameter $parameter) + { + $parameter->setFunction($this); + $this->parameters->set($parameter->getName(), $parameter); + } + + public function hasParameter($nameOrIndex) + { + if (is_int($nameOrIndex)) { + return $nameOrIndex < count($this->parameters); + } + + return $this->parameters->containsKey($nameOrIndex); + } + + public function getParameter($nameOrIndex) + { + if (is_int($nameOrIndex)) { + foreach ($this->parameters as $param) { + if ($nameOrIndex === $param->getIndex()) { + return $param; + } + } + + return null; + } + + return $this->parameters->get($nameOrIndex); + } + + public function getId() + { + return $this->id; + } + + public function getPackageVersion() + { + return $this->packageVersion; + } + + public function setImportedNamespaces(array $namespaces) + { + $this->importedNamespaces = $namespaces; + } + + public function getImportedNamespaces() + { + return $this->importedNamespaces; + } + + public function getNamespace() + { + $parts = explode("\\", $this->getName()); + if (1 === count($parts)) { + return ''; + } + + return implode("\\", array_slice($parts, 0, -1)); + } + + public function setPackageVersion(PackageVersion $packageVersion) + { + $this->packageVersion = $packageVersion; + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/Model/InterfaceC.php b/src/Scrutinizer/PhpAnalyzer/Model/InterfaceC.php new file mode 100644 index 0000000..2520adc --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/InterfaceC.php @@ -0,0 +1,238 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ProxyObjectType; + +/** + * @ORM\Entity(readOnly = true) + * + * @author Johannes + */ +class InterfaceC extends MethodContainer implements ConstantContainerInterface +{ + /** @ORM\OneToMany(targetEntity = "InterfaceMethod", mappedBy="interface", indexBy = "name", orphanRemoval = true, cascade = {"persist"}, fetch = "EAGER") */ + private $methods; + + /** @ORM\OneToMany(targetEntity = "InterfaceConstant", mappedBy = "interface", indexBy = "name", orphanRemoval = true, cascade = {"persist"}, fetch = "EAGER") */ + private $constants; + + /** @ORM\Column(type = "simple_array") */ + private $extendedInterfaces = array(); + + public function __construct($name) + { + parent::__construct($name); + $this->methods = new ArrayCollection(); + $this->constants = new ArrayCollection(); + } + + public function addMethod(Method $method, $declaringInterface = null) + { + $interfaceMethod = new InterfaceMethod($this, $method, $declaringInterface); + $this->methods->set(strtolower($method->getName()), $interfaceMethod); + } + + public function hasMethod($name) + { + return $this->methods->containsKey(strtolower($name)); + } + + public function getMethod($name) + { + return $this->methods->get(strtolower($name)); + } + + public function getMethodNames() + { + $names = array(); + foreach ($this->methods as $interfaceMethod) { + $names[] = $interfaceMethod->getMethod()->getName(); + } + + return $names; + } + + public function getImplementingClasses() + { + if (null === $this->registry) { + throw new \LogicException('The type registry is not set; getImplementingClasses() is not available.'); + } + + return $this->registry->getImplementingClasses($this->getName()); + } + + public function isTraversable() + { + if (!$this->isNormalized()) { + return true; + } + + return $this->isSubtypeOf($this->registry->getClass('Traversable')); + } + + public function getTraversableElementType() + { + if (!$this->hasExtendedInterface('Traversable') && $this->isNormalized()) { + return $this->registry->getNativeType('none'); + } + + // The actual type of the traversable is up to the actual implementation. + // There is no way for us to determine it for interfaces. + return $this->registry->getNativeType('unknown'); + } + + public function getMethods() + { + return $this->methods; + } + + public function isInterface() + { + return true; + } + + public function equals(PhpType $type) + { + if ($type->isInterface() && strtolower($type->toMaybeObjectType()->getName()) === strtolower($this->getName())) { + return true; + } + + if ($type instanceof ProxyObjectType && strtolower($type->getReferenceName()) === strtolower($this->getName())) { + return true; + } + + return false; + } + + public function isSubtypeOf(PhpType $that) + { + if (PhpType::isSubTypeOf($that)) { + return true; + } + + if ($that->isNoObjectType()) { + return true; + } + + if ($that->isCallableType() + && (!$this->isNormalized() || $this->hasMethod('__invoke'))) { + return true; + } + + if (false === $that->isObjectType()) { + return false; + } + + if (false === $this->isNormalized()) { + return true; + } + + if ($that->isInterface()) { + $name = strtolower($that->toMaybeObjectType()->getName()); + foreach ($this->extendedInterfaces as $iName) { + if ($name === strtolower($iName)) { + return true; + } + } + + return false; + } + + if ($that instanceof ProxyObjectType) { + $name = strtolower($that->getReferenceName()); + foreach ($this->extendedInterfaces as $iName) { + if ($name === strtolower($iName)) { + return true; + } + } + + return false; + } + + return false; + } + + public function getExtendedInterfaceTypes() + { + $types = array(); + foreach ($this->extendedInterfaces as $name) { + $types[] = $this->registry->getClass($name); + } + + return $types; + } + + public function addExtendedInterface($name) + { + $this->extendedInterfaces[] = $name; + } + + public function setExtendedInterfaces(array $names) + { + $this->extendedInterfaces = $names; + } + + public function hasExtendedInterface($name) + { + return in_array($name, $this->extendedInterfaces, true); + } + + public function getExtendedInterfaces() + { + return $this->extendedInterfaces; + } + + public function getConstants() + { + return $this->constants; + } + + public function hasConstant($name) + { + return $this->constants->containsKey($name); + } + + public function getConstant($name) + { + return $this->constants->get($name); + } + + public function addConstant(Constant $constant, $declaringClass = null) + { + $classConstant = new InterfaceConstant($this, $constant, $declaringClass); + $this->constants->set($constant->getName(), $classConstant); + } + + public function setPackageVersion(PackageVersion $packageVersion) + { + parent::setPackageVersion($packageVersion); + + foreach ($this->constants as $constant) { + if ($constant->isInherited()) { + continue; + } + + $constant->setPackageVersion($packageVersion); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/InterfaceConstant.php b/src/Scrutinizer/PhpAnalyzer/Model/InterfaceConstant.php new file mode 100644 index 0000000..f9040ce --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/InterfaceConstant.php @@ -0,0 +1,97 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "interface_constants", uniqueConstraints = { + * @ORM\UniqueConstraint(columns = {"interface_id", "name"}), + * @ORM\UniqueConstraint(columns = {"interface_id", "constant_id"}) + * }) + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes + */ +class InterfaceConstant implements ContainerConstantInterface +{ + /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue(strategy = "AUTO") */ + private $id; + + /** @ORM\ManyToOne(targetEntity = "InterfaceC", inversedBy = "constants") */ + private $interface; + + /** @ORM\ManyToOne(targetEntity = "Constant", cascade = {"persist"}) */ + private $constant; + + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "string", nullable = true) */ + private $declaringInterface; + + public function __construct(InterfaceC $interface, Constant $constant, $declaringInterface = null) + { + $this->interface = $interface; + $this->constant = $constant; + $this->name = $constant->getName(); + + if ($interface->getName() === $declaringInterface) { + $declaringInterface = null; + } + + $this->declaringInterface = $declaringInterface; + } + + public function getInterface() + { + return $this->interface; + } + + public function getConstant() + { + return $this->constant; + } + + public function getName() + { + return $this->name; + } + + public function getDeclaringClass() + { + return $this->getDeclaringInterface(); + } + + public function getDeclaringInterface() + { + return $this->declaringInterface ?: $this->interface->getName(); + } + + public function isInherited() + { + return null !== $this->declaringInterface; + } + + public function __call($method, $args) + { + return call_user_func_array(array($this->constant, $method), $args); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/InterfaceMethod.php b/src/Scrutinizer/PhpAnalyzer/Model/InterfaceMethod.php new file mode 100644 index 0000000..ddf2eaa --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/InterfaceMethod.php @@ -0,0 +1,105 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "interface_methods", uniqueConstraints = { + * @ORM\UniqueConstraint(columns = {"interface_id", "name"}), + * @ORM\UniqueConstraint(columns = {"interface_id", "method_id"}) + * }) + * + * @author Johannes M. Schmitt + */ +class InterfaceMethod implements ContainerMethodInterface +{ + /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue(strategy = "AUTO") */ + private $id; + + /** @ORM\ManyToOne(targetEntity = "InterfaceC", inversedBy = "methods") */ + private $interface; + + /** @ORM\ManyToOne(targetEntity = "Method", cascade = {"persist"}) */ + private $method; + + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "string", nullable = true) */ + private $declaringInterface; + + public function __construct(InterfaceC $interface, Method $method, $declaringInterface = null) + { + $this->interface = $interface; + $this->method = $method; + $this->name = strtolower($method->getName()); + + if ($interface->getName() === $declaringInterface) { + $declaringInterface = null; + } + $this->declaringInterface = $declaringInterface; + } + + public function getInterface() + { + return $this->interface; + } + + public function getContainer() + { + return $this->interface; + } + + public function getMethod() + { + return $this->method; + } + + public function getName() + { + return $this->name; + } + + public function getQualifiedName() + { + return $this->getDeclaringInterface().'::'.$this->method->getName(); + } + + public function getDeclaringClass() + { + return $this->getDeclaringInterface(); + } + + public function getDeclaringInterface() + { + return $this->declaringInterface ?: $this->interface->getName(); + } + + public function isInherited() + { + return null !== $this->declaringInterface; + } + + public function __call($name, $args) + { + return call_user_func_array(array($this->method, $name), $args); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Method.php b/src/Scrutinizer/PhpAnalyzer/Model/Method.php new file mode 100644 index 0000000..09d1264 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Method.php @@ -0,0 +1,259 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "methods") + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes M. Schmitt + */ +class Method extends AbstractFunction +{ + const MODIFIER_STATIC = 1; + const MODIFIER_FINAL = 2; + const MODIFIER_ABSTRACT = 4; + + const VISIBILITY_PUBLIC = 1; + const VISIBILITY_PROTECTED = 2; + const VISIBILITY_PRIVATE = 3; + + /** @ORM\Column(type = "integer") @ORM\Id @ORM\GeneratedValue(strategy = "AUTO") */ + private $id; + + /** @ORM\ManyToOne(targetEntity = "PackageVersion") */ + private $packageVersion; + + /** @ORM\Column(type = "smallint") */ + private $modifier = 0; + + /** @ORM\Column(type = "smallint") */ + private $visibility = self::VISIBILITY_PUBLIC; + + /** @ORM\OneToMany(targetEntity = "MethodParameter", indexBy = "name", cascade = {"persist", "remove"}, mappedBy = "method", fetch = "EAGER") */ + private $parameters; + + /** @ORM\OneToMany(targetEntity = "Scrutinizer\PhpAnalyzer\Model\CallGraph\MethodToMethodCallSite", mappedBy = "targetMethod", cascade = {"persist", "remove"}) */ + private $inMethodCallSites; + + /** @ORM\OneToMany(targetEntity = "Scrutinizer\PhpAnalyzer\Model\CallGraph\FunctionToMethodCallSite", mappedBy = "targetMethod", cascade = {"persist", "remove"}) */ + private $inFunctionCallSites; + + /** @ORM\OneToMany(targetEntity = "Scrutinizer\PhpAnalyzer\Model\CallGraph\MethodToMethodCallSite", mappedBy = "sourceMethod", cascade = {"persist", "remove"}, orphanRemoval = true) */ + private $outMethodCallSites; + + /** @ORM\OneToMany(targetEntity = "Scrutinizer\PhpAnalyzer\Model\CallGraph\MethodToFunctionCallSite", mappedBy = "sourceMethod", cascade = {"persist", "remove"}, orphanRemoval = true) */ + private $outFunctionCallSites; + + /** @ORM\Column(type = "json_array", nullable = true) */ + private $docTypes = array(); + + public function __construct($name) + { + parent::__construct($name); + + $this->parameters = new ArrayCollection(); + $this->inMethodCallSites = new ArrayCollection(); + $this->inFunctionCallSites = new ArrayCollection(); + $this->outMethodCallSites = new ArrayCollection(); + $this->outFunctionCallSites = new ArrayCollection(); + } + + public function isFunction() + { + return false; + } + + public function isMethod() + { + return true; + } + + public function getInMethodCallSites() + { + return $this->inMethodCallSites; + } + + public function getInFunctionCallSites() + { + return $this->inFunctionCallSites; + } + + public function getOutMethodCallSites() + { + return $this->outMethodCallSites; + } + + public function getOutFunctionCallSites() + { + return $this->outFunctionCallSites; + } + + public function getParameters() + { + return $this->parameters; + } + + public function getModifier() + { + return $this->modifier; + } + + public function getVisibility() + { + return $this->visibility; + } + + public function getDocTypes() + { + return $this->docTypes; + } + + public function getParamDocType($paramIndex) + { + if (!isset($this->docTypes['param_'.$paramIndex])) { + return null; + } + + return $this->docTypes['param_'.$paramIndex]; + } + + public function getReturnDocType() + { + return isset($this->docTypes['return']) ? $this->docTypes['return'] : null; + } + + /** + * Sets a param type. + * + * @param integer $index + * @param string $type The resolved type dumped out as doc comment again. + */ + public function setParamDocType($index, $type) + { + $this->docTypes['param_'.$index] = $type; + } + + /** + * Sets the return doc type. + * + * @param string $type + */ + public function setReturnDocType($type) + { + $this->docTypes['return'] = $type; + } + + public function addParameter(Parameter $parameter) + { + $parameter->setMethod($this); + $this->parameters->set($parameter->getName(), $parameter); + } + + public function hasParameter($nameOrIndex) + { + if (is_int($nameOrIndex)) { + return $nameOrIndex < count($this->parameters); + } + + return $this->parameters->containsKey($nameOrIndex); + } + + public function getParameter($nameOrIndex) + { + if (is_int($nameOrIndex)) { + foreach ($this->parameters as $param) { + if ($nameOrIndex === $param->getIndex()) { + return $param; + } + } + + return null; + } + + return $this->parameters->get($nameOrIndex); + } + + public function getId() + { + return $this->id; + } + + public function isStatic() + { + return self::MODIFIER_STATIC === ($this->modifier & self::MODIFIER_STATIC); + } + + public function isFinal() + { + return self::MODIFIER_FINAL === ($this->modifier & self::MODIFIER_FINAL); + } + + public function isAbstract() + { + return self::MODIFIER_ABSTRACT === ($this->modifier & self::MODIFIER_ABSTRACT); + } + + public function isPublic() + { + return self::VISIBILITY_PUBLIC === $this->visibility; + } + + public function isConstructor() + { + return '__construct' === strtolower($this->getName()); + } + + public function isProtected() + { + return self::VISIBILITY_PROTECTED === $this->visibility; + } + + public function isPrivate() + { + return self::VISIBILITY_PRIVATE === $this->visibility; + } + + public function setVisibility($visibility) + { + $this->visibility = (integer) $visibility; + } + + public function setModifier($modifier) + { + $this->modifier = (integer) $modifier; + } + + public function __toString() + { + return 'Method('.$this->getName().')'; + } + + public function setPackageVersion(PackageVersion $packageVersion) + { + if (null !== $this->packageVersion && $this->packageVersion !== $packageVersion) { + throw new \InvalidArgumentException('The packageVersion cannot be changed for '.$this.' from '.$this->packageVersion.' to '.$packageVersion.'.'); + } + $this->packageVersion = $packageVersion; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/MethodContainer.php b/src/Scrutinizer/PhpAnalyzer/Model/MethodContainer.php new file mode 100644 index 0000000..7fe7d6e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/MethodContainer.php @@ -0,0 +1,221 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ObjectType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TernaryValue; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\InheritanceType("SINGLE_TABLE") + * @ORM\DiscriminatorColumn(name = "type", type = "string") + * @ORM\DiscriminatorMap({"trait" = "Scrutinizer\PhpAnalyzer\Model\TraitC", "class" = "Scrutinizer\PhpAnalyzer\Model\Clazz", "interface" = "Scrutinizer\PhpAnalyzer\Model\InterfaceC"}) + * @ORM\Table(name = "method_containers", uniqueConstraints = { + * @ORM\UniqueConstraint(columns = {"packageVersion_id", "name"}), + * }) + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes M. Schmitt + */ +abstract class MethodContainer extends ObjectType +{ + /** @ORM\Column(type = "integer") @ORM\Id @ORM\GeneratedValue(strategy = "AUTO") */ + private $id; + + /** @ORM\ManyToOne(targetEntity = "PackageVersion", inversedBy="containers") */ + private $packageVersion; + + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "boolean") */ + private $normalized = false; + + // NON-PERSISTENT FIELDS + private $importedNamespaces = array(); + private $astNode; + + public function __construct($name) + { + $this->name = $name; + } + + public function getDocType(array $importedNamespaces = array()) + { + return self::getShortestClassNameReference($this->name, $importedNamespaces); + } + + public function getPackageVersion() + { + return $this->packageVersion; + } + + public function getName() + { + return $this->name; + } + + public function getDisplayName() + { + return sprintf('object<%s>', $this->name); + } + + public function isNormalized() + { + return $this->normalized; + } + + public function getAstNode() + { + return $this->astNode; + } + + public function setAstNode(\PHPParser_Node $node) + { + $this->astNode = $node; + } + + public function getNamespace() + { + $parts = explode("\\", $this->name); + if (1 === count($parts)) { + return ''; + } + + return implode("\\", array_slice($parts, 0, -1)); + } + + public function getShortName() + { + $parts = explode("\\", $this->name); + + return end($parts); + } + + public function testForEquality(PhpType $that) + { + if (null !== $rs = parent::testForEquality($that)) { + return $rs; + } + + if ($that->isNoObjectType()) { + return TernaryValue::get('unknown'); + } + + if (null === $objType = $that->toMaybeObjectType()) { + return TernaryValue::get('false'); + } + + if (strtolower($objType->name) !== strtolower($this->name)) { + return TernaryValue::get('false'); + } + + return TernaryValue::get('unknown'); + } + + public function setImportedNamespaces(array $namespaces) + { + $this->importedNamespaces = $namespaces; + } + + public function getImportedNamespaces() + { + return $this->importedNamespaces; + } + + public function canBeCalled() + { + return $this->hasMethod('__invoke'); + } + + public function toMaybeObjectType() + { + return $this; + } + + public function setPackageVersion(PackageVersion $packageVersion) + { + if (null !== $this->packageVersion && $this->packageVersion !== $packageVersion) { + throw new \InvalidArgumentException('The packageVersion of a class cannot be changed.'); + } + + foreach ($this->getMethods() as $method) { + if ($method->isInherited()) { + continue; + } + + $method->setPackageVersion($packageVersion); + } + + $this->packageVersion = $packageVersion; + } + + public function setTypeRegistry(TypeRegistry $registry) + { + $this->registry = $registry; + } + + public function getTypeRegistry() + { + return $this->registry; + } + + /** + * @param boolean $bool + */ + public function setNormalized($bool) + { + $this->normalized = (boolean) $bool; + } + + /** + * @return array + */ + abstract public function getMethods(); + + /** + * @return array + */ + abstract public function getMethodNames(); + + /** + * @param string $name + * + * @return boolean + */ + abstract public function hasMethod($name); + + /** + * @param string $name + * + * @return ContainerMethodInterface + */ + abstract public function getMethod($name); + + /** + * @param Method $method + * @param string|null $declaringClass + * + * @return void + */ + abstract public function addMethod(Method $method, $declaringClass = null); +} diff --git a/src/Scrutinizer/PhpAnalyzer/Model/MethodParameter.php b/src/Scrutinizer/PhpAnalyzer/Model/MethodParameter.php new file mode 100644 index 0000000..ea83cea --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/MethodParameter.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "method_parameters") + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes M. Schmitt + */ +class MethodParameter extends Parameter +{ + /** @ORM\Id @ORM\GeneratedValue(strategy = "AUTO") @ORM\Column(type = "integer") */ + private $id; + + /** @ORM\ManyToOne(targetEntity="Method", inversedBy = "parameters") */ + private $method; + + public function getId() + { + return $this->id; + } + + public function setMethod(Method $method) + { + $this->method = $method; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Package.php b/src/Scrutinizer/PhpAnalyzer/Model/Package.php new file mode 100644 index 0000000..57ef124 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Package.php @@ -0,0 +1,138 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(repositoryClass = "Scrutinizer\PhpAnalyzer\Model\Repository\PackageRepository") + * @ORM\Table(name = "packages") + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes M. Schmitt + */ +class Package +{ + /** @ORM\Id @ORM\Column(type = "integer") @ORM\GeneratedValue(strategy = "AUTO") */ + private $id; + + /** @ORM\Column(type = "string", unique = true) */ + private $name; + + /** @ORM\OneToMany(targetEntity = "PackageVersion", mappedBy = "package", cascade = {"persist", "remove"}) */ + private $versions; + + public function __construct($name) + { + $this->name = $name; + $this->versions = new ArrayCollection(); + } + + public function getId() + { + return $this->id; + } + + public function getName() + { + return $this->name; + } + + /** + * Creates a new package version. + * + * @param string $version + * @param string|null $sourceReference + * @param string|null $dependencyHash + * + * @return PackageVersion + */ + public function createVersion($version, $sourceReference = null, $dependencyHash = null) + { + if (empty($version)) { + throw new \InvalidArgumentException(sprintf('The version cannot be empty (%s).', $this)); + } + + if ($this->hasVersion($version, $sourceReference, $dependencyHash)) { + throw new \InvalidArgumentException(sprintf('The version "%s" already exists.', $version)); + } + + $this->versions->add($packageVersion = new PackageVersion($this, $version, $sourceReference, $dependencyHash)); + + return $packageVersion; + } + + public function hasVersion($version, $sourceReference = null, $dependencyHash = null) + { + return null !== $this->getVersionOrNull($version, $sourceReference, $dependencyHash); + } + + /** + * @internal Use PackageRepository::deletePackageVersion($packageVersion) instead + */ + public function removeVersion(PackageVersion $version) + { + $this->versions->removeElement($version); + } + + /** + * Returns the PackageVersion, or default if not found. + * + * @param string $version + * @param mixed $default + * + * @return null|PackageVersion + */ + public function getVersionOrNull($version, $sourceReference = null, $dependencyHash = null) + { + foreach ($this->versions as $packageVersion) { + if ($version !== $packageVersion->getVersion()) { + continue; + } + + if (null !== $sourceReference && $sourceReference !== $packageVersion->getSourceReference()) { + continue; + } + + if (null !== $dependencyHash && null !== $packageVersion->getDependencyHash() + && $dependencyHash !== $packageVersion->getDependencyHash()) { + continue; + } + + return $packageVersion; + } + + return null; + } + + public function getVersion($version, $sourceReference = null) + { + if (null === $packageVersion = $this->getVersionOrNull($version, $sourceReference)) { + throw new \InvalidArgumentException(sprintf('The version "%s" does not exist.', $version)); + } + + return $packageVersion; + } + + public function __toString() + { + return 'Package('.$this->name.')'; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/PackageScanner.php b/src/Scrutinizer/PhpAnalyzer/Model/PackageScanner.php new file mode 100644 index 0000000..92c2648 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/PackageScanner.php @@ -0,0 +1,94 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; +use Scrutinizer\PhpAnalyzer\Analyzer; + +/** + * PHP Package Scanner. + * + * Scans packages for classes, functions, constants, etc. + * + * @author Johannes M. Schmitt + */ +class PackageScanner +{ + private $analyzer; + private $logger; + private $scanned = false; + + public function __construct(Analyzer $analyzer, LoggerInterface $logger = null) + { + $this->analyzer = $analyzer; + $this->logger = $logger ?: new NullLogger(); + } + + public function setLogger(LoggerInterface $logger) + { + $this->logger = $logger; + $this->analyzer->setLogger($logger); + } + + public function scanZipFile(PackageVersion $rootPackageVersion, $zipFile) + { + $this->logger->info(sprintf('Scanning zip file "%s" for files', $zipFile)); + $files = FileCollection::createFromZipFile($zipFile, '*.php'); + $this->logger->info(sprintf('Found "%d" files.', count($files))); + + $this->scan($rootPackageVersion, $files); + } + + public function scanDirectory(PackageVersion $rootPackageVersion, $directory) + { + $this->logger->info(sprintf('Scanning directory "%s" for files', $directory)); + $files = FileCollection::createFromDirectory($directory, '*.php'); + $this->logger->info(sprintf('Found "%d" files.', count($files))); + + $this->scan($rootPackageVersion, $files); + } + + public function scan(PackageVersion $rootPackageVersion, FileCollection $col) + { + // This is due to the fact that we extract the scanned classes from the + // type registry, and you basically need a new analyzer with a new set + // of its dependencies as well. It is simply easier to create a new one + // than to add logic which resets the internal state of all of these + // classes. + if ($this->scanned) { + throw new \LogicException('scan() is a one-time operation. Please create a new PackageScanner instance.'); + } + $this->scanned = true; + + $this->analyzer->setRootPackageVersion($rootPackageVersion); + $this->analyzer->analyze($col); + + $registry = $this->analyzer->getTypeRegistry(); + foreach ($registry->getClasses() as $class) { + $rootPackageVersion->addContainer($class); + } + foreach ($registry->getFunctions() as $function) { + $rootPackageVersion->addFunction($function); + } + foreach ($registry->getConstants() as $constant) { + $rootPackageVersion->addConstant($constant); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/PackageVersion.php b/src/Scrutinizer/PhpAnalyzer/Model/PackageVersion.php new file mode 100644 index 0000000..be4dfd4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/PackageVersion.php @@ -0,0 +1,400 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; + +/** + * Package Version. + * + * @ORM\Entity + * @ORM\Table(name = "package_versions", uniqueConstraints = { + * @ORM\UniqueConstraint(columns = {"package_id", "version", "sourceReference", "dependencyHash"}), + * }) + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + * @author Johannes M. Schmitt + */ +class PackageVersion +{ + const TEMP_SUFFIX = '__being_built'; + const TEMP_SUFFIX_LENGTH = 13; + + /** @ORM\Id @ORM\GeneratedValue(strategy = "AUTO") @ORM\Column(type = "integer") */ + private $id; + + /** @ORM\Column(type = "string", length = 36, unique = true) */ + private $uuid; + + /** @ORM\ManyToOne(targetEntity = "Package", inversedBy = "versions") */ + private $package; + + /** @ORM\Column(type = "string") */ + private $version; + + /** + * A reference for the specific source version that was used to built + * this package version. + * + * @ORM\Column(type = "string", nullable = true) + */ + private $sourceReference; + + /** + * This hash uniquely identifies which sub-set of this package version's + * dependencies were used for building the package. If all dependencies + * were available this hash is set to null. + * + * This hash is necessary to determine whether a package can be used as + * a depencency in another package. For example, considering that a + * package A exists which has a dependency on package B. Package B has + * also dependencies on package C for certain features. However, A does + * not use these features, and therefore itself has no dependency on + * package C. If we build package B in this scenario, some classes + * might not be normalized because the classes of C are missing. If we + * now have a package D which also depends on B, _and_ which uses B's + * special features for C, then we need to re-build B with a version of + * C included. So, we end up with two different versions of B which + * might have the same source reference, but a different dependency hash. + * + * @ORM\Column(type = "string", length = 40, nullable = true) + */ + private $dependencyHash; + + /** @ORM\Column(type = "datetime") */ + private $createdAt; + + /** @ORM\Column(type = "datetime", nullable = true) */ + private $lastBuiltAt; + + /** + * A list of packages including their versions, which this package depends on. + * + * When analyzing this package version, classes from these packages are also + * considered. + * + * @ORM\ManyToMany(targetEntity = "PackageVersion", cascade = {"refresh"}) + * @ORM\JoinTable(name="package_version_dependencies", + * joinColumns = { @ORM\JoinColumn(name = "source_package_id", referencedColumnName = "id") }, + * inverseJoinColumns = { @ORM\JoinColumn(name = "dest_package_id", referencedColumnName = "id")} + * ) + */ + private $dependencies; + + /** @ORM\OneToMany(targetEntity = "MethodContainer", mappedBy = "packageVersion", indexBy = "name", orphanRemoval = true, cascade = {"persist"}) */ + private $containers; + + /** @ORM\OneToMany(targetEntity = "GlobalFunction", mappedBy = "packageVersion", indexBy = "name", orphanRemoval = true, cascade = {"persist"}) */ + private $functions; + + /** @ORM\OneToMany(targetEntity = "GlobalConstant", mappedBy = "packageVersion", indexBy = "name", orphanRemoval = true, cascade = {"persist"}) */ + private $constants; + + /** @ORM\Column(type = "json_array") */ + private $attributes = array(); + + public function __construct(Package $package, $version, $sourceReference, $dependencyHash) + { + $this->package = $package; + $this->version = $version; + $this->sourceReference = $sourceReference; + $this->dependencyHash = $dependencyHash; + $this->createdAt = new \DateTime(); + $this->containers = new ArrayCollection(); + $this->functions = new ArrayCollection(); + $this->constants = new ArrayCollection(); + $this->dependencies = new ArrayCollection(); + } + + public function setUuid($uuid) + { + if (null !== $this->uuid) { + throw new \LogicException('A uuid can only be set once.'); + } + + $this->uuid = $uuid; + } + + public function getUuid() + { + return $this->uuid; + } + + public function getAttributes() + { + return $this->attributes; + } + + public function setAttributes(array $attrs) + { + $this->attributes = $attrs; + } + + public function getAttribute($key) + { + if ( ! isset($this->attributes[$key])) { + throw new \InvalidArgumentException(sprintf('The attribute "%s" does not exist.', $key)); + } + + return $this->attributes[$key]; + } + + public function hasAttribute($key) + { + return isset($this->attributes[$key]); + } + + public function setAttribute($key, $value) + { + $this->attributes[$key] = $value; + } + + public function removeAttribute($key) + { + unset($this->attributes[$key]); + } + + /** + * Returns whether this is a virtual package. + * + * A virtual package is just used to describe dependencies, but does not + * contain any classes, method, etc. itself. + * + * @return boolean + */ + public function isVirtual() + { + if ($this->hasAttribute('dir')) { + return false; + } + + if ($this->hasAttribute('url')) { + return false; + } + + return true; + } + + public function __toString() + { + return 'PackageVersion("'.$this->package->getName().'", '.$this->version.', ref = '.($this->sourceReference ?: 'null').')'; + } + + public function getName() + { + return $this->package->getName(); + } + + public function getDisplayName() + { + $name = $this->package->getName(); + + return preg_replace('/^[a-z_]+__/', '', $name); + } + + /** + * Returns all direct dependencies. + * + * @return \Doctrine\Common\Collections\ArrayCollection + */ + public function getDependencies() + { + return $this->dependencies; + } + + /** + * Returns whether this package version's dependencies are built. + * + * @return bool + */ + public function hasBuiltDependencies() + { + foreach ($this->dependencies as $dep) { + /** @var $dep PackageVersion */ + + if ( ! $dep->isBuilt()) { + return false; + } + } + + return true; + } + + /** + * Returns all direct dependencies, and the dependencies of their dependencies etc. + * + * @return PackageVersion[] + */ + public function getAllDependencies(array $deps = array()) + { + $deps[] = $this; + + foreach ($this->dependencies as $dep) { + /** @var $dep PackageVersion */ + + if (in_array($dep, $deps, true)) { + continue; + } + $deps = $dep->getAllDependencies($deps); + } + + return $deps; + } + + public function dependsOn(PackageVersion $otherPackage) + { + foreach ($this->dependencies as $dep) { + if ($dep->getVersion() === $otherPackage->getVersion() + && $dep->getPackage()->getName() === $otherPackage->getPackage()->getName()) { + return true; + } + } + + return false; + } + + public function isFresh($sourceReference) + { + if ( ! $this->isBuilt()) { + return false; + } + + if (null === $sourceReference) { + return true; + } + + return $this->sourceReference === $sourceReference; + } + + public function getId() + { + return $this->id; + } + + public function getContainers() + { + return $this->containers; + } + + public function getFunctions() + { + return $this->functions; + } + + public function getConstants() + { + return $this->constants; + } + + public function addDependency(PackageVersion $version) + { + if ($this->dependencies->contains($version)) { + return; + } + + if ($version->isVirtual()) { + throw new \LogicException('Package '.$this.' cannot depend on '.$version.'. As it is a virtual package. Virtual package must always be root packages.'); + } + + $this->dependencies->add($version); + } + + public function addContainer(MethodContainer $container) + { + $container->setPackageVersion($this); + $this->containers->set($container->getName(), $container); + } + + public function addFunction(GlobalFunction $function) + { + $function->setPackageVersion($this); + $this->functions->set($function->getName(), $function); + } + + public function addConstant(GlobalConstant $constant) + { + $constant->setPackageVersion($this); + $this->constants->set($constant->getName(), $constant); + } + + /** + * This method must be called after persisting relations through the + * customized persisters, but before persisting the package version + * through Doctrine. + * + * @internal + */ + public function resetCollectionsForPersist() + { + $this->containers = new ArrayCollection(); + $this->functions = new ArrayCollection(); + $this->constants = new ArrayCollection(); + } + + public function setLastBuiltAt(\DateTime $date) + { + $this->lastBuiltAt = $date; + } + + public function getDependencyHash() + { + return $this->dependencyHash; + } + + /** + * @return Package + */ + public function getPackage() + { + return $this->package; + } + + public function getVersion() + { + return $this->version; + } + + public function getSourceReference() + { + return $this->sourceReference; + } + + /** + * @return \DateTime + */ + public function getLastBuiltAt() + { + return $this->lastBuiltAt; + } + + /** + * Returns whether this package version is built. + * + * This also takes into account dependencies of this package (albeit + * implicitly) because builds are only started if all of their deps + * have been built already. + * + * @return boolean + */ + public function isBuilt() + { + return null !== $this->lastBuiltAt; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Parameter.php b/src/Scrutinizer/PhpAnalyzer/Model/Parameter.php new file mode 100644 index 0000000..443fe87 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Parameter.php @@ -0,0 +1,112 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +/** + * @ORM\MappedSuperclass + * + * @author Johannes M. Schmitt + */ +abstract class Parameter +{ + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "PhpType") */ + private $phpType; + + /** @ORM\Column(type = "smallint", name ="index_nb") */ + private $index; + + /** @ORM\Column(type = "boolean") */ + private $passedByRef = false; + + /** @ORM\Column(type = "boolean") */ + private $optional = false; + + private $astNode; + + public function __construct($name, $index) + { + $this->name = $name; + $this->index = $index; + } + + public function getIndex() + { + return $this->index; + } + + public function getName() + { + return $this->name; + } + + /** + * @return integer + */ + abstract public function getId(); + + public function getPhpType() + { + return $this->phpType; + } + + public function getAstNode() + { + return $this->astNode; + } + + public function isOptional() + { + return $this->optional; + } + + public function isPassedByRef() + { + return $this->passedByRef; + } + + public function setPassedByRef($bool) + { + $this->passedByRef = (boolean) $bool; + } + + public function setAstNode(\PHPParser_Node $node) + { + $this->astNode = $node; + } + + public function setPhpType(PhpType $type) + { + $this->phpType = $type; + + if ($this->astNode) { + $this->astNode->setAttribute('type', $type); + } + } + + public function setOptional($bool) + { + $this->optional = (boolean) $bool; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Persister/ArgumentPersister.php b/src/Scrutinizer/PhpAnalyzer/Model/Persister/ArgumentPersister.php new file mode 100644 index 0000000..2433b0b --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Persister/ArgumentPersister.php @@ -0,0 +1,50 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Persister; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Types\Type; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\Argument; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; + +class ArgumentPersister +{ + const INSERT_SQL = 'INSERT INTO `callsite_arguments`(`index_nb`, `phpType`, `callSite_id`) VALUES (?, ?, ?)'; + + private $con; + private $platform; + private $phpType; + private $insertStmt; + + public function __construct(Connection $con) + { + $this->con = $con; + $this->platform = $con->getDatabasePlatform(); + $this->phpType = Type::getType(PhpTypeType::NAME); + $this->insertStmt = $con->prepare(self::INSERT_SQL); + } + + public function persist(Argument $arg, $callSiteId) + { + $this->insertStmt->bindValue(1, $arg->getIndex(), \PDO::PARAM_INT); + $this->insertStmt->bindValue(2, $this->phpType->convertToDatabaseValue($arg->getPhpType(), $this->platform)); + $this->insertStmt->bindValue(3, $callSiteId, \PDO::PARAM_INT); + $this->insertStmt->execute(); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Persister/CallSitePersister.php b/src/Scrutinizer/PhpAnalyzer/Model/Persister/CallSitePersister.php new file mode 100644 index 0000000..55f746d --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Persister/CallSitePersister.php @@ -0,0 +1,121 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Persister; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Types\Type; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\CallSite; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\FunctionToFunctionCallSite; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\FunctionToMethodCallSite; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\MethodToFunctionCallSite; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\MethodToMethodCallSite; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; + +class CallSitePersister +{ + const INSERT_SQL = 'INSERT INTO `call_sites`(`type`, `sourceFunction_id`, `targetFunction_id`, `targetMethod_id`, + `sourceMethod_id`) VALUES (?, ?, ?, ?, ?)'; + + private $con; + private $platform; + private $phpType; + private $insertStmt; + private $argPersister; + private $idRef; + + public function __construct(Connection $con, ArgumentPersister $argPersister) + { + $this->con = $con; + $this->platform = $con->getDatabasePlatform(); + $this->phpType = Type::getType(PhpTypeType::NAME); + $this->insertStmt = $con->prepare(self::INSERT_SQL); + $this->argPersister = $argPersister; + $this->idRef = new \ReflectionProperty('Scrutinizer\PhpAnalyzer\Model\CallGraph\CallSite', 'id'); + $this->idRef->setAccessible(true); + } + + public function persist(CallSite $callSite) + { + // In this case, the call site has already been persisted. + if (null !== $callSite->getId()) { + return; + } + + $sourceFunctionId = $targetFunctionId = $sourceMethodId = $targetMethodId = null; + switch (true) { + case $callSite instanceof FunctionToFunctionCallSite: + $type = 'f2f'; + $sourceFunctionId = $sourceId = $callSite->getSource()->getId(); + $targetFunctionId = $targetId = $callSite->getTarget()->getId(); + break; + + case $callSite instanceof FunctionToMethodCallSite: + $type = 'f2m'; + $sourceFunctionId = $sourceId = $callSite->getSource()->getId(); + $targetMethodId = $targetId = $callSite->getTarget()->getId(); + break; + + case $callSite instanceof MethodToFunctionCallSite: + $type = 'm2f'; + $sourceMethodId = $sourceId = $callSite->getSource()->getId(); + $targetFunctionId= $targetId = $callSite->getTarget()->getId(); + break; + + case $callSite instanceof MethodToMethodCallSite: + $type = 'm2m'; + $sourceMethodId = $sourceId = $callSite->getSource()->getId(); + $targetMethodId = $targetId = $callSite->getTarget()->getId(); + break; + + default: + throw new \InvalidArgumentException('Unknown call site '.get_class($callSite)); + } + + // If either target, or source have not yet been persisted, we + // simply ignore this call as there will be a second call when + // both are complete. + if (null === $sourceId || null === $targetId) { + return; + } + + $this->insertStmt->bindValue(1, $type); + $this->insertStmt->bindValue(2, $sourceFunctionId, $sourceFunctionId ? \PDO::PARAM_INT : \PDO::PARAM_NULL); + $this->insertStmt->bindValue(3, $targetFunctionId, $targetFunctionId ? \PDO::PARAM_INT : \PDO::PARAM_NULL); + $this->insertStmt->bindValue(4, $targetMethodId, $targetMethodId ? \PDO::PARAM_INT : \PDO::PARAM_NULL); + $this->insertStmt->bindValue(5, $sourceMethodId, $sourceMethodId ? \PDO::PARAM_INT : \PDO::PARAM_NULL); + $this->insertStmt->execute(); + + $callSiteId = $this->con->lastInsertId(); + $this->idRef->setValue($callSite, $callSiteId); + + if ("0" == $callSiteId) { + throw new \LogicException(sprintf('Could not retrieve id of call-site: '.json_encode(array( + 'type' => $type, + 'source_function_id' => $sourceFunctionId, + 'target_function_id' => $targetFunctionId, + 'target_method_id' => $targetMethodId, + 'source_method_id' => $sourceMethodId, + )))); + } + + foreach ($callSite->getArgs() as $arg) { + $this->argPersister->persist($arg, $callSiteId); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Persister/ConstantPersister.php b/src/Scrutinizer/PhpAnalyzer/Model/Persister/ConstantPersister.php new file mode 100644 index 0000000..58a0076 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Persister/ConstantPersister.php @@ -0,0 +1,101 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Persister; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Types\Type; +use Scrutinizer\PhpAnalyzer\Model\ClassConstant; +use Scrutinizer\PhpAnalyzer\Model\Constant; +use Scrutinizer\PhpAnalyzer\Model\ContainerConstantInterface; +use Scrutinizer\PhpAnalyzer\Model\InterfaceConstant; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; + +class ConstantPersister +{ + const INSERT_CONSTANT_SQL = 'INSERT INTO `constants`(`name`, `phpType`, `packageVersion_id`) VALUES (?, ?, ?)'; + const INSERT_CLASS_CONSTANT_SQL = 'INSERT INTO `class_constants`(`class_id`, `constant_id`, `name`, `declaringClass`) + VALUES (?, ?, ?, ?)'; + const INSERT_INTERFACE_CONSTANT_SQL = 'INSERT INTO `interface_constants`(`interface_id`, `constant_id`, `name`, `declaringInterface`) VALUES (?, ?, ?, ?)'; + + private $con; + private $platform; + private $phpType; + + private $constantIdRef; + + private $constantStmt; + private $cConstantStmt; + private $iConstantStmt; + + public function __construct(Connection $con) + { + $this->con = $con; + $this->platform = $con->getDatabasePlatform(); + $this->phpType = Type::getType(PhpTypeType::NAME); + + $this->constantIdRef = new \ReflectionProperty('Scrutinizer\PhpAnalyzer\Model\Constant', 'id'); + $this->constantIdRef->setAccessible(true); + + $this->constantStmt = $con->prepare(self::INSERT_CONSTANT_SQL); + $this->cConstantStmt = $con->prepare(self::INSERT_CLASS_CONSTANT_SQL); + $this->iConstantStmt = $con->prepare(self::INSERT_INTERFACE_CONSTANT_SQL); + } + + public function persist(ContainerConstantInterface $containerConstant, $packageVersionId, $containerId) + { + switch (true) { + case $containerConstant instanceof ClassConstant: + $stmt = $this->cConstantStmt; + break; + + case $containerConstant instanceof InterfaceConstant: + $stmt = $this->iConstantStmt; + break; + + default: + throw new \InvalidArgumentException(sprintf('Unsupported container constant '.get_class($containerConstant))); + } + + $constant = $containerConstant->getConstant(); + if (null === $constantId = $constant->getId()) { + $constantId = $this->insertConstant($constant, $packageVersionId); + } + + $stmt->bindValue(1, $containerId, \PDO::PARAM_INT); + $stmt->bindValue(2, $constantId, \PDO::PARAM_INT); + $stmt->bindValue(3, $containerConstant->getName()); + $stmt->bindValue(4, $containerConstant->isInherited() ? $containerConstant->getDeclaringClass() : null, + $containerConstant->isInherited() ? \PDO::PARAM_STR : \PDO::PARAM_NULL); + $stmt->execute(); + } + + // `name`, `phpType`, `packageVersion_id` + private function insertConstant(Constant $constant, $packageVersionId) + { + $this->constantStmt->bindValue(1, $constant->getName()); + $this->constantStmt->bindValue(2, $this->phpType->convertToDatabaseValue($constant->getPhpType(), $this->platform)); + $this->constantStmt->bindValue(3, $packageVersionId); + + $this->constantStmt->execute(); + $constantId = $this->con->lastInsertId(); + $this->constantIdRef->setValue($constant, $constantId); + + return $constantId; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Persister/FunctionPersister.php b/src/Scrutinizer/PhpAnalyzer/Model/Persister/FunctionPersister.php new file mode 100644 index 0000000..244eb32 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Persister/FunctionPersister.php @@ -0,0 +1,74 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Persister; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Types\Type; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; + +class FunctionPersister +{ + const INSERT_SQL = 'INSERT INTO `global_functions`(`returnType`, `name`, `returnByRef`, `packageVersion_id`, + `variableParameters`) VALUES (?, ?, ?, ?, ?)'; + + private $con; + private $platform; + private $phpType; + private $paramPersister; + private $callSitePersister; + private $insertStmt; + private $functionIdRef; + + public function __construct(Connection $con, ParameterPersister $paramPersister, CallSitePersister $callSitePersister) + { + $this->con = $con; + $this->platform = $con->getDatabasePlatform(); + $this->phpType = Type::getType(PhpTypeType::NAME); + $this->paramPersister = $paramPersister; + $this->callSitePersister = $callSitePersister; + $this->insertStmt = $con->prepare(self::INSERT_SQL); + $this->functionIdRef = new \ReflectionProperty('Scrutinizer\PhpAnalyzer\Model\GlobalFunction', 'id'); + $this->functionIdRef->setAccessible(true); + } + + public function persist(GlobalFunction $function, $packageVersionId) + { + $this->insertStmt->bindValue(1, $this->phpType->convertToDatabaseValue($function->getReturnType(), $this->platform)); + $this->insertStmt->bindValue(2, $function->getName()); + $this->insertStmt->bindValue(3, $function->isReturnByRef() ? 1 : 0, \PDO::PARAM_INT); + $this->insertStmt->bindValue(4, $packageVersionId, \PDO::PARAM_INT); + $this->insertStmt->bindValue(5, $function->hasVariableParameters() ? 1 : 0, \PDO::PARAM_INT); + $this->insertStmt->execute(); + + $functionId = $this->con->lastInsertId(); + $this->functionIdRef->setValue($function, $functionId); + + foreach ($function->getParameters() as $param) { + $this->paramPersister->persist($param, $function); + } + + foreach ($function->getInCallSites() as $callSite) { + $this->callSitePersister->persist($callSite); + } + foreach ($function->getOutCallSites() as $callSite) { + $this->callSitePersister->persist($callSite); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Persister/GlobalConstantPersister.php b/src/Scrutinizer/PhpAnalyzer/Model/Persister/GlobalConstantPersister.php new file mode 100644 index 0000000..e1d662d --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Persister/GlobalConstantPersister.php @@ -0,0 +1,50 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Persister; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Types\Type; +use Scrutinizer\PhpAnalyzer\Model\GlobalConstant; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; + +class GlobalConstantPersister +{ + const INSERT_SQL = 'INSERT INTO `global_constants`(`name`, `phpType`, `packageVersion_id`) VALUES (?, ?, ?)'; + + private $con; + private $platform; + private $phpType; + private $insertStmt; + + public function __construct(Connection $con) + { + $this->con = $con; + $this->platform = $con->getDatabasePlatform(); + $this->phpType = Type::getType(PhpTypeType::NAME); + $this->insertStmt = $con->prepare(self::INSERT_SQL); + } + + public function persist(GlobalConstant $constant, $packageVersionId) + { + $this->insertStmt->bindValue(1, $constant->getName()); + $this->insertStmt->bindValue(2, $this->phpType->convertToDatabaseValue($constant->getPhpType(), $this->platform)); + $this->insertStmt->bindValue(3, $packageVersionId, \PDO::PARAM_INT); + $this->insertStmt->execute(); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Persister/MethodContainerPersister.php b/src/Scrutinizer/PhpAnalyzer/Model/Persister/MethodContainerPersister.php new file mode 100644 index 0000000..00847f2 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Persister/MethodContainerPersister.php @@ -0,0 +1,143 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Persister; + +use Doctrine\DBAL\Driver\Connection; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\InterfaceC; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; +use Scrutinizer\PhpAnalyzer\Model\TraitC; + +class MethodContainerPersister +{ + const INSERT_STMT = 'INSERT INTO `method_containers`(`name`, `normalized`, `packageVersion_id`, `type`, `superClass`, + `superClasses`, `implementedInterfaces`, `modifier`, + `extendedInterfaces`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)'; + + private $con; + private $platform; + private $insertStmt; + private $methodPersister; + private $propertyPersister; + private $constantPersister; + + public function __construct(Connection $con, MethodPersister $methodPersister, PropertyPersister $propertyPersister, ConstantPersister $constantPersister) + { + $this->con = $con; + $this->insertStmt = $con->prepare(self::INSERT_STMT); + $this->methodPersister = $methodPersister; + $this->propertyPersister = $propertyPersister; + $this->constantPersister = $constantPersister; + } + + public function persist(MethodContainer $container, $packageVersionId) + { + switch (true) { + case $container instanceof Clazz: + $type = 'class'; + $superClass = $container->getSuperClass(); + + if ($superClasses = $container->getSuperClasses()) { + $superClasses = implode(',', $superClasses); + } else { + $superClasses = null; + } + + if ($implementedInterfaces = $container->getImplementedInterfaces()) { + $implementedInterfaces = implode(',', $implementedInterfaces); + } else { + $implementedInterfaces = null; + } + + $modifier = $container->getModifier(); + $extendedInterfaces = null; + + break; + + case $container instanceof InterfaceC: + $type = 'interface'; + $superClass = null; + $superClasses = null; + $implementedInterfaces = null; + $modifier = 0; + + if ($extendedInterfaces = $container->getExtendedInterfaces()) { + $extendedInterfaces = implode(',', $extendedInterfaces); + } else { + $extendedInterfaces = null; + } + + break; + + case $container instanceof TraitC: + $type = 'trait'; + $superClass = null; + $superClasses = null; + $implementedInterfaces = null; + $modifier = 0; + $extendedInterfaces = null; + break; + + default: + throw new \InvalidArgumentException('Unknown MethodContainer '.get_class($container)); + } + + $this->insertStmt->bindValue(1, $container->getName()); + $this->insertStmt->bindValue(2, $container->isNormalized() ? 1 : 0, \PDO::PARAM_INT); + $this->insertStmt->bindValue(3, $packageVersionId, \PDO::PARAM_INT); + $this->insertStmt->bindValue(4, $type); + $this->insertStmt->bindValue(5, $superClass, null === $superClass ? \PDO::PARAM_NULL : \PDO::PARAM_STR); + $this->insertStmt->bindValue(6, $superClasses, null === $superClasses ? \PDO::PARAM_NULL : \PDO::PARAM_STR); + $this->insertStmt->bindValue(7, $implementedInterfaces, null === $implementedInterfaces ? \PDO::PARAM_NULL : \PDO::PARAM_STR); + $this->insertStmt->bindValue(8, $modifier, \PDO::PARAM_INT); + $this->insertStmt->bindValue(9, $extendedInterfaces, null === $extendedInterfaces ? \PDO::PARAM_NULL : \PDO::PARAM_STR); + + $this->insertStmt->execute(); + $containerId = $this->con->lastInsertId(); + + foreach ($container->getMethods() as $method) { + $this->methodPersister->persist($method, $packageVersionId, $containerId); + } + + switch (true) { + case $container instanceof Clazz: + foreach ($container->getProperties() as $property) { + $this->propertyPersister->persist($property, $packageVersionId, $containerId); + } + foreach ($container->getConstants() as $constant) { + $this->constantPersister->persist($constant, $packageVersionId, $containerId); + } + + break; + + case $container instanceof InterfaceC: + foreach ($container->getConstants() as $constant) { + $this->constantPersister->persist($constant, $packageVersionId, $containerId); + } + + break; + + case $container instanceof TraitC: + break; + + default: + throw new \InvalidArgumentException('Unknown MethodContainer '.get_class($container)); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Persister/MethodPersister.php b/src/Scrutinizer/PhpAnalyzer/Model/Persister/MethodPersister.php new file mode 100644 index 0000000..5be5344 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Persister/MethodPersister.php @@ -0,0 +1,129 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Persister; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Types\Type; +use Scrutinizer\PhpAnalyzer\Model\ClassMethod; +use Scrutinizer\PhpAnalyzer\Model\ContainerMethodInterface; +use Scrutinizer\PhpAnalyzer\Model\InterfaceMethod; +use Scrutinizer\PhpAnalyzer\Model\Method; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; + +class MethodPersister +{ + const INSERT_METHOD_SQL = 'INSERT INTO `methods`(`returnType`, `name`, `returnByRef`, `modifier`, `visibility`, + `packageVersion_id`, `variableParameters`, `docTypes`) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)'; + const INSERT_CLASS_METHOD_SQL = 'INSERT INTO `class_methods`(`class_id`, `method_id`, `name`, `declaringClass`) + VALUES (?, ?, ?, ?)'; + const INSERT_INTERFACE_METHOD_SQL = 'INSERT INTO `interface_methods`(`interface_id`, `method_id`, `name`, + `declaringInterface`) + VALUES (?, ?, ?, ?)'; + + private $con; + private $platform; + private $methodIdRef; + private $methodStmt; + private $cMethodStmt; + private $iMethodStmt; + private $phpType; + private $paramPersister; + private $callSitePersister; + + public function __construct(Connection $con, ParameterPersister $paramPersister, CallSitePersister $callSitePersister) + { + $this->con = $con; + $this->platform = $con->getDatabasePlatform(); + $this->paramPersister = $paramPersister; + $this->callSitePersister = $callSitePersister; + + // We rely on the fact that this type is already wired with DBAL before + // the persister is called which should always be the case. + $this->phpType = Type::getType(PhpTypeType::NAME); + assert($this->phpType instanceof PhpTypeType); + + $this->methodIdRef = new \ReflectionProperty('Scrutinizer\PhpAnalyzer\Model\Method', 'id'); + $this->methodIdRef->setAccessible(true); + $this->methodStmt = $con->prepare(self::INSERT_METHOD_SQL); + $this->cMethodStmt = $con->prepare(self::INSERT_CLASS_METHOD_SQL); + $this->iMethodStmt = $con->prepare(self::INSERT_INTERFACE_METHOD_SQL); + } + + public function persist(ContainerMethodInterface $containerMethod, $packageVersionId, $containerId) + { + switch (true) { + case $containerMethod instanceof ClassMethod: + $stmt = $this->cMethodStmt; + break; + + case $containerMethod instanceof InterfaceMethod: + $stmt = $this->iMethodStmt; + break; + + default: + throw new \RuntimeException('Unknown container method '.get_class($containerMethod)); + } + + $method = $containerMethod->getMethod(); + + if (null === $methodId = $method->getId()) { + $methodId = $this->insertMethod($method, $packageVersionId); + } + + // `class_id`, `method_id`, `name`, `declaringClass` + $stmt->bindValue(1, $containerId, \PDO::PARAM_INT); + $stmt->bindValue(2, $methodId, \PDO::PARAM_INT); + $stmt->bindValue(3, $containerMethod->getName()); + + // If the method is not inherited, we only insert NULL. + $stmt->bindValue(4, $containerMethod->isInherited() ? $containerMethod->getDeclaringClass() : null, + $containerMethod->isInherited() ? \PDO::PARAM_STR : \PDO::PARAM_NULL); + $stmt->execute(); + } + + // `returnType`, `name`, `returnByRef`, `modifier`, `visibility`, `packageVersion_id`, `variableParameters` + private function insertMethod(Method $method, $packageVersionId) + { + $this->methodStmt->bindValue(1, $this->phpType->convertToDatabaseValue($method->getReturnType(), $this->platform)); + $this->methodStmt->bindValue(2, $method->getName()); + $this->methodStmt->bindValue(3, $method->isReturnByRef() ? 1 : 0, \PDO::PARAM_INT); + $this->methodStmt->bindValue(4, $method->getModifier(), \PDO::PARAM_INT); + $this->methodStmt->bindValue(5, $method->getVisibility(), \PDO::PARAM_INT); + $this->methodStmt->bindValue(6, $packageVersionId, \PDO::PARAM_INT); + $this->methodStmt->bindValue(7, $method->hasVariableParameters() ? 1 : 0, \PDO::PARAM_INT); + $this->methodStmt->bindValue(8, json_encode($method->getDocTypes()), \PDO::PARAM_STR); + + $this->methodStmt->execute(); + $this->methodIdRef->setValue($method, $methodId = $this->con->lastInsertId()); + + foreach ($method->getParameters() as $param) { + $this->paramPersister->persist($param, $method); + } + + foreach ($method->getInCallSites() as $callSite) { + $this->callSitePersister->persist($callSite); + } + foreach ($method->getOutCallSites() as $callSite) { + $this->callSitePersister->persist($callSite); + } + + return $methodId; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Persister/PackageVersionPersister.php b/src/Scrutinizer/PhpAnalyzer/Model/Persister/PackageVersionPersister.php new file mode 100644 index 0000000..d7b1919 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Persister/PackageVersionPersister.php @@ -0,0 +1,76 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Persister; + +use Doctrine\DBAL\Connection; +use Scrutinizer\PhpAnalyzer\Model\PackageVersion; + +/** + * Specialized persister for PackageVersion instances. + * + * This persister is used for inserting built packages as we might have a huge number of objects, and Doctrine's default + * UoW just takes too long to run because of the extra operations that it performs. + * + * These specialized persisters operate on a "insert and forget" basis not caring about change tracking etc. + * + * @author Johannes M. Schmitt + */ +class PackageVersionPersister +{ + private $con; + private $containerPersister; + private $functionPersister; + private $constantPersister; + + public function __construct(Connection $con, MethodContainerPersister $containerPersister, FunctionPersister $functionPersister, GlobalConstantPersister $constantPersister) + { + $this->con = $con; + $this->containerPersister = $containerPersister; + $this->functionPersister = $functionPersister; + $this->constantPersister = $constantPersister; + } + + public function persist(PackageVersion $packageVersion) + { + if (null === $packageVersionId = $packageVersion->getId()) { + throw new \InvalidArgumentException('The $packageVersion must already have been persisted to the database.'); + } + + // We are ensuring that all inserts are executed within a transaction. + // See: http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html + $this->con->beginTransaction(); + try { + foreach ($packageVersion->getContainers() as $container) { + $this->containerPersister->persist($container, $packageVersionId); + } + foreach ($packageVersion->getFunctions() as $function) { + $this->functionPersister->persist($function, $packageVersionId); + } + foreach ($packageVersion->getConstants() as $constant) { + $this->constantPersister->persist($constant, $packageVersionId); + } + + $this->con->commit(); + } catch (\Exception $ex) { + $this->con->rollBack(); + + throw $ex; + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Persister/ParameterPersister.php b/src/Scrutinizer/PhpAnalyzer/Model/Persister/ParameterPersister.php new file mode 100644 index 0000000..c7c5476 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Persister/ParameterPersister.php @@ -0,0 +1,75 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Persister; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Types\Type; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\Method; +use Scrutinizer\PhpAnalyzer\Model\Parameter; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; + +class ParameterPersister +{ + const INSERT_FUNC_SQL = 'INSERT INTO `function_parameters`(`function_id`, `name`, `phpType`, `index_nb`, + `passedByRef`, `optional`) VALUES (?, ?, ?, ?, ?, ?)'; + const INSERT_METHOD_SQL = 'INSERT INTO `method_parameters`(`method_id`, `name`, `phpType`, `index_nb`, `passedByRef`, + `optional`) VALUES (?, ?, ?, ?, ?, ?)'; + + private $con; + private $platform; + private $phpType; + private $fStmt; + private $mStmt; + + public function __construct(Connection $con) + { + $this->con = $con; + $this->platform = $con->getDatabasePlatform(); + $this->phpType = Type::getType(PhpTypeType::NAME); + + $this->fStmt = $con->prepare(self::INSERT_FUNC_SQL); + $this->mStmt = $con->prepare(self::INSERT_METHOD_SQL); + } + + public function persist(Parameter $param, AbstractFunction $function) + { + switch (true) { + case $function instanceof GlobalFunction: + $stmt = $this->fStmt; + break; + + case $function instanceof Method: + $stmt = $this->mStmt; + break; + + default: + throw new \InvalidArgumentException('Unsupported AbstractFunction implementation '.get_class($function)); + } + + $stmt->bindValue(1, $function->getId(), \PDO::PARAM_INT); + $stmt->bindValue(2, $param->getName()); + $stmt->bindValue(3, $this->phpType->convertToDatabaseValue($param->getPhpType(), $this->platform)); + $stmt->bindValue(4, $param->getIndex(), \PDO::PARAM_INT); + $stmt->bindValue(5, $param->isPassedByRef() ? 1: 0, \PDO::PARAM_INT); + $stmt->bindValue(6, $param->isOptional() ? 1 : 0, \PDO::PARAM_INT); + $stmt->execute(); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Persister/PropertyPersister.php b/src/Scrutinizer/PhpAnalyzer/Model/Persister/PropertyPersister.php new file mode 100644 index 0000000..0e3cf56 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Persister/PropertyPersister.php @@ -0,0 +1,96 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Persister; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Types\Type; +use Scrutinizer\PhpAnalyzer\Model\ClassProperty; +use Scrutinizer\PhpAnalyzer\Model\ContainerPropertyInterface; +use Scrutinizer\PhpAnalyzer\Model\Property; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; + +class PropertyPersister +{ + const INSERT_PROPERTY_SQL = 'INSERT INTO `properties`(`name`, `visibility`, `phpType`, `packageVersion_id`) + VALUES (?, ?, ?, ?)'; + const INSERT_CLASS_PROPERTY_SQL = 'INSERT INTO `class_properties`(`class_id`, `property_id`, `name`, `declaringClass`) + VALUES (?, ?, ?, ?)'; + + private $con; + private $platform; + private $phpType; + + private $propertyIdRef; + + private $propertyStmt; + private $cPropertyStmt; + + public function __construct(Connection $con) + { + $this->con = $con; + $this->platform = $con->getDatabasePlatform(); + $this->phpType = Type::getType(PhpTypeType::NAME); + + $this->propertyIdRef = new \ReflectionProperty('Scrutinizer\PhpAnalyzer\Model\Property', 'id'); + $this->propertyIdRef->setAccessible(true); + + $this->propertyStmt = $con->prepare(self::INSERT_PROPERTY_SQL); + $this->cPropertyStmt = $con->prepare(self::INSERT_CLASS_PROPERTY_SQL); + } + + public function persist(ContainerPropertyInterface $containerProperty, $packageVersionId, $containerId) + { + switch (true) { + case $containerProperty instanceof ClassProperty: + $stmt = $this->cPropertyStmt; + break; + + default: + throw new \RuntimeException('Unknown container property '.get_class($containerProperty)); + } + + $property = $containerProperty->getProperty(); + + if (null === $propertyId = $property->getId()) { + $propertyId = $this->insertProperty($property, $packageVersionId); + } + + $stmt->bindValue(1, $containerId, \PDO::PARAM_INT); + $stmt->bindValue(2, $propertyId, \PDO::PARAM_INT); + $stmt->bindValue(3, $containerProperty->getName()); + $stmt->bindValue(4, $containerProperty->isInherited() ? $containerProperty->getDeclaringClass() : null, + $containerProperty->isInherited() ? \PDO::PARAM_STR : \PDO::PARAM_NULL); + $stmt->execute(); + } + + // `name`, `visibility`, `phpType`, `packageVersion_id` + private function insertProperty(Property $property, $packageVersionId) + { + $this->propertyStmt->bindValue(1, $property->getName()); + $this->propertyStmt->bindValue(2, $property->getVisibility(), \PDO::PARAM_INT); + $this->propertyStmt->bindValue(3, $this->phpType->convertToDatabaseValue($property->getPhpType(), $this->platform)); + $this->propertyStmt->bindValue(4, $packageVersionId, \PDO::PARAM_INT); + + $this->propertyStmt->execute(); + $propertyId = $this->con->lastInsertId(); + $this->propertyIdRef->setValue($property, $propertyId); + + return $propertyId; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/PhpFile.php b/src/Scrutinizer/PhpAnalyzer/Model/PhpFile.php new file mode 100644 index 0000000..85e0d1f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/PhpFile.php @@ -0,0 +1,60 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; +use JMS\Serializer\Annotation as Serializer; + +/** @Serializer\ExclusionPolicy("ALL") */ +class PhpFile extends File implements AnalyzerAwareInterface +{ + private $ast; + private $classes = array(); + private $analyzer; + + public function setAnalyzer(\Scrutinizer\PhpAnalyzer\Analyzer $analyzer) + { + $this->analyzer = $analyzer; + } + + public function setAst(\PHPParser_Node $ast) + { + $this->ast = $ast; + } + + public function getAst() + { + return $this->ast; + } + + public function addClass(\PHPParser_Node_Stmt_Class $class) + { + $this->classes[$class->name] = $class; + } + + public function getClasses() + { + return $this->classes; + } + + protected function createFixedFile() + { + return new FixedPhpFile($this->analyzer, $this->getContent()); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Property.php b/src/Scrutinizer/PhpAnalyzer/Model/Property.php new file mode 100644 index 0000000..4f1d39e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Property.php @@ -0,0 +1,117 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\ORM\Mapping as ORM; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +/** + * @ORM\Entity(readOnly = true) + * @ORM\Table(name = "properties") + * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") + * + */ +class Property +{ + const VISIBILITY_PUBLIC = 1; + const VISIBILITY_PROTECTED = 2; + const VISIBILITY_PRIVATE = 3; + + /** @ORM\Id @ORM\Column(type = "integer") @ORM\GeneratedValue(strategy = "AUTO") */ + private $id; + + /** @ORM\Column(type = "string") */ + private $name; + + /** @ORM\Column(type = "integer") */ + private $visibility = self::VISIBILITY_PUBLIC; + + /** @ORM\Column(type = "PhpType") */ + private $phpType; + + /** @ORM\ManyToOne(targetEntity = "PackageVersion") */ + private $packageVersion; + + private $astNode; + + public function __construct($name) + { + $this->name = $name; + } + + public function getId() + { + return $this->id; + } + + public function getName() + { + return $this->name; + } + + public function getVisibility() + { + return $this->visibility; + } + + public function isPublic() + { + return self::VISIBILITY_PUBLIC === $this->visibility; + } + + public function isProtected() + { + return self::VISIBILITY_PROTECTED === $this->visibility; + } + + public function isPrivate() + { + return self::VISIBILITY_PRIVATE === $this->visibility; + } + + public function getPhpType() + { + return $this->phpType; + } + + public function getAstNode() + { + return $this->astNode; + } + + public function setVisibility($visibility) + { + $this->visibility = $visibility; + } + + public function setAstNode(\PHPParser_Node $node) + { + $this->astNode = $node; + } + + public function setPhpType(PhpType $type) + { + $this->phpType = $type; + } + + public function setPackageVersion(PackageVersion $packageVersion) + { + $this->packageVersion = $packageVersion; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Repository/EntityTypeProvider.php b/src/Scrutinizer/PhpAnalyzer/Model/Repository/EntityTypeProvider.php new file mode 100644 index 0000000..64faf3f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Repository/EntityTypeProvider.php @@ -0,0 +1,232 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Repository; + +use Doctrine\ORM\EntityManager; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PackageAwareTypeProviderInterface; +use Scrutinizer\PhpAnalyzer\Model\GlobalConstant; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; +use Scrutinizer\PhpAnalyzer\Model\PackageVersion; +use Doctrine\ORM\QueryBuilder; + +/** + * Loads types from the database. + * + * @author Johannes M. Schmitt + */ +class EntityTypeProvider implements PackageAwareTypeProviderInterface +{ + private $em; + private $packageVersions; + + public function __construct(EntityManager $em) + { + $this->em = $em; + } + + public function setPackageVersions(array $packageVersions) + { + if ( ! $packageVersions) { + $this->packageVersions = null; + + return; + } + + $this->packageVersions = new \SplObjectStorage(); + foreach ($packageVersions as $version) { + assert($version instanceof PackageVersion); + $this->packageVersions->attach($version); + } + } + + public function getImplementingClasses($name) + { + $classes = array(); + + $qb = $this->em->createQueryBuilder(); + $qb + ->select('c') + ->from('Scrutinizer\PhpAnalyzer\Model\Clazz', 'c') + ->where($qb->expr()->like('c.implementedInterfaces', ':pattern')) + ; + $qb->setParameter('pattern', '%'.$name.'%'); + $this->addPackageCondition($qb, 'c'); + + foreach ($qb->getQuery()->getResult() as $class) { + // We need to do an additional check as the name might have only returned a partial + // match. Alternatively, we could use a regex to query the database, but Doctrine does + // not seem to support that natively. + if ( ! $class->isImplementing($name)) { + continue; + } + + // The class belongs to a package version which is not being analyzed. + if (null !== $this->packageVersions && ! isset($this->packageVersions[$class->getPackageVersion()])) { + continue; + } + + $classes[] = $class; + } + + return $classes; + } + + public function loadClasses(array $names) + { + $loweredNames = array(); + foreach ($names as $name) { + $loweredNames[strtolower($name)] = $name; + } + + $qb = $this->em->createQueryBuilder(); + $qb + ->select('c') + ->from('Scrutinizer\PhpAnalyzer\Model\MethodContainer', 'c') + ->where($qb->expr()->in('c.name', ':names')) + ; + $qb->setParameter('names', $names); + $this->addPackageCondition($qb, 'c'); + + $rs = array(); + foreach ($qb->getQuery()->getResult() as $class) { + $rs[$loweredNames[strtolower($class->getName())]][] = $class; + } + + foreach ($rs as $i => $classes) { + if (null === $this->packageVersions) { + $rs[$i] = reset($classes); + + continue; + } + + foreach ($classes as $class) { + if (isset($this->packageVersions[$class->getPackageVersion()])) { + $rs[$i] = $class; + + continue 2; + } + } + + unset($rs[$i]); + } + + return $rs; + } + + public function loadClass($name) + { + $qb = $this->em->createQueryBuilder(); + $qb + ->select('c') + ->from('Scrutinizer\PhpAnalyzer\Model\MethodContainer', 'c') + ->where($qb->expr()->eq('c.name', ':name')) + ; + $qb->setParameter('name', $name); + $this->addPackageCondition($qb, 'c'); + + $possibleClasses = $qb->getQuery()->getResult(); + + if (null === $this->packageVersions) { + return $possibleClasses ? reset($possibleClasses) : null; + } + + foreach ($possibleClasses as $class) { + assert($class instanceof MethodContainer); + + if (isset($this->packageVersions[$class->getPackageVersion()])) { + return $class; + } + } + + return null; + } + + public function loadFunction($name) + { + $qb = $this->em->createQueryBuilder(); + $qb + ->select('f') + ->from('Scrutinizer\PhpAnalyzer\Model\GlobalFunction', 'f') + ->where($qb->expr()->eq('f.name', ':name')) + ; + $qb->setParameter('name', $name); + $this->addPackageCondition($qb, 'f'); + + $possibleFunctions = $qb->getQuery()->getResult(); + + if (null === $this->packageVersions) { + return $possibleFunctions ? reset($possibleFunctions) : null; + } + + foreach ($possibleFunctions as $function) { + assert($function instanceof GlobalFunction); + + if (isset($this->packageVersions[$function->getPackageVersion()])) { + return $function; + } + } + + return null; + } + + public function loadConstant($name) + { + $qb = $this->em->createQueryBuilder(); + $qb + ->select('c') + ->from('Scrutinizer\PhpAnalyzer\Model\GlobalConstant', 'c') + ->where($qb->expr()->eq('c.name', ':name')) + ; + $qb->setParameter('name', $name); + $this->addPackageCondition($qb, 'c'); + + $possibleConstants = $qb->getQuery()->getResult(); + + if (null === $this->packageVersions) { + return $possibleConstants ? reset($possibleConstants) : null; + } + + foreach ($possibleConstants as $constant) { + assert($constant instanceof GlobalConstant); + + if (isset($this->packageVersions[$constant->getPackageVersion()])) { + return $constant; + } + } + + return null; + } + + + private function addPackageCondition(QueryBuilder $qb, $alias) + { + if (null === $this->packageVersions) { + return; + } + + $packages = array(); + foreach ($this->packageVersions as $packageVersion) { + $packages[] = $qb->expr()->eq($alias.'.packageVersion', ':package'.($i = count($packages))); + $qb->setParameter('package'.$i, $packageVersion); + } + + $qb->andWhere(call_user_func_array(array($qb->expr(), 'orX'), $packages)); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Repository/PackageRepository.php b/src/Scrutinizer/PhpAnalyzer/Model/Repository/PackageRepository.php new file mode 100644 index 0000000..cbe7094 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Repository/PackageRepository.php @@ -0,0 +1,218 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Repository; + +use Doctrine\ORM\EntityRepository; +use Scrutinizer\PhpAnalyzer\Model\Package; +use Scrutinizer\PhpAnalyzer\Model\PackageVersion; + +class PackageRepository extends EntityRepository +{ + /** + * Returns the requested package. + * + * If the package is not found, it will be created. + * + * @param string $name + * @return Package + */ + public function getOrCreatePackage($name) + { + if ($package = $this->findOneBy(array('name' => $name))) { + return $package; + } + + return new Package($name); + } + + public function getPackage($name) + { + if (!$package = $this->findOneBy(array('name' => $name))) { + throw new \InvalidArgumentException('The package "%s" does not exist.', $name); + } + + return $package; + } + + public function getLatestBuiltPackageVersion($name, $version) + { + return $this->_em->createQuery("SELECT pv FROM Scrutinizer\PhpAnalyzer\Model\PackageVersion pv INNER JOIN pv.package p WHERE p.name = :name AND pv.version = :version AND pv.lastBuiltAt IS NOT NULL ORDER BY pv.lastBuiltAt DESC") + ->setParameter('name', $name) + ->setParameter('version', $version) + ->setMaxResults(1) + ->getOneOrNullResult(); + } + + public function getPackageVersion($name, $version, $sourceReference = null, $dependencyHash = null) + { + $qb = $this->_em->createQueryBuilder(); + + $qb->select('pv')->from('Scrutinizer\PhpAnalyzer\Model\PackageVersion', 'pv') + ->innerJoin('pv.package', 'p') + ->where($qb->expr()->andX( + $qb->expr()->eq('p.name', ':name'), + $qb->expr()->eq('pv.version', ':version'))) + ->orderBy('pv.id', 'DESC'); + $qb->setParameter('name', $name); + $qb->setParameter('version', $version); + + if (null !== $sourceReference) { + $qb->andWhere($qb->expr()->eq('pv.sourceReference', ':sourceReference')); + $qb->setParameter('sourceReference', $sourceReference); + } + + if (null !== $dependencyHash) { + $qb->andWhere($qb->expr()->orX( + $qb->expr()->isNull('pv.dependencyHash'), + $qb->expr()->eq('pv.dependencyHash', ':dependencyHash'))); + $qb->setParameter('dependencyHash', $dependencyHash); + } + + return $qb->getQuery()->setMaxResults(1)->getOneOrNullResult(); + } + + public function createPackagistVersionIfNotExists($packagistName, $version) + { + $name = 'packagist__'.$packagistName; + $package = $this->getOrCreatePackage($name); + $package->setPackagistName($packagistName); + + if ($package->hasVersion($version)) { + return; + } + + $package->createVersion($version); + $this->_em->persist($package); + $this->_em->flush(); + } + + /** + * Deletes the given package version from the repository. + * + * This also recursively deletes all package versions which have a dependency on the given + * package. We need to do this to ensure integrity of the class database. + * + * @param \Scrutinizer\PhpAnalyzer\Model\PackageVersion $packageVersion + */ + public function deletePackageVersion(PackageVersion $packageVersion) + { + $this->_em->getConnection()->beginTransaction(); + try { + $this->deletePackageVersionInternal($packageVersion); + $this->_em->getConnection()->commit(); + } catch (\Exception $ex) { + $this->_em->getConnection()->rollback(); + + throw $ex; + } + } + + private function deletePackageVersionInternal(PackageVersion $packageVersion, array &$deletedVersions = array()) + { + if ( ! $this->_em->getConnection()->isTransactionActive()) { + throw new \LogicException('deletePackageVersionInternal() requires an active transaction.'); + } + + if ( ! $this->_em->contains($packageVersion)) { + return; + } + + // This makes sure that we do break circular references, and do not end up in a deadlock. + if (in_array($packageVersion, $deletedVersions, true)) { + return; + } + $deletedVersions[] = $packageVersion; + + // We need to also delete all package versions which depend on this package version since + // there might be classes which have been inherited; their properties, or methods might have + // changed etc. So, a re-build for them is required. + $incomingDeps = $this->_em->createQuery("SELECT p FROM Scrutinizer\PhpAnalyzer\Model\PackageVersion p + WHERE :version MEMBER OF p.dependencies") + ->setParameter('version', $packageVersion) + ->getResult(); + foreach ($incomingDeps as $incomingDep) { + $this->deletePackageVersionInternal($incomingDep, $deletedVersions); + } + + $packageVersion->getPackage()->removeVersion($packageVersion); + $this->_em->remove($packageVersion); + + $this->clearPackageVersion($packageVersion); + } + + public function clearPackageVersion(PackageVersion $packageVersion) + { + // classes + $classes = $this->_em->createQuery("SELECT c, m, p, co FROM Scrutinizer\PhpAnalyzer\Model\Clazz c LEFT JOIN c.methods m LEFT JOIN c.properties p LEFT JOIN c.constants co WHERE c.packageVersion = :packageVersion") + ->setParameter('packageVersion', $packageVersion) + ->execute(); + foreach ($classes as $class) { + $this->_em->remove($class); + } + + // interfaces + $interfaces = $this->_em->createQuery("SELECT i, m FROM Scrutinizer\PhpAnalyzer\Model\InterfaceC i LEFT JOIN i.methods m WHERE i.packageVersion = :packageVersion") + ->setParameter('packageVersion', $packageVersion) + ->execute(); + foreach ($interfaces as $interface) { + $this->_em->remove($interface); + } + + // traits + $traits = $this->_em->createQuery("SELECT t FROM Scrutinizer\PhpAnalyzer\Model\TraitC t WHERE t.packageVersion = :packageVersion") + ->setParameter('packageVersion', $packageVersion) + ->execute(); + foreach ($traits as $trait) { + $this->_em->remove($trait); + } + + // constants + foreach ($this->_em->createQuery("SELECT c FROM Scrutinizer\PhpAnalyzer\Model\GlobalConstant c WHERE c.packageVersion = :packageVersion") + ->setParameter('packageVersion', $packageVersion)->execute() as $constant) { + $this->_em->remove($constant); + } + + // functions + foreach ($this->_em->createQuery("SELECT f FROM Scrutinizer\PhpAnalyzer\Model\GlobalFunction f WHERE f.packageVersion = :packageVersion") + ->setParameter('packageVersion', $packageVersion)->execute() as $function) { + $this->_em->remove($function); + } + + // methods + $methods = $this->_em->createQuery("SELECT m FROM Scrutinizer\PhpAnalyzer\Model\Method m WHERE m.packageVersion = :packageVersion") + ->setParameter('packageVersion', $packageVersion)->execute(); + foreach ($methods as $method) { + $this->_em->remove($method); + } + + // properties + foreach ($this->_em->createQuery("SELECT p FROM Scrutinizer\PhpAnalyzer\Model\Property p WHERE p.packageVersion = :packageVersion") + ->setParameter('packageVersion', $packageVersion)->execute() as $property) { + $this->_em->remove($property); + } + + // constants + foreach ($this->_em->createQuery("SELECT c FROM Scrutinizer\PhpAnalyzer\Model\Constant c WHERE c.packageVersion = :packageVersion") + ->setParameter('packageVersion', $packageVersion)->execute() as $constant) { + $this->_em->remove($constant); + } + + $this->_em->flush(); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/TraitC.php b/src/Scrutinizer/PhpAnalyzer/Model/TraitC.php new file mode 100644 index 0000000..501e660 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/TraitC.php @@ -0,0 +1,110 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(readOnly = true) + * + * @author Johannes + */ +class TraitC extends MethodContainer +{ + private $methods; + private $properties; + + public function __construct($name) + { + parent::__construct($name); + + $this->methods = new ArrayCollection(); + $this->properties = new ArrayCollection(); + } + + public function getProperties() + { + return $this->properties; + } + + public function hasProperty($name) + { + return $this->properties->containsKey($name); + } + + public function getProperty($name) + { + return $this->properties->get($name); + } + + public function getPropertyNames() + { + return $this->properties->getKeys(); + } + + public function addProperty(Property $property, $declaringClass = null) + { + // TODO +// $classProperty = new TraitProperty($this, $property, $declaringClass); +// $this->properties->set($property->getName(), $classProperty); + } + + public function hasMethod($name) + { + return $this->methods->containsKey($name); + } + + public function getMethod($name) + { + return $this->methods->get($name); + } + + public function addMethod(Method $method, $declaringClass = null) + { + // TODO + } + + public function getMethods() + { + return $this->methods; + } + + public function getMethodNames() + { + $names = array(); + foreach ($this->methods as $method) { + $names[] = $method->getMethod()->getName(); + } + + return $names; + } + + // TODO + + public function isTrait() + { + return true; + } + + public function toMaybeObjectType() + { + return $this; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Type/PhpTypeType.php b/src/Scrutinizer/PhpAnalyzer/Model/Type/PhpTypeType.php new file mode 100644 index 0000000..527b8a3 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Type/PhpTypeType.php @@ -0,0 +1,245 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Model\Type; + +use Doctrine\DBAL\Platforms\AbstractPlatform; +use Doctrine\DBAL\Types\ConversionException; +use Doctrine\DBAL\Types\TextType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NoType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\AllType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ArrayType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\BooleanType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\CallableType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\DoubleType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\FalseType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\IntegerType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NamedType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NoObjectType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NullType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ObjectType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ResourceType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\StringType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ThisType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnionType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnknownType; + +class PhpTypeType extends TextType +{ + const NAME = 'PhpType'; + + /** @var TypeRegistry */ + private static $typeRegistry; + + public static function setTypeRegistry(TypeRegistry $registry) + { + self::$typeRegistry = $registry; + } + + public static function getTypeRegistry() + { + if (null === self::$typeRegistry) { + self::$typeRegistry = new TypeRegistry(); + } + + return self::$typeRegistry; + } + + /** + * Converts a value from its PHP representation to its database representation + * of this type. + * + * @param mixed $value The value to convert. + * @param AbstractPlatform $platform The currently used database platform. + * @return mixed The database representation of the value. + */ + public function convertToDatabaseValue($value, AbstractPlatform $platform) + { + if (null === $value) { + return null; + } + + if (null === self::$typeRegistry) { + self::$typeRegistry = new TypeRegistry(); + } + + if ( ! $value instanceof PhpType) { + throw ConversionException::conversionFailed($value, 'string'); + } + + return $this->convertToString($value); + } + + public function convertToString(PhpType $value) + { + $typeName = $this->getStringRepr($value); + $attrs = $value->getAttributes(); + + if (empty($attrs)) { + return $typeName; + } + + return $typeName.$this->dumpJsonLike($attrs, true); + } + + /** + * Converts a value from its database representation to its PHP representation + * of this type. + * + * @param mixed $value The value to convert. + * @param AbstractPlatform $platform The currently used database platform. + * @return mixed The PHP representation of the value. + */ + public function convertToPHPValue($value, AbstractPlatform $platform) + { + $value = (is_resource($value)) ? stream_get_contents($value) : $value; + if (empty($value)) { + return null; + } + + if (null === self::$typeRegistry) { + self::$typeRegistry = new TypeRegistry(); + } + + // We cannot lookup classes in the cache as this would result in another + // database query during the currently executed query, and consequentially + // in a FATAL error inside Doctrine's hydrators. + return self::$typeRegistry->resolveType($value, TypeRegistry::LOOKUP_NO_CACHE); + } + + // TODO: This should probably be moved to the types themselves. + private function getStringRepr(PhpType $type) + { + switch (true) { + case $type instanceof AllType: + return TypeRegistry::NATIVE_ALL; + + // This handles the generic array type specially. + case $type === self::$typeRegistry->getNativeType('array'): + return 'array'; + + case $type instanceof ArrayType: + $itemTypes = $type->getItemTypes(); + if (empty($itemTypes)) { + return TypeRegistry::NATIVE_ARRAY.'<'.$this->getStringRepr($type->getKeyType()).','.$this->getStringRepr($type->getElementType()).'>'; + } + + return sprintf( + 'array<%s,%s,%s>', + $this->getStringRepr($type->getKeyType()), + $this->getStringRepr($type->getElementType()), + $this->dumpJsonLike($itemTypes, true)); + + case $type instanceof FalseType: + return TypeRegistry::NATIVE_BOOLEAN_FALSE; + + case $type instanceof BooleanType: + return TypeRegistry::NATIVE_BOOLEAN; + + case $type instanceof CallableType: + return TypeRegistry::NATIVE_CALLABLE; + + case $type instanceof ResourceType: + return TypeRegistry::NATIVE_RESOURCE; + + case $type instanceof DoubleType: + return TypeRegistry::NATIVE_DOUBLE; + + case $type instanceof IntegerType: + return TypeRegistry::NATIVE_INTEGER; + + case $type instanceof ThisType: + return 'this<'.$type->getReferenceName().'>'; + + case $type instanceof NamedType: + // If this type has been resolved, we can get the representation + // of the resolved type instead of using the reference name. + if ( ! $type->isNoResolvedType()) { + return $this->getStringRepr($type->getReferencedType()); + } + + return 'object<'.$type->getReferenceName().'>'; + + case $type instanceof NoObjectType: + return TypeRegistry::NATIVE_OBJECT; + + case $type instanceof NoType: + return TypeRegistry::NATIVE_NONE; + + case $type instanceof NullType: + return TypeRegistry::NATIVE_NULL; + + case $type instanceof ObjectType: + return 'object<'.$type->getName().'>'; + + case $type instanceof StringType: + return TypeRegistry::NATIVE_STRING; + + case $type instanceof UnionType: + $alt = array(); + foreach ($type->getAlternates() as $t) { + $alt[] = $this->getStringRepr($t); + } + + return implode('|', $alt); + + case $type instanceof UnknownType: + return $type->isChecked() ? TypeRegistry::NATIVE_UNKNOWN_CHECKED : TypeRegistry::NATIVE_UNKNOWN; + } + + throw new \InvalidArgumentException(sprintf('The SWITCH statement is exhaustive, but got "%s".', get_class($type))); + } + + private function dumpJsonLike(array $data, $isRoot = false) + { + $isList = $isRoot ? false : (array_keys($data) === range(0, count($data) - 1)); + $jsonLike = $isList ? '[' : '{'; + + $first = true; + foreach ($data as $k => $v) { + if ( ! $first) { + $jsonLike .= ','; + } + $first = false; + + if ( ! $isList) { + $jsonLike .= json_encode($k).':'; + } + + if ($v instanceof PhpType) { + $jsonLike .= 'type('.$this->getStringRepr($v).')'; + } else if ($v === null || is_scalar($v)) { + $jsonLike .= json_encode($v); + } else if (is_array($v)) { + $jsonLike .= $this->dumpJsonLike($v); + } else { + throw new \RuntimeException('Encountered unsupported data of type %s.', gettype($v)); + } + } + $jsonLike .= $isList ? ']' : '}'; + + return $jsonLike; + } + + public function getName() + { + return self::NAME; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/AnalysisPassInterface.php b/src/Scrutinizer/PhpAnalyzer/Pass/AnalysisPassInterface.php new file mode 100644 index 0000000..903e4c6 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/AnalysisPassInterface.php @@ -0,0 +1,26 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Model\File; + +interface AnalysisPassInterface +{ + function analyze(File $file); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/AstAnalyzerPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/AstAnalyzerPass.php new file mode 100644 index 0000000..e8980e8 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/AstAnalyzerPass.php @@ -0,0 +1,88 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\AnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\SyntacticScopeCreator; +use Scrutinizer\PhpAnalyzer\PhpParser\Traversal\AbstractScopedCallback; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\PhpFile; + +abstract class AstAnalyzerPass extends AbstractScopedCallback implements AnalysisPassInterface, AnalyzerAwareInterface +{ + protected static $prettyPrinter; + + /** @var PhpFile */ + protected $phpFile; + + /** @var TypeRegistry */ + protected $typeRegistry; + + /** @var Analyzer */ + protected $analyzer; + + public function __construct() + { + if (null === self::$prettyPrinter) { + self::$prettyPrinter = new \PHPParser_PrettyPrinter_Zend(); + } + } + + public function setAnalyzer(Analyzer $analyzer) + { + $this->analyzer = $analyzer; + $this->typeRegistry = $analyzer->getTypeRegistry(); + } + + public function analyze(File $file) + { + if ( ! $this->isEnabled()) { + return; + } + + if (!$file instanceof PhpFile) { + return; + } + + $this->phpFile = $file; + NodeTraversal::traverseWithCallback($file->getAst(), $this, $this->getScopeCreator()); + } + + /** + * Returns whether this pass is enabled. + * + * Allow sub-classes to easily disable this pass without having to implement + * much logic themselves. + * + * @return boolean + */ + protected function isEnabled() + { + return true; + } + + protected function getScopeCreator() + { + return new SyntacticScopeCreator(); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CallGraphPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CallGraphPass.php new file mode 100644 index 0000000..d500ba7 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CallGraphPass.php @@ -0,0 +1,183 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Pass\AstAnalyzerPass; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\Argument; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\CallSite; + +class CallGraphPass extends AstAnalyzerPass +{ + public function shouldTraverse(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if ($node instanceof \PHPParser_Node_Stmt_Function) { + $function = $this->typeRegistry->getFunctionByNode($node, TypeRegistry::LOOKUP_CACHE_ONLY); + if ($function) { + $this->removeOutCallSites($function); + + // We need to copy over all the current in-call-sites to the non-cached function. + $nonCachedFunction = $this->typeRegistry->getFunctionByNode($node); + $this->copyInCallSites($function, $nonCachedFunction); + } + } else if ($node instanceof \PHPParser_Node_Stmt_Class) { + $class = $this->typeRegistry->getClassByNode($node, TypeRegistry::LOOKUP_CACHE_ONLY); + if ($class) { + $nonCachedClass = $this->typeRegistry->getClassByNode($node); + + foreach ($class->getMethods() as $method) { + // If the method has not been declared in this class, then its out call sites + // are not affected. + if ($method->isInherited()) { + continue; + } + + $this->removeOutCallSites($method->getMethod()); + + if ($nonCachedMethod = $nonCachedClass->getMethod($method->getName())) { + $this->copyInCallSites($method->getMethod(), $nonCachedMethod->getMethod()); + } + } + } + } + + return true; + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + $target = null; + + if ($node instanceof \PHPParser_Node_Expr_FuncCall && $node->name instanceof \PHPParser_Node_Name) { + $target = $this->typeRegistry->getFunction(implode("\\", $node->name->parts)); + } else if ($objType = $this->getReturnType($node)) { + $objType->restrictByNotNull(); + $objType = $objType->toMaybeObjectType(); + if ($objType && null !== $method = $objType->getMethod($node->name)) { + $target = $method->getMethod(); + } + + // TODO: We should also go through unions here to see if there are object types + // for which we can add calls. + } + + if ($target && null !== $source = $this->getSource($t)) { + $site = CallSite::create($source, $target, $this->createArgs($node->args)); + $site->setAstNode($node); + } + } + + protected function getScopeCreator() + { + return new TypedScopeCreator($this->typeRegistry); + } + + private function getReturnType(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_MethodCall: + if ( ! is_string($node->name)) { + return null; + } + + return $node->var->getAttribute('type'); + + case $node instanceof \PHPParser_Node_Expr_StaticCall: + if ( ! is_string($node->name)) { + return null; + } + + return $node->class->getAttribute('type'); + } + + return null; + } + + private function createArgs(array $args) + { + $rs = array(); + foreach ($args as $index => $arg) { + $rs[$index] = new Argument($index); + $rs[$index]->setAstNode($arg); + + if ($type = $arg->getAttribute('type')) { + $rs[$index]->setPhpType($type); + } else { + $rs[$index]->setPhpType($this->typeRegistry->getNativeType('unknown')); + } + } + + return $rs; + } + + /** + * Returns the originating function, or method. + * + * @param NodeTraversal $t + * + * @return AbstractFunction|null + */ + private function getSource(NodeTraversal $t) + { + $root = $t->getScopeRoot(); + + if ($root instanceof \PHPParser_Node_Stmt_Function) { + return $this->typeRegistry->getFunctionByNode($root); + } else if ($root instanceof \PHPParser_Node_Stmt_ClassMethod) { + // If the originating object was not part of this packages' dependencies, or we + // have not scanned it for some other reason, we have to bail out here. + if (null === $thisObject = $t->getScope()->getTypeOfThis()->toMaybeObjectType()) { + return null; + } + + // This could be the case if the same class has been defined more than once. + // We had such cases for example when people add fixtures for code generation to their + // packages, and do not ensure that class names are unique. + if (null === $classMethod = $thisObject->getMethod($root->name)) { + return null; + } + + return $classMethod->getMethod(); + } + + return null; + } + + private function copyInCallSites(AbstractFunction $function, AbstractFunction $nonCachedFunction) + { + foreach ($function->getInCallSites() as $site) { + $source = $site->getSource(); + $args = $site->getArgs()->getValues(); + $args = array_map(function($arg) { return clone $arg; }, $args); + + $source->removeCallSite($site); + CallSite::create($source, $nonCachedFunction, $args); + } + } + + private function removeOutCallSites(AbstractFunction $function) + { + foreach ($function->getOutCallSites() as $site) { + $site->getTarget()->removeCallSite($site); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CallbackAnalysisPassInterface.php b/src/Scrutinizer/PhpAnalyzer/Pass/CallbackAnalysisPassInterface.php new file mode 100644 index 0000000..7d4b2da --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CallbackAnalysisPassInterface.php @@ -0,0 +1,25 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +interface CallbackAnalysisPassInterface extends AnalysisPassInterface +{ + function beforeAnalysis(); + function afterAnalysis(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckAccessControlPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckAccessControlPass.php new file mode 100644 index 0000000..edd6ca4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckAccessControlPass.php @@ -0,0 +1,197 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\Pass\AstAnalyzerPass; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Model\ClassMethod; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +/** + * Access Control Checks + * + * This pass checks that all property accesses, and method calls are allowed from + * the context they are performed in:: + * + * class A + * { + * private $a; + * } + * + * $a = new A(); + * $a->a; // not permitted + * + * @category checks + * @author Johannes M. Schmitt + */ +class CheckAccessControlPass extends AstAnalyzerPass implements AnalyzerAwareInterface, ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('check_access_control', 'array', new NodeBuilder()) + ->attribute('label', 'Access Control related Checks') + ->canBeDisabled() + ; + + return $tb; + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if ( ! $this->getSetting('enabled')) { + return; + } + + $this->checkCall($t, $node); + $this->checkPropertyFetch($t, $node); + } + + protected function getScopeCreator() + { + return new TypedScopeCreator($this->typeRegistry); + } + + private function checkPropertyFetch(NodeTraversal $t, \PHPParser_Node $node) + { + if ( ! $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch + && ! $node instanceof \PHPParser_Node_Expr_PropertyFetch) { + return; + } + + if (null === $property = $this->typeRegistry->getFetchedPropertyByNode($node)) { + return; + } + + if ($property->isPublic()) { + return; + } + + $thisType = $t->getScope()->getTypeOfThis(); + $objType = $property->getClass(); + + if ($property->isPrivate()) { + // For private properties, we need to get the type of the class + // where it was defined. + $objType = $property->getDeclaringClassType(); + + if (null === $thisType || ! $thisType->equals($objType)) { + $this->phpFile->addComment($node->getLine(), $this->createInAccessiblePropertyError($property->getName(), $objType->getName(), 'private')); + + return; + } + + // Check that ``static`` is not used with private properties. + if ($node instanceof \PHPParser_Node_Expr_StaticPropertyFetch + && $node->class instanceof \PHPParser_Node_Name + && 1 === count($node->class->parts) + && 'static' === strtolower($node->class->parts[0])) { + $this->phpFile->addComment($node->getLine(), Comment::error( + 'access_control.static_with_private_property', + 'Since ``$%property_name%`` is declared private, accessing it with ``static`` will lead to errors in possible sub-classes; you can either use ``self``, or increase the visibility of ``$%property_name%`` to at least protected.', + array('property_name' => $property->getName()))); + } + + return; + } + + if ($property->isProtected()) { + if (null === $thisType || ! $thisType->isSubTypeOf($objType)) { + $this->phpFile->addComment($node->getLine(), $this->createInAccessiblePropertyError($property->getName(), $objType->getName(), 'protected')); + } + + return; + } + } + + private function checkCall(NodeTraversal $t, \PHPParser_Node $node) + { + if ( ! $node instanceof \PHPParser_Node_Expr_StaticCall + && ! $node instanceof \PHPParser_Node_Expr_MethodCall) { + return; + } + + $method = $this->typeRegistry->getCalledFunctionByNode($node); + if ( ! $method instanceof ClassMethod) { + return; + } + $type = $method->getClass(); + + if ($method->isPublic()) { + return; + } + + $thisType = $t->getScope()->getTypeOfThis(); + + if ($method->isPrivate()) { + $type = $method->getDeclaringClassType(); + + if (null === $thisType || ! $thisType->equals($type)) { + $this->phpFile->addComment($node->getLine(), $this->createInAccessibleMethodError($method->getMethod()->getName(), $type->getName(), 'private')); + + return; + } + + // Check that ``static`` is not used with private methods. + if ($node instanceof \PHPParser_Node_Expr_StaticCall + && $node->class instanceof \PHPParser_Node_Name + && 1 === count($node->class->parts) + && 'static' === strtolower($node->class->parts[0])) { + $this->phpFile->addComment($node->getLine(), Comment::error( + 'access_control.static_with_private_method', + 'Since ``%method_name%()`` is declared private, calling it with ``static`` will lead to errors in possible sub-classes. You can either use ``self``, or increase the visibility of ``%method_name%()`` to at least protected.', + array('method_name' => $method->getMethod()->getName()))); + } + + return; + } + + if ($method->isProtected()) { + if (null === $thisType || ! $thisType->isSubTypeOf($type)) { + $this->phpFile->addComment($node->getLine(), $this->createInAccessibleMethodError($method->getMethod()->getName(), $type->getName(), 'protected')); + } + + return; + } + + throw new \LogicException('Invalid state.'); + } + + private function createInAccessibleMethodError($methodName, $className, $visibility) + { + return Comment::error( + 'access_control.inaccessible_method', + 'The method "%method_name%()" cannot be called from this context as it is declared %visibility% in class "%class_name%"?', + array('method_name' => $methodName, 'class_name' => $className, 'visibility' => $visibility)); + } + + private function createInAccessiblePropertyError($propertyName, $className, $visibility) + { + return Comment::error( + 'access_control.inaccessible_property', + 'The property "%property_name%" cannot be accessed from this context as it is declared %visibility% in class "%class_name%"?', + array('property_name' => $propertyName, 'class_name' => $className, 'visibility' => $visibility)); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckBasicSemanticsPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckBasicSemanticsPass.php new file mode 100644 index 0000000..ca53ec4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckBasicSemanticsPass.php @@ -0,0 +1,109 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\ClassMethod; + +/** + * Basic Semantic Checks + * + * This pass checks basic PHP semantics such as whether you have defined properties on an interface, or that + * classes with abstract methods must be declared abstract. Most of the errors catched by this pass would lead to + * fatal PHP runtime errors. + * + * @category checks + * @author Johannes M. Schmitt + */ +class CheckBasicSemanticsPass extends AstAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('basic_semantic_checks', 'array', new NodeBuilder()) + ->canBeDisabled(); + + return $tb; + } + + protected function isEnabled() + { + return $this->getSetting('enabled'); + } + + public function visit(NodeTraversal $t, \PHPParser_Node $n, \PHPParser_Node $parent = null) + { + if ($n instanceof \PHPParser_Node_Stmt_Property) { + $containerNode = NodeUtil::getContainer($n)->get(); + $class = $this->typeRegistry->getClassByNode($containerNode); + + if ($class->isInterface()) { + $this->phpFile->addComment($n->getLine(), Comment::error( + 'basic_semantics.property_on_interface', + 'In PHP, declaring a method on an interface is not yet allowed.' + )); + } + } + + if (NodeUtil::isMethodContainer($n)) { + $class = $this->typeRegistry->getClassByNode($n); + + if ($class instanceof Clazz && ! $class->isAbstract()) { + $abstractMethods = array(); + + foreach ($class->getMethods() as $method) { + assert($method instanceof ClassMethod); + /** @var $method ClassMethod */ + + if ($method->isAbstract()) { + $abstractMethods[] = $method->getMethod()->getName(); + } + } + + if ( ! empty($abstractMethods)) { + switch (count($abstractMethods)) { + case 1: + $this->phpFile->addComment($n->getLine(), Comment::error( + 'basic_semantics.abstract_method_on_non_abstract_class', + 'There is one abstract method ``%method%`` in this class; you could implement it, or declare this class as abstract.', + array('method' => reset($abstractMethods)) + )); + break; + + default: + $this->phpFile->addComment($n->getLine(), Comment::error( + 'basic_semantics.abstract_methods_on_non_abstract_class', + 'There is at least one abstract method in this class. Maybe declare it as abstract, or implement the remaining methods: %methods%', + array('methods' => implode(', ', $abstractMethods)) + )); + } + } + } + + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckForTyposPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckForTyposPass.php new file mode 100644 index 0000000..4519233 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckForTyposPass.php @@ -0,0 +1,255 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\Pass\AstAnalyzerPass; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Model\Property; +use Scrutinizer\PhpAnalyzer\Model\Comment; + +/** + * Method, and Property Existence Checks + * + * This pass checks whether a called method, or an accessed property exists. It + * will also try to detect typos if non-existent, and suggest alternatives:: + * + * class A + * { + * private $emptyProperty; + * } + * + * $a = new A(); + * $a->emtpyProperty = 'foo'; // will suggest to fix the properties name + * + * @category checks + * @author Johannes M. Schmitt + */ +class CheckForTyposPass extends AstAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + private $t; + + public function getConfiguration() + { + $tb = new \Symfony\Component\Config\Definition\Builder\TreeBuilder(); + $tb->root('typo_checks', 'array', new NodeBuilder()) + ->attribute('label', 'Check for Typos') + ->canBeDisabled() + ; + + return $tb; + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if ( ! $this->getSetting('enabled')) { + return; + } + + $this->t = $t; + + switch (true) { + case $node instanceof \PHPParser_Node_Expr_PropertyFetch: + $this->checkForMissingProperty($node); + break; + + case $node instanceof \PHPParser_Node_Expr_StaticCall: + case $node instanceof \PHPParser_Node_Expr_MethodCall: + $this->checkForMissingMethod($node); + break; + + // TODO: Check for static property access/static method calls + } + } + + protected function getScopeCreator() + { + return new TypedScopeCreator($this->analyzer->getTypeRegistry()); + } + + private function checkForMissingMethod(\PHPParser_Node $node) + { + assert($node instanceof \PHPParser_Node_Expr_StaticCall + || $node instanceof \PHPParser_Node_Expr_MethodCall); + + if ( ! is_string($node->name)) { + return; + } + + // TODO: Add support for union types. Currently, these are not checked as + // getCalledClassByNode only returns a single object type. + if (null === $objType = $this->typeRegistry->getCalledClassByNode($node)) { + return; + } + + if ( ! $objType->isNormalized() || $objType->hasMethod($node->name)) { + return; + } + + // TODO: Remove once anonymous classes are supported. + if ($objType->isSubTypeOf($this->typeRegistry->getClassOrCreate( + 'PHPUnit_Framework_MockObject_MockObject'))) { + return; + } + + if (null !== $bestName = $this->getMostSimilarName($node->name, $objType->getMethodNames())) { + $this->phpFile->addComment($node->getLine(), Comment::error( + 'typos.misspelled_method_name', + 'The method "%offending_method_name%()" does not exist. Did you maybe mean "%closest_method_name%()"?', + array('offending_method_name' => $node->name, 'closest_method_name' => $bestName))); + } else { + if ($node instanceof \PHPParser_Node_Expr_MethodCall && $objType->hasMethod('__call')) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'strict.maybe_undocumented_call_capability', + 'The method ``%method_name%`` does not exist on ``%type%``? Since you implemented ``__call``, maybe consider adding a [@method annotation](http://www.phpdoc.org/docs/latest/for-users/tags/method.html).', + array('method_name' => $node->name, 'type' => $objType->getDisplayName()))); + + return; + } + + if ($node instanceof \PHPParser_Node_Expr_StaticCall && $objType->hasMethod('__callStatic')) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'strict.maybe_undocumented_static_call_capability', + 'The method ``%method_name%`` does not exist on ``%type%``? Since you implemented ``__callStatic``, maybe consider adding a [@method annotation](http://www.phpdoc.org/docs/latest/for-users/tags/method.html).', + array('method_name' => $node->name, 'type' => $objType->getDisplayName()))); + + return; + } + + $this->phpFile->addComment($node->getLine(), Comment::error( + 'typos.non_existent_method', + 'The method "%method_name%()" does not exist on ``%type%``?', + array('method_name' => $node->name, 'type' => $objType->getDisplayName()))); + } + } + + private function checkForMissingProperty(\PHPParser_Node_Expr_PropertyFetch $node) + { + if (!is_string($node->name)) { + return; + } + + if (!$objType = $node->var->getAttribute('type')) { + return; + } + + $objType = $objType->restrictByNotNull()->toMaybeObjectType(); + if (!$objType) { + // TODO: Add support to check on union types. + return; + } + + if ($objType->isInterface()) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'types.property_access_on_interface', + 'Accessing "%property_name%" on the interface "%interface_name%" suggest that you code against a concrete implementation. How about adding an ``instanceof`` check?', + array('property_name' => $node->name, 'interface_name' => $objType->getName()))); + + return; + } + + if (!$objType->isNormalized() || $objType->hasProperty($node->name)) { + return; + } + + // Ignore all property accesses on ``stdClass`` objects. Currently, we have + // no way to describe, or track RECORD types. As such, any messages related to + // stdClass are likely wrong, but at least there are too many false-positives + // for now. So, we just disable this. + if ($objType->isSubtypeOf($this->typeRegistry->getClassOrCreate('stdClass'))) { + return; + } + + // Ignore all property reads on ``SimpleXMLElement`` objects. The reasoning + // behind this is similar to the exception for ``stdClass`` objects above. + // We simply have no reliable way to describe the structure of these objects + // for now. So, we disable checks for them to avoid a flood of false-positives. + if ( ! \Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::isAssignmentOp($node->getAttribute('parent')) + && $objType->isSubtypeOf($this->typeRegistry->getClassOrCreate('SimpleXMLElement'))) { + return; + } + + // Property accesses inside isset() are safe, do not make any noise just yet. + if ($node->getAttribute('parent') instanceof \PHPParser_Node_Expr_Isset) { + return; + } + + if (null !== $bestName = $this->getMostSimilarName($node->name, $objType->getPropertyNames())) { + $this->phpFile->addComment($node->getLine(), Comment::error( + 'typos.mispelled_property_name', + 'The property "%offending_property_name%" does not exist. Did you mean "%closest_property_name%"?', + array('offending_property_name' => $node->name, 'closest_property_name' => $bestName))); + } else { + // Ignore additional accesses to this property. + $objType->addProperty(new Property($node->name)); + + if (\Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::isAssignmentOp($node->getAttribute('parent'))) { + if ($objType->hasMethod('__set')) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'strict.maybe_undocument_property_write_capability', + 'The property ``%property_name%`` does not exist. Since you implemented ``__set``, maybe consider adding a [@property annotation](http://www.phpdoc.org/docs/latest/for-users/tags/property.html).', + array('property_name' => $node->name))); + + return; + } + } else if ($objType->hasMethod('__get')) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'strict.maybe_undocument_property_read_capability', + 'The property ``%property_name%`` does not exist. Since you implemented ``__get``, maybe consider adding a [@property annotation](http://www.phpdoc.org/docs/latest/for-users/tags/property.html).', + array('property_name' => $node->name))); + + return; + } + + $thisType = $this->t->getScope()->getTypeOfThis(); + if ($thisType && $thisType->equals($objType)) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'strict.undeclared_property', + 'The property "%property_name%" does not exist. Did you maybe forget to declare it?', + array('property_name' => $node->name))); + } else { + $this->phpFile->addComment($node->getLine(), Comment::error( + 'typos.non_existent_property', + 'The property "%property_name%" does not exist.', + array('property_name' => $node->name))); + } + } + } + + public static function getMostSimilarName($name, array $availableNames) + { + $similarity = array(); + foreach ($availableNames as $aName) { + similar_text($name, $aName, $percentage); + $similarity[$aName] = $percentage; + } + + arsort($similarity); + $bestPercentage = reset($similarity); + + if ($bestPercentage < 90) { + return null; + } + + return key($similarity); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckParamExpectsRefPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckParamExpectsRefPass.php new file mode 100644 index 0000000..244be59 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckParamExpectsRefPass.php @@ -0,0 +1,95 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\Pass\AstAnalyzerPass; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +/** + * Parameter Reference Check + * + * Checks parameters of method calls if they expect a reference, and if so asserts + * that the passed argument is a valid reference. + * + * Valid References are: + * + * - Variables, and Properties + * - Array Elements (``$x[$y]``) + * - New Expressions (``new A()``) + * + * @category checks + * @author Johannes M. Schmitt + */ +class CheckParamExpectsRefPass extends AstAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('parameter_reference_check', 'array', new NodeBuilder()) + ->attribute('label', 'Parameter Reference Check') + ->canBeDisabled() + ; + + return $tb; + } + + protected function isEnabled() + { + return $this->getSetting('enabled'); + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if ( ! NodeUtil::isCallLike($node)) { + return; + } + + if (null === $function = $this->typeRegistry->getCalledFunctionByNode($node)) { + return; + } + + foreach ($function->getParameters() as $param) { + if ( ! $param->isPassedByRef()) { + continue; + } + + $index = $param->getIndex(); + if ( ! isset($node->args[$index])) { + continue; + } + + $arg = $node->args[$index]; + if ( ! NodeUtil::canBePassedByRef($arg->value)) { + $this->phpFile->addComment($arg->getLine(), Comment::error( + 'usage.non_referencable_arg', + '``%argument%`` cannot be passed to ``%function_name%()`` as the parameter ``$%parameter_name%`` expects a reference.', + array('argument' => self::$prettyPrinter->prettyPrintExpr($arg->value), + 'function_name' => $function->getName(), + 'parameter_name' => $param->getName()) + )); + } + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckUnreachableCodePass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckUnreachableCodePass.php new file mode 100644 index 0000000..be5b3aa --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckUnreachableCodePass.php @@ -0,0 +1,110 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\AnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\ControlFlow\GraphReachability; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\Traversal\AbstractScopedCallback; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\PhpFile; + +/** + * Unreachable Code Check + * + * This pass checks whether code is reachable by analyzing the control flow graph + * of the program. At the moment, this does not perform any kind of data flow + * analysis. + * + * @category checks + * @author Johannes M. Schmitt + */ +class CheckUnreachableCodePass extends AbstractScopedCallback implements AnalysisPassInterface, ConfigurablePassInterface +{ + use ConfigurableTrait; + + private $file; + private $prettyPrinter; + + public function __construct() + { + $this->prettyPrinter = new \PHPParser_PrettyPrinter_Zend(); + } + + public function getConfiguration() + { + $tb = new \Symfony\Component\Config\Definition\Builder\TreeBuilder(); + $tb->root('unreachable_code', 'array', new NodeBuilder()) + ->attribute('label', 'Un-reachable Code') + ->canBeDisabled() + ; + + return $tb; + } + + public function analyze(File $file) + { + if (!$file instanceof PhpFile) { + return; + } + + if ( ! $this->getSetting('enabled')) { + return; + } + + $this->file = $file; + NodeTraversal::traverseWithCallback($file->getAst(), $this); + } + + public function enterScope(NodeTraversal $t) + { + $r = new GraphReachability($cfg = $t->getControlFlowGraph()); + $r->compute($cfg->getEntryPoint()->getAstNode()); + } + + public function shouldTraverse(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + $graphNode = $t->getControlFlowGraph()->getNode($node); + + if (null !== $graphNode && GraphReachability::UNREACHABLE === $graphNode->getAttribute(GraphReachability::ATTR_REACHABILITY)) { + // Only report error when there are some line number informations. + // There are synthetic nodes with no line number informations, nodes + // introduced by other passes (although not likely since this pass should + // be executed early) or some PHPParser bug. + if (-1 !== $node->getLine()) { + $this->file->addComment($node->getLine(), Comment::warning( + 'usage.unreachable_code', + '``%unreachable_code%`` is not reachable.', + array('unreachable_code' => $this->prettyPrinter->prettyPrint(array($node))))); + + // From now on, we are going to assume the user fixed the error and not + // give more warnings related to code sections reachable from this node. + $r = new GraphReachability($t->getControlFlowGraph()); + $r->recompute($node); + + // Saves time by not traversing children. + return false; + } + } + + return true; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckUsageContextPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckUsageContextPass.php new file mode 100644 index 0000000..a759390 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckUsageContextPass.php @@ -0,0 +1,317 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; +use Scrutinizer\PhpAnalyzer\ArgumentChecker\ArgumentCheckerInterface; +use Scrutinizer\PhpAnalyzer\ArgumentChecker\DefaultArgumentChecker; +use Scrutinizer\PhpAnalyzer\ArgumentChecker\OverloadedCoreFunctionChecker; +use Scrutinizer\PhpAnalyzer\ArgumentChecker\PhpUnitAssertionChecker; +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeChecker; +use Scrutinizer\PhpAnalyzer\Pass\AstAnalyzerPass; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +/** + * Miscellaneous Usage Context Checks + * + * This pass performs a couple of context sensitive usage checks. + * + * 1. Method Calls on Non-Objects + * ------------------------------ + * + * .. code-block :: php + * + * class A + * { + * private $b; + * + * public function __construct(B $b = null) + * { + * $this->b = $b; + * } + * + * public function foo() + * { + * $this->b->bar(); // possible method call on null + * } + * } + * + * 2. Foreach Expression, and Value Variable + * ----------------------------------------- + * Checks that the expression is traversable, and if the variable is passed as + * reference, it also ensures that the expression can be used as a reference. + * + * .. code-block :: php + * + * foreach ($expression as &$variable) { } + * + * 3. Missing Argument on Function/Method Calls + * -------------------------------------------- + * Checks whether a function, or method call misses a required argument. + * + * .. code-block :: php + * + * function foo($a) { } + * foo(); // missing argument + * + * 4. Argument Type Check + * ---------------------- + * Checks whether an argument type can be passed to a function/method. Currently, + * two different levels are supported: + * + * 1. **Strict**: The passed type must be a sub-type of the expected type. + * 2. **Lenient** (default): In lenient mode, we make a few exceptions to the strict sub-type requirement. + * For example, we treat string, integer, and double types as interchangable. So, if a string is + * expected, an integer, or a double would also be acceptable. + * + * .. tip :: + * + * If you have an existing code-base, lenient mode is most likely what you want. If + * you start a new project, using strict type checking is recommended. + * + * @category checks + * @author Johannes M. Schmitt + */ +class CheckUsageContextPass extends AstAnalyzerPass implements ConfigurablePassInterface, AnalyzerAwareInterface +{ + use ConfigurableTrait; + + /** @var TypeChecker */ + private $typeChecker; + + /** @var ArgumentCheckerInterface */ + private $argumentChecker; + + public function setAnalyzer(Analyzer $analyzer) + { + parent::setAnalyzer($analyzer); + + $this->typeChecker = new TypeChecker($this->typeRegistry); + + $this->argumentChecker = new OverloadedCoreFunctionChecker($this->typeRegistry, $this->typeChecker); + $this->argumentChecker->append(new PhpUnitAssertionChecker($this->typeRegistry, $this->typeChecker)); + $this->argumentChecker->append(new DefaultArgumentChecker($this->typeRegistry, $this->typeChecker)); + } + + private function afterConfigSet() + { + $this->typeChecker->setLevel($this->getSetting('argument_type_checks')); + } + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('check_usage_context', 'array', new NodeBuilder()) + ->attribute('label', 'Usage Context') + ->canBeDisabled() + ->children() + ->arrayNode('method_call_on_non_object') + ->addDefaultsIfNotSet() + ->canBeDisabled() + ->children() + ->booleanNode('ignore_null_pointer') + ->info('Does not display a warning when a type such as "object|null" is encountered.') + ->defaultTrue() + ->end() + ->end() + ->end() + ->arrayNode('foreach') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('value_as_reference') + ->defaultTrue() + ->attribute('label', 'Check whether the foreach expression supports a value reference.') + ->end() + ->booleanNode('traversable') + ->defaultTrue() + ->attribute('label', 'Check whether the foreach expression is traversable.') + ->end() + ->end() + ->end() + ->booleanNode('missing_argument') + ->defaultTrue() + ->attribute('label', 'Check whether a method/function call misses a required argument.') + ->end() + ->enumNode('argument_type_checks') + ->defaultValue('lenient') + ->attribute('label', 'Check types of Arguments.') + ->values(array('disabled', 'lenient', 'strict')) + ; + + return $tb; + } + + protected function isEnabled() + { + return true === $this->getSetting('enabled'); + } + + public function shouldTraverse(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if ($node instanceof \PHPParser_Node_Expr_MethodCall) { + $objType = $node->var->getAttribute('type'); + if ($this->getSetting('method_call_on_non_object.enabled') && $objType) { + // By default, we ignore null as it simply occurs too often, and is annoying otherwise. + if ($this->getSetting('method_call_on_non_object.ignore_null_pointer')) { + $objType = $objType->restrictByNotNull(); + } + + if ( ! $objType->matchesObjectContext()) { + $this->phpFile->addComment($node->var->getLine(), Comment::error( + 'usage.method_call_on_non_object', + 'The method ``%method_expr%`` cannot be called on ``%variable_expr%`` (of type ``%type_name%``).', + array('method_expr' => is_string($node->name) ? $node->name : self::$prettyPrinter->prettyPrintExpr($node->name), + 'variable_expr' => self::$prettyPrinter->prettyPrintExpr($node->var), + 'type_name' => (string) $objType))); + } + } + + if ($objType && is_string($node->name)) { + $this->checkMethodParameters($node, $objType, $node->name, $node->args); + } + } else if ($node instanceof \PHPParser_Node_Expr_StaticCall) { + $objType = $node->class->getAttribute('type'); + + if ($objType && is_string($node->name)) { + $this->checkMethodParameters($node, $objType, $node->name, $node->args); + } + } else if ($node instanceof \PHPParser_Node_Expr_FuncCall) { + $this->checkFunctionParameters($node); + } else if ($node instanceof \PHPParser_Node_Stmt_Foreach) { + $this->checkForeach($node); + } + + return true; + } + + public function checkForeach(\PHPParser_Node_Stmt_Foreach $node) + { + if ($this->getSetting('foreach.value_as_reference') && $node->byRef && !NodeUtil::canBePassedByRef($node->expr)) { + $this->phpFile->addComment($node->expr->getLine(), Comment::error( + 'usage_context.foreach_expr_no_reference', + 'The expression ``%expr%`` cannot be used as a reference.', + array('expr' => self::$prettyPrinter->prettyPrintExpr($node->expr)))); + } + + $this->checkTraversable($node); + } + + private function checkTraversable(\PHPParser_Node_Stmt_Foreach $node) + { + if ( ! $this->getSetting('foreach.traversable')) { + return; + } + + $exprType = $node->expr->getAttribute('type'); + if ( ! $exprType || $exprType->isAllType() || $exprType->isTraversable()) { + return; + } + + if ( ! $exprType->isUnionType()) { + $this->phpFile->addComment($node->expr->getLine(), Comment::error( + 'usage_context.foreach_expr_not_traversable', + 'The expression ``%expr%`` of type ``%type%`` is not traversable.', + array('expr' => self::$prettyPrinter->prettyPrintExpr($node->expr), 'type' => (string) $exprType))); + + return; + } + + $this->phpFile->addComment($node->expr->getLine(), Comment::error( + 'usage_context.foreach_expr_not_guaranteed_to_be_traversable', + 'The expression ``%expr%`` of type ``%type%`` is not guaranteed to be traversable. How about adding an additional type check?', + array('expr' => self::$prettyPrinter->prettyPrintExpr($node->expr), 'type' => (string) $exprType))); + } + + private function checkFunctionParameters(\PHPParser_Node_Expr_FuncCall $node) + { + if (!$node->name instanceof \PHPParser_Node_Name) { + return; + } + + $funcName = implode("\\", $node->name->parts); + $function = $this->typeRegistry->getFunction($funcName); + if (!$function) { + return; + } + + $this->checkParameters($node, $function, $node->args); + } + + private function checkMethodParameters(\PHPParser_Node $node, PhpType $objType, $methodName, array $args) + { + $objType = $objType->restrictByNotNull()->toMaybeObjectType(); + if (!$objType) { + return; + } + + if (!$method = $objType->getMethod($methodName)) { + return; + } + + $this->checkParameters($node, $method->getMethod(), $args, $objType); + } + + private function checkParameters(\PHPParser_Node $node, AbstractFunction $function, array $args, \Scrutinizer\PhpAnalyzer\Model\MethodContainer $clazz = null) + { + $missingArgs = $this->argumentChecker->getMissingArguments($function, $args, $clazz); + if ( ! empty($missingArgs)) { + if (count($missingArgs) > 1) { + $this->phpFile->addComment($node->getLine(), Comment::error( + 'usage.missing_multiple_required_arguments', + 'The call to ``%function_name%()`` misses some required arguments starting with ``$%parameter_name%``.', + array('function_name' => $function->getName(), 'parameter_name' => reset($missingArgs)))); + } else { + $this->phpFile->addComment($node->getLine(), Comment::error( + 'usage.missing_required_argument', + 'The call to ``%function_name%()`` misses a required argument ``$%parameter_name%``.', + array('function_name' => $function->getName(), 'parameter_name' => reset($missingArgs)))); + } + } + + if ('disabled' !== $this->getSetting('argument_type_checks')) { + $argTypes = array(); + foreach ($args as $arg) { + $argTypes[] = $arg->getAttribute('type') ?: $this->typeRegistry->getNativeType('unknown'); + } + + $mismatchedTypes = $this->argumentChecker->getMismatchedArgumentTypes($function, $argTypes, $clazz); + foreach ($mismatchedTypes as $index => $type) { + $this->phpFile->addComment($args[$index]->getLine(), Comment::warning( + 'usage.argument_type_mismatch', + '``%expr%`` of type ``%expr_type%`` is not a sub-type of ``%expected_type%``.', + array('expr' => self::$prettyPrinter->prettyPrintExpr($args[$index]->value), + 'expr_type' => (string) $argTypes[$index], + 'expected_type' => (string) $type))); + } + } + } + + protected function getScopeCreator() + { + return new TypedScopeCreator($this->typeRegistry); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckVariablesPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckVariablesPass.php new file mode 100644 index 0000000..412e5be --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckVariablesPass.php @@ -0,0 +1,124 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\Pass\AstAnalyzerPass; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +/** + * Variable Checks + * + * This pass performs syntactical variable checks:: + * + * function foo() { + * echo $a; // $a was not defined. + * } + * + * function bar($artificial) { + * if ($artifical) { // will suggest to rename to $artificial + * // do something + * } + * } + * + * It also performs a limited analysis to check that arrays have been initialized + * before they are written to:: + * + * function foo() { + * $a[] = 'foo'; // will suggest to add $a = array(); before + * } + * + * At the moment, this does not perform a full-blown data flow analysis, so currently + * it will not catch things that only may be defined, like in this example:: + * + * function foo($a) { + * if ($a || 'foo' === $b = some_function()) { + * echo $b; // $b is not always defined + * } + * } + * + * @category checks + * @author Johannes M. Schmitt + */ +class CheckVariablesPass extends AstAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('check_variables', 'array', new NodeBuilder()) + ->attribute('label', 'Variable Checks') + ->canBeDisabled() + ; + + return $tb; + } + + protected function isEnabled() + { + return $this->getSetting('enabled'); + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + // Consider only non-dynamic variables in this pass. + if ( ! $node instanceof \PHPParser_Node_Expr_Variable || ! is_string($node->name)) { + return; + } + + // We ignore PHP globals. + if (NodeUtil::isSuperGlobal($node)) { + return; + } + + // Ignore variables which are defined here. + if ($parent instanceof \PHPParser_Node_Expr_Assign && $parent->var === $node) { + return; + } + + if ( ! $t->getScope()->isDeclared($node->name)) { + if ($bestName = CheckForTyposPass::getMostSimilarName($node->name, $t->getScope()->getVarNames())) { + $this->phpFile->addComment($node->getLine(), Comment::error( + 'typos.mispelled_variable_name', + 'The variable ``%offending_variable_name%`` does not exist. Did you mean ``%closest_variable_name%``?', + array('offending_variable_name' => '$'.$node->name, 'closest_variable_name' => '$'.$bestName))); + } else { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'usage.undeclared_variable', + 'The variable ``%variable_name%`` does not exist. Did you forget to declare it?', + array('variable_name' => '$'.$node->name))); + } + + return; + } + + if ($parent instanceof \PHPParser_Node_Expr_ArrayDimFetch + && $node->getAttribute('array_initializing_variable') + && $parent->var === $node) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'usage.non_initialized_array', + '``%array_fetch_expr%`` was never initialized. Although not strictly required by PHP, it is generally a good practice to add ``%array_fetch_expr% = array();`` before regardless.', + array('array_fetch_expr' => self::$prettyPrinter->prettyPrintExpr($node)))); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePass.php new file mode 100644 index 0000000..3252ae2 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePass.php @@ -0,0 +1,264 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use JMS\PhpManipulator\TokenStream\AbstractToken; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use JMS\PhpManipulator\TokenStream\LiteralToken; +use JMS\PhpManipulator\TokenStream\PhpToken; +use Scrutinizer\PhpAnalyzer\Model\ClassMethod; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\Comment; + +/** + * Style Checks + * + * Performs various style related checks which are highly configurable. At the + * moment mostly naming related checks are implemented (see the reference). + * + * @internal + * Most of these checks are shamelessly taken from the Eclipse Checkstyle plugin. + * + * @see http://checkstyle.sourceforge.net/checks.html + * @category checks + * @author Johannes M. Schmitt + */ +class CheckstylePass extends SuccessiveTokenAndAstAnalzyer implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function __construct() + { + parent::__construct(); + $this->stream->setIgnoreWhitespace(false); + } + + protected function isEnabled() + { + return true === $this->getSetting('enabled'); + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_Variable: + if (NodeUtil::isSuperGlobal($node)) { + return; + } + + if (is_string($node->name)) { + $this->checkNaming($node->getLine(), '$'.$node->name, $node->name, 'local_variable'); + } + break; + + case $node instanceof \PHPParser_Node_Stmt_PropertyProperty: + $this->checkNaming($node->getLine(), '$'.$node->name, $node->name, 'property_name'); + break; + + case $node instanceof \PHPParser_Node_Stmt_Function: + case $node instanceof \PHPParser_Node_Stmt_ClassMethod: + $function = $this->typeRegistry->getFunctionByNode($node); + + // If a class method is constrained by a contract of an interface, or an abstract + // class, then there is no point in adding warnings for them. + if ($function instanceof ClassMethod && $function->isConstrainedByContract()) { + break; + } + + $this->checkNaming($node->getLine(), 'function '.$node->name.'()', $node->name, 'method_name'); + + if (null !== $function && (null !== $returnType = $function->getReturnType()) && $returnType->isBooleanType()) { + $this->checkNaming($node->getLine(), 'function '.$node->name.'()', $node->name, 'isser_method_name'); + } + + $this->checkParameters($node->params); + break; + + case $node instanceof \PHPParser_Node_Expr_Closure: + $this->checkParameters($node->params); + break; + + case NodeUtil::isMethodContainer($node): + $class = $this->typeRegistry->getClassByNode($node)->toMaybeObjectType(); + + if ($class) { + $this->checkNaming($node->getLine(), $class->getShortName(), $class->getShortName(), 'type_name'); + + if ($class->isInterface()) { + $this->checkNaming($node->getLine(), $class->getShortName(), $class->getShortName(), 'interface_name'); + } elseif ($class instanceof Clazz) { + if ($class->isUtilityClass()) { + $this->checkNaming($node->getLine(), $class->getShortName(), $class->getShortName(), 'utility_class_name'); + } elseif ($class->isAbstract()) { + $this->checkNaming($node->getLine(), $class->getShortName(), $class->getShortName(), 'abstract_class_name'); + } + + // No Else-If here as there might be an abstract exception. + // TODO: isSubtype needs to return a TernaryValue so that we + // can decide here what to do in the unknown case. +// if ($class->isSubTypeOf($this->typeRegistry->getClassOrCreate('Exception'))) { +// $this->checkNaming($node->getLine(), $class->getShortName(), $class->getShortName(), 'exception_name'); +// } + } + + // The original check only allows final classes to have a private + // constructor. We also allow the constructor to be private if it + // is declared final, and the class is declared abstract. This is + // for example a common practice for utility classes. + $method = $class->getMethod('__construct'); + if (null !== $method && $method->isPrivate() && ! $class->isFinal() + && ( ! $method->isFinal() || ! $class->isAbstract())) + + if (($method = $class->getMethod('__construct')) + && $method->isPrivate() && !$class->isFinal() + && (!$method->isFinal() || !$class->isAbstract())) { + + if ($method->isFinal()) { + if ($class->isUtilityClass()) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'coding_style.non_abstract_util_class', + 'Since you have declared the constructor as final, and this seems like a utility class, maybe you should also declare the class as abstract.')); + } else { + if (null === $method->getAstNode()) { + break; + } + + $this->phpFile->addComment($method->getAstNode()->getLine(), Comment::warning( + 'coding_style.non_util_class_with_final_private_constructor', + 'Instead of declaring the constructor as final, maybe you should declare the entire class as final.')); + } + } elseif ($class->isAbstract()) { + if ($class->isUtilityClass()) { + $this->phpFile->addComment($method->getAstNode()->getLine(), Comment::warning( + 'coding_style.util_class_with_non_final_constructor', + 'Since you have declared this class abstract, and the constructor is private, maybe you should also declare the constructor as final.')); + } else { + $this->phpFile->addComment($method->getAstNode()->getLine(), Comment::warning( + 'coding_style.abstract_non_util_class_with_private_constructor', + 'Something seems to be off here. Are you sure you want to declare the constructor as private, and the class as abstract?')); + } + } else { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'coding_style.non_final_class_with_private_constructor', + 'Since you have declared the constructor as private, maybe you should also declare the class as final.')); + } + } + } + + break; + } + } + + protected function analyzeStream() + { + while ($this->stream->moveNext()) { + if ($this->stream->token->isLastTokenOnLine()) { + if ($this->getSetting('no_trailing_whitespace') + && preg_match('/^(?: \t)+(?:\n|$)/', $this->stream->token->getContent())) { + $this->phpFile->addComment($this->stream->token->getLine(), Comment::warning( + 'coding_style.trailing_whitespace', + 'Could you remove the trailing whitespace on this line?')); + } + } + + if ($this->stream->token instanceof LiteralToken + || $this->stream->token instanceof \JMS\PhpManipulator\TokenStream\MarkerToken) { + continue; + } elseif ($this->stream->token instanceof PhpToken) { + switch ($this->stream->token->getType()) { + case T_IF: + $this->stream->skipUntil('('); + $startToken = $this->stream->token; + $this->stream->skipCurrentBlock(); + $endToken = $this->stream->token; + $this->stream->skipUntil('{'); + $curlyToken = $this->stream->token; + + // Deactivated for now. There is a problem that the configuration for + // left curly braces cannot be correctly displayed. + break; + $this->checkLeftCurlyPlacement($startToken, $endToken, $curlyToken, $this->getSetting('left_curly.if')); + + break; + } + } else { + throw new \RuntimeException('Unknown token.'); + } + } + } + + private function checkLeftCurlyPlacement(AbstractToken $startToken, AbstractToken $endToken, AbstractToken $curlyToken, $config) + { + if ('new line on wrap' === $config) { + $config = $startToken->getLine() === $endToken->getLine() + ? 'same line' : 'new line'; + } + + switch ($config) { + case 'same line': + if ($endToken->getLine() !== $curlyToken->getLine()) { + $this->phpFile->addComment($curlyToken->getLine(), Comment::warning( + 'coding_style.token_should_be_on_same_line', + '``%token%`` should probably be on the same line like ``%end_token%``.', + array('token' => $curlyToken->getContent(), 'end_token' => $endToken->getContent()))->varyIn(array())); + } + break; + + case 'new line': + if ($endToken->getLine() + 1 !== $curlyToken->getLine()) { + $this->phpFile->addComment($curlyToken->getLine(), Comment::warning( + 'coding_style.token_should_be_on_new_line', + '``%token`` should probably be on a new line after ``%end_token%``.', + array('token' => $curlyToken->getContent(), 'end_token' => $endToken->getContent()))->varyIn(array())); + } + + break; + + default: + throw new \InvalidArgumentException(sprintf('Unknown left curly setting "%s".', $config)); + } + } + + private function checkParameters(array $params) + { + foreach ($params as $param) { + assert($param instanceof \PHPParser_Node_Param); + $this->checkNaming($param->getLine(), '$'.$param->name, $param->name, 'parameter_name'); + } + } + + /** + * @param integer $line + * @param string $type + */ + private function checkNaming($line, $code, $name, $type) + { + if ( ! $this->getSetting('naming.enabled')) { + return; + } + + if (!preg_match('#'.str_replace('#', '\\#', $this->getSetting('naming.'.$type)).'#', $name)) { + $this->phpFile->addComment($line, Comment::warning( + 'coding_style.naming', + '``%code%`` does not seem to conform to the naming convention (``%regex%``).', + array('code' => $code, 'regex' => $this->getSetting('naming.'.$type)))->varyIn(array('regex'))); + } + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePassConfiguration.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePassConfiguration.php new file mode 100644 index 0000000..ae86e60 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePassConfiguration.php @@ -0,0 +1,106 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Symfony\Component\Config\Definition\Builder\EnumNodeDefinition; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Symfony\Component\Config\Definition\ConfigurationInterface; + +class CheckstylePassConfiguration implements ConfigurationInterface +{ + public function getConfigTreeBuilder() + { + $tb = new TreeBuilder(); + + $rootBuilder = $tb->root('checkstyle', 'array', new NodeBuilder()) + ->attribute('label', 'Style Checks') + ->canBeEnabled() + ->children() + ->booleanNode('no_trailing_whitespace') + ->defaultTrue() + ->attribute('label', 'No trailing whitespace') + ->end() + ; + +// $this->addLCurlyConfig($rootBuilder); + $this->addNamingConfig($rootBuilder); + + return $tb; + + } + + private function addLCurlyConfig(NodeBuilder $rootBuilder) + { + $leftCurlyNode = $rootBuilder + ->arrayNode('left_curly') + ->addDefaultsIfNotSet() + ->children(); + + $stmts = array( + 'if' => 'same line', + 'elseif' => 'same line', + 'else' => 'same line', + 'class' => 'new line', + 'interface' => 'new line', + 'trait' => 'new line', + 'catch' => 'same line', + 'for' => 'same line', + 'foreach' => 'same line', + 'switch' => 'same line', + 'try' => 'same line', + 'while' => 'same line', + 'function' => 'new line', + 'do' => 'same line', + ); + + foreach ($stmts as $stmt => $defValue) { + $def = new EnumNodeDefinition($stmt); + $def->values(array('same line', 'new line', 'new line on wrap')); + $def->defaultValue($defValue); + $leftCurlyNode->append($def); + } + } + + private function addNamingConfig(NodeBuilder $rootBuilder) + { + $naming = array( + 'local_variable' => '^[a-z][a-zA-Z0-9]*$', + 'abstract_class_name' => '^Abstract|Factory$', + 'utility_class_name' => 'Utils?$', + 'constant_name' => '^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$', + 'property_name' => '^[a-z][a-zA-Z0-9]*$', + 'method_name' => '^(?:[a-z]|__)[a-zA-Z0-9]*$', + 'parameter_name' => '^[a-z][a-zA-Z0-9]*$', + 'interface_name' => '^[A-Z][a-zA-Z0-9]*Interface$', + 'type_name' => '^[A-Z][a-zA-Z0-9]*$', + 'exception_name' => '^[A-Z][a-zA-Z0-9]*Exception$', + 'isser_method_name' => '^(?:is|has|should|may|supports)', + ); + + $namingNode = $rootBuilder->arrayNode('naming') + ->addDefaultsIfNotSet() + ->canBeDisabled() + ->children(); + + foreach ($naming as $k => $def) { + $namingNode->scalarNode($k)->defaultValue($def); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/ConfigurablePassInterface.php b/src/Scrutinizer/PhpAnalyzer/Pass/ConfigurablePassInterface.php new file mode 100644 index 0000000..c29530c --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/ConfigurablePassInterface.php @@ -0,0 +1,46 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +/** + * Interface for passes that want to expose configurable options. + * + * @author Johannes M. Schmitt + */ +interface ConfigurablePassInterface extends AnalysisPassInterface +{ + /** + * Returns the available configuration options for this pass. + * + * Passes usually should come with a default configuration, and not have + * any required values which first need to be entered by the user. + * + * @return TreeBuilder + */ + function getConfiguration(); + + /** + * Sets the concrete values entered by the user. + * + * @param array $values + */ + function setConfigurationValues(array $values); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/ConfigurableTrait.php b/src/Scrutinizer/PhpAnalyzer/Pass/ConfigurableTrait.php new file mode 100644 index 0000000..ddec04e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/ConfigurableTrait.php @@ -0,0 +1,87 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Symfony\Component\Config\Definition\ConfigurationInterface; + +trait ConfigurableTrait +{ + private $cfgValues; + + public function setConfigurationValues(array $values) + { + $this->cfgValues = $values; + + $this->afterConfigSet(); + } + + public function getConfiguration() + { + if ( ! class_exists($configClass = get_class($this).'Configuration')) { + throw new \RuntimeException(sprintf('The configuration class "%s" does not exist.', $configClass)); + } + + $configuration = new $configClass(); + if ( ! $configuration instanceof ConfigurationInterface) { + throw new \RuntimeException(sprintf('"%s" must implement "Symfony\Component\Config\Definition\ConfigurationInterface".', $configClass)); + } + + return $configuration->getConfigTreeBuilder(); + } + + private function afterConfigSet() + { + } + + private function getSettingOrElse($path, $default = null) + { + $value = $this->cfgValues; + foreach (explode(".", $path) as $pathElem) { + if ( ! is_array($value)) { + return $default; + } + + if ( ! array_key_exists($pathElem, $value)) { + return $default; + } + + $value = $value[$pathElem]; + } + + return $value; + } + + private function getSetting($path) + { + $value = $this->cfgValues; + foreach (explode(".", $path) as $pathElem) { + if ( ! is_array($value)) { + throw new \InvalidArgumentException(sprintf('The key "%s" does not exist for path "%s" as the value is not an array.', $pathElem, $path)); + } + + if ( ! array_key_exists($pathElem, $value)) { + throw new \InvalidArgumentException(sprintf('The key "%s" does not exist for path "%s".', $pathElem, $path)); + } + + $value = $value[$pathElem]; + } + + return $value; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/DeadAssignmentsDetectionPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/DeadAssignmentsDetectionPass.php new file mode 100644 index 0000000..b6796bf --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/DeadAssignmentsDetectionPass.php @@ -0,0 +1,236 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowGraph; +use Scrutinizer\PhpAnalyzer\DataFlow\DataFlowAnalysis; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\DataFlow\LiveVariableAnalysis\LiveVariablesAnalysis; +use Scrutinizer\PhpAnalyzer\Model\Comment; + +/** + * Dead Assignments Detection + * + * This pass performs a backward dataflow analysis, commonly referred to as + * `live variable analysis `_, to + * detect dead assignments:: + * + * function foo($foo) { + * $a = 'foo'; // $a is never used, it's assignment is "dead". + * + * echo $foo; + * } + * + * It also detects dead assignments in ``list()`` assignments. + * + * @category checks + * @author Johannes M. Schmitt + */ +class DeadAssignmentsDetectionPass extends AstAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + private $liveness; + + public function getConfiguration() + { + $tb = new \Symfony\Component\Config\Definition\Builder\TreeBuilder(); + $tb->root('dead_assignments', 'array', new NodeBuilder()) + ->attribute('label', 'Dead Assignment Detection') + ->canBeDisabled() + ; + + return $tb; + } + + protected function isEnabled() + { + return true === $this->getSetting('enabled'); + } + + public function enterScope(NodeTraversal $t) + { + $scope = $t->getScope(); + $cfg = $t->getControlFlowGraph(); + + $this->liveness = new LiveVariablesAnalysis($cfg, $scope); + $this->liveness->analyze(); + + $this->tryRemoveDeadAssignments($t, $cfg); + } + + private function tryRemoveDeadAssignments(NodeTraversal $t, ControlFlowGraph $cfg) + { + $nodes = $cfg->getDirectedGraphNodes(); + + foreach ($nodes as $cfgNode) { + $inState = $cfgNode->getAttribute(DataFlowAnalysis::ATTR_FLOW_STATE_IN); + $outState = $cfgNode->getAttribute(DataFlowAnalysis::ATTR_FLOW_STATE_OUT); + $n = $cfgNode->getAstNode(); + + if (null === $n) { + continue; + } + + switch (true) { + case $n instanceof \PHPParser_Node_Stmt_If: + case $n instanceof \PHPParser_Node_Stmt_ElseIf: + case $n instanceof \PHPParser_Node_Stmt_While: + case $n instanceof \PHPParser_Node_Stmt_Do: + case $n instanceof \PHPParser_Node_Stmt_For: + case $n instanceof \PHPParser_Node_Stmt_Switch: + case $n instanceof \PHPParser_Node_Stmt_Case: + if (null !== $condition = NodeUtil::getConditionExpression($n)) { + $this->tryRemoveAssignment($t, $condition, null, $inState, $outState); + } + continue 2; + + case $n instanceof \PHPParser_Node_Stmt_Return: + if (null !== $n->expr) { + $this->tryRemoveAssignment($t, $n->expr, null, $inState, $outState); + } + continue 2; + } + + $this->tryRemoveAssignment($t, $n, null, $inState, $outState); + } + } + + private function tryRemoveAssignment(NodeTraversal $t, \PHPParser_Node $n, \PHPParser_Node $exprRoot = null, $inState, $outState) + { + $parent = $n->getAttribute('parent'); + + if (NodeUtil::isAssignmentOp($n)) { + $lhs = $n->var; + $rhs = $n->expr; + + if ($n instanceof \PHPParser_Node_Expr_AssignList) { + $i = 0; + foreach ($n->vars as $var) { + if (null === $var) { + $i += 1; + + continue; + } + + $newNode = new \PHPParser_Node_Expr_Assign($var, new \PHPParser_Node_Expr_ArrayDimFetch($rhs, new \PHPParser_Node_Scalar_LNumber($i)), $n->getLine()); + $newNode->setAttribute('is_list_assign', true); + + $this->tryRemoveAssignment($t, + $newNode, + $exprRoot, + $inState, + $outState); + $i += 1; + } + + return; + } + + // Recurse first. Example: dead_x = dead_y = 1; We try to clean up dead_y first. + if (null !== $rhs) { + $this->tryRemoveAssignment($t, $rhs, $exprRoot, $inState, $outState); + $rhs = $lhs->getAttribute('next'); + } + + $scope = $t->getScope(); + if (!$lhs instanceof \PHPParser_Node_Expr_Variable + || !is_string($lhs->name)) { + return; + } + + if (!$scope->isDeclared($lhs->name)) { + return; + } + + if (in_array($lhs->name, NodeUtil::$superGlobalNames, true)) { + return; + } + + $var = $scope->getVar($lhs->name); + $escaped = $this->liveness->getEscapedLocals(); + if (isset($escaped[$var])) { + return; // Local variable that might be escaped due to closures. + } + + // If we have an identity assignment such as a=a, always remove it + // regardless of what the liveness results because it does not + // change the result afterward. + if (null !== $rhs && $rhs instanceof \PHPParser_Node_Expr_Variable + && $var->getName() === $rhs->name + && $n instanceof \PHPParser_Node_Expr_Assign) { + $this->phpFile->addComment($n->getLine(), Comment::warning( + 'dead_assignment.assignment_to_itself', + 'Why assign ``%variable%`` to itself?', + array('variable' => '$'.$rhs->name))); + + return; + } + + // At the moment we miss some dead assignments if a variable is killed, + // and defined in the same node of the control flow graph. + // Example: $a = 'foo'; return $a = 'bar'; + + if ($outState->isLive($var)) { + return; // Variable is not dead. + } + + // Assignments to references do not need to be used in the + // current scope. + if ($var->isReference()) { + return; + } + +// if ($inState->isLive($var) +// /*&& $this->isVariableStillLiveWithinExpression($n, $exprRoot, $var->getName()) */) { + // The variable is killed here but it is also live before it. + // This is possible if we have say: + // if ($X = $a && $a = $C) {..} ; .......; $a = $S; + // In this case we are safe to remove "$a = $C" because it is dead. + // However if we have: + // if ($a = $C && $X = $a) {..} ; .......; $a = $S; + // removing "a = C" is NOT correct, although the live set at the node + // is exactly the same. + // TODO: We need more fine grain CFA or we need to keep track + // of GEN sets when we recurse here. Maybe add the comment anyway, and let the user decide? +// return; +// } + + if ($n instanceof \PHPParser_Node_Expr_Assign) { + if ($n->getAttribute('is_list_assign', false)) { + $this->phpFile->addComment($n->getLine(), Comment::warning( + 'dead_assignment.unnecessary_list_assign', + 'The assignment to ``$%variable%`` is dead. Consider omitting it like so ``list($first,,$third)``.', + array('variable' => $var->getName()))); + + return; + } + + $this->phpFile->addComment($n->getLine(), Comment::warning( + 'dead_assignment.unnecessary_var_assign', + 'The assignment to ``$%variable%`` is dead and can be removed.', + array('variable' => $var->getName()))); + + return; + } + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/DocCommentFixingPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/DocCommentFixingPass.php new file mode 100644 index 0000000..69ac87e --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/DocCommentFixingPass.php @@ -0,0 +1,656 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; + +/** + * Documentation Type Fixes + * + * This pass performs a couple of type related checks around the doc comments, + * ``@param`` and ``@return``. + * + * 1. Correction of Existing Comments + * ---------------------------------- + * If you already have added doc comments, it will check whether the comment + * still matches the code, and suggest a fix if not. It will also detect typos + * in parameter names, and suggest fixes for that. + * + * 2. Addition of New Comments + * --------------------------- + * In certain cases, it will also suggest to add a doc comment. At the moment, + * it only suggest to add comments if the type cannot be inferred from the + * immediate code. Then, it will checks the call-sites to see what types are + * passed, and suggest this as types:: + * + * function foo(A $a, $b) { } + * foo(new A(), 'foo'); + * + * In the example above, it would suggest to add ``@param string $b``, but it would + * not suggest to add a doc comment for ``$a`` because that is already clear from the + * type-hint on the parameter itself. The reasoning behind this is that it doesn't + * want to "clutter" your code with redundant information. + * + * @category fixes + * @author Johannes M. Schmitt + */ +class DocCommentFixingPass extends FixingAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + private $commentParser; + + public function setAnalyzer(\Scrutinizer\PhpAnalyzer\Analyzer $analyzer) + { + parent::setAnalyzer($analyzer); + $this->commentParser = new \Scrutinizer\PhpAnalyzer\PhpParser\DocCommentParser($this->registry); + } + + protected function analyzeStream() + { + while ($this->stream->moveNext()) { + if ($this->stream->token->matches(T_FUNCTION)) { + // Check if there is a doc comment. + $maybeDocCommentToken = $this->stream->token->findPreviousToken(T_DOC_COMMENT); + if ($maybeDocCommentToken->isDefined() && $maybeDocCommentToken->get()->getValue() === $this->stream->node->getDocComment()) { + $this->checkDocComment($maybeDocCommentToken->get(), $this->stream->node); + } else { + $this->addDocCommentIfValuable(); + } + } + } + } + + protected function isEnabled() + { + return true === $this->getSetting('enabled'); + } + + private function addDocCommentIfValuable() + { + // No doc comment was found, let's see whether we need, and actually can + // create something useful. + list($function, $importedNamespaces, $class) = $this->getFunctionAndNamespaces($this->stream->node); + if (null === $function) { + return; + } + + $paramAnnotations = array(); + foreach ($this->stream->node->params as $i => $param) { + $functionParameter = $function->getParameter($i); + if (null === $functionParameter) { + if (null === $class) { + $this->analyzer->logger->error(sprintf('The function "%s" does not have a parameter with index %d.', $function->getName(), $i)); + } else { + $this->analyzer->logger->error(sprintf('The method %s::%s does not have a parameter with index %d.', $class->getName(), $function->getName(), $i)); + } + + continue; + } + + $paramType = $functionParameter->getPhpType(); + + // The ALL type is not ignored here as we have no doc comment, and all + // parameters are assumed to be of that type if we have nothing more precise. + if (null !== $paramType && ! $paramType->isUnknownType() && ! $paramType->isAllType()) { + continue; + } + + $inferredType = $this->inferTypeForParameter($function, $function->getParameter($i)); + if (null === $inferredType) { + continue; + } + + $function->getParameter($i)->setPhpType($inferredType); + $paramAnnotations[$param->name] = $inferredType->getDocType($importedNamespaces); + } + + $returnDocType = $this->tryGettingMoreSpecificType(null, $function->getReturnType(), $function, $importedNamespaces, $class, 'Return'); + if ($returnDocType) { + $function->setReturnType($returnDocType); + } + + $this->addDocComment($importedNamespaces, $paramAnnotations, $returnDocType); + } + + private function addDocComment(array $importedNamespaces, array $paramAnnotations, PhpType $returnDocType = null) + { + if (! $paramAnnotations && ! $returnDocType) { + return; + } + + $startToken = $this->stream->token; + $this->stream->token->findPreviousToken(function(\JMS\PhpManipulator\TokenStream\AbstractToken $token) use (&$startToken) { + $maybePreviousToken = $token->getPreviousToken(); + if ($maybePreviousToken->isEmpty()) { + return true; + } + $previousToken = $maybePreviousToken->get(); + + if ( ! $previousToken->matches(T_PUBLIC) && ! $previousToken->matches(T_PRIVATE) + && ! $previousToken->matches(T_PROTECTED) && ! $previousToken->matches(T_FINAL) + && ! $previousToken->matches(T_STATIC) && ! $previousToken->matches(T_ABSTRACT) + && ! $previousToken->matches(T_WHITESPACE)) { + return true; + } + + if ( ! $token->matches(T_WHITESPACE)) { + $startToken = $token; + } + + return false; + }); + + $indentation = ''; + $lineStartToken = $startToken; + while ( ! $lineStartToken->isFirstTokenOnLine()) { + $lineStartToken = $lineStartToken->getPreviousToken()->get(); + + // If we go over non-whitespace while searching for the beginning of the + // line, then the code looks weird. We just bail out in that case, and + // do not add any comment. + if ( ! $lineStartToken->matches(T_WHITESPACE)) { + return; + } + + $indentation .= $lineStartToken->getValue(); + } + + $comment = "/**\n"; + foreach ($paramAnnotations as $paramName => $type) { + $comment .= $indentation." * @param $type \$$paramName\n"; + } + + if ($returnDocType) { + if ($paramAnnotations) { + $comment .= $indentation." *\n"; + } + + $comment .= $indentation." * @return ".$this->getReturnTypeAsString($returnDocType, $importedNamespaces)."\n"; + } + + $comment .= $indentation." */"; + + $this->stream->insertTokensBefore($startToken, array( + array(T_DOC_COMMENT, $comment), + array(T_WHITESPACE, "\n".$indentation), + )); + } + + /** + * @param boolean $allowNull + */ + private function refineTypeForAnnotation(PhpType $type, $allowNull = false) + { + if ($type->isNullType()) { + return $allowNull ? $type : null; + } + + if ($type->isUnknownType() || $type->isNoType() || $type->isAllType()) { + return null; + } + + // Just adding "false" does not make much sense as it could simply be omitted, + // so let's at least widen it a bit and assume boolean. + if ($type->isFalse()) { + return $this->registry->getNativeType('boolean'); + } + + return $type; + } + + private function getFunctionAndNamespaces(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Stmt_Function: + $function = $this->registry->getFunctionByNode($node); + $importedNamespaces = $function->getImportedNamespaces(); + + return array($function, $importedNamespaces, null); + + case $node instanceof \PHPParser_Node_Stmt_ClassMethod: + $class = $this->registry->getClassByNode($node->getAttribute('parent')->getAttribute('parent')); + $importedNamespaces = $class->getImportedNamespaces(); + if (null === $classMethod = $class->getMethod($node->name)) { + return array(null, array(), null); + } + + return array($classMethod->getMethod(), $importedNamespaces, $class); + + case $node instanceof \PHPParser_Node_Expr_Closure: + return array(null, array(), null); + + default: + throw new \LogicException('The previous cases were exhaustive.'); + } + } + + private function checkDocComment(\JMS\PhpManipulator\TokenStream\PhpToken $token, \PHPParser_Node $node) + { + list($function, $importedNamespaces, $class) = $this->getFunctionAndNamespaces($node); + if (null === $function) { + return; + } + + $comment = $token->getValue(); + + $this->removeOrRenameNonExistentParams($node, $comment); + + // Check parameters. + foreach ($node->params as $i => $param) { + $docType = $this->commentParser->getTypeFromParamAnnotation($node, $param->name); + $functionParameter = $function->getParameter($i); + if (null === $functionParameter) { + if (null === $class) { + $this->analyzer->logger->error(sprintf('The function "%s" does not have a parameter with index %d.', $function->getName(), $i)); + } else { + $this->analyzer->logger->error(sprintf('The method %s::%s does not have a parameter with index %d.', $class->getName(), $function->getName(), $i)); + } + + continue; + } + + $actualType = $functionParameter->getPhpType(); + $actualDocType = $actualType->getDocType($importedNamespaces); + + if ($docType && $docType->getDocType($importedNamespaces) !== $actualDocType + && ! $actualType->isUnknownType() && ! $actualType->isNoType()) { + $comment = preg_replace_callback('/(@param\s+)(?:([^\s]+)(\s+\$'.preg_quote($param->name, '/').')|('.preg_quote($param->name, '/').'\s+)([^\s\*][^\s]+))(\s|$)/im', + function($match) use ($actualDocType) { + // Form: @param type $paramName + if (!empty($match[2])) { + $match[2] = $actualDocType; + + return $match[1].$actualDocType.$match[3].$match[6]; + } + + // Form: @param paramName type + return $match[1].$match[4].$actualDocType. $match[6]; + }, $comment); + } elseif ( ! $docType && ($actualType->isUnknownType() || $actualType->isAllType() || $actualType === $this->registry->getNativeType('array'))) { + $inferredType = $this->inferTypeForParameter($function, $functionParameter); + + if ($inferredType) { + $functionParameter->setPhpType($inferredType); + $this->addParamAnnotation($comment, $param->name, $inferredType->getDocType($importedNamespaces)); + } + } + } + + $actualReturnType = $function->getReturnType(); + // If the method is defined by an interface, or an abstract method of a parent class, + // we will assume that to be the actual return type for the purposes of this fixer. + if ($class instanceof Clazz && null !== $defMethod = $class->getContractDefiningMethod($function->getName())) { + $actualReturnType = $defMethod->getReturnType(); + } + + // Check return type. + $moreSpecificReturnType = $this->tryGettingMoreSpecificType( + $docType = $this->commentParser->getTypeFromReturnAnnotation($node), + $actualReturnType, + $function, + $importedNamespaces, + $class, + 'Return' + ); + $this->addOrUpdateReturnType($comment, $moreSpecificReturnType, $function, $importedNamespaces, $class); + + $token->setValue($comment); + } + + private function getReturnTypeAsString(PhpType $type, array $importedNamespaces) + { + if ($type->isNullType() || $type->isNoType()) { + return 'void'; + } + + return $type->getDocType($importedNamespaces); + } + + private function addOrUpdateReturnType(&$comment, PhpType $moreSpecificType = null, AbstractFunction $function, array $importedNamespaces, MethodContainer $class = null) + { + if (null === $moreSpecificType) { + return; + } + + $function->setReturnType($moreSpecificType); + $typeStr = $this->getReturnTypeAsString($moreSpecificType, $importedNamespaces); + + if (preg_match('/@return\s+[^\s]+/', $comment)) { + $comment = preg_replace('/(@return\s+)[^\s]+/', '\\1'.$typeStr, $comment); + + return; + } + + $comment = preg_replace('#^(\s+)\*/#m', "\\1* @return ".$typeStr."\n\\0", $comment); + } + + /** + * @param string $type + * + * @return null|PhpType + */ + private function tryGettingMoreSpecificType(PhpType $docType = null, PhpType $actualType, + AbstractFunction $function, + array $importedNamespaces, + MethodContainer $container = null, + $type) + { + if (! $docType) { + if ( ! $actualType->isUnknownType() && ! $actualType->isAllType()) { + return null; + } + + return $this->{'infer'.$type.'TypeForFunction'}($function, $container); + } + + // If the type defined by the comment is an object (and not the NoObjectType), + // and a super type of the actual type, we keep it. + if (null !== $docType->toMaybeObjectType() && $actualType->isSubtypeOf($docType)) { + return $docType; + } + + // If the type defined by the comment is a nullable object type (excluding the + // NoObject type), we keep the comment that is currently in place. + if ($this->isNullableObjectType($docType) && $actualType->isSubtypeOf($docType)) { + return $docType; + } + + if ($docType->getDocType($importedNamespaces) !== $actualType->getDocType($importedNamespaces)) { + return $actualType; + } + + if ($actualType === $this->registry->getNativeType('array')) { + $inferredType = $this->{'infer'.$type.'TypeForFunction'}($function, $container); + + if ($inferredType && $inferredType->isArrayType()) { + return $inferredType; + } + } + + return null; + } + + private function isNullableObjectType(PhpType $type) + { + if ( ! $type->isUnionType()) { + return false; + } + + foreach ($type->getAlternates() as $alt) { + if (null === $alt->toMaybeObjectType() && ! $alt->isNullType()) { + return false; + } + } + + return true; + } + + private function addParamAnnotation(&$comment, $paramName, $docType) + { + if (preg_match('#^(.*@param.*?)(\s+\*(?:\s+@|/).*?)$#s', $comment, $match)) { + $lines = explode("\n", $match[1]); + + if (preg_match('#^[\s\*]+$#', end($lines))) { + $match[2] = "\n".array_pop($lines).$match[2]; + } + + $indentation = ''; + if (preg_match('#^(\s+)#', end($lines), $wMatch)) { + $indentation = $wMatch[1]; + } + + $comment = implode("\n", $lines)."\n".$indentation."* @param ".$docType." $".$paramName.$match[2]; + + return; + } + + // We do not take special care of formatting here as we will run a separate pass which + // is solely dedicated to formatting PHPDoc comments. + $comment = preg_replace('#^(\s+)\*/$#m', "\\1* @param ".$docType." \$$paramName\n\\0", $comment); + } + + /** + * Returns the inferred return type for the given function. + * + * If we cannot infer any type NO type is returned, this is also returned if we can only infer + * ALL type, or UNKNOWN type. + * + * We use two characteristics for inferring a return type. First, we are looking at how the + * return value of the function is used in the places from where it is called. Currently, we + * are only looking at whether it is passed to other functions/methods and what their expected + * parameter types are. + * + * Second, we also take a look at the exit points of the CFG of the function itself to see + * whether there are some specific types which we can infer. For example, a function might return + * NULL type, or ALL type in which case its return type would normally be set to ALL type. + * However, for our analysis here, we just ignore the ALL type, and add the NULL type to the + * list of allowed types. + * + * @param AbstractFunction $function + * + * @return PhpType + */ + private function inferReturnTypeForFunction(AbstractFunction $function, MethodContainer $container = null) + { + $types = array(); + + if ($container instanceof \Scrutinizer\PhpAnalyzer\Model\InterfaceC) { + foreach ($container->getImplementingClasses() as $class) { + if (null === $implementedFunction = $class->getMethod($function->getName())) { + continue; + } + + $returnType = $implementedFunction->getReturnType(); + if ($returnType->isUnknownType() || $returnType->isAllType()) { + continue; + } + + $types[] = $returnType; + } + } + + if (! $types) { + foreach ($function->getInCallSites() as $site) { + // We can only analyze call sites which are part of the code which is currently being + // scanned. Otherwise, we would need to persist the possible types to the database. + // This could be a future improvement though if we deem it necessary. + if (null === $node = $site->getAstNode()) { + continue; + } + + if (null === $parent = $node->getAttribute('parent')) { + continue; + } + + switch (true) { + case $parent instanceof \PHPParser_Node_Arg: + if (null === $callNode = $parent->getAttribute('parent')) { + break; + } + + $paramType = $this->getSpecificParamTypeForArg($callNode, $parent); + if ($paramType) { + $types[] = $paramType; + } + + break; + + case $parent instanceof \PHPParser_Node_Expr_Assign: + case $parent instanceof \PHPParser_Node_Expr_AssignRef: + foreach ($parent->var->getAttribute('maybe_using_vars', array()) as $varNode) { + if (null === $argNode = $varNode->getAttribute('parent')) { + continue; + } + + if (! $argNode instanceof \PHPParser_Node_Arg) { + continue; + } + + $callNode = $argNode->getAttribute('parent'); + $paramType = $this->getSpecificParamTypeForArg($callNode, $argNode); + if (null !== $paramType) { + $types[] = $paramType; + } + } + + break; + } + } + } + + $cfa = new \Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowAnalysis(); + $cfa->process($function->getAstNode()); + $cfg = $cfa->getGraph(); + foreach ($cfg->getDirectedSuccNodes($cfg->getImplicitReturn()) as $exitGraphNode) { + $exitNode = $exitGraphNode->getAstNode(); + + if (! $exitNode instanceof \PHPParser_Node_Stmt_Return || null === $exitNode->expr) { + $types[] = $this->registry->getNativeType('null'); + continue; + } + + $returnType = $exitNode->expr->getAttribute('type'); + if ($returnType && ! $returnType->isUnknownType() && ! $returnType->isAllType()) { + $types[] = $returnType; + } + } + + return $this->refineTypeForAnnotation($this->registry->createUnionType($types), true); + } + + private function getSpecificParamTypeForArg(\PHPParser_Node $callNode, \PHPParser_Node $argNode) + { + if (null === $calledFunction = $this->registry->getCalledFunctionByNode($callNode)) { + return null; + } + + $argIndex = array_search($argNode, $callNode->args, true); + if ( ! $calledFunction->hasParameter($argIndex)) { + return null; + } + + $paramType = $calledFunction->getParameter($argIndex)->getPhpType(); + if (null === $paramType || $paramType->isUnknownType() || $paramType->isAllType()) { + return null; + } + + return $paramType; + } + + private function inferTypeForParameter(AbstractFunction $function, \Scrutinizer\PhpAnalyzer\Model\Parameter $param) + { + $index = $param->getIndex(); + $types = array(); + + foreach ($function->getInCallSites() as $site) { + $args = $site->getArgs(); + + if (!isset($args[$index])) { + continue; + } + + $argType = $args[$index]->getPhpType(); + if ($argType->isUnknownType() || $argType->isNoType()) { + continue; + } + + $types[] = $argType; + } + + if ((null !== $astNode = $param->getAstNode()) + && null !== $astNode->default) { + $defaultType = $astNode->default->getAttribute('type'); + + // The default type might be null for example if a constant is assigned + // as a default value, and we could not determine the value of that constant. + if (null !== $defaultType) { + $types[] = $defaultType; + } + } + + return $this->refineTypeForAnnotation($this->registry->createUnionType($types)); + } + + private function removeOrRenameNonExistentParams(\PHPParser_Node $node, &$comment) + { + $annotatedParams = array(); + if (preg_match_all('#@param(?: |\t)+[^\s]+(?: |\t)+\$([^\s]+)#', $comment, $matches)) { + $annotatedParams = $matches[1]; + } + + $paramsWithoutAnnotation = array(); + $paramNames = array(); + foreach ($node->params as $param) { + $paramNames[] = $param->name; + if ( ! in_array($param->name, $annotatedParams)) { + $paramsWithoutAnnotation[] = $param->name; + } + } + + $findSimilarName = function($name) use (&$paramsWithoutAnnotation) { + $similarity = array(); + foreach ($paramsWithoutAnnotation as $paramName) { + similar_text($name, $paramName, $similarity[$paramName]); + } + + arsort($similarity); + list($mostSimilarName, $percentage) = each($similarity); + + return $percentage >= 70 ? $mostSimilarName : null; + }; + + foreach ($annotatedParams as $name) { + // The annotated parameter actually exists. + if (in_array($name, $paramNames, true)) { + continue; + } + + // The annotated parameter does not exist, but we found a non-annotated parameter which + // looks very similar to the annotated one (probably just a typo). + if (null !== $newName = $findSimilarName($name)) { + unset($paramsWithoutAnnotation[$newName]); + $comment = preg_replace('#(@param(?: |\t)+[^\s]+(?: |\t)+\$)'.preg_quote($name, '#').'\b#', '\\1'.$newName, $comment); + + continue; + } + + // We remove the annotation for this parameter as it does not exist (anymore). + $comment = preg_replace_callback('#^(?: |\t)+\*(?: |\t)+@param(?: |\t)[^\s]+(?: |\t)+\$'.preg_quote($name, '#').'(?:[^@\*]|(? 0); + + return $rs; + }, $comment); + } + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/DocCommentFixingPassConfiguration.php b/src/Scrutinizer/PhpAnalyzer/Pass/DocCommentFixingPassConfiguration.php new file mode 100644 index 0000000..892ea59 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/DocCommentFixingPassConfiguration.php @@ -0,0 +1,37 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Symfony\Component\Config\Definition\ConfigurationInterface; + +class DocCommentFixingPassConfiguration implements ConfigurationInterface +{ + public function getConfigTreeBuilder() + { + $tb = new TreeBuilder(); + + $tb->root('doc_comment_fixes', 'array', new NodeBuilder()) + ->canBeEnabled() + ; + + return $tb; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/FixingAnalyzerPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/FixingAnalyzerPass.php new file mode 100644 index 0000000..9461d19 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/FixingAnalyzerPass.php @@ -0,0 +1,102 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +/** + * Abstract base class for fixing passes. + * + * @author Johannes M. Schmitt + */ +abstract class FixingAnalyzerPass implements \Scrutinizer\PhpAnalyzer\Pass\AnalysisPassInterface, \Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface +{ + /** @var \JMS\PhpManipulator\SimultaneousTokenAstStream */ + protected $stream; + + /** @var \Scrutinizer\PhpAnalyzer\Analyzer */ + protected $analyzer; + + /** @var \Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry */ + protected $registry; + + /** @var \Scrutinizer\PhpAnalyzer\Model\FixedPhpFile */ + protected $fixedFile; + + public function __construct() + { + $this->stream = new \JMS\PhpManipulator\SimultaneousTokenAstStream(); + $tokenStream = $this->stream->getTokenStream(); + $tokenStream->setIgnoreComments(false); + $tokenStream->setIgnoreWhitespace(false); + } + + public function setAnalyzer(\Scrutinizer\PhpAnalyzer\Analyzer $analyzer) + { + $this->analyzer = $analyzer; + $this->registry = $analyzer->getTypeRegistry(); + } + + public final function analyze(\Scrutinizer\PhpAnalyzer\Model\File $file) + { + if ( ! $file instanceof \Scrutinizer\PhpAnalyzer\Model\PhpFile) { + return; + } + + if ( ! $this->isEnabled()) { + return; + } + + $this->fixedFile = $fixedFile = $file->getOrCreateFixedFile(); + if ( ! $fixedFile->hasAst()) { + return; + } + + $this->stream->setInput($originalContent = $fixedFile->getContent(), $fixedFile->getAst()); + $this->analyzeStream(); + + $newContent = $this->getNewContent(); + if ($newContent !== $originalContent) { + $fixedFile->setContent($newContent); + } + } + + /** + * Returns whether this pass is enabled. + * + * Allow sub-classes to easily disable this pass without having to implement + * much logic themselves. + * + * @return boolean + */ + protected function isEnabled() + { + return true; + } + + protected function getNewContent() + { + $newContent = ''; + foreach ($this->stream->getTokenStream()->getTokens() as $token) { + $newContent .= $token->getContent(); + } + + return $newContent; + } + + abstract protected function analyzeStream(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/InferTypesFromCallSitesPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/InferTypesFromCallSitesPass.php new file mode 100644 index 0000000..ff5bc2a --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/InferTypesFromCallSitesPass.php @@ -0,0 +1,84 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnionTypeBuilder; +use Scrutinizer\PhpAnalyzer\Pass\AstAnalyzerPass; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\Parameter; + +class InferTypesFromCallSitesPass extends AstAnalyzerPass +{ + public function enterScope(NodeTraversal $t) + { + $node = $t->getScopeRoot(); + + $function = null; + if ($node instanceof \PHPParser_Node_Stmt_ClassMethod) { + $function = $t->getScope()->getTypeOfThis()->getMethod($node->name)->getMethod(); + } else if ($node instanceof \PHPParser_Node_Stmt_Function) { + $function = $this->typeRegistry->getFunctionByNode($node); + } + + if (null !== $function) { + $this->inferTypesForFunction($function); + } + } + + protected function getScopeCreator() + { + return new TypedScopeCreator($this->typeRegistry); + } + + private function inferTypesForFunction(AbstractFunction $function) + { + // Infer types for parameters. + foreach ($function->getParameters() as $param) { + if ( ! $param->getPhpType()->isUnknownType()) { + continue; + } + + $this->inferTypeForParameter($function, $param); + } + } + + private function inferTypeForParameter(AbstractFunction $function, Parameter $param) + { + $builder = new UnionTypeBuilder($this->typeRegistry); + $index = $param->getIndex(); + + foreach ($function->getInCallSites() as $site) { + $args = $site->getArgs(); + + if (!isset($args[$index])) { + continue; + } + + $builder->addAlternate($args[$index]->getPhpType()); + } + + $newType = $builder->build(); + if ( ! $newType->isNoType() + && ! $newType->isUnknownType()) { + $param->setPhpType($newType); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/InferTypesFromDocCommentsPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/InferTypesFromDocCommentsPass.php new file mode 100644 index 0000000..e440e98 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/InferTypesFromDocCommentsPass.php @@ -0,0 +1,308 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\AnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; +use Scrutinizer\PhpAnalyzer\Pass\CallbackAnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\DocCommentParser; +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\Constant; +use Scrutinizer\PhpAnalyzer\Model\GlobalConstant; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\InterfaceC; +use Scrutinizer\PhpAnalyzer\Model\Method; +use Scrutinizer\PhpAnalyzer\Model\Parameter; +use Scrutinizer\PhpAnalyzer\Model\Property; +use Scrutinizer\PhpAnalyzer\Model\TraitC; +use Scrutinizer\PhpAnalyzer\Model\File; + +/** + * Parses Doc comments and applies type information to nodes. + * + * TODO: There is a lot of code duplication in this pass which should be + * cleaned up. + * + * @author Johannes M. Schmitt + */ +class InferTypesFromDocCommentsPass implements AnalysisPassInterface, AnalyzerAwareInterface, CallbackAnalysisPassInterface +{ + private $registry; + private $parser; + + public function setAnalyzer(Analyzer $analyzer) + { + $this->registry = $analyzer->getTypeRegistry(); + $this->parser = new DocCommentParser($this->registry); + } + + public function analyze(File $file) { } + public function afterAnalysis() { } + + public function beforeAnalysis() + { + foreach ($this->registry->getClasses() as $class) { + if (null === $class->getAstNode()) { + continue; + } + + if ($class instanceof Clazz) { + $this->inferTypesForClass($class); + } else if ($class instanceof InterfaceC) { + $this->inferTypesForInterface($class); + } else if ($class instanceof TraitC) { + $this->inferTypesForTrait($class); + } else { + throw new \LogicException('The previous ifs are exhaustive.'); + } + } + + $this->parser->setCurrentClassName(null); + foreach ($this->registry->getFunctions() as $function) { + if (null === $function->getAstNode()) { + continue; + } + + $this->inferTypesForMethodOrFunction($function); + } + + $this->parser->setImportedNamespaces(array('' => '')); + foreach ($this->registry->getConstants() as $constant) { + if (null === $constant->getAstNode()) { + continue; + } + + $this->inferTypesForConstant($constant); + } + } + + private function inferTypesForClass(Clazz $class) + { + $this->parser->setCurrentClassName($class->getName()); + $this->parser->setImportedNamespaces($class->getImportedNamespaces()); + foreach ($class->getConstants() as $constant) { + $this->inferTypesForClassConstant($constant->getConstant()); + } + + foreach ($class->getMethods() as $method) { + $this->inferTypesForMethodOrFunction($method->getMethod(), $class); + } + + foreach ($class->getProperties() as $property) { + $this->inferTypesForProperty($property->getProperty()); + } + } + + private function inferTypesForInterface(InterfaceC $interface) + { + $this->parser->setCurrentClassName($interface->getName()); + $this->parser->setImportedNamespaces($interface->getImportedNamespaces()); + foreach ($interface->getConstants() as $constant) { + $this->inferTypesForClassConstant($constant->getConstant()); + } + + foreach ($interface->getMethods() as $method) { + // We do not pass the container here as it does not make sense to + // check for @inheritdoc on interfaces (methods cannot be overridden). + $this->inferTypesForMethodOrFunction($method->getMethod()); + } + } + + private function inferTypesForTrait(TraitC $trait) + { + $this->parser->setCurrentClassName($trait->getName()); // TODO: This is not correct as a trait is not a type. + $this->parser->setImportedNamespaces($trait->getImportedNamespaces()); + + // TODO: Can a trait have constants? + + foreach ($trait->getMethods() as $method) { + // We do not pass the container here as it does not make sense to + // check for @inheritdoc on traits (there is nothing to inherit from). + $this->inferTypesForMethodOrFunction($method->getMethod()); + } + + foreach ($trait->getProperties() as $property) { + $this->inferTypesForProperty($property->getProperty()); + } + } + + private function inferTypesForParameter(Parameter $param, AbstractFunction $function, Clazz $clazz = null) + { + if (($type = $param->getPhpType()) && !$type->isUnknownType() && !$type->isNullType() + && !$type->isFalse() && !$type->isAllType()) { + return; + } + + $allowsNull = $type && $type->isNullType(); + + if (null !== $node = $param->getAstNode()) { + $type = $this->parser->getTypeFromParamAnnotation($node, $param->getName()); + + // Check whether we can use the type of a overridden method. + // We only do this if we find a parent method that has been defined + // on an interface (I), or if we find an abstract method (II). + if (null === $type && $function instanceof Method && null !== $clazz) { + foreach ($this->findOverriddenMethodsForDocInheritance($function->getName(), $clazz) as $parentMethod) { + if (null !== $docType = $parentMethod->getParamDocType($param->getIndex())) { + $type = $this->parser->getType($docType); + break; + } + } + } + } + + if (null === $type) { + $type = $this->registry->getNativeType('unknown'); + } else if ($allowsNull) { + $type = $this->registry->createNullableType($type); + } + + $param->setPhpType($type); + if ($node) { + $node->setAttribute('type', $type); + } + } + + private function inferTypesForConstant(GlobalConstant $constant) + { + if (($type = $constant->getPhpType()) && !$type->isUnknownType()) { + return; + } + + if (null !== $node = $constant->getAstNode()) { + $type = $this->parser->getTypeFromVarAnnotation($node); + } + + if (null === $type) { + $type = $this->registry->getNativeType('unknown'); + } + + $constant->setPhpType($type); + if ($node) { + $node->setAttribute('type', $type); + } + } + + private function inferTypesForProperty(Property $property) + { + if (($type = $property->getPhpType()) && !$type->isUnknownType()) { + return; + } + + if (null !== $node = $property->getAstNode()) { + if ($property instanceof \PHPParser_Node_Stmt_Class) { + $type = $this->parser->getTypeFromMagicPropertyAnnotation($node, $property->getName()); + } else { + $type = $this->parser->getTypeFromVarAnnotation($node); + } + } + + if (null === $type) { + $type = $this->registry->getNativeType('unknown'); + } + + $property->setPhpType($type); + if ($node) { + $node->setAttribute('type', $type); + } + } + + private function findOverriddenMethodsForDocInheritance($methodName, Clazz $clazz) + { + $methods = array(); + + foreach ($clazz->getImplementedInterfaces() as $interfaceName) { + if (null !== $interface = $this->registry->getClass($interfaceName)) { + if ($interface->hasMethod($methodName)) { + $methods[] = $interface->getMethod($methodName); + } + } + } + + $superClass = $clazz; + while (null !== $superClass = $superClass->getSuperClassType()) { + if ($superClass->hasMethod($methodName) + && ($parentMethod = $superClass->getMethod($methodName)) + && $parentMethod->isAbstract()) { + $methods[] = $parentMethod; + } + } + + return $methods; + } + + private function inferTypesForMethodOrFunction(AbstractFunction $function, Clazz $clazz = null) + { + if ($function instanceof GlobalFunction) { + $this->parser->setImportedNamespaces($function->getImportedNamespaces()); + } + + foreach ($function->getParameters() as $param) { + $this->inferTypesForParameter($param, $function, $clazz); + } + + if (($type = $function->getReturnType()) && !$type->isUnknownType()) { + return; + } + + if (null !== $node = $function->getAstNode()) { + $type = $this->parser->getTypeFromReturnAnnotation($node); + + if (null === $type && $function instanceof Method && null !== $clazz) { + foreach ($this->findOverriddenMethodsForDocInheritance($function->getName(), $clazz) as $parentMethod) { + if (null !== $docType = $parentMethod->getReturnDocType()) { + $type = $this->parser->getType($docType); + break; + } + } + } + } + + if (null === $type) { + $type = $this->registry->getNativeType('unknown'); + } + + $function->setReturnType($type); + if ($node) { + $node->setAttribute('type', $type); + } + } + + private function inferTypesForClassConstant(Constant $constant) + { + if (($type = $constant->getPhpType()) && !$type->isUnknownType()) { + return; + } + + if (null !== $node = $constant->getAstNode()) { + $type = $this->parser->getTypeFromVarAnnotation($node); + } + + if (null === $type) { + $type = $this->registry->getNativeType('unknown'); + } + + $constant->setPhpType($type); + if ($node) { + $node->setAttribute('type', $type); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/LoggingPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/LoggingPass.php new file mode 100644 index 0000000..0d299fa --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/LoggingPass.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; +use Scrutinizer\PhpAnalyzer\Model\File; + +class LoggingPass implements AnalysisPassInterface, AnalyzerAwareInterface, CallbackAnalysisPassInterface +{ + private $message; + private $logger; + + public function __construct($message) + { + $this->message = $message; + } + + public function setAnalyzer(Analyzer $analyzer) + { + $this->logger = $analyzer->logger; + } + + public function beforeAnalysis() + { + $this->logger->info($this->message); + } + + public function analyze(File $file) { } + public function afterAnalysis() { } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/LoopsMustUseBracesPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/LoopsMustUseBracesPass.php new file mode 100644 index 0000000..46d8174 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/LoopsMustUseBracesPass.php @@ -0,0 +1,124 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use JMS\PhpManipulator\TokenStream\PhpToken; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +// TODO: This should either be removed completely, or moved to a general style check pass. +class LoopsMustUseBracesPass extends TokenStreamAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('loops_must_use_braces', 'array', new NodeBuilder()) + ->attribute('label', 'Ensure all loops use braces') + ->canBeEnabled() + ; + + return $tb; + } + + protected function analyzeStream() + { + if ( ! $this->getSetting('enabled')) { + return; + } + + while ($this->stream->moveNext()) { + if ( ! $this->stream->token instanceof PhpToken) { + continue; + } + + switch ($this->stream->token->getType()) { + case \T_IF: + $this->checkTokenWithCondition('IF'); + break; + + case \T_ELSEIF: + $this->checkTokenWithCondition('ELSEIF'); + break; + + case \T_ELSE: + $this->checkElse(); + break; + + case \T_WHILE: + $this->checkTokenWithCondition('WHILE'); + break; + + case \T_FOR: + $this->checkTokenWithCondition('FOR'); + break; + + case \T_FOREACH: + $this->checkTokenWithCondition('FOREACH'); + break; + } + } + } + + private function checkElse() + { + if ($this->stream->next->matches(';')) { + return; + } + + if ($this->stream->next->matches('{')) { + return; + } + + // ``else if`` is allowed. + if ($this->stream->next->matches(T_IF)) { + return; + } + + $this->markOffense('ELSE'); + } + + private function checkTokenWithCondition($stmtName) + { + $this->stream->moveNext(); + $this->stream->skipCurrentBlock(); + + // No statements at all. + if ($this->stream->next->matches(';')) { + return; + } + + // The user is already using braces. + if ($this->stream->next->matches('{')) { + return; + } + + $this->markOffense($stmtName); + } + + private function markOffense($stmtName) + { + $this->phpFile->addComment($this->stream->token->getLine(), Comment::warning( + 'coding_style.blocks_should_have_braces', + 'Please always use braces to surround the code block of %statement_name% statements.', + array('statement_name' => $stmtName))); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/MarkPassedByRefArgsPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/MarkPassedByRefArgsPass.php new file mode 100644 index 0000000..af22907 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/MarkPassedByRefArgsPass.php @@ -0,0 +1,50 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; + +/** + * Marks arguments which are passed by reference. + * + * @author Johannes M. Schmitt + */ +class MarkPassedByRefArgsPass extends AstAnalyzerPass +{ + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if ( ! NodeUtil::isCallLike($node)) { + return; + } + + if (null === $function = $this->typeRegistry->getCalledFunctionByNode($node)) { + return; + } + + foreach ($function->getParameters() as $param) { + $index = $param->getIndex(); + if ( ! isset($node->args[$index])) { + continue; + } + + $node->args[$index]->setAttribute('param_expects_ref', $param->isPassedByRef()); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/OldCodingStylePass.php b/src/Scrutinizer/PhpAnalyzer/Pass/OldCodingStylePass.php new file mode 100644 index 0000000..83c0dd5 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/OldCodingStylePass.php @@ -0,0 +1,308 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use JMS\PhpManipulator\PhpParser\BlockNode; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\PhpFile; + +class CodingStylePass extends AstAnalyzerPass +{ + private $lines; + private $codingStyle; + private $tokens; + private $token; + private $next; + private $curLine; + private $i; + + public function analyze(File $file) + { + if (!$file instanceof PhpFile) { + return; + } + + $this->codingStyle = $this->analyzer->getPhpCodingStyle(); + $this->tokens = token_get_all($content = $file->getContent()); + $this->i = -1; + $this->lines = explode("\n", $content); + $this->curLine = 1; + + parent::analyze($file); + + while ($this->next()) { + $this->checkWhitespace(); + + if (T_OPEN_TAG === $this->token[0] + && 'token[1] + && !$this->codingStyle->allowShortPhpOpenTag) { + $this->addComment(1, 'Please do not use the short-opening tag, but "addComment(count($this->lines), 'Please add a linefeed (\n) at the end of the file.'); + } + + $foundTabs = $foundLinefeed = $foundTrailingWhitespace = false; + foreach ($this->lines as $i => $line) { + // Check that there are no tabs inside the file. + if (!$foundTabs && preg_match('/^(?: )*\t/', $line)) { + $this->addComment($i + 1, 'Please do not use tabs for indentation, but 4 spaces for each tab.'); + + // Assume that the users fixes all further occurences of tabs. + $foundTabs = true; + + continue; + } + + // Check for correct line-ending character + if (!$foundLinefeed && "\r" === substr($line, -1)) { + $this->addComment($i + 1, 'Please do not use the line-ending (\r\n), but only \n (0x0A).'); + + // Assume that the user fixed all further occurrences. + $foundLinefeed = true; + + continue; + } + + // Check for trailing white-space + if (!$foundTrailingWhitespace && preg_match('/\s+$/', $line)) { + $this->addComment($i + 1, 'Please do not add trailing whitespace.'); + $foundTrailingWhitespace = true; + + continue; + } + } + } + + private function checkWhitespace() + { + if ('(' === $this->token[1] + && $this->next[1][0] === ' ') { + $this->addComment($this->curLine, 'Please do not add whitespace after the "(".'); + } + } + + private function next() + { + if (null !== $this->token) { + $this->curLine += substr_count($this->token[1], "\n"); + } + + $this->token = isset($this->tokens[$this->i + 1]) ? $this->tokens[++ $this->i] : null; + if (is_string($this->token)) { + $this->token = array(null, $this->token, 0); + } + + $this->next = null !== $this->token && isset($this->tokens[$this->i + 1]) ? $this->tokens[$this->i + 1] : null; + if (is_string($this->next)) { + $this->next = array(null, $this->next, 0); + } + + return null !== $this->token; + } + + public function shouldTraverse(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + $this->enterNode($node); + + if ($node instanceof \PHPParser_Node_Stmt_Return) { + $this->checkBlankLineBeforeReturn($node); + } + + return true; + } + + private function checkBlankLineBeforeReturn(\PHPParser_Node_Stmt_Return $node) + { + // Check if the RETURN statement is the only statement of the parent. If + // that is the case, just ignore the node. + $parent = $node->getAttribute('parent'); + if ($parent instanceof BlockNode && count($parent) === 1) { + return; + } + + if (-1 === $line = $node->getLine()) { + return; + } + + // Check that there is at least one blank line before the return statement. + // We are ignoring comments that have been made on the return statement. + $foundBlankLine = false; + for ($i=$line-2; $i>0; $i--) { + $tokens = token_get_all('lines[$i]); + array_shift($tokens); // shift of the opening tag addComment($line, 'Please add a blank line before this return statement.'); + } + } + + /** + * @param \PHPParser_Node $node + */ + private function enterNode(\PHPParser_Node $node) + { + if ($node instanceof \PHPParser_Node_Stmt_Use) { + $this->analyzeUseStmt($node); + + return; + } + + if ($node instanceof \PHPParser_Node_Stmt_Class) { + $this->analyzeClass($node); + + return; + } + + // check constant is on left side of the operand + if ($node instanceof \PHPParser_Node_Expr_Identical + || $node instanceof \PHPParser_Node_Expr_Equal) { + if ($node->left instanceof \PHPParser_Node_Expr_Variable + && ($node->right instanceof \PHPParser_Node_Scalar + || $node->right instanceof \PHPParser_Node_Expr_ConstFetch)) { + $toPrint = clone $node; + $toPrint->left = $node->right; + $toPrint->right = $node->left; + + $this->addComment($node->getLine(), sprintf( + 'Please move the constant to the left side, e.g. %s. This prevents you from accidentally overwriting the variable.', + self::$prettyPrinter->prettyPrintExpr($toPrint) + )); + } + } + } + + private function analyzeClass(\PHPParser_Node_Stmt_Class $class) + { + $inProperties = $inMethods = false; + $propertyVisibility = $methodVisibility = 3; + $previousProperty = $previousMethod = null; + + for ($i=0,$c=count($class->stmts); $i<$c; $i++) { + $stmt = $class->stmts[$i]; + + if ($stmt instanceof \PHPParser_Node_Stmt_Property) { + $inProperties = true; + if ($inMethods) { + $this->addComment($stmt->getLine(), 'Please move properties before all method declarations in this class.'); + } + + if (count($stmt->props) > 1) { + $this->addComment($stmt->getLine(), 'Please use a separate statement for each property.'); + } + + if (\PHPParser_Node_Stmt_Class::MODIFIER_PROTECTED === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_PROTECTED)) { + $visibility = 2; + } else if (\PHPParser_Node_Stmt_Class::MODIFIER_PRIVATE === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_PRIVATE)) { + $visibility = 1; + } else { + $visibility = 3; + } + + if ($visibility > $propertyVisibility) { + $msg = 'Please order properties by their visibility; "public" before "protected" before "private" properties.'; + $this->addComment($stmt->getLine(), $msg); + + if (null !== $previousProperty) { + $this->addComment($previousProperty->getLine(), $msg); + } + } + $propertyVisibility = $visibility; + $previousProperty = $stmt; + } + + if ($stmt instanceof \PHPParser_Node_Stmt_ClassMethod) { + $inMethods = true; + + // check if there are properties following + $propertiesFollowing = false; + for ($j=$i+1; $j<$c; $j++) { + if ($class->stmts[$j] instanceof \PHPParser_Node_Stmt_Property) { + $propertiesFollowing = true; + break; + } + } + + if ($propertiesFollowing) { + $this->addComment($stmt->getLine(), 'Please move this method after all property declarations in this class.'); + } + + if (\PHPParser_Node_Stmt_Class::MODIFIER_PROTECTED === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_PROTECTED)) { + $visibility = 2; + } else if (\PHPParser_Node_Stmt_Class::MODIFIER_PRIVATE === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_PRIVATE)) { + $visibility = 1; + } else { + $visibility = 3; + } + + if ($visibility > $methodVisibility) { + $msg = 'Please order methods by their visibility; "public" before "protected" before "private" methods.'; + $this->addComment($stmt->getLine(), $msg); + + if (null !== $previousMethod) { + $this->addComment($previousMethod->getLine(), $msg); + } + } + $methodVisibility = $visibility; + $previousMethod = $stmt; + } + } + } + + private function analyzeUseStmt(\PHPParser_Node_Stmt_Use $useStmt) + { + if (count($useStmt->uses) > 1) { + $this->addComment($useStmt->getLine(), 'Please use one "use" statement for each namespace that you import.'); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/PhpunitAssertionsPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/PhpunitAssertionsPass.php new file mode 100644 index 0000000..dc40b9d --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/PhpunitAssertionsPass.php @@ -0,0 +1,199 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\Pass\AstAnalyzerPass; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +/** + * PHPUnit Assertion Usage + * + * This pass checks the usage of assertions in unit tests, and will suggest more + * specific assertions if available:: + * + * // instead of + * $this->assertTrue(count($foo) > 0); + * + * // it would suggest to use + * $this->assertGreaterThan(0, $foo); + * + * The reasoning behind this is that more specific assertions will lead to better + * error messages if the assertion fails, which in turn saves you debugging time. + * + * @category checks + * @author Johannes M. Schmitt + */ +class PhpunitAssertionsPass extends AstAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('phpunit_checks', 'array', new NodeBuilder()) + ->canBeEnabled() + ->attribute('label', 'Checks usage of PHPUnit specific features, such as assertions.') + ; + + return $tb; + } + + protected function isEnabled() + { + return true === $this->getSetting('enabled'); + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + $objType = null; + if ($node instanceof \PHPParser_Node_Expr_MethodCall) { + $objType = $node->var->getAttribute('type'); + } else if ($node instanceof \PHPParser_Node_Expr_StaticCall) { + $objType = $node->class->getAttribute('type'); + } + + if (!$objType) { + return; + } + + if (!is_string($node->name)) { + return; + } + + if (!$objType->isSubTypeOf($this->typeRegistry->getClassOrCreate('PHPUnit_Framework_TestCase'))) { + return; + } + + switch (strtolower($node->name)) { + case 'asserttrue': + $this->optimizeAssertTrue($node); + break; + + case 'assertfalse': + $this->optimizeAssertFalse($node); + break; + } + } + + private function optimizeAssertTrue(\PHPParser_Node $node) + { + if (!isset($node->args[0])) { + return; + } + $arg = $node->args[0]->value; + + $betterExpr = null; + switch (true) { + case $arg instanceof \PHPParser_Node_Expr_Greater: + $betterExpr = clone $node; + $betterExpr->name = 'assertGreaterThan'; + $betterExpr->args = $this->createArgs($arg->right, $arg->left); + break; + + case $arg instanceof \PHPParser_Node_Expr_GreaterOrEqual: + $betterExpr = clone $node; + $betterExpr->name = 'assertGreaterThanOrEqual'; + $betterExpr->args = $this->createArgs($arg->right, $arg->left); + break; + + case $arg instanceof \PHPParser_Node_Expr_Smaller: + $betterExpr = clone $node; + $betterExpr->name = 'assertLessThan'; + $betterExpr->args = $this->createArgs($arg->left, $arg->right); + break; + + case $arg instanceof \PHPParser_Node_Expr_SmallerOrEqual: + $betterExpr = clone $node; + $betterExpr->name = 'assertLessThanOrEqual'; + $betterExpr->args = $this->createArgs($arg->left, $arg->right); + break; + } + + if ($betterExpr) { + if (isset($node->args[1])) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'phpunit.more_specific_assertion_for_true_with_custom_message', + 'Instead of ``assertTrue()`` consider using ``%expr%``.', + array('expr' => self::$prettyPrinter->prettyPrintExpr($betterExpr)))); + } else { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'phpunit.more_specific_assertion_for_true', + 'Instead of ``assertTrue()`` use ``%expr%``. This will lead to a better error message when the test fails.', + array('expr' => self::$prettyPrinter->prettyPrintExpr($betterExpr)))); + } + } + } + + private function optimizeAssertFalse(\PHPParser_Node $node) + { + if (!isset($node->args[0])) { + return; + } + $arg = $node->args[0]->value; + + $betterExpr = null; + switch (true) { + case $arg instanceof \PHPParser_Node_Expr_Greater: + $betterExpr = clone $node; + $betterExpr->name = 'assertLessThanOrEqual'; + $betterExpr->args = $this->createArgs($arg->right, $arg->left); + break; + + case $arg instanceof \PHPParser_Node_Expr_GreaterOrEqual: + $betterExpr = clone $node; + $betterExpr->name = 'assertLessThan'; + $betterExpr->args = $this->createArgs($arg->right, $arg->left); + break; + + case $arg instanceof \PHPParser_Node_Expr_Smaller: + $betterExpr = clone $node; + $betterExpr->name = 'assertGreaterThanOrEqual'; + $betterExpr->args = $this->createArgs($arg->left, $arg->right); + break; + + case $arg instanceof \PHPParser_Node_Expr_SmallerOrEqual: + $betterExpr = clone $node; + $betterExpr->name = 'assertGreaterThan'; + $betterExpr->args = $this->createArgs($arg->left, $arg->right); + break; + } + + if ($betterExpr) { + if (isset($node->args[1])) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'phpunit.more_specific_assertion_for_false_with_custom_message', + 'Instead of ``assertFalse()`` consider using ``%expr%``.', + array('expr' => self::$prettyPrinter->prettyPrintExpr($betterExpr)))); + } else { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'phpunit.more_specific_assertion_for_false', + 'Instead of ``assertFalse()`` use ``%expr%``. This will lead to a better error message when the test fails.', + array('expr' => self::$prettyPrinter->prettyPrintExpr($betterExpr)))); + } + } + } + + private function createArgs() + { + return array_map(function($v) { return new \PHPParser_Node_Arg($v); }, func_get_args()); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/PrecedenceChecksPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/PrecedenceChecksPass.php new file mode 100644 index 0000000..52ccc2f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/PrecedenceChecksPass.php @@ -0,0 +1,217 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use JMS\PhpManipulator\TokenStream\AbstractToken; + +/** + * Precedence Checks + * + * Assignments in Conditions + * ------------------------- + * If you make use of assignments in conditions, it sometimes happens that you add a new condition and forget to take + * precedence into account. As a result, you might easily change the result of the assignment to something that you did + * not intend:: + * + * if ($foo = $this->getFoo()) { } + * + * // is extended to + * if ($foo = $this->getFoo() && $foo->isEnabled()) { } + * + * This pass verifies that all assignments in conditions which involve ``&&``, ``||``, ``and``, ``or`` have explicit + * parentheses set, or flags them if not. + * + * For the above example that means that this check would suggest to change the assignment to one of the following + * versions:: + * + * // Accepted Version 1 + * if (($foo = $this->getFoo()) && $foo->isEnabled()) { } + * + * // Accepted Version 2 + * if ($foo = ($this->getFoo() && $foo->isEnabled())) { } + * + * Comparison Involving the Result of Bit Operations + * ------------------------------------------------- + * If you compare the result of a bitwise operations and place it on the right side of a comparison operator, the + * resulting expression is likely not intended, but might go unnoticed:: + * + * // Returns always int(0). + * return 0 === $foo & 4; + * return (0 === $foo) & 4; + * + * // More likely intended return: true/false + * return 0 === ($foo & 4); + * + * + * @category checks + * @author Johannes M. Schmitt + */ +class PrecedenceChecksPass extends TokenAndAstStreamAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('precedence_checks', 'array', new NodeBuilder()) + ->canBeDisabled() + ->info('Checks Common Precedence Mistakes') + ->children() + ->booleanNode('assignment_in_condition')->defaultTrue()->end() + ->booleanNode('comparison_of_bit_result')->defaultTrue()->end() + ->end() + ; + + return $tb; + } + + protected function isEnabled() + { + return $this->getSetting('enabled'); + } + + protected function analyzeStream() + { + $lastNode = null; + while ($this->stream->moveNext()) { + if ($this->stream->node === $lastNode) { + continue; + } + $lastNode = $this->stream->node; + + if ($this->stream->node instanceof \PHPParser_Node_Expr_Assign + && $this->getSetting('assignment_in_condition')) { + $expr = $this->stream->node->expr; + if ( ! $expr instanceof \PHPParser_Node_Expr_BooleanAnd + && ! $expr instanceof \PHPParser_Node_Expr_BooleanOr + && ! $expr instanceof \PHPParser_Node_Expr_LogicalAnd + && ! $expr instanceof \PHPParser_Node_Expr_LogicalOr + && ! $expr instanceof \PHPParser_Node_Expr_LogicalXor) { + continue; + } + + if ( ! $this->isInsideCondition($this->stream->node)) { + continue; + } + + $exprStartToken = $this->stream->token->findNextToken('NO_WHITESPACE_OR_COMMENT')->get(); + if ( ! $exprStartToken->matches('(')) { + $this->phpFile->addComment($this->stream->node->getLine(), Comment::warning( + 'precedence.possibly_wrong_assign_in_cond', + 'Consider adding parentheses for clarity. Current Interpretation: ``%current_assign%``, Probably Intended Meaning: ``%alternative_assign%``', + array( + 'current_assign' => self::$prettyPrinter->prettyPrintExpr($this->stream->node->var) + .' = ('.self::$prettyPrinter->prettyPrintExpr($this->stream->node->expr).')', + 'alternative_assign' => '('.self::$prettyPrinter->prettyPrintExpr($this->stream->node->var) + .' = '.self::$prettyPrinter->prettyPrintExpr($this->stream->node->expr->left).')' + .' '.NodeUtil::getBinOp($this->stream->node->expr).' ' + .self::$prettyPrinter->prettyPrintExpr($this->stream->node->expr->right), + ) + )); + } + } + + if (($this->stream->node instanceof \PHPParser_Node_Expr_BitwiseAnd + || $this->stream->node instanceof \PHPParser_Node_Expr_BitwiseOr + || $this->stream->node instanceof \PHPParser_Node_Expr_BitwiseXor) + && $this->getSetting('comparison_of_bit_result')) { + $this->checkBitwiseOperation(); + } + } + } + + private function checkBitwiseOperation() + { + if ( ! NodeUtil::isEqualityExpression($this->stream->node->left)) { + return; + } + + /* + * When this method is called, the token stream points to the bitwise operation already. + * + * 0 === foo() & 5; + * ^ + * -----------(1) + * + * (1) The position of the token stream when this method is called. + * + * We now check that the equality expression on the left side (in the case above, it is an Identical node) ends + * with a parenthesis, and the ending parenthesis is started somewhere on the left side side of the equality + * operator (===). + */ + + /** @var AbstractToken $closingParenthesis */ + $closingParenthesis = $this->stream->token->findPreviousToken('NO_WHITESPACE_OR_COMMENT')->get(); + if ($closingParenthesis->matches(')')) { + $startToken = $this->stream->node->left->left->getAttribute('start_token'); + + // The left operator of the equality sign is not assigned an explicit start token, so we do not know where + // it started. We can just bail out here, and hope that the closing parenthesis is indeed started on the left + // side. This needs to be improved in the SimultaneousTokenAndAstStream over time so that we ideally always + // have a start token available. + if (null === $startToken) { + return; + } + + // The closing parenthesis was started somewhere on the left side, good ! + if ($closingParenthesis->isClosing($startToken->findPreviousToken('NO_WHITESPACE_OR_COMMENT')->get())) { + return; + } + } + + $this->phpFile->addComment($this->stream->node->getLine(), Comment::warning( + 'precedence.possibly_wrong_comparison_of_bitop_result', + 'Consider adding parentheses for clarity. Current Interpretation: ``%current_compare%``, Probably Intended Meaning: ``%alternative_compare%``', + array( + 'current_compare' => '('.self::$prettyPrinter->prettyPrintExpr($this->stream->node->left).') ' + .NodeUtil::getBitOp($this->stream->node).' ' + .self::$prettyPrinter->prettyPrintExpr($this->stream->node->right), + 'alternative_compare' => self::$prettyPrinter->prettyPrintExpr($this->stream->node->left->left).' ' + .NodeUtil::getEqualOp($this->stream->node->left).' (' + .self::$prettyPrinter->prettyPrintExpr($this->stream->node->left->right) + .' '.NodeUtil::getBitOp($this->stream->node).' ' + .self::$prettyPrinter->prettyPrintExpr($this->stream->node->right).')', + ) + )); + } + + private function isInsideCondition(\PHPParser_Node $node) + { + $previous = $node; + while (null !== $parent = $previous->getAttribute('parent')) { + if ($parent instanceof \PHPParser_Node_Stmt_If + || $parent instanceof \PHPParser_Node_Stmt_ElseIf + || $parent instanceof \PHPParser_Node_Stmt_While + || $parent instanceof \PHPParser_Node_Stmt_Do) { + // Verifies that we are traversing up from inside the condition, and not from + // inside the statement block. + return $parent->cond === $previous; + } + + $previous = $parent; + } + + return false; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/ReflectionFixerPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/ReflectionFixerPass.php new file mode 100644 index 0000000..c6acec3 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/ReflectionFixerPass.php @@ -0,0 +1,127 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +/** + * Reflection Usage Fixes + * + * This pass fixes several usages of the ``Reflection???`` classes. As such, it + * complements the :doc:`Reflection Usage Checks ` pass. + * + * @category fixes + * @see ReflectionUsageCheckPass + * @author Johannes M. Schmitt + */ +class ReflectionFixerPass extends FixingAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + private $newContent; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('reflection_fixes', 'array', new NodeBuilder()) + ->attribute('label', 'Rewrites certain reflection methods to use property access as this is faster and avoids certain PHP/APC bugs.') + ->canBeEnabled() + ; + + return $tb; + } + + protected function isEnabled() + { + return true === $this->getSetting('enabled'); + } + + protected function getNewContent() + { + return $this->newContent; + } + + protected function analyzeStream() + { + $this->newContent = ''; + + $getNameType = $this->registry->createUnionType(array( + $this->registry->getClassOrCreate('ReflectionZendExtension'), + $this->registry->getClassOrCreate('ReflectionExtension'), + $this->registry->getClassOrCreate('ReflectionFunction'), + $this->registry->getClassOrCreate('ReflectionParameter'), + $this->registry->getClassOrCreate('ReflectionClass'), + $reflectionMethodType = $this->registry->getClassOrCreate('ReflectionMethod'), + )); + $reflectionPropertyType = $this->registry->getClassOrCreate('ReflectionProperty'); + + $lastNode = null; + while ($this->stream->moveNext()) { + switch (true) { + case $this->stream->node instanceof \PHPParser_Node_Expr_MethodCall + && $lastNode !== $this->stream->node: + if (NodeUtil::isCallToMethod($this->stream->node, 'getName') + && (null !== $type = $this->stream->node->var->getAttribute('type')) + && $this->isSubtype($type, $getNameType)) { + $this->newContent .= '->name'; + $this->stream->skipUntil('END_OF_CALL'); + + break; + } + + if (NodeUtil::isCallToMethod($this->stream->node, 'getDeclaringClass') + && (null !== $type = $this->stream->node->var->getAttribute('type')) + && ($this->isSubtype($type, $reflectionMethodType) || $this->isSubtype($type, $reflectionPropertyType)) + && ($parent = $this->stream->node->getAttribute('parent')) + && NodeUtil::isCallToMethod($parent, 'getName')) { + $this->newContent .= '->class'; + $this->stream->skipUntil('END_OF_CALL'); + $this->stream->skipUntil('END_OF_CALL'); + + break; + } + + $this->newContent .= $this->stream->token->getContent(); + + break; + + default: + $this->newContent .= $this->stream->token->getContent(); + } + + $lastNode = $this->stream->node; + } + } + + private function isSubtype(PhpType $a, PhpType $b) + { + if ($a->isUnknownType()) { + return false; + } + + if (null === $objType = $a->toMaybeObjectType()) { + return false; + } + + return $objType->isSubtypeOf($b); + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/ReflectionUsageCheckPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/ReflectionUsageCheckPass.php new file mode 100644 index 0000000..c97129c --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/ReflectionUsageCheckPass.php @@ -0,0 +1,196 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +/** + * Reflection Usage Checks + * + * This pass checks usage of several of the ``Reflection???`` classes, and suggests + * to re-write method calls to property access where possible. + * + * Property accesses are always faster, but more importantly there are some random, + * and hard to debug `issues `_ with method + * calls on some APC versions. So, using property accesses is a double win. + * + * This pass is complemented by the :doc:`Reflection Usage Fixer ` + * which automatically performs the suggested fixes in your source code. + * + * @category checks + * @author Johannes M. Schmitt + */ +class ReflectionUsageCheckPass extends AstAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('reflection_checks', 'array', new NodeBuilder()) + ->canBeDisabled() + ->attribute('label', 'Checks certain usages of Reflection related classes.'); + ; + + return $tb; + } + + protected function isEnabled() + { + return true === $this->getSetting('enabled'); + } + + public function shouldTraverse(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_MethodCall: + return $this->shouldTraverseMethodCall($t, $node, $parent); + + case $node instanceof \PHPParser_Node_Expr_FuncCall: + $this->shouldTraverseFunctionCall($t, $node, $parent); + + return true; + + default: + return true; + } + } + + private function shouldTraverseFunctionCall(NodeTraversal $t, \PHPParser_Node_Expr_FuncCall $node, \PHPParser_Node $parent = null) + { + $function = $this->typeRegistry->getCalledFunctionByNode($node); + if (null === $function) { + return; + } + + assert($function instanceof GlobalFunction); + switch ($function->getName()) { + case 'is_subclass_of': + if ( ! isset($node->args[1])) { + return; + } + + if ( ! $node->args[1]->value instanceof \PHPParser_Node_Scalar_String) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'reflection_usage.could_be_subclass_problem', + 'Due to PHP Bug #53727, ``is_subclass_of`` might return inconsistent results on some PHP versions if ``%argument%`` can be an interface. If so, you could instead use ``ReflectionClass::implementsInterface``.', + array('argument' => self::$prettyPrinter->prettyPrintExpr($node->args[1]->value)))); + + return; + } + + $class = $this->typeRegistry->getClass($node->args[1]->value->value); + if (null === $class || $class->isInterface()) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'reflection_usage.is_subclass_problem', + 'Due to PHP Bug #53727, ``is_subclass_of`` returns inconsistent results on some PHP versions for interfaces; you could instead use ``ReflectionClass::implementsInterface``.')); + + return; + } + } + } + + private function shouldTraverseMethodCall(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + $type = $node->var->getAttribute('type'); + if (null === $type || !is_string($node->name)) { + return true; + } + + if (!$type->toMaybeObjectType()) { + return true; + } + + $methodName = strtolower($node->name); + + $zendExtension = $this->typeRegistry->getClassOrCreate('ReflectionZendExtension'); + $extension = $this->typeRegistry->getClassOrCreate('ReflectionExtension'); + $function = $this->typeRegistry->getClassOrCreate('ReflectionFunction'); + $parameter = $this->typeRegistry->getClassOrCreate('ReflectionParameter'); + $method = $this->typeRegistry->getClassOrCreate('ReflectionMethod'); + $class = $this->typeRegistry->getClassOrCreate('ReflectionClass'); + + switch (true) { + case $this->isSubtype($type, $zendExtension): + case $this->isSubtype($type, $extension): + case $this->isSubType($type, $function): + case $this->isSubType($type, $parameter): + case $this->isSubType($type, $method): + if ('getname' === $methodName) { + $this->phpFile->addComment($node->getLine(), $this->createGetNameComment($node)); + + return false; + } + + return true; + + case $this->isSubType($type, $class): + if ('getname' === $methodName) { + if ($node->var instanceof \PHPParser_Node_Expr_MethodCall + && (null !== $innerType = $node->var->var->getAttribute('type')) + && ($this->isSubType($innerType, $this->typeRegistry->getClassOrCreate('ReflectionMethod')) + || $this->isSubType($innerType, $this->typeRegistry->getClassOrCreate('ReflectionProperty')))) { + $propertyAccess = new \PHPParser_Node_Expr_PropertyFetch($node->var->var, 'class'); + + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'reflection_usage.declaring_class_name', + 'Consider using ``%property_access%``. There is [an issue](https://bugs.php.net/bug.php?id=61384) with ``getName()`` and APC-enabled PHP versions.', + array('property_access' => self::$prettyPrinter->prettyPrintExpr($propertyAccess)))->varyIn(array())); + } else { + $this->phpFile->addComment($node->getLine(), $this->createGetNameComment($node)); + } + + return false; + } + + return true; + + default: + return true; + } + } + + private function createGetNameComment(\PHPParser_Node_Expr_MethodCall $node) + { + $propertyAccess = new \PHPParser_Node_Expr_PropertyFetch($node->var, 'name'); + + return Comment::warning( + 'reflection_usage.get_name', + 'Consider using ``%property_access%``. There is [an issue](https://bugs.php.net/bug.php?id=61384) with ``getName()`` and APC-enabled PHP versions.', + array('property_access' => self::$prettyPrinter->prettyPrintExpr($propertyAccess)))->varyIn(array()); + } + + private function isSubtype(PhpType $a, PhpType $b) + { + if ($a->isUnknownType()) { + return false; + } + + if (null === $objType = $a->toMaybeObjectType()) { + return false; + } + + return $objType->isSubtypeOf($b); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/RepeatedPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/RepeatedPass.php new file mode 100644 index 0000000..159f2dd --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/RepeatedPass.php @@ -0,0 +1,123 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; +use Scrutinizer\PhpAnalyzer\Model\FileCollection; + +class RepeatedPass implements AnalyzerAwareInterface, RepeatedPassAwareInterface +{ + const MAX_RUNS = 10; + + private $repeat = false; + private $passes; + private $analyzer; + private $repeatedPass; + private $maxRuns; + + /** + * @param array $passes + * @param integer $maxRuns + */ + public function __construct(array $passes, $maxRuns = self::MAX_RUNS) + { + if ( ! $passes) { + throw new \InvalidArgumentException('$passes cannot be empty.'); + } + + foreach ($passes as $pass) { + if ($pass instanceof ConfigurablePassInterface) { + throw new \InvalidArgumentException('Configurable passes are not supported.'); + } + + if ($pass instanceof RepeatedPassAwareInterface) { + $pass->setRepeatedPass($this); + } + } + + $this->passes = $passes; + $this->maxRuns = (integer) $maxRuns; + } + + public function setRepeatedPass(RepeatedPass $repeatedPass) + { + $this->repeatedPass = $repeatedPass; + } + + public function setAnalyzer(Analyzer $analyzer) + { + $this->analyzer = $analyzer; + + foreach ($this->passes as $pass) { + if ($pass instanceof AnalyzerAwareInterface) { + $pass->setAnalyzer($analyzer); + } + } + } + + public function analyze(FileCollection $files) + { + $runs = 0; + do { + $runs += 1; + $this->repeat = false; + foreach ($this->passes as $pass) { + $this->analyzer->logger->debug(sprintf('Running pass "%s"...', get_class($pass))); + + // Nested repeated passes are also treated specially. + if ($pass instanceof RepeatedPass) { + $pass->analyze($files); + + continue; + } + + if ($pass instanceof CallbackAnalysisPassInterface) { + $pass->beforeAnalysis(); + } + + foreach ($files as $file) { + $this->analyzer->logger->debug(sprintf('Analyzing file "%s"...', $file->getName())); + if ($file instanceof AnalyzerAwareInterface) { + $file->setAnalyzer($this->analyzer); + } + + $pass->analyze($file); + } + + if ($pass instanceof CallbackAnalysisPassInterface) { + $pass->afterAnalysis(); + } + } + } while ($this->repeat && $runs < $this->maxRuns); + } + + public function repeat() + { + if ( ! $this->repeat) { + $this->analyzer->logger->debug('Repeatable passes will be repeated.'); + } + + $this->repeat = true; + + if (null !== $this->repeatedPass) { + $this->repeatedPass->repeat(); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/RepeatedPassAwareInterface.php b/src/Scrutinizer/PhpAnalyzer/Pass/RepeatedPassAwareInterface.php new file mode 100644 index 0000000..04a6dc4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/RepeatedPassAwareInterface.php @@ -0,0 +1,24 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +interface RepeatedPassAwareInterface +{ + public function setRepeatedPass(RepeatedPass $repeatedPass); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/ReturnTypeScanningPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/ReturnTypeScanningPass.php new file mode 100644 index 0000000..79a3ccc --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/ReturnTypeScanningPass.php @@ -0,0 +1,138 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnionTypeBuilder; +use Scrutinizer\PhpAnalyzer\Pass\AstAnalyzerPass; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Pass\RepeatedPass; +use Scrutinizer\PhpAnalyzer\Pass\RepeatedPassAwareInterface; +use Scrutinizer\PhpAnalyzer\Model\ContainerMethodInterface; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; + +/** + * Determines the return type of functions/methods by looking at their exit points. + * + * @author Johannes M. Schmitt + */ +class ReturnTypeScanningPass extends AstAnalyzerPass implements RepeatedPassAwareInterface +{ + private $repeatedPass; + + public function setRepeatedPass(RepeatedPass $repeatedPass) + { + $this->repeatedPass = $repeatedPass; + } + + public function enterScope(NodeTraversal $t) + { + $scope = $t->getScope(); + $root = $scope->getRootNode(); + + if (!$root instanceof \PHPParser_Node_Stmt_Function + && !$root instanceof \PHPParser_Node_Stmt_ClassMethod) { + return; + } + + // Bail out on abstract methods. + if ($root instanceof \PHPParser_Node_Stmt_ClassMethod + && ($root->type & \PHPParser_Node_Stmt_Class::MODIFIER_ABSTRACT) !== 0) { + return; + } + + // Bail out on methods defined on interfaces. + if ($root instanceof \PHPParser_Node_Stmt_ClassMethod + && $root->getAttribute('parent')->getAttribute('parent') instanceof \PHPParser_Node_Stmt_Interface) { + return; + } + + // Bail out on built-in functions marked by the @jms-builtin annotation. + // For these, we will solely infer types from doc comments. + if (false !== strpos($root->getDocComment(), '@jms-builtin')) { + return; + } + + // Same as above, but for methods of classes marked with @jms-builtin. + if ($root instanceof \PHPParser_Node_Stmt_ClassMethod) { + $maybeClass = $root->getAttribute('parent')->getAttribute('parent'); + if ($maybeClass instanceof \PHPParser_Node_Stmt_Class + && false !== strpos($maybeClass->getDocComment(), '@jms-builtin')) { + return; + } + } + + $cfg = $t->getControlFlowGraph(); + + $builder = new UnionTypeBuilder($this->typeRegistry); + foreach ($cfg->getNode(null)->getInEdges() as $edge) { + $sourceNode = $edge->getSource()->getAstNode(); + + if (!$sourceNode instanceof \PHPParser_Node_Stmt_Return) { + $builder->addAlternate($this->typeRegistry->getNativeType('null')); + continue; + } + + // If there is no type information available, we cannot make any + // assumptions for this function/method. + if (!$type = $sourceNode->getAttribute('type')) { + return; + } + + $builder->addAlternate($type); + } + + $type = $builder->build(); + if ($type->isUnknownType()) { + return; + } + + $function = $this->typeRegistry->getFunctionByNode($root); + if ($function instanceof GlobalFunction) { + if ($this->hasTypeChanged($type, $function->getReturnType())) { + $this->repeatedPass->repeat(); + } + + $function->setReturnType($type); + } else if ($function instanceof ContainerMethodInterface) { + $method = $function->getMethod(); + + if ($this->hasTypeChanged($type, $method->getReturnType())) { + $this->repeatedPass->repeat(); + } + + $method->setReturnType($type); + } + } + + private function hasTypeChanged(PhpType $newType, PhpType $currentType = null) + { + if (null === $currentType) { + return true; + } + + return false === $newType->equals($currentType); + } + + protected function getScopeCreator() + { + return new TypedScopeCreator($this->typeRegistry); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/SimplifyBooleanReturnPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/SimplifyBooleanReturnPass.php new file mode 100644 index 0000000..9da052c --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/SimplifyBooleanReturnPass.php @@ -0,0 +1,201 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use JMS\PhpManipulator\PhpParser\BlockNode; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +/** + * Boolean Return Simplification + * + * This pass checks whether a boolean return value could be simplified:: + * + * // Instead of + * function foo(A $a) { + * if ($a->isValid()) { + * return true; + * } else { + * return false; + * } + * } + * + * // it will suggest + * function foo(A $a) { + * return $a->isValid(); + * } + * + * In the example above, we assumed that ``$a->isValid()`` already returns a boolean. + * If that is not the case, it would suggest ``(boolean) $a->isValid()`` instead. + * + * @category checks + * @author Johannes M. Schmitt + */ +class SimplifyBooleanReturnPass extends AstAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if ($node instanceof \PHPParser_Node_Stmt_If + && 0 === count($node->elseifs) + && null !== $node->else + && $this->returnsBooleanLiteral($node->stmts) + && $this->returnsBooleanLiteral($node->else->stmts)) { + $this->checkIfElseStatements($node, $node->stmts, $node->else->stmts); + } else if ($node instanceof \PHPParser_Node_Stmt_If + && 0 === count($node->elseifs) + && null === $node->else + && ($next = $node->getAttribute('next')) instanceof \PHPParser_Node_Stmt_Return + && $this->returnsBooleanLiteral($node->stmts) + && $this->returnsBooleanLiteral($else = new BlockNode(array($next)))) { + $this->checkIfElseStatements($node, $node->stmts, $else); + } + } + + protected function isEnabled() + { + return true === $this->getSetting('enabled'); + } + + private function checkIfElseStatements(\PHPParser_Node_Stmt_If $node, BlockNode $if, BlockNode $else) + { + $ifTrue = $this->returnsTrue($if); + $elseTrue = $this->returnsTrue($else); + + if ($ifTrue === $elseTrue) { + if (null === $node->else) { + $this->phpFile->addComment($node->getLine(), Comment::error( + 'suspicious_code.superfluous_if_return', + 'This ``if`` statement and the following ``return`` statement are superfluous as you return always ``%return_value%``.', + array('return_value' => $ifTrue ? 'true' : 'false'))); + } else { + $this->phpFile->addComment($node->getLine(), Comment::error( + 'suspicious_code.superfluous_if_else', + 'This ``if``-``else`` statement are superfluous as you return always ``%return_value%``.', + array('return_value' => $ifTrue ? 'true' : 'false'))); + } + + return; + } + + $condType = $node->cond->getAttribute('type'); + $possiblyNeedsCast = !$condType || !$condType->isBooleanType(); + $cond = $node->cond; + + if ( ! $ifTrue) { + if ($cond instanceof \PHPParser_Node_Expr_BooleanNot) { + $cond = $cond->expr; + $condType = $cond->getAttribute('type'); + $possiblyNeedsCast = !$condType || !$condType->isBooleanType(); + } else { + $cond = new \PHPParser_Node_Expr_BooleanNot($cond); + $possiblyNeedsCast = false; + } + } + + if ($possiblyNeedsCast) { + $cond = new \PHPParser_Node_Expr_Cast_Bool($cond); + } + + if (null !== $node->else) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'coding_style.simplify_boolean_return_of_if_else', + 'The ``if``-``else`` statement can be simplified to ``return %expr%;``.', + array('expr' => self::$prettyPrinter->prettyPrintExpr($cond)))); + } else { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'coding_style.simplify_boolean_return_of_if_return', + 'This ``if`` statement, and the following ``return`` statement can be replaced with ``return %expr%;``.', + array('expr' => self::$prettyPrinter->prettyPrintExpr($cond)))); + } + } + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('simplify_boolean_return', 'array', new NodeBuilder()) + ->attribute('label', 'Boolean Return Simplification') + ->canBeEnabled() + ->attribute('help', <<<'EOF' +This checks whether boolean return values can be simplified. + +For example + +```php +function foo($foo) { + if (!$foo) { + return true; + } else { + return false; + } +} +``` + +could be simplified to + +```php +function foo($foo) { + return !$foo; +} +``` +EOF + ) + ; + + return $tb; + } + + protected function getScopeCreator() + { + return new TypedScopeCreator($this->typeRegistry); + } + + private function getBooleanReturn(BlockNode $node) + { + if (count($node) !== 1) { + return null; + } + + if (!$node[0] instanceof \PHPParser_Node_Stmt_Return) { + return null; + } + + if (!$node[0]->expr || !$node[0]->expr instanceof \PHPParser_Node_Expr_ConstFetch) { + return null; + } + + return strtolower($node[0]->expr->name); + } + + private function returnsTrue(BlockNode $node) + { + return 'true' === $this->getBooleanReturn($node); + } + + private function returnsBooleanLiteral(BlockNode $node) + { + $return = $this->getBooleanReturn($node); + + return 'true' === $return || 'false' === $return; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/SuccessiveTokenAndAstAnalzyer.php b/src/Scrutinizer/PhpAnalyzer/Pass/SuccessiveTokenAndAstAnalzyer.php new file mode 100644 index 0000000..63a02bd --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/SuccessiveTokenAndAstAnalzyer.php @@ -0,0 +1,64 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use JMS\PhpManipulator\TokenStream; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\PhpFile; + +abstract class SuccessiveTokenAndAstAnalzyer extends AstAnalyzerPass +{ + /** @var TokenStream */ + protected $stream; + + public function __construct() + { + parent::__construct(); + + $this->stream = new TokenStream(); + } + + public function analyze(File $file) + { + if (!$file instanceof PhpFile) { + return; + } + + $this->phpFile = $file; + + if ($this->analyzeAstFirst()) { + parent::analyze($file); + + $this->stream->setCode($file->getContent()); + $this->analyzeStream(); + } else { + $this->stream->setCode($file->getContent()); + $this->analyzeStream(); + + parent::analyze($file); + } + } + + protected function analyzeAstFirst() + { + return true; + } + + abstract protected function analyzeStream(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/SuspiciousCodePass.php b/src/Scrutinizer/PhpAnalyzer/Pass/SuspiciousCodePass.php new file mode 100644 index 0000000..bf8e268 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/SuspiciousCodePass.php @@ -0,0 +1,640 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowAnalysis; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NamedType; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +/** + * Suspicious Code Checks + * + * This pass checks for certain, usually suspicious code constructs which might + * indicate hidden errors in the program: + * + * 1. Empty Catch Blocks Without Comment + * ------------------------------------- + * + * .. code-block :: php + * + * try { + * $foo->bar(); + * } catch (\Exception $ex) { } + * + * In this case, it would suggest to add a comment to the catch block. + * + * 2. Fall-through in Switches without Comment + * ------------------------------------------- + * + * .. code-block :: php + * + * switch ($foo) { + * case 'bar': + * if ($x) { + * // ... + * break; + * } + * } + * + * Also in this case, it would suggest to add a comment to the case block. + * + * 3. Assignment of Null Return Value + * ---------------------------------- + * This checks whether an expression that always returns null is assigned to + * a variable, or property:: + * + * function foo($foo) { + * echo $foo; + * } + * $a = foo(); // This assignment would be flagged. + * + * 4. Instance-Of with Non-Existent Class + * -------------------------------------- + * This checks whether the class in an ``instanceof`` expression actually exists. + * These bugs are pretty hard to debug, and do not produce any runtime error. + * + * 5. Catch Block with Non-Existent Class + * -------------------------------------- + * This is the same as check 4), but for classes in the catch block. + * + * 6. Overriding Closure Use + * ------------------------- + * This checks if you override a variable that was included from the outer-scope. + * Typically, that suggests that you should include this variable as a reference:: + * + * function foo($a, $b) { + * return function() use ($a, &$b) { + * $a = 'foo'; // would be flagged + * $b = 'bar'; // ok + * } + * } + * + * 7. Parameter and Closure Use Conflict + * ------------------------------------- + * This is almost certainly an error in your program:: + * + * function foo($a) { + * return function($a) use ($a) { } + * } + * + * 8. Use Statement Alias Conflict + * ------------------------------- + * This checks whether the alias of a use statement conflicts with a class in the + * current namespaces of the same name. These issues are hard to detect as they + * only happen if both files are imported, and might go unnoticed for a while:: + * + * // Foo/A.php + * namespace Foo; + * + * class A { } + * + * // Bar/A.php + * namespace Bar; + * + * class A { } + * + * // Bar/B.php + * namespace Bar; + * + * use Foo\A; // Conflicts with Bar\A. + * + * class B + * { + * public function __construct(A $a) { } + * } + * + * @category checks + * @author Johannes M. Schmitt + */ +class SuspiciousCodePass extends AstAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('suspicious_code', 'array', new NodeBuilder()) + ->attribute('label', 'Check Suspicious Code') + ->attribute('type', 'choice') + ->canBeDisabled() + ->children() + ->booleanNode('overriding_parameter') + ->defaultFalse() + ->attribute('label', 'Overriding Parameter') + ->end() + ->booleanNode('overriding_closure_use') + ->defaultTrue() + ->attribute('label', 'Overriding Closure Use') + ->end() + ->booleanNode('parameter_closure_use_conflict') + ->defaultTrue() + ->attribute('label', 'Conflict Between Parameter and Closure Use') + ->end() + ->booleanNode('parameter_multiple_times') + ->defaultTrue() + ->attribute('label', 'Parameter name used multiple times') + ->end() + ->booleanNode('non_existent_class_in_instanceof_check') + ->defaultTrue() + ->attribute('label', 'Non-existent class in instanceof check') + ->end() + ->booleanNode('non_existent_class_in_catch_clause') + ->defaultTrue() + ->attribute('label', 'Non-existent class in catch clause') + ->end() + ->booleanNode('assignment_of_null_return') + ->defaultTrue() + ->attribute('label', 'Assignment of null return type (e.g. assignment of a function which always returns null to a variable)') + ->end() + ->booleanNode('non_commented_switch_fallthrough') + ->defaultTrue() + ->attribute('label', 'Non-commented fall-through in a switch loop') + ->end() + ->booleanNode('non_commented_empty_catch_block') + ->defaultTrue() + ->attribute('label', 'Non-commented empty catch block') + ->end() + ->booleanNode('overriding_private_members') + ->defaultTrue() + ->attribute('label', 'Overriding private class members') + ->end() + ->booleanNode('use_statement_alias_conflict') + ->defaultTrue() + ->attribute('label', 'Conflicts between use statements.') + ->end() + ->booleanNode('precedence_in_condition_assignment') + ->defaultTrue() + ->attribute('label', 'Detects precedence mistakes in assignments in conditions.') + ->end() + ->end() + ; + + return $tb; + } + + protected function isEnabled() + { + return true === $this->getSetting('enabled'); + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_StaticCall: + case $node instanceof \PHPParser_Node_Expr_MethodCall: + case $node instanceof \PHPParser_Node_Expr_FuncCall: + $this->handleCall($node); + break; + + case $node instanceof \PHPParser_Node_Expr_Instanceof: + $this->handleInstanceOf($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Catch: + $this->handleEmptyCatch($node); + $this->handleCatchWithNonExistentClass($node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Case: + $this->handleCase($node); + break; + + case $node instanceof \PHPParser_Node_Expr_Assign: + $this->handleAssign($t, $node); + break; + + case $node instanceof \PHPParser_Node_Stmt_Property: + if (0 !== ($node->type & \PHPParser_Node_Stmt_Class::MODIFIER_PRIVATE)) { + foreach ($node->props as $propertyNode) { + $this->handlePrivateProperty($propertyNode); + } + } + break; + + case $node instanceof \PHPParser_Node_Stmt_Function: + case $node instanceof \PHPParser_Node_Stmt_ClassMethod: + case $node instanceof \PHPParser_Node_Expr_Closure: + $this->handleParams($node->params); + + if ($node instanceof \PHPParser_Node_Expr_Closure) { + $this->handleClosure($node); + } else if ($node instanceof \PHPParser_Node_Stmt_ClassMethod + && 0 !== ($node->type & \PHPParser_Node_Stmt_Class::MODIFIER_PRIVATE)) { + $this->handlePrivateMethod($node); + } + + break; + + case $node instanceof \PHPParser_Node_Stmt_UseUse: + $this->handleUse($node); + break; + } + } + + private function handleUse(\PHPParser_Node_Stmt_UseUse $use) + { + if ( ! $this->getSetting('use_statement_alias_conflict')) { + return; + } + + $namespace = null; + $parent = $use->getAttribute('parent'); + while (null !== $parent) { + if ($parent instanceof \PHPParser_Node_Stmt_Namespace) { + $namespace = $parent->name ? implode('\\', $parent->name->parts) : null; + break; + } + + $parent = $parent->getAttribute('parent'); + } + + $localClass = ($namespace ? $namespace.'\\' : '').$use->alias; + if (strtolower($localClass) === strtolower(implode('\\', $use->name->parts))) { + return; + } + + if ($this->typeRegistry->hasClass($localClass)) { + $this->phpFile->addComment($use->name->getLine(), Comment::error( + 'suspicious_code.use_statement_alias_conflict', + 'This use statement conflicts with another class in this namespace, ``%local_class%``.', + array('local_class' => $localClass))); + } + } + + private function handlePrivateMethod(\PHPParser_Node_Stmt_ClassMethod $methodNode) + { + if ( ! $this->getSetting('overriding_private_members')) { + return; + } + + $classNode = $methodNode->getAttribute('parent')->getAttribute('parent'); + $class = $this->typeRegistry->getClassByNode($classNode); + if ( ! $class->isClass()) { + return; + } + + if ((null !== $superClass = $class->getSuperClassType()) + && (null !== $superClass = $superClass->toMaybeObjectType()) + && $superClass->hasMethod($methodNode->name) + && $superClass->getMethod($methodNode->name)->isPrivate()) { + $this->phpFile->addComment($methodNode->getLine(), Comment::warning( + 'suspicious_code.overriding_private_method', + 'Consider using a different method name as you override a private method of the parent class.')); + } + } + + private function handlePrivateProperty(\PHPParser_Node_Stmt_PropertyProperty $propertyNode) + { + if ( ! $this->getSetting('overriding_private_members')) { + return; + } + + $class = $this->typeRegistry->getClassByNode($propertyNode->getAttribute('parent')->getAttribute('parent')->getAttribute('parent')); + if ( ! $class->isClass()) { + return; + } + + if ((null !== $superClass = $class->getSuperClassType()) + && (null !== $superClass = $superClass->toMaybeObjectType()) + && $superClass->hasProperty($propertyNode->name) + && $superClass->getProperty($propertyNode->name)->isPrivate()) { + $this->phpFile->addComment($propertyNode->getLine(), Comment::warning( + 'suspicious_code.overriding_private_property', + 'Consider using a different property name as you override a private property of the parent class.')); + } + } + + private function handleAssign(NodeTraversal $t, \PHPParser_Node_Expr_Assign $node) + { + if (!$node->var instanceof \PHPParser_Node_Expr_Variable + || !is_string($node->var->name)) { + return; + } + + $scope = $t->getScope(); + if (null === $var = $scope->getVar($node->var->name)) { + return; + } + + if ($var->isReference()) { + return; + } + + $nameNode = $var->getNameNode(); + if ($nameNode instanceof \PHPParser_Node_Param + && $this->getSetting('overriding_parameter')) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'suspicious_code.assignment_to_parameter', + 'Consider using a different name than the parameter ``$%param_name%``. This often makes code more readable.', + array('param_name' => $node->var->name))); + } else if ($nameNode instanceof \PHPParser_Node_Expr_ClosureUse + && $this->getSetting('overriding_closure_use')) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'suspicious_code.assignment_to_closure_import', + 'Consider using a different name than the imported variable ``$%variable_name%``, or did you forget to import by reference?', + array('variable_name' => $node->var->name))); + } + } + + private function handleClosure(\PHPParser_Node_Expr_Closure $node) + { + $names = array_map(function(\PHPParser_Node_Expr_ClosureUse $use) { + return $use->var; + }, $node->uses); + + foreach ($node->params as $param) { + if (in_array($param->name, $names, true) + && $this->getSetting('parameter_closure_use_conflict')) { + $this->phpFile->addComment($param->getLine(), Comment::warning( + 'suspicious_code.param_name_with_imported_var_conflict', + 'The parameter name ``$%param_name%`` conflicts with one of the imported variables.', + array('param_name' => $param->name))); + } + } + } + + private function handleParams(array $params) + { + $names = array(); + foreach ($params as $param) { + assert($param instanceof \PHPParser_Node_Param); + + if (in_array($param->name, $names, true) && $this->getSetting('parameter_multiple_times')) { + $this->phpFile->addComment($param->getLine(), Comment::warning( + 'suspicious_code.param_name_used_multiple_times', + 'You cannot use the parameter ``$%param_name%`` multiple times.', + array('param_name' => $param->name))); + } + $names[] = $param->name; + } + } + + private function handleInstanceOf(\PHPParser_Node_Expr_Instanceof $node) + { + if (!$this->getSetting('non_existent_class_in_instanceof_check')) { + return; + } + + if (!$classType = $node->class->getAttribute('type')) { + return; + } + + if ($classType instanceof NamedType + && !$this->typeRegistry->getClass($classType->getReferenceName())) { + $this->phpFile->addComment($node->class->getLine(), Comment::warning( + 'suspicious_code.non_existent_class_for_instanceof', + 'The class "%class_name%" does not exist. Did you forget a USE statement, or did you not list all dependencies?', + array('class_name' => $classType->getReferenceName()))); + } + } + + private function handleCatchWithNonExistentClass(\PHPParser_Node_Stmt_Catch $node) + { + if (!$this->getSetting('non_existent_class_in_catch_clause')) { + return; + } + + if (!$classType = $node->type->getAttribute('type')) { + return; + } + + if ($classType instanceof NamedType + && !$this->typeRegistry->getClass($classType->getReferenceName())) { + $this->phpFile->addComment($node->type->getLine(), Comment::warning( + 'suspicious_code.non_existent_class_for_catch', + 'The class "%class_name%" does not exist. Did you forget a USE statement, or did you not list all dependencies?', + array('class_name' => $classType->getReferenceName()))); + } + } + + private function handleCall(\PHPParser_Node $node) + { + if (!$this->getSetting('assignment_of_null_return')) { + return; + } + + if (!$returnType = $node->getAttribute('type')) { + return; + } + + if (!$returnType->isNullType()) { + return; + } + + if (!$node->getAttribute('parent') instanceof \PHPParser_Node_Expr_Assign) { + return; + } + + $this->phpFile->addComment($node->getAttribute('parent')->getLine(), Comment::warning( + 'suspicious_code.assignment_of_null_return', + 'The assignment to ``%assignment_expr%`` looks wrong as ``%call_expr%`` always returns null.', + array('assignment_expr' => self::$prettyPrinter->prettyPrintExpr($node->getAttribute('parent')->var), + 'call_expr' => self::$prettyPrinter->prettyPrintExpr($node)))); + } + + private function handleCase(\PHPParser_Node_Stmt_Case $node) + { + if (!$this->getSetting('non_commented_switch_fallthrough')) { + return; + } + + if (0 === count($node->stmts)) { + return; + } + + // Check if the next statement is a CASE statement. + $nextCase = $node->getAttribute('next'); + if (!$nextCase instanceof \PHPParser_Node_Stmt_Case) { + return; + } + + // If the last statement of the CASE node is a BREAK/CONTINUE/RETURN + // THROW/GOTO statement, then we can always rule out a FALL-THROUGH. The + // opposite, i.e. when there is none, is not true though. + foreach ($node->stmts as $lastStmt); + if ($lastStmt instanceof \PHPParser_Node_Stmt_Break + || $lastStmt instanceof \PHPParser_Node_Stmt_Continue + || $lastStmt instanceof \PHPParser_Node_Stmt_Return + || $lastStmt instanceof \PHPParser_Node_Stmt_Throw + || $lastStmt instanceof \PHPParser_Node_Stmt_Goto) { + return; + } + + $cfa = new ControlFlowAnalysis(); + $cfa->process($node); + $graph = $cfa->getGraph(); + +// $serializer = new GraphvizSerializer(); +// echo $serializer->serialize($graph); + + // In case of a fallthrough, the control flow falls through to the statements block + // of the next CASE statement. If that node is not part of the control flow graph, + // then the control flow cannot reach from this starting node. + if ( ! $graph->hasNode($nextCase->stmts)) { + return; + } + + foreach ($node->stmts as $lastChild); + $previousLineEnd = $lastChild->getLine(); + + if ($previousLineEnd === $nextCase->getLine()) { + $this->phpFile->addComment($previousLineEnd, Comment::warning( + 'coding_style.unreadable_case', + 'Consider moving this CASE statement to a new line.')); + + return; + } + + $code = explode("\n", $this->phpFile->getContent()); + + $foundComment = false; + for ($i = $previousLineEnd, $c = $nextCase->getLine(); $i<$c; $i++) { + if (empty($code[$i])) { + continue; + } + + $lineTokens = token_get_all('phpFile->addComment($previousLineEnd, Comment::warning( + 'suspicious_code.non_empty_switch_fallthrough', + 'Consider adding a comment if this fall-through is intended.')); + } + } + + private function handleEmptyCatch(\PHPParser_Node_Stmt_Catch $node) + { + if (!$this->getSetting('non_commented_empty_catch_block')) { + return; + } + + if (count($node->stmts) > 0) { + return; + } + + if (-1 === $line = $node->getLine()) { + return; + } + + $code = explode("\n", $this->phpFile->getContent()); + + $previousBlock = $node->getAttribute('parent')->stmts; + foreach ($previousBlock as $lastChild); + $previousLineEnd = count($previousBlock) > 0 ? $lastChild->getLine() + : $previousBlock->getLine(); + + // Not sure how readable that code is supposed to be, but it doesn't seem to look good. + if ($previousLineEnd === $node->getLine()) { + $this->phpFile->addComment($previousLineEnd, Comment::warning( + 'coding_style.unreadable_catch', + 'Consider moving this CATCH statement to a new line.')); + + return; + } + + // Start scanning for a comment one line after the last statement of the previous block. + $foundComment = $afterCatch = $inCatchBlock = $terminateOnNextNonWhitespace = $afterCondition = false; + for ($i = $previousLineEnd, $c = count($code); $i<$c; $i++) { + if (empty($code[$i])) { + continue; + } + + // Might break for some weird inlined HTML, but honestly who does that these days? + $lineTokens = token_get_all('phpFile->addComment($node->getLine(), Comment::warning( + 'suspicious_code.empty_catch_block', + 'Consider adding a comment why this CATCH block is empty.')); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/TokenAndAstStreamAnalyzerPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/TokenAndAstStreamAnalyzerPass.php new file mode 100644 index 0000000..d7826c6 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/TokenAndAstStreamAnalyzerPass.php @@ -0,0 +1,64 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\AnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; +use JMS\PhpManipulator\SimultaneousTokenAstStream; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\PhpFile; + +abstract class TokenAndAstStreamAnalyzerPass implements AnalysisPassInterface, AnalyzerAwareInterface +{ + protected static $prettyPrinter; + + protected $analyzer; + protected $typeRegistry; + protected $phpFile; + protected $stream; + + public function __construct() + { + $this->stream = new SimultaneousTokenAstStream(); + + if (null === self::$prettyPrinter) { + self::$prettyPrinter = new \PHPParser_PrettyPrinter_Zend(); + } + } + + public function setAnalyzer(Analyzer $analyzer) + { + $this->analyzer = $analyzer; + $this->typeRegistry = $analyzer->getTypeRegistry(); + } + + public final function analyze(File $file) + { + if (!$file instanceof PhpFile) { + return; + } + + $this->phpFile = $file; + $this->stream->setInput($file->getContent(), $file->getAst()); + $this->analyzeStream(); + } + + abstract protected function analyzeStream(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/TokenStreamAnalyzerPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/TokenStreamAnalyzerPass.php new file mode 100644 index 0000000..dbc7914 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/TokenStreamAnalyzerPass.php @@ -0,0 +1,56 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\AnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; +use JMS\PhpManipulator\TokenStream; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\PhpFile; + +abstract class TokenStreamAnalyzerPass implements AnalysisPassInterface, AnalyzerAwareInterface +{ + protected $analyzer; + protected $phpFile; + protected $stream; + + public function __construct() + { + $this->stream = new TokenStream(); + } + + public function setAnalyzer(Analyzer $analyzer) + { + $this->analyzer = $analyzer; + } + + public function analyze(File $file) + { + if (!$file instanceof PhpFile) { + return; + } + + $this->phpFile = $file; + $this->stream->setCode($file->getContent()); + $this->analyzeStream(); + } + + abstract protected function analyzeStream(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/TypeInferencePass.php b/src/Scrutinizer/PhpAnalyzer/Pass/TypeInferencePass.php new file mode 100644 index 0000000..43bf014 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/TypeInferencePass.php @@ -0,0 +1,110 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Psr\Log\LoggerInterface; +use Scrutinizer\PhpAnalyzer\Pass\AnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\Traversal\AbstractScopedCallback; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter\ArrayFunctionInterpreter; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter\ChainableFunctionInterpreter; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter\CoreFunctionInterpreter; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter\ChainableMethodInterpreter; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter\CoreMethodInterpreter; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter\PhpUnitMethodInterpreter; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter\SemanticReverseAbstractInterpreter; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypeInference; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Exception\MaxIterationsExceededException; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\PhpFile; + +/** + * Compiler Pass for running type inference analysis. + * + * @author Johannes M. Schmitt + */ +class TypeInferencePass extends AbstractScopedCallback implements AnalysisPassInterface, AnalyzerAwareInterface +{ + /** @var LoggerInterface */ + private $logger; + private $registry; + private $reverseInterpreter; + private $functionInterpreter; + private $methodInterpreter; + private $commentParser; + private $scopeCreator; + + /** @var File */ + private $file; + + public function setAnalyzer(Analyzer $analyzer) + { + $this->logger = $analyzer->logger; + $this->registry = $registry = $analyzer->getTypeRegistry(); + $this->reverseInterpreter = new SemanticReverseAbstractInterpreter($registry); + $this->functionInterpreter = new ChainableFunctionInterpreter(array( + new CoreFunctionInterpreter($registry), + new ArrayFunctionInterpreter($registry), + )); + $this->methodInterpreter = new ChainableMethodInterpreter(array( + new CoreMethodInterpreter($registry), + new PhpUnitMethodInterpreter($registry), + )); + $this->commentParser = new \Scrutinizer\PhpAnalyzer\PhpParser\DocCommentParser($registry); + $this->commentParser->setLogger($analyzer->logger); + $this->scopeCreator = new TypedScopeCreator($registry); + } + + public function getScopeCreator() + { + return $this->scopeCreator; + } + + public function analyze(File $file) + { + if (!$file instanceof PhpFile) { + return; + } + + $this->file = $file; + NodeTraversal::traverseWithCallback($file->getAst(), $this, $this->scopeCreator); + } + + public function enterScope(NodeTraversal $traversal) + { + $typeInference = new TypeInference($traversal->getControlFlowGraph(), + $this->reverseInterpreter, + $this->functionInterpreter, + $this->methodInterpreter, + $this->commentParser, + $traversal->getScope(), + $this->registry, + $this->logger); + try { + $typeInference->analyze(); + } catch (MaxIterationsExceededException $ex) { + $scopeRoot = $traversal->getScopeRoot(); + $this->logger->warning($ex->getMessage().' - Scope-Root: '.get_class($scopeRoot). ' on line '.$scopeRoot->getLine().' in '.$this->file->getName()); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/TypeScanningPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/TypeScanningPass.php new file mode 100644 index 0000000..4226c64 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/TypeScanningPass.php @@ -0,0 +1,349 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\Pass\CallbackAnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\ClassParser; +use Scrutinizer\PhpAnalyzer\PhpParser\DocCommentParser; +use Scrutinizer\PhpAnalyzer\PhpParser\FunctionParser; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use Scrutinizer\PhpAnalyzer\PhpParser\ParameterParser; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\ConstantContainerInterface; +use Scrutinizer\PhpAnalyzer\Model\GlobalConstant; +use Scrutinizer\PhpAnalyzer\Model\InterfaceC; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; +use Scrutinizer\PhpAnalyzer\Model\TraitC; + +/** + * Scans the code for new type definitions, and then populates the + * TypeRegistry with them. + * + * After all files have been scanned, the found types are normalized if + * possible to speed up lookups. + * + * @author Johannes M. Schmitt + */ +class TypeScanningPass extends AstAnalyzerPass implements CallbackAnalysisPassInterface +{ + /** @var DocCommentParser */ + private $commentParser; + + /** @var ClassParser */ + private $classParser; + + /** @var FunctionParser */ + private $functionParser; + private $visitedTypes; + private $classFiles; + private $importedNamespaces = array(); + + public function setAnalyzer(Analyzer $analyzer) + { + parent::setAnalyzer($analyzer); + + $paramParser = new ParameterParser($this->typeRegistry); + + $this->commentParser = new DocCommentParser($this->typeRegistry); + $this->commentParser->setLogger($analyzer->logger); + + $this->classParser = new ClassParser($this->typeRegistry, $paramParser, $this->commentParser, $analyzer->logger); + $this->classFiles = new \SplObjectStorage(); + + $this->functionParser = new FunctionParser($this->typeRegistry, $paramParser); + } + + public function enterScope(NodeTraversal $traversal) + { + // This has the side-effect of attaching type information to parameters. + // TODO: This is more a hack atm, we should look into refactoring this. + // Maybe a simple rename to buildScope(), or getOrBuildScope. + $traversal->getScope(); + } + + public function shouldTraverse(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if ($node instanceof \PHPParser_Node_Stmt_Namespace) { + $this->importedNamespaces = array('' => $node->name ? implode("\\", $node->name->parts) : ''); + } else if ($node instanceof \PHPParser_Node_Stmt_UseUse) { + $this->importedNamespaces[$node->alias] = implode("\\", $node->name->parts); + } + + return true; + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + $this->enterNode($node); + + if ($node instanceof \PHPParser_Node_Stmt_Namespace) { + $this->importedNamespaces = array(); + } + } + + private function enterNode(\PHPParser_Node $node) + { + if (NodeUtil::isMethodContainer($node)) { + $this->commentParser->setCurrentClassName(implode("\\", $node->namespacedName->parts)); + $this->commentParser->setImportedNamespaces($this->importedNamespaces); + $this->classParser->setImportedNamespaces($this->importedNamespaces); + $class = $this->classParser->parse($node); + $this->classFiles[$class] = $this->phpFile; + + if ($this->typeRegistry->hasClass($class->getName(), TypeRegistry::LOOKUP_NO_CACHE)) { + $this->analyzer->logger->warning(sprintf('The class "%s" has been defined more than once (maybe as a fixture for code generation). Ignoring the second definition.', $class->getName())); + + return; + } + + $this->typeRegistry->registerClass($class); + } else if ($node instanceof \PHPParser_Node_Stmt_Function) { + $this->functionParser->setImportedNamespaces($this->importedNamespaces); + $function = $this->functionParser->parse($node); + + if ($this->typeRegistry->hasFunction($functionName = $function->getName(), false)) { + $this->analyzer->logger->warning(sprintf('The function "%s" has been defined more than once (probably conditionally). Ignoring the second definition.', $functionName)); + + return; + } + + $this->typeRegistry->registerFunction($function); + } else if (NodeUtil::isConstantDefinition($node)) { + assert($node instanceof \PHPParser_Node_Expr_FuncCall); + + if (!$node->args[0]->value instanceof \PHPParser_Node_Scalar_String) { + return; + } + + $constant = new GlobalConstant($node->args[0]->value->value); + $constant->setAstNode($node); + $constant->setPhpType($this->typeRegistry->getNativeType('unknown')); + + if (null !== $type = $node->args[1]->value->getAttribute('type')) { + $constant->setPhpType($type); + } + + if ($this->typeRegistry->hasConstant($constant->getName(), false)) { + $this->analyzer->logger->warning(sprintf('The constant "%s" was defined more than once. Ignoring all but first definition.', $constant->getName())); + + return; + } + + $this->typeRegistry->registerConstant($constant); + } + } + + public function afterAnalysis() + { + // Enable the cache again now that we have scanned all types. + $this->typeRegistry->setCacheDisabled(false); + + $this->visitedTypes = new \SplObjectStorage(); + foreach ($this->typeRegistry->getClasses() as $class) { + $this->normalizeType($class); + } + + $this->typeRegistry->resolveNamedTypes(); + } + + public function beforeAnalysis() + { + // We disable the cache during type scanning in order to not load any + // stale classes from the cache which might have been modified, but which + // we just have not scanned yet. + $this->typeRegistry->setCacheDisabled(true); + + $this->analyzer->logger->info('Scanning Code For Types'); + } + + protected function getScopeCreator() + { + return new TypedScopeCreator($this->typeRegistry); + } + + private function normalizeType(MethodContainer $class) + { + // If the class is coming from the cache, it is already normalized. + if ($class->isNormalized()) { + return true; + } + + // If this class was visited as part of a parent/interface, return here. + if (isset($this->visitedTypes[$class])) { + return $this->visitedTypes[$class]; + } + + $normalized = true; + if ($class instanceof Clazz) { + if ($superClass = $class->getSuperClass()) { + // Check if the type registry contains this class + if ($superClassType = $this->typeRegistry->getClass($superClass)) { + if (!$this->normalizeType($superClassType)) { + $normalized = false; + } + + $this->mergeTypes($class, $superClassType); + } else { + $normalized = false; + } + } + + foreach ($class->getImplementedInterfaces() as $interfaceName) { + if (null === $interfaceType = $this->typeRegistry->getClass($interfaceName)) { + $normalized = false; + continue; + } + + if (!$this->normalizeType($interfaceType)) { + $normalized = false; + } + + $this->mergeTypes($class, $interfaceType); + } + } else if ($class instanceof InterfaceC) { + foreach ($class->getExtendedInterfaces() as $interfaceName) { + if (null === $interfaceType = $this->typeRegistry->getClass($interfaceName)) { + $normalized = false; + continue; + } + + if (!$this->normalizeType($interfaceType)) { + $normalized = false; + } + + $this->mergeTypes($class, $interfaceType); + } + } else if ($class instanceof TraitC) { + // TODO: Implement support for Traits + } else { + throw new \LogicException('Previous ifs were exhaustive.'); + } + + $class->setNormalized($normalized); + $this->visitedTypes[$class] = $normalized; + + return $normalized; + } + + private function mergeTypes(MethodContainer $a, MethodContainer $b) + { + switch (true) { + case $a instanceof Clazz && $b instanceof Clazz: + $this->mergeClasses($a, $b); + break; + + case $a instanceof Clazz && $b instanceof InterfaceC: + $this->mergeInterfaceIntoClass($a, $b); + break; + + case $a instanceof InterfaceC && $b instanceof InterfaceC: + $this->mergeInterfaces($a, $b); + break; + + default: + $this->analyzer->logger->warning(sprintf('Cannot merge %s into %s; probably invalid code.', $b, $a)); + } + } + + private function mergeInterfaces(InterfaceC $a, InterfaceC $b) + { + $this->copyMethods($a, $b); + $this->copyConstants($a, $b); + + $a->setExtendedInterfaces(array_unique(array_merge( + $a->getExtendedInterfaces(), + $b->getExtendedInterfaces()))); + } + + private function mergeClasses(Clazz $a, Clazz $b) + { + $this->copyMethods($a, $b); + $this->copyConstants($a, $b); + + foreach ($b->getProperties() as $classProperty) { + if ($a->hasProperty($classProperty->getName())) { + // TODO: Check if $a has a type, and if not copy whatever + // type from $b if available + continue; + } + + $property = $classProperty->getProperty(); + + // We do copy all properties, even private ones. This is done to allow + // analyzing passes to check access restrictions without traversing + // the entire inheritance chain. + + $a->addProperty($property, $classProperty->getDeclaringClass()); + } + + $a->setSuperClasses(array_merge( + array($b->getName()), + $b->getSuperClasses() + )); + + $a->setImplementedInterfaces(array_unique(array_merge( + $a->getImplementedInterfaces(), + $b->getImplementedInterfaces() + ))); + } + + private function mergeInterfaceIntoClass(Clazz $a, InterfaceC $b) + { + $this->copyConstants($a, $b); + $this->copyMethods($a, $b); + + $a->setImplementedInterfaces(array_unique(array_merge( + $a->getImplementedInterfaces(), + $b->getExtendedInterfaces()))); + } + + private function copyConstants(ConstantContainerInterface $a, ConstantContainerInterface $b) + { + foreach ($b->getConstants() as $interfaceConstant) { + if ($a->hasConstant($interfaceConstant->getName())) { + continue; + } + + $constant = $interfaceConstant->getConstant(); + $a->addConstant($constant, $interfaceConstant->getDeclaringClass()); + } + } + + private function copyMethods(MethodContainer $a, MethodContainer $b) + { + // merge in methods from $b into $a + foreach ($b->getMethods() as $containerMethod) { + // method already exists on $a + if ($a->hasMethod($containerMethod->getName())) { + // TODO: Check types for the method in $a, and if not complete + // copy over all available types from $b + continue; + } + + $method = $containerMethod->getMethod(); + + // We do copy over all methods, even private ones. See above for properties. + $a->addMethod($method, $containerMethod->getDeclaringClass()); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/UnusedCodeChecksPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/UnusedCodeChecksPass.php new file mode 100644 index 0000000..48327eb --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/UnusedCodeChecksPass.php @@ -0,0 +1,54 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\Pass\AstAnalyzerPass; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Model\Comment; + +class UnusedCodeChecksPass extends AstAnalyzerPass +{ + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if ($node instanceof \PHPParser_Node_Stmt_ClassMethod) { + $this->checkUnusedMethod($t, $node); + } + } + + protected function getScopeCreator() + { + return new TypedScopeCreator($this->typeRegistry); + } + + private function checkUnusedMethod(NodeTraversal $t, \PHPParser_Node_Stmt_ClassMethod $node) + { + if ((\PHPParser_Node_Stmt_Class::MODIFIER_PRIVATE & $node->type) === 0) { + return; + } + + $classType = $t->getScope()->getTypeOfThis()->restrictByNotNull(); + if (($method = $classType->toMaybeObjectType()->getMethod($node->name)) + && 0 === count($method->getInMethodCallSites())) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'cleanup.unused_method', + 'This method is unused, and could be removed.')); + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/UseStatementFixerPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/UseStatementFixerPass.php new file mode 100644 index 0000000..f06d4e7 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/UseStatementFixerPass.php @@ -0,0 +1,515 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use JMS\PhpManipulator\TokenStream\AbstractToken; + +/** + * Use Statement Fixes + * + * This pass performs some ``use`` statement related fixes. + * + * 1. Removing Unused Use Statements + * 2. Re-ordering Use Statements Alphabetically (disabled by default) + * + * .. note :: + * + * By default, this pass rewrites all ``use`` statements that import + * multiple namespaces (``use A, B;``) to separate statements (``use A; use B;``). + * You can turn this off with the ``preserve_multiple`` setting. + * + * @category fixes + * @author Johannes M. Schmitt + */ +class UseStatementFixerPass extends FixingAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + private $prettyPrinter; + private $newContent; + + public function __construct() + { + parent::__construct(); + + $this->prettyPrinter = new \PHPParser_PrettyPrinter_Zend(); + $this->prettyPrinter->setPreserveOriginalNames(true); + } + + public function getConfiguration() + { + $tb = new \Symfony\Component\Config\Definition\Builder\TreeBuilder(); + $tb->root('use_statement_fixes', 'array', new \Scrutinizer\PhpAnalyzer\Config\NodeBuilder()) + ->canBeDisabled() + ->children() + ->booleanNode('remove_unused')->defaultTrue()->end() + ->booleanNode('preserve_multiple') + ->info('Whether you would like multiple imports in one USE statement to be preserved, e.g. ``use A, B;``.') + ->defaultFalse() + ->end() + ->booleanNode('order_alphabetically')->defaultFalse()->end() +// ->booleanNode('alias_qualified_names')->defaultFalse()->end() + ->end() + ; + + return $tb; + } + + protected function isEnabled() + { + return $this->getSetting('enabled'); + } + + protected function getNewContent() + { + return $this->newContent; + } + + protected function analyzeStream() + { +// $this->rewriteQualifiedNames(); + $this->rewriteImports(); + } + + private function rewriteQualifiedNames() + { + if ( ! $this->getSetting('alias_qualified_names')) { + return; + } + + /* + * We do a two step analysis. + * + * First, we traverse the stream, and gather all imports for each namespace. + * On the second, pass we perform the actual rewrite. + * + * During the rewrite, it could occur that we actually do not rewrite + * every found import, for example if there is already an import with the + * same name, or a class in the local namespace. + */ + $token = $this->stream->nextToken; + $namespaceToken = $token; + $imports = array(); + while (null !== $token) { + switch (true) { + case $token->matches(T_NAMESPACE): + $namespaceToken->setAttribute('new_imports', $imports); + $namespaceToken = $token; + $imports = array(); + break; + + case $token->matches(T_USE): + if ( ! $namespaceToken->hasAttribute('first_use_token')) { + $namespaceToken->setAttribute('first_use_token', $token); + } + break; + + case $token->matches(T_DOC_COMMENT): + $this->extractQualifiedNamesFromComment($token->getContent(), $imports); + break; + + // TODO + } + + $token = $token->getNextToken(); + } + } + + private function extractQualifiedNamesFromComment($comment, array &$imports) + { + // TODO + } + + private function rewriteImports() + { + $this->newContent = ''; + + /* + * We perform the following steps to extract use statements, and preserve + * the formatting as much as possible. + * + * 1. When reaching a T_USE (1), we scan all imports until the + * last ";" of the last T_USE that we can safely rewrite (2). + * 2. Parse the imported namespaces and their aliases between (1) and (2). + * 3. Process the imports (removing unused, re-ordering). + * 4a. Add resulting imports to new content. + * 4b. If line where the first marker is placed (1) is now empty, remove + * it. This is the case when all imports were removed. + * 5. Continue with 1. + * + * . + * . + * . + * ...(1)use ...; + * use ..., + * ...;(2) + * + * (1): Marker for the first use statement of the current block + * (2): Marker for the last ";" of the last use statement + */ + while ($this->stream->moveNext()) { + $imports = array(); + $lastToken = null; + $writeMultiple = false; + // Step 1 + if ($this->stream->node instanceof \PHPParser_Node_Stmt_Use + && $this->stream->token->matches(T_USE) + // Steps 2 + 3 + && $this->isRewritable($this->stream->node, $this->stream->token, $imports, $lastToken, $writeMultiple)) { + // Step 4b + if (empty($imports)) { + $endOfLine = $lastToken->findNextToken('END_OF_LINE')->get(); + $remainingContentOnLine = $lastToken->getContentBetweenIncluding($endOfLine); + + // All imports of the scanned blocks have been removed. Check + // to see if the resulting line is empty and remove. + if ('' === trim($remainingContentOnLine) && $this->isLastLineEmpty()) { + $this->removeLastLine(); + $this->stream->moveToToken($endOfLine); + + // When there are no more USE statements, we often get two consecutive + // empty lines. To prevent that, we will remove the following if it is + // empty, and also the previous line is empty. + if ($this->isPreviousLineEmpty() + && (null !== $newEndOfLine = $endOfLine->findNextToken('END_OF_LINE')->getOrElse(null)) + && '' === trim($endOfLine->getContentBetween($newEndOfLine))) { + $this->stream->moveToToken($newEndOfLine); + } + + } else { + $this->stream->moveToToken($lastToken); + } + + // Step 5 + continue; + } + + $this->sortImports($imports); + + // Step 4a + if ($writeMultiple) { + $this->writeCombinedImports($imports, $this->stream->token); + } else { + $this->writeSingleImports($imports, $this->stream->token->getLineIndentation()); + } + + $this->stream->moveToToken($lastToken); + + // Step 5 + continue; + } + + // No use statement, or not rewritable. + $this->newContent .= $this->stream->token->getContent(); + } + } + + private function removeLastLine() + { + if (false !== $pos = strrpos($this->newContent, "\n")) { + $this->newContent = substr($this->newContent, 0, $pos + 1); + + return; + } + + $this->newContent = ''; + } + + private function isPreviousLineEmpty() + { + if (false === $pos = strrpos($this->newContent, "\n")) { + return false; + } + + if (false === $pos = strrpos($this->newContent, "\n", $pos - 1 - strlen($this->newContent))) { + return false; + } + + return '' === trim(substr($this->newContent, $pos + 1)); + } + + private function isLastLineEmpty() + { + if (false !== $pos = strrpos($this->newContent, "\n")) { + return '' === trim(substr($this->newContent, $pos + 1)); + } + + return '' === trim($this->newContent); + } + + private function writeSingleImports(array $queuedImports, $indentation) + { + $first = true; + foreach ($queuedImports as $namespace => $alias) { + if ( ! $first) { + $this->newContent .= "\n".$indentation; + } + $first = false; + + $this->newContent .= 'use '.$namespace; + if (null !== $alias) { + $this->newContent .= ' as '.$alias; + } + $this->newContent .= ';'; + } + } + + private function writeCombinedImports(array $imports, AbstractToken $startToken) + { + $this->newContent .= $startToken->getContent() + .$startToken->getWhitespaceAfter(); + + // For following imports, we use an indentation to reach the + // column of the first import, so that they are neatly aligned. + // + // ``` + // use A, + // B, + // C; + // ``` + $indentation = $startToken->findNextToken('NO_WHITESPACE')->get()->getIndentation(); + $first = true; + foreach ($imports as $namespace => $alias) { + if ( ! $first) { + $this->newContent .= ",\n".$indentation; + } + $first = false; + + $this->newContent .= $namespace; + if (null !== $alias) { + $this->newContent .= ' as '.$alias; + } + } + $this->newContent .= ';'; + } + + private function sortImports(array &$imports) + { + if ( ! $this->getSetting('order_alphabetically')) { + return; + } + + ksort($imports); + } + + private function removeUnused(\PHPParser_Node $namespaceNode, array &$imports) + { + if ( ! $this->getSetting('remove_unused')) { + return; + } + + foreach ($imports as $namespace => $alias) { + if (null === $alias) { + if (false !== $pos = strrpos($namespace, '\\')) { + $alias = substr($namespace, $pos + 1); + } else { + $alias = $namespace; + } + } + + if ( ! $this->shouldUseBeRemoved($namespaceNode, $alias)) { + continue; + } + + unset($imports[$namespace]); + } + } + + private function shouldUseBeRemoved(\PHPParser_Node $namespaceNode, $alias) + { + $printable = $this->getPrintableAst($namespaceNode); + if ( ! is_array($printable)) { + $printable = array($printable); + } + $content = $this->prettyPrinter->prettyPrint($printable); + + return preg_match('#\b'.preg_quote($alias, '#').'\b#', $content) === 0; + } + + private function isRewritable(\PHPParser_Node $startNode, AbstractToken $token, array &$imports, AbstractToken &$lastToken = null, &$writeMultiple = false) + { + $namespaceNode = \Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::findParent($startNode, 'PHPParser_Node_Stmt_Namespace') + ?: $this->fixedFile->getAst(); + $preserveMultiple = $this->getSetting('preserve_multiple'); + + $matchedAtLeastOne = false; + $writeMultiple = false; + while ($token->matches(T_USE)) { + $currentImports = array(); + $currentLastToken = null; + $currentMultiple = false; + + if ( ! $this->isSafeToRewrite($token, $currentImports, $currentLastToken, $currentMultiple)) { + break; + } + + // If we are supposed to preserve multiples, and we already matched + // some single use statements, bail out here. We will come back when + // reaching the T_USE of the multiple import statement. + if ($currentMultiple && $matchedAtLeastOne && $preserveMultiple) { + break; + } + + $this->removeUnused($namespaceNode, $currentImports); + + $matchedAtLeastOne = true; + $imports = array_merge($imports, $currentImports); + $lastToken = $currentLastToken; + + // If we scanned a multiple imports use statement, and we are supposed + // to preserve it, bail out here as we have already reached its end. + if ($currentMultiple && $preserveMultiple) { + $writeMultiple = true; + + return true; + } + + $token = $lastToken->findNextToken('NO_WHITESPACE')->get(); + } + + return $matchedAtLeastOne; + } + + /** + * Checks whether the given token can safely be rewritten. + * + * We consider something safe to rewrite if there are no comments placed inside + * the use statements. + * + * @param \JMS\PhpManipulator\TokenStream\AbstractToken $token + * + * @return boolean + */ + private function isSafeToRewrite(AbstractToken $token, array &$imports = array(), AbstractToken &$lastToken = null, &$multiple = false) + { + if ( ! $token->matches(T_USE)) { + throw new \LogicException(sprintf('Expected a T_USE token, but got "%s".', $token)); + } + + $next = $token; + $isFirst = true; + $multiple = false; + do { + if ( ! $isFirst) { + $multiple = true; + } + $isFirst = false; + + $next = $next->findNextToken('NO_WHITESPACE')->get(); + if ( ! $next->matches(T_STRING)) { + return false; + } + + $endOfName = $next->findNextToken('END_OF_NAME')->get(); + $namespace = $next->getContentUntil($endOfName); + if ($namespace[0] === '\\') { + $namespace = substr($namespace, 1); + } + $next = $endOfName; + + if ($next->matches(T_WHITESPACE)) { + $next = $next->findNextToken('NO_WHITESPACE')->get(); + } + + if ($next->matches(T_AS)) { + $next = $next->findNextToken('NO_WHITESPACE')->get(); + + if ( ! $next->matches(T_STRING)) { + return false; + } + + $imports[$namespace] = $next->getContent(); + $next = $next->findNextToken('NO_WHITESPACE')->get(); + + if ($next->matches(';')) { + $lastToken = $next; + + return $this->isSafeEndToken($next); + } + } else { + $imports[$namespace] = null; + } + + if ($next->matches(';')) { + $lastToken = $next; + + return $this->isSafeEndToken($next); + } + } while ($next->matches(',')); + + return false; + } + + private function isSafeEndToken(AbstractToken $token) + { + $nextNoWhitespace = $token->findNextToken('NO_WHITESPACE')->get(); + + // If the end token is followed by a comment on the same same line, + // we consider it unsafe for rewriting. + if ($nextNoWhitespace->matches('COMMENT') && $token->getLine() === $nextNoWhitespace->getLine()) { + return false; + } + + return true; + } + + /** + * Cleans the AST of nodes which would deteriorate the accuracy of this check. + * + * Specifically, that means comments (not doc comments), and the use node + * which we want to remove. + * + * @param \PHPParser_Node $node + * @param string $useNode + * + * @return array|\PHPParser_Node + */ + private function getPrintableAst(\PHPParser_Node $node) + { + $node = clone $node; + foreach ($node as $name => $subNode) { + if (is_array($subNode)) { + foreach ($subNode as $k => $aSubNode) { + if (!$aSubNode instanceof \PHPParser_Node) { + continue; + } + + $subNode[$k] = $this->getPrintableAst($aSubNode); + } + } else if ($subNode instanceof \PHPParser_Node) { + $node->$name = $this->getPrintableAst($subNode); + } + } + + if ($node instanceof \JMS\PhpManipulator\PhpParser\BlockNode) { + $nodes = array(); + foreach ($node as $subNode) { + if ($subNode instanceof \PHPParser_Node_Stmt_Use) { + continue; + } + + $nodes[] = $subNode; + } + + return $nodes; + } + + return $node; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/VariableReachabilityPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/VariableReachabilityPass.php new file mode 100644 index 0000000..03b1776 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/VariableReachabilityPass.php @@ -0,0 +1,59 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\AnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\Traversal\AbstractScopedCallback; +use Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability\MayBeReachingUseAnalysis; +use Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability\MustBeReachingDefAnalysis; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\PhpFile; + +class VariableReachabilityPass extends AbstractScopedCallback implements AnalysisPassInterface, \Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface +{ + private $logger; + + public function setAnalyzer(\Scrutinizer\PhpAnalyzer\Analyzer $analyzer) + { + $this->logger = $analyzer->logger; + } + + public function analyze(File $file) + { + if ( ! $file instanceof PhpFile) { + return; + } + + NodeTraversal::traverseWithCallback($file->getAst(), $this); + } + + public function enterScope(NodeTraversal $t) + { + $cfg = $t->getControlFlowGraph(); + $scope = $t->getScope(); + + $mayBeAnalysis = new MayBeReachingUseAnalysis($cfg, $scope); + $mayBeAnalysis->analyze(); + + $mustBeAnalysis = new MustBeReachingDefAnalysis($cfg, $scope); + $mustBeAnalysis->setLogger($this->logger); + $mustBeAnalysis->analyze(); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/VerifyPhpDocCommentsPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/VerifyPhpDocCommentsPass.php new file mode 100644 index 0000000..e947ecb --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Pass/VerifyPhpDocCommentsPass.php @@ -0,0 +1,293 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; +use Scrutinizer\PhpAnalyzer\Model\Parameter; +use Scrutinizer\PhpAnalyzer\PhpParser\DocCommentParser; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ObjectType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; + +class VerifyPhpDocCommentsPass extends AstAnalyzerPass implements ConfigurablePassInterface +{ + use ConfigurableTrait; + + /** @var DocCommentParser */ + private $parser; + + private $importedNamespaces; + private $config; + + public function getConfiguration() + { + $tb = new TreeBuilder(); + $tb->root('verify_php_doc_comments', 'array', new NodeBuilder()) + ->attribute('label', 'Verify PHPDoc') + ->attribute('type', 'choice') + ->canBeEnabled() + ->children() + ->booleanNode('parameters') + ->defaultTrue() + ->attribute('label', 'Verify types for parameters (@param).') + ->end() + ->booleanNode('return') + ->defaultTrue() + ->attribute('label', 'Verify return types (@return).') + ->end() + ->booleanNode('suggest_more_specific_types') + ->defaultFalse() + ->attribute('label', 'Suggest more specific types') + ->attribute('help', 'For example, instead of just writing "array", it would suggest to use "array". ' + .'Instead of writing "mixed", it would suggest "null|Object". This helps the type ' + .'inference engine, and IDEs to better understand your code, and makes all checks more useful.') + ->end() + ->booleanNode('ask_for_return_if_not_inferrable') + ->defaultFalse() + ->attribute('label', 'Ask for @return doc comment if return type is not inferrable') + ->attribute('help', 'If the type inference engine is not able to infer a return type, it can ask the user to ' + .'add a @return annotation to the method/function. This helps the type inference ' + .'engine, and IDEs to better understand your code, and makes all checks more useful.') + ->end() + ->booleanNode('ask_for_param_type_annotation') + ->defaultFalse() + ->attribute('label', 'Ask for a @param annotation if the type is not inferrable') + ->attribute('help', 'If the type inference engine is not able to infer a parameter type, it can ask the user to ' + .'add a @param annotation to the method/function. This helps the type inference engine, and IDEs ' + .'to better understand your code, and makes all checks more useful.') + ->end() + ->end() + ; + + return $tb; + } + + public function setAnalyzer(Analyzer $analyzer) + { + parent::setAnalyzer($analyzer); + $this->parser = new DocCommentParser($this->typeRegistry); + } + + protected function isEnabled() + { + return true === $this->getSetting('enabled'); + } + + public function enterScope(NodeTraversal $t) + { + $node = $t->getScopeRoot(); + + $function = null; + if ($node instanceof \PHPParser_Node_Stmt_Function) { + $function = $this->typeRegistry->getFunction($node->name); + if (null !== $function) { + $this->parser->setCurrentClassName(null); + $this->parser->setImportedNamespaces($this->importedNamespaces = $function->getImportedNamespaces()); + } + } else if ($node instanceof \PHPParser_Node_Stmt_ClassMethod) { + $objType = $t->getScope()->getTypeOfThis()->toMaybeObjectType(); + if (null !== $objType) { + /** @var $objType MethodContainer */ + $this->parser->setCurrentClassName($objType->getName()); + $this->parser->setImportedNamespaces($this->importedNamespaces = $objType->getImportedNamespaces()); + $function = $objType->getMethod($node->name); + } + } + + if (null !== $function) { + if (null !== $returnType = $function->getReturnType()) { + $this->verifyReturnType($returnType, $node); + } + + foreach ($function->getParameters() as $param) { + /** @var $param Parameter */ + + if (null !== $paramType = $param->getPhpType()) { + $this->verifyParamType($paramType, $node, $param->getName()); + } + } + } + + return true; + } + + protected function getScopeCreator() + { + return new TypedScopeCreator($this->typeRegistry); + } + + private function verifyParamType(PhpType $type, \PHPParser_Node $node, $paramName) + { + if (null === $commentType = $this->parser->getTypeFromParamAnnotation($node, $paramName)) { + if ($this->getSetting('ask_for_param_type_annotation')) { + if ($type->isAllType() || $type->isUnknownType()) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'php_doc.param_type_all_type_non_commented', + 'Please add a ``@param`` annotation for parameter ``$%parameter%`` which defines a more specific range of types; something like ``string|array``, or ``null|MyObject``.', + array('parameter' => $paramName))->varyIn(array())); + } else if ($this->typeRegistry->getNativeType('array')->isSubtypeOf($type)) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'php_doc.param_type_array_type_not_inferrable', + 'Please add a ``@param`` annotation for parameter ``$%parameter%`` which defines the array type; using ``array``, or ``SomeType[]``.', + array('parameter' => $paramName))->varyIn(array())); + } + } + + return; + } + + if ( ! $this->getSetting('parameters')) { + return; + } + + // If the type is not a subtype of the annotated type, then there is an + // error somewhere (could also be in the type inference engine). + if ( ! $type->isSubtypeOf($commentType)) { + if ($this->getSetting('suggest_more_specific_types') && $this->typeRegistry->getNativeType('array')->isSubtypeOf($type)) { + $this->phpFile->addComment($this->getLineOfParam($node, $paramName), Comment::warning( + 'php_doc.param_type_mismatch_with_generic_array', + 'Should the type for parameter ``$%parameter%`` not be ``%expected_type%``? Also, consider making the array more specific, something like ``array``, or ``String[]``.', + array('parameter' => $paramName, 'expected_type' => $type->getDocType($this->importedNamespaces)))); + } else { + $this->phpFile->addComment($this->getLineOfParam($node, $paramName), Comment::warning( + 'php_doc.param_type_mismatch', + 'Should the type for parameter ``$%parameter%`` not be ``%expected_type%``?', + array('parameter' => $paramName, 'expected_type' => $type->getDocType($this->importedNamespaces)))); + } + + return; + } + + if ( ! $this->getSetting('suggest_more_specific_types')) { + return; + } + + if ( ! $this->isMoreSpecificType($type, $commentType)) { + if ($type->isAllType()) { + $this->phpFile->addComment($this->getLineOfParam($node, $paramName), Comment::warning( + 'php_doc.param_type_all_type_more_specific', + 'Please define a more specific type for parameter ``$%parameter%``; consider using a union like ``null|Object``, or ``string|array``.', + array('parameter' => $paramName))->varyIn(array())); + } else if ($this->typeRegistry->getNativeType('array')->isSubtypeOf($type)) { + $this->phpFile->addComment($this->getLineOfParam($node, $paramName), Comment::warning( + 'php_doc.param_type_array_element_type', + 'Please define the element type for the array of parameter ``$%parameter%`` (using ``array``, or ``SomeType[]``).', + array('parameter' => $paramName))->varyIn(array())); + } + + return; + } + + $this->phpFile->addComment($this->getLineOfParam($node, $paramName), Comment::warning( + 'php_doc.param_type_more_specific', + 'Consider making the type for parameter ``$%parameter%`` a bit more specific; maybe use ``%actual_type%``.', + array('parameter' => $paramName, $type->getDocType($this->importedNamespaces)))); + } + + private function verifyReturnType(PhpType $type, \PHPParser_Node $node) + { + if (null === $commentType = $this->parser->getTypeFromReturnAnnotation($node)) { + if ($this->getSetting('ask_for_return_if_not_inferrable') && $type->isUnknownType()) { + $this->phpFile->addComment($node->getLine(), Comment::warning( + 'php_doc.return_type_not_inferrable', + 'Please add a ``@return`` annotation.')); + } + + return; + } + + if (!$this->getSetting('return')) { + return; + } + + if ( ! $type->isSubtypeOf($commentType)) { + if ($this->getSetting('suggest_more_specific_types') && $this->typeRegistry->getNativeType('array')->isSubtypeOf($type)) { + $this->phpFile->addComment($this->getLineOfReturn($node), Comment::warning( + 'php_doc.return_type_mismatch_with_generic_array', + 'Should the return type not be ``%expected_type%``? Also, consider making the array more specific, something like ``array``, or ``String[]``.', + array('expected_type' => $type->getDocType($this->importedNamespaces)))); + } else { + $this->phpFile->addComment($this->getLineOfReturn($node), Comment::warning( + 'php_doc.return_type_mismatch', + 'Should the return type not be ``%expected_type%``?', + array('expected_type' => $type->getDocType($this->importedNamespaces)))); + } + + return; + } + + if ( ! $this->getSetting('suggest_more_specific_types')) { + return; + } + + if ( ! $this->isMoreSpecificType($type, $commentType)) { + if ($type->isAllType()) { + $this->phpFile->addComment($this->getLineOfReturn($node), Comment::warning( + 'php_doc.return_type_all_type_more_specific', + 'Please define a more specific return type; maybe using a union like ``null|Object``, or ``string|array``.')); + } else if ($this->typeRegistry->getNativeType('array')->isSubtypeOf($type)) { + $this->phpFile->addComment($this->getLineOfReturn($node), Comment::warning( + 'php_doc.return_type_array_element_type', + 'Please define the element type for the returned array (using ``array``, or ``SomeType[]``).')); + } + + return; + } + + $this->phpFile->addComment($this->getLineOfReturn($node), Comment::warning( + 'php_doc.return_type_more_specific', + 'Consider making the return type a bit more specific; maybe use ``%actual_type%``.', + array('actual_type' => $type->getDocType($this->importedNamespaces)))); + } + + private function isMoreSpecificType(PhpType $actualType, PhpType $annotatedType) + { + if ($actualType->equals($annotatedType)) { + return false; + } + + if ($actualType->isUnknownType()) { + return false; + } + + return $actualType->isSubtypeOf($annotatedType); + } + + private function getLineOfParam(\PHPParser_Node $node, $paramName) + { + $regex = '/@param\s+(?:[^\s]+\s+\$'.preg_quote($paramName, '/').'|'.preg_quote($paramName, '/').'\s+[^\s]+)(.*)$/is'; + if (!preg_match($regex, $comment = $node->getDocComment(), $match)) { + return $node->getLine() - 1; + } + + return $node->getLine() - substr_count($match[1], "\n") - 1; + } + + private function getLineOfReturn(\PHPParser_Node $node) + { + $comment = $node->getDocComment(); + + return $node->getLine() - substr_count($comment, "\n", strripos($comment, '@return')) - 1; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PassConfig.php b/src/Scrutinizer/PhpAnalyzer/PassConfig.php new file mode 100644 index 0000000..92dd403 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PassConfig.php @@ -0,0 +1,278 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer; + +use Scrutinizer\PhpAnalyzer\Pass\AnalysisPassInterface; +use Scrutinizer\PhpAnalyzer\Pass\CallGraphPass; +use Scrutinizer\PhpAnalyzer\Pass\CheckAccessControlPass; +use Scrutinizer\PhpAnalyzer\Pass\CheckForTyposPass; +use Scrutinizer\PhpAnalyzer\Pass\CheckParamExpectsRefPass; +use Scrutinizer\PhpAnalyzer\Pass\CheckUnreachableCodePass; +use Scrutinizer\PhpAnalyzer\Pass\CheckUsageContextPass; +use Scrutinizer\PhpAnalyzer\Pass\CheckVariablesPass; +use Scrutinizer\PhpAnalyzer\Pass\CheckstylePass; +use Scrutinizer\PhpAnalyzer\Pass\ConfigurablePassInterface; +use Scrutinizer\PhpAnalyzer\Pass\DeadAssignmentsDetectionPass; +use Scrutinizer\PhpAnalyzer\Pass\DocCommentFixingPass; +use Scrutinizer\PhpAnalyzer\Pass\InferTypesFromDocCommentsPass; +use Scrutinizer\PhpAnalyzer\Pass\LoggingPass; +use Scrutinizer\PhpAnalyzer\Pass\LoopsMustUseBracesPass; +use Scrutinizer\PhpAnalyzer\Pass\MarkPassedByRefArgsPass; +use Scrutinizer\PhpAnalyzer\Pass\PhpunitAssertionsPass; +use Scrutinizer\PhpAnalyzer\Pass\Psr\Psr0ComplianceCheckPass; +use Scrutinizer\PhpAnalyzer\Pass\ReflectionFixerPass; +use Scrutinizer\PhpAnalyzer\Pass\ReflectionUsageCheckPass; +use Scrutinizer\PhpAnalyzer\Pass\RepeatedPass; +use Scrutinizer\PhpAnalyzer\Pass\ReturnTypeScanningPass; +use Scrutinizer\PhpAnalyzer\Pass\SimplifyBooleanReturnPass; +use Scrutinizer\PhpAnalyzer\Pass\SuspiciousCodePass; +use Scrutinizer\PhpAnalyzer\Pass\TypeInferencePass; +use Scrutinizer\PhpAnalyzer\Pass\TypeScanningPass; +use Scrutinizer\PhpAnalyzer\Pass\UseStatementFixerPass; +use Scrutinizer\PhpAnalyzer\Pass\VariableReachabilityPass; +use Scrutinizer\PhpAnalyzer\Pass\VerifyPhpDocCommentsPass; +use Symfony\Component\Config\Definition\Processor; +use Scrutinizer\PhpAnalyzer\Pass\PrecedenceChecksPass; +use Scrutinizer\PhpAnalyzer\Pass\CheckBasicSemanticsPass; + +class PassConfig +{ + const TYPE_INITIALIZING = 'initializing'; + const TYPE_ANALYZING = 'analyzing'; + const TYPE_REVIEWING = 'reviewing'; + const TYPE_FIXING = 'fixing'; + + private $initializingPasses = array(); + private $analyzingPasses = array(); + private $reviewingPasses = array(); + private $fixingPasses = array(); + + public static function createWithPasses(array $passes) + { + if (!$passes) { + throw new \RuntimeException('At least one pass must be given.'); + } + + $config = new self; + + $config->initializingPasses = + $config->analyzingPasses = + $config->reviewingPasses = array(); + + $config->fixingPasses = $passes; + + return $config; + } + + public static function createForFixing() + { + $config = new self; + $config->reviewingPasses = array(); + + return $config; + } + + public static function create() + { + return new self(); + } + + public static function createForTypeScanning() + { + $config = new self; + + $config->analyzingPasses = + $config->reviewingPasses = + $config->fixingPasses = array(); + + return $config; + } + + public function __construct() + { + $this->initializingPasses = array( + new TypeScanningPass(), + + new LoggingPass('Running Type Inference Engine'), + new RepeatedPass(array( + new TypeInferencePass(), + new MarkPassedByRefArgsPass(), + new VariableReachabilityPass(), + new RepeatedPass(array( + new TypeInferencePass(), + new ReturnTypeScanningPass(), + ), 2), + new InferTypesFromDocCommentsPass(), + ), 2), + new TypeInferencePass(), + + new LoggingPass('Building Call Graph'), + new CallGraphPass(), + ); + + $this->analyzingPasses = array( + // This pass needs to be run before CheckVariablesPass as it marks arguments + // which might be passed by reference. + new CheckParamExpectsRefPass(), + ); + + $this->reviewingPasses = array( + new LoggingPass('Running Checks'), + new CheckstylePass(), + new CheckUnreachableCodePass(), + new CheckAccessControlPass(), + new CheckForTyposPass(), + new CheckVariablesPass(), + new SuspiciousCodePass(), + new DeadAssignmentsDetectionPass(), + new VerifyPhpDocCommentsPass(), + new LoopsMustUseBracesPass(), + new CheckUsageContextPass(), + new CheckParamExpectsRefPass(), + new SimplifyBooleanReturnPass(), + new PhpunitAssertionsPass(), + new ReflectionUsageCheckPass(), + new PrecedenceChecksPass(), + new CheckBasicSemanticsPass(), + ); + + $this->fixingPasses = array( + new LoggingPass('Running Fixes'), + new DocCommentFixingPass(), + new ReflectionFixerPass(), + new UseStatementFixerPass(), + ); + } + + public function getConfigurablePasses() + { + $passes = array(); + foreach ($this->getPasses() as $pass) { + if ($pass instanceof ConfigurablePassInterface) { + $passes[] = $pass; + } + } + + return $passes; + } + + public function getConfigurations() + { + $configs = array(); + + foreach ($this->getPasses() as $pass) { + if (!$pass instanceof ConfigurablePassInterface) { + continue; + } + + $configs[get_class($pass)] = $pass->getConfiguration(); + } + + return $configs; + } + + /** + * Processes user-entered configuration values. + * + * @param array $values + */ + public function processConfigurationValues(array $values = array()) + { + $resolvedValues = $this->resolveValues($values); + + foreach ($this->getPasses() as $pass) { + if ( ! $pass instanceof ConfigurablePassInterface) { + continue; + } + + $node = $pass->getConfiguration()->buildTree(); + if (!isset($resolvedValues[$node->getName()])) { + continue; + } + + $pass->setConfigurationValues($resolvedValues[$node->getName()]); + } + } + + public function resolveValues(array $values = array()) + { + $processor = new Processor(); + $resolvedValues = array(); + foreach ($this->getPasses() as $pass) { + if (!$pass instanceof ConfigurablePassInterface) { + continue; + } + + $node = $pass->getConfiguration()->buildTree(); + $passValues = isset($values[$node->getName()]) ? $values[$node->getName()] : array(); + + $resolvedValues[$node->getName()] = $processor->process($node, array($passValues)); + } + + return $resolvedValues; + } + + public function disable($passClass) + { + if (!class_exists($passClass)) { + $passClass = 'Scrutinizer\PhpAnalyzer\Pass\\'.$passClass; + } + + $found = false; + foreach (array('initializing', 'analyzing', 'reviewing') as $type) { + foreach ($this->{$type.'Passes'} as $k => $pass) { + if ($pass instanceof $passClass) { + unset($this->{$type.'Passes'}[$k]); + $found = true; + } + } + } + + if (!$found) { + throw new \RuntimeException(sprintf('Could not disable pass "%s" as it was not found.', $passClass)); + } + } + + public function clear(array $types = null) + { + if (!$types) { + $this->initializingPasses = + $this->analyzingPasses = + $this->fixingPasses = + $this->reviewingPasses = array(); + } else { + foreach ($types as $type) { + $this->{$type.'Passes'} = array(); + } + } + } + + public function addPass(AnalysisPassInterface $pass, $type = self::TYPE_ANALYZING) + { + $this->{$type.'Passes'}[] = $pass; + } + + public function getPasses() + { + return array_merge($this->initializingPasses, + $this->analyzingPasses, + $this->reviewingPasses, + $this->fixingPasses); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/ClassParser.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/ClassParser.php new file mode 100644 index 0000000..6a95203 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/ClassParser.php @@ -0,0 +1,286 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser; + +use Psr\Log\LoggerInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\Constant; +use Scrutinizer\PhpAnalyzer\Model\InterfaceC; +use Scrutinizer\PhpAnalyzer\Model\Method; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; +use Scrutinizer\PhpAnalyzer\Model\Property; +use Scrutinizer\PhpAnalyzer\Model\TraitC; + +class ClassParser +{ + private $paramParser; + private $typeRegistry; + private $commentParser; + private $logger; + private $importedNamespaces = array(); + + public function __construct(TypeRegistry $registry, ParameterParser $paramParser, DocCommentParser $commentParser, LoggerInterface $logger) + { + $this->typeRegistry = $registry; + $this->paramParser = $paramParser; + $this->commentParser = $commentParser; + $this->logger = $logger; + } + + public function setImportedNamespaces(array $namespaces) + { + $this->importedNamespaces = $namespaces; + } + + public function parse(\PHPParser_Node $node) + { + if ($node instanceof \PHPParser_Node_Stmt_Class) { + $class = new Clazz(implode("\\", $node->namespacedName->parts)); + + // convert PHPParser modifier to our modifier + $modifier = 0; + if (\PHPParser_Node_Stmt_Class::MODIFIER_FINAL + === ($node->type & \PHPParser_Node_Stmt_Class::MODIFIER_FINAL)) { + $modifier |= Clazz::MODIFIER_FINAL; + } + if (\PHPParser_Node_Stmt_Class::MODIFIER_ABSTRACT + === ($node->type & \PHPParser_Node_Stmt_Class::MODIFIER_ABSTRACT)) { + $modifier |= Clazz::MODIFIER_ABSTRACT; + } + $class->setModifier($modifier); + + if (null !== $node->extends) { + $class->setSuperClass(implode("\\", $node->extends->parts)); + } + + foreach ($node->implements as $iface) { + $class->addImplementedInterface(implode("\\", $iface->parts)); + } + } else if ($node instanceof \PHPParser_Node_Stmt_Interface) { + $class = new InterfaceC(implode("\\", $node->namespacedName->parts)); + + foreach ($node->extends as $interface) { + $class->addExtendedInterface(implode("\\", $interface->parts)); + } + } else if ($node instanceof \PHPParser_Node_Stmt_Trait) { + $class = new TraitC(implode("\\", $node->namespacedName->parts)); + } else { + throw new \LogicException(sprintf('The other statements were exhaustive. The node "%s" is not supported.', get_class($node))); + } + + $class->setImportedNamespaces($this->importedNamespaces); + $class->setAstNode($node); + + // add methods, properties, and constants + foreach ($node->stmts as $stmt) { + if ($stmt instanceof \PHPParser_Node_Stmt_ClassMethod) { + $this->scanMethod($stmt, $class); + } else if ($stmt instanceof \PHPParser_Node_Stmt_Property) { + $visibility = \PHPParser_Node_Stmt_Class::MODIFIER_PUBLIC + === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_PUBLIC) + ? Property::VISIBILITY_PUBLIC : ( + \PHPParser_Node_Stmt_Class::MODIFIER_PROTECTED + === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_PROTECTED) + ? Property::VISIBILITY_PROTECTED : Property::VISIBILITY_PRIVATE); + foreach ($stmt->props as $propNode) { + assert($propNode instanceof \PHPParser_Node_Stmt_PropertyProperty); + + // This is a PHP error which we flag in a later pass. Here, we can just ignore the property definition. + if ($class->isInterface()) { + continue; + } + + assert($class instanceof Clazz || $class instanceof TraitC); + + $property = new Property($propNode->name); + $property->setAstNode($propNode); + $property->setVisibility($visibility); + $class->addProperty($property); + } + } else if ($stmt instanceof \PHPParser_Node_Stmt_ClassConst) { + foreach ($stmt->consts as $constNode) { + assert($constNode instanceof \PHPParser_Node_Const); + $constant = new Constant($constNode->name); + $constant->setAstNode($constNode); + + if (null !== $type = $constNode->value->getAttribute('type')) { + $constant->setPhpType($type); + } + + $class->addConstant($constant); + } + } + } + + // Add magic properties denoted by @property, @property-read, @property-write. + if ($node instanceof \PHPParser_Node_Stmt_Class + && preg_match_all('#@(?:property|property-read|property-write)\s+[^\s]+\s+\$?([^\s]+)#', $node->getDocComment(), $matches)) { + for ($i=0,$c=count($matches[0]); $i<$c; $i++) { + // If there is already an explicitly declared property of the same + // name, it has precedence for us. + if ($class->hasProperty($matches[1][$i])) { + $this->logger->warning(sprintf('The property "%s" is already defined in code; ignoring @property tag.', $matches[1][$i])); + + continue; + } + + $property = new Property($matches[1][$i]); + $property->setAstNode($node); + $class->addProperty($property); + } + } + + // Add magic methods denoted by @method. + if ($node instanceof \PHPParser_Node_Stmt_Class + && preg_match_all('#@method\s+([^@]+)#s', $node->getDocComment(), $matches)) { + foreach ($matches[1] as $methodDef) { + if (null !== $method = $this->parseCommentMethodDef($methodDef)) { + // An explicitly defined method has precedence. + if ($class->hasMethod($method->getName())) { + $this->logger->warning(sprintf('The method "%s" is already defined in code; ignoring @method tag.', $method->getName())); + + continue; + } + + $class->addMethod($method); + } + } + } + + return $class; + } + + /** + * Parses the method definition (@method), and extract + * + * This should ideally all be extracted to a dedicated parser component. There is + * no point in keeping this hidden away in here. + * + * @param string $def + * + * @return null|Method + */ + private function parseCommentMethodDef($def) + { + // We use some half-assed regular expression, and hope that it will work out. + // To bad that there is no well defined structure, and also no well written + // parser :-( + if ( ! preg_match('/ + # Syntax: [return type] [name]([type] [parameter], [...]) [] + # Possible Type Name + (?:([^\s]+)\s+)? + + # Method Name (must be followed by "()") + ([^\s(]+) + + # Arguments + \(([^)]*)\) + + /xs', $def, $match)) { + $this->logger->warning(sprintf('Could not parse @method tag "%s".', $def)); + + return null; + } + + list(, $typeName, $methodName, $arguments) = $match; + + $method = new Method($methodName); + if ( ! empty($typeName) && null !== $returnType = $this->commentParser->tryGettingType($typeName)) { + $method->setReturnType($returnType); + } + $arguments = trim($arguments); + + if (empty($arguments)) { + return $method; + } + + foreach (explode(',', $arguments) as $i => $argument) { + if ( ! preg_match('/(?:([^\s]+)\s+)?\$?([^\s,]+)/', $argument, $match)) { + $this->logger->warning(sprintf('Could not parse argument "%s" of @method "%s"; skipping all further arguments.', $argument, $method->getName())); + + break; + } + + $parameter = new \Scrutinizer\PhpAnalyzer\Model\MethodParameter($match[2], $i); + if ( ! empty($match[1]) && null !== $paramType = $this->commentParser->tryGettingType($match[1])) { + $parameter->setPhpType($paramType); + } + + $method->addParameter($parameter); + } + + return $method; + } + + private function scanMethod(\PHPParser_Node_Stmt_ClassMethod $stmt, MethodContainer $class) + { + $method = new Method($stmt->name); + $method->setAstNode($stmt); + $method->setReturnByRef($stmt->byRef); + + // convert PHPParser modifier to our modifier + $modifier = 0; + if (\PHPParser_Node_Stmt_Class::MODIFIER_ABSTRACT + === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_ABSTRACT)) { + $modifier |= Method::MODIFIER_ABSTRACT; + } + if (\PHPParser_Node_Stmt_Class::MODIFIER_FINAL + === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_FINAL)) { + $modifier |= Method::MODIFIER_FINAL; + } + if (\PHPParser_Node_Stmt_Class::MODIFIER_STATIC + === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_STATIC)) { + $modifier |= Method::MODIFIER_STATIC; + } + + // All interface methods are automatically abstract without being declared as such. + if ($class instanceof InterfaceC) { + $modifier |= Method::MODIFIER_ABSTRACT; + } + + $method->setModifier($modifier); + + $method->setVisibility( + \PHPParser_Node_Stmt_Class::MODIFIER_PRIVATE + === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_PRIVATE) + ? Method::VISIBILITY_PRIVATE : ( + \PHPParser_Node_Stmt_Class::MODIFIER_PROTECTED + === ($stmt->type & \PHPParser_Node_Stmt_Class::MODIFIER_PROTECTED) + ? Method::VISIBILITY_PROTECTED : Method::VISIBILITY_PUBLIC + ) + ); + + foreach ($this->paramParser->parse($stmt->params, 'Scrutinizer\PhpAnalyzer\Model\MethodParameter') as $param) { + $method->addParameter($param); + } + + foreach ($stmt->params as $i => $param) { + if (null !== $docType = $this->commentParser->getTypeFromParamAnnotation($param, $param->name, true)) { + $method->setParamDocType($i, $docType); + } + } + + if (null !== $returnDocType = $this->commentParser->getTypeFromReturnAnnotation($stmt, true)) { + $method->setReturnDocType($returnDocType); + } + + $class->addMethod($method); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/DocCommentParser.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/DocCommentParser.php new file mode 100644 index 0000000..88e44c5 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/DocCommentParser.php @@ -0,0 +1,418 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser; + +use Psr\Log\LoggerInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; + +class DocCommentParser +{ + /** @var LoggerInterface */ + private $logger; + + /** @var TypeRegistry */ + private $typeRegistry; + + private $importedNamespaces = array(); + private $currentClassName; + private $tokens; + private $pos; + private $token; + private $nextToken; + private $currentComment; + + public function __construct(TypeRegistry $registry) + { + $this->typeRegistry = $registry; + } + + public function setImportedNamespaces(array $namespaces) + { + $this->importedNamespaces = $namespaces; + } + + public function setLogger(LoggerInterface $logger = null) + { + $this->logger = $logger; + } + + /** + * @param string|null $name + */ + public function setCurrentClassName($name) + { + $this->currentClassName = $name; + } + + public function getTypeFromMagicPropertyAnnotation(\PHPParser_Node $node, $propertyName) + { + if (!preg_match('/@(?:property|property-read|property-write)\s+([^\s]+)\s+\$?'.preg_quote($propertyName, '/').'(?:\s+|$)#m', $node->getDocComment(), $match)) { + return null; + } + + $this->currentComment = $node->getDocComment(); + + return $this->tryGettingType($match[1]); + } + + /** + * Extracts types from an inline "@var" comment. + * + * @param string $comment + * + * @return array + */ + public function getTypesFromInlineComment($comment) + { + $types = array(); + + // Bail out fast, if there is no @var in the comment. + if (false === strpos($comment, '@var')) { + return $types; + } + + // @var $name type + if (preg_match_all('#@var\s+\$([^\s]+)\s+([^\s]+)#', $comment, $matches)) { + foreach ($matches[1] as $i => $varName) { + if (null !== $type = $this->tryGettingType($matches[2][$i])) { + $types[$varName] = $type; + } + } + } + + // @var type $name + $matches = array(); + if (preg_match_all('#@var\s+([^\s]+)\s+\$([^\s]+)#', $comment, $matches)) { + foreach ($matches[2] as $i => $varName) { + if (null !== $type = $this->tryGettingType($matches[1][$i])) { + $types[$varName] = $type; + } + } + } + + return $types; + } + + public function getTypeFromVarAnnotation(\PHPParser_Node $node) + { + if (false === stripos($comment = $node->getDocComment(), '@var')) { + return null; + } + + if (!preg_match('/@var\s+([^\s]+)/i', $comment, $match)) { + return null; + } + + $this->currentComment = $comment; + + return $this->tryGettingType($match[1]); + } + + public function tryGettingType($typeName) + { + try { + return $this->getType($typeName); + } catch (\RuntimeException $ex) { + if (null !== $this->logger) { + $this->logger->warning(sprintf('Error while resolving doc type "%s": %s', $typeName, $ex->getMessage())); + } + + return null; + } + } + + public function getTypeFromParamAnnotation(\PHPParser_Node $node, $paramName, $asString = false) + { + if ($node instanceof \PHPParser_Node_Param) { + $node = $node->getAttribute('parent'); + } + + if (false === stripos($comment = $node->getDocComment(), '@param')) { + return null; + } + + $this->currentComment = $comment; + + $regex = '/@param\s+(?:([^\s]+)\s+\$'.preg_quote($paramName, '/').'|'.preg_quote($paramName, '/').'\s+([^\s\*][^\s]+))(?:\s|$)/im'; + if (!preg_match($regex, $comment, $match)) { + return null; + } + + $this->currentComment = $comment; + + $type = isset($match[2]) ? $match[2] : $match[1]; + if (null === $resolvedType = $this->tryGettingType($type)) { + return null; + } + + if ($asString) { + if ($this->isThisReference(strtolower($type))) { + return $type; + } + + // We do return the doc comment with their fully qualified names. + return $resolvedType->getDocType(array('' => true)); + } + + return $resolvedType; + } + + public function getTypeFromReturnAnnotation(\PHPParser_Node $node, $asString = false) + { + if (false === stripos($comment = $node->getDocComment(), '@return')) { + return null; + } + + if (!preg_match('/@return\s+([^\s]+)/i', $comment, $match)) { + return null; + } + + $this->currentComment = $comment; + + if (null === $resolvedType = $this->tryGettingType($match[1])) { + return null; + } + + if ($asString) { + if ($this->isThisReference(strtolower($match[1]))) { + return $match[1]; + } + + // We do return fully qualified names. + return $resolvedType->getDocType(); + } + + return $resolvedType; + } + + private function moveNext() + { + $this->pos += 1; + $this->token = isset($this->tokens[$this->pos]) ? $this->tokens[$this->pos] : null; + $this->nextToken = isset($this->tokens[$this->pos+1]) ? $this->tokens[$this->pos+1] : null; + + return null !== $this->token; + } + + private function isNextToken($expected) + { + if (null === $this->nextToken) { + return false; + } + + return $this->nextToken[0] === $expected; + } + + private function match($token) + { + if ( ! $this->isNextToken($token)) { + throw new \RuntimeException(sprintf('Expected "%s" at position %d, but found "%s".', + $token, $this->pos + 1, null === $this->nextToken ? 'end of type' : $this->nextToken[0])); + } + + $this->moveNext(); + } + + public function getType($name) + { + $this->tokens = preg_split('#(\(|\)|\||,|\[|\]|<|>|;)#', $name, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE); + $this->pos = -1; + $this->moveNext(); + + $type = $this->parse(); + + if (null !== $this->nextToken) { + throw new \RuntimeException(sprintf('Expected "|" or "end of type", but got "%s" at position %d.', $this->nextToken[0], $this->nextToken[1])); + } + + return $type; + } + + private function parse() + { + $types = array(); + do { + $types[] = $this->parseTypeName(); + } while ($this->isNextToken('|') && $this->moveNext() && $this->moveNext()); + + return $this->typeRegistry->createUnionType($types); + } + + private function parseGroup() + { + $groupTypes = array(); + + $this->moveNext(); + $groupTypes[] = $this->parseTypeName(); + + while ($this->isNextToken('|')) { + $this->match('|'); + $this->moveNext(); + $groupTypes[] = $this->parse(); + } + $this->match(')'); + + return $this->typeRegistry->createUnionType($groupTypes); + } + + private function parseTypeName() + { + $type = null; + if ('\\' === $this->token[0][0]) { + $type = $this->typeRegistry->getClassOrCreate(substr($this->token[0], 1)); + } else { + // First, we check whether the name is a class that we have already scanned + $parts = explode("\\", $this->token[0]); + if (isset($this->importedNamespaces[$parts[0]])) { + $className = $this->importedNamespaces[$parts[0]]; + if (count($parts) > 1) { + $className .= '\\'.implode("\\", array_slice($parts, 1)); + } + + $type = $this->typeRegistry->getClassOrCreate($className); + } else { + switch (strtolower($this->token[0])) { + case '(': + $type = $this->parseGroup(); + break; + + case 'false': + $type = $this->typeRegistry->getNativeType('false'); + break; + + case 'bool': + case 'boolean': + $type = $this->typeRegistry->getNativeType('boolean'); + break; + + case 'int': + case 'integer': + $type = $this->typeRegistry->getNativeType('integer'); + break; + + case 'float': + case 'double': + $type = $this->typeRegistry->getNativeType('double'); + break; + + case 'scalar': + $type = $this->typeRegistry->getNativeType('scalar'); + break; + + case 'string': + $type = $this->typeRegistry->getNativeType('string'); + break; + + case 'array': + if ($this->isNextToken('<')) { + $this->match('<'); + $this->moveNext(); + + $firstType = $this->parse(); + + if ($this->isNextToken(',')) { + $this->match(','); + $this->moveNext(); + $arrayType = $this->typeRegistry->getArrayType($this->parse(), $firstType); + $this->match('>'); + + return $arrayType; + } + + $this->match('>'); + + return $this->typeRegistry->getArrayType($firstType, $this->typeRegistry->getNativeType('integer')); + } + + $type = $this->typeRegistry->getNativeType('array'); + break; + + case 'resource': + $type = $this->typeRegistry->getNativeType('resource'); + break; + + case '*': + case 'mixed': + $type = $this->typeRegistry->getNativeType('all'); + break; + + case 'number': + $type = $this->typeRegistry->getNativeType('number'); + break; + + case 'object': + $type = $this->typeRegistry->getNativeType('object'); + break; + + case 'void': + case 'null': + $type = $this->typeRegistry->getNativeType('null'); + break; + + case 'callable': + case 'callback': + $type = $this->typeRegistry->getNativeType('callable'); + break; + + default: + if ($this->isThisReference($this->token[0])) { + if (null === $this->currentClassName) { + throw new \RuntimeException(sprintf('"%s" is only available from within classes.', $this->token[0])); + } + + $type = $this->typeRegistry->getClassOrCreate($this->currentClassName); + } else if (preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*$/', $this->token[0])) { + $className = !empty($this->importedNamespaces['']) ? $this->importedNamespaces[''].'\\' : ''; + $className .= $this->token[0]; + + $type = $this->typeRegistry->getClassOrCreate($className); + } else { + throw new \RuntimeException(sprintf('Unknown type name "%s" at position %d.', $this->token[0], $this->token[1])); + } + } + } + } + + if ( ! $type) { + throw new \RuntimeException(sprintf('Internal error for token "%s" at position %d.', $this->token[0], $this->token[1])); + } + + if ($this->isNextToken('[')) { + $this->moveNext(); + + // In the php stubs, there often is an [optional] appended to types. + // We just ignore this suffix. + if ($this->isNextToken('optional')) { + $this->moveNext(); + $this->match(']'); + } else { + $this->match(']'); + + return $this->typeRegistry->getArrayType($type, $this->typeRegistry->getNativeType('integer')); + } + } + + return $type; + } + + private function isThisReference($typeName) + { + return 'self' === $typeName || '$this' === $typeName; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/FunctionParser.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/FunctionParser.php new file mode 100644 index 0000000..d01b0d4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/FunctionParser.php @@ -0,0 +1,56 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser; + +use Scrutinizer\PhpAnalyzer\PhpParser\ParameterParser; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; + +class FunctionParser +{ + private $typeRegistry; + private $paramParser; + private $importedNamespaces = array(); + + public function __construct(TypeRegistry $registry, ParameterParser $paramParser) + { + $this->typeRegistry = $registry; + $this->paramParser = $paramParser; + } + + public function setImportedNamespaces(array $namespaces) + { + $this->importedNamespaces = $namespaces; + } + + public function parse(\PHPParser_Node_Stmt_Function $node) + { + $function = new GlobalFunction(implode("\\", $node->namespacedName->parts)); + $function->setImportedNamespaces($this->importedNamespaces); + $function->setAstNode($node); + $function->setReturnByRef($node->byRef); + $function->setVariableParameters(false !== strpos($node->getDocComment(), '@jms-variable-parameters')); + + foreach ($this->paramParser->parse($node->params, 'Scrutinizer\PhpAnalyzer\Model\FunctionParameter') as $param) { + $function->addParameter($param); + } + + return $function; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/NodeTraversal.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/NodeTraversal.php new file mode 100644 index 0000000..bde4e55 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/NodeTraversal.php @@ -0,0 +1,236 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowAnalysis; +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowGraph; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\ScopeCreatorInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\SyntacticScopeCreator; +use Scrutinizer\PhpAnalyzer\PhpParser\Traversal\CallbackInterface; +use Scrutinizer\PhpAnalyzer\PhpParser\Traversal\ScopedCallbackInterface; + +class NodeTraversal +{ + private $callback; + private $curNode; + private $scopes; + private $scopeRoots; + private $cfgs; + private $scopeCreator; + + public static function traverseWithCallback(\PHPParser_Node $root, CallbackInterface $callback, ScopeCreatorInterface $scopeCreator = null) + { + $t = new self($callback, $scopeCreator); + $t->traverse($root); + } + + public function __construct(CallbackInterface $callback, ScopeCreatorInterface $scopeCreator = null) + { + $this->callback = $callback; + $this->scopeCreator = $scopeCreator ?: new SyntacticScopeCreator(); + $this->scopes = new \SplStack(); + $this->scopeRoots = new \SplDoublyLinkedList(); + $this->scopeRoots->setIteratorMode(\SplDoublyLinkedList::IT_MODE_LIFO | \SplDoublyLinkedList::IT_MODE_KEEP); + $this->cfgs = new \SplStack(); + } + + public function getCurrentNode() + { + return $this->curNode; + } + + /** + * Returns the current scope. + * + * @return Scope + */ + public function getScope() + { + $scope = $this->scopes->isEmpty() ? null : $this->scopes->top(); + if ($this->scopeRoots->isEmpty()) { + return $scope; + } + + // We create the scopes from bottom to top. It is also necessary to build all scopes which are on the stack + // since each scope might depend on its predecessor (a Closure might depend on variables of the scope it + // was declared in). + $this->scopeRoots->setIteratorMode(\SplDoublyLinkedList::IT_MODE_FIFO | \SplDoublyLinkedList::IT_MODE_DELETE); + foreach ($this->scopeRoots as $scopeRoot) { + $scope = $this->scopeCreator->createScope($scopeRoot, $scope); + $this->scopes->push($scope); + } + $this->scopeRoots->setIteratorMode(\SplDoublyLinkedList::IT_MODE_LIFO | \SplDoublyLinkedList::IT_MODE_KEEP); + + return $scope; + } + + /** + * @return ControlFlowGraph + */ + public function getControlFlowGraph() + { + if ($cfg = $this->cfgs->top()) { + return $cfg; + } + + $cfa = new ControlFlowAnalysis(); + $cfa->process($this->getScopeRoot()); + $this->cfgs->pop(); + $this->cfgs->push($cfg = $cfa->getGraph()); + + return $cfg; + } + + /** + * @return \PHPParser_Node + */ + public function getScopeRoot() + { + if ($this->scopeRoots->isEmpty()) { + return $this->scopes->top()->getRootNode(); + } + + return $this->scopeRoots->top(); + } + + public function getScopeDepth() + { + return $this->scopes->count() + $this->scopeRoots->count(); + } + + public function hasScope() + { + return !$this->scopeRoots->isEmpty() || !$this->scopes->isEmpty(); + } + + public function traverse(\PHPParser_Node $root) + { + $this->curNode = $root; + $this->pushScopeWithRoot($root); + $this->traverseBranch($root); + $this->popScope(); + } + + private function traverseBranch(\PHPParser_Node $node, \PHPParser_Node $parent = null) + { + $this->curNode = $node; + if (!$this->callback->shouldTraverse($this, $node, $parent)) { + return; + } + + switch (true) { + case NodeUtil::isScopeCreator($node): + $this->traverseScopeCreator($node, $parent); + break; + + default: + foreach ($node as $subNode) { + // Sometimes we have an array for example when using multiple CATCH clauses. + // This does not apply to statements though which are wrapped in BlockNode + // instances. + if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + // in case of NameNodes we end up in this branch, so we also need to + // check that we do not have a string here + if (!$aSubNode instanceof \PHPParser_Node) { + continue; + } + + $this->traverseBranch($aSubNode, $node); + } + + continue; + } + + // Sometimes we get strings, simply skip everything that's not a node + // at this point. + if (!$subNode instanceof \PHPParser_Node) { + continue; + } + + $this->traverseBranch($subNode, $node); + } + } + + $this->curNode = $node; + $this->callback->visit($this, $node, $parent); + } + + private function traverseScopeCreator(\PHPParser_Node $node, \PHPParser_Node $parent = null) + { + assert(NodeUtil::isScopeCreator($node)); + + $this->curNode = $node; + $isScopeActive = $this->getScopeRoot() === $node; + + if (!$isScopeActive) { + $this->pushScopeWithRoot($node); + } + + // args + foreach ($node->params as $param) { + $this->traverseBranch($param, $node); + } + + // uses from parent scope + if ($node instanceof \PHPParser_Node_Expr_Closure) { + foreach ($node->uses as $use) { + $this->traverseBranch($use, $node); + } + } + + // body + // For abstract methods the stmts property is null, which we need to check here. + if (null !== $node->stmts) { + $this->traverseBranch($node->stmts, $node); + } + + if (!$isScopeActive) { + $this->popScope(); + } + } + + private function pushScopeWithRoot(\PHPParser_Node $node) + { + assert(null !== $this->curNode); + + $this->scopeRoots->push($node); + $this->cfgs->push(null); + + if ($this->callback instanceof ScopedCallbackInterface) { + $this->callback->enterScope($this); + } + } + + private function popScope() + { + if ($this->callback instanceof ScopedCallbackInterface) { + $this->callback->exitScope($this); + } + + if ($this->scopeRoots->isEmpty()) { + $this->scopes->pop(); + } else { + $this->scopeRoots->pop(); + } + + $this->cfgs->pop(); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/NodeUtil.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/NodeUtil.php new file mode 100644 index 0000000..10da8e9 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/NodeUtil.php @@ -0,0 +1,548 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser; + +use JMS\PhpManipulator\PhpParser\BlockNode; +use PhpOption\None; +use PhpOption\Some; +use PhpOption\Option; + +abstract class NodeUtil +{ + // http://www.php.net/manual/de/language.variables.superglobals.php + public static $superGlobalNames = array('GLOBALS', '_SERVER', '_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_REQUEST', '_ENV'); + + /** + * Returns the value of the node if it is static, and the node has a value. + * + * @param \PHPParser_Node $node + * + * @return Option + */ + public static function getValue(\PHPParser_Node $node = null) + { + if ($node instanceof \PHPParser_Node_Scalar_String) { + return new Some($node->value); + } + if ($node instanceof \PHPParser_Node_Scalar_LNumber) { + return new Some($node->value); + } + if ($node instanceof \PHPParser_Node_Scalar_DNumber) { + return new Some($node->value); + } + if ($node instanceof \PHPParser_Node_Expr_UnaryMinus) { + return self::getValue($node->expr)->map(function($v) { return $v * -1; }); + } + if ($node instanceof \PHPParser_Node_Expr_UnaryPlus) { + return self::getValue($node->expr); + } + if ($node instanceof \PHPParser_Node_Expr_ConstFetch) { + switch (strtolower(implode("\\", $node->name->parts))) { + case 'false': + return new Some(false); + + case 'true': + return new Some(true); + + case 'null': + return new Some(null); + } + } + + return None::create(); + } + + public static function isSuperGlobal(\PHPParser_Node $node) + { + if (!$node instanceof \PHPParser_Node_Expr_Variable + || !is_string($node->name)) { + return false; + } + + return in_array($node->name, self::$superGlobalNames, true); + } + + public static function isGet(\PHPParser_Node $node) + { + return $node instanceof \PHPParser_Node_Expr_PropertyFetch + || $node instanceof \PHPParser_Node_Expr_ArrayDimFetch + || $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch; + } + + public static function isCallToMethod(\PHPParser_Node $node, $name) + { + if ( ! $node instanceof \PHPParser_Node_Expr_MethodCall) { + return false; + } + + if ( ! is_string($node->name)) { + return false; + } + + return strtolower($name) === strtolower($node->name); + } + + /** + * Returns whether the given node can be associated with a method or function. + * + * We also include NEW nodes here which are possibly linked to a constructor if it exists. + * + * The check we are performing is a maybe-check in that we cannot guarantee that the method or + * function actually exists, but only that it could exist. + * + * @param \PHPParser_Node $node + * @return boolean + */ + public static function isCallLike(\PHPParser_Node $node) + { + return $node instanceof \PHPParser_Node_Expr_FuncCall + || $node instanceof \PHPParser_Node_Expr_MethodCall + || $node instanceof \PHPParser_Node_Expr_StaticCall + || $node instanceof \PHPParser_Node_Expr_New; + } + + public static function isName(\PHPParser_Node $node) + { + return $node instanceof \PHPParser_Node_Expr_Variable + && is_string($node->name); + } + + public static function isScopeCreator(\PHPParser_Node $node = null) + { + if (null === $node) { + return false; + } + + return $node instanceof \PHPParser_Node_Stmt_ClassMethod + || $node instanceof \PHPParser_Node_Stmt_Function + || $node instanceof \PHPParser_Node_Expr_Closure; + } + + public static function dump(\PHPParser_Node $node, $level = 0) + { + $output = ''; + $writeln = function($line) use ($level, &$output) { + $output .= str_repeat(' ', $level * 4).$line."\n"; + }; + + $writeln(json_encode(get_class($node)).':'); + + if (count($attrs = $node->getAttributes()) > 0) { + self::makeDisplayable($attrs); + $writeln(' attributes: '.json_encode($attrs)); + } + + $writeln(' children:'); + foreach ($node as $name => $subNode) { + if ($subNode instanceof \PHPParser_Node) { + $writeln(' '.json_encode($name).':'); + $output .= self::dump($subNode, $level + 3); + } else if (is_array($subNode)) { + $writeln(' '.json_encode($name).': '); + foreach ($subNode as $k => $aSubNode) { + if ($aSubNode instanceof \PHPParser_Node) { + $writeln(' '.json_encode($k).':'); + $output .= self::dump($aSubNode, $level + 4); + } else { + $writeln(' '.json_encode($k).': '.var_export($aSubNode, true)); + } + } + } else { + $writeln(' '.json_encode($name).': '.var_export($subNode, true)); + } + } + + return $output; + } + + private static function makeDisplayable(array &$attrs) + { + unset($attrs['parent'], $attrs['next'], $attrs['previous']); + + foreach ($attrs as $key => &$attr) { + if (null === $attr || is_scalar($attr)) { + continue; + } else if (is_array($attr)) { + self::makeDisplayable($attr); + } else if ($attr instanceof Type\PhpType) { + $attr = (string) $attr; + } else if (is_object($attr)) { + $attr = get_class($attr); + } else { + $attr = gettype($attr); + } + } + } + + public static function isBoolean(\PHPParser_Node $node = null) + { + if (!$node instanceof \PHPParser_Node_Expr_ConstFetch) { + return false; + } + + $name = strtolower(implode("\\", $node->name->parts)); + + return 'true' === $name || 'false' === $name; + } + + public static function getBooleanValue(\PHPParser_Node $node) + { + if (!$node instanceof \PHPParser_Node_Expr_ConstFetch) { + throw new \InvalidArgumentException('$node is not a boolean, but '.get_class($node)); + } + + $name = strtolower(implode("\\", $node->name->parts)); + + switch ($name) { + case 'true': + return true; + + case 'false': + return false; + + default: + throw new \InvalidArgumentException('$node is not a boolean, but constant '.$name); + } + } + + public static function isAssignmentOp(\PHPParser_Node $node = null) + { + if (null === $node) { + return false; + } + + return $node instanceof \PHPParser_Node_Expr_Assign + || $node instanceof \PHPParser_Node_Expr_AssignBitwiseAnd + || $node instanceof \PHPParser_Node_Expr_AssignBitwiseOr + || $node instanceof \PHPParser_Node_Expr_AssignBitwiseXor + || $node instanceof \PHPParser_Node_Expr_AssignConcat + || $node instanceof \PHPParser_Node_Expr_AssignDiv + || $node instanceof \PHPParser_Node_Expr_AssignList + || $node instanceof \PHPParser_Node_Expr_AssignMinus + || $node instanceof \PHPParser_Node_Expr_AssignMod + || $node instanceof \PHPParser_Node_Expr_AssignMul + || $node instanceof \PHPParser_Node_Expr_AssignPlus + || $node instanceof \PHPParser_Node_Expr_AssignRef + || $node instanceof \PHPParser_Node_Expr_AssignShiftLeft + || $node instanceof \PHPParser_Node_Expr_AssignShiftRight; + } + + public static function isConstantDefinition(\PHPParser_Node $node) + { + if (!$node instanceof \PHPParser_Node_Expr_FuncCall) { + return false; + } + + if (!$node->name instanceof \PHPParser_Node_Name) { + return false; + } + + $name = implode("\\", $node->name->parts); + if (strtolower($name) !== 'define') { + return false; + } + + return 2 === count($node->args); + } + + public static function isGetTypeFunctionCall(\PHPParser_Node $node) + { + return $node instanceof \PHPParser_Node_Expr_FuncCall + && $node->name instanceof \PHPParser_Node_Name + && 'gettype' === strtolower(implode("\\", $node->name->parts)); + } + + public static function getFunctionName(\PHPParser_Node $node) + { + if ( ! $node instanceof \PHPParser_Node_Expr_FuncCall) { + return null; + } + + // This might be a dynamic function call. + if ( ! $node->name instanceof \PHPParser_Node_Name) { + return null; + } + + return strtolower(implode("\\", $node->name->parts)); + } + + public static function isMaybeFunctionCall(\PHPParser_Node $node, $name) + { + return $node instanceof \PHPParser_Node_Expr_FuncCall + && $node->name instanceof \PHPParser_Node_Name + && strtolower(end($node->name->parts)) === strtolower($name); + } + + public static function isTypeFunctionCall(\PHPParser_Node $node) + { + static $functionNames = array('is_array', 'is_bool', 'is_callable', + 'is_double', 'is_float', 'is_real', 'is_int', 'is_integer', 'is_long', + 'is_null', 'is_numeric', 'is_object', 'is_resource', 'is_scalar', 'is_string'); + + if (!$node instanceof \PHPParser_Node_Expr_FuncCall) { + return false; + } + + if (!$node->name instanceof \PHPParser_Node_Name) { + return false; + } + + return in_array(end($node->name->parts), $functionNames, true); + } + + /** + * Returns the binary operator for the given node. + * + * @param \PHPParser_Node $node + * + * @return string + * + * @throws \InvalidArgumentException if node is not a binary operator + */ + public static function getBinOp(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_BooleanAnd: + return '&&'; + + case $node instanceof \PHPParser_Node_Expr_BooleanOr: + return '||'; + + case $node instanceof \PHPParser_Node_Expr_LogicalAnd: + return 'and'; + + case $node instanceof \PHPParser_Node_Expr_LogicalOr: + return 'or'; + + case $node instanceof \PHPParser_Node_Expr_LogicalXor; + return 'xor'; + + default: + throw new \InvalidArgumentException(sprintf('Unknown binary operator: %s', get_class($node))); + } + } + + public static function getBitOp(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_BitwiseAnd: + return '&'; + + case $node instanceof \PHPParser_Node_Expr_BitwiseOr: + return '|'; + + case $node instanceof \PHPParser_Node_Expr_BitwiseXor: + return '^'; + + case $node instanceof \PHPParser_Node_Expr_BitwiseNot: + return '~'; + + default: + throw new \InvalidArgumentException(sprintf('Unknown bit operator: %s', get_class($node))); + } + } + + public static function getEqualOp(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_Equal: + return '=='; + + case $node instanceof \PHPParser_Node_Expr_NotEqual: + return '!='; + + case $node instanceof \PHPParser_Node_Expr_Identical: + return '==='; + + case $node instanceof \PHPParser_Node_Expr_NotIdentical: + return '!=='; + + default: + throw new \InvalidArgumentException(sprintf('Unknown equality operator: %s', get_class($node))); + } + } + + public static function isEqualityExpression(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_Identical: + case $node instanceof \PHPParser_Node_Expr_NotIdentical: + case $node instanceof \PHPParser_Node_Expr_Equal: + case $node instanceof \PHPParser_Node_Expr_NotEqual: + return true; + + default: + return false; + } + } + + /** + * Gets the condition of an ON_TRUE / ON_FALSE CFG edge. + * @param \PHPParser_Node $n a node with an outgoing conditional CFG edge + * @return \PHPParser_Node the condition node or null if the condition is not obviously a node + */ + public static function getConditionExpression(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Stmt_If: + case $node instanceof \PHPParser_Node_Stmt_ElseIf: + case $node instanceof \PHPParser_Node_Stmt_While: + case $node instanceof \PHPParser_Node_Stmt_Do: + case $node instanceof \PHPParser_Node_Stmt_Switch: + return $node->cond; + + case $node instanceof \PHPParser_Node_Stmt_For: + return empty($node->cond) ? null : end($node->cond); // PHP only takes the last condition into account + + case $node instanceof \PHPParser_Node_Stmt_Catch: // TODO: Re-think how catch should be handled (relevant for TypeInference). + case $node instanceof \PHPParser_Node_Stmt_Foreach: + case $node instanceof \PHPParser_Node_Stmt_Case: + return null; + } + + throw new \InvalidArgumentException('The node "'.get_class($node).'" does not have a condition.'); + } + + public static function getStringRepr(\PHPParser_Node $node) + { + static $prettyPrinter; + if (null === $prettyPrinter) { + $prettyPrinter = new \PHPParser_PrettyPrinter_Zend(); + } + + if ($node instanceof \PHPParser_Node_Stmt_If + || $node instanceof \PHPParser_Node_Stmt_ElseIf) { + $label = 'if ('; + $label .= $prettyPrinter->prettyPrintExpr($node->cond); + $label .= ')'; + + return $label; + } + + if ($node instanceof \PHPParser_Node_Stmt_Label) { + return 'Label '.$node->name; + } + + if ($node instanceof \PHPParser_Node_Stmt_Echo) { + return 'echo '.$prettyPrinter->prettyPrint($node->exprs); + } + + if ($node instanceof \PHPParser_Node_Scalar_String) { + return 'string('.strlen($node->value).') '.var_export($node->value, true); + } + + if ($node instanceof \PHPParser_Node_Expr_Variable) { + if (is_string($node->name)) { + return '$'.$node->name; + } + + return 'Variable'; + } + + if ($node instanceof BlockNode) { + $str = 'Block'; + + if ($parent = $node->getAttribute('parent')) { + $str .= ' of '.self::getStringRepr($parent); + } else { + $str .= ' (global)'; + } + + return $str; + } + + if ($node instanceof \PHPParser_Node_Expr_Assign) { + return 'Assign (L'.$node->getLine().')'; + } + + if ($node instanceof \PHPParser_Node_Stmt_Catch) { + return 'catch '.implode("\\", $node->type->parts); + } + + return get_class($node); + } + + public static function isMethodContainer(\PHPParser_Node $node) + { + return $node instanceof \PHPParser_Node_Stmt_Class + || $node instanceof \PHPParser_Node_Stmt_Interface + || $node instanceof \PHPParser_Node_Stmt_Trait; + } + + public static function getContainer(\PHPParser_Node $node) + { + $parent = $node->getAttribute('parent'); + while ( ! self::isMethodContainer($parent) && null !== $parent = $parent->getAttribute('parent')); + + return Option::fromValue($parent); + } + + /** + * Returns whether the given node can be passed by reference. + * + * @param \PHPParser_Node $node + * @return boolean + * + * @see http://php.net/manual/en/language.references.pass.php + */ + public static function canBePassedByRef(\PHPParser_Node $node) + { + if ($node instanceof \PHPParser_Node_Expr_Variable + || $node instanceof \PHPParser_Node_Expr_PropertyFetch + || $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch + || $node instanceof \PHPParser_Node_Expr_ArrayDimFetch + || $node instanceof \PHPParser_Node_Expr_New) { + return true; + } + + // Functions which return references may also be used for parameters + // that request a reference. + if ($node instanceof \PHPParser_Node_Expr_FuncCall + || $node instanceof \PHPParser_Node_Expr_StaticCall + || $node instanceof \PHPParser_Node_Expr_MethodCall) { + return $node->getAttribute('returns_by_ref', false); + } + + return false; + } + + /** + * Returns the parent node of the given class, or null if not found. + * + * @param \PHPParser_Node $node + * @param string $parentClass + * + * @return \PHPParser_Node|null + */ + public static function findParent(\PHPParser_Node $node, $parentClass) + { + $parent = $node->getAttribute('parent'); + while (null !== $parent) { + if ($parent instanceof $parentClass) { + return $parent; + } + + $parent = $parent->getAttribute('parent'); + } + + return null; + } + + private final function __construct() { } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/ParameterParser.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/ParameterParser.php new file mode 100644 index 0000000..492de34 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/ParameterParser.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; + +class ParameterParser +{ + private $typeRegistry; + + public function __construct(TypeRegistry $registry) + { + $this->typeRegistry = $registry; + } + + public function parse(array $params, $paramClass) + { + $result = array(); + $i = 0; + foreach ($params as $paramNode) { + assert($paramNode instanceof \PHPParser_Node_Param); + + $param = new $paramClass($paramNode->name, $i); + $param->setAstNode($paramNode); + $param->setPassedByRef($paramNode->byRef); + + if (null !== $paramNode->default) { + $param->setOptional(true); + } + + if ($type = $paramNode->getAttribute('type')) { + $param->setPhpType($type); + } + + $result[] = $param; + $i += 1; + } + + return $result; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/PreOrderCallback.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/PreOrderCallback.php new file mode 100644 index 0000000..d40275b --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/PreOrderCallback.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser; + +/** + * A simple wrapper to allow traversal using a simple callable. + * + * @author Johannes M. Schmitt + */ +class PreOrderCallback implements \Scrutinizer\PhpAnalyzer\PhpParser\Traversal\CallbackInterface +{ + private $callable; + + public function __construct(callable $callable) + { + $this->callable = $callable; + } + + public function shouldTraverse(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + if (false === call_user_func($this->callable, $t, $node, $parent)) { + return false; + } + + return true; + } + + public function visit(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/MemoizedScopeCreator.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/MemoizedScopeCreator.php new file mode 100644 index 0000000..9e7f434 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/MemoizedScopeCreator.php @@ -0,0 +1,40 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Scope; + +class MemoizedScopeCreator implements ScopeCreatorInterface +{ + private $delegate; + private $scopes; + + public function __construct(ScopeCreatorInterface $delegate) + { + $this->delegate = $delegate; + $this->scopes = new \SplObjectStorage(); + } + + public function createScope(\PHPParser_Node $node, Scope $parent = null) + { + if (isset($this->scopes[$node])) { + return $this->scopes[$node]; + } + + return $this->scopes[$node] = $this->delegate->createScope($node, $parent); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/Scope.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/Scope.php new file mode 100644 index 0000000..6bc4695 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/Scope.php @@ -0,0 +1,161 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Scope; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +class Scope implements StaticScopeInterface +{ + private $vars = array(); + private $parent; + private $depth; + private $rootNode; + + /** The type for $this in the current scope */ + private $thisType; + + /** Whether this is the bottom scope (for purposes of type inference) */ + private $bottom; + + public static function createBottomScope(\PHPParser_Node $rootNode, PhpType $thisType = null) + { + $scope = new self($rootNode, null, $thisType); + $scope->bottom = true; + + return $scope; + } + + public function __construct(\PHPParser_Node $rootNode, Scope $parent = null, PhpType $thisType = null) + { + $this->rootNode = $rootNode; + $this->parent = $parent; + $this->thisType = $thisType; + $this->depth = null === $parent ? 0 : $parent->getDepth() + 1; + } + + public function getRootNode() + { + return $this->rootNode; + } + + public function getDepth() + { + return $this->depth; + } + + /** + * @param string $name + * @return Variable + */ + public function getVar($name) + { + return isset($this->vars[$name]) ? $this->vars[$name] : null; + } + + public function getSlot($name) + { + return $this->getVar($name); + } + + public function hasSlot($name) + { + return isset($this->vars[$name]); + } + + public function isDeclared($name) + { + return isset($this->vars[$name]); + } + + /** + * @return PhpType|null + */ + public function getTypeOfThis() + { + return $this->thisType; + } + + /** + * @return boolean + */ + public function isBottom() + { + return $this->bottom; + } + + /** + * @return boolean + */ + public function isGlobal() + { + return null === $this->parent; + } + + /** + * @return boolean + */ + public function isLocal() + { + return !$this->isGlobal(); + } + + /** + * @return Scope + */ + public function getParentScope() + { + return $this->parent; + } + + public function getVars() + { + return $this->vars; + } + + public function getVarNames() + { + return array_keys($this->vars); + } + + public function getVarCount() + { + return count($this->vars); + } + + /** + * Declares a variable. + * + * @param string $name + * @param PhpType $type + * @param boolean $typeInferred + * @return Variable + */ + public function declareVar($name, PhpType $type = null, $typeInferred = true) + { + if (empty($name)) { + throw new \InvalidArgumentException('$name cannot be empty.'); + } + + if (isset($this->vars[$name])) { + throw new \LogicException(sprintf('Variable "%s" was already declared, and cannot be declared twice.', $name)); + } + + return $this->vars[$name] = new Variable($name, $type, $this, $typeInferred, count($this->vars)); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/ScopeCreatorInterface.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/ScopeCreatorInterface.php new file mode 100644 index 0000000..68a78f8 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/ScopeCreatorInterface.php @@ -0,0 +1,32 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Scope; + +interface ScopeCreatorInterface +{ + /** + * Creates a new scope. + * + * @param \PHPParser_Node $node the root AST node + * @param Scope|null $parent + * + * @return Scope + */ + function createScope(\PHPParser_Node $node, Scope $parent = null); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/StaticScopeInterface.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/StaticScopeInterface.php new file mode 100644 index 0000000..f5dec47 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/StaticScopeInterface.php @@ -0,0 +1,52 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Scope; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +interface StaticScopeInterface +{ + /** + * @return \PHPParser_Node + */ + function getRootNode(); + + /** + * @return StaticScopeInterface|null + */ + function getParentScope(); + + /** + * @param string $name + * @return StaticSlotInterface|null + */ + function getSlot($name); + + /** + * @param string $name + * + * @return boolean + */ + function hasSlot($name); + + /** + * @return PhpType|null + */ + function getTypeOfThis(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/StaticSlotInterface.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/StaticSlotInterface.php new file mode 100644 index 0000000..ccc9de4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/StaticSlotInterface.php @@ -0,0 +1,44 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Scope; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +interface StaticSlotInterface +{ + /** + * @return string + */ + function getName(); + + /** + * @return PhpType|null + */ + function getType(); + + /** + * @return boolean + */ + function isTypeInferred(); + + /** + * @return boolean + */ + function isReference(); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/SyntacticScopeCreator.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/SyntacticScopeCreator.php new file mode 100644 index 0000000..a9c794a --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/SyntacticScopeCreator.php @@ -0,0 +1,235 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Scope; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use \PHPParser_Node as Node; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +class SyntacticScopeCreator implements ScopeCreatorInterface +{ + /** @var Scope */ + private $scope; + + public function createScope(Node $node, Scope $parent = null) + { + $scope = $this->scope = new Scope($node, $parent); + $this->scanRoot($node, $parent); + $this->scope = null; + + return $scope; + } + + private function scanRoot(Node $node, Scope $parent = null) + { + if (NodeUtil::isScopeCreator($node)) { + // declare function/method parameters + foreach ($node->params as $param) { + assert($param instanceof \PHPParser_Node_Param); + + $var = $this->declareVar($param->name, null, true, $param); + $var->setReference($param->byRef); + } + + // declare uses from parent scope + if ($node instanceof \PHPParser_Node_Expr_Closure) { + foreach ($node->uses as $use) { + assert($use instanceof \PHPParser_Node_Expr_ClosureUse); + + if (null !== $parent && $parent->isDeclared($use->var)) { + $var = $parent->getVar($use->var); + $newVar = $this->declareVar($use->var, $var->getType(), $var->isTypeInferred(), $use); + $newVar->setReference($use->byRef); + + continue; + } + + $var = $this->declareVar($use->var, null, true, $use); + $var->setReference($use->byRef); + } + } + + // Declare $this for non-static methods. + if ($node instanceof \PHPParser_Node_Stmt_ClassMethod + && ($node->type & \PHPParser_Node_Stmt_Class::MODIFIER_STATIC) === 0) { + $this->declareVar('this'); + } + + // Declare $this for Closures (since PHP 5.4) inside non-static methods. + if ($node instanceof \PHPParser_Node_Expr_Closure) { + $curParent = $parent; + while (null !== $curParent) { + if ($curParent->getRootNode() instanceof \PHPParser_Node_Stmt_ClassMethod) { + // If the method is declared static, then $this is not available in the + // Closure, just like $this is not available in a static method. + if (($curParent->getRootNode()->type & \PHPParser_Node_Stmt_Class::MODIFIER_STATIC) !== 0) { + break; + } + + $this->declareVar('this'); + break; + } + + $curParent = $curParent->getParentScope(); + } + } + + // body + if ($node->stmts) { + $this->scanVars($node->stmts, $node); + } + } else { + foreach ($node as $subNode) { + if ($subNode instanceof \PHPParser_Node) { + $this->scanVars($subNode, $node); + } else if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + if ($aSubNode instanceof \PHPParser_Node) { + $this->scanVars($aSubNode, $node); + } + } + } + } + } + } + + private function scanVars(Node $node, Node $parent) + { + switch (true) { + case $node instanceof \PHPParser_Node_Stmt_StaticVar: + $this->declareVar($node->name, null, true, $node); + + return; + + case $node instanceof \PHPParser_Node_Expr_Variable: + if (($parent instanceof \PHPParser_Node_Expr_Assign + || $parent instanceof \PHPParser_Node_Expr_AssignRef) + && is_string($node->name) + && $parent->var === $node) { + $this->declareVar($node->name, null, true, $node); + } + + // PHP automatically creates a variable (without issuing a warning) if an item is added + // to a variable without the variable being declared as array previously. + // ``function() { $a[] = 'foo'; }`` is perfectly permissible, and will create ``$a``. + if ($parent instanceof \PHPParser_Node_Expr_ArrayDimFetch + && $parent->var === $node) { + $parentsParent = $parent->getAttribute('parent'); + + if (($parentsParent instanceof \PHPParser_Node_Expr_Assign + || $parentsParent instanceof \PHPParser_Node_Expr_AssignRef) + && is_string($node->name) + && $parentsParent->var === $parent) { + // TODO: We should better track which variables have been initialized + // and which have not. This can be done by adding an undefined + // type for those that have not. + if (!$this->scope->isDeclared($node->name)) { + $node->setAttribute('array_initializing_variable', true); + } + + $this->declareVar($node->name, null, true, $node); + } + } + + if ($parent instanceof \PHPParser_Node_Arg + && $parent->getAttribute('param_expects_ref', false) + && is_string($node->name)) { + $this->declareVar($node->name, null, true, $node); + } + + return; + + case $node instanceof \PHPParser_Node_Expr_AssignList: + foreach ($node->vars as $var) { + if ($var instanceof \PHPParser_Node_Expr_Variable + && is_string($var->name)) { + $this->declareVar($var->name, null, true, $var); + } + } + + $this->scanVars($node->expr, $node); + + return; + + case $node instanceof \PHPParser_Node_Stmt_Trait: + case $node instanceof \PHPParser_Node_Stmt_Interface: + case $node instanceof \PHPParser_Node_Stmt_Class: + case NodeUtil::isScopeCreator($node): + return; // do not examine their children as they belong to a different scope + + case $node instanceof \PHPParser_Node_Stmt_Catch: + $this->declareVar($node->var, null, true, $node); + $this->scanVars($node->stmts, $node); + + return; + + case $node instanceof \PHPParser_Node_Stmt_Foreach: + if ($node->keyVar !== null + && $node->keyVar instanceof \PHPParser_Node_Expr_Variable + && is_string($node->keyVar->name)) { + $this->declareVar($node->keyVar->name, null, true, $node->keyVar); + } + + if ($node->valueVar instanceof \PHPParser_Node_Expr_Variable + && is_string($node->valueVar->name)) { + $this->declareVar($node->valueVar->name, null, true, $node->valueVar); + } + + $this->scanVars($node->stmts, $node); + + return; + + default: + foreach ($node as $subNode) { + if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + if (!$aSubNode instanceof \PHPParser_Node) { + continue; + } + $this->scanVars($aSubNode, $node); + } + } else if ($subNode instanceof \PHPParser_Node) { + $this->scanVars($subNode, $node); + } + } + } + } + + /** + * Declares a variable. + * + * @param string $name + * @param array $types + * @param boolean $typesInferred + */ + private function declareVar($name, PhpType $type = null, $typeInferred = true, \PHPParser_Node $nameNode = null) + { + if ($this->scope->isDeclared($name)) { + return $this->scope->getVar($name); + } + + $var = $this->scope->declareVar($name, $type, $typeInferred); + + if ($nameNode) { + $var->setNameNode($nameNode); + } + + return $var; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/Variable.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/Variable.php new file mode 100644 index 0000000..3d21da9 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Scope/Variable.php @@ -0,0 +1,101 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Scope; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; + +class Variable implements StaticSlotInterface +{ + private $name; + private $type; + private $typeInferred; + private $scope; + private $nameNode; + private $index; + private $reference = false; + + public function __construct($name, PhpType $type = null, Scope $scope, $typeInferred = true, $index = 0) + { + $this->name = $name; + $this->type = $type; + $this->scope = $scope; + $this->typeInferred = $typeInferred; + $this->index = $index; + } + + public function getName() + { + return $this->name; + } + + public function getType() + { + return $this->type; + } + + public function getScope() + { + return $this->scope; + } + + public function isTypeInferred() + { + return $this->typeInferred; + } + + public function getNameNode() + { + return $this->nameNode; + } + + public function getIndex() + { + return $this->index; + } + + public function isReference() + { + return $this->reference; + } + + public function setType(PhpType $type) + { + $this->type = $type; + } + + public function setTypeInferred($bool) + { + $this->typeInferred = (boolean) $bool; + } + + public function setNameNode(\PHPParser_Node $node) + { + $this->nameNode = $node; + } + + public function setIndex($index) + { + $this->index = (integer) $index; + } + + public function setReference($bool) + { + $this->reference = (boolean) $bool; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/AbstractPostOrderCallback.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/AbstractPostOrderCallback.php new file mode 100644 index 0000000..fab48cc --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/AbstractPostOrderCallback.php @@ -0,0 +1,29 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Traversal; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; + +abstract class AbstractPostOrderCallback implements CallbackInterface +{ + public function shouldTraverse(NodeTraversal $traversal, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + return true; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/AbstractScopedCallback.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/AbstractScopedCallback.php new file mode 100644 index 0000000..956da89 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/AbstractScopedCallback.php @@ -0,0 +1,33 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Traversal; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; + +abstract class AbstractScopedCallback implements ScopedCallbackInterface +{ + public function shouldTraverse(NodeTraversal $traversal, \PHPParser_Node $node, \PHPParser_Node $parent = null) + { + return true; + } + + public function visit(NodeTraversal $traversal, \PHPParser_Node $node, \PHPParser_Node $parent = null) { } + public function enterScope(NodeTraversal $traversal) { } + public function exitScope(NodeTraversal $traversal) { } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/CallbackInterface.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/CallbackInterface.php new file mode 100644 index 0000000..daddbcb --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/CallbackInterface.php @@ -0,0 +1,46 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Traversal; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; + +interface CallbackInterface +{ + /** + * Checks whether a node and its children should be traversed. + * + * This can be used to short-circuit traversals where possible. + * + * @param \Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal $traversal + * @param \PHPParser_Node $node + * @param \PHPParser_Node $parent + * + * @return boolean + */ + function shouldTraverse(NodeTraversal $traversal, \PHPParser_Node $node, \PHPParser_Node $parent = null); + + /** + * @param \Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal $traversal + * @param \PHPParser_Node $node + * @param \PHPParser_Node $parent + * + * @return void + */ + function visit(NodeTraversal $traversal, \PHPParser_Node $node, \PHPParser_Node $parent = null); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/ScopedCallbackInterface.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/ScopedCallbackInterface.php new file mode 100644 index 0000000..cf1b899 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Traversal/ScopedCallbackInterface.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Traversal; + +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; + +/** + * Extends the callback interface to be aware of scopes. + * + * @author Johannes M. Schmitt + */ +interface ScopedCallbackInterface extends CallbackInterface +{ + /** + * Called immediately after entering a new scope. + * + * The new scope can be accessed through $traversal->getScope(). + * + * @return void + */ + function enterScope(NodeTraversal $traversal); + + /** + * Called immediately before exiting a scope. + * + * The ending scope can be accessed through $traversal->getScope(). + * + * @return void. + */ + function exitScope(NodeTraversal $traversal); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/TreeSerializer.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/TreeSerializer.php new file mode 100644 index 0000000..cbf5b8a --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/TreeSerializer.php @@ -0,0 +1,83 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser; + +class TreeSerializer +{ + private $idCache; + private $idCount; + + public function serialize(\PHPParser_Node $node) + { + $this->idCache = new \SplObjectStorage(); + $this->idCount = 0; + + $dot = "digraph tree {\n"; + + $dot .= ' '.$this->getId($node).' [label="'.$this->getLabel($node).'", style=filled]'."\n"; + $dot .= $this->serializeChildren($node); + + $dot .= "}\n"; + + return $dot; + } + + private function serializeChildren(\PHPParser_Node $node) + { + $dot = ''; + foreach ($node as $subNode) { + if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + if (!$aSubNode instanceof \PHPParser_Node) { + continue; + } + $dot .= ' '.$this->getId($aSubNode).' [label="'.$this->getLabel($aSubNode).'"]'."\n"; + $dot .= ' '.$this->getId($node).' -> '.$this->getId($aSubNode)."\n"; + $dot .= $this->serializeChildren($aSubNode); + } + } else if ($subNode instanceof \PHPParser_Node) { + $dot .= ' '.$this->getId($subNode).' [label="'.$this->getLabel($subNode).'"]'."\n"; + $dot .= ' '.$this->getId($node).' -> '.$this->getId($subNode)."\n"; + $dot .= $this->serializeChildren($subNode); + } + } + + return $dot; + } + + private function getLabel(\PHPParser_Node $node) + { + $label = get_class($node); + + if ($type = $node->getAttribute('type')) { + $label .= ' ('.$type->getDisplayName().')'; + } + + return str_replace('"', '\\"', $label); + } + + private function getId(\PHPParser_Node $node) + { + if (isset($this->idCache[$node])) { + return $this->idCache[$node]; + } + + return $this->idCache[$node] = 'N'.($this->idCount++); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/AllType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/AllType.php new file mode 100644 index 0000000..cc98c70 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/AllType.php @@ -0,0 +1,77 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +/** + * All Type. + * + * This is the TOP type in the type hierarchy. All other types are sub-types of this type. + * + * In PHP Doc, "mixed" is often used to describe this type. We cannot generally make this translation though as it + * sometimes more meant to say that the type is UNKNOWN instead. + * + * @author Johannes M. Schmitt + */ +final class AllType extends PhpType +{ + public function visit(VisitorInterface $visitor) + { + return $visitor->visitAllType(); + } + + public function matchesObjectContext() + { + return true; + } + + public function canBeCalled() + { + return false; + } + + public function testForEquality(PhpType $that) + { + return TernaryValue::get('unknown'); + } + + public function getDocType(array $importedNamespaces = array()) + { + return 'mixed'; + } + + public function getDisplayName() + { + return '*'; + } + + public function hasDisplayName() + { + return true; + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(true, false); + } + + public function isAllType() + { + return true; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ArrayType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ArrayType.php new file mode 100644 index 0000000..3eedff4 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ArrayType.php @@ -0,0 +1,330 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +/** + * Represents all sorts of array types. + * + * Currently, this type deals with list-style arrays, associative, map-style arrays, and unknown-style arrays. We might + * consider splitting the different behaviors into dedicated sub-classes at some point. + * + * @author Johannes M. Schmitt + */ +class ArrayType extends PhpType +{ + /** @var PhpType */ + private $keyType; + + /** @var PhpType */ + private $elementType; + + /** @var PhpType[] */ + private $itemTypes; + + public function __construct(TypeRegistry $registry, PhpType $elementType = null, PhpType $keyType = null, array $itemTypes = array()) + { + parent::__construct($registry); + + // In PHP, the key is always either an integer, or a string. If something else is + // passed, then we automatically narrow it down. + if ($keyType && ! $keyType->isSubTypeOf($registry->getNativeType('generic_array_key'))) { + $keyType = $registry->getNativeType('generic_array_key'); + } + + // PHP always forces either a string, or an integer as key type. + $this->keyType = $keyType ?: $registry->getNativeType('generic_array_key'); + $this->elementType = $elementType ?: $registry->getNativeType('generic_array_value'); + $this->itemTypes = $itemTypes; + } + + public function inferItemType($key, PhpType $type) + { + $newType = clone $this; + $newType->itemTypes[$key] = $type; + + $newKeyType = null; + if (is_string($key)) { + $newKeyType = $this->registry->getNativeType('string'); + } else if (is_int($key)) { + $newKeyType = $this->registry->getNativeType('integer'); + } + + if (null !== $newKeyType) { + if ($newType->keyType === $this->registry->getNativeType('generic_array_key')) { + $newType->keyType = $newKeyType; + } else { + $newType->keyType = $this->registry->createUnionType([$newType->keyType, $newKeyType]); + } + } + + if ($newType->elementType === $this->registry->getNativeType('generic_array_value')) { + $newType->elementType = $type; + } else { + $newType->elementType = $this->registry->createUnionType([$this->elementType, $type]); + } + + return $newType; + } + + public function getItemType($key) + { + if (isset($this->itemTypes[$key])) { + return new \PhpOption\Some($this->itemTypes[$key]); + } + + return \PhpOption\None::create(); + } + + public function getItemTypes() + { + return $this->itemTypes; + } + + public function getDocType(array $importedNamespaces = array()) + { + if ($this->elementType->isUnknownType() || $this->elementType->isAllType()) { + return 'array'; + } + + if ($this->keyType->isIntegerType()) { + return 'array<'.$this->elementType->getDocType($importedNamespaces).'>'; + + // TODO: Should we optionally allow PHPDocumentor style below? +// $elementDocType = $this->elementType->getDocType($importedNamespaces); +// +// // For unions, PHP documentor supports "(int|string)[]". +// if ($this->elementType->isUnionType()) { +// $elementDocType = '('.$elementDocType.')'; +// } +// +// return $elementDocType.'[]'; + } + + if ($this->keyType->isStringType()) { + return 'arrayelementType->getDocType($importedNamespaces).'>'; + } + + return 'array<*,'.$this->elementType->getDocType($importedNamespaces).'>'; + } + + public function isSubTypeOf(PhpType $that) + { + if (parent::isSubTypeOf($that)) { + return true; + } + + if ($that->isArrayType()) { + // Every Array type is a subtype of the generic Array type. + if ($that === $this->registry->getNativeType('array')) { + return true; + } + + // Key and Element Types must be subtypes. + if ( ! $this->keyType->isSubTypeOf($that->keyType)) { + return false; + } + if ( ! $this->elementType->isSubTypeOf($that->elementType) + // This second condition is a bit special and it might actually be the wrong place to add this + // (we will need to watch the impact). Basically, on one side we do not want to loose type information + // as soon as an unknown type enters the field, on the other hand if we only can choose between + // unknown and all types, then the unknown type is actually preferable as it will lead to less + // false-positives. In the end, this behavior here would not work in a real compiler as we basically + // cannot guarantee that the element type is always of the more specific type, but in practice in + // most cases people only place a single type in arrays unless it is used as map which we handle + // with types anyway. If this proves not useful, we might consider moving it to the getLeastSuperType method. + || ($this->registry->getNativeType('generic_array_value') === $this->elementType + && ! $that->elementType->equals($this->registry->getNativeType('all')))) { + return false; + } + + // If the other array has no item types, this is a sub-type of the other array. + if (empty($that->itemTypes)) { + return true; + } + + // If that is the case, we also need to ensure that this type has at least all the items + // of the other types, and that their respective types are also sub-types. + foreach ($that->itemTypes as $name => $itemType) { + if ( ! isset($this->itemTypes[$name])) { + return false; + } + + if ( ! $this->itemTypes[$name]->isSubtypeOf($itemType)) { + return false; + } + } + + return true; + } + + if ($that->isCallableType()) { + return true; + } + + + return false; + } + + public function visit(VisitorInterface $visitor) + { + return $visitor->visitArrayType($this); + } + + public function testForEquality(PhpType $that) + { + $rs = parent::testForEquality($that); + if (null !== $rs) { + return $rs; + } + + // Most of (all?) of the array cases are already handled by the + // default implementation. + return TernaryValue::get('false'); + } + + public function isTraversable() + { + return true; + } + + public function equals(PhpType $that) + { + if ( ! $that->isArrayType()) { + return false; + } + + $that = $that->toMaybeArrayType(); + if ( ! $that->keyType->equals($this->keyType)) { + return false; + } + + if ( ! $that->elementType->equals($this->elementType)) { + return false; + } + + if (empty($this->itemTypes) && empty($that->itemTypes)) { + return true; + } + + if (count($this->itemTypes) !== count($that->itemTypes)) { + return false; + } + + foreach ($this->itemTypes as $name => $itemType) { + if ( ! isset($that->itemTypes[$name])) { + return false; + } + + if ( ! $itemType->equals($that->itemTypes[$name])) { + return false; + } + } + + return true; + } + + public function getElementType() + { + return $this->elementType; + } + + public function getKeyType() + { + return $this->keyType; + } + + public function getDisplayName() + { + if ($this->keyType->equals($this->registry->getNativeType('generic_array_key')) + && $this->elementType->equals($this->registry->getNativeType('generic_array_value'))) { + return 'array'; + } + + if (empty($this->itemTypes)) { + return 'array<'.$this->keyType.','.$this->elementType.'>'; + } + + return sprintf( + 'array<%s,%s,%s>', + $this->keyType, + $this->elementType, + json_encode(array_map('strval', $this->itemTypes), JSON_FORCE_OBJECT)); + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(true, false); + } + + public function isArrayType() + { + return true; + } + + public function toMaybeArrayType() + { + return $this; + } + + public function getLeastSuperType(PhpType $that) + { + if ($that->isArrayType()) { + if ($this->isSubtypeOf($that)) { + // We have a special case, that is if we compare array to array. Although, both types are + // subtypes of each other, we always must have a predictable outcome of this method regardless of the + // order of types, i.e. $a->getLeastSuperType($b) === $b->getLeastSuperType($a). + if ($this->elementType->isUnknownType() && $that->elementType->isAllType()) { + return $this; + } + if ($that->elementType->isUnknownType() && $this->elementType->isAllType()) { + return $that; + } + + return parent::getLeastSuperType($that); + } + + $genericArrayType = $this->registry->getNativeType('array'); + if ($this === $genericArrayType) { + return $this; + } + if ($that === $genericArrayType) { + return $that; + } + + // If both arrays have different item types defined, we keep them as + // separate arrays in a union type. It can be used as an indication + // that a key is not always defined. + if (count($this->itemTypes) !== count($that->itemTypes) + || (boolean) array_diff_key($this->itemTypes, $that->itemTypes)) { + return parent::getLeastSuperType($that); + } + + $keyType = $this->registry->createUnionType(array($this->keyType, $that->keyType)); + $elementType = $this->registry->createUnionType(array($this->elementType, $that->elementType)); + $itemTypes = array(); + foreach ($this->itemTypes as $name => $itemType) { + $itemTypes[$name] = $this->registry->createUnionType(array($itemType, $that->itemTypes[$name])); + } + + return $this->registry->getArrayType($elementType, $keyType, $itemTypes); + } + + return parent::getLeastSuperType($that); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/BooleanType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/BooleanType.php new file mode 100644 index 0000000..bd059da --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/BooleanType.php @@ -0,0 +1,76 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class BooleanType extends PhpType +{ + public function visit(VisitorInterface $visitor) + { + return $visitor->visitBooleanType(); + } + + public function isNullable() + { + return false; + } + + public function testForEquality(PhpType $that) + { + $rs = parent::testForEquality($that); + + if (null !== $rs) { + return $rs; + } + + if ($that->isUnknownType() + || $that->isSubTypeOf($this->registry->getNativeType('scalar')) + || $that->isNullType() + || $that->isResourceType() + || $that->isObjectType()) { + return TernaryValue::get('unknown'); + } + + return TernaryValue::get('false'); + } + + public function getDisplayName() + { + return 'boolean'; + } + + public function hasDisplayName() + { + return true; + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(true, false); + } + + public function isBooleanType() + { + return true; + } + + public function equals(PhpType $type) + { + return $type instanceof BooleanType && ! $type instanceof FalseType; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/CallableType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/CallableType.php new file mode 100644 index 0000000..ef6f1be --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/CallableType.php @@ -0,0 +1,56 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class CallableType extends PhpType +{ + public function visit(VisitorInterface $v) + { + return $v->visitCallableType($this); + } + + public function getDisplayName() + { + return 'callable'; + } + + public function isCallableType() + { + return true; + } + + public function canBeCalled() + { + return true; + } + + public function testForEquality(PhpType $that) + { + if (null !== $rs = parent::testForEquality($that)) { + return $rs; + } + + if ($that->isIntegerType() || $that->isDoubleType() || $that->isNullType() || $that->isResourceType() + || $that->isNullType() || $that->isBooleanType()) { + return TernaryValue::get('false'); + } + + return TernaryValue::get('unknown'); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/DoubleType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/DoubleType.php new file mode 100644 index 0000000..9d07d82 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/DoubleType.php @@ -0,0 +1,67 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class DoubleType extends PhpType +{ + public function visit(VisitorInterface $v) + { + return $v->visitDoubleType(); + } + + public function isNullable() + { + return false; + } + + public function testForEquality(PhpType $that) + { + $rs = parent::testForEquality($that); + + if ($rs !== null) { + return $rs; + } + + if ($that->isUnknownType() + || $that->isNullType() + || $that->isStringType() + || $that->isIntegerType() + || $that->isResourceType() + || $that->isDoubleType()) { + return TernaryValue::get('unknown'); + } + + return TernaryValue::get('false'); + } + + public function getDisplayName() + { + return 'double'; + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(true, false); + } + + public function isDoubleType() + { + return true; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/FalseType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/FalseType.php new file mode 100644 index 0000000..7429855 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/FalseType.php @@ -0,0 +1,77 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TernaryValue; + +/** + * Special type representing a boolean false. + * + * We treat this specially since PHP's internal functions often return something like ``SomeObject|false``. Having a + * special type for false allows the type inference engine to handle situations such as the following more effectively: + * + * ``` + * $a = array('string'); + * while ($elem = array_pop($a)) { + * // $elem is a "string" here, and not a "boolean|string". + * } + * ``` + * + * @author Johannes M. Schmitt + */ +class FalseType extends BooleanType +{ + public function testForEquality(PhpType $that) + { + if ($that->isFalse()) { + return TernaryValue::get('true'); + } + + return parent::testForEquality($that); + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(false); + } + + public function isSubTypeOf(PhpType $that) + { + if ($that->isBooleanType()) { + return true; + } + + return parent::isSubTypeOf($that); + } + + public function isFalse() + { + return true; + } + + public function getDisplayName() + { + return 'false'; + } + + public function equals(PhpType $type) + { + return $type instanceof self; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/IntegerType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/IntegerType.php new file mode 100644 index 0000000..6f4df0f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/IntegerType.php @@ -0,0 +1,67 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class IntegerType extends PhpType +{ + public function visit(VisitorInterface $v) + { + return $v->visitIntegerType(); + } + + public function isNullable() + { + return false; + } + + public function testForEquality(PhpType $that) + { + $rs = parent::testForEquality($that); + + if ($rs !== null) { + return $rs; + } + + if ($that->isUnknownType() + || $that->isNullType() + || $that->isStringType() + || $that->isIntegerType() + || $that->isResourceType() + || $that->isDoubleType()) { + return TernaryValue::get('unknown'); + } + + return TernaryValue::get('false'); + } + + public function getDisplayName() + { + return 'integer'; + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(true, false); + } + + public function isIntegerType() + { + return true; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/MemoryTypeProvider.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/MemoryTypeProvider.php new file mode 100644 index 0000000..437dae6 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/MemoryTypeProvider.php @@ -0,0 +1,103 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\Model\GlobalConstant; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; + +/** + * Memory-based type provider implementation. + * + * This is solely useful for unit testing. + * + * @author Johannes M. Schmitt + */ +class MemoryTypeProvider implements TypeProviderInterface +{ + private $classes = array(); + private $functions = array(); + private $constants = array(); + + public function addClass(MethodContainer $container) + { + $this->classes[strtolower($container->getName())] = $container; + } + + public function addFunction(GlobalFunction $function) + { + $this->functions[$function->getName()] = $function; + } + + public function addConstant(GlobalConstant $constant) + { + $this->constants[$constant->getName()] = $constant; + } + + public function getImplementingClasses($name) + { + $classes = array(); + foreach ($this->classes as $class) { + if ( ! $class instanceof \Scrutinizer\PhpAnalyzer\Model\Clazz) { + continue; + } + + if ( ! $class->isImplementing($name)) { + continue; + } + + $classes[] = $class; + } + + return $classes; + } + + public function loadClasses(array $names) + { + $rs = array(); + foreach ($names as $name) { + $lowerName = strtolower($name); + + if (!isset($this->classes[$lowerName])) { + continue; + } + + $rs[$name] = $this->classes[$lowerName]; + } + + return $rs; + } + + public function loadClass($name) + { + $name = strtolower($name); + + return isset($this->classes[$name]) ? $this->classes[$name] : null; + } + + public function loadFunction($name) + { + return isset($this->functions[$name]) ? $this->functions[$name] : null; + } + + public function loadConstant($name) + { + return isset($this->constants[$name]) ? $this->constants[$name] : null; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NamedType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NamedType.php new file mode 100644 index 0000000..4f5ab08 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NamedType.php @@ -0,0 +1,101 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +/** + * A type where we know the string representation, but not the actual structure of the type. + * + * This type acts mostly as UNKNOWN type until actually resolved. + * + * @author Johannes M. Schmitt + */ +class NamedType extends ProxyObjectType +{ + private $reference; + private $resolved = false; + + /** + * Convenience constructor for tests. + * + * @param TypeRegistry $registry + * @param PhpType $type + * + * @return NamedType + */ + public static function createResolved(TypeRegistry $registry, PhpType $type) + { + assert('$type->isObjectType()'); + + $named = new self($registry, $type->toMaybeObjectType()->getName()); + $named->setReferencedType($type); + + return $named; + } + + /** + * Constructor. + * + * @param TypeRegistry $registry + * @param string $reference String Reference to the non-resolved type + */ + public function __construct(TypeRegistry $registry, $reference) + { + parent::__construct($registry, $registry->getNativeType('object')); + + $this->reference = $reference; + } + + public function isNoResolvedType() + { + return ! $this->resolved; + } + + public function isResolved() + { + return $this->resolved; + } + + public function setReferencedType(PhpType $type) + { + if ( ! $type->isObjectType()) { + throw new \LogicException('The referenced type must be an object type.'); + } + + if ($type->isNoObjectType()) { + throw new \LogicException('The referenced type must not be the generic object type.'); + } + + parent::setReferencedType($type); + $this->resolved = true; + } + + public function getReferenceName() + { + return $this->reference; + } + + public function getDisplayName() + { + if (!$this->getReferencedType()->isNoObjectType()) { + return $this->getReferencedType()->getDisplayName(); + } + + return 'object<'.$this->reference.'>'; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NoObjectType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NoObjectType.php new file mode 100644 index 0000000..20aa95b --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NoObjectType.php @@ -0,0 +1,94 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class NoObjectType extends ObjectType +{ + public function visit(VisitorInterface $v) + { + return $v->visitNoObjectType(); + } + + public function isTraversable() + { + return true; + } + + public function isSubTypeOf(PhpType $that) + { + if (parent::isSubTypeOf($that)) { + return true; + } + + if ($that->isCallableType()) { + return true; + } + + return false; + } + + public function testForEquality(PhpType $that) + { + $rs = parent::testForEquality($that); + if (null !== $rs) { + return $rs; + } + + // Objects are comparable to objects only (by comparing their property + // values). The no object type represents a generic object. + if ($that->isObjectType() || $that->isNoObjectType()) { + return TernaryValue::get('unknown'); + } + + // If the other value is no object, then PHP will raise a warning in + // most cases, and if not the comparison is false. + return TernaryValue::get('false'); + } + + public function isNoObjectType() + { + return true; + } + + public function equals(PhpType $type) + { + return $type instanceof NoObjectType; + } + + public function getPropertyType($name) + { + return $this->typeRegistry->getNativeType(TypeRegistry::NATIVE_NONE); + } + + public function hasProperty($name) + { + // has all properties since it is any object + return true; + } + + public function hasMethod($name) + { + return true; + } + + public function getDisplayName() + { + return 'object'; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NoType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NoType.php new file mode 100644 index 0000000..30c9503 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NoType.php @@ -0,0 +1,72 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +/** + * None Type. + * + * This type is the BOTTOM type in the type hierarchy; it is a sub-type of all types. + * + * In PHP Doc this type is never explicitly specified, but we it is required for static analysis. For example, + * when trying to find the greatest sub-type of two types. + * + * @author Johannes M. Schmitt + */ +class NoType extends PhpType +{ + public function visit(VisitorInterface $v) + { + return $v->visitNoType(); + } + + public function isNoType() + { + return true; + } + + public function isTraversable() + { + return true; + } + + public function isNullable() + { + return true; + } + + public function isSubTypeOf(PhpType $that) + { + return true; + } + + public function matchesObjectContext() + { + return true; + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(); + } + + public function getDisplayName() + { + return 'NoType'; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NullType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NullType.php new file mode 100644 index 0000000..95f8534 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NullType.php @@ -0,0 +1,76 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class NullType extends PhpType +{ + public function visit(VisitorInterface $v) + { + return $v->visitNullType(); + } + + public function isNullType() + { + return true; + } + + public function isNullable() + { + return true; + } + + public function matchesObjectContext() + { + return false; + } + + public function testForEquality(PhpType $that) + { + $rs = parent::testForEquality($that); + + if ($rs !== null) { + return $rs; + } + + if ($that->isNullType()) { + return TernaryValue::get('true'); + } + + if ($that->isUnknownType() || $that->isNullable()) { + return TernaryValue::get('unknown'); + } + + return TernaryValue::get('false'); + } + + public function getDisplayName() + { + return 'null'; + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(false); + } + + public function restrictByNotNull() + { + return $this->registry->getNativeType(TypeRegistry::NATIVE_NONE); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NullTypeProvider.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NullTypeProvider.php new file mode 100644 index 0000000..719756f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/NullTypeProvider.php @@ -0,0 +1,49 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeProviderInterface; + +class NullTypeProvider implements TypeProviderInterface +{ + public function loadClasses(array $names) + { + return array(); + } + + public function getImplementingClasses($name) + { + return array(); + } + + public function loadClass($name) + { + return null; + } + + public function loadFunction($name) + { + return null; + } + + public function loadConstant($name) + { + return null; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ObjectType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ObjectType.php new file mode 100644 index 0000000..8d3755d --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ObjectType.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +/** + * Base Object Type. + * + * This is extended by the generic object type "NoObject", and by concrete + * classes, traits, and interfaces. + * + * @author Johannes M. Schmitt + */ +abstract class ObjectType extends PhpType +{ + public function visit(VisitorInterface $v) + { + return $v->visitObjectType($this); + } + + public function matchesObjectContext() + { + return true; + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(true); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PackageAwareTypeProviderInterface.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PackageAwareTypeProviderInterface.php new file mode 100644 index 0000000..e06d44d --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PackageAwareTypeProviderInterface.php @@ -0,0 +1,29 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeProviderInterface; + +interface PackageAwareTypeProviderInterface extends TypeProviderInterface +{ + /** + * @return void + */ + function setPackageVersions(array $packageVersions); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PhpType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PhpType.php new file mode 100644 index 0000000..9d40aef --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PhpType.php @@ -0,0 +1,708 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; + +/** + * Base Type. + * + * @author Johannes M. Schmitt + */ +abstract class PhpType implements \JsonSerializable +{ + protected $registry; + + /** + * @var array + */ + private $attributes; + + public static function getShortestClassNameReference($fqcn, array $importedNamespaces = array()) + { + $origFqcn = $fqcn; + $parts = explode("\\", $fqcn); + $namespace = 1 === count($parts) ? '' : implode("\\", array_slice($parts, 0, -1)); + $shortName = end($parts); + + // Check if the types are in the same namespace. + if (isset($importedNamespaces['']) && $namespace === $importedNamespaces['']) { + return $shortName; + } + + // Go through the namespaces, and check for the longest imported alias. + $aliasSuffix = ''; + while (false === $alias = array_search($fqcn, $importedNamespaces, true)) { + if (false === $pos = strrpos($fqcn, '\\')) { + break; + } + + $aliasSuffix = substr($fqcn, $pos).$aliasSuffix; + $fqcn = substr($fqcn, 0, $pos); + } + + // The absolute alias. + if (false === $alias) { + if ( ! isset($importedNamespaces['']) || '' === $importedNamespaces['']) { + return $origFqcn; + } + + return '\\'.$origFqcn; + } else if ('' === $alias) { + $aliasSuffix = substr($aliasSuffix, 1); + } + + return $alias.$aliasSuffix; + } + + public function __construct(TypeRegistry $registry, array $attributes = array()) + { + $this->registry = $registry; + $this->attributes = $attributes; + } + + public function jsonSerialize() + { + return $this->getDisplayName(); + } + + public function addAttribute($key, $value) + { + if (array_key_exists($key, $this->attributes) && $this->attributes[$key] === $value) { + return $this; + } + + $newType = clone $this; + $newType->attributes[$key] = $value; + + return $newType; + } + + public function addAttributes(array $kvMap) + { + if (empty($kvMap)) { + return $this; + } + + foreach ($kvMap as $k => $v) { + if (array_key_exists($k, $this->attributes) && $this->attributes[$k] === $v) { + continue; + } + + $newType = clone $this; + $newType->attributes = array_merge($newType->attributes, $kvMap); + + return $newType; + } + + return $this; + } + + public function removeAttribute($key) + { + if ( ! array_key_exists($key, $this->attributes)) { + return $this; + } + + $newType = clone $this; + unset($newType[$key]); + + return $newType; + } + + /** + * Removes the given attributes from this type. + * + * @param string[] $kList + * + * @return $this + */ + public function removeAttributes($kList) + { + if (empty($kList)) { + return $this; + } + + foreach ($kList as $k) { + if ( ! array_key_exists($k, $this->attributes)) { + continue; + } + + $newType = clone $this; + $newType->attributes = array_diff($newType->attributes, $kList); + + return $newType; + } + + return $this; + } + + public function getAttributes() + { + return $this->attributes; + } + + public function getAttribute($key) + { + if ( ! array_key_exists($key, $this->attributes)) { + throw new \InvalidArgumentException(sprintf('The attribute "%s" does not exist.', $key)); + } + + return $this->attributes[$key]; + } + + public function getAttributeOrElse($key, $default) + { + if ( ! array_key_exists($key, $this->attributes)) { + return $default; + } + + return $this->attributes[$key]; + } + + public function hasAttribute($key) + { + return array_key_exists($key, $this->attributes); + } + + public function getNativeType($name) + { + return $this->registry->getNativeType($name); + } + + public function isAllType() + { + return false; + } + + public function isArrayType() + { + return false; + } + + public function isBooleanType() + { + return false; + } + + public function isDoubleType() + { + return false; + } + + public function isIntegerType() + { + return false; + } + + public function isCallableType() + { + return false; + } + + public function isNoType() + { + return false; + } + + public function isNullType() + { + return false; + } + + public function isNoResolvedType() + { + return false; + } + + public function isStringType() + { + return false; + } + + public function isObjectType() + { + return $this->toMaybeObjectType() !== null; + } + + public function isNoObjectType() + { + return false; + } + + public function isUnionType() + { + return $this->toMaybeUnionType() !== null; + } + + public function isUnknownType() + { + return false; + } + + public function isFalse() + { + return false; + } + + public function isResourceType() + { + return false; + } + + public function isInterface() + { + return false; + } + + public function isTrait() + { + return false; + } + + public function isClass() + { + return $this->toMaybeObjectType() + && !$this->isInterface() + && !$this->isTrait(); + } + + public function getDisplayName() + { + return null; + } + + public function hasDisplayName() + { + $name = $this->getDisplayName(); + + return !empty($name); + } + + public function matchesObjectContext() + { + return false; + } + + /** + * Returns whether the given type can be called. + * + * This differs from checking whether a type is a subtype of the Callable type insofar as that the check performed + * here is a bit stronger, f.e. the Object type can verify that a ``__invoke`` method actually exists. + * + * @return boolean + */ + public function canBeCalled() + { + return $this->isSubTypeOf($this->registry->getNativeType('callable')); + } + + public function canAssignTo(PhpType $type) + { + return $this->isSubTypeOf($type); + } + + /** + * Checks whether this type is a sub-type of the passed type. + * + * @param PhpType $that + * + * @return boolean + */ + public function isSubTypeOf(PhpType $that) + { + if ($that->isUnknownType()) { + return true; + } + + if ($this->equals($that)) { + return true; + } + + if ($that->isAllType()) { + return true; + } + + if ($that->isUnionType()) { + $union = $that->toMaybeUnionType(); + foreach ($union->getAlternates() as $element) { + if ($this->isSubTypeOf($element)) { + return true; + } + } + } + + return false; + } + + public function collapseUnion() + { + return $this; + } + + /** + * @return UnionType|null + */ + public function toMaybeUnionType() + { + return null; + } + + /** + * @return MethodContainer|null + */ + public function toMaybeObjectType() + { + return null; + } + + /** + * @return ArrayType|null + */ + public function toMaybeArrayType() + { + return null; + } + + public function getLeastSuperType(PhpType $that) + { + if ($that->isUnionType()) { + return $that->toMaybeUnionType()->getLeastSuperType($this); + } + + return $this->equals($that) ? $this : $this->registry->createUnionType(array($this, $that)); + } + + /** + * Returns the greatest subtype of this, and the passed type. + * + * The greatest subtype is also known as the infimum, or meet, or greatest lower bound. + * + * Examples: + * + * Integer ^ All = Integer + * Integer ^ Object = None + * Object ^ Object = Object + * + * @param PhpType $that + * @return PhpType + */ + public function getGreatestSubtype(PhpType $that) + { + if ($this->equals($that)) { + return $this; + } + + if ($this->isUnknownType() || $that->isUnknownType()) { + return $this->registry->getNativeType('unknown'); + } + + if ($this->isSubtypeOf($that)) { + return $this; + } + + if ($that->isSubtypeOf($this)) { + return $that; + } + + if ($this->isUnionType()) { + return $this->meet($that); + } + + if ($that->isUnionType()) { + return $that->meet($this); + } + + return $this->registry->getNativeType(TypeRegistry::NATIVE_NONE); + } + + /** + * Emulates a loose comparison between two types, and returns the result. + * + * The result can be true, false, or unknown: + * + * - true: loose comparison of these types is always true + * - false: loose comparison of these types is always false + * - unknown: outcome depends on the actual values of these types + * + * @see http://php.net/manual/en/types.comparisons.php (table with loose comparison ==) + * + * @param PhpType $thisType + * @param PhpType $thatType + */ + public function testForEquality(PhpType $that) + { + if ($that->isAllType() || $that->isUnknownType() || $that->isNoResolvedType() + || $this->isAllType() || $this->isUnknownType() || $this->isNoResolvedType()) { + return TernaryValue::get('unknown'); + } + + if ($this->isNoType() || $that->isNoType()) { + if ($this->isNoType() && $that->isNoType()) { + return TernaryValue::get('true'); + } + + return TernaryValue::get('unknown'); + } + + $isThisNumeric = $this->isIntegerType() || $this->isDoubleType(); + $isThatNumeric = $that->isIntegerType() || $that->isDoubleType(); + + if ((($isThisNumeric || $this->isStringType()) && $that->isArrayType()) + || (($isThatNumeric || $that->isStringType()) && $this->isArrayType())) { + return TernaryValue::get('false'); + } + + if ($this->isObjectType() ^ $that->isObjectType()) { + return TernaryValue::get('false'); + } + + if ($that->isUnionType()) { + return $that->testForEquality($this); + } + + if ($this->isArrayType() && $that->isArrayType()) { + // TODO: Maybe make this more sophisticated by looking at the key, + // and element types. + return TernaryValue::get('unknown'); + } + + // If this is reached, then this base type does not have enough information to + // make an informed decision, but the method should be overridden by a subtype + // as this method eventually is never allowed to return null. + return null; + } + + public function canTestForEqualityWith(PhpType $that) + { + return $this->testForEquality($that) === TernaryValue::get('unknown'); + } + + public function canTestForShallowEqualityWith(PhpType $that) + { + return $this->isSubTypeOf($that) || $that->isSubTypeOf($this); + } + + public function isNullable() + { + return $this->isSubTypeOf($this->registry->getNativeType('null')); + } + + public function isTraversable() + { + return false; + } + + /** + * Returns the doc type string. + * + * @param array $importedNamespaces a map of alias to imported namespace + * + * @return string + */ + public function getDocType(array $importedNamespaces = array()) + { + return $this->getDisplayName(); + } + + /** + * Computes the restricted type knowing the outcome of a boolean comparison. + * + * @param boolean $outcome + * + * @return PhpType the restricted type, or the None Type if the underlying type could + * not have yielded this ToBoolean value + * + * TODO: This should probably be moved to the SemanticReverseAbstractInterpreter. + */ + public function getRestrictedTypeGivenToBooleanOutcome($outcome) + { + if (in_array($outcome, $this->getPossibleOutcomesComparedToBoolean(), true)) { + return $this; + } + + return $this->registry->getNativeType(TypeRegistry::NATIVE_NONE); + } + + /** + * The possible outcomes when this type is used in a boolean comparison. + * + * @return boolean[] + */ + public function getPossibleOutcomesComparedToBoolean() + { + return array(); + } + + /** + * Computes the testricted types given a successful equality comparison. + * + * @return PhpType[] The first element is the restricted this type, the second element is the restricted type of the + * passed type. + */ + public function getTypesUnderEquality(PhpType $that) + { + // unions types + if ($that->isUnionType()) { + $p = $that->toMaybeUnionType()->getTypesUnderEquality($this); + + return array($p[1], $p[0]); + } + + $rs = $this->testForEquality($that); + if (null === $rs) { + throw new \RuntimeException(sprintf('The testForEquality method should have been overridden by either the '.$this.' type, or '.$that.' type.')); + } + + // other types + switch ($rs->toBoolean(true)) { + case false: + return array(null, null); + + case true: + return array($this, $that); + + default: + throw new \RuntimeException('testForEquality() returned an invalid value.'); + } + } + + /** + * Computes the restricted types given a non-successful equality comparison. + * + * @return PhpType[] The first element is the restricted this type, the second element is the restricted type of the + * passed type. + */ + public function getTypesUnderInequality(PhpType $that) + { + // unions types + if ($that->isUnionType()) { + $p = $that->toMaybeUnionType()->getTypesUnderInequality($this); + + return array($p[1], $p[0]); + } + + $rs = $this->testForEquality($that); + if (null === $rs) { + throw new \RuntimeException(sprintf('The testForEquality method should have been overridden by either the '.$this.' type, or '.$that.' type.')); + } + + switch ($rs->toBoolean(false)) { + case true: + return array(null, null); + + case false: + return array($this, $that); + + default: + throw new \RuntimeException('testForEquality() returned an invalid value.'); + } + } + + /** + * Computes the restricted types given a successful shallow equality comparison. + * + * @return PhpType[] The first element is the restricted this type, the second element is the restricted type of the + * passed type. + */ + public function getTypesUnderShallowEquality(PhpType $that) + { + $commonType = $this->getGreatestSubType($that); + + return array($commonType, $commonType); + } + + /** + * Computes the restricted types given a non-successful shallow equality comparison. + * + * @return PhpType[] The first element is the restricted this type, the second element is the restricted type of the + * passed type. + */ + public function getTypesUnderShallowInequality(PhpType $that) + { + // union types + if ($that->isUnionType()) { + $p = $that->toMaybeUnionType()->getTypesUnderShallowInequality($this); + + return array($p[1], $p[0]); + } + + // Other types. + // There are only two types whose shallow inequality is deterministically + // true -- null and false. We can just enumerate them. Should we ever add + // a true type, this needs to be added here as well. + if ($this->isNullType() && $that->isNullType()) { + return array(null, null); + } + + if ($this->isFalse() && $that->isFalse()) { + return array(null, null); + } + + return array($this, $that); + } + + /** + * Checks if two types are equivalent. + * + * @param PhpType $type + * @return boolean + */ + public function equals(PhpType $type) + { + return $type instanceof static; + } + + /** + * Returns whether the passed type is meaningfully different from this type. + * + * In contrast to ``equals()``, this method treats unknown types specially. + * + * If no unknown type is involved, then the result of this method is the opposite + * boolean result of ``equals()``. + * + * If unknown types are involved, we regard the types as different if only one + * of the involved types is an unknown type. + * + * TODO: Since the difference between known unknowns (aka checked unknowns), + * and unknown unknowns has been removed. This method should be superfluous. + * + * @see http://www.youtube.com/watch?v=QaxqUDd4fiw&feature=related + */ + public function differsFrom(PhpType $that) + { + if ( ! $this->isUnknownType() && ! $that->isUnknownType()) { + return ! $this->equals($that); + } + + return (boolean) ($this->isUnknownType() ^ $that->isUnknownType()); + } + + public function restrictByNotNull() + { + return $this; + } + + public function __toString() + { + return $this->getDisplayName(); + } + + abstract public function visit(VisitorInterface $visitor); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ProxyObjectType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ProxyObjectType.php new file mode 100644 index 0000000..7f55fca --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ProxyObjectType.php @@ -0,0 +1,265 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +abstract class ProxyObjectType extends ObjectType +{ + private $referencedType; + + /** + * Constructor. + * + * @param TypeRegistry $registry + * @param string $reference String Reference to the non-resolved type + */ + public function __construct(TypeRegistry $registry, PhpType $referencedType = null) + { + parent::__construct($registry); + + $this->referencedType = $referencedType ?: $registry->getNativeType('object'); + } + + abstract public function getReferenceName(); + + public function getDocType(array $importedNamespaces = array()) + { + return self::getShortestClassNameReference($this->getReferenceName(), $importedNamespaces); + } + + /** + * Returns the referenced type. + * + * When it has not yet been resolved this will return the UNKNOWN type. + * + * @return PhpType + */ + public function getReferencedType() + { + return $this->referencedType; + } + + public function setReferencedType(PhpType $type) + { + if ( ! $type->isObjectType()) { + throw new \LogicException(sprintf('The referenced type must be an Object type, but got "%s".', $type)); + } + if ( ! $this->isNoResolvedType()) { + throw new \LogicException(sprintf('The referenced type "%s" is already resolved, cannot re-resolve to "%s".', $this->referencedType, $type)); + } + + $this->referencedType = $type->addAttributes($this->getAttributes()); + } + + public function addAttribute($key, $value) + { + if ($this->isNoResolvedType()) { + return parent::addAttribute($key, $value); + } + + $this->referencedType = $this->referencedType->addAttribute($key, $value); + + return $this; + } + + public function addAttributes(array $kvMap) + { + if ($this->isNoResolvedType()) { + return parent::addAttributes($kvMap); + } + + $this->referencedType = $this->referencedType->addAttributes($kvMap); + + return $this; + } + + public function removeAttribute($key) + { + if ($this->isNoResolvedType()) { + return parent::removeAttribute($key); + } + + $this->referencedType = $this->referencedType->removeAttribute($key); + + return $this; + } + + public function removeAttributes($kList) + { + if ($this->isNoResolvedType()) { + return parent::removeAttributes($kList); + } + + $this->referencedType = $this->referencedType->removeAttributes($kList); + + return $this; + } + + public function isObjectType() + { + return true; + } + + public function isInterface() + { + if ($this->isNoResolvedType()) { + return false; + } + + return $this->referencedType->isInterface(); + } + + public function isTrait() + { + if ($this->isNoResolvedType()) { + return false; + } + + return $this->referencedType->isTrait(); + } + + public function isClass() + { + if ($this->isNoResolvedType()) { + return false; + } + + return $this->referencedType->isClass(); + } + + /** + * Two proxy object types are equivalent if they reference the same object. + * + * Unfortunately, proxy types might not yet be resolved in which case we + * fallback to do a comparison on the basis of names only. + * + * In sane code, all classes should be defined, and thus be resolved after + * the initial type scanning pass. + * + * @return boolean + */ + public function equals(PhpType $that) + { + if ($this === $that) { + return true; + } + + if ( ! $this->isNoResolvedType()) { + return $this->referencedType->equals($that); + } + + if (null !== $objType = $that->toMaybeObjectType()) { + return strtolower($objType->getName()) === strtolower($this->getReferenceName()); + } + + if ($that instanceof ProxyObjectType) { + return strtolower($this->getReferenceName()) === strtolower($that->getReferenceName()); + } + + return false; + } + + public function matchesObjectContext() + { + return $this->referencedType->matchesObjectContext(); + } + + public function canBeCalled() + { + return $this->referencedType->canBeCalled(); + } + + public function isNullable() + { + return $this->referencedType->isNullable(); + } + + public function isTraversable() + { + return $this->referencedType->isTraversable(); + } + + public function toMaybeUnionType() + { + return $this->referencedType->toMaybeUnionType(); + } + + public function toMaybeObjectType() + { + return $this->referencedType->toMaybeObjectType(); + } + + public function toMaybeArrayType() + { + return $this->referencedType->toMaybeArrayType(); + } + + public function testForEquality(PhpType $that) + { + if ($this->isNoResolvedType() + && ($that->isObjectType() || $that->isNoObjectType())) { + return TernaryValue::get('unknown'); + } + + return $this->referencedType->testForEquality($that); + } + + public function isSubtypeOf(PhpType $that) + { + if (!$this->referencedType instanceof NoObjectType) { + return $this->referencedType->isSubTypeOf($that); + } + + if ($that instanceof NamedType) { + return strtolower($that->getReferenceName()) === strtolower($this->getReferenceName()); + } + + if ($objType = $that->toMaybeObjectType()) { + return strtolower($objType->getName()) === strtolower($this->getReferenceName()); + } + + if ($that->isNoObjectType() || $that->isUnknownType() || $that->isAllType() + || $that->isCallableType()) { + return true; + } + + if ($that->isUnionType()) { + foreach ($that->getAlternates() as $alternate) { + if ($this->isSubtypeOf($alternate)) { + return true; + } + } + } + + return false; + } + + public function canAssignTo(PhpType $that) + { + return $this->referencedType->canAssignTo($that); + } + + public function collapseUnion() + { + if ($this->referencedType instanceof UnionType) { + return $this->referencedType->collapseUnion(); + } + + return $this; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ResourceType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ResourceType.php new file mode 100644 index 0000000..e3313f1 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ResourceType.php @@ -0,0 +1,51 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class ResourceType extends PhpType +{ + public function testForEquality(PhpType $that) + { + if (null !== $rs = parent::testForEquality($that)) { + return $rs; + } + + if ($that->isObjectType() || $that->isNoObjectType() || $that->isArrayType() || $that->isNullType() + || $that->isCallableType()) { + return TernaryValue::get('false'); + } + + return TernaryValue::get('unknown'); + } + + public function isResourceType() + { + return true; + } + + public function getDisplayName() + { + return 'resource'; + } + + public function visit(VisitorInterface $visitor) + { + return $visitor->visitResourceType($this); + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/StringType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/StringType.php new file mode 100644 index 0000000..777ff15 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/StringType.php @@ -0,0 +1,72 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class StringType extends PhpType +{ + public function visit(VisitorInterface $v) + { + return $v->visitStringType(); + } + + public function isStringType() + { + return true; + } + + public function testForEquality(PhpType $that) + { + $rs = parent::testForEquality($that); + + if (null !== $rs) { + return $rs; + } + + if ($that->isUnknownType() + || $that->isResourceType() + || $that->isSubTypeOf($this->registry->getNativeType('object_number_string_boolean'))) { + return TernaryValue::get('unknown'); + } + + return TernaryValue::get('false'); + } + + public function isSubTypeOf(PhpType $type) + { + if (parent::isSubTypeOf($type)) { + return true; + } + + if ($type->isCallableType()) { + return true; + } + + return false; + } + + public function getDisplayName() + { + return 'string'; + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(true, false); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TernaryValue.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TernaryValue.php new file mode 100644 index 0000000..7683e58 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TernaryValue.php @@ -0,0 +1,139 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +/** + * A pseudo-enum class used in equality tests. + * + * @author Johannes M. Schmitt + */ +final class TernaryValue +{ + private static $instances = array(); + + private $type; + + public static function forBoolean($boolean) + { + return self::get($boolean ? 'true' : 'false'); + } + + public static function get($type) + { + if ('true' !== $type && 'false' !== $type && 'unknown' !== $type) { + throw new \InvalidArgumentException(sprintf('Invalid type "%s" passed.', $type)); + } + + if (isset(self::$instances[$type])) { + return self::$instances[$type]; + } + + return self::$instances[$type] = new self($type); + } + + private function __construct($type) + { + $this->type = $type; + } + + public function andOp(TernaryValue $that) + { + switch ($this->type) { + case 'false': + return $this; + + case 'true': + return $that; + + case 'unknown': + return self::get(self::get('false') === $that ? 'false' : 'unknown'); + } + + throw new \InvalidArgumentException('switch() is exhaustive.'); + } + + public function notOp(TernaryValue $that) + { + switch ($this->type) { + case 'false': + return self::get('true'); + + case 'true': + return self::get('false'); + + case 'unknown': + return $this; + } + + throw new \InvalidArgumentException('switch() is exhaustive.'); + } + + public function orOp(TernaryValue $that) + { + switch ($this->type) { + case 'false': + return $that; + + case 'true': + return $this; + + case 'unknown': + return self::get(self::get('true') === $that ? 'true' : 'unknown'); + } + + throw new \InvalidArgumentException('switch() is exhaustive.'); + } + + public function xorOp(TernaryValue $that) + { + switch ($this->type) { + case 'false': + return $that; + + case 'true': + return $that->notOp(); + + case 'unknown': + return $this; + } + + throw new \InvalidArgumentException('switch() is exhaustive.'); + } + + public function __toString() + { + return $this->type; + } + + public function toBoolean($booleanForUnknown) + { + switch ($this->type) { + case 'false': + return false; + + case 'true': + return true; + + case 'unknown': + return $booleanForUnknown; + } + + throw new \InvalidArgumentException('switch() is exhaustive.'); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ThisType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ThisType.php new file mode 100644 index 0000000..c32ce21 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/ThisType.php @@ -0,0 +1,68 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; + +/** + * Represents a late binding type that is resolved to the objects thisType in + * the context that it is being used in. + * + * @author Johannes M. Schmitt + */ +class ThisType extends ProxyObjectType +{ + /** + * Constructor. + * + * In contrast to the parent constructor, we force the type to be an object here. + * + * @param TypeRegistry $registry + * @param ObjectType $creationContext + */ + public function __construct(TypeRegistry $registry, ObjectType $creationContext) + { + parent::__construct($registry, $creationContext); + } + + public function getReferenceName() + { + $type = $this->getReferencedType(); + + if ($type instanceof ProxyObjectType) { + return $type->getReferenceName(); + } + + if ($type instanceof MethodContainer) { + return $type->getName(); + } + + throw new \LogicException(sprintf('Unsupported this type context "%s".', get_class($type))); + } + + public function getDisplayName() + { + return 'object<'.$this->getReferenceName().'>'; + } + + public function __toString() + { + return 'this<'.$this->getReferenceName().'>'; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeChecker.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeChecker.php new file mode 100644 index 0000000..e0f2e2d --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeChecker.php @@ -0,0 +1,139 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +/** + * Performs type-related checks. + * + * @author Johannes M. Schmitt + */ +final class TypeChecker +{ + const LEVEL_STRICT = 'strict'; + const LEVEL_LENIENT = 'lenient'; + + private $typeRegistry; + private $level; + + public function __construct(TypeRegistry $registry, $level = self::LEVEL_LENIENT) + { + $this->typeRegistry = $registry; + $this->level = $level; + } + + public function setLevel($level) + { + $this->level = $level; + } + + /** + * Returns whether the given type may be passed for the given expected type. + * + * @param PhpType $expectedType + * @param PhpType $actualType + * + * @return boolean + */ + public function mayBePassed(PhpType $expectedType, PhpType $actualType) + { + // This effectively disables all type checks for mock objects. + // TODO: Remove this once we have support for parameterized types, and + // anonymous classes. + if ((null !== $objType = $actualType->toMaybeObjectType()) + && $objType->getName() === 'PHPUnit_Framework_MockObject_MockObject') { + return true; + } + if ($actualType instanceof ProxyObjectType + && $actualType->getReferenceName() === 'PHPUnit_Framework_MockObject_MockObject') { + return true; + } + + // If the actual type is not yet resolved, then we need to let it go through + // in favor of avoiding false positives. This indicates a non-existent class, + // but that is handled in a different pass. + if ($actualType->isNoResolvedType()) { + return true; + } + + if ($expectedType->isCallableType()) { + return $actualType->canBeCalled(); + } + + // Allow an object that is implementing __toString to be passed where a + // string is expected. This should work in most cases unless users perform + // some sort of is_??? check, but then they probably also expect non strings. + if ($expectedType->isStringType() + && (null !== $objType = $actualType->toMaybeObjectType()) + && $objType->hasMethod('__toString')) { + return true; + } + + if ($actualType->isSubtypeOf($expectedType)) { + return true; + } + + // If we are in strict mode, it's already over here. + if (self::LEVEL_LENIENT !== $this->level) { + return false; + } + + // If the actual type is an all-type, we will not make any fuzz in lenient mode. Simply, because there are a lot + // of cases where "all" should really rather mean "unknown" type. + if ($actualType->isAllType()) { + return true; + } + + switch (true) { + case $expectedType->isArrayType(): + // If the generic array type is passed in places where a more specific + // array type is required, we will let this go through in lenient mode. + if ($actualType === $this->typeRegistry->getNativeType('array')) { + return true; + } + + if ( ! $actualType->isArrayType()) { + return false; + } + + return $this->mayBePassed($expectedType->getElementType(), $actualType->getElementType()); + + case $expectedType->isDoubleType(): + case $expectedType->isStringType(): + case $expectedType->isIntegerType(): + $actualType = $actualType->restrictByNotNull(); + + return $actualType->isSubTypeOf($this->typeRegistry->createUnionType(array('string', 'integer', 'double'))); + + // For unions we let the check pass if the actual type may be passed for any + // of the union's alternates. + case $expectedType->isUnionType(): + assert($expectedType instanceof UnionType); + foreach ($expectedType->getAlternates() as $alt) { + if ($this->mayBePassed($alt, $actualType)) { + return true; + } + } + + return false; + + default: + return false; + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeLexer.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeLexer.php new file mode 100644 index 0000000..a843396 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeLexer.php @@ -0,0 +1,136 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +/** + * Type Lexer. + * + * The grammar has become unnecessary complex over time, if we ever should find + * time, we can try to come up with a new way to define types with more elaborate + * metadata. However, that would cause a major BC break, and updates in many places. + * + * @author Johannes M. Schmitt + */ +class TypeLexer extends \JMS\Parser\AbstractLexer +{ + const T_UNKNOWN = 0; + const T_STRING = 1; + const T_TYPENAME = 2; + const T_TRUE = 3; + const T_FALSE = 4; + const T_NULL = 5; + const T_INTEGER = 6; + const T_TYPE = 7; + + const T_OPEN_BRACKET = 100; // [ + const T_CLOSE_BRACKET = 101; // ] + const T_OPEN_BRACE = 102; // { + const T_CLOSE_BRACE = 103; // } + const T_COMMA = 104; + const T_ALTERNATE = 105; // | + const T_COLON = 106; + const T_OPEN_ANGLE_BRACKET = 107; // < + const T_CLOSE_ANGLE_BRACKET = 108; // > + const T_OPEN_PARENTHESIS = 109; // ( + const T_CLOSE_PARENTHESIS = 110; // ) + + protected function getRegex() + { + return '/ + # JSON strings (\ is not allowed as last character in a string) + ("(?:[^"]|(?<=\\\\)")*") + + # Integers + | ([0-9]+) + + # Class Names & Type Names (unfortunately we have no way to distinguish them) + | ((?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\\\\)*[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*) + + # Ignore Whitespace + | \s+ + + # Terminals like |[]{},: + | (.) + /x'; + } + + protected function determineTypeAndValue($value) + { + if ('[' === $value) { + return array(self::T_OPEN_BRACKET, $value); + } + if (']' === $value) { + return array(self::T_CLOSE_BRACKET, $value); + } + if ('{' === $value) { + return array(self::T_OPEN_BRACE, $value); + } + if ('}' === $value) { + return array(self::T_CLOSE_BRACE, $value); + } + if (',' === $value) { + return array(self::T_COMMA, $value); + } + if (':' === $value) { + return array(self::T_COLON, $value); + } + if ('|' === $value) { + return array(self::T_ALTERNATE, $value); + } + if ('<' === $value) { + return array(self::T_OPEN_ANGLE_BRACKET, $value); + } + if ('>' === $value) { + return array(self::T_CLOSE_ANGLE_BRACKET, $value); + } + if ('(' === $value) { + return array(self::T_OPEN_PARENTHESIS, '('); + } + if (')' === $value) { + return array(self::T_CLOSE_PARENTHESIS, ')'); + } + + if ('"' === $value[0]) { + return array(self::T_STRING, substr($value, 1, -1)); + } + + if ('false' === $value) { + return array(self::T_FALSE, $value); + } + if ('true' === $value) { + return array(self::T_TRUE, $value); + } + if ('null' === $value) { + return array(self::T_NULL, $value); + } + if ('type' === $value) { + return array(self::T_TYPE, 'type'); + } + + if (is_numeric($value)) { + return array(self::T_INTEGER, (integer) $value); + } + + if (preg_match('/^(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\\\\)*[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $value)) { + return array(self::T_TYPENAME, $value); + } + + return array(self::T_UNKNOWN, $value); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeParser.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeParser.php new file mode 100644 index 0000000..b10f5a5 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeParser.php @@ -0,0 +1,313 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class TypeParser extends \JMS\Parser\AbstractParser +{ + private static $typeNameTypes = array(TypeLexer::T_TYPENAME, TypeLexer::T_FALSE, TypeLexer::T_NULL); + + /** @var TypeRegistry */ + private $registry; + private $lookupMode = TypeRegistry::LOOKUP_BOTH; + + public function __construct(TypeRegistry $registry) + { + parent::__construct(new TypeLexer()); + + $this->registry = $registry; + } + + public function parseType($typeInput, $lookupMode) + { + $this->lookupMode = $lookupMode; + + return $this->parse($typeInput); + } + + /** + * TypeConstruct :== Type ("|" Type)* + */ + protected function parseInternal() + { + $types = array(); + + while (true) { + $types[] = $this->Type(); + + if ($this->lexer->isNext(TypeLexer::T_ALTERNATE)) { + $this->lexer->moveNext(); + + continue; + } + + break; + } + + return $this->registry->createUnionType($types); + } + + private function createType($name, array $parameters, array $attributes) + { + switch ($name) { + case 'array': + switch (count($parameters)) { + case 0: + return $this->registry->getNativeType('array')->addAttributes($attributes); + + case 1: + return $this->registry->getArrayType($parameters[0], $this->registry->getNativeType('integer'))->addAttributes($attributes); + + case 2: + return $this->registry->getArrayType($parameters[1], $parameters[0])->addAttributes($attributes); + + case 3: + return $this->registry->getArrayType($parameters[1], $parameters[0], $parameters[2])->addAttributes($attributes); + + default: + throw new \RuntimeException(sprintf('Arrays cannot have more than 3 parameters.')); + } + + case 'object': + switch (count($parameters)) { + case 0: + return $this->registry->getNativeType('object')->addAttributes($attributes); + + case 1: + return $this->registry->getClassOrCreate($parameters[0], $this->lookupMode)->addAttributes($attributes); + + default: + throw new \RuntimeException('"object" types expect zero, or one parameter.'); + } + + case 'this': + if (1 !== count($parameters)) { + throw new \RuntimeException('"this" types expect exactly one parameter.'); + } + + $class = $this->registry->getClassOrCreate($parameters[0], $this->lookupMode); + + return (new ThisType($this->registry, $class))->addAttributes($attributes); + + default: + if ( ! empty($parameters)) { + throw new \RuntimeException(sprintf('The type "%s" cannot have any parameters.', $name)); + } + + if (null === $nativeType = $this->registry->getNativeType($name)) { + throw new \RuntimeException(sprintf('There is no native type named "%s".', $name)); + } + + return $nativeType->addAttributes($attributes); + } + } + + /** + * Type :== TypeName [ Parameters ] [ Attributes ] + * Attributes :== JsonObject + * TypeName :== T_TYPENAME | T_FALSE | T_NULL + */ + private function Type() + { + $typeName = $this->matchAny(self::$typeNameTypes); + + $parameters = array(); + if ($this->lexer->isNext(TypeLexer::T_OPEN_ANGLE_BRACKET)) { + $parameters = $this->Parameters($typeName); + } + + $attributes = array(); + if ($this->lexer->isNext(TypeLexer::T_OPEN_BRACE)) { + $attributes = $this->JsonObject(); + } + + return $this->createType($typeName, $parameters, $attributes); + } + + /** + * Parameters :== "<" ParameterValue ("," ParameterValue)* ">" + * + * @param string $typeName + */ + private function Parameters($typeName) + { + $parameters = array(); + + $this->match(TypeLexer::T_OPEN_ANGLE_BRACKET); + while (true) { + $parameters[] = $this->ParameterValue($typeName); + + if ($this->lexer->isNext(TypeLexer::T_COMMA)) { + $this->lexer->moveNext(); + + continue; + } + + break; + } + $this->match(TypeLexer::T_CLOSE_ANGLE_BRACKET); + + return $parameters; + } + + /** + * ParameterValue :== ( TypeConstruct | JsonObject ) + * + * @param string $typeName + */ + private function ParameterValue($typeName) + { + if ($this->lexer->isNext(TypeLexer::T_OPEN_BRACE)) { + return $this->JsonObject(); + } + if ($this->lexer->isNextAny(self::$typeNameTypes)) { + // Unfortunately, the grammar was not really well defined in the first + // implementation. Now, we need to make this quick fix for object types :( + // Basically, we have no way to distinguish a class name from a type name + // without knowing the context in which it is used. For namespaced classes, + // classes with underscores, or upper case characters, we could, but that + // would not include all valid PHP names. Thus, making the parser context + // aware here, seems like the better solution. + if ('object' === $typeName || 'this' === $typeName) { + return $this->matchAny(self::$typeNameTypes); + } + + return $this->parseInternal(); + } + + // This will throw an exception. + $this->matchAny(array_merge(self::$typeNameTypes, array(TypeLexer::T_OPEN_BRACE))); + } + + /** + * JsonObject :== "{" [ JsonKeyValuePairs ] "}" + * JsonKeyValuePairs :== JsonKey ":" JsonValue ("," JsonKey ":" JsonValue)* + * JsonKey :== T_STRING | T_INTEGER + */ + private function JsonObject() + { + $this->match(TypeLexer::T_OPEN_BRACE); + + if ($this->lexer->isNext(TypeLexer::T_CLOSE_BRACE)) { + $this->lexer->moveNext(); + + return array(); + } + + $values = array(); + while (true) { + $key = $this->matchAny(array(TypeLexer::T_STRING, TypeLexer::T_INTEGER)); + $this->match(TypeLexer::T_COLON); + $values[$key] = $this->JsonValue(); + + if ($this->lexer->isNext(TypeLexer::T_COMMA)) { + $this->lexer->moveNext(); + + continue; + } + + break; + } + $this->match(TypeLexer::T_CLOSE_BRACE); + + return $values; + } + + /** + * JsonValue :== JsonObject | JsonArray | JsonPrimitive | JsonType + * JsonType :== T_TYPE "(" Type ")" + * JsonPrimitive :== T_STRING | T_INTEGER | T_TRUE | T_FALSE | T_NULL + */ + private function JsonValue() + { + if ($this->lexer->isNext(TypeLexer::T_OPEN_BRACE)) { + return $this->JsonObject(); + } + + if ($this->lexer->isNext(TypeLexer::T_OPEN_BRACKET)) { + return $this->JsonArray(); + } + + if ($this->lexer->isNext(TypeLexer::T_TRUE)) { + $this->lexer->moveNext(); + + return true; + } + + if ($this->lexer->isNext(TypeLexer::T_FALSE)) { + $this->lexer->moveNext(); + + return false; + } + + if ($this->lexer->isNext(TypeLexer::T_NULL)) { + $this->lexer->moveNext(); + + return null; + } + + if ($this->lexer->isNext(TypeLexer::T_STRING)) { + return $this->match(TypeLexer::T_STRING); + } + + if ($this->lexer->isNext(TypeLexer::T_TYPE)) { + $this->lexer->moveNext(); + $this->match(TypeLexer::T_OPEN_PARENTHESIS); + $type = $this->parseInternal(); + $this->match(TypeLexer::T_CLOSE_PARENTHESIS); + + return $type; + } + + // Theoretically, we could just match against an integer here, but in case of + // an error matching against all the types from above produces a better error + // message, and the overhead is minimal, so no reason to not do it. + return $this->matchAny(array(TypeLexer::T_INTEGER, TypeLexer::T_OPEN_BRACE, TypeLexer::T_OPEN_BRACKET, + TypeLexer::T_TRUE, TypeLexer::T_FALSE, TypeLexer::T_NULL, TypeLexer::T_STRING, TypeLexer::T_TYPENAME)); + } + + /** + * JsonArray :== "[" [ JsonValue ("," JsonValue)* ] "]" + */ + private function JsonArray() + { + $this->match(TypeLexer::T_OPEN_BRACKET); + + if ($this->lexer->isNext(TypeLexer::T_CLOSE_BRACKET)) { + $this->lexer->moveNext(); + + return array(); + } + + $array = array(); + while (true) { + $array[] = $this->JsonValue(); + + if ($this->lexer->isNext(TypeLexer::T_COMMA)) { + $this->lexer->moveNext(); + + continue; + } + + break; + } + $this->match(TypeLexer::T_CLOSE_BRACKET); + + return $array; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeProviderInterface.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeProviderInterface.php new file mode 100644 index 0000000..eccecba --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeProviderInterface.php @@ -0,0 +1,76 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\GlobalConstant; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\InterfaceC; +use Scrutinizer\PhpAnalyzer\Model\TraitC; + +/** + * Interface for Type Providers. + * + * @author Johannes + */ +interface TypeProviderInterface +{ + /** + * Batch loads the passed classes. + * + * If a class is not available, it simply is omitted from the resulting + * array. + * + * @param array $names + * @return array the keys must be the input names (case must be preserved) + */ + function loadClasses(array $names); + + /** + * Returns a class, or null. + * + * @param string $name + * @return Clazz|InterfaceC|TraitC|null + */ + function loadClass($name); + + /** + * Returns a function, or null. + * + * @param string $name + * @return GlobalFunction + */ + function loadFunction($name); + + /** + * Returns a constant, or null. + * + * @param string $name + * @return GlobalConstant + */ + function loadConstant($name); + + /** + * Returns all classes that implement the given interface. + * + * @param string $name + * @return array + */ + function getImplementingClasses($name); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php new file mode 100644 index 0000000..420121a --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php @@ -0,0 +1,804 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\Model\GlobalConstant; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\InterfaceC; +use Scrutinizer\PhpAnalyzer\Model\MethodContainer; + +class TypeRegistry +{ + private static $allTypes = array('object', 'integer', 'double', 'string', 'null', 'array', 'boolean', 'resource'); + + const NATIVE_UNKNOWN = 'unknown'; + const NATIVE_UNKNOWN_CHECKED = 'unknown_checked'; + const NATIVE_ALL = 'all'; + + const NATIVE_BOOLEAN = 'boolean'; + const NATIVE_BOOLEAN_FALSE = 'false'; + const NATIVE_DOUBLE = 'double'; + const NATIVE_INTEGER = 'integer'; + const NATIVE_NONE = 'none'; + const NATIVE_NULL = 'null'; + const NATIVE_STRING = 'string'; + const NATIVE_ARRAY = 'array'; // The element type is the UNKNOWN type. + const NATIVE_OBJECT = 'object'; + const NATIVE_CALLABLE = 'callable'; + const NATIVE_RESOURCE = 'resource'; + + /** Composites */ + const NATIVE_OBJECT_NUMBER_STRING_BOOLEAN = 'object_number_string_boolean'; + const NATIVE_NUMBER = 'number'; + const NATIVE_NUMERIC = 'numeric'; + const NATIVE_SCALAR = 'scalar'; + const NATIVE_GENERIC_ARRAY_KEY = 'generic_array_key'; + const NATIVE_GENERIC_ARRAY_VALUE = 'generic_array_value'; + + const LOOKUP_NO_CACHE = 1; + const LOOKUP_BOTH = 2; + const LOOKUP_CACHE_ONLY = 3; + + private $typeProvider; + private $typeParser; + + private $nativeTypes; + + /** + * Specialized array type. + * + * This is for more specialized array types where we know the type of the + * elements, or of the keys. + */ + private $arrayTypes = array(); + + /** + * Holds this types so that we do not need to create new objects for them. + * + * @var array + */ + private $thisTypes = array(); + + private $cachedClasses = array(); + private $cachedFunctions = array(); + private $cachedConstants = array(); + private $cachedImplementingClasses = array(); + + private $namedTypes = array(); + + private $classes = array(); + private $functions = array(); + private $constants = array(); + + private $cacheDisabled = false; + + /** + * Determines the lookup mode to use. + * + * This is mostly here for BC reasons. + * + * @param integer|boolean $mode + * @return integer + */ + private static function getLookupMode($mode) + { + if (false === $mode) { + return self::LOOKUP_NO_CACHE; + } + + if (true === $mode) { + return self::LOOKUP_BOTH; + } + + return $mode; + } + + public function __construct(TypeProviderInterface $provider = null) + { + $this->typeProvider = $provider ?: new NullTypeProvider(); + $this->typeParser = new TypeParser($this); + + $this->nativeTypes = array( + self::NATIVE_UNKNOWN => new UnknownType($this, false), + self::NATIVE_UNKNOWN_CHECKED => new UnknownType($this, true), + self::NATIVE_ALL => new AllType($this), + self::NATIVE_BOOLEAN => new BooleanType($this), + self::NATIVE_BOOLEAN_FALSE => new FalseType($this), + self::NATIVE_DOUBLE => new DoubleType($this), + self::NATIVE_INTEGER => new IntegerType($this), + self::NATIVE_NONE => new NoType($this), + self::NATIVE_NULL => new NullType($this), + self::NATIVE_STRING => new StringType($this), + self::NATIVE_OBJECT => new NoObjectType($this), + self::NATIVE_CALLABLE => new CallableType($this), + self::NATIVE_RESOURCE => new ResourceType($this), + ); + + // This needs to be separate since it creates a union of integer|string for the + // key type. Both of these types are otherwise not available. + $this->nativeTypes[self::NATIVE_GENERIC_ARRAY_KEY] = $this->createUnionType(array('integer', 'string')); + $this->nativeTypes[self::NATIVE_GENERIC_ARRAY_VALUE] = new UnknownType($this); + $this->nativeTypes[self::NATIVE_ARRAY] = new ArrayType($this); + + // create composite types (needs to be separate from the map above) + $this->nativeTypes = array_merge($this->nativeTypes, array( + self::NATIVE_OBJECT_NUMBER_STRING_BOOLEAN => $this->createUnionType(array('object', 'double', 'integer', 'string', 'boolean')), + self::NATIVE_NUMBER => $this->createUnionType(array('integer', 'double')), + self::NATIVE_NUMERIC => $this->createUnionType(array('integer', 'double', 'string')), + self::NATIVE_SCALAR => $this->createUnionType(array('integer', 'double', 'string', 'boolean')), + )); + } + + /** + * Disables the cache. + * + * This prevents the registry from loading anything from the type provider, + * but will instead force it to generate placeholders where possible. + * + * @param boolean $bool + */ + public function setCacheDisabled($bool) + { + $this->cacheDisabled = (boolean) $bool; + } + + public function setRootPackageVersion(\Scrutinizer\PhpAnalyzer\Model\PackageVersion $packageVersion) + { + $versions = array($packageVersion); + + $addDeps = function(\Scrutinizer\PhpAnalyzer\Model\PackageVersion $v) use (&$versions, &$addDeps) { + foreach ($v->getDependencies() as $dep) { + if (in_array($dep, $versions, true)) { + continue; + } + + $versions[] = $dep; + $addDeps($dep); + } + }; + $addDeps($packageVersion); + + $this->setPackageVersions($versions); + } + + public function setPackageVersions(array $packageVersions) + { + if (!$this->typeProvider instanceof PackageAwareTypeProviderInterface) { + return; + } + + // TODO: Clear cached classes/functions/constants. Right now, we consider + // the registry to not be re-usable. + $this->typeProvider->setPackageVersions($packageVersions); + } + + public function getTypeProvider() + { + return $this->typeProvider; + } + + public function registerClass(MethodContainer $class) + { + $class->setTypeRegistry($this); + $this->classes[strtolower($class->getName())] = $class; + } + + public function registerConstant(GlobalConstant $constant) + { + $this->constants[$constant->getName()] = $constant; + } + + public function hasConstant($name, $cacheLookup = true) + { + return null !== $this->getConstant($name, $cacheLookup); + } + + public function getConstant($name, $cacheLookup = true) + { + if (isset($this->constants[$name])) { + return $this->constants[$name]; + } + + if (!$cacheLookup) { + return null; + } + + if (isset($this->cachedConstants[$name])) { + if (false === $this->cachedConstants[$name]) { + return null; + } + + return $this->cachedConstants[$name]; + } + + if ($this->cacheDisabled) { + return null; + } + + $this->tryLoadingConstant($name); + + return false === $this->cachedConstants[$name] ? null : $this->cachedConstants[$name]; + } + + public function getConstants() + { + return $this->constants; + } + + public function registerFunction(GlobalFunction $function) + { + $this->functions[strtolower($function->getName())] = $function; + } + + public function hasFunction($name, $cacheLookup = true) + { + return null !== $this->getFunction($name, $cacheLookup); + } + + /** + * Returns an array of classes that implement the given interface. + * + * @param string|InterfaceC $name + * + * @return array + */ + public function getImplementingClasses($interfaceOrName) + { + $name = $interfaceOrName instanceof \Scrutinizer\PhpAnalyzer\Model\InterfaceC + ? $interfaceOrName->getName() : $interfaceOrName; + + if ( ! isset($this->cachedImplementingClasses[$name])) { + + + $this->cachedImplementingClasses[$name] = array_merge( + $this->findImplementingClasses($name), + $this->typeProvider->getImplementingClasses($name)); + $this->resolveNamedTypes(); + } + + return $this->cachedImplementingClasses[$name]; + } + + /** + * @param \PHPParser_Node_Stmt_Function|\PHPParser_Node_Stmt_ClassMethod $node + * @param integer $lookupMode + * @return GlobalFunction|null + */ + public function getFunctionByNode(\PHPParser_Node $node, $lookupMode = self::LOOKUP_BOTH) + { + if ($node instanceof \PHPParser_Node_Stmt_Function) { + return $this->getFunction(implode("\\", $node->namespacedName->parts), $lookupMode); + } else if ($node instanceof \PHPParser_Node_Stmt_ClassMethod) { + $classNode = $node->getAttribute('parent')->getAttribute('parent'); + $class = $this->getClassByNode($classNode, $lookupMode); + $method = $class->getMethod($node->name); + + return $method; + } + + throw new \LogicException('The previous ifs were exhaustive.'); + } + + /** + * @param string $name + * @param integer $lookupMode + * @return GlobalFunction|null + */ + public function getFunction($name, $lookupMode = self::LOOKUP_BOTH) + { + $name = strtolower($name); + $lookupMode = self::getLookupMode($lookupMode); + + // PHP does check for the function name in the global namespace if the + // namespaced function is not available. This emulates this behavior. + $globalFunction = (false !== $pos = strrpos($name, '\\')) ? substr($name, $pos + 1) : null; + + if (self::LOOKUP_CACHE_ONLY !== $lookupMode && isset($this->functions[$name])) { + return $this->functions[$name]; + } + + if (self::LOOKUP_NO_CACHE === $lookupMode) { + if ($globalFunction) { + return $this->getFunction($globalFunction, $lookupMode); + } + + return null; + } + + if (isset($this->cachedFunctions[$name])) { + if (false === $this->cachedFunctions[$name]) { + if ($globalFunction) { + return $this->getFunction($globalFunction, $lookupMode); + } + + return null; + } + + return $this->cachedFunctions[$name]; + } + + if ($this->cacheDisabled) { + return null; + } + + $this->tryLoadingFunction($name); + if (false === $this->cachedFunctions[$name]) { + if ($globalFunction) { + return $this->getFunction($globalFunction, $lookupMode); + } + + return null; + } + + return $this->cachedFunctions[$name]; + } + + public function getFunctions() + { + return $this->functions; + } + + /** + * Returns an ARRAY type with the given element/key type combination. + * + * This function caches created types, and does only create new instances + * when necessary. + * + * @param PhpType $elementType + * @param PhpType $keyType + * @param array $itemTypes + * + * @return ArrayType + */ + public function getArrayType(PhpType $elementType = null, PhpType $keyType = null, array $itemTypes = array()) + { + if (empty($itemTypes)) { + if (null === $elementType && null === $keyType) { + return $this->nativeTypes[self::NATIVE_ARRAY]; + } + + foreach ($this->arrayTypes as $type) { + if ($type->getElementType() === $elementType + && $type->getKeyType() === $keyType) { + return $type; + } + } + + return $this->arrayTypes[] = new ArrayType($this, $elementType, $keyType); + } + + // If we have item types, we do not safe the array type in the global array + // as we always have to create new instances anyway. + return new ArrayType($this, $elementType, $keyType, $itemTypes); + } + + public function getThisType(PhpType $objType) + { + switch (true) { + case $objType instanceof ProxyObjectType: + $className = $objType->getReferenceName(); + break; + + case $objType instanceof MethodContainer: + $className = $objType->getName(); + break; + + default: + throw new \LogicException(sprintf('The previous CASES were exhaustive. Unknown type "%s".', get_class($objType))); + } + + $loweredClassName = strtolower($className); + if ( ! isset($this->thisTypes[$loweredClassName])) { + $this->thisTypes[$loweredClassName] = new ThisType($this, $this->getClassOrCreate($className)); + } + + return $this->thisTypes[$loweredClassName]; + } + + public function createNullableType(PhpType $type) + { + return $this->createUnionType(array($type, $this->getNativeType('null'))); + } + + /** + * Creates a new union with the given types. + * + * If strings are passed, they are assummed to be native types. + * + * @param array $types + * + * @return UnionType + */ + public function createUnionType(array $types) + { + $builder = new UnionTypeBuilder($this); + foreach ($types as $type) { + if ( ! $type instanceof PhpType) { + $nativeType = $this->getNativeType($type); + + if (null === $nativeType) { + throw new \InvalidArgumentException(sprintf('There is no native type named "%s".', $type)); + } + + $type = $nativeType; + } + + assert($type instanceof PhpType); + + $builder->addAlternate($type); + } + + return $builder->build(); + } + + /** + * Creates a type which consists of all types except the ones that were + * specifically excluded. + * + * @param array $excludedTypes + * @throws \LogicException + * @return PhpType + */ + public function createAllTypeExcept(array $excludedTypes) + { + $allTypes = self::$allTypes; + foreach ($excludedTypes as $excludedType) { + if (false === $index = array_search($excludedType, $allTypes, true)) { + throw new \LogicException(sprintf('Could not find "%s" in all types.', $excludedType)); + } + + unset($allTypes[$index]); + } + + return $this->createUnionType($allTypes); + } + + /** + * Returns a simple, native type. + * + * @param string $name + * + * @return null|PhpType + */ + public function getNativeType($name) + { + return isset($this->nativeTypes[$name]) ? $this->nativeTypes[$name] : null; + } + + public function hasClass($name, $cacheLookup = true) + { + return null !== $this->getClass($name, $cacheLookup); + } + + public function getClassByNode(\PHPParser_Node $node, $lookupMode = self::LOOKUP_BOTH) + { + if (!$node instanceof \PHPParser_Node_Stmt_Class + && !$node instanceof \PHPParser_Node_Stmt_Interface + && !$node instanceof \PHPParser_Node_Stmt_Trait) { + throw new \InvalidArgumentException('The node class "'.get_class($node).'" is not permissible.'); + } + + return $this->getClass(implode("\\", $node->namespacedName->parts), $lookupMode); + } + + public function getFetchedPropertyByNode(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch: + if ((null === $type = $node->class->getAttribute('type')) + || ! is_string($node->name) + || (null === $objType = $type->toMaybeObjectType()) + || ( ! $objType->isClass() && ! $objType->isTrait()) + || ! $objType->hasProperty($node->name)) { + return null; + } + + return $objType->getProperty($node->name); + + case $node instanceof \PHPParser_Node_Expr_PropertyFetch: + if ((null === $type = $node->var->getAttribute('type')) + || ! is_string($node->name) + || (null === $objType = $type->toMaybeObjectType()) + || ( ! $objType->isClass() && ! $objType->isTrait()) + || ! $objType->hasProperty($node->name)) { + return null; + } + + return $objType->getProperty($node->name); + + default: + throw new \LogicException(sprintf('The node "%s" is not resolvable to a fetched property.', get_class($node))); + } + } + + /** + * @param \PHPParser_Node $node + * @param int $lookupMode + * + * @return \Scrutinizer\PhpAnalyzer\Model\GlobalFunction|\Scrutinizer\PhpAnalyzer\Model\ContainerMethodInterface|null + */ + public function getCalledFunctionByNode(\PHPParser_Node $node, $lookupMode = self::LOOKUP_BOTH) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_FuncCall: + if ( ! $node->name instanceof \PHPParser_Node_Name) { + return null; + } + + return $this->getFunction(implode("\\", $node->name->parts)); + + case $node instanceof \PHPParser_Node_Expr_MethodCall: + if ( ! is_string($node->name)) { + return null; + } + + if (null === $objType = $node->var->getAttribute('type')) { + return null; + } + + if (null === $objType = $objType->toMaybeObjectType()) { + return null; + } + + return $objType->getMethod($node->name); + + case $node instanceof \PHPParser_Node_Expr_StaticCall: + if ( ! is_string($node->name)) { + return null; + } + + if (null === $objType = $node->class->getAttribute('type')) { + return null; + } + + if (null === $objType = $objType->toMaybeObjectType()) { + return null; + } + + return $objType->getMethod($node->name); + + case $node instanceof \PHPParser_Node_Expr_New: + if (null === $objType = $node->getAttribute('type')) { + return null; + } + + if (null === $objType = $objType->toMaybeObjectType()) { + return null; + } + + if ($objType->hasMethod('__construct')) { + return $objType->getMethod('__construct'); + } + + // PHP4-style constructors are supported in non-namespaced code. + return false === strpos($objType->getName(), '\\') + ? $objType->getMethod($objType->getName()) : null; + + default: + throw new \InvalidArgumentException('The node class "'.get_class($node).'" is not resolvable to a function/method.'); + } + } + + /** + * Returns the given class if it exists. + * + * @param string $name + * @param integer $cacheLookup + * + * @return MethodContainer|null + */ + public function getClass($name, $lookupMode = self::LOOKUP_BOTH) + { + $lowerName = strtolower($name); + $lookupMode = self::getLookupMode($lookupMode); + + if (self::LOOKUP_CACHE_ONLY !== $lookupMode && isset($this->classes[$lowerName])) { + return $this->classes[$lowerName]; + } + + if (self::LOOKUP_NO_CACHE === $lookupMode) { + return null; + } + + if (isset($this->cachedClasses[$lowerName])) { + if (false === $this->cachedClasses[$lowerName]) { + return null; + } + + return $this->cachedClasses[$lowerName]; + } + + // If the cache is disabled, do not try to load anything from it. If we + // have already loaded something, we will however allow this to be returned. + if ($this->cacheDisabled) { + return null; + } + + $this->tryLoadingClass($lowerName); + + return false === $this->cachedClasses[$lowerName] ? null : $this->cachedClasses[$lowerName]; + } + + public function getClassOrCreate($name, $lookupMode = self::LOOKUP_BOTH) + { + if ($class = $this->getClass($name, $lookupMode)) { + return $class; + } + + return $this->getNamedType($name); + } + + public function getClasses() + { + return $this->classes; + } + + /** + * Returns the class a method was called on. + * + * @param \PHPParser_Node $node + * + * @return null|PhpType + */ + public function getCalledClassByNode(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Expr_MethodCall: + if (null === $objType = $node->var->getAttribute('type')) { + return null; + } + + return $objType->restrictByNotNull()->toMaybeObjectType(); + + case $node instanceof \PHPParser_Node_Expr_StaticCall: + if (null === $objType = $node->class->getAttribute('type')) { + return null; + } + + return $objType->restrictByNotNull()->toMaybeObjectType(); + + case $node instanceof \PHPParser_Node_Expr_New: + if (null === $objType = $node->getAttribute('type')) { + return null; + } + + return $objType->restrictByNotNull()->toMaybeObjectType(); + + default: + throw new \InvalidArgumentException('The node class "'.get_class($node).'" is not resolvable to a function/method.'); + } + } + + /** + * Resolves a type to an instance of PhpType. + * + * @param string|PhpType $type + * + * @return PhpType + */ + public function resolveType($type, $lookupMode = self::LOOKUP_BOTH) + { + if ($type instanceof PhpType) { + return $type; + } + + return $this->typeParser->parseType($type, $lookupMode); + } + + /** + * Tries to resolve all registered named types to actual classes. + * + * This is typically called after all types of a package have been scanned + * in order to populate the AST with correct type information. Also, it is + * called after new type information has been loaded from the database. + */ + public function resolveNamedTypes() + { + $toLookup = array(); + foreach ($this->namedTypes as $className => $namedType) { + assert($namedType instanceof NamedType); + + if ($namedType->isResolved()) { + unset($this->namedTypes[$className]); + continue; + } + + if (null !== $class = $this->getClass($className, self::LOOKUP_NO_CACHE)) { + $namedType->setReferencedType($class); + unset($this->namedTypes[$className]); + continue; + } + + $toLookup[$className] = true; + } + + $lookedUp = array(); + while ($toLookup) { + $classes = $this->typeProvider->loadClasses(array_keys($toLookup)); + foreach ($classes as $className => $class) { + $this->namedTypes[$className]->setReferencedType($class); + unset($this->namedTypes[$className]); + } + + // The loadClasses call from above might have resulted in new NamedTypes + // which we now need to also lookup. + $lookedUp = array_merge($lookedUp, $toLookup); + $toLookup = array_diff_key($this->namedTypes, $lookedUp); + } + } + + private function findImplementingClasses($name) + { + $classes = array(); + foreach ($this->classes as $class) { + if ( ! $class instanceof \Scrutinizer\PhpAnalyzer\Model\Clazz) { + continue; + } + + if ( ! $class->isImplementing($name)) { + continue; + } + + $classes[] = $class; + } + + return $classes; + } + + private function getNamedType($name) + { + $lowerName = strtolower($name); + if (isset($this->namedTypes[$lowerName])) { + return $this->namedTypes[$lowerName]; + } + + return $this->namedTypes[$lowerName] = new NamedType($this, $name); + } + + private function tryLoadingClass($name) + { + if ($class = $this->typeProvider->loadClass($name)) { + $class->setTypeRegistry($this); + $this->cachedClasses[$name] = $class; + $this->resolveNamedTypes(); + } else { + $this->cachedClasses[$name] = false; + } + } + + private function tryLoadingFunction($name) + { + if ($function = $this->typeProvider->loadFunction($name)) { + $this->cachedFunctions[$name] = $function; + $this->resolveNamedTypes(); + } else { + $this->cachedFunctions[$name] = false; + } + } + + private function tryLoadingConstant($name) + { + if ($constant = $this->typeProvider->loadConstant($name)) { + $this->cachedConstants[$name] = $constant; + $this->resolveNamedTypes(); + } else { + $this->cachedConstants[$name] = false; + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnionType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnionType.php new file mode 100644 index 0000000..3146daa --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnionType.php @@ -0,0 +1,371 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class UnionType extends PhpType +{ + private $alternates; + + public function __construct(TypeRegistry $registry, array $alternates) + { + parent::__construct($registry); + + $this->alternates = $alternates; + } + + public function getDocType(array $importedNamespaces = array()) + { + $alt = array(); + foreach ($this->getAlternates() as $alternate) { + $alt[] = $alternate->getDocType($importedNamespaces); + } + + return implode('|', $alt); + } + + public function visit(VisitorInterface $v) + { + return $v->visitUnionType($this); + } + + public function getDisplayName() + { + $alt = array(); + foreach ($this->alternates as $t) { + $alt[] = $t->getDisplayName(); + } + + return implode('|', $alt); + } + + public function __toString() + { + return implode('|', array_map('strval', $this->alternates)); + } + + public function getAlternates() + { + return $this->alternates; + } + + public function restrictByNotNull() + { + $builder = new UnionTypeBuilder($this->registry); + foreach ($this->alternates as $t) { + $builder->addAlternate($t->restrictByNotNull()); + } + + return $builder->build(); + } + + public function isTraversable() + { + return $this->forAll(function($alt) { return $alt->isTraversable(); }); + } + + public function matchesObjectContext() + { + foreach ($this->alternates as $alternate) { + if (false === $alternate->matchesObjectContext()) { + return false; + } + } + + return true; + } + + public function canAssignTo(PhpType $that) + { + $canAssign = true; + foreach ($this->alternates as $alternate) { + if ($alternate->isUnknownType()) { + return true; + } + + $canAssign &= $alternate->canAssignTo($that); + } + + return (boolean) $canAssign; + } + + public function canBeCalled() + { + foreach ($this->alternates as $t) { + if (!$t->canBeCalled()) { + return false; + } + } + + return true; + } + + public function testForEquality(PhpType $that) + { + $result = null; + foreach ($this->alternates as $t) { + $test = $t->testForEquality($that); + if (null === $result) { + $result = $test; + } else if ($result !== $test) { + return TernaryValue::get('unknown'); + } + } + + return $result; + } + + /** + * This predicate determines whether objects of this type can have the + * {@code null} value, and therefore can appear in contexts where + * {@code null} is expected. + * + * @return {@code true} for everything but {@code Number} and + * {@code boolean} types. + */ + public function isNullable() + { + foreach ($this->alternates as $t) { + if ($t->isNullable()) { + return true; + } + } + + return false; + } + + public function getLeastSupertype(PhpType $that) + { + if (!$that->isUnknownType() && !$that->isUnknownType()) { + foreach ($this->alternates as $alternate) { + if (!$alternate->isUnknownType() && $that->isSubTypeOf($alternate)) { + return $this; + } + } + } + + return $this->equals($that) ? $this : $this->registry->createUnionType(array($this, $that)); + } + + public function meet(PhpType $that) + { + $builder = new UnionTypeBuilder($this->registry); + foreach ($this->alternates as $alternate) { + if ($alternate->isSubTypeOf($that)) { + $builder->addAlternate($alternate); + } + } + + if ($that->isUnionType()) { + foreach ($that->toMaybeUnionType()->getAlternates() as $otherAlternate) { + if ($otherAlternate->isSubTypeOf($this)) { + $builder->addAlternate($otherAlternate); + } + } + } else if ($that->isSubTypeOf($this)) { + $builder->addAlternate($that); + } + + return $builder->build(); + } + + /** + * Two union types are equal if they have the same number of alternates + * and all alternates are equal. + */ + public function equals(PhpType $that) + { + if ($that->isUnionType()) { + $that = $that->toMaybeUnionType(); + if (count($this->alternates) !== count($that->getAlternates())) { + return false; + } + + foreach ($that->getAlternates() as $alternate) { + if (!$this->contains($alternate)) { + return false; + } + } + + return true; + } + + return false; + } + + public function toMaybeUnionType() + { + return $this; + } + + /** + * Returns whether this union contains a given type. + * + * In contrast to ``isSubtypeOf``, this method does an equality check as such + * subtypes are not checked here. + * + * @param PhpType $type The alternate which might be in this union. + * + * @return boolean + */ + public function contains(PhpType $type) { + foreach ($this->alternates as $alternate) { + if ($alternate->equals($type)) { + return true; + } + } + + return false; + } + + /** + * Returns a more restricted union by removing all subtypes of the passed type. + * + * @param PhpType $type the supertype of the types to be removed from this union + * + * @return PhpType + */ + public function getRestrictedUnion(PhpType $type) + { + $restricted = new UnionTypeBuilder($this->registry); + foreach ($this->alternates as $t) { + if ($t->isUnknownType() || !$t->isSubTypeOf($type)) { + $restricted->addAlternate($t); + } + } + + return $restricted->build(); + } + + public function isSubTypeOf(PhpType $that) + { + if ($that->isUnknownType()) { + return true; + } + + if ($that->isAllType()) { + return true; + } + + foreach ($this->alternates as $element) { + if (!$element->isSubTypeOf($that)) { + return false; + } + } + + return true; + } + + public function getRestrictedTypeGivenToBooleanOutcome($outcome) + { + // gather elements after restriction + $restricted = new UnionTypeBuilder($this->registry); + foreach ($this->alternates as $element) { + $restricted->addAlternate($element->getRestrictedTypeGivenToBooleanOutcome($outcome)); + } + + return $restricted->build(); + } + + public function getPossibleOutcomesComparedToBoolean() + { + $outcomes = array(); + foreach ($this->alternates as $element) { + $outcomes = array_merge($outcomes, $element->getPossibleOutcomesComparedToBoolean()); + } + + return array_unique($outcomes); + } + + public function getTypesUnderEquality(PhpType $that) + { + return $this->getTypesForComparison($that, __FUNCTION__); + } + + public function getTypesUnderInequality(PhpType $that) + { + return $this->getTypesForComparison($that, __FUNCTION__); + } + + public function getTypesUnderShallowEquality(PhpType $that) + { + return $this->getTypesForComparison($that, __FUNCTION__); + } + + public function getTypesUnderShallowInequality(PhpType $that) + { + return $this->getTypesForComparison($that, __FUNCTION__); + } + + public function collapseUnion() + { + $currentValue = null; + $currentCommonSuper = null; + foreach ($this->alternates as $a) { + if ($a->isUnknownType()) { + return $this->registry->getNativeType(TypeRegistry::NATIVE_UNKNOWN); + } + } + + return $currentCommonSuper; + } + + /** + * Verifies that a predicate holds for all alternates. + * + * @param callable $predicate + * @return boolean + */ + private function forAll($predicate) + { + foreach ($this->alternates as $alt) { + if (false === call_user_func($predicate, $alt)) { + return false; + } + } + + return true; + } + + /** + * Returns the restricted types given the comparison method. + * + * @param PhpType $that + * @param string $comparisonMethod + * + * @return PhpType[] + */ + private function getTypesForComparison(PhpType $that, $comparisonMethod) + { + $thisRestricted = new UnionTypeBuilder($this->registry); + $thatRestricted = new UnionTypeBuilder($this->registry); + + foreach ($this->alternates as $element) { + $p = $element->$comparisonMethod($that); + + if (null !== $p[0]) { + $thisRestricted->addAlternate($p[0]); + } + if (null !== $p[1]) { + $thatRestricted->addAlternate($p[1]); + } + } + + return array($thisRestricted->build(), $thatRestricted->build()); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnionTypeBuilder.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnionTypeBuilder.php new file mode 100644 index 0000000..a8afa34 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnionTypeBuilder.php @@ -0,0 +1,143 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +use PhpOption\Option; + +class UnionTypeBuilder +{ + private $registry; + private $alternates = array(); + private $isAllType = false; + private $isNativeUnknownType = false; + private $areAllUnknownsChecked = true; + + public function __construct(TypeRegistry $registry) + { + $this->registry = $registry; + } + + public function getAlternates() + { + return $this->alternates; + } + + public function addAlternate(PhpType $alternate) + { + // build() returns the bottom type by default, so we can + // just bail out early here. + if ($alternate->isNoType()) { + return $this; + } + + $this->isAllType = $this->isAllType || $alternate->isAllType(); + + $isAlternateUnknown = $alternate instanceof UnknownType; // instanceof is desired here + $this->isNativeUnknownType = $this->isNativeUnknownType || $isAlternateUnknown; + + if ($isAlternateUnknown) { + $this->areAllUnknownsChecked = $this->areAllUnknownsChecked && $alternate->isChecked(); + } + + if (!$this->isAllType && !$this->isNativeUnknownType) { + if ($alternate->isUnionType()) { + $union = $alternate->toMaybeUnionType(); + foreach ($union->getAlternates() as $unionAlt) { + $this->addAlternate($unionAlt); + } + } else { + // Look through the alternates we've got so far, + // and check if any of them are duplicates of + // one another. + foreach ($this->alternates as $index => $current) { + // The Unknown type is special in that we cannot use our + // subtype based check, but need to check for equality to + // avoid duplicates, and not remove all other alternates. + if ($alternate->isUnknownType()) { + if ($alternate->equals($current)) { + return $this; + } + + continue; + } + + // Check if we already have a more general type in the union. + // Then, we do not add this alternate. + if ($alternate->isSubTypeOf($current)) { + return $this; + } + + // Check if we have a subtype of the passed alternate. Then, + // we remove that alternate in favor of the newly passed one. + if ($current->isSubTypeOf($alternate)) { + unset($this->alternates[$index]); + } + } + + $this->alternates[] = $alternate; + } + } + + return $this; + } + + /** + * Creates a union. + * + * If no type is given, NoType will be returned. + * + * @return PhpType + */ + public function build() + { + return $this->reduceAlternatesWithoutUnion() + ->getOrElse(new UnionType($this->registry, $this->alternates)); + } + + /** + * Attempts to reduce alternates into a non-union type. + * + * If not possible, it will return null. If there are no alternates at all, + * a NoType will be returned. + * + * @return Option + */ + private function reduceAlternatesWithoutUnion() + { + if ($this->isAllType) { + return new \PhpOption\Some($this->registry->getNativeType(TypeRegistry::NATIVE_ALL)); + } else if ($this->isNativeUnknownType) { + if ($this->areAllUnknownsChecked) { + return new \PhpOption\Some($this->registry->getNativeType(TypeRegistry::NATIVE_UNKNOWN_CHECKED)); + } + + return new \PhpOption\Some($this->registry->getNativeType(TypeRegistry::NATIVE_UNKNOWN)); + } else { + $size = count($this->alternates); + + if ($size > 1) { + return \PhpOption\None::create(); + } else if (1 === $size) { + return new \PhpOption\Some(reset($this->alternates)); + } else { + return new \PhpOption\Some($this->registry->getNativeType(TypeRegistry::NATIVE_NONE)); + } + } + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnknownType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnknownType.php new file mode 100644 index 0000000..99dc078 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/UnknownType.php @@ -0,0 +1,108 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +class UnknownType extends PhpType +{ + private $checked; + + /** + * @param TypeRegistry $registry + * @param boolean $checked + */ + public function __construct(TypeRegistry $registry, $checked = false) + { + parent::__construct($registry); + + $this->checked = (boolean) $checked; + } + + public function visit(VisitorInterface $v) + { + return $v->visitUnknownType(); + } + + public function isChecked() + { + return $this->checked; + } + + public function isUnknownType() + { + return true; + } + + public function canBeCalled() + { + return true; + } + + public function matchesObjectContext() + { + return true; + } + + public function isTraversable() + { + return true; + } + + public function testForEquality(PhpType $that) + { + return TernaryValue::get('unknown'); + } + + public function isNullable() + { + return true; + } + + public function isSubTypeOf(PhpType $that) + { + return true; + } + + public function getDisplayName() + { + return '?'; + } + + public function hasDisplayName() + { + return true; + } + + public function equals(PhpType $that) + { + if (parent::equals($that)) { + return true; + } + + if ($that->isUnknownType()) { + return true; + } + + return false; + } + + public function getPossibleOutcomesComparedToBoolean() + { + return array(true, false); + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/VisitorInterface.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/VisitorInterface.php new file mode 100644 index 0000000..5bed8de --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/VisitorInterface.php @@ -0,0 +1,97 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\PhpParser\Type; + +/** + * Interface for type visitors. + * + * @author Johannes M. Schmitt + */ +interface VisitorInterface +{ + /** + * @return void + */ + public function visitNoType(); + + /** + * @return void + */ + public function visitAllType(); + + /** + * @return void + */ + public function visitBooleanType(); + + /** + * @return void + */ + public function visitNoObjectType(); + + /** + * @return void + */ + public function visitObjectType(ObjectType $type); + + /** + * @return void + */ + public function visitUnknownType(); + + /** + * @return void + */ + public function visitNullType(); + + /** + * @return void + */ + public function visitIntegerType(); + + /** + * @return void + */ + public function visitDoubleType(); + + /** + * @return void + */ + public function visitStringType(); + + /** + * @return void + */ + public function visitUnionType(UnionType $type); + + /** + * @return void + */ + public function visitArrayType(ArrayType $type); + + /** + * @return void + */ + public function visitCallableType(CallableType $type); + + /** + * @return void + */ + public function visitResourceType(ResourceType $type); +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Util/DebugUtil.php b/src/Scrutinizer/PhpAnalyzer/Util/DebugUtil.php new file mode 100644 index 0000000..ea461ff --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Util/DebugUtil.php @@ -0,0 +1,50 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Util; + +abstract class DebugUtil +{ + public static function printBacktrace(array $trace) + { + foreach ($trace as $entry) { + unset($entry['object']); + + if (isset($entry['args'])) { + $entry['args'] = self::sanitizeArgs($entry['args']); + } + + var_dump($entry); + } + } + + private static function sanitizeArgs(array $args) + { + foreach ($args as $k => $arg) { + if (is_object($arg)) { + $args[$k] = get_class($arg); + } else if (is_array($arg)) { + $args[$k] = self::sanitizeArgs($arg); + } + } + + return $args; + } + + private final function __construct() { } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Util/TestUtils.php b/src/Scrutinizer/PhpAnalyzer/Util/TestUtils.php new file mode 100644 index 0000000..709dd87 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Util/TestUtils.php @@ -0,0 +1,122 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Util; + +use Doctrine\Common\Annotations\AnnotationReader; +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\DriverManager; +use Doctrine\DBAL\Types\Type; +use Doctrine\ORM\Configuration; +use Doctrine\ORM\EntityManager; +use Doctrine\ORM\Mapping\Driver\AnnotationDriver; +use Doctrine\ORM\Tools\SchemaTool; +use Scrutinizer\PhpAnalyzer\Model\Type\JsonArrayType; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; +use Scrutinizer\PhpAnalyzer\Model\Type\SimpleArrayType; + +abstract class TestUtils +{ + public static function createTestEntityManager($temporary = false) + { + $options = array( + 'driver' => 'pdo_sqlite', + ); + + if ($temporary) { + $options['memory'] = true; + } else { + $options['path'] = __DIR__.'/../../../../res/test_database.sqlite'; + } + + $conn = DriverManager::getConnection($options); + $em = self::createEm($conn); + + if ($temporary) { + $tool = new SchemaTool($em); + $tool->createSchema($em->getMetadataFactory()->getAllMetadata()); + } + + return $em; + } + + public static function createMysqlTestEntityManager($user, $pass, $db, $host) + { + $con = DriverManager::getConnection(array( + 'driver' => 'pdo_mysql', + 'user' => $user, + 'password' => $pass, + 'dbname' => $db, + 'host' => $host, + )); + $em = self::createEm($con); + + $tool = new SchemaTool($em); + try { + $tool->dropDatabase(); + } catch (\Exception $ex) { + // tables did not exist + } + + $tool->createSchema($em->getMetadataFactory()->getAllMetadata()); + + return $em; + } + + private static function createEm(Connection $conn) + { + $config = new Configuration(); + $config->setProxyDir($proxyDir = sys_get_temp_dir().'/PhpAnalyzerProxies/'.uniqid('em', true)); + if (!is_dir($proxyDir) && false === @mkdir($proxyDir, 0777, true)) { + throw new \RuntimeException(sprintf('Could not create proxy directory "%s" for test entity manager.', $proxyDir)); + } + $config->setProxyNamespace('Scrutinizer\PhpAnalyzer\Model\Proxies'); + + if (false === Type::hasType(PhpTypeType::NAME)) { + Type::addType(PhpTypeType::NAME, 'Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType'); + } + + $driver = new AnnotationDriver(new AnnotationReader(), array( + __DIR__.'/../Model', + )); + $config->setMetadataDriverImpl($driver); + $config->addEntityNamespace('PhpAnalyzer', 'Scrutinizer\PhpAnalyzer\Model'); + + $em = EntityManager::create($conn, $config); + $em->getEventManager()->addEventListener(array('prePersist'), new TestUuidListener()); + + return $em; + } + + private final function __construct() { } +} + +class TestUuidListener { + public function prePersist($args) + { + if (! $args->getEntity() instanceof \Scrutinizer\PhpAnalyzer\Model\PackageVersion) { + return; + } + + if (null !== $args->getEntity()->getUuid()) { + return; + } + + $args->getEntity()->setUuid(uniqid(mt_rand(), true)); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ArgumentChecker/OverloadedCoreFunctionCheckerTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ArgumentChecker/OverloadedCoreFunctionCheckerTest.php new file mode 100644 index 0000000..1433291 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ArgumentChecker/OverloadedCoreFunctionCheckerTest.php @@ -0,0 +1,174 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\ArgumentChecker; + +class OverloadedCoreFunctionCheckerTest extends \PHPUnit_Framework_TestCase +{ + private $registry; + private $typeChecker; + private $argumentChecker; + + /** + * @dataProvider getMissingArgumentsTests + */ + public function testGetMissingArguments($functionName, array $rawArgs, array $expectedMissingArgs) + { + $args = $this->resolveArguments($rawArgs); + $function = new \Scrutinizer\PhpAnalyzer\Model\GlobalFunction($functionName); + + $missingArgs = $this->argumentChecker->getMissingArguments($function, $args); + $this->assertEquals($expectedMissingArgs, $missingArgs); + } + + public function getMissingArgumentsTests() + { + $tests = array(); + + $tests[] = array('asdfasdfasdfa', array(), array()); + $tests[] = array('asdfasdfasdfa', array('asdf'), array()); + + $tests[] = array('array_udiff', array(), array('array1', 'array2', 'data_compare_func')); + $tests[] = array('array_udiff_assoc', array(), array('array1', 'array2', 'data_compare_func')); + $tests[] = array('array_uintersect_assoc', array(), array('array1', 'array2', 'data_compare_func')); + $tests[] = array('array_uintersect', array(), array('array1', 'array2', 'data_compare_func')); + $tests[] = array('array_udiff', array('foo'), array('array2', 'data_compare_func')); + $tests[] = array('array_udiff_assoc', array('foo', 'bar'), array('data_compare_func')); + $tests[] = array('array_uintersect_assoc', array('foo', 'bar'), array('data_compare_func')); + $tests[] = array('array_uintersect', array('foo', 'bar'), array('data_compare_func')); + $tests[] = array('array_udiff', array('foo', 'bar'), array('data_compare_func')); + $tests[] = array('array_udiff_assoc', array('foo', 'bar'), array('data_compare_func')); + $tests[] = array('array_uintersect_assoc', array('foo', 'bar'), array('data_compare_func')); + $tests[] = array('array_uintersect', array('foo', 'bar'), array('data_compare_func')); + $tests[] = array('array_udiff', array('foo', 'bar', 'baz'), array()); + $tests[] = array('array_udiff_assoc', array('foo', 'bar', 'baz'), array()); + $tests[] = array('array_uintersect_assoc', array('foo', 'bar', 'baz'), array()); + $tests[] = array('array_uintersect', array('foo', 'bar', 'baz'), array()); + $tests[] = array('array_udiff', array('foo', 'bar', 'baz', 'boo'), array()); + $tests[] = array('array_udiff_assoc', array('foo', 'bar', 'baz', 'boo'), array()); + $tests[] = array('array_uintersect_assoc', array('foo', 'bar', 'baz', 'boo'), array()); + $tests[] = array('array_uintersect', array('foo', 'bar', 'baz', 'boo'), array()); + + $tests[] = array('array_udiff_uassoc', array(), array('array1', 'array2', 'data_compare_func', 'key_compare_func')); + $tests[] = array('array_udiff_uassoc', array('foo'), array('array2', 'data_compare_func', 'key_compare_func')); + $tests[] = array('array_udiff_uassoc', array('foo', 'bar'), array('data_compare_func', 'key_compare_func')); + $tests[] = array('array_udiff_uassoc', array('foo', 'bar', 'baz'), array('key_compare_func')); + $tests[] = array('array_udiff_uassoc', array('foo', 'bar', 'baz', 'boo'), array()); + $tests[] = array('array_uintersect_uassoc', array(), array('array1', 'array2', 'data_compare_func', 'key_compare_func')); + $tests[] = array('array_uintersect_uassoc', array('foo'), array('array2', 'data_compare_func', 'key_compare_func')); + $tests[] = array('array_uintersect_uassoc', array('foo', 'bar'), array('data_compare_func', 'key_compare_func')); + $tests[] = array('array_uintersect_uassoc', array('foo', 'bar', 'baz'), array('key_compare_func')); + $tests[] = array('array_uintersect_uassoc', array('foo', 'bar', 'baz', 'boo'), array()); + + return $tests; + } + + /** + * @dataProvider getMismatchedArgumentTypesTests + */ + public function testGetMismatchedArgumentTypes($functionName, array $rawTypes, array $expectedMismatchedTypes) + { + $function = new \Scrutinizer\PhpAnalyzer\Model\GlobalFunction($functionName); + $types = array_map(array($this->registry, 'resolveType'), $rawTypes); + $expectedMismatchedTypes = array_map(array($this->registry, 'resolveType'), $expectedMismatchedTypes); + + $mismatchedTypes = $this->argumentChecker->getMismatchedArgumentTypes($function, $types); + $this->assertCount(count($expectedMismatchedTypes), $mismatchedTypes); + foreach ($expectedMismatchedTypes as $i => $expectedType) { + $this->assertArrayHasKey($i, $mismatchedTypes); + $this->assertTrue($expectedType->equals($mismatchedTypes[$i]), sprintf('Failed to assert that expected type "%s" equals actual type "%s" for index %d (0-based).', $expectedType, $mismatchedTypes[$i], $i)); + } + } + + public function getMismatchedArgumentTypesTests() + { + $tests = array(); + + $tests[] = array('asasddfdfdf', array(), array()); + $tests[] = array('fgdfgdfdf', array('string'), array()); + + $tests[] = array('array_udiff', array('array', 'callable'), array()); + $tests[] = array('array_udiff', array('string', 'array', 'callable'), array('array')); + $tests[] = array('array_udiff', array('array', 'string', 'callable'), array(1 => 'array')); + $tests[] = array('array_udiff', array('array', 'array', 'boolean'), array(2 => 'callable')); + $tests[] = array('array_udiff', array('array', 'array', 'callable'), array()); + $tests[] = array('array_udiff', array('array', 'array', 'array', 'callable'), array()); + $tests[] = array('array_udiff', array('array', 'array', 'array', 'string', 'string'), array(3 => 'array')); + + $tests[] = array('array_udiff_assoc', array('array', 'callable'), array()); + $tests[] = array('array_udiff_assoc', array('string', 'array', 'callable'), array('array')); + $tests[] = array('array_udiff_assoc', array('array', 'string', 'callable'), array(1 => 'array')); + $tests[] = array('array_udiff_assoc', array('array', 'array', 'boolean'), array(2 => 'callable')); + $tests[] = array('array_udiff_assoc', array('array', 'array', 'callable'), array()); + $tests[] = array('array_udiff_assoc', array('array', 'array', 'array', 'callable'), array()); + $tests[] = array('array_udiff_assoc', array('array', 'array', 'array', 'string', 'string'), array(3 => 'array')); + + $tests[] = array('array_uintersect_assoc', array('array', 'callable'), array()); + $tests[] = array('array_uintersect_assoc', array('string', 'array', 'callable'), array('array')); + $tests[] = array('array_uintersect_assoc', array('array', 'string', 'callable'), array(1 => 'array')); + $tests[] = array('array_uintersect_assoc', array('array', 'array', 'boolean'), array(2 => 'callable')); + $tests[] = array('array_uintersect_assoc', array('array', 'array', 'callable'), array()); + $tests[] = array('array_uintersect_assoc', array('array', 'array', 'array', 'callable'), array()); + $tests[] = array('array_uintersect_assoc', array('array', 'array', 'array', 'string', 'string'), array(3 => 'array')); + + $tests[] = array('array_uintersect', array('array', 'callable'), array()); + $tests[] = array('array_uintersect', array('string', 'array', 'callable'), array('array')); + $tests[] = array('array_uintersect', array('array', 'string', 'callable'), array(1 => 'array')); + $tests[] = array('array_uintersect', array('array', 'array', 'boolean'), array(2 => 'callable')); + $tests[] = array('array_uintersect', array('array', 'array', 'callable'), array()); + $tests[] = array('array_uintersect', array('array', 'array', 'array', 'callable'), array()); + $tests[] = array('array_uintersect', array('array', 'array', 'array', 'string', 'string'), array(3 => 'array')); + + $tests[] = array('array_udiff_uassoc', array('string', 'array', 'string'), array()); + $tests[] = array('array_udiff_uassoc', array('string', 'string', 'callable', 'string'), array('array', 'array')); + $tests[] = array('array_udiff_uassoc', array('array', 'string', 'string', 'string'), array(1 => 'array')); + $tests[] = array('array_udiff_uassoc', array('array', 'array', 'array', 'array', 'string', 'string'), array()); + $tests[] = array('array_udiff_uassoc', array('array', 'string', 'array', 'boolean', 'array'), array(1 => 'array', 3 => 'callable')); + + $tests[] = array('array_uintersect_uassoc', array('string', 'array', 'string'), array()); + $tests[] = array('array_uintersect_uassoc', array('string', 'string', 'callable', 'string'), array('array', 'array')); + $tests[] = array('array_uintersect_uassoc', array('array', 'string', 'string', 'string'), array(1 => 'array')); + $tests[] = array('array_uintersect_uassoc', array('array', 'array', 'array', 'array', 'string', 'string'), array()); + $tests[] = array('array_uintersect_uassoc', array('array', 'string', 'array', 'boolean', 'array'), array(1 => 'array', 3 => 'callable')); + + return $tests; + } + + protected function setUp() + { + $this->registry = new \Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry(); + $this->typeChecker = new \Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeChecker($this->registry); + $this->argumentChecker = new \Scrutinizer\PhpAnalyzer\ArgumentChecker\OverloadedCoreFunctionChecker($this->registry, $this->typeChecker); + } + + private function resolveArguments(array $rawArgs) + { + $args = array(); + foreach ($rawArgs as $rawArg) { + if (is_string($rawArg)) { + $args[] = new \PHPParser_Node_Arg(new \PHPParser_Node_Scalar_String($rawArg)); + + continue; + } + + throw new \LogicException(sprintf('Could not resolve argument %s.', json_encode($rawArg))); + } + + return $args; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/ControlFlowAnalysisTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/ControlFlowAnalysisTest.php new file mode 100644 index 0000000..d1f867e --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/ControlFlowAnalysisTest.php @@ -0,0 +1,121 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\ControlFlow; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowAnalysis; +use JMS\PhpManipulator\PhpParser\BlockNode; + +class ControlFlowAnalysisTest extends \PHPUnit_Framework_TestCase +{ + /** @var ControlFlowAnalysis */ + private $cfa; + + /** + * @group foo + */ + public function testCfgDoesNotTraverseExpressionTrees() + { + $expr = new \PHPParser_Node_Expr_Assign(new \PHPParser_Node_Expr_Variable('foo'), new \PHPParser_Node_Scalar_String('foo')); + $this->normalizeAst(array($expr)); + $this->cfa->process($expr); + + $graph = $this->cfa->getGraph(); + $this->assertSame($expr, $graph->getEntryPoint()->getAstNode()); + $this->assertSame(1, count($out = $graph->getOutEdges($expr))); + $this->assertSame($out[0]->getDest(), $graph->getImplicitReturn()); + $this->assertSame(1, count($graph->getNodes())); + } + + /** + * @dataProvider getComputeFollowNodeTests + * @param \PHPParser_Node $fromNode + * @param \PHPParser_Node $parentNode + * @param \PHPParser_Node $expectedNode + */ + public function testComputeFollowNode($message, \PHPParser_Node $fromNode, \PHPParser_Node $expectedNode = null) + { + $ref = new \ReflectionMethod($this->cfa, 'computeFollowNode'); + $ref->setAccessible(true); + + $this->assertSame($expectedNode, $ref->invoke($this->cfa, $fromNode), $message); + } + + public function getComputeFollowNodeTests() + { + $tests = array(); + + $if = new \PHPParser_Node_Stmt_If($cond = $this->getMockForAbstractClass('PHPParser_Node_Expr', array(array())), array( + 'stmts' => $blockNode = new BlockNode(array( + $onTrue = new \PHPParser_Node_Stmt_Echo(array(new \PHPParser_Node_Scalar_String('foo'))), + )), + 'elseifs' => array( + new \PHPParser_Node_Stmt_ElseIf($cond, array( + 'stmts' => $emptyBlock = new BlockNode(array()), + )), + ), + 'else' => new \PHPParser_Node_Stmt_Else(array( + $onFalse = new \PHPParser_Node_Stmt_Echo(array(new \PHPParser_Node_Scalar_String('bar'))), + )), + )); + $this->normalizeAst(array($if)); + + $tests[] = array('Follow node of stmts is whatever follows the if', $onTrue, null); + $tests[] = array('Follow node of else branch is whatever follows the if', $onFalse, null); + $tests[] = array('Follow node of blocks is their next sibling', $blockNode, null); + $tests[] = array('Follow node of empty blocks is whatever follows their parent', $emptyBlock, null); + + + $function = new \PHPParser_Node_Stmt_Function('foo', array( + 'stmts' => $functionBlock = new BlockNode(array( + $try = new \PHPParser_Node_Stmt_TryCatch(array(), array( + $catch1 = new \PHPParser_Node_Stmt_Catch(new \PHPParser_Node_Name(array('Foo')), 'ex'), + $catch2 = new \PHPParser_Node_Stmt_Catch(new \PHPParser_Node_Name(array('Bar')), 'ex'), + )), + $echo = new \PHPParser_Node_Stmt_Echo(array(new \PHPParser_Node_Scalar_String('foo'))), + )) + )); + $tryBlock = $try->stmts = new BlockNode(array( + $throw = new \PHPParser_Node_Stmt_Throw(new \PHPParser_Node_Expr_Variable('foo')) + )); + $catch1Block = $catch1->stmts = new BlockNode(array()); + $catch2Block = $catch2->stmts = new BlockNode(array()); + $this->normalizeAst(array($function)); + + $tests[] = array('Follow node of function block is null', $functionBlock, null); + $tests[] = array('Follow node of try block is echo', $tryBlock, $echo); + $tests[] = array('Follow node of catch1 block is echo', $catch1Block, $echo); + $tests[] = array('Follow node of catch2 block is echo', $catch2Block, $echo); + $tests[] = array('Follow node of try is echo', $try, $echo); + + return $tests; + } + + private function normalizeAst($ast) + { + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NodeConnector()); + + return $traverser->traverse($ast); + } + + protected function setUp() + { + $this->cfa = new ControlFlowAnalysis(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/FixedPointGraphTraversalTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/FixedPointGraphTraversalTest.php new file mode 100644 index 0000000..a18f2e4 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/FixedPointGraphTraversalTest.php @@ -0,0 +1,61 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\ControlFlow; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowGraph; +use Scrutinizer\PhpAnalyzer\ControlFlow\FixedPointGraphTraversal; + +class FixedPointGraphTraversalTest extends \PHPUnit_Framework_TestCase +{ + public function testComputeFixedPoint() + { + $graph = new ControlFlowGraph($entry = $this->getAstNode()); + + $node1 = $this->getAstNode(); + $graph->connect($entry, null, $node1); + + $node2 = $this->getAstNode(); + $graph->connect($node1, null, $node2); + + $node3 = $this->getAstNode(); + $graph->connect($node3, null, $node2); + + $node4 = $this->getAstNode(); + $graph->connect($node2, null, $node4); + + $callback = $this->getMock('Scrutinizer\PhpAnalyzer\ControlFlow\EdgeCallbackInterface'); + $t = new FixedPointGraphTraversal($callback); + + $callback->expects($this->at(0)) + ->method('traverseEdge') + ->with($entry, null, $node1) + ->will($this->returnValue(true)); + $callback->expects($this->at(1)) + ->method('traverseEdge') + ->with($node1, null, $node2) + ->will($this->returnValue(false)); + + $t->computeFixedPointWithEntry($graph, $entry); + } + + private function getAstNode() + { + return $this->getMock('PHPParser_Node'); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/SymfonyPropertyUtil.dot b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/SymfonyPropertyUtil.dot new file mode 100644 index 0000000..986d57e --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/SymfonyPropertyUtil.dot @@ -0,0 +1,21 @@ +digraph G { + B1 [shape=box,label="implicit return",style=filled] + B2 [shape=box,label="PHPParser_Node_Stmt_Namespace",style=filled] + B2 -> B3 + B4 [shape=box,label="PHPParser_Node_Stmt_Use"] + B4 -> B5 + B5 [shape=box,label="PHPParser_Node_Stmt_Use"] + B5 -> B6 + B6 [shape=box,label="PHPParser_Node_Stmt_Use"] + B6 -> B7 + B7 [shape=box,label="PHPParser_Node_Stmt_Use"] + B7 -> B8 + B8 [shape=box,label="PHPParser_Node_Stmt_Use"] + B8 -> B9 + B9 [shape=box,label="PHPParser_Node_Stmt_Use"] + B9 -> B10 + B10 [shape=box,label="PHPParser_Node_Stmt_Class"] + B10 -> B1 + B3 [shape=box,label="Block of PHPParser_Node_Stmt_Namespace"] + B3 -> B4 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/SymfonyPropertyUtil.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/SymfonyPropertyUtil.php new file mode 100644 index 0000000..4c87ecf --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/SymfonyPropertyUtil.php @@ -0,0 +1,564 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Symfony\Component\Form\Util; + +use Traversable; +use ReflectionClass; +use Symfony\Component\Form\Exception\InvalidPropertyPathException; +use Symfony\Component\Form\Exception\InvalidPropertyException; +use Symfony\Component\Form\Exception\PropertyAccessDeniedException; +use Symfony\Component\Form\Exception\UnexpectedTypeException; + +/** + * Allows easy traversing of a property path + * + * @author Bernhard Schussek + */ +class PropertyPath implements \IteratorAggregate +{ + /** + * Character used for separating between plural and singular of an element. + * @var string + */ + const SINGULAR_SEPARATOR = '|'; + + /** + * The elements of the property path + * @var array + */ + private $elements = array(); + + /** + * The singular forms of the elements in the property path. + * @var array + */ + private $singulars = array(); + + /** + * The number of elements in the property path + * @var integer + */ + private $length; + + /** + * Contains a boolean for each property in $elements denoting whether this + * element is an index. It is a property otherwise. + * @var array + */ + private $isIndex = array(); + + /** + * String representation of the path + * @var string + */ + private $string; + + /** + * Positions where the individual elements start in the string representation + * @var array + */ + private $positions; + + /** + * Parses the given property path + * + * @param string $propertyPath + */ + public function __construct($propertyPath) + { + if (null === $propertyPath) { + throw new InvalidPropertyPathException('The property path must not be empty'); + } + + $this->string = (string) $propertyPath; + $position = 0; + $remaining = $propertyPath; + + // first element is evaluated differently - no leading dot for properties + $pattern = '/^(([^\.\[]+)|\[([^\]]+)\])(.*)/'; + + while (preg_match($pattern, $remaining, $matches)) { + $this->positions[] = $position; + + if ('' !== $matches[2]) { + $element = $matches[2]; + $this->isIndex[] = false; + } else { + $element = $matches[3]; + $this->isIndex[] = true; + } + + $pos = strpos($element, self::SINGULAR_SEPARATOR); + $singular = null; + + if (false !== $pos) { + $singular = substr($element, $pos + 1); + $element = substr($element, 0, $pos); + } + + $this->elements[] = $element; + $this->singulars[] = $singular; + + $position += strlen($matches[1]); + $remaining = $matches[4]; + $pattern = '/^(\.(\w+)|\[([^\]]+)\])(.*)/'; + } + + if (!empty($remaining)) { + throw new InvalidPropertyPathException(sprintf( + 'Could not parse property path "%s". Unexpected token "%s" at position %d', + $propertyPath, + $remaining{0}, + $position + )); + } + + $this->length = count($this->elements); + } + + /** + * Returns the string representation of the property path + * + * @return string + */ + public function __toString() + { + return $this->string; + } + + /** + * Returns the length of the property path. + * + * @return integer + */ + public function getLength() + { + return $this->length; + } + + /** + * Returns the parent property path. + * + * The parent property path is the one that contains the same items as + * this one except for the last one. + * + * If this property path only contains one item, null is returned. + * + * @return PropertyPath The parent path or null. + */ + public function getParent() + { + if ($this->length <= 1) { + return null; + } + + $parent = clone $this; + + --$parent->length; + $parent->string = substr($parent->string, 0, $parent->positions[$parent->length]); + array_pop($parent->elements); + array_pop($parent->singulars); + array_pop($parent->isIndex); + array_pop($parent->positions); + + return $parent; + } + + /** + * Returns a new iterator for this path + * + * @return PropertyPathIterator + */ + public function getIterator() + { + return new PropertyPathIterator($this); + } + + /** + * Returns the elements of the property path as array + * + * @return array An array of property/index names + */ + public function getElements() + { + return $this->elements; + } + + /** + * Returns the element at the given index in the property path + * + * @param integer $index The index key + * + * @return string A property or index name + */ + public function getElement($index) + { + return $this->elements[$index]; + } + + /** + * Returns whether the element at the given index is a property + * + * @param integer $index The index in the property path + * + * @return boolean Whether the element at this index is a property + */ + public function isProperty($index) + { + return !$this->isIndex[$index]; + } + + /** + * Returns whether the element at the given index is an array index + * + * @param integer $index The index in the property path + * + * @return boolean Whether the element at this index is an array index + */ + public function isIndex($index) + { + return $this->isIndex[$index]; + } + + /** + * Returns the value at the end of the property path of the object + * + * Example: + * + * $path = new PropertyPath('child.name'); + * + * echo $path->getValue($object); + * // equals echo $object->getChild()->getName(); + * + * + * This method first tries to find a public getter for each property in the + * path. The name of the getter must be the camel-cased property name + * prefixed with "get", "is", or "has". + * + * If the getter does not exist, this method tries to find a public + * property. The value of the property is then returned. + * + * If none of them are found, an exception is thrown. + * + * @param object|array $objectOrArray The object or array to traverse + * + * @return mixed The value at the end of the property path + * + * @throws InvalidPropertyException If the property/getter does not exist + * @throws PropertyAccessDeniedException If the property/getter exists but is not public + */ + public function getValue($objectOrArray) + { + for ($i = 0; $i < $this->length; ++$i) { + if (is_object($objectOrArray)) { + $value = $this->readProperty($objectOrArray, $i); + // arrays need to be treated separately (due to PHP bug?) + // http://bugs.php.net/bug.php?id=52133 + } elseif (is_array($objectOrArray)) { + $property = $this->elements[$i]; + if (!array_key_exists($property, $objectOrArray)) { + $objectOrArray[$property] = $i + 1 < $this->length ? array() : null; + } + $value =& $objectOrArray[$property]; + } else { + throw new UnexpectedTypeException($objectOrArray, 'object or array'); + } + + $objectOrArray =& $value; + } + + return $value; + } + + /** + * Sets the value at the end of the property path of the object + * + * Example: + * + * $path = new PropertyPath('child.name'); + * + * echo $path->setValue($object, 'Fabien'); + * // equals echo $object->getChild()->setName('Fabien'); + * + * + * This method first tries to find a public setter for each property in the + * path. The name of the setter must be the camel-cased property name + * prefixed with "set". + * + * If the setter does not exist, this method tries to find a public + * property. The value of the property is then changed. + * + * If neither is found, an exception is thrown. + * + * @param object|array $objectOrArray The object or array to traverse + * @param mixed $value The value at the end of the property path + * + * @throws InvalidPropertyException If the property/setter does not exist + * @throws PropertyAccessDeniedException If the property/setter exists but is not public + */ + public function setValue(&$objectOrArray, $value) + { + for ($i = 0, $l = $this->length - 1; $i < $l; ++$i) { + + if (is_object($objectOrArray)) { + $nestedObject = $this->readProperty($objectOrArray, $i); + // arrays need to be treated separately (due to PHP bug?) + // http://bugs.php.net/bug.php?id=52133 + } elseif (is_array($objectOrArray)) { + $property = $this->elements[$i]; + if (!array_key_exists($property, $objectOrArray)) { + $objectOrArray[$property] = array(); + } + $nestedObject =& $objectOrArray[$property]; + } else { + throw new UnexpectedTypeException($objectOrArray, 'object or array'); + } + + $objectOrArray =& $nestedObject; + } + + if (!is_object($objectOrArray) && !is_array($objectOrArray)) { + throw new UnexpectedTypeException($objectOrArray, 'object or array'); + } + + $this->writeProperty($objectOrArray, $i, $value); + } + + /** + * Reads the value of the property at the given index in the path + * + * @param object $object The object to read from + * @param integer $currentIndex The index of the read property in the path + * + * @return mixed The value of the property + */ + protected function readProperty($object, $currentIndex) + { + $property = $this->elements[$currentIndex]; + + if ($this->isIndex[$currentIndex]) { + if (!$object instanceof \ArrayAccess) { + throw new InvalidPropertyException(sprintf('Index "%s" cannot be read from object of type "%s" because it doesn\'t implement \ArrayAccess', $property, get_class($object))); + } + + if (isset($object[$property])) { + return $object[$property]; + } + } else { + $camelProp = $this->camelize($property); + $reflClass = new ReflectionClass($object); + $getter = 'get'.$camelProp; + $isser = 'is'.$camelProp; + $hasser = 'has'.$camelProp; + + if ($reflClass->hasMethod($getter)) { + if (!$reflClass->getMethod($getter)->isPublic()) { + throw new PropertyAccessDeniedException(sprintf('Method "%s()" is not public in class "%s"', $getter, $reflClass->getName())); + } + + return $object->$getter(); + } elseif ($reflClass->hasMethod($isser)) { + if (!$reflClass->getMethod($isser)->isPublic()) { + throw new PropertyAccessDeniedException(sprintf('Method "%s()" is not public in class "%s"', $isser, $reflClass->getName())); + } + + return $object->$isser(); + } elseif ($reflClass->hasMethod($hasser)) { + if (!$reflClass->getMethod($hasser)->isPublic()) { + throw new PropertyAccessDeniedException(sprintf('Method "%s()" is not public in class "%s"', $hasser, $reflClass->getName())); + } + + return $object->$hasser(); + } elseif ($reflClass->hasMethod('__get')) { + // needed to support magic method __get + return $object->$property; + } elseif ($reflClass->hasProperty($property)) { + if (!$reflClass->getProperty($property)->isPublic()) { + throw new PropertyAccessDeniedException(sprintf('Property "%s" is not public in class "%s". Maybe you should create the method "%s()" or "%s()"?', $property, $reflClass->getName(), $getter, $isser)); + } + + return $object->$property; + } elseif (property_exists($object, $property)) { + // needed to support \stdClass instances + return $object->$property; + } else { + throw new InvalidPropertyException(sprintf('Neither property "%s" nor method "%s()" nor method "%s()" exists in class "%s"', $property, $getter, $isser, $reflClass->getName())); + } + } + } + + /** + * Sets the value of the property at the given index in the path + * + * @param object $objectOrArray The object or array to traverse + * @param integer $currentIndex The index of the modified property in the path + * @param mixed $value The value to set + */ + protected function writeProperty(&$objectOrArray, $currentIndex, $value) + { + $property = $this->elements[$currentIndex]; + + if (is_object($objectOrArray) && $this->isIndex[$currentIndex]) { + if (!$objectOrArray instanceof \ArrayAccess) { + throw new InvalidPropertyException(sprintf('Index "%s" cannot be modified in object of type "%s" because it doesn\'t implement \ArrayAccess', $property, get_class($objectOrArray))); + } + + $objectOrArray[$property] = $value; + } elseif (is_object($objectOrArray)) { + $reflClass = new ReflectionClass($objectOrArray); + $setter = 'set'.$this->camelize($property); + $addMethod = null; + $removeMethod = null; + $plural = null; + + // Check if the parent has matching methods to add/remove items + if (is_array($value) || $value instanceof Traversable) { + $singular = $this->singulars[$currentIndex]; + if (null !== $singular) { + $addMethod = 'add' . ucfirst($singular); + $removeMethod = 'remove' . ucfirst($singular); + + if (!$this->isAccessible($reflClass, $addMethod, 1)) { + throw new InvalidPropertyException(sprintf( + 'The public method "%s" with exactly one required parameter was not found on class %s', + $addMethod, + $reflClass->getName() + )); + } + + if (!$this->isAccessible($reflClass, $removeMethod, 1)) { + throw new InvalidPropertyException(sprintf( + 'The public method "%s" with exactly one required parameter was not found on class %s', + $removeMethod, + $reflClass->getName() + )); + } + } else { + // The plural form is the last element of the property path + $plural = ucfirst($this->elements[$this->length - 1]); + + // Any of the two methods is required, but not yet known + $singulars = (array) FormUtil::singularify($plural); + + foreach ($singulars as $singular) { + $addMethodName = 'add' . $singular; + $removeMethodName = 'remove' . $singular; + + if ($this->isAccessible($reflClass, $addMethodName, 1)) { + $addMethod = $addMethodName; + } + + if ($this->isAccessible($reflClass, $removeMethodName, 1)) { + $removeMethod = $removeMethodName; + } + + if ($addMethod && !$removeMethod) { + throw new InvalidPropertyException(sprintf( + 'Found the public method "%s", but did not find a public "%s" on class %s', + $addMethodName, + $removeMethodName, + $reflClass->getName() + )); + } + + if ($removeMethod && !$addMethod) { + throw new InvalidPropertyException(sprintf( + 'Found the public method "%s", but did not find a public "%s" on class %s', + $removeMethodName, + $addMethodName, + $reflClass->getName() + )); + } + + if ($addMethod && $removeMethod) { + break; + } + } + } + } + + // Collection with matching adder/remover in $objectOrArray + if ($addMethod && $removeMethod) { + $itemsToAdd = is_object($value) ? clone $value : $value; + $previousValue = $this->readProperty($objectOrArray, $currentIndex); + + if (is_array($previousValue) || $previousValue instanceof Traversable) { + foreach ($previousValue as $previousItem) { + foreach ($value as $key => $item) { + if ($item === $previousItem) { + // Item found, don't add + unset($itemsToAdd[$key]); + + // Next $previousItem + continue 2; + } + } + + // Item not found, remove + $objectOrArray->$removeMethod($previousItem); + } + } + + foreach ($itemsToAdd as $item) { + $objectOrArray->$addMethod($item); + } + } elseif ($reflClass->hasMethod($setter)) { + if (!$reflClass->getMethod($setter)->isPublic()) { + throw new PropertyAccessDeniedException(sprintf('Method "%s()" is not public in class "%s"', $setter, $reflClass->getName())); + } + + $objectOrArray->$setter($value); + } elseif ($reflClass->hasMethod('__set')) { + // needed to support magic method __set + $objectOrArray->$property = $value; + } elseif ($reflClass->hasProperty($property)) { + if (!$reflClass->getProperty($property)->isPublic()) { + throw new PropertyAccessDeniedException(sprintf('Property "%s" is not public in class "%s". Maybe you should create the method "%s()"?', $property, $reflClass->getName(), $setter)); + } + + $objectOrArray->$property = $value; + } elseif (property_exists($objectOrArray, $property)) { + // needed to support \stdClass instances + $objectOrArray->$property = $value; + } else { + throw new InvalidPropertyException(sprintf('Neither element "%s" nor method "%s()" exists in class "%s"', $property, $setter, $reflClass->getName())); + } + } else { + $objectOrArray[$property] = $value; + } + } + + protected function camelize($property) + { + return preg_replace_callback('/(^|_|\.)+(.)/', function ($match) { return ('.' === $match[1] ? '_' : '').strtoupper($match[2]); }, $property); + } + + private function isAccessible(ReflectionClass $reflClass, $methodName, $numberOfRequiredParameters) + { + if ($reflClass->hasMethod($methodName)) { + $method = $reflClass->getMethod($methodName); + + if ($method->isPublic() && $method->getNumberOfRequiredParameters() === $numberOfRequiredParameters) { + return true; + } + } + + return false; + } +} diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/array_get_elem.dot b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/array_get_elem.dot new file mode 100644 index 0000000..3ff5561 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/array_get_elem.dot @@ -0,0 +1,14 @@ +digraph G { + B1 [shape=box,label="implicit return",style=filled] + B2 [shape=box,label="Block (global)",style=filled] + B2 -> B3 + B3 [shape=box,label="Assign (L3)"] + B3 -> B4 + B4 [shape=box,label="if ($x)"] + B4 -> B5 [label="true"] + B4 -> B1 [label="false"] + B6 [shape=box,label="Assign (L3)"] + B6 -> B1 + B5 [shape=box,label="Block of if ($x)"] + B5 -> B6 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/array_get_elem.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/array_get_elem.php new file mode 100644 index 0000000..5081c3b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/array_get_elem.php @@ -0,0 +1,3 @@ + B3 + B3 [shape=box,label="PHPParser_Node_Stmt_Function"] + B3 -> B4 + B4 [shape=box,label="PHPParser_Node_Expr_FuncCall"] + B4 -> B5 + B5 [shape=box,label="PHPParser_Node_Stmt_Class"] + B5 -> B6 + B6 [shape=box,label="PHPParser_Node_Expr_FuncCall"] + B6 -> B7 + B7 [shape=box,label="PHPParser_Node_Stmt_Function"] + B7 -> B8 + B8 [shape=box,label="PHPParser_Node_Expr_FuncCall"] + B8 -> B1 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/global_scope.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/global_scope.php new file mode 100644 index 0000000..9e375f0 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/global_scope.php @@ -0,0 +1,16 @@ + B3 + B4 [shape=box,label="Assign (L5)"] + B4 -> B5 + B5 [shape=box,label="PHPParser_Node_Expr_AssignRef"] + B5 -> B6 + B7 [shape=box,label="Block of if (is_object($objectOrArray))"] + B7 -> B4 + B8 [shape=box,label="Assign (L9)"] + B8 -> B9 + B9 [shape=box,label="if (!array_key_exists($property, $objectOrArray))"] + B9 -> B10 [label="true"] + B9 -> B11 [label="false"] + B12 [shape=box,label="Assign (L11)"] + B12 -> B11 + B11 [shape=box,label="PHPParser_Node_Expr_AssignRef"] + B11 -> B5 + B10 [shape=box,label="Block of if (!array_key_exists($property, $objectOrArray))"] + B10 -> B12 + B13 [shape=box,label="Block of if (is_array($objectOrArray))"] + B13 -> B8 + B14 [shape=box,label="Block of PHPParser_Node_Stmt_Else"] + B14 -> B15 + B15 [shape=box,label="PHPParser_Node_Stmt_Throw"] + B16 [shape=box,label="if (is_object($objectOrArray))"] + B16 -> B7 [label="true"] + B16 -> B17 [label="false"] + B17 [shape=box,label="if (is_array($objectOrArray))"] + B17 -> B13 [label="true"] + B17 -> B14 [label="false"] + B6 [shape=box,label="PHPParser_Node_Expr_PreInc"] + B6 -> B18 + B19 [shape=box,label="Block of PHPParser_Node_Stmt_For"] + B19 -> B16 + B3 [shape=box,label="Assign (L3)"] + B3 -> B18 + B18 [shape=box,label="PHPParser_Node_Stmt_For"] + B18 -> B19 [label="true"] + B18 -> B20 [label="false"] + B20 [shape=box,label="PHPParser_Node_Stmt_Return"] + B20 -> B1 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$getValue.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$getValue.php new file mode 100644 index 0000000..ceab66b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$getValue.php @@ -0,0 +1,21 @@ +length; ++$i) { + if (is_object($objectOrArray)) { + $value = $this->readProperty($objectOrArray, $i); + // arrays need to be treated separately (due to PHP bug?) + // http://bugs.php.net/bug.php?id=52133 + } elseif (is_array($objectOrArray)) { + $property = $this->elements[$i]; + if (!array_key_exists($property, $objectOrArray)) { + $objectOrArray[$property] = $i + 1 < $this->length ? array() : null; + } + $value =& $objectOrArray[$property]; + } else { + throw new UnexpectedTypeException($objectOrArray, 'object or array'); + } + + $objectOrArray =& $value; +} + +return $value; \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$writeProperty_excerpt.dot b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$writeProperty_excerpt.dot new file mode 100644 index 0000000..5ad3aae --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$writeProperty_excerpt.dot @@ -0,0 +1,24 @@ +digraph G { + B1 [shape=box,label="implicit return",style=filled] + B2 [shape=box,label="PHPParser_Node_Stmt_Foreach",style=filled] + B2 -> B3 [label="true"] + B2 -> B1 [label="false"] + B4 [shape=box,label="PHPParser_Node_Stmt_Unset"] + B4 -> B5 + B5 [shape=box,label="PHPParser_Node_Stmt_Continue"] + B5 -> B2 + B6 [shape=box,label="Block of if ($item === $previousItem)"] + B6 -> B4 + B7 [shape=box,label="if ($item === $previousItem)"] + B7 -> B6 [label="true"] + B7 -> B8 [label="false"] + B8 [shape=box,label="PHPParser_Node_Stmt_Foreach"] + B8 -> B9 [label="true"] + B8 -> B10 [label="false"] + B9 [shape=box,label="Block of PHPParser_Node_Stmt_Foreach"] + B9 -> B7 + B10 [shape=box,label="PHPParser_Node_Expr_MethodCall"] + B10 -> B2 + B3 [shape=box,label="Block of PHPParser_Node_Stmt_Foreach"] + B3 -> B8 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$writeProperty_excerpt.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$writeProperty_excerpt.php new file mode 100644 index 0000000..490ae35 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/Regression/symfony_property_util$writeProperty_excerpt.php @@ -0,0 +1,16 @@ + $item) { + if ($item === $previousItem) { + // Item found, don't add + unset($itemsToAdd[$key]); + + // Next $previousItem + continue 2; + } + } + + // Item not found, remove + $objectOrArray->$removeMethod($previousItem); +} diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure.dot b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure.dot new file mode 100644 index 0000000..da00cf0 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure.dot @@ -0,0 +1,9 @@ +digraph G { + B1 [shape=box,label="implicit return",style=filled] + B2 [shape=box,label="Block (global)",style=filled] + B2 -> B3 + B3 [shape=box,label="Assign (L3)"] + B3 -> B4 + B4 [shape=box,label="echo 'foo';"] + B4 -> B1 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure.php new file mode 100644 index 0000000..30d4341 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure.php @@ -0,0 +1,7 @@ + B3 + B4 [shape=box,label="$this"] + B4 -> B1 + B3 [shape=box,label="Block of PHPParser_Node_Expr_Closure"] + B3 -> B4 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure2.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure2.php new file mode 100644 index 0000000..e0c933b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure2.php @@ -0,0 +1,5 @@ + B3 + B4 [shape=box,label="$x"] + B4 -> B5 + B5 [shape=box,label="PHPParser_Node_Expr_Closure"] + B5 -> B6 + B6 [shape=box,label="$y"] + B6 -> B1 + B3 [shape=box,label="Block of PHPParser_Node_Expr_Closure"] + B3 -> B4 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure3.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure3.php new file mode 100644 index 0000000..b97509a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/closure3.php @@ -0,0 +1,11 @@ + B3 + B3 [shape=box,label="echo 'foo';"] + B3 -> B4 + B4 [shape=box,label="PHPParser_Node_Stmt_Do"] + B4 -> B2 [label="true"] + B4 -> B1 [label="false"] +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/do_while.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/do_while.php new file mode 100644 index 0000000..0eeabf8 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/do_while.php @@ -0,0 +1,5 @@ + B3 + B4 [shape=box,label="PHPParser_Node_Stmt_Throw"] + B4 -> B5 [label="exception"] + B5 [shape=box,label="catch RuntimeException"] + B5 -> B6 [label="true"] + B5 -> B7 [label="false"] + B8 [shape=box,label="Block of PHPParser_Node_Stmt_TryCatch"] + B8 -> B4 + B6 [shape=box,label="Block of catch RuntimeException"] + B6 -> B9 + B9 [shape=box,label="echo 'foo';"] + B9 -> B1 + B10 [shape=box,label="Block of catch LogicException"] + B10 -> B9 + B7 [shape=box,label="catch LogicException"] + B7 -> B10 [label="true"] + B11 [shape=box,label="PHPParser_Node_Stmt_TryCatch"] + B11 -> B8 + B3 [shape=box,label="Block of PHPParser_Node_Stmt_Function"] + B3 -> B11 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exception.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exception.php new file mode 100644 index 0000000..e94ee95 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exception.php @@ -0,0 +1,11 @@ + B3 + B3 [shape=box,label="Label D"] + B3 -> B4 + B4 [shape=box,label="Assign (L3)"] + B4 -> B5 + B5 [shape=box,label="PHPParser_Node_Stmt_TryCatch"] + B5 -> B6 + B7 [shape=box,label="PHPParser_Node_Expr_FuncCall"] + B7 -> B8 + B7 -> B9 [label="exception"] + B8 [shape=box,label="Label U"] + B8 -> B10 + B9 [shape=box,label="catch Exception"] + B9 -> B11 [label="true"] + B6 [shape=box,label="Block of PHPParser_Node_Stmt_TryCatch"] + B6 -> B7 + B11 [shape=box,label="Block of catch Exception"] + B11 -> B8 + B10 [shape=box,label="$x"] + B10 -> B1 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exception2.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exception2.php new file mode 100644 index 0000000..03f3eb1 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exception2.php @@ -0,0 +1,9 @@ + B3 + B4 [shape=box,label="PHPParser_Node_Expr_Exit"] + B4 -> B1 + B5 [shape=box,label="Block of PHPParser_Node_Stmt_Case"] + B5 -> B4 + B3 [shape=box,label="PHPParser_Node_Stmt_Case"] + B3 -> B5 [label="true"] + B3 -> B6 [label="false"] + B6 [shape=box,label="PHPParser_Node_Stmt_Case"] + B6 -> B7 [label="true"] + B6 -> B8 [label="false"] + B9 [shape=box,label="PHPParser_Node_Expr_Exit"] + B9 -> B1 + B7 [shape=box,label="Block of PHPParser_Node_Stmt_Case"] + B7 -> B9 + B8 [shape=box,label="PHPParser_Node_Stmt_Case"] + B8 -> B10 [label="true"] + B8 -> B1 [label="false"] + B11 [shape=box,label="echo 'foo';"] + B11 -> B12 + B12 [shape=box,label="PHPParser_Node_Stmt_Break"] + B12 -> B1 + B10 [shape=box,label="Block of PHPParser_Node_Stmt_Case"] + B10 -> B11 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exit_die.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exit_die.php new file mode 100644 index 0000000..43a4466 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/exit_die.php @@ -0,0 +1,13 @@ + B3 + B4 [shape=box,label="echo 'foo';"] + B4 -> B5 + B5 [shape=box,label="PHPParser_Node_Expr_PostInc"] + B5 -> B6 + B7 [shape=box,label="Block of PHPParser_Node_Stmt_For"] + B7 -> B4 + B3 [shape=box,label="Assign (L3)"] + B3 -> B6 + B6 [shape=box,label="PHPParser_Node_Stmt_For"] + B6 -> B7 [label="true"] + B6 -> B1 [label="false"] +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/for.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/for.php new file mode 100644 index 0000000..e3807db --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/for.php @@ -0,0 +1,5 @@ + B3 [label="true"] + B2 -> B1 [label="false"] + B4 [shape=box,label="echo $foo;"] + B4 -> B2 + B3 [shape=box,label="Block of PHPParser_Node_Stmt_Foreach"] + B3 -> B4 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/foreach.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/foreach.php new file mode 100644 index 0000000..dbf78a9 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/foreach.php @@ -0,0 +1,6 @@ + B3 + B4 [shape=box,label="Assign (L4)"] + B4 -> B1 + B4 -> B5 [label="exception"] + B5 [shape=box,label="catch Exception"] + B5 -> B6 [label="true"] + B3 [shape=box,label="Block of PHPParser_Node_Stmt_TryCatch"] + B3 -> B4 + B6 [shape=box,label="Block of catch Exception"] + B6 -> B1 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/function_call.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/function_call.php new file mode 100644 index 0000000..4a1452e --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/function_call.php @@ -0,0 +1,5 @@ + B3 + B4 [shape=box,label="echo 'foO';"] + B4 -> B1 + B3 [shape=box,label="Block of PHPParser_Node_Stmt_Function"] + B3 -> B4 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/function_with_default_param.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/function_with_default_param.php new file mode 100644 index 0000000..82e2355 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/function_with_default_param.php @@ -0,0 +1,5 @@ + B3 + B3 [shape=box,label="PHPParser_Node_Stmt_Goto"] + B3 -> B4 + B4 [shape=box,label="Label foo"] + B4 -> B5 + B6 [shape=box,label="echo 'bar';"] + B6 -> B4 + B5 [shape=box,label="echo 'baz';"] + B5 -> B1 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/goto.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/goto.php new file mode 100644 index 0000000..a90f9e4 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/goto.php @@ -0,0 +1,7 @@ + B3 [label="true"] + B2 -> B4 [label="false"] + B5 [shape=box,label="echo 'foo';"] + B5 -> B1 + B3 [shape=box,label="Block of if ($foo === 'foo')"] + B3 -> B5 + B6 [shape=box,label="echo 'bar';"] + B6 -> B1 + B4 [shape=box,label="Block of PHPParser_Node_Stmt_Else"] + B4 -> B6 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/if_else.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/if_else.php new file mode 100644 index 0000000..f962501 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/if_else.php @@ -0,0 +1,7 @@ + B3 + B4 [shape=box,label="echo 'foo';"] + B4 -> B5 + B5 [shape=box,label="echo 'boo';"] + B5 -> B1 + B6 [shape=box,label="Block of if ($a)"] + B6 -> B4 + B7 [shape=box,label="echo 'bar';"] + B7 -> B5 + B8 [shape=box,label="Block of if ($b)"] + B8 -> B7 + B9 [shape=box,label="echo 'baz';"] + B9 -> B5 + B10 [shape=box,label="Block of PHPParser_Node_Stmt_Else"] + B10 -> B9 + B3 [shape=box,label="if ($a)"] + B3 -> B6 [label="true"] + B3 -> B11 [label="false"] + B11 [shape=box,label="if ($b)"] + B11 -> B8 [label="true"] + B11 -> B10 [label="false"] +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/if_elseif_else.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/if_elseif_else.php new file mode 100644 index 0000000..4316e57 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/if_elseif_else.php @@ -0,0 +1,12 @@ + B3 + B4 [shape=box,label="PHPParser_Node_Stmt_Use"] + B4 -> B5 + B5 [shape=box,label="PHPParser_Node_Stmt_Use"] + B5 -> B6 + B6 [shape=box,label="PHPParser_Node_Stmt_Use"] + B6 -> B7 + B7 [shape=box,label="PHPParser_Node_Stmt_Class"] + B7 -> B1 + B3 [shape=box,label="Block of PHPParser_Node_Stmt_Namespace"] + B3 -> B4 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/namespace.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/namespace.php new file mode 100644 index 0000000..5c2dd61 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/namespace.php @@ -0,0 +1,30 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Foo\Bar; + +use Foo; +use Bar; +use Baz, Boo; + +class FooBar +{ + public function foo() + { + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_exception_handlers.dot b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_exception_handlers.dot new file mode 100644 index 0000000..e3a5e59 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_exception_handlers.dot @@ -0,0 +1,22 @@ +digraph G { + B1 [shape=box,label="implicit return",style=filled] + B2 [shape=box,label="PHPParser_Node_Stmt_TryCatch",style=filled] + B2 -> B3 + B4 [shape=box,label="PHPParser_Node_Stmt_Throw"] + B4 -> B5 [label="exception"] + B5 [shape=box,label="catch RuntimeException"] + B5 -> B6 [label="true"] + B5 -> B7 [label="false"] + B8 [shape=box,label="Block of PHPParser_Node_Stmt_TryCatch"] + B8 -> B4 + B6 [shape=box,label="Block of catch RuntimeException"] + B6 -> B1 + B9 [shape=box,label="PHPParser_Node_Stmt_TryCatch"] + B9 -> B8 + B7 [shape=box,label="catch LogicException"] + B7 -> B10 [label="true"] + B3 [shape=box,label="Block of PHPParser_Node_Stmt_TryCatch"] + B3 -> B9 + B10 [shape=box,label="Block of catch LogicException"] + B10 -> B1 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_exception_handlers.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_exception_handlers.php new file mode 100644 index 0000000..b53a5a2 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_exception_handlers.php @@ -0,0 +1,7 @@ + B3 + B4 [shape=box,label="PHPParser_Node_Stmt_Continue"] + B4 -> B5 + B5 [shape=box,label="PHPParser_Node_Expr_PostInc"] + B5 -> B3 + B6 [shape=box,label="Block of if ($i < 0)"] + B6 -> B4 + B7 [shape=box,label="if ($i < 0)"] + B7 -> B6 [label="true"] + B7 -> B8 [label="false"] + B8 [shape=box,label="if ($j > 5)"] + B8 -> B9 [label="true"] + B8 -> B10 [label="false"] + B11 [shape=box,label="PHPParser_Node_Stmt_Break"] + B11 -> B1 + B9 [shape=box,label="Block of if ($j > 5)"] + B9 -> B11 + B10 [shape=box,label="PHPParser_Node_Stmt_Goto"] + B10 -> B12 + B12 [shape=box,label="Label foo"] + B12 -> B5 + B13 [shape=box,label="Block of PHPParser_Node_Stmt_For"] + B13 -> B7 + B14 [shape=box,label="Assign (L4)"] + B14 -> B15 + B15 [shape=box,label="PHPParser_Node_Stmt_For"] + B15 -> B13 [label="true"] + B15 -> B12 [label="false"] + B16 [shape=box,label="PHPParser_Node_Expr_PostInc"] + B16 -> B15 + B17 [shape=box,label="Block of PHPParser_Node_Stmt_For"] + B17 -> B14 + B3 [shape=box,label="PHPParser_Node_Stmt_For"] + B3 -> B17 [label="true"] + B3 -> B1 [label="false"] +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_for.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_for.php new file mode 100644 index 0000000..bd10e9b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/nested_for.php @@ -0,0 +1,17 @@ + 5) { + break 2; + } + + goto foo; + } + + foo: +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch.dot b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch.dot new file mode 100644 index 0000000..eb41768 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch.dot @@ -0,0 +1,32 @@ +digraph G { + B1 [shape=box,label="implicit return",style=filled] + B2 [shape=box,label="PHPParser_Node_Stmt_Switch",style=filled] + B2 -> B3 + B4 [shape=box,label="PHPParser_Node_Stmt_Return"] + B4 -> B1 + B5 [shape=box,label="Block of PHPParser_Node_Stmt_Case"] + B5 -> B4 + B3 [shape=box,label="PHPParser_Node_Stmt_Case"] + B3 -> B5 [label="true"] + B3 -> B6 [label="false"] + B6 [shape=box,label="PHPParser_Node_Stmt_Case"] + B6 -> B7 [label="true"] + B6 -> B8 [label="false"] + B7 [shape=box,label="Block of PHPParser_Node_Stmt_Case"] + B7 -> B9 + B9 [shape=box,label="Block of PHPParser_Node_Stmt_Case"] + B9 -> B10 + B8 [shape=box,label="PHPParser_Node_Stmt_Case"] + B8 -> B9 [label="true"] + B8 -> B11 [label="false"] + B10 [shape=box,label="echo 'foo';"] + B10 -> B12 + B12 [shape=box,label="PHPParser_Node_Stmt_Break"] + B12 -> B1 + B11 [shape=box,label="PHPParser_Node_Stmt_Case"] + B11 -> B13 + B14 [shape=box,label="echo 'boo';"] + B14 -> B1 + B13 [shape=box,label="Block of PHPParser_Node_Stmt_Case"] + B13 -> B14 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch.php new file mode 100644 index 0000000..be9bb91 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch.php @@ -0,0 +1,14 @@ + B3 + B4 [shape=box,label="PHPParser_Node_Stmt_Break"] + B4 -> B1 + B5 [shape=box,label="Block of if ($a)"] + B5 -> B4 + B6 [shape=box,label="PHPParser_Node_Stmt_Break"] + B6 -> B1 + B7 [shape=box,label="Block of PHPParser_Node_Stmt_Else"] + B7 -> B6 + B8 [shape=box,label="if ($a)"] + B8 -> B5 [label="true"] + B8 -> B7 [label="false"] + B9 [shape=box,label="Block of PHPParser_Node_Stmt_Case"] + B9 -> B8 + B3 [shape=box,label="PHPParser_Node_Stmt_Case"] + B3 -> B9 [label="true"] + B3 -> B10 [label="false"] + B10 [shape=box,label="PHPParser_Node_Stmt_Case"] + B10 -> B11 [label="true"] + B10 -> B1 [label="false"] + B12 [shape=box,label="PHPParser_Node_Stmt_Break"] + B12 -> B1 + B11 [shape=box,label="Block of PHPParser_Node_Stmt_Case"] + B11 -> B12 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch_with_if_else.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch_with_if_else.php new file mode 100644 index 0000000..3399a75 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/switch_with_if_else.php @@ -0,0 +1,13 @@ + B3 [label="true"] + B2 -> B1 [label="false"] + B4 [shape=box,label="echo 'foo';"] + B4 -> B2 + B3 [shape=box,label="Block of PHPParser_Node_Stmt_While"] + B3 -> B4 +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/while.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/while.php new file mode 100644 index 0000000..56369b8 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/Fixture/Integration/while.php @@ -0,0 +1,5 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\ControlFlow; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowAnalysis; +use Scrutinizer\PhpAnalyzer\ControlFlow\GraphReachability; +use JMS\PhpManipulator\PhpParser\BlockNode; + +class GraphReachabilityTest extends \PHPUnit_Framework_TestCase +{ + private $graph; + + public function testCompute() + { + $ast = new BlockNode(array( + $goto = new \PHPParser_Node_Stmt_Goto('foo'), + $echo = new \PHPParser_Node_Stmt_Echo(array(new \PHPParser_Node_Scalar_String('boo'))), + $label = new \PHPParser_Node_Stmt_Label('foo'), + )); + $this->compute($ast); + + $this->assertReachable($ast); + $this->assertReachable($goto); + $this->assertNotReachable($echo); + $this->assertReachable($label); + } + + private function assertReachable(\PHPParser_Node $node) + { + $graphNode = $this->graph->getNode($node); + + $this->assertNotNull($graphNode, 'Graph node does not exist for given AST node.'); + $this->assertTrue($graphNode->hasAttribute(GraphReachability::ATTR_REACHABILITY), 'Reachability attribute does not exist on node.'); + $this->assertSame(GraphReachability::REACHABLE, $graphNode->getAttribute(GraphReachability::ATTR_REACHABILITY), 'Node is not reachable, but was expected to be reachable.'); + } + + private function assertNotReachable(\PHPParser_Node $node) + { + $graphNode = $this->graph->getNode($node); + + $this->assertNotNull($graphNode, 'Graph node does not exist for given AST node.'); + $this->assertTrue($graphNode->hasAttribute(GraphReachability::ATTR_REACHABILITY), 'Reachability attribute does not exist on node.'); + $this->assertSame(GraphReachability::UNREACHABLE, $graphNode->getAttribute(GraphReachability::ATTR_REACHABILITY), 'Node is reachable, but was expected to be unreachable.'); + } + + private function compute(\PHPParser_Node $ast) + { + $r = new GraphReachability($graph = $this->getCfg($ast)); + $r->compute($ast); + } + + private function getCfg(\PHPParser_Node $ast) + { + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NodeConnector()); + $traverser->traverse(array($ast)); + + $cfa = new ControlFlowAnalysis(); + $cfa->process($ast); + + return $this->graph = $cfa->getGraph(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/IntegrationTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/IntegrationTest.php new file mode 100644 index 0000000..6432ce4 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/ControlFlow/IntegrationTest.php @@ -0,0 +1,82 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\ControlFlow; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowAnalysis; +use Scrutinizer\PhpAnalyzer\ControlFlow\GraphvizSerializer; +use JMS\PhpManipulator\PhpParser\BlockNode; +use JMS\PhpManipulator\PhpParser\NormalizingNodeVisitor; +use Symfony\Component\Finder\Finder; + +class IntegrationTest extends \PHPUnit_Framework_TestCase +{ + /** + * @dataProvider getTests + */ + public function testIntegration($sourceFile) + { + $parser = new \PHPParser_Parser(); + $ast = $parser->parse(new \PHPParser_Lexer(file_get_contents($sourceFile))); + + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); + $traverser->addVisitor(new NormalizingNodeVisitor()); + $ast = $traverser->traverse($ast); + + if (count($ast) > 1) { + $ast = array(new BlockNode($ast)); + } + + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NodeConnector()); + $traverser->traverse($ast); // do _NOT_ assign the ast here as it clones the nodes on traversal and leads to problems + + $cfa = new ControlFlowAnalysis(); + $cfa->process($ast[0]); + $cfg = $cfa->getGraph(); + + $serializer = new GraphvizSerializer(); + $dot = $serializer->serialize($cfg); + + $dotFile = substr($sourceFile, 0, -4).'.dot'; + + if (!is_file($dotFile)) { + file_put_contents($dotFile.'.tmp', $dot); + $this->fail(sprintf('Dotfile "%s" does not exist, wrote current output to "%s".', $dotFile, basename($dotFile.'.tmp'))); + } + + $this->assertSame($dot, file_get_contents($dotFile)); + } + + public function getTests() + { + $tests = array(); + + try { + foreach (Finder::create()->in(__DIR__.'/Fixture/Integration/')->name('*.php') as $file) { + $tests[] = array($file->getRealpath()); + } + } catch (\Exception $ex) { + echo 'Error when loading integration tests: '.$ex->getMessage(); + echo '!!! No Integration Tests were performed !!!'; + } + + return $tests; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/BinaryJoinOpTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/BinaryJoinOpTest.php new file mode 100644 index 0000000..42e3003 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/BinaryJoinOpTest.php @@ -0,0 +1,75 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow; + +use Scrutinizer\PhpAnalyzer\DataFlow\BinaryJoinOp; + +class BinaryJoinOpTest extends \PHPUnit_Framework_TestCase +{ + public function testApply() + { + $a = $this->createLattice(); + $b = $this->createLattice(); + $c = $this->createLattice(); + $bc = $this->createLattice(); + $abc = $this->createLattice(); + + $callable = function($paramA, $paramB) use ($a, $b, $c, $bc, $abc) { + static $count = -1; + $count += 1; + + switch ($count) { + case 0: + $this->assertSame($b, $paramA); + $this->assertSame($c, $paramB); + + return $bc; + + case 1: + $this->assertSame($a, $paramA); + $this->assertSame($bc, $paramB); + + return $abc; + + default: + $this->fail('Unexpected third call to join operation.'); + } + }; + $callable->bindTo($this); + $op = new BinaryJoinOp($callable); + + $this->assertSame($abc, call_user_func($op, array($a, $b, $c))); + } + + public function testApplyWithOneLattice() + { + $a = $this->createLattice(); + $callable = function() { + $this->fail('Callable was not expected to be called.'); + }; + $callable->bindTo($this); + + $this->assertSame($a, call_user_func(new BinaryJoinOp($callable), array($a))); + } + + private function createLattice() + { + return $this->getMock('Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface'); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/DataFlowAnalysisTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/DataFlowAnalysisTest.php new file mode 100644 index 0000000..ea3fd71 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/DataFlowAnalysisTest.php @@ -0,0 +1,660 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowGraph; +use Scrutinizer\PhpAnalyzer\ControlFlow\GraphEdge; +use Scrutinizer\PhpAnalyzer\ControlFlow\GraphNode; +use Scrutinizer\PhpAnalyzer\DataFlow\BinaryJoinOp; +use Scrutinizer\PhpAnalyzer\DataFlow\BranchedForwardDataFlowAnalysis; +use Scrutinizer\PhpAnalyzer\DataFlow\DataFlowAnalysis; +use Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface; + +class DataFlowAnalysisTest extends \PHPUnit_Framework_TestCase +{ + public function testSimpleIf() + { + // if (a) { b = 1; } else { b = 1; } c = b; + $a = new Variable('a'); + $b = new Variable('b'); + $c = new Variable('c'); + + $inst1 = new BranchInstruction($a); + $inst2 = ArithmeticInstruction::newAssignNumberToVariableInstruction($b, 1); + $inst3 = ArithmeticInstruction::newAssignNumberToVariableInstruction($b, 1); + $inst4 = ArithmeticInstruction::newAssignVariableToVariableInstruction($c, $b); + + $cfg = new ControlFlowGraph($inst1); + $cfg->connectIfNotConnected($inst1, GraphEdge::TYPE_ON_FALSE, $inst2); + $cfg->connectIfNotConnected($inst1, GraphEdge::TYPE_ON_TRUE, $inst3); + $cfg->connectIfNotConnected($inst2, GraphEdge::TYPE_UNCOND, $inst4); + $cfg->connectIfNotConnected($inst3, GraphEdge::TYPE_UNCOND, $inst4); + $n1 = $cfg->getNode($inst1); + $n2 = $cfg->getNode($inst2); + $n3 = $cfg->getNode($inst3); + $n4 = $cfg->getNode($inst4); + + $constProp = new DummyConstPropagation($cfg); + $constProp->analyze(); + + // We cannot conclude anything from if (a). + $this->verifyInHas($n1, $a, null); + $this->verifyInHas($n1, $b, null); + $this->verifyInHas($n1, $c, null); + $this->verifyOutHas($n1, $a, null); + $this->verifyOutHas($n1, $b, null); + $this->verifyOutHas($n1, $c, null); + + // We can conclude b = 1 after the instruction. + $this->verifyInHas($n2, $a, null); + $this->verifyInHas($n2, $b, null); + $this->verifyInHas($n2, $c, null); + $this->verifyOutHas($n2, $a, null); + $this->verifyOutHas($n2, $b, 1); + $this->verifyOutHas($n2, $c, null); + + // Same as above. + $this->verifyInHas($n3, $a, null); + $this->verifyInHas($n3, $b, null); + $this->verifyInHas($n3, $c, null); + $this->verifyOutHas($n3, $a, null); + $this->verifyOutHas($n3, $b, 1); + $this->verifyOutHas($n3, $c, null); + + // After the merge, we should still have b = 1. + $this->verifyInHas($n4, $a, null); + $this->verifyInHas($n4, $b, 1); + $this->verifyInHas($n4, $c, null); + $this->verifyOutHas($n4, $a, null); + // After the instruction, both b and c are 1. + $this->verifyOutHas($n4, $b, 1); + $this->verifyOutHas($n4, $c, 1); + } + + public function testSimpleLoop() + { + // a = 0; do { a = a + 1 } while (b); c = a; + $a = new Variable('a'); + $b = new Variable('b'); + $c = new Variable('c'); + + $inst1 = ArithmeticInstruction::newAssignNumberToVariableInstruction($a, 0); + $inst2 = new ArithmeticInstruction($a, $a, '+', new Number(1)); + $inst3 = new BranchInstruction($b); + $inst4 = ArithmeticInstruction::newAssignVariableToVariableInstruction($c, $a); + + $cfg = new ControlFlowGraph($inst1); + $cfg->connectIfNotConnected($inst1, GraphEdge::TYPE_UNCOND, $inst2); + $cfg->connectIfNotConnected($inst2, GraphEdge::TYPE_UNCOND, $inst3); + $cfg->connectifNotConnected($inst3, GraphEdge::TYPE_ON_TRUE, $inst2); + $cfg->connectIfNotConnected($inst3, GraphEdge::TYPE_ON_FALSE, $inst4); + $n1 = $cfg->getNode($inst1); + $n2 = $cfg->getNode($inst2); + $n3 = $cfg->getNode($inst3); + $n4 = $cfg->getNode($inst4); + + $constProp = new DummyConstPropagation($cfg); + // This will also show that the framework terminates properly. + $constProp->analyze(); + + // a = 0 is the only thing we know. + $this->verifyInHas($n1, $a, null); + $this->verifyInHas($n1, $b, null); + $this->verifyInHas($n1, $c, null); + $this->verifyOutHas($n1, $a, 0); + $this->verifyOutHas($n1, $b, null); + $this->verifyOutHas($n1, $c, null); + + // Nothing is provable in this program, so confirm that we haven't + // erroneously "proven" something. + $this->verifyInHas($n2, $a, null); + $this->verifyInHas($n2, $b, null); + $this->verifyInHas($n2, $c, null); + $this->verifyOutHas($n2, $a, null); + $this->verifyOutHas($n2, $b, null); + $this->verifyOutHas($n2, $c, null); + + $this->verifyInHas($n3, $a, null); + $this->verifyInHas($n3, $b, null); + $this->verifyInHas($n3, $c, null); + $this->verifyOutHas($n3, $a, null); + $this->verifyOutHas($n3, $b, null); + $this->verifyOutHas($n3, $c, null); + + $this->verifyInHas($n4, $a, null); + $this->verifyInHas($n4, $b, null); + $this->verifyInHas($n4, $c, null); + $this->verifyOutHas($n4, $a, null); + $this->verifyOutHas($n4, $b, null); + $this->verifyOutHas($n4, $c, null); + } + + public function testBranchedSimpleIf() + { + // if (a) { a = 0; } else { b = 0; } c = b; + $a = new Variable('a'); + $b = new Variable('b'); + $c = new Variable('c'); + + $inst1 = new BranchInstruction($a); + $inst2 = ArithmeticInstruction::newAssignNumberToVariableInstruction($a, 0); + $inst3 = ArithmeticInstruction::newAssignNumberToVariableInstruction($b, 0); + $inst4 = ArithmeticInstruction::newAssignVariableToVariableInstruction($c, $b); + + $cfg = new ControlFlowGraph($inst1); + $cfg->connectIfNotConnected($inst1, GraphEdge::TYPE_ON_TRUE, $inst2); + $cfg->connectIfNotConnected($inst1, GraphEdge::TYPE_ON_FALSE, $inst3); + $cfg->connectIfNotConnected($inst2, GraphEdge::TYPE_UNCOND, $inst4); + $cfg->connectIfNotConnected($inst3, GraphEdge::TYPE_UNCOND, $inst4); + $n1 = $cfg->getNode($inst1); + $n2 = $cfg->getNode($inst2); + $n3 = $cfg->getNode($inst3); + $n4 = $cfg->getNode($inst4); + + $constProp = new BranchedDummyConstPropagation($cfg); + $constProp->analyze(); + + // We cannot conclude anything from if(a). + $this->verifyInHas($n1, $a, null); + $this->verifyInHas($n1, $b, null); + $this->verifyInHas($n1, $c, null); + + // Nothing is known on the true branch. + $this->verifyInHas($n2, $a, null); + $this->verifyInHas($n2, $b, null); + $this->verifyInHas($n2, $c, null); + + // Verify that we have a = 0 on the false branch. + $this->verifyInHas($n3, $a, 0); + $this->verifyInHas($n3, $b, null); + $this->verifyInHas($n3, $c, null); + + // After the merge we should still have a = 0. + $this->verifyInHas($n4, $a, 0); + } + + private function verifyInHas(GraphNode $node, Variable $var, $constant) + { + $fState = $node->getAttribute(DataFlowAnalysis::ATTR_FLOW_STATE_IN); + + if (null === $constant) { + $this->assertFalse(isset($fState->constMap[$var])); + } else { + $this->assertTrue(isset($fState->constMap[$var])); + $this->assertSame($constant, $fState->constMap[$var]); + } + } + + private function verifyOutHas(GraphNode $node, Variable $var, $constant) + { + $fState = $node->getAttribute(DataFlowAnalysis::ATTR_FLOW_STATE_OUT); + + if (null === $constant) { + $this->assertFalse(isset($fState->constMap[$var])); + } else { + $this->assertTrue(isset($fState->constMap[$var])); + $this->assertSame($constant, $fState->constMap[$var]); + } + } +} + +abstract class Value +{ + public function isNumber() + { + return $this instanceof Number; + } + + public function isVariable() + { + return $this instanceof Variable; + } + + public function equals($that) + { + return $this === $that; + } +} + +class Variable extends Value +{ + private $name; + + public function __construct($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function equals($that) + { + if (!$that instanceof Variable) { + return false; + } + + return $that->name === $this->name; + } + + public function __toString() + { + return $this->name; + } +} + +class Number extends Value +{ + private $value; + + public function __construct($v) + { + $this->value = (integer) $v; + } + + public function getValue() + { + return $this->value; + } + + public function __toString() + { + return (string) $this->value; + } +} + +abstract class Instruction +{ + private $order; + + public function isArithmetic() + { + return $this instanceof ArithmeticInstruction; + } + + public function isBranch() + { + return $this instanceof BranchInstruction; + } +} + +class ArithmeticInstruction extends Instruction +{ + private $operation; + private $operand1; + private $operand2; + private $result; + + public function __construct(Variable $res, Value $op1, $o, Value $op2) + { + $this->result = $res; + $this->operand1 = $op1; + $this->operand2 = $op2; + $this->operation = $o; + } + + public function getOperator() + { + return $this->operation; + } + + public function setOperator($op) + { + $this->operation = $op; + } + + public function getOperand1() + { + return $this->operand1; + } + + public function setOperand1(Value $operand1) + { + $this->operand1 = $operand1; + } + + public function getOperand2() + { + return $this->operand2; + } + + public function setOperand2(Value $operand2) + { + $this->operand2 = $operand2; + } + + public function getResult() + { + return $this->result; + } + + public function setResult(Variable $result) + { + $this->result = $result; + } + + public function __toString() + { + $str = ''; + $str .= $this->result; + $str .= ' = '; + $str .= $this->operand1; + $str .= $this->operation; + $str .= $this->operand2; + + return $str; + } + + public static function newAssignNumberToVariableInstruction(Variable $res, $num) + { + return new ArithmeticInstruction($res, new Number($num), '+', new Number(0)); + } + + public static function newAssignVariableToVariableInstruction(Variable $lhs, Variable $rhs) + { + return new ArithmeticInstruction($lhs, $rhs, '+', new Number(0)); + } +} + +class BranchInstruction extends Instruction { + private $condition; + + public function __construct(Value $cond) + { + $this->condition = $cond; + } + + public function getCondition() + { + return $this->condition; + } + + public function setCondition(Value $condition) + { + $this->condition = $condition; + } +} + +/** + * A lattice to represent constant states. Each variable of the program will + * have a lattice defined as: + * + *

    + *        TOP
    + *   / / |         \
    + *  0  1 2 3 ..... MAX_VALUE
    + *  \  \ |         /
    + *       BOTTOM
    + * 
    + * + * Where BOTTOM represents the variable is not a constant. + *

    + * This class will represent a product lattice of each variable's lattice. The + * whole lattice is store in a {@code HashMap}. If variable {@code x} is + * defined to be constant 10. The map will contain the value 10 with the + * variable {@code x} as key. Otherwise, {@code x} is not a constant. + */ +class ConstPropLatticeElement implements LatticeElementInterface +{ + public $constMap; + public $isTop; + + public function __construct($isTop = false) + { + $this->isTop = (boolean) $isTop; + $this->constMap = new \SplObjectStorage(); + } + + public function __clone() + { + $constMap = new \SplObjectStorage(); + foreach ($this->constMap as $var) { + $constMap[$var] = $this->constMap[$var]; + } + $this->constMap = $constMap; + } + + public function __toString() + { + if ($this->isTop) { + return 'TOP'; + } + + $str = '{'; + foreach ($this->constMap as $var) { + $str .= $var; + $str .= '='; + $str .= $this->constMap[$var]; + $str .= ' '; + } + $str .= '}'; + + return $str; + } + + public function equals(LatticeElementInterface $that) + { + if (!$that instanceof ConstPropLatticeElement) { + return false; + } + + if ($that->isTop !== $this->isTop) { + return false; + } + + foreach ($this->constMap as $var) { + if (!isset($that->constMap[$var])) { + return false; + } + + if ($this->constMap[$var] !== $that->constMap[$var]) { + return false; + } + } + + foreach ($that->constMap as $var) { + if (!isset($this->constMap[$var])) { + return false; + } + + if ($this->constMap[$var] !== $that->constMap[$var]) { + return false; + } + } + + return true; + } +} + +class ConstPropJoinOp +{ + private $binOp; + + public function __construct() + { + $this->binOp = new BinaryJoinOp(array($this, 'applyBinary')); + } + + public function __invoke(array $values) + { + return call_user_func($this->binOp, $values); + } + + public function applyBinary(LatticeElementInterface $a, LatticeElementInterface $b) + { + $result = new ConstPropLatticeElement(); + + if ($a->isTop) { + return clone $a; + } + + if ($b->isTop) { + return clone $b; + } + + foreach ($a->constMap as $var) { + if (isset($b->constMap[$var])) { + $number = $b->constMap[$var]; + + if ($a->constMap[$var] === $number) { + $result->constMap[$var] = $number; + } + } + } + + return $result; + } +} + +class DummyConstPropagation extends DataFlowAnalysis +{ + public function __construct(ControlFlowGraph $cfg) + { + parent::__construct($cfg, new ConstPropJoinOp()); + } + + protected function isForward() + { + return true; + } + + protected function flowThrough($node, LatticeElementInterface $input) + { + if (!$node instanceof Instruction) { + throw new \InvalidArgumentException('$node must be an instance of Instruction.'); + } + + if ($node->isBranch()) { + return clone $input; + } + + return self::flowThroughArithmeticInstruction($node, $input); + } + + protected function createEntryLattice() + { + return new ConstPropLatticeElement(); + } + + protected function createInitialEstimateLattice() + { + return new ConstPropLatticeElement(true); + } + + public static function flowThroughArithmeticInstruction(ArithmeticInstruction $aInst, ConstPropLatticeElement $input) + { + $out = clone $input; + + // Try to see if left is a number. If it is a variable, it might already + // be a constant coming in. + $leftConst = null; + if ($aInst->getOperand1()->isNumber()) { + $leftConst = $aInst->getOperand1()->getValue(); + } else { + if (isset($input->constMap[$aInst->getOperand1()])) { + $leftConst = $input->constMap[$aInst->getOperand1()]; + } + } + + // Do the same thing to the right. + $rightConst = null; + if ($aInst->getOperand2()->isNumber()) { + $rightConst = $aInst->getOperand2()->getValue(); + } else { + if (isset($input->constMap[$aInst->getOperand2()])) { + $rightConst = $input->constMap[$aInst->getOperand2()]; + } + } + + // If both are known constants, we can perform the operation. + if (null !== $leftConst && null !== $rightConst) { + $constResult = null; + switch ($aInst->getOperator()) { + case '+': + $constResult = $leftConst + $rightConst; + break; + + case '-': + $constResult = $leftConst - $rightConst; + break; + + case '*': + $constResult = $leftConst * $rightConst; + break; + + case '/': + $constResult = $leftConst / $rightConst; + break; + } + + $out->constMap[$aInst->getResult()] = $constResult; + } else { + unset($out->constMap[$aInst->getResult()]); + } + + return $out; + } +} + +class BranchedDummyConstPropagation extends BranchedForwardDataFlowAnalysis +{ + public function __construct(ControlFlowGraph $cfg) + { + parent::__construct($cfg, new ConstPropJoinOp()); + } + + protected function branchedFlowThrough($node, LatticeElementInterface $input) + { + $result = array(); + $outEdges = $this->cfg->getOutEdges($node); + + if ($node->isArithmetic()) { + assert(count($outEdges) < 2); + + $aResult = DummyConstPropagation::flowThroughArithmeticInstruction($node, $input); + foreach ($outEdges as $stuff) { + $result[] = $aResult; + } + } else { + foreach ($outEdges as $branch) { + $edgeResult = clone $input; + if ($branch->getType() === GraphEdge::TYPE_ON_FALSE + && $node->getCondition()->isVariable()) { + $edgeResult->constMap[$node->getCondition()] = 0; + } + + $result[] = $edgeResult; + } + } + + return $result; + } + + protected function createEntryLattice() + { + return new ConstPropLatticeElement(); + } + + protected function createInitialEstimateLattice() + { + return new ConstPropLatticeElement(true); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/BitSetTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/BitSetTest.php new file mode 100644 index 0000000..404774b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/BitSetTest.php @@ -0,0 +1,101 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\LiveVariables; + +use Scrutinizer\PhpAnalyzer\DataFlow\LiveVariableAnalysis\BitSet; + +class BitSetTest extends \PHPUnit_Framework_TestCase +{ + private $set; + + public function testSet() + { + $this->assertBits('00000'); + $this->set->set(1); + $this->assertBits('01000'); + $this->set->set(4); + $this->assertBits('01001'); + } + + public function testPerformOr() + { + $set = new BitSet(5); + $set->set(2); + $this->assertBits('00100', $set); + + $this->set->set(1); + $this->assertBits('01000'); + + $this->set->performOr($set); + $this->assertBits('01100'); + $this->assertBits('00100', $set); + } + + public function testAndNot() + { + $set = new BitSet(5); + $set->set(4); + $this->assertBits('00001', $set); + + $this->set->set(4); + $this->set->set(1); + $this->assertBits('01001'); + + $this->set->andNot($set); + $this->assertBits('01000'); + $this->assertBits('00001', $set); + } + + public function testEquals1() + { + $this->assertFalse($this->set->equals(new BitSet(1))); + } + + public function testEquals2() + { + $set = new BitSet(5); + $set->set(1); + $this->set->set(1); + + $this->assertTrue($this->set->equals($set)); + } + + public function testEquals3() + { + $set = new BitSet(5); + $set->set(2); + + $this->assertFalse($this->set->equals($set)); + } + + public function testCount() + { + $this->assertEquals(5, count($this->set)); + } + + private function assertBits($bits, BitSet $set = null) + { + $this->assertSame($bits, (string) ($set ?: $this->set)); + } + + protected function setUp() + { + $this->set = new BitSet(5); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/LiveVariableLatticeTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/LiveVariableLatticeTest.php new file mode 100644 index 0000000..f690338 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/LiveVariableLatticeTest.php @@ -0,0 +1,65 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\LiveVariables; + +use Scrutinizer\PhpAnalyzer\DataFlow\LiveVariableAnalysis\LiveVariableLattice; + +class LiveVariableLatticeTest extends \PHPUnit_Framework_TestCase +{ + private $lattice; + + public function testEquals() + { + $lattice = new LiveVariableLattice(5); + + $mock1 = $this->getMock('Scrutinizer\PhpAnalyzer\DataFlow\LiveVariableAnalysis\BitSet'); + $mock2 = $this->getMock('Scrutinizer\PhpAnalyzer\DataFlow\LiveVariableAnalysis\BitSet'); + + $mock1->expects($this->once()) + ->method('equals') + ->with($mock2) + ->will($this->returnValue(true)); + + $this->lattice->liveSet = $mock1; + $lattice->liveSet = $mock2; + + $this->assertTrue($this->lattice->equals($lattice)); + } + + public function testEquals2() + { + $lattice = $this->getMock('Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface'); + + $this->assertFalse($this->lattice->equals($lattice)); + } + + public function testClone() + { + $lattice = clone $this->lattice; + $this->assertNotSame($this->lattice->liveSet, $lattice->liveSet); + + $lattice->liveSet->set(1); + $this->assertFalse($this->lattice->liveSet->equals($lattice->liveSet)); + } + + protected function setUp() + { + $this->lattice = new LiveVariableLattice(5); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/LiveVariablesAnalysisTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/LiveVariablesAnalysisTest.php new file mode 100644 index 0000000..a15f81b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/LiveVariables/LiveVariablesAnalysisTest.php @@ -0,0 +1,187 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\LiveVariables; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowAnalysis; +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowGraph; +use Scrutinizer\PhpAnalyzer\DataFlow\DataFlowAnalysis; +use JMS\PhpManipulator\PhpParser\NormalizingNodeVisitor; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\SyntacticScopeCreator; +use Scrutinizer\PhpAnalyzer\DataFlow\LiveVariableAnalysis\LiveVariablesAnalysis; + +class LiveVariablesAnalysisTest extends \PHPUnit_Framework_TestCase +{ + /** @var LiveVariablesAnalysis */ + private $liveness; + + public function testStraightLine() + { + // A sample of simple straight line of code with different liveness changes. + $this->assertNotLiveBeforeX('X: $a = null;', 'a'); + $this->assertNotLiveAfterX('X: $a = null;', 'a'); + $this->assertNotLiveAfterX('X: $a = "foo";', 'a'); + $this->assertLiveAfterX('X: $a = 1; echo $a;', 'a'); +// $this->assertNotLiveBeforeX('X: $a = 1; echo $a;', 'a'); + $this->assertLiveBeforeX('$a = null; X: $a;', 'a'); + $this->assertLiveBeforeX('$a = null; X: $a = $a + 1;', 'a'); + $this->assertLiveBeforeX('$a = null; X: $a++;', 'a'); + $this->assertNotLiveAfterX('$a = $b = null; X: $b($a); $b();', 'a'); + $this->assertLiveBeforeX('$a = $b = null; X: $b($a);', 'b'); + } + + public function testProperties() + { + // Reading property of a local variable makes that variable live. + $this->assertLiveBeforeX('$a = $b = null; X: $a->p;', 'a'); + + // Assigning to a property doesn't kill "a", it makes it live instead. + $this->assertLiveBeforeX('$a = $b = null; X: $a->p = 1; $b();', 'a'); + $this->assertLiveBeforeX('$a = $b = null; X: $a->p->q = 1; $b();', 'a'); + + // An "a" in a different context. + $this->assertNotLiveAfterX('$a = $b = null; X: $b->p->q->a = 1;', 'a'); + + $this->assertLiveBeforeX('$a = $b = null; X: $b->p->q = $a;', 'a'); + } + + public function testConditions() + { + // Reading the condition makes the variable live. + $this->assertLiveBeforeX('$a = $b = null; X: if ($a) { }', 'a'); + $this->assertLiveBeforeX('$a = $b = null; X: if ($a || $b) {}', 'a'); + $this->assertLiveBeforeX('$a = $b = null; X: if ($b || $a) {}', 'a'); + $this->assertLiveBeforeX('$a = $b = null; X: if ($b || $b($a)) { }', 'a'); + $this->assertNotLiveAfterX('$a = $b = null; X: $b(); if ($a) { }', 'b'); + + // We can kill within a condition as well. +// $this->assertNotLiveAfterX('$a = $b = null; X: $a(); if ($a = $b) { } $a();', 'a'); + } + + private function assertNotLiveBeforeX($src, $var) + { + $state = $this->getFlowStateAtX($src); + + $this->assertNotNull($state, 'Label X should be in the input program.'); + $this->assertFalse($state['in']->isLive($this->liveness->getVarIndex($var)), 'Variable '.$var.' should not be live before X.'); + } + + private function assertNotLiveAfterX($src, $var) + { + $state = $this->getFlowStateAtX($src); + + $this->assertNotNull($state, 'Label X should be in the input program.'); + $this->assertFalse($state['out']->isLive($this->liveness->getVarIndex($var)), 'Variable "'.$var.'" should not be live after X.'); + } + + private function assertLiveBeforeX($src, $var) + { + $state = $this->getFlowStateAtX($src); + + $this->assertNotNull($state, 'The input program should contain label X.'); + $this->assertTrue($state['in']->isLive($this->liveness->getVarIndex($var)), 'Variable '.$var.' should be live before X.'); + } + + private function assertLiveAfterX($src, $var) + { + $state = $this->getFlowStateAtX($src); + + $this->assertNotNull($state, 'The input program should contain label X.'); + $this->assertTrue($state['out']->isLive($this->liveness->getVarIndex($var)), 'Variable '.$var.' should be live after X.'); + } + + private function getFlowStateAtX($src, ControlFlowGraph $cfg = null) + { + if (is_string($src)) { + $this->liveness = $this->computeLiveness($src); + + $cfg = $this->liveness->getControlFlowGraph(); + $node = $cfg->getEntryPoint()->getAstNode(); + } else if ($src instanceof \PHPParser_Node) { + assert(null !== $cfg); + $node = $src; + } else { + throw new \InvalidArgumentException('Invalid arguments passed.'); + } + + if ($node instanceof \PHPParser_Node_Stmt_Label) { + if ($node->name === 'X') { + $graphNode = $cfg->getNode($node->getAttribute('next')); + + return array('in' => $graphNode->getAttribute(DataFlowAnalysis::ATTR_FLOW_STATE_IN), + 'out' => $graphNode->getAttribute(DataFlowAnalysis::ATTR_FLOW_STATE_OUT)); + } + } + + foreach ($node as $subNode) { + if (is_array($subNode)) { + foreach ($subNode as $aSubNode) { + if (!$aSubNode instanceof \PHPParser_Node) { + continue; + } + + $state = $this->getFlowStateAtX($aSubNode, $cfg); + if (null !== $state) { + return $state; + } + } + + continue; + } else if (!$subNode instanceof \PHPParser_Node) { + continue; + } + + $state = $this->getFlowStateAtX($subNode, $cfg); + if (null !== $state) { + return $state; + } + } + + return null; + } + + private function computeLiveness($src) + { + $src = 'parse($lexer); + + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); + $traverser->addVisitor(new NormalizingNodeVisitor()); + $ast = $traverser->traverse($ast); + + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NodeConnector()); + $traverser->traverse($ast); + + $scopeCreator = new SyntacticScopeCreator(); + $scope = $scopeCreator->createScope($ast[0]->stmts[0], new Scope($ast[0])); + + $cfa = new ControlFlowAnalysis(); + $cfa->process($ast[0]->stmts[0]); + $cfg = $cfa->getGraph(); + + $lva = new LiveVariablesAnalysis($cfg, $scope); + $lva->analyze(); + + return $lva; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ArrayFunctionInterpreterTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ArrayFunctionInterpreterTest.php new file mode 100644 index 0000000..3fc7ffc --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/ArrayFunctionInterpreterTest.php @@ -0,0 +1,269 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter\ArrayFunctionInterpreter; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; + +class ArrayFunctionInterpreterTest extends \PHPUnit_Framework_TestCase +{ + private $registry; + private $interpreter; + + /** + * @dataProvider getArrayPopTests + */ + public function testArrayPop($inputType, $expectedType) + { + $this->assertReturn($this->createFunction('array_pop'), + array($inputType), + $expectedType); + } + + public function getArrayPopTests() + { + $tests = array(); + + $tests[] = array('array', 'unknown'); + $tests[] = array('array', 'integer|null'); + $tests[] = array('array', 'integer|string|null'); + + return $tests; + } + + /** + * @dataProvider getArrayChangeKeyCaseTests + */ + public function testArrayChangeKeyCase($inputType, $expectedType) + { + $this->assertReturn($this->createFunction('array_change_key_case'), + array($inputType), + $expectedType); + } + + public function getArrayChangeKeyCaseTests() + { + $tests = array(); + + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('array|integer', 'array'); + + return $tests; + } + + /** + * @dataProvider getArrayKeysTests + */ + public function testArrayKeys($inputType, $expectedType) + { + $this->assertReturn($this->createFunction('array_keys'), + array($inputType), + $expectedType); + } + + public function getArrayKeysTests() + { + $tests = array(); + + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('array>', 'array'); + $tests[] = array('array|array>', 'array'); + $tests[] = array('array|string', 'array'); + + return $tests; + } + + /** + * @dataProvider getArrayValuesTests + */ + public function testArrayValues($inputType, $expectedType) + { + $this->assertReturn($this->createFunction('array_values'), + array($inputType), + $expectedType); + } + + public function getArrayValuesTests() + { + $tests = array(); + + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('array>', 'array>'); + $tests[] = array('array|array>', 'array>'); + $tests[] = array('array|integer|string', 'array'); + + return $tests; + } + + /** + * @dataProvider getArrayUniqueTests + */ + public function testArrayUnique($inputType, $expectedType) + { + $this->assertReturn($this->createFunction('array_unique'), + array($inputType), + $expectedType); + } + + public function getArrayUniqueTests() + { + $tests = array(); + + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('array|string', 'array'); + $tests[] = array('array|array', 'array|array'); + + return $tests; + } + + /** + * @dataProvider getCurrentAndSimilarTests + */ + public function testCurrentAndSimilar($inputType, $expectedType) + { + $this->assertReturn('current', array($inputType), $expectedType); + $this->assertreturn('pos', array($inputType), $expectedType); + $this->assertreturn('next', array($inputType), $expectedType); + $this->assertreturn('prev', array($inputType), $expectedType); + $this->assertreturn('reset', array($inputType), $expectedType); + $this->assertreturn('end', array($inputType), $expectedType); + } + + public function getCurrentAndSimilarTests() + { + $tests = array(); + + $tests[] = array('array', 'unknown'); + $tests[] = array('array', 'string|false'); + $tests[] = array('array', 'string|integer|false'); + $tests[] = array('array|array', 'string|double|false'); + $tests[] = array('string', null); + $tests[] = array('string|integer', null); + + return $tests; + } + + /** + * @dataProvider getArrayMergeReplaceTests + */ + public function testArrayMergeReplace($inputTypes, $expectedType) + { + $this->assertReturn('array_merge', $inputTypes, $expectedType); + $this->assertReturn('array_replace', $inputTypes, $expectedType); + } + + public function getArrayMergeReplaceTests() + { + $tests = array(); + + $tests[] = array(array(), 'null'); + $tests[] = array(array('array'), 'array'); + $tests[] = array(array('array', 'array'), 'array'); + $tests[] = array(array('array|array>', 'array>'), 'array|object>'); + + return $tests; + } + + /** + * @dataProvider getArrayPadTests + */ + public function testArrayPad($inputType, $paddingType, $expectedType) + { + $this->assertReturn('array_pad', array($inputType, 'none', $paddingType), $expectedType); + } + + public function getArrayPadTests() + { + $tests = array(); + + $tests[] = array('array', 'double', 'array'); + $tests[] = array('array', 'string', 'array'); + $tests[] = array('array', 'string', 'array'); + $tests[] = array('array|array', 'string', 'array'); + + return $tests; + } + + /** + * @dataProvider getArraySearchTests + */ + public function testArraySearch($inputType, $expectedType) + { + $this->assertReturn('array_search', array('null', $inputType), $expectedType); + } + + public function getArraySearchTests() + { + $tests = array(); + + $tests[] = array('array', 'string|integer|false'); + $tests[] = array('array', 'integer|false'); + $tests[] = array('array|array', 'string|false'); + + return $tests; + } + + public function testUnknownFunction() + { + $this->assertNull($this->interpreter->getPreciserFunctionReturnTypeKnowingArguments( + $this->createFunction('foo'), array(), array())); + } + + private function createFunction($name, $returnType = 'all') + { + $func = new GlobalFunction($name); + $func->setReturnType($this->registry->resolveType($returnType)); + + return $func; + } + + private function assertReturn($function, array $inputTypes, $expectedType) + { + if (is_string($function)) { + $function = $this->createFunction($function); + } + + foreach ($inputTypes as &$type) { + $type = $this->registry->resolveType($type); + } + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($function, array(), $inputTypes); + + if (null === $expectedType) { + $this->assertNull($restrictedType); + } else { + $expectedType = $this->registry->resolveType($expectedType); + + $this->assertNotNull($restrictedType); + $this->assertTrue($expectedType->equals($restrictedType), 'Failed to assert that "'.$restrictedType.'" equals expected type "'.$expectedType."'."); + } + } + + protected function setUp() + { + $this->registry = new TypeRegistry(); + $this->interpreter = new ArrayFunctionInterpreter($this->registry); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/CoreFunctionInterpreterTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/CoreFunctionInterpreterTest.php new file mode 100644 index 0000000..fb3c92b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/FunctionInterpreter/CoreFunctionInterpreterTest.php @@ -0,0 +1,175 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter\CoreFunctionInterpreter; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; + +class CoreFunctionInterpreterTest extends \PHPUnit_Framework_TestCase +{ + /** @var TypeRegistry */ + private $registry; + + /** @var CoreFunctionInterpreter */ + private $interpreter; + + public function testReturnsNullForUnknownFunction() + { + $this->assertNull($this->interpreter->getPreciserFunctionReturnTypeKnowingArguments( + new GlobalFunction('fofoofofofodkfjkdfkdjfkd'), array(), array())); + } + + public function testUnserialize() + { + $this->assertTypeEquals('unknown', $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments( + new GlobalFunction('unserialize'), array(), array())); + } + + /** + * @dataProvider getMinMaxTests + */ + public function testMinMax(array $passedTypes, $expectedType) + { + $resolvedTypes = array_map(array($this->registry, 'resolveType'), $passedTypes); + + $max = new GlobalFunction('max'); + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($max, array(), $resolvedTypes); + $this->assertTypeEquals($expectedType, $restrictedType); + + $min = new GlobalFunction('min'); + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($min, array(), $resolvedTypes); + $this->assertTypeEquals($expectedType, $restrictedType); + } + + public function getMinMaxTests() + { + $tests = array(); + + // If a single array is passed, the highest/lowest value in that array is returned. + $tests[] = array(array('array'), 'unknown'); + $tests[] = array(array('array'), 'integer'); + $tests[] = array(array('array>'), 'object'); + $tests[] = array(array('string'), null); + + // If multiple values are passed, one of these values will be returned. So, + // we need to built a union over these types. + $tests[] = array(array('integer', 'string'), 'integer|string'); + $tests[] = array(array('array', 'string'), 'array|string'); // Technically, this will always return an array. + // As an array is always greater than a string. We should + // cover this at some point. + $tests[] = array(array('boolean', 'integer'), 'boolean|integer'); + + return $tests; + } + + public function testVersionCompare() + { + $f = new GlobalFunction('version_compare'); + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($f, array(), array()); + $this->assertTypeEquals('integer|boolean', $restrictedType); + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($f, array(), array(null)); + $this->assertTypeEquals('integer|boolean', $restrictedType); + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($f, array(), array(null, null)); + $this->assertTypeEquals('integer', $restrictedType); + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($f, array(), array(null, null, null)); + $this->assertTypeEquals('boolean', $restrictedType); + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($f, array(), array(null, null, null, null)); + $this->assertTypeEquals('integer|boolean', $restrictedType); + } + + public function testVarExport() + { + $f = new GlobalFunction('var_export'); + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments( + $f, + array(null, new \PHPParser_Node_Expr_ConstFetch(new \PHPParser_Node_Name(array('true')))), + array('all', 'boolean') + ); + $this->assertTypeEquals('string', $restrictedType); + + $this->assertTypeEquals(null, $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($f, array(), array())); + } + + /** + * @dataProvider getPregMatchAliases + */ + public function testPregMatchAndAliases($name) + { + $function = new GlobalFunction($name); + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($function, + array(), array(null, null, $this->registry->getNativeType('string'))); + $this->assertNotNull($restrictedType); + $this->assertTrue($this->registry->getNativeType('string')->equals($restrictedType)); + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($function, + array(), array(null, null, $this->registry->getNativeType('all'))); + $this->assertNull($restrictedType); + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($function, + array(), array(null, null, $this->registry->resolveType('string|integer'))); + $this->assertNotNull($restrictedType); + $this->assertTrue($this->registry->getNativeType('string')->equals($restrictedType)); + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($function, + array(), array(null, null, $this->registry->getNativeType('array'))); + $this->assertNotNull($restrictedType); + $this->assertTrue($this->registry->resolveType('array')->equals($restrictedType)); + + $restrictedType = $this->interpreter->getPreciserFunctionReturnTypeKnowingArguments($function, + array(), array(null, null, $this->registry->getNativeType('unknown'))); + $this->assertNotNull($restrictedType); + $this->assertTrue($this->registry->resolveType('unknown')->equals($restrictedType)); + } + + public function getPregMatchAliases() + { + return array( + array('preg_filter'), + array('preg_replace'), + array('preg_replace_callback'), + array('str_replace'), + ); + } + + protected function setUp() + { + $this->registry = new TypeRegistry(); + $this->interpreter = new CoreFunctionInterpreter($this->registry); + } + + private function assertTypeEquals($expectedType, PhpType $restrictedType = null) + { + if (null === $expectedType) { + $this->assertNull($restrictedType); + } else { + $resolvedExpectedType = $this->registry->resolveType($expectedType); + + $this->assertNotNull($restrictedType); + $this->assertTrue($resolvedExpectedType->equals($restrictedType), sprintf('Failed to assert that expected type "%s" equals the actual type "%s".', $resolvedExpectedType, $restrictedType)); + } + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowScopeTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowScopeTest.php new file mode 100644 index 0000000..1a2eec2 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/LinkedFlowScopeTest.php @@ -0,0 +1,359 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\TypeInference; + +use Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface; +use JMS\PhpManipulator\PhpParser\BlockNode; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FlowScopeInterface; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\LinkedFlowScope; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypeInference; + + +class LinkedFlowScopeTest extends \PHPUnit_Framework_TestCase +{ + const LONG_CHAIN_LENGTH = 1050; + + private $registry; + + private $blockNode; + private $methodNode; + + private $globalScope; + private $localScope; + private $globalEntry; + private $localEntry; + + public function testInferSlotType() + { + $scope = LinkedFlowScope::createLatticeElement(new Scope($this->getMock('PHPParser_Node'))); + + $this->assertNull($scope->getSlot('x')); + + $scope->inferSlotType('x', $this->registry->getNativeType('number')); + + $this->assertNotNull($var = $scope->getSlot('x')); + $this->assertSame($this->registry->getNativeType('number'), $var->getType()); + } + + public function testGetSlotFromFunctionScope() + { + $functionScope = new Scope($this->getMock('PHPParser_Node')); + $functionScope->declareVar('x', $this->registry->getNativeType('integer')); + + $flowScope = LinkedFlowScope::createLatticeElement($functionScope); + $this->assertNotNull($var = $flowScope->getSlot('x')); + $this->assertSame($this->registry->getNativeType('integer'), $var->getType()); + + $flowScope = $flowScope->createChildFlowScope(); + $this->assertNotNull($var = $flowScope->getSlot('x')); + $this->assertSame($this->registry->getNativeType('integer'), $var->getType()); + } + + /** + * @dataProvider getEqualsTests + */ + public function testEquals(LatticeElementInterface $a, LatticeElementInterface $b, $expectedOutcome) + { + $this->assertSame($expectedOutcome, $a->equals($b)); + } + + public function getEqualsTests() + { + $tests = array(); + + $scope = new Scope($this->getMock('PHPParser_Node')); + $tests[] = array(LinkedFlowScope::createLatticeElement($scope), $this->getMock('Scrutinizer\PhpAnalyzer\DataFlow\LatticeElementInterface'), false); + + return $tests; + } + + public function testOptimize() + { + $this->assertSame($this->localEntry, $this->localEntry->optimize()); + + $child = $this->localEntry->createChildFlowScope(); + $this->assertSame($this->localEntry, $child->optimize()); + + $child->inferSlotType('localB', $this->registry->getNativeType('number')); + $this->assertSame($child, $child->optimize()); + } + + public function testJoin1() + { + $childA = $this->localEntry->createChildFlowScope(); + $childA->inferSlotType('localB', $this->registry->getNativeType('integer')); + + $childAB = $childA->createChildFlowScope(); + $childAB->inferSlotType('localB', $this->registry->getNativeType('string')); + + $childB = $this->localEntry->createChildFlowScope(); + $childB->inferSlotType('localB', $this->registry->getNativeType('boolean')); + + $this->assertSame($this->registry->getNativeType('string'), $childAB->getSlot('localB')->getType()); + $this->assertSame($this->registry->getNativeType('boolean'), $childB->getSlot('localB')->getType()); + $this->assertNull($childB->getSlot('localA')->getType()); + + $joined = $this->join($childB, $childAB); + $this->assertTrue($this->registry->createUnionType(array('string', 'boolean'))->equals($joined->getSlot('localB')->getType())); + $this->assertNull($joined->getSlot('localA')->getType()); + + $joined = $this->join($childAB, $childB); + $this->assertTrue($this->registry->createUnionType(array('string', 'boolean'))->equals($joined->getSlot('localB')->getType())); + $this->assertNull($joined->getSlot('localA')->getType()); + + $this->assertTrue($this->join($childB, $childAB)->equals($this->join($childAB, $childB))); + } + + public function testJoin2() + { + $childA = $this->localEntry->createChildFlowScope(); + $childA->inferSlotType('localA', $this->getType('string')); + + $childB = $this->localEntry->createChildFlowScope(); + $childB->inferSlotType('globalB', $this->getType('boolean')); + + $this->assertTrue($this->getType('string')->equals($childA->getSlot('localA')->getType())); + $this->assertTrue($this->getType('boolean')->equals($childB->getSlot('globalB')->getType())); + $this->assertNull($childB->getSlot('localB')->getType()); + + $joined = $this->join($childB, $childA); + $this->assertTrue($this->getType('string')->equals($joined->getSlot('localA')->getType())); + $this->assertTrue($this->getType('boolean')->equals($joined->getSlot('globalB')->getType())); + + $joined = $this->join($childA, $childB); + $this->assertTrue($this->getType('string')->equals($joined->getSlot('localA')->getType())); + $this->assertTrue($this->getType('boolean')->equals($joined->getSlot('globalB')->getType())); + + $this->assertTrue($this->join($childB, $childA)->equals($this->join($childA, $childB)), 'join() is symmetric.'); + } + + public function testJoin3() + { + $this->localScope->declareVar('localC', $this->getType('string')); + $this->localScope->declareVar('localD', $this->getType('string')); + + $childA = $this->localEntry->createChildFlowScope(); + $childA->inferSlotType('localC', $this->getType('integer')); + + $childB = $this->localEntry->createChildFlowScope(); + $childA->inferSlotType('localD', $this->getType('boolean')); // childA correct here? + + $joined = $this->join($childB, $childA); + $this->assertTrue($this->registry->createUnionType(array('string', 'integer'))->equals($joined->getSlot('localC')->getType())); + $this->assertTrue($this->registry->createUnionType(array('string', 'boolean'))->equals($joined->getSlot('localD')->getType())); + + $joined = $this->join($childA, $childB); + $this->assertTrue($this->registry->createUnionType(array('string', 'integer'))->equals($joined->getSlot('localC')->getType())); + $this->assertTrue($this->registry->createUnionType(array('string', 'boolean'))->equals($joined->getSlot('localD')->getType())); + + $this->assertTrue($this->join($childB, $childA)->equals($this->join($childA, $childB))); + } + + public function testLongChain1() + { + $chainA = $this->localEntry->createChildFlowScope(); + $chainB = $this->localEntry->createChildFlowScope(); + + for ($i=0; $ilocalScope->declareVar('local'.$i); + $chainA->inferSlotType('local'.$i, $i % 2 === 0 ? $this->getType('integer') : $this->getType('boolean')); + $chainB->inferSlotType('local'.$i, $i % 3 === 0 ? $this->getType('string') : $this->getType('boolean')); + + $chainA = $chainA->createChildFlowScope(); + $chainB = $chainB->createChildFlowScope(); + } + + $this->verifyLongChains($chainA, $chainB); + } + + public function testLongChain2() + { + $chainA = $this->localEntry->createChildFlowScope(); + $chainB = $this->localEntry->createChildFlowScope(); + + for ($i=0; $ilocalScope->declareVar('local'.$i); + $chainA->inferSlotType('local'.$i, $i % 2 === 0 ? $this->getType('integer') : $this->getType('boolean')); + $chainB->inferSlotType('local'.$i, $i % 3 === 0 ? $this->getType('string') : $this->getType('boolean')); + + if ($i % 7 === 0) { + $chainA = $chainA->createChildFlowScope(); + $chainB = $chainB->createChildFlowScope(); + } + } + + $this->verifyLongChains($chainA, $chainB); + } + + public function testLongChain3() + { + $chainA = $this->localEntry->createChildFlowScope(); + $chainB = $this->localEntry->createChildFlowScope(); + + for ($i=0; $ilocalScope->declareVar('local'.$j); + $chainA->inferSlotType('local'.$j, $j % 2 === 0 ? $this->getType('integer') : $this->getType('boolean')); + $chainB->inferSlotType('local'.$j, $j % 3 === 0 ? $this->getType('string') : $this->getType('boolean')); + } + + $chainA = $chainA->createChildFlowScope(); + $chainB = $chainB->createChildFlowScope(); + } + + $this->verifyLongChains($chainA, $chainB); + } + + protected function setUp() + { + $this->registry = new TypeRegistry(); + + $this->blockNode = new BlockNode(array()); + $this->methodNode = new \PHPParser_Node_Stmt_ClassMethod('foo'); + $this->methodNode->stmts = new BlockNode(array()); + + $this->globalScope = new Scope($this->blockNode); + $this->globalScope->declareVar('globalA'); + $this->globalScope->declareVar('globalB'); + + $this->localScope = new Scope($this->methodNode, $this->globalScope); + $this->localScope->declareVar('localA'); + $this->localScope->declareVar('localB'); + + $this->globalEntry = LinkedFlowScope::createLatticeElement($this->globalScope); + $this->localEntry = LinkedFlowScope::createLatticeElement($this->localScope); + } + + private function verifyLongChains(LinkedFlowScope $chainA, LinkedFlowScope $chainB) + { + $joined = $this->join($chainA, $chainB); + for ($i=0; $igetType('integer') : $this->getType('boolean'); + $this->assertTrue($type->equals($chainA->getSlot('local'.$i)->getType())); + + $type = $i % 3 === 0 ? $this->getType('string') : $this->getType('boolean'); + $this->assertTrue($type->equals($chainB->getSlot('local'.$i)->getType())); + + $joinedSlotType = $joined->getSlot('local'.$i)->getType(); + if ($i % 6 === 0) { + $this->assertTrue($this->registry->createUnionType(array('string', 'integer'))->equals($joinedSlotType)); + } else if ($i % 2 === 0) { + $this->assertTrue($this->registry->createUnionType(array('integer', 'boolean'))->equals($joinedSlotType)); + } else if ($i % 3 === 0) { + $this->assertTrue($this->registry->createUnionType(array('string', 'boolean'))->equals($joinedSlotType)); + } else { + $this->assertTrue($this->getType('boolean')->equals($joinedSlotType)); + } + } + + $this->assertScopesDiffer($chainA, $chainB); + $this->assertScopesDiffer($chainA, $joined); + $this->assertScopesDiffer($chainB, $joined); + } + + public function testFindUniqueSlot() + { + $childA = $this->localEntry->createChildFlowScope(); + $childA->inferSlotType('localB', $this->getType('integer')); + + $childAB = $childA->createChildFlowScope(); + $childAB->inferSlotType('localB', $this->getType('string')); + + $childABC = $childAB->createChildFlowScope(); + $childABC->inferSlotType('localA', $this->getType('boolean')); + + $this->assertNull($childABC->findUniqueRefinedSlot($childABC)); + $this->assertTrue($this->getType('boolean')->equals($childABC->findUniqueRefinedSlot($childAB)->getType())); + $this->assertNull($childABC->findUniqueRefinedSlot($childA)); + $this->assertNull($childABC->findUniqueRefinedSlot($this->localEntry)); + + $this->assertTrue($this->getType('string')->equals($childAB->findUniqueRefinedSlot($childA)->getType())); + $this->assertTrue($this->getType('string')->equals($childAB->findUniqueRefinedSlot($this->localEntry)->getType())); + + $this->assertTrue($this->getType('integer')->equals($childA->findUniqueRefinedSlot($this->localEntry)->getType())); + } + + public function testDiffer1() + { + $childA = $this->localEntry->createChildFlowScope(); + $childA->inferSlotType('localB', $this->getType('integer')); + + $childAB = $childA->createChildFlowScope(); + $childAB->inferSlotType('localB', $this->getType('string')); + + $childABC = $childAB->createChildFlowScope(); + $childABC->inferSlotType('localA', $this->getType('boolean')); + + $childB = $childAB->createChildFlowScope(); + $childB->inferSlotType('localB', $this->getType('string')); + + $childBC = $childB->createChildFlowScope(); + $childBC->inferSlotType('localA', $this->getType('none')); + + $this->assertScopesSame($childAB, $childB); + $this->assertScopesDiffer($childABC, $childBC); + + $this->assertScopesDiffer($childABC, $childB); + $this->assertScopesDiffer($childAB, $childBC); + + $this->assertScopesDiffer($childA, $childAB); + $this->assertScopesDiffer($childA, $childABC); + $this->assertScopesDiffer($childA, $childB); + $this->assertScopesDiffer($childA, $childBC); + } + + public function testDiffer2() + { + $childA = $this->localEntry->createChildFlowScope(); + $childA->inferSlotType('localA', $this->getType('integer')); + + $childB = $this->localEntry->createChildFlowScope(); + $childB->inferSlotType('localA', $this->getType('none')); + + $this->assertScopesDiffer($childA, $childB); + } + + private function assertScopesSame(LinkedFlowScope $a, LinkedFlowScope $b) + { + $this->assertTrue($a->equals($b)); + $this->assertTrue($b->equals($a)); + $this->assertTrue($a->equals($a)); + $this->assertTrue($b->equals($b)); + } + + private function assertScopesDiffer(LinkedFlowScope $a, LinkedFlowScope $b) { + $this->assertFalse($a->equals($b)); + $this->assertFalse($b->equals($a)); + $this->assertTrue($a->equals($a)); + $this->assertTrue($b->equals($b)); + } + + private function getType($name) + { + return $this->registry->getNativeType($name); + } + + private function join(FlowScopeInterface $a, FlowScopeInterface $b) + { + return call_user_func(TypeInference::createJoinOperation(), array($a, $b)); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/CoreMethodInterpreterTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/CoreMethodInterpreterTest.php new file mode 100644 index 0000000..45289d0 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/MethodInterpreter/CoreMethodInterpreterTest.php @@ -0,0 +1,87 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter; + +class CoreMethodInterpreterTest extends \PHPUnit_Framework_TestCase +{ + private $registry; + private $interpreter; + + /** + * @dataProvider getPreciserTests + */ + public function testGetPreciserType($qualifiedName, array $rawArgValues, array $rawArgTypes, $expectedType) + { + $argValues = array_map(array($this, 'resolveArgValue'), $rawArgValues); + $argTypes = array_map(array($this->registry, 'resolveType'), $rawArgTypes); + + $method = $this->getMock('Scrutinizer\PhpAnalyzer\Model\ContainerMethodInterface'); + $method->expects($this->any()) + ->method('getQualifiedName') + ->will($this->returnValue($qualifiedName)); + + $restrictedType = $this->interpreter->getPreciserMethodReturnTypeKnowingArguments($method, $argValues, $argTypes); + + if (null === $expectedType) { + $this->assertTrue(null === $restrictedType, sprintf('Expected null, but got type "%s".', $restrictedType)); + } else { + $this->assertNotNull($restrictedType, sprintf('Expected type "%s", but got null.', $expectedType)); + + $expectedType = $this->registry->resolveType($expectedType); + $this->assertTrue($expectedType->equals($restrictedType), sprintf('Failed to assert that expected type "%s" equals actual type "%s".', $expectedType, $restrictedType)); + } + } + + public function getPreciserTests() + { + // Qualified Name | Arg Values | Arg Types | Expected Type + $tests = array(); + + $tests[] = array('SimpleXMLElement::asXml', array(), array(), 'string|false'); + $tests[] = array('SIMpleXmLElemeNT::AsXmL', array(), array(), 'string|false'); + $tests[] = array('SimpleXMLElement::asXml', array('foo'), array('string'), 'boolean'); + + return $tests; + } + + private function resolveArgValue($value) + { + switch ($value) { + case 'false': + case 'null': + case 'true': + return new \PHPParser_Node_Expr_ConstFetch(new \PHPParser_Node_Name(array($value))); + + default: + switch ($value[0]) { + case '$': + return new \PHPParser_Node_Expr_Variable(substr($value, 1)); + + default: + return new \PHPParser_Node_Scalar_String($value); + } + } + } + + protected function setUp() + { + $this->registry = new \Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry(); + $this->interpreter = new \Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter\CoreMethodInterpreter($this->registry); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/SemanticReverseAbstractInterpreterTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/SemanticReverseAbstractInterpreterTest.php new file mode 100644 index 0000000..787b119 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/ReverseInterpreter/SemanticReverseAbstractInterpreterTest.php @@ -0,0 +1,906 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\TypeInference\ReferenceInterpreter; + +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\LinkedFlowScope; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter\SemanticReverseAbstractInterpreter; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\InterfaceC; + +class SemanticReverseAbstractInterpreterTest extends \PHPUnit_Framework_TestCase +{ + /** @var SemanticReverseAbstractInterpreter */ + private $interpreter; + + /** @var TypeRegistry */ + private $registry; + + /** @var Scope */ + private $functionScope; + + /** + * if ($a) { } + * + * @dataProvider getVariableConditionTests + * @group variable-condition + */ + public function testVariableCondition($variableType, $trueType, $falseType) + { + $blind = $this->newScope(); + $condition = $this->createVar($blind, 'a', $this->registry->resolveType($variableType)); + + // true outcome. + $informedTrue = $this->interpreter->getPreciserScopeKnowingConditionOutcome($condition, $blind, true); + $this->assertTypeEquals($trueType, $this->getVarType($informedTrue, 'a')); + + // false outcome. + $informedFalse = $this->interpreter->getPreciserScopeKnowingConditionOutcome($condition, $blind, false); + $this->assertTypeEquals($falseType, $this->getVarType($informedFalse, 'a')); + } + + public function getVariableConditionTests() + { + $tests = array(); + + $tests[] = array('string|null', 'string', 'string|null'); + $tests[] = array('string|false', 'string', 'string|false'); + + return $tests; + } + + // if (!$a) { } + public function testNegatedVariableCondition() + { + $blind = $this->newScope(); + $a = $this->createVar($blind, 'a', $this->createNullableType('string')); + $condition = new \PHPParser_Node_Expr_BooleanNot($a); + + // true outcome. + $informedTrue = $this->interpreter->getPreciserScopeKnowingConditionOutcome($condition, $blind, true); + $this->assertTypeEquals($this->createNullableType('string'), $this->getVarType($informedTrue, 'a')); + + // false outcome. + $informedFalse = $this->interpreter->getPreciserScopeKnowingConditionOutcome($condition, $blind, false); + $this->assertTypeEquals('string', $this->getVarType($informedFalse, 'a')); + } + + // if ($a = $b) { } + public function testAssignCondition1() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'Assign', + $this->createVar($blind, 'a', $this->createNullableType('object')), + $this->createVar($blind, 'b', $this->createNullableType('object')), + array('a' => 'object', 'b' => 'object'), + array('a' => 'null', 'b' => 'null')); + } + + // if ($a === 56) { } + public function testSheqCondition1() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'Identical', + $this->createVar($blind, 'a', $this->createUnionType('string', 'integer')), + $this->createNumber(56), + array('a' => 'integer'), + array('a' => $this->createUnionType(array('string', 'integer')))); + } + + // if (56 === $a) { } + public function testSheqCondition2() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'Identical', + $this->createNumber(56), + $this->createVar($blind, 'a', $this->createUnionType(array('string', 'integer'))), + array('a' => 'integer'), + array('a' => $this->createUnionType(array('string', 'integer')))); + } + + // if ($b === $a) { } + public function testSheqCondition3() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'Identical', + $this->createVar($blind, 'b', $this->createUnionType('string', 'boolean')), + $this->createVar($blind, 'a', $this->createUnionType('string', 'number')), + array('b' => 'string', 'a' => 'string'), + array('b' => $this->createUnionType('string', 'boolean'), 'a' => $this->createUnionType('string', 'number'))); + } + + // if ($a === $b) { } + public function testSheqCondition4() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'Identical', + $this->createVar($blind, 'a', $this->createUnionType('string', 'null')), + $this->createVar($blind, 'b', 'null'), + array('a' => 'null', 'b' => 'null'), + array('a' => 'string', 'b' => 'null')); + } + + public function testSheqCondition5() // testSheqCondition6 + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'Identical', + $this->createVar($blind, 'a', $this->createUnionType('string', 'null')), + $this->createVar($blind, 'b', $this->createUnionType('number', 'null')), + array('a' => 'null', 'b' => 'null'), + array('a' => $this->createUnionType('string', 'null'), 'b' => $this->createUnionType('number', 'null'))); + } + + public function testShneCondition1() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'NotIdentical', + $this->createVar($blind, 'a', $this->createUnionType('string', 'integer')), + $this->createNumber(56), + array('a' => $this->createUnionType('string', 'integer')), + array('a' => 'integer')); + } + + public function testShneCondition2() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'NotIdentical', + $this->createNumber(56), + $this->createVar($blind, 'a', $this->createUnionType('string', 'integer')), + array('a' => $this->createUnionType('string', 'integer')), + array('a' => 'integer')); + } + + public function testShneCondition3() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'NotIdentical', + $this->createVar($blind, 'b', $this->createUnionType('string', 'boolean')), + $this->createVar($blind, 'a', $this->createUnionType('string', 'integer')), + array('b' => $this->createUnionType('string', 'boolean'), 'a' => $this->createUnionType('string', 'integer')), + array('a' => 'string', 'b' => 'string')); + } + + public function testShneCondition4() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'NotIdentical', + $this->createVar($blind, 'a', 'string|null'), + $this->createVar($blind, 'b', 'null'), + array('a' => 'string', 'b' => 'null'), + array('a' => 'null', 'b' => 'null')); + } + + public function testShneCondition5() // testShneCondition6 + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'NotIdentical', + $this->createVar($blind, 'a', 'string|null'), + $this->createVar($blind, 'b', 'integer|null'), + array('a' => 'string|null', 'b' => 'integer|null'), + array('a' => 'null', 'b' => 'null')); + } + + // $a = true|false|null; if ($a == null) { /** $a = false|null */ } else { /* $a = true */ } + public function testEqCondition1() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'Equal', + $this->createVar($blind, 'a', 'boolean|null'), + $this->createNull(), + array('a' => 'boolean|null'), + array('a' => 'boolean')); + } + + public function testEqCondition2() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'NotEqual', + $this->createNull(), + $this->createVar($blind, 'a', 'boolean|null'), + array('a' => 'boolean'), + array('a' => 'boolean|null')); + } + + // $a = 0|0.54|null; if ($a == null) { /** $a = null|0; */ } else { /* $a = 0.54 */ } + public function testEqCondition3() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'Equal', + $this->createVar($blind, 'a', 'null|number'), + $this->createNull(), + array('a' => 'null|number'), + array('a' => 'number')); + } + + public function testEqCondition4() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'Equal', + $this->createVar($blind, 'a', 'null'), + $this->createVar($blind, 'b', 'null'), + array('a' => 'null', 'b' => 'null'), + array('a' => 'null', 'b' => 'null')); + } + + /** + * Tests LE, LT, GE, or GT. + * + * @dataProvider getInequalityTests1 + */ + public function testInequalitiesCondition1($op, $leftType, $rightType, $trueOutcome, $falseOutcome) + { + $blind = $this->newScope(); + $rightSide = is_int($rightType) ? $this->createNumber($rightType) : $this->createVar($blind, 'b', $rightType); + + $this->doTestBinop($blind, $op, + $this->createVar($blind, 'a', $leftType), + $rightSide, + array('a' => $trueOutcome), + array('a' => $falseOutcome)); + } + + public function getInequalityTests1() + { + $tests = array(); + + // Values: + $tests[] = array('SmallerOrEqual', 'string|null', 'integer', 'string|null', 'string'); + $tests[] = array('SmallerOrEqual', 'string|null', 'double', 'string|null', 'string'); + $tests[] = array('Smaller', 'string|null', 'integer', 'string|null', 'string|null'); + $tests[] = array('Smaller', 'string|null', 'double', 'string|null', 'string|null'); + $tests[] = array('Greater', 'string|null', 'integer', 'string', 'string|null'); + $tests[] = array('Greater', 'string|null', 'double', 'string', 'string|null'); + $tests[] = array('GreaterOrEqual', 'string|null', 'integer', 'string|null', 'string|null'); + $tests[] = array('GreaterOrEqual', 'string|null', 'double', 'string|null', 'string|null'); + + return $tests; + } + + /** + * @dataProvider getInequalityTests2 + */ + public function testInequalititesCondition2($op, $leftType, $rightType, $trueOutcome, $falseOutcome) + { + $blind = $this->newScope(); + $leftSide = is_int($leftType) ? $this->createNumber($leftType) : $this->createVar($blind, 'b', $leftType); + + $this->doTestBinop($blind, $op, + $leftSide, + $this->createVar($blind, 'a', $rightType), + array('a' => $trueOutcome), + array('a' => $falseOutcome)); + } + + public function getInequalityTests2() + { + $tests = array(); + + // Values: + $tests[] = array('GreaterOrEqual', 'integer', 'string|null', 'string|null', 'string'); + $tests[] = array('GreaterOrEqual', 'double', 'string|null', 'string|null', 'string'); + $tests[] = array('Smaller', 'integer', 'string|null', 'string', 'string|null'); + $tests[] = array('Smaller', 'double', 'string|null', 'string', 'string|null'); + $tests[] = array('SmallerOrEqual', 'integer', 'string|null', 'string|null', 'string|null'); + $tests[] = array('SmallerOrEqual', 'integer', 'string|null', 'string|null', 'string|null'); + $tests[] = array('Greater', 'integer', 'string|null', 'string|null', 'string|null'); + $tests[] = array('Greater', 'double', 'string|null', 'string|null', 'string|null'); + + return $tests; + } + + public function testBooleanAnd() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'BooleanAnd', + $this->createVar($blind, 'b', 'string|null'), + $this->createVar($blind, 'a', 'number'), + array('a' => 'number', 'b' => 'string'), + array('a' => 'number', 'b' => 'string|null')); + } + + public function testLogicalAnd() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, 'LogicalAnd', + $this->createVar($blind, 'b', 'string|null'), + $this->createVar($blind, 'a', 'number'), + array('b' => 'string', 'a' => 'number'), + array('a' => 'number', 'b' => 'string|null')); + } + + public function testGettype1() + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, 'gettype', + $this->createVar($blind, 'a', 'object|number'), + 'object', + array('a' => 'object'), + array('a' => 'number')); + } + + /** + * @group null + */ + public function testIsNull() + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, 'is_null', + $this->createVar($blind, 'a', $this->createNullableType('object')), + true, + array('a' => 'null'), + array('a' => 'object')); + } + + /** + * @dataProvider getIsIntegerAliases + */ + public function testIsInteger($alias) + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, $alias, + $this->createVar($blind, 'a', 'all'), + true, + array('a' => 'integer'), + array('a' => 'object|double|string|null|array|boolean')); + } + + public function getIsIntegerAliases() + { + return array(array('is_integer'), array('is_int'), array('is_long')); + } + + /** + * @dataProvider getIsDoubleAliases + */ + public function testIsDouble($alias) + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, $alias, + $this->createVar($blind, 'a', 'number|string'), + true, + array('a' => 'double'), + array('a' => 'integer|string')); + } + + /** + * @group is_callable + * @dataProvider getCallableTests + */ + public function testIsCallable($blindType, $trueType, $falseType) + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, 'is_callable', + $this->createVar($blind, 'a', $blindType), + true, + array('a' => $trueType), + array('a' => $falseType)); + } + + public function getCallableTests() + { + // Blind Type | True Type | False Type + $tests = array(); + $tests[] = array('unknown', 'callable', 'unknown'); + $tests[] = array('all', 'callable', 'all'); + $tests[] = array('boolean|callable', 'callable', 'boolean'); + $tests[] = array('callable', 'callable', 'none'); + $tests[] = array('string', 'string', 'string'); // The false scope is also a string as the function simply might not exist. + $tests[] = array('string|array', 'string|array', 'string|array'); // Same as above. + $tests[] = array('string|boolean', 'string', 'string|boolean'); // Same as above. + $tests[] = array('integer|boolean|string|array', 'string|array', 'string|array|integer|boolean'); // Same. + $tests[] = array('object', 'object', 'object'); // Same. + + return $tests; + } + + /** + * @group non-refinable + */ + public function testArrayExprNonRefinable() + { + $n = new \PHPParser_Node_Expr_Array(); + $n->setAttribute('type', $this->registry->getNativeType('array')); + + $this->doTestTypeFunction($this->newScope(), + 'is_callable', + $n, + true, + array(), + array()); + } + + /** + * @group is_array + */ + public function testIsArray() + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, 'is_array', + $this->createVar($blind, 'a', 'string|array'), + true, + array('a' => 'array'), + array('a' => 'string')); + } + + /** + * @group is_array + */ + public function testIsArrayWhenUnknown() + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, 'is_array', + $this->createVar($blind, 'a', 'unknown'), + true, + array('a' => 'array'), + array('a' => 'unknown')); + } + + /** + * @group is_array + */ + public function testNegatedIsArrayWhenUnknown() + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, 'is_array', + $this->createVar($blind, 'a', 'unknown'), + false, + array('a' => 'unknown'), + array('a' => 'array')); + } + + /** + * @group is_array + */ + public function testIsArrayWhenOnlyType() + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, 'is_array', + $this->createVar($blind, 'a', 'array'), + true, + array('a' => 'array'), + array('a' => 'none')); + } + + public function getIsDoubleAliases() + { + return array(array('is_double'), array('is_float'), array('is_real')); + } + + public function testIsString() + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, 'is_string', + $this->createVar($blind, 'a', 'null|string'), + true, + array('a' => 'string'), + array('a' => 'null')); + } + + /** + * @group is_object + * @dataProvider getIsObjectTests + */ + public function testIsObject($assumedType, $trueType, $falseType) + { + $blind = $this->newScope(); + $this->doTestTypeFunction($blind, 'is_object', + $this->createVar($blind, 'a', $assumedType), + true, + array('a' => $trueType), + array('a' => $falseType)); + } + + public function getIsObjectTests() + { + $tests = array(); + + // Assumed Type, True Type, False Type + $tests[] = array('object|null', 'object', 'null'); + $tests[] = array('string', 'none', 'string'); + $tests[] = array('all', 'object', 'null|integer|double|resource|array|string|boolean'); + $tests[] = array('string|double', 'none', 'string|double'); + + return $tests; + } + + /** + * @group get_class + */ + public function testGetClass() + { + $blind = $this->newScope(); + $this->doTestGetClassFunction($blind, + $this->createVar($blind, 'x', 'object'), + 'Foo\Bar', + array('x' => 'object'), + array('x' => 'object')); + } + + /** + * @group get_class + */ + public function testGetClass2() + { + $blind = $this->newScope(); + $this->doTestGetClassFunction($blind, + $this->createVar($blind, 'x', 'object'), + 'Foo', + array('x' => 'object'), + array('x' => 'none')); + } + + /** + * @group get_class + */ + public function testGetClass3() + { + $blind = $this->newScope(); + $this->doTestGetClassFunction($blind, + $this->createVar($blind, 'x', 'integer|object'), + 'Foo', + array('x' => 'object'), + array('x' => 'integer|object')); + } + + /** + * @group get_class + */ + public function testGetClass4() + { + $blind = $this->newScope(); + $this->doTestGetClassFunction($blind, + $this->createVar($blind, 'x', 'integer'), + 'Foo', + array('x' => 'none'), + array('x' => 'integer')); + } + + /** + * @group get_class + */ + public function testGetClass5() + { + $blind = $this->newScope(); + $this->doTestGetClassFunction($blind, + $this->createVar($blind, 'x', 'integer|double'), + 'Foo', + array('x' => 'none'), + array('x' => 'integer|double')); + } + + /** + * @group instanceOf + * @dataProvider getInstanceOfTests + */ + public function testInstanceOf1($assumedType, $className, $trueType, $falseType) + { + $blind = $this->newScope(); + $this->doTestBinop($blind, + 'Instanceof', + $this->createVar($blind, 'x', $assumedType), + $this->createClass($className), + array('x' => $trueType), + array('x' => $falseType)); + } + + /** + * @group instanceOf + * @dataProvider getInstanceOfTests + */ + public function testInstanceOf2($assumedType, $className, $trueType, $falseType) + { + $blind = $this->newScope(); + $this->doTestBinop($blind, + 'Instanceof', + $this->createVar($blind, 'x', $assumedType), + $this->createInterface($className), + array('x' => $trueType), + array('x' => $falseType)); + } + + /** + * @group instanceOf + * @dataProvider getInstanceOfTests + */ + public function testInstanceOf3($assumedType, $className, $trueType, $falseType) + { + $blind = $this->newScope(); + $this->doTestBinop($blind, + 'Instanceof', + $this->createVar($blind, 'x', $assumedType), + $this->createNamed($className), + array('x' => $trueType), + array('x' => $falseType)); + } + + /** + * If the class is a variable, e.g. ``if ($x instanceof $y)`` and the condition + * evaluates to true, then we can infer about $x that it must be an object. + * + * @group instanceOf + */ + public function testInstanceOf4() + { + $blind = $this->newScope(); + $this->doTestBinop($blind, + 'Instanceof', + $this->createVar($blind, 'x', 'string|object|null'), + $this->createVar($blind, 'y', 'string'), + array('x' => 'object'), + array('x' => 'string|object|null')); + } + + /** + * @group foobar + */ + public function testInstanceOf5() + { + $this->setUpInheritance(array('Foo' => 'BarInterface')); + $blind = $this->newScope(); + $this->doTestBinop($blind, + 'Instanceof', + $this->createVar($blind, 'x', 'object'), + $this->createClass($this->registry->getClass('Foo')), + array('x' => 'object'), + array('x' => 'object')); + } + + public function getInstanceOfTests() + { + $tests = array(); + + $tests[] = array('object', 'Foo', 'object', 'object'); + $tests[] = array('unknown', 'Foo', 'object', 'unknown'); + $tests[] = array('string', 'Foo', 'none', 'string'); + $tests[] = array('object', 'Foo', 'none', 'object'); + $tests[] = array('string|object', 'Foo', 'object', 'string'); + $tests[] = array('object', 'Foo', 'none', 'object'); + + return $tests; + } + + /** + * @group assert + */ + public function testAssert() + { + $this->setUpInheritance(array('B' => 'A')); + + $blind = $this->newScope(); + $op = new \PHPParser_Node_Expr_Instanceof( + $this->createVar($blind, 'x', 'object'), $name = new \PHPParser_Node_Name_FullyQualified(array('B'))); + $name->setAttribute('type', $this->registry->resolveType('object')); + + $this->doTestTypeFunction($blind, 'assert', + $op, + true, + array('x' => 'object'), + array('x' => 'object')); + } + + protected function setUp() + { + $this->registry = new TypeRegistry(); + $this->interpreter = new SemanticReverseAbstractInterpreter($this->registry); + } + + private function doTestGetClassFunction(LinkedFlowScope $blind, $arg, $outcome, array $trueOutcome, array $falseOutcome) + { + $function = new \PHPParser_Node_Expr_FuncCall(new \PHPParser_Node_Name(array('get_class'))); + $function->args[] = new \PHPParser_Node_Arg($arg); + $function->setAttribute('type', $this->registry->getNativeType('string')); + + $this->doTestBinop($blind, 'Equal', $function, $this->resolveOutcome($outcome), $trueOutcome, $falseOutcome); + } + + private function doTestTypeFunction(LinkedFlowScope $blind, $name, $arg, $outcome, array $trueOutcome, array $falseOutcome) + { + $function = new \PHPParser_Node_Expr_FuncCall(new \PHPParser_Node_Name(array($name))); + $function->args[] = new \PHPParser_Node_Arg($arg); + + if ('gettype' !== $name) { + $function->setAttribute('type', $this->registry->getNativeType('boolean')); + } + + $this->doTestBinop($blind, 'Equal', $function, $this->resolveOutcome($outcome), $trueOutcome, $falseOutcome); + } + + private function doTestBinop(LinkedFlowScope $blind, $binop, \PHPParser_Node $left, \PHPParser_Node $right, array $trueOutcome, array $falseOutcome) + { + $opClass = 'PHPParser_Node_Expr_'.$binop; + $condition = new $opClass($left, $right); + + // true outcome. + $informedTrue = $this->interpreter->getPreciserScopeKnowingConditionOutcome($condition, $blind, true); + foreach ($trueOutcome as $name => $type) { + $type = $this->registry->resolveType($type); + $varType = $this->getVarType($informedTrue, $name); + $this->assertTrue($type->equals($varType), 'Expected true outcome of type "'.$type.'" for variable "'.$name.'" does not equal actual type "'.$varType.'".'); + } + + // false outcome. + $informedFalse = $this->interpreter->getPreciserScopeKnowingConditionOutcome($condition, $blind, false); + foreach ($falseOutcome as $name => $type) { + $type = $this->registry->resolveType($type); + $varType = $this->getVarType($informedFalse, $name); + $this->assertTrue($type->equals($varType), 'Expected false outcome of type "'.$type.'" for variable "'.$name.'" does not equal actual type "'.$varType.'".'); + } + } + + private function resolveOutcome($outcome) + { + if ($outcome instanceof \PHPParser_Node) { + return $outcome; + } + + if (is_string($outcome)) { + return new \PHPParser_Node_Scalar_String($outcome); + } + + if (is_bool($outcome)) { + $outcome = new \PHPParser_Node_Expr_ConstFetch(new \PHPParser_Node_Name(array($outcome ? 'true' : 'false'))); + $outcome->setAttribute('type', $this->registry->getNativeType('boolean')); + + return $outcome; + } + + throw new \InvalidArgumentException('$outcome must be a string, boolean, or an instance of PHPParser_Node.'); + } + + private function assertTypeEquals($a, $b) + { + $a = $this->registry->resolveType($a); + $b = $this->registry->resolveType($b); + $this->assertTrue($a->equals($b), 'Types '.$a.' and '.$b.' are not equivalent.'); + } + + private function createNumber($number) + { + if (is_int($number)) { + $n = new \PHPParser_Node_Scalar_LNumber($number); + $n->setAttribute('type', $this->registry->getNativeType('integer')); + } else if (is_double($number)) { + $n = new \PHPParser_Node_Scalar_DNumber($number); + $n->setAttribute('type', $this->registry->getNativeType('double')); + } else { + throw new \InvalidArgumentException('Invalid number: '.var_export($number, true)); + } + + return $n; + } + + private function createNull() + { + $n = new \PHPParser_Node_Expr_ConstFetch(new \PHPParser_Node_Name(array('null'))); + $n->setAttribute('type', $this->registry->resolveType('null')); + + return $n; + } + + private function createClass($class) + { + $n = new \PHPParser_Node_Name_FullyQualified(explode("\\", $class)); + + if (is_string($class)) { + $class = new \Scrutinizer\PhpAnalyzer\Model\Clazz($class); + $class->setNormalized(true); + $this->registry->registerClass($class); + } + + $n->setAttribute('type', $class); + + return $n; + } + + private function createInterface($name) + { + $n = new \PHPParser_Node_Name_FullyQualified(explode("\\", $name)); + + $interface = new \Scrutinizer\PhpAnalyzer\Model\InterfaceC($name); + $interface->setNormalized(true); + $this->registry->registerClass($interface); + $n->setAttribute('type', $interface); + + return $n; + } + + private function createNamed($name) + { + $n = new \PHPParser_Node_Name_FullyQualified(explode("\\", $name)); + + $type = $this->registry->getClassOrCreate($name); + $n->setAttribute('type', $type); + + return $n; + } + + private function createNullableType($type) + { + $type = $this->registry->resolveType($type); + + return $this->registry->createNullableType($type); + } + + private function createUnionType($types) + { + if (!is_array($types)) { + $types = func_get_args(); + } + + return $this->registry->createUnionType($types); + } + + private function getVarType(LinkedFlowScope $scope, $name) + { + $slot = $scope->getSlot($name); + $this->assertNotNull($slot, 'Scope does not contain slot named "'.$name.'".'); + + return $slot->getType(); + } + + private function createVar(LinkedFlowScope $scope, $name, $type) + { + $type = $this->registry->resolveType($type); + $this->functionScope->declareVar($name) + ->setNameNode($n = new \PHPParser_Node_Expr_Variable($name)); + $scope->inferSlotType($name, $type); + $n->setAttribute('type', $type); + + return $n; + } + + private function setUpInheritance(array $extends = array()) + { + if ( ! $extends) { + return; + } + + foreach ($extends as $class => $extendedClass) { + if ($this->registry->hasClass($class)) { + continue; + } + + $this->setUpClass($class, $extends); + } + } + + private function setUpClass($class, array $extends) + { + $class = new Clazz($class); + if (isset($extends[$class->getName()])) { + $parentClass = $this->setUpClass($extends[$class->getName()], $extends); + $class->setSuperClasses(array_merge(array($parentClass->getName()), $parentClass->getSuperClasses())); + $class->setSuperClass($parentClass->getName()); + } + + $class->setNormalized(true); + $this->registry->registerClass($class); + + return $class; + } + + private function newScope() + { + $globalScope = new Scope($this->getMock('PHPParser_Node')); + $this->functionScope = new Scope($this->getMock('PHPParser_Node'), $globalScope); + + return LinkedFlowScope::createLatticeElement($this->functionScope); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/TypeInferenceTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/TypeInferenceTest.php new file mode 100644 index 0000000..b024676 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/TypeInference/TypeInferenceTest.php @@ -0,0 +1,1134 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\TypeInference; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowAnalysis; +use Scrutinizer\PhpAnalyzer\DataFlow\DataFlowAnalysis; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\FunctionInterpreter\ArrayFunctionInterpreter; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\LinkedFlowScope; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\ReverseInterpreter\SemanticReverseAbstractInterpreter; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypeInference; +use Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\TypedScopeCreator; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\Method; +use JMS\PhpManipulator\PhpParser\NormalizingNodeVisitor; + +class TypeInferenceTest extends \PHPUnit_Framework_TestCase +{ + private $assumptions = array(); + private $registry; + private $parser; + private $returnScope; + private $astGraph; + + public function testAssumption() + { + $this->assuming('x', 'integer'); + $this->inMethod(''); + $this->verify('x', 'integer'); + } + + public function testVar() + { + $this->inMethod('$x = 1;'); + $this->verify('x', 'integer'); + } + + public function testAssignment() + { + $this->assuming('x', 'object'); + $this->inMethod('$x = 0.4;'); + $this->verify('x', 'double'); + } + + public function testIf1() + { + $this->assuming('x', $this->createNullableType('object')); + $this->inMethod('$y = new $foo; if ($x) { $y = $x; }'); + $this->verifySubtypeOf('y', 'object'); + } + + public function testIf2() + { + $this->assuming('x', $this->createNullableType('object')); + $this->inMethod('$y = $x; if ($x) { $y = $x; } else { $y = new $foo; }'); + $this->verifySubtypeOf('y', 'object'); + } + + public function testIf3() + { + $this->assuming('x', $this->createNullableType('object')); + $this->inMethod('$y = 1; if ($x) { $y = $x; }'); + $this->verify('y', $this->registry->createUnionType(array('object', 'integer'))); + } + + public function testReturn1() + { + $this->assuming('x', $this->createNullableType('object')); + $this->inMethod('if ($x) { return $x; } $x = new $foo; return $x;'); + $this->verify('x', 'object'); + } + + public function testReturn2() + { + $this->assuming('x', $this->createNullableType('integer')); + $this->inMethod('if (!$x) { $x = 0; } return $x;'); + $this->verify('x', 'integer'); + } + + public function testWhile1() + { + $this->assuming('x', $this->createNullableType('integer')); + $this->inMethod('while (!$x) { if (null === $x) { $x = 0; } else { $x = 1; } }'); + $this->verify('x', 'integer'); + } + + public function testWhile2() + { + $this->assuming('x', $this->createNullableType('integer')); + $this->inMethod('while (!$x) { $x = array(); }'); + $this->verifySubtypeOf('x', $this->registry->createUnionType(array('integer', 'array'))); + } + + public function testDo() + { + $this->assuming('x', $this->createNullableType('object')); + $this->inMethod('do { $x = 1; } while (!$x);'); + $this->verify('x', 'integer'); + } + + public function testFor1() + { + $this->assuming('y', 'integer'); + $this->inMethod('$x = $i = null; for ($i=$y; !$i; $i=1) { $x = 1; }'); + $this->verify('x', $this->createNullableType('integer')); + $this->verify('i', 'integer'); + } + + public function testFor2() // testFor4 + { + $this->assuming('x', $this->createNullableType('object')); + $this->inMethod('$y = array(); if ($x) { for ($i=0; $i<10; $i++) { break; } $y = $x; }'); + $this->verifySubtypeOf('y', 'object|array'); + } + + /** + * @group foreach + */ + public function testForeach1() // testFor3 + { + $this->assuming('y', 'object'); + $this->inMethod('$x = $i = null; foreach ($y as $i => $stuff) { $x = 1; }'); + $this->verify('x', $this->createNullableType('integer')); + $this->verify('i', $this->registry->createUnionType(array('null', 'string', 'integer'))); + } + + /** + * @group foreach + */ + public function testForeach2() + { + $this->assuming('y', 'array>'); + $this->inMethod('$x = $i = null; foreach ($y as $i => $x);'); + $this->verify('x', $this->createNullableType('object')); + $this->verify('i', $this->createNullableType('integer')); + } + + /** + * @group foreach + */ + public function testForeach3() + { + $this->registry->registerClass($foo = new Clazz('Foo')); + $foo->setTypeRegistry($this->registry); + $foo->addImplementedInterface('Iterator'); + $foo->addMethod($current = new Method('current')); + $current->setReturnType($this->registry->getClassOrCreate('Bar')); + + $this->assuming('y', 'object'); + $this->inMethod('$x = $i = null; foreach ($y as $i => $x);'); + $this->verify('x', $this->createNullableType('object')); + $this->verify('i', $this->createNullableType('integer|string')); + } + + public function testSwitch1() + { + $this->assuming('x', 'integer'); + $this->inMethod(' + $y = null; + switch ($x) { + case 1: $y = 1; break; + case 2: $y = array(); // fall through + case 3: $y = array(); // fall through + default: $y = 0; + } + '); + $this->verify('y', 'integer'); + } + + public function testSwitch2() + { + $this->assuming('x', 'all'); + $this->inMethod(' + $y = null; + switch (gettype($x)) { + case "string": + $y = $x; + return; + + default: + $y = "a"; + } + '); + $this->verify('y', 'string'); + } + + public function testSwitch3() + { + $this->assuming('x', $this->createNullableType($this->registry->createUnionType(array('integer', 'string')))); + $this->inMethod(' + switch (gettype($x)) { + case "string": + $y = 1; $z = null; + return; + + case "integer": + $y = $x; $z = null; + return; + + default: + $y = 1; $z = $x; + } + '); + $this->verify('y', 'integer'); + $this->verify('z', 'null'); + } + + public function testSwitch4() + { + $this->assuming('x', 'all'); + $this->inMethod('$y = null; + switch(gettype($x)) { + case "string": + case "integer": + $y = $x; + return; + default: + $y = 1; + } + '); + $this->verify('y', 'integer|string'); + } + + public function testTernary() + { + $this->assuming('x', $this->createNullableType('object')); + $this->inMethod('$y = $x ? $x : array();'); + $this->verifySubtypeOf('y', 'object|array'); + } + + public function testThrow() + { + $this->assuming('x', $this->createNullableType('number')); + $this->inMethod('$y = 1; + if (null === $x) { throw new Exception("x is null"); } + $y = $x;'); + $this->verify('y', 'number'); + } + + public function testTry1() // testTry3 + { + $this->assuming('x', 'double'); + $this->inMethod('$y = null; try { $y = $x; } catch (Exception $e) { }'); + $this->verify('y', 'double'); + } + + public function testCatch1() + { + $class = $this->createClass('Exception'); + $this->inMethod('$y = null; try { foo(); } catch (Exception $ex) { $y = $ex; }'); + $this->verify('y', $this->createNullableType($class)); + } + + public function testCatch2() + { + $class = $this->createClass('Exception'); + $this->inMethod('$y = null; $e = 3; try { foo(); } catch (Exception $e) { $y = $e; }'); + $this->verify('y', $this->createNullableType($class)); + } + + public function testClosure() + { + $this->assuming('x', 'null'); + $this->inMethod('$x = function() { };'); + $this->verify('x', 'object'); + } + + public function testUnknownType1() + { + $this->inMethod('$y = 3; $y = $x;'); + $this->verify('y', 'unknown'); + } + + public function testUnknownType2() + { + $this->assuming('x', 'array'); + $this->inMethod('$y = 5; $y = $x[0];'); + $this->verify('y', 'unknown'); + } + + public function testInfiniteLoop1() + { + $this->assuming('x', $this->createNullableType('array')); + $this->inMethod('$x = array(); while ($x !== null) { $x = array(); }'); + } + + public function testInifiniteLoop2() + { + $this->assuming('x', $this->createNullableType('array')); + $this->inMethod('$x = array(); do { $x = null; } while ($x === null);'); + } + + public function testJoin1() + { + $this->assuming('x', 'boolean'); + $this->assuming('unknownOrNull', 'unknown|null'); + $this->inMethod('if ($x) { $y = $unknownOrNull; } else $y = null;'); + $this->verify('y', 'unknown|null'); + } + + public function testJoin2() + { + $this->assuming('x', 'boolean'); + $this->assuming('unknownOrNull', 'unknown|null'); + $this->inMethod('if ($x) { $y = null; } else { $y = $unknownOrNull; }'); + $this->verify('y', 'unknown|null'); + } + + /** + * @group array + */ + public function testEmptyArray() + { + $this->inMethod('$x = array();'); + $this->verify('x', 'array'); + } + + /** + * @group array + */ + public function testArray1() + { + $this->assuming('x', $this->createNullableType('array')); + $this->inMethod('$y = 3; if ($x) { $x = array($y = $x); }'); + + // The first type represents an empty array, in that case ``if ($x)`` will evaluate + // to false, and the IF block will not be reached. + $this->verify('x', 'array|null|array'); + $this->verify('y', 'integer|array'); + } + + /** + * @group array + */ + public function testArray2() + { + $this->assuming('x', 'null'); + $this->inMethod('$x = array("foo", "bar");'); + $this->verify('x', 'array'); + } + + /** + * @group array + */ + public function testArray3() + { + $this->assuming('x', 'null'); + $this->inMethod('$x = array("a" => "foo", 4, true);'); + $this->verify('x', 'array'); + } + + /** + * @group deadlock + */ + public function testArray4() + { + $this->inMethod('foreach ($a as $b) { if (!is_array($x)) { $x = array("value" => $x); } }'); + + // X is either already an array, that is is_array($x) is true, or + // X is is something else in which case it is transformed into an + // array. So, we either have the generic array type, or the more + // specific one which only allows strings as key. + $this->verify('x', 'array|array'); + } + + /** + * @group array + */ + public function testArray5() + { + $this->inMethod('$x = array("a", 10 => "b", 3 => "c", "d");'); + $this->verify('x', 'array'); + } + + /** + * @group array + */ + public function testArray6() + { + $this->inMethod('$x = array(-5 => "foo", "bar");'); + $this->verify('x', 'array'); + } + + /** + * @group array + */ + public function testArray7() + { + $this->inMethod('$x = array($foo => "bar", "baz");'); + $this->verify('x', 'array'); + } + + /** + * @group array + */ + public function testArray8() + { + $this->inMethod('$x = array(4, $foo => "bar", "baz");'); + $this->verify('x', 'array'); + } + + /** + * @group arrayDim + */ + public function testArrayDim() + { + $this->assuming('x', 'array'); + $this->inMethod('$x[] = "foo"; $x[] = 3;'); + $this->verify('x', 'array'); + } + + /** + * @group arrayDim + */ + public function testArrayDim2() + { + $this->assuming('x', 'array'); + $this->inMethod('$x["foO"] = true;'); + $this->verify('x', 'array'); + } + + /** + * @group arrayDim + */ + public function testArrayDim3() + { + $this->assuming('this->x', 'array'); + $this->inMethod('$this->x[] = "foo";'); + $this->verify('this->x', 'array'); + } + + /** + * @group arrayDim + */ + public function testArrayDim4() + { + $this->inMethod('$x[] = "foo";'); + $this->verify('x', 'array'); + } + + /** + * @group arrayDim + */ + public function testArrayDim5() + { + $this->inMethod('self::$x[] = "foO";'); + $this->verify('Foo::$x', 'array'); + } + + /** + * @group arrayDim + */ + public function testArrayDim6() + { + $this->assuming('x', 'string'); + $this->inMethod('$x[0] = "a";'); + $this->verify('x', 'string'); + } + + /** + * @group arrayDim + */ + public function testArrayDim7() + { + $this->assuming('this->x', 'string'); + $this->inMethod('$this->x[] = "a";'); + $this->verify('this->x', 'string'); + } + + /** + * @group arrayItem + */ + public function testArrayItem() + { + $this->assuming('x', 'array'); + $this->inMethod(' + $x["foo"] = "foo"; + + $a = $x["foo"]; + $b = $x["bar"]; + '); + $this->verify('a', 'string'); + $this->verify('b', 'all'); + } + + /** + * @group arrayItem + */ + public function testArrayItem2() + { + $this->assuming('this->x', 'array'); + $this->inMethod(' + $this->x["foo"] = "foo"; + + $a = $this->x["foo"]; + $b = $this->x["bar"]; + '); + $this->verify('a', 'string'); + $this->verify('b', 'all'); + } + + /** + * @group arrayItem + */ + public function testArrayItem3() + { + $this->assuming('x', 'array'); + $this->inMethod(' + $x["foo"] = "bar"; + $x[] = $foo; + + $a = $x["foo"]; + $b = $x["bar"]; + '); + $this->assuming('a', 'string'); + $this->assuming('b', 'unknown'); + } + + /** + * @group arrayItem + */ + public function testArrayItem4() + { + $this->assuming('this->x', 'array'); + $this->inMethod(' + $this->x["foo"] = "bar"; + $this->x[] = $foo; + + $a = $this->x["foo"]; + $b = $this->x["bar"]; + '); + $this->assuming('a', 'string'); + $this->assuming('b', 'unknown'); + } + + /** + * @group arrayItem + */ + public function testArrayItem5() + { + $this->assuming('x', 'array'); + $this->assuming('a', 'null'); + $this->inMethod(' + if (is_string($x["foo"])) { + $a = $x["foo"]; + } + $b = $x["foo"]; + '); + $this->verify('a', 'null|string'); + $this->verify('b', 'unknown'); + } + + /** + * @group arrayItem + */ + public function testArrayItem6() + { + $this->assuming('this->x', 'array'); + $this->assuming('a', 'null'); + $this->inMethod(' + if (is_string($this->x["foo"])) { + $a = $this->x["foo"]; + } + $b = $this->x["foo"]; + '); + $this->verify('a', 'null|string'); + $this->verify('b', 'unknown'); + } + + /** + * @group arrayItem + */ + public function testArrayItem7() + { + $this->assuming('x', 'array'); + $this->inMethod(' + if (is_string($x["foo"])) { + $x["foo"] = 123; + } else { + $x["foo"] = "abc"; + } + + $a = $x["foo"]; + '); + $this->verify('a', 'string|integer'); + } + + /** + * @group listAssign + */ + public function testListAssign() + { + $this->inMethod(' + $x = array("foo", 2, array()); + list($a, $b, $c) = $x; + list(, $d,) = $x; + list($e,,$f) = $x; + '); + + $this->verify('a', 'string'); + $this->verify('b', 'integer'); + $this->verify('c', 'array'); + $this->verify('d', 'integer'); + $this->verify('e', 'string'); + $this->verify('f', 'array'); + } + + /** + * @group listAssign + */ + public function testListAssign2() + { + $this->inMethod('list($a, $b, $c) = array(234, $foo => "bar", true);'); + $this->verify('a', 'integer'); + $this->verify('b', 'unknown_checked'); + $this->verify('c', 'unknown_checked'); + } + + public function testGetElem() + { + $this->assuming('x', $this->createNullableType('array')); + $this->inMethod('$y = 3; if ($x) { $x = $x[$y = $x]; }'); + $this->verify('y', 'integer|array'); + $this->verify('x', 'unknown'); + } + + public function testShortCircuitingAnd() + { + $this->assuming('x', 'integer'); + $this->inMethod('$y = null; if ($x && ($y = 3)) { }'); + $this->verify('y', $this->createNullableType('integer')); + } + + public function testShortCircuitingAnd2() + { + $this->assuming('x', 'integer'); + $this->inMethod('$y = null; $z = 4; if ($x && ($y = 3)) { $z = $y; }'); + $this->verify('z', 'integer'); + } + + public function testShortCircuitingOr() + { + $this->assuming('x', 'integer'); + $this->inMethod('$y = null; if ($x || ($y = 3)) { }'); + $this->verify('y', 'null|integer'); + } + + public function testShortCircuitingOr2() + { + $this->assuming('x', 'integer'); + $this->inMethod('$y = null; $z = 4; if ($x || ($y = 3)) { $z = $y; }'); + $this->verify('z', 'null|integer'); + } + + public function testAssignInCondition() + { + $this->assuming('x', 'null|integer'); + $this->inMethod('if (!($y = $x)) { $y = 3; }'); + $this->verify('y', 'integer'); + } + + /** + * @group conditionAssignments + */ + public function testTypeOfAndAndOrConditions() + { + $this->assuming('x', 'integer'); + $this->assuming('y', 'string'); + $this->inMethod('$z = $x && $y;'); + $this->verify('z', 'boolean'); + } + + /** + * @group conditionAssignments + */ + public function testTypeOfAndAndOrConditions2() + { + $this->assuming('x', 'integer'); + $this->assuming('y', 'string'); + $this->inMethod('$z = ($x and $y);'); + $this->verify('z', 'boolean'); + } + + /** + * @group conditionAssignments + */ + public function testTypeOfAndAndOrConditions3() + { + $this->assuming('x', 'integer'); + $this->assuming('y', 'string'); + $this->inMethod('$z = $x || $y;'); + $this->verify('z', 'boolean'); + } + + /** + * @group conditionAssignments + */ + public function testTypeOfAndAndOrConditions4() + { + $this->assuming('x', 'integer'); + $this->assuming('y', 'string'); + $this->inMethod('$z = ($x or $y);'); + $this->verify('z', 'boolean'); + } + + public function testInstanceOf() + { + $class = $this->createClass('Foo'); + $this->assuming('x', 'object'); + $this->inMethod('$y = null; if ($x instanceof Foo) $y = $x;'); + $this->verify('y', $this->createNullableType($class)); + } + + public function testFlattening() + { + for ($i=0; $iassuming('s'.$i, 'all'); + } + + $this->assuming('b', 'boolean'); + $str = 'if ($b) {'; + for ($i=0; $iinMethod($str); + + $numberOrString = $this->createUnionType('integer', 'string'); + for ($i=0; $iverify('s'.$i, $numberOrString); + } + } + + public function testUnary() + { + $this->assuming('x', 'integer'); + $this->inMethod('$y = +$x;'); + $this->verify('y', 'integer'); + $this->inMethod('$z = -$x;'); + $this->verify('z', 'integer'); + } + + public function testAdd1() + { + $this->assuming('x', 'integer'); + $this->inMethod('$y = $x + 5;'); + $this->verify('y', 'integer'); + } + + public function testAdd2() + { + $this->assuming('x', 'integer'); + $this->inMethod('$y = $x + "5";'); + $this->verify('y', 'integer|double'); + } + + public function testAdd3() + { + $this->assuming('x', 'integer'); + $this->inMethod('$y = "5" + $x;'); + $this->verify('y', 'integer|double'); + } + + public function testAssignAdd() + { + $this->assuming('x', 'integer'); + $this->inMethod('$x += "5";'); + $this->verify('x', 'integer|double'); + } + + public function testComparison() + { + $this->inMethod('$x = "foo"; $y = ($x = 3) < 4;'); + $this->verify('x', 'integer'); + $this->inMethod('$x = "foo"; $y = ($x = 3) > 4;'); + $this->verify('x', 'integer'); + $this->inMethod('$x = "foo"; $y = ($x = 3) <= 4;'); + $this->verify('x', 'integer'); + $this->inMethod('$x = "foo"; $y = ($x = 3) >= 4;'); + $this->verify('x', 'integer'); + } + + public function testThrownExpression() + { + $this->inMethod('$x = "foo"; try { throw new Exception($x = 3); } catch (Exception $ex) {}'); + $this->verify('x', 'integer'); + } + + /** + * @group null + */ + public function testIsNull1() + { + $this->assuming('x', $this->createNullableType('object')); + $this->inMethod('if (is_null($x)) { $x = new $foo; }'); + $this->verify('x', 'object'); + } + + /** + * @group null + */ + public function testIsNull2() + { + $this->assuming('x', $this->createNullableType('object')); + $this->inMethod('if (true == is_null($x)) { $x = new $foo; }'); + $this->verify('x', 'object'); + } + + /** + * @group null + */ + public function testIsNull3() + { + $this->assuming('x', $this->createNullableType('object')); + $this->inMethod('if (!is_null($x)) { } else { $x = new $foo; }'); + $this->verify('x', 'object'); + } + + /** + * @group null + */ + public function testIsNull4() + { + $this->assuming('x', $this->createNullableType('string')); + $this->inMethod('if (null === $x || false === $x) { $x = "foo"; }'); + $this->verify('x', 'string'); + } + + /** + * @group isArray + */ + public function testIsArray() + { + $this->assuming('x', 'integer|array'); + $this->inMethod('$a = is_array($x); if ($a) { $x; $x = 5.4; }'); + $this->verify('x', 'integer|array|double'); + } + + /** + * @group new + */ + public function testNew() + { + $this->inMethod('$x = new A();'); + $this->verify('x', 'object'); + } + + /** + * @group new + */ + public function testNewDynamic() + { + $this->assuming('class', 'string'); + $this->inMethod('$x = new $class();'); + $this->verify('x', 'object'); + } + + /** + * @group assert + */ + public function testAssert() + { + $this->setUpInheritance(array('B' => 'A')); + + $this->assuming('x', 'object'); + $this->inMethod('assert($x instanceof B);'); + $this->verify('x', 'object'); + } + + /** + * @group cast + */ + public function testTypeCast() + { + $this->assuming('x', 'object'); + $this->inMethod(' + /** @var A $y */ + $y = $x;'); + + $this->verify('y', 'object'); + } + + /** + * @group cast + */ + public function testTypeCast2() + { + $this->assuming('x', 'object'); + $this->inMethod(' + /** @var $y A */ + $y = $x;'); + + $this->verify('y', 'object'); + } + + /** + * @group cast + */ + public function testTypeCast3() + { + $this->assuming('x', 'array'); + $this->inMethod(' + $y = null; + foreach ($x as $y) { + /** @var A $y */ + echo "foo"; + } + '); + $this->verify('y', 'null|object'); + } + + /** + * @group cast + */ + public function testTypeCast4() + { + $this->assuming('x', 'array'); + $this->inMethod(' + $y = null; + /** @var $x array */ + foreach ($x as $y); + '); + $this->verify('y', 'null|object'); + } + + /** + * @group cast + */ + public function testTypeCast5() + { + $this->assuming('x', 'object'); + $this->inMethod(' + /** @var $x A */ + $y = $x; + '); + $this->verify('y', 'object'); + } + + /** + * @group plus + * @dataProvider getPlusTests + */ + public function testPlus($aType, $bType, $expectedType) + { + $this->assuming('a', $aType); + $this->assuming('b', $bType); + + $this->inMethod('$x = $a + $b;'); + $this->verify('x', $expectedType); + } + + public function getPlusTests() + { + $tests = array(); + $tests[] = array('array', 'array', 'array'); + $tests[] = array('integer', 'string|null', 'integer|double'); + $tests[] = array('string|null', 'integer', 'integer|double'); + $tests[] = array('all', 'all', 'unknown'); + $tests[] = array('unknown', 'unknown', 'unknown'); + $tests[] = array('unknown', 'integer', 'integer'); + $tests[] = array('double', 'unknown', 'double'); + $tests[] = array('integer', 'double', 'double'); + $tests[] = array('array', 'array', 'array'); + + return $tests; + } + + protected function setUp() + { + $this->registry = new TypeRegistry(); + $this->parser = new \PHPParser_Parser(); + } + + private function createClass($name) + { + $class = new Clazz($name); + $this->registry->registerClass($class); + + return $class; + } + + private function createNullableType($type) + { + return $this->registry->createNullableType($this->resolveType($type)); + } + + private function assuming($symbolName, $type) + { + $this->assumptions[$symbolName] = $this->resolveType($type); + } + + private function setUpInheritance(array $extends = array()) + { + if ( ! $extends) { + return; + } + + foreach ($extends as $class => $extendedClass) { + if ($this->registry->hasClass($class)) { + continue; + } + + $this->setUpClass($class, $extends); + } + } + + private function setUpClass($class, array $extends) + { + $class = new Clazz($class); + if (isset($extends[$class->getName()])) { + $parentClass = $this->setUpClass($extends[$class->getName()], $extends); + $class->setSuperClasses(array_merge(array($parentClass->getName()), $parentClass->getSuperClasses())); + $class->setSuperClass($parentClass->getName()); + } + + $class->setNormalized(true); + $this->registry->registerClass($class); + + return $class; + } + + private function inMethod($phpCode) + { + // Parse the body of the function. + $ast = $this->parser->parse(new \PHPParser_Lexer('addVisitor(new \PHPParser_NodeVisitor_NameResolver()); + $traverser->addvisitor(new NormalizingNodeVisitor()); + $ast = $traverser->traverse($ast); + + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NodeConnector()); + $traverser->traverse($ast); + + $root = $ast[0]; + $node = $root->stmts[0]->stmts; + + // Create the scope with the assumptions. + $scopeCreator = new TypedScopeCreator($this->registry); + $assumedScope = $scopeCreator->createScope($node, $scopeCreator->createScope($root, null)); + foreach ($this->assumptions as $symbolName => $type) { + $var = $assumedScope->getVar($symbolName); + if (!$var) { + $assumedScope->declareVar($symbolName, $type); + } else { + $var->setType($type); + } + } + + // Create the control graph. + $cfa = new ControlFlowAnalysis(); + $cfa->process($node); + $cfg = $cfa->getGraph(); + + // Create a simple reverse abstract interpreter. + $rai = new SemanticReverseAbstractInterpreter($this->registry); + $fi = new ArrayFunctionInterpreter($this->registry); + $mi = $this->getMock('Scrutinizer\PhpAnalyzer\DataFlow\TypeInference\MethodInterpreter\MethodInterpreterInterface'); + + $commentParser = new \Scrutinizer\PhpAnalyzer\PhpParser\DocCommentParser($this->registry); + + // Do the type inference by data-flow analysis. + $dfa = new TypeInference($cfg, $rai, $fi, $mi, $commentParser, $assumedScope, $this->registry); + $dfa->analyze(); + + // Get the scope of the implicit return. + $this->returnScope = $cfg->getImplicitReturn()->getAttribute(DataFlowAnalysis::ATTR_FLOW_STATE_IN); + + $this->astGraph = \Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::dump($node); + } + + private function verifySubtypeOf($symbolName, $type) + { + $type = $this->resolveType($type); + $varType = $this->getType($symbolName); + + $this->assertNotNull($varType, 'The variable '.$symbolName.' is missing a type.'); + $this->assertTrue($varType->isSubTypeOf($type), 'The type '.$varType.' of variable '.$symbolName.' is not a subtype of '.$type.'.'); + } + + private function verify($symbolName, $type) + { + $type = $this->resolveType($type); + $cType = $this->getType($symbolName); + $this->assertTrue($type->equals($cType), sprintf('Expected type "%s" for variable "%s", but got type "%s". Graph: %s', $type, $symbolName, $cType, $this->astGraph)); + } + + private function createUnionType($types) + { + if (!is_array($types)) { + $types = func_get_args(); + } + + return $this->registry->createUnionType($types); + } + + private function resolveType($type) + { + return $this->registry->resolveType($type); + } + + private function getType($name) + { + $this->assertNotNull($this->returnScope, 'The return scope should not be null.'); + + $var = $this->returnScope->getSlot($name); + $this->assertNotNull($var, 'The variable '.$name.' is missing from the scope.'); + + return $var->getType(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MayBeReachingUseAnalysisTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MayBeReachingUseAnalysisTest.php new file mode 100644 index 0000000..f3a302b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MayBeReachingUseAnalysisTest.php @@ -0,0 +1,178 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\VariableReachability; + +class MayBeReachingUseAnalysisTest extends \PHPUnit_Framework_TestCase +{ + private $analysis; + private $def; + private $uses; + + public function testStraightLine() + { + $this->assertMatch('D:$x=1; U:$x;'); + $this->assertMatch('$x = 1; D: $x = 2; U: $x;'); + $this->assertNotMatch('D:$x=1; $x=2; U:$x;'); + $this->assertNotMatch('U:$x; D:$x=2;'); + $this->assertMatch('D: $x = 1; $y = 2; $y; U: $x;'); + } + + public function testIf() + { + $this->assertMatch('if ($a) { D: $x = 1; } else { $x = 2; } U:$x;'); + $this->assertMatch('if ($a) { $x = 1; } else { D: $x = 2; } U:$x;'); + $this->assertMatch('D: $x=1; if ($a) { U1: $x; } else { U2: $x; }'); + } + + public function testLoops() + { + $this->assertMatch('$x=0; while ($a) { D: $x=1; } U:$x;'); + $this->assertMatch('$x=0; for(;;) { D: $x=1; } U:$x;'); + + $this->assertMatch('D: $x=1; while($a) { U: $x; }'); + $this->assertMatch('D: $x=1; for(;;) { U: $x; }'); + + $this->assertNotMatch('D: $x= 1; foreach ($a as $x) { U: $x; }'); + } + + public function testConditional() + { + $this->assertMatch('$x=0; D:($x=1)&&$y; U:$x;'); + $this->assertMatch('$x=0; D:$y&&($x=1); U:$x;'); + $this->assertMatch('$x=0; $y=0; D:($x=1)&&($y=0); U:$x;'); + $this->assertMatch('$x=0; $y=0; D:($y=0)&&($x=1); U:$x;'); + $this->assertNotMatch('D: $x=0; $y=0; ($x=1)&&($y=0); U:$x;'); + $this->assertMatch('D: $x=0; $y=0; ($y=1)&&(($y=2)||($x=1)); U:$x;'); + $this->assertMatch('D: $x=0; $y=0; ($y=0)&&($x=1); U:$x;'); + } + + public function testAssignmentInExpressions() + { + $this->assertMatch('$x=0; D:foo(bar($x=1)); U:$x;'); + $this->assertMatch('$x=0; D:foo(bar + ($x = 1)); U:$x;'); + } + + public function testHook() + { + $this->assertMatch('$x=0; D:foo() ? $x=1 : bar(); U:$x;'); + $this->assertMatch('$x=0; D:foo() ? $x=1 : $x=2; U:$x;'); + } + + public function testAssignmentOps() + { + $this->assertNotMatch('D: $x = 0; U: $x = 100;'); + $this->assertMatch('D: $x = 0; U: $x += 100;'); + $this->assertMatch('D: $x = 0; U: $x -= 100;'); + } + + public function testInc() + { + $this->assertMatch('D: $x = 0; U:$x++;'); + $this->assertMatch('$x = 0; D:$x++; U:$x;'); + } + + public function testForeach() + { + $this->assertMatch('D: $x = array(); U: foreach ($x as $y) { }'); + $this->assertNotMatch('D: $x = array(); U: foreach ($foo as $x) { }'); + $this->assertNotMatch('D: $x = array(); foreach ($foo as $x) { U:$x; }'); + $this->assertMatch('$x = array(); D: foreach ($foo as $x) { U:$x; }'); + } + + public function testException() + { + $this->assertNotMatch('D: $x=1; try { f(); } catch (\Exception $x) { U: $x; }'); + + // This test fails as we are not taking into account branches in the backwards analysis. + // This case seems also quite unlikely that it does not matter for now. +// $this->assertMatch('D: $x=1; try { f(); } catch (\Exception $x) { } U: $x;'); + } + + public function testAttachesDefiningExprsToVarNodes() + { + $this->assertMatch('D: $x=1; if ($a) { U1: $x; } else { U2: f($x); }'); + $this->assertSame(array($this->def->expr), $this->uses[0]->getAttribute('maybe_defining_exprs')); + $this->assertSame(array($this->def->expr), $this->uses[1]->args[0]->value->getAttribute('maybe_defining_exprs')); + + $this->assertMatch('try { $x = 1; f(); } catch (\Exception $ex) { D: $x = 2; } U: $x;'); + $defExprs = $this->uses[0]->getAttribute('maybe_defining_exprs'); + $this->assertInstanceOf('PHPParser_Node_Scalar_LNumber', $defExprs[0]); + $this->assertSame(2, $defExprs[0]->value); + $this->assertInstanceOf('PHPParser_Node_Scalar_LNumber', $defExprs[1]); + $this->assertSame(1, $defExprs[1]->value); + } + + private function assertMatch($code) + { + $this->computeUseDef($code); + + $analyzedUses = $this->analysis->getUses('x', $this->def); + $this->assertEquals(count($analyzedUses), count($this->uses)); + foreach ($this->uses as $use) { + if ( ! in_array($use, $analyzedUses, true)) { + $this->fail('Did not find '.\Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::getStringRepr($use)); + } + } + } + + private function assertNotMatch($code) + { + $this->computeUseDef($code); + + $analyzedUses = $this->analysis->getUses('x', $this->def); + foreach ($this->uses as $use) { + if (in_array($use, $analyzedUses, true)) { + $this->fail('Did not expect '.\Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::getStringRepr($use)); + } + } + } + + private function computeUseDef($code) + { + $code = sprintf('createScope($ast); + + $cfa = new \Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowAnalysis(); + $cfa->process($ast); + $cfg = $cfa->getGraph(); + + $this->analysis = new \Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability\MayBeReachingUseAnalysis($cfg, $scope); + $this->analysis->analyze(); + + $this->def = null; + $this->uses = array(); + + \Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal::traverseWithCallback($ast, new \Scrutinizer\PhpAnalyzer\PhpParser\PreOrderCallback(function($t, \PHPParser_Node $node) { + if ( ! $node instanceof \PHPParser_Node_Stmt_Label) { + return; + } + + if ('D' === $node->name) { + $this->def = $node->getAttribute('next'); + } else if (0 === strpos($node->name, 'U')) { + $this->uses[] = $node->getAttribute('next'); + } + })); + + $this->assertNotNull($this->def); + $this->assertNotEmpty($this->uses); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingAnalysisTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingAnalysisTest.php new file mode 100644 index 0000000..7c78713 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingAnalysisTest.php @@ -0,0 +1,253 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\VariableReachability; + +use Scrutinizer\PhpAnalyzer\ControlFlow\ControlFlowAnalysis; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil; +use JMS\PhpManipulator\PhpParser\ParseUtils; +use Scrutinizer\PhpAnalyzer\PhpParser\PreOrderCallback; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\SyntacticScopeCreator; +use Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability\MustBeReachingDefAnalysis; + +class MustBeReachingAnalysisTest extends \PHPUnit_Framework_TestCase +{ + /** @var MustBeReachingDefAnalysis */ + private $analysis; + + /** @var \PHPParser_Node */ + private $def; + + /** @var \PHPParser_Node */ + private $use; + + public function testStraightLine() + { + $this->assertMatch('D:$x=1; U:$x;'); + $this->assertMatch('$x=0; D:$x=1; U:$x;'); + $this->assertNotMatch('D:$x=1; $x=2; U:$x;'); + $this->assertMatch('$x=1; D:$x=2; U:$x;'); + $this->assertNotMatch('U:$x; D:$x=1;'); + $this->assertMatch('D:$x=1; $y=2; $y; U:$x;'); + } + + public function testIf() + { + $this->assertNotMatch('if($a) { D:$x=1; } else { $x=2; }; U:$x;'); + $this->assertNotMatch('if($a) { $x=1; } else { D:$x=2; }; U:$x;'); + $this->assertMatch('D:$x=1; if($a) { U:$x; } else { $x; };'); + $this->assertMatch('D:$x=1; if($a) { $x; } else { U:$x; };'); + $this->assertNotMatch('if($a) { D: $x=1; }; U:$x;'); + } + + /** + * @group loops + */ + public function testLoops() + { + $this->assertNotMatch('$x=0; while($a) { + D:$x=1; }; U:$x;'); + $this->assertNotMatch('$x=0; for(;;) { + D:$x=1; }; U:$x;'); + $this->assertMatch('D:$x=1; while($a) { U:$x; }'); + $this->assertMatch('D:$x=1; for(;;) { U:$x; }'); + } + + public function testConditional() + { + $this->assertMatch('$x=0; D:($x=1)&&$y; U:$x;'); + $this->assertNotMatch('$x=0; D:$y&&($x=1); U:$x;'); + } + + public function testAssignInExpr() + { + $this->assertMatch('$x=0; D:foo(bar($x=1)); U:$x;'); + $this->assertMatch('$x=0; D:foo($bar + ($x = 1)); U:$x;'); + } + + public function testTernary() + { + $this->assertNotMatch('$x=0; D: $foo ? ($x = 1) : bar(); U:$x;'); + $this->assertNotMatch('$x=0; D: $foo ? ($x = 1) : ($x = 2); U:$x;'); + } + + public function testExprVariableReAssignment() + { + $this->assertMatch('$a = $b = 1; D: $x = $a + $b; U:$x;'); + $this->assertNotMatch('$a = $b = 1; D: $x = $a + $b; $a = 1; U:$x;'); + $this->assertNotMatch('$a = $b = 1; D: $x = $a + $b; f($b = 1); U:$x;'); + $this->assertMatch('$a = $b = 1; D: $x = $a + $b; $c = 1; U:$x;'); + + // Even if the sub-expression is change conditionally + $this->assertNotMatch('$a = $b = 1; D: $x = $a + $b; $c ? ($a = 1) : 0; U:$x;'); + } + + public function testMergeDefinitions() + { + $this->assertNotMatch('D:$y=$x+$x; if ($x) { $x = 1; }; U:$y;'); + } + + public function testMergesWithOneDefinition() + { + $this->assertNotMatch('while ($y) { if ($y) { echo $x; } else { D: $x = 1; } } U: $x;'); + } + + public function testRedefinitionUsingItself() + { + $this->assertMatch('$x=1; D: $x=$x+1; U:$x;'); + $this->assertNotMatch('$x=1; D: $x = $x+1; $x=1; U:$x;'); + } + + public function testMultipleDefinitionsWithDependence() + { + $this->assertMatch('$a = $b = 1; $x = $a; + D: $x = $b; U: $x;'); + $this->assertMatch('$a = $b = 1; $x = $a; + D: $x = $b; $a = 1; U: $x;'); + $this->assertNotMatch('$a = $b = 1; $x = $a; + D: $x = $b; $b = 1; U: $x;'); + } + + public function testAssignmentOp() + { + $this->assertMatch('$x = 0; D: $x += 1; U: $x;'); + $this->assertMatch('$x = 0; D: $x *= 1; U: $x;'); + $this->assertNotMatch('D: $x = 0; $x += 1; U: $x;'); + } + + public function testIncAndDec() + { + $this->assertMatch('$x = 0; D:$x++; U:$x;'); + $this->assertMatch('$x = 0; D:$x--; U:$x;'); + } + + public function testFunctionParams1() + { + $this->computeDefUse('if ($param2) { D: $param1 = 1; U: $param1; }'); + $this->assertSame($this->def, $this->analysis->getDefiningNode('param1', $this->use)); + } + + public function testFunctionParams2() + { + $this->computeDefUse('if ($param2) { D: $param1 = 1; } U: $param1;'); + $this->assertNotSame($this->def, $this->analysis->getDefiningNode('param1', $this->use)); + } + + public function testException() + { + $this->assertMatch('try { f(); D: $x = 1; U: $x; } catch (\Exception $ex) { }'); + $this->assertMatch('try { D: $x = 1; f(); U: $x; } catch (\Exception $ex) { }'); + $this->assertMatch('D: $x = 1; try { f(); } catch (\Exception $ex) { } U: $x;'); + $this->assertNotMatch('D: $x = 1; try { f(); } catch (\Exception $ex) { $x = 2; } U: $x;'); + $this->assertNotMatch('$x = 1; try { f(); } catch (\Exception $ex) { D: $x = 2; } U: $x;'); + $this->assertMatch('try { D: $x = 0; f(); } catch (\Exception $ex) { } U: $x;'); + $this->assertMatch('try { D: $x = 0; f(); } catch (\Exception $ex) { U: $x; }'); + $this->assertNotMatch('try { D: $x = 0; f(); } catch (\Exception $x) { } U: $x;'); + $this->assertNotMatch('try { D: $x = 0; f(); } catch (\Exception $x) { U: $x; }'); + $this->assertMatch('try { $x = 0; f(); } catch (\Exception $x) { DP_Stmt_Catch: U: $x; }'); + } + + public function testListAssignment() + { + $this->assertMatch('$x = 1; D: list($x, $y) = array(1,2); U: $x;'); + $this->assertMatch('list($x) = array(1); D: $x = 1; U: $x;'); + } + + public function testAssignByRef() + { + $this->assertMatch('$x = $y = 1; D: $x &= $y; U: $x;'); + } + + public function testAnalysisAttachesDefiningExpr() + { + $this->assertMatch('$x=1; D: $x=2; U: f($x);'); + + $this->assertInstanceOf('PHPParser_Node_Expr_FuncCall', $this->use); + + $defExpr = $this->use->args[0]->value->getAttribute('defining_expr'); + $this->assertNotNull($defExpr); + $this->assertSame($this->def->expr, $defExpr); + } + + public function testDefiningExprIsNotAttachedToAssigns() + { + $this->assertMatch('$x = 0; D:$x=1; U: $x;'); + $this->assertNull($this->def->var->getAttribute('defining_expr')); + } + + private function assertMatch($code) + { + $this->computeDefUse($code); + $this->assertSame($this->def, $foundDef = $this->analysis->getDefiningNode('x', $this->use), + 'Expected: '.\Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::getStringRepr($this->def) + .' - Found: '.\Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::getStringRepr($foundDef)); + } + + private function assertNotMatch($code) + { + $this->computeDefUse($code); + $this->assertNotSame($this->def, $this->analysis->getDefiningNode('x', $this->use), + 'Found definition was not expected: '.\Scrutinizer\PhpAnalyzer\PhpParser\NodeUtil::getStringRepr($this->def)); + } + + private function computeDefUse($code) + { + $code = sprintf('createScope($ast); + + $cfa = new ControlFlowAnalysis(); + $cfa->process($ast); + $cfg = $cfa->getGraph(); + + $this->analysis = new MustBeReachingDefAnalysis($cfg, $scope); + $this->analysis->analyze(); + + $this->def = $this->use = null; + + NodeTraversal::traverseWithCallback($ast, new PreOrderCallback(function(NodeTraversal $t, \PHPParser_Node $node) { + if ( ! $node instanceof \PHPParser_Node_Stmt_Label) { + return; + } + + if ('D' === $node->name) { + $this->def = $node->getAttribute('next'); + } else if ('U' === $node->name) { + $this->use = $node->getAttribute('next'); + } else if (0 === strpos($node->name, 'DP_')) { + $className = 'PHPParser_Node_'.substr($node->name, 3); + + $parent = $node; + while (null !== $parent = $parent->getAttribute('parent')) { + if ($parent instanceof $className) { + $this->def = $parent; + + return; + } + } + + throw new \RuntimeException(sprintf('Did not find any parent of class "%s".', $className)); + } + })); + + $this->assertNotNull($this->def, 'Did not find "D" (definition) label in the code.'); + $this->assertNotNull($this->use, 'Did not find "U" (usage) label in the code.'); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingJoinOpTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingJoinOpTest.php new file mode 100644 index 0000000..f5bf90d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/DataFlow/VariableReachability/MustBeReachingJoinOpTest.php @@ -0,0 +1,95 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\DataFlow\VariableReachability; + +use Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability\Definition; +use Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability\DefinitionLattice; + +class MustBeReachingJoinOpTest extends \PHPUnit_Framework_TestCase +{ + private $op; + private $scope; + private $var; + private $a; + private $b; + + public function testNullInBoth() + { + $this->a[$this->var] = null; + $this->b[$this->var] = null; + $this->assertNull($this->computeJoin()); + } + + public function testJoinSameInAAndB() + { + $this->a[$this->var] = + $this->b[$this->var] = new Definition($this->getMock('PHPParser_Node')); + $this->assertSame($this->a[$this->var], $this->computeJoin()); + } + + public function testJoinExistsInBAndNullInA() + { + $this->a[$this->var] = null; + $this->b[$this->var] = new Definition($this->getMock('PHPParser_Node')); + $this->assertNull($this->computeJoin()); + } + + public function testJoinExistsOnlyInB() + { + $this->b[$this->var] = new Definition($this->getMock('PHPParser_Node')); + $this->assertSame($this->b[$this->var], $this->computeJoin()); + } + + public function testJoinExistsInAAndNullInB() + { + $this->a[$this->var] = new Definition($this->getMock('PHPParser_Node')); + $this->b[$this->var] = null; + + $this->assertNull($this->computeJoin()); + } + + public function testJoinExistsOnlyInA() + { + $this->a[$this->var] = new Definition($this->getMock('PHPParser_Node')); + + $this->assertSame($this->a[$this->var], $this->computeJoin()); + } + + public function testJoinDiffDefinitions() + { + $this->a[$this->var] = new Definition($this->getMock('PHPParser_Node')); + $this->b[$this->var] = new Definition($this->getMock('PHPParser_Node')); + + $this->assertNull($this->computeJoin()); + } + + private function computeJoin() + { + return call_user_func($this->op, array($this->a, $this->b))[$this->var]; + } + + protected function setUp() + { + $this->op = \Scrutinizer\PhpAnalyzer\DataFlow\VariableReachability\MustBeReachingDefAnalysis::createJoinOperation(); + $this->scope = new \Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope($this->getMock('PHPParser_Node')); + $this->var = new \Scrutinizer\PhpAnalyzer\PhpParser\Scope\Variable('x', null, $this->scope); + $this->a = new DefinitionLattice(); + $this->b = new DefinitionLattice(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/XmlSerializationVisitor.after.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/XmlSerializationVisitor.after.php new file mode 100644 index 0000000..e8fb09b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/XmlSerializationVisitor.after.php @@ -0,0 +1,308 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\Fixture; + +use JMS\SerializerBundle\Exception\RuntimeException; +use JMS\SerializerBundle\Metadata\ClassMetadata; +use JMS\SerializerBundle\Metadata\PropertyMetadata; +use JMS\SerializerBundle\Serializer\Naming\PropertyNamingStrategyInterface; + +/** + * XmlSerializationVisitor. + * + * @author Johannes M. Schmitt + */ +class XmlSerializationVisitor extends AbstractSerializationVisitor +{ + public $document; + + private $navigator; + private $defaultRootName = 'result'; + private $defaultVersion = '1.0'; + private $defaultEncoding = 'UTF-8'; + private $stack; + private $metadataStack; + private $currentNode; + private $currentMetadata; + private $hasValue; + + public function setDefaultRootName($name) + { + $this->defaultRootName = $name; + } + + public function setDefaultVersion($version) + { + $this->defaultVersion = $version; + } + + public function setDefaultEncoding($encoding) + { + $this->defaultEncoding = $encoding; + } + + public function setNavigator(GraphNavigator $navigator) + { + $this->navigator = $navigator; + $this->document = null; + $this->stack = new \SplStack; + $this->metadataStack = new \SplStack; + } + + public function getNavigator() + { + return $this->navigator; + } + + public function visitString($data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $this->currentNode->appendChild($this->document->createCDATASection($data)); + + return; + } + + return $this->document->createCDATASection($data); + } + + public function visitBoolean($data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $this->currentNode->appendChild($this->document->createTextNode($data ? 'true' : 'false')); + + return; + } + + return $this->document->createTextNode($data ? 'true' : 'false'); + } + + public function visitInteger($data, $type) + { + return $this->visitNumeric($data, $type); + } + + public function visitDouble($data, $type) + { + return $this->visitNumeric($data, $type); + } + + public function visitArray($data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + } + + $entryName = (null !== $this->currentMetadata && null !== $this->currentMetadata->xmlEntryName) ? $this->currentMetadata->xmlEntryName : 'entry'; + $keyAttributeName = (null !== $this->currentMetadata && null !== $this->currentMetadata->xmlKeyAttribute) ? $this->currentMetadata->xmlKeyAttribute : null; + + foreach ($data as $k => $v) { + $entryNode = $this->document->createElement($entryName); + $this->currentNode->appendChild($entryNode); + $this->setCurrentNode($entryNode); + + if (null !== $keyAttributeName) { + $entryNode->setAttribute($keyAttributeName, (string) $k); + } + + if (null !== $node = $this->navigator->accept($v, null, $this)) { + $this->currentNode->appendChild($node); + } + + $this->revertCurrentNode(); + } + } + + public function visitTraversable($data, $type) + { + return $this->visitArray($data, $type); + } + + public function startVisitingObject(ClassMetadata $metadata, $data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, false); + $this->document->appendChild($this->currentNode = $this->document->createElement($metadata->xmlRootName ?: $this->defaultRootName)); + } + + $this->hasValue = false; + } + + public function visitProperty(PropertyMetadata $metadata, $object) + { + $v = (null === $metadata->getter ? $metadata->reflection->getValue($object) + : $object->{$metadata->getter}()); + + if (null === $v) { + return; + } + + if ($metadata->xmlAttribute) { + $node = $this->navigator->accept($v, null, $this); + if (!$node instanceof \DOMCharacterData) { + throw new RuntimeException(sprintf('Unsupported value for XML attribute. Expected character data, but got %s.', json_encode($v))); + } + + $this->currentNode->setAttribute($this->namingStrategy->translateName($metadata), $node->nodeValue); + + return; + } + + if (($metadata->xmlValue && $this->currentNode->childNodes->length > 0) + || (!$metadata->xmlValue && $this->hasValue)) { + throw new \RuntimeException(sprintf('If you make use of @XmlValue, all other properties in the class must have the @XmlAttribute annotation. Invalid usage detected in class %s.', $metadata->reflection->class)); + } + + if ($metadata->xmlValue) { + $this->hasValue = true; + + $node = $this->navigator->accept($v, null, $this); + if (!$node instanceof \DOMCharacterData) { + throw new RuntimeException(sprintf('Unsupported value for property %s::$%s. Expected character data, but got %s.', $metadata->reflection->class, $metadata->reflection->name, is_object($node) ? get_class($node) : gettype($node))); + } + + $this->currentNode->appendChild($node); + + return; + } + + if ($addEnclosingElement = (!$metadata->xmlCollection || !$metadata->xmlCollectionInline) && !$metadata->inline) { + $element = $this->document->createElement($this->namingStrategy->translateName($metadata)); + $this->setCurrentNode($element); + } + + $this->setCurrentMetadata($metadata); + + if (null !== $node = $this->navigator->accept($v, null, $this)) { + $this->currentNode->appendChild($node); + } + + $this->revertCurrentMetadata(); + + if ($addEnclosingElement) { + $this->revertCurrentNode(); + + if ($element->hasChildNodes() || $element->hasAttributes()) { + $this->currentNode->appendChild($element); + } + } + } + + public function endVisitingObject(ClassMetadata $metadata, $data, $type) + { + } + + public function visitPropertyUsingCustomHandler(PropertyMetadata $metadata, $object) + { + // TODO + return false; + } + + public function getResult() + { + return $this->document->saveXML(); + } + + public function getCurrentNode() + { + return $this->currentNode; + } + + public function getCurrentMetadata() + { + return $this->currentMetadata; + } + + public function getDocument() + { + return $this->document; + } + + public function setCurrentMetadata(PropertyMetadata $metadata) + { + $this->metadataStack->push($this->currentMetadata); + $this->currentMetadata = $metadata; + } + + public function setCurrentNode(\DOMNode $node) + { + $this->stack->push($this->currentNode); + $this->currentNode = $node; + } + + public function revertCurrentNode() + { + return $this->currentNode = $this->stack->pop(); + } + + public function revertCurrentMetadata() + { + return $this->currentMetadata = $this->metadataStack->pop(); + } + + public function createDocument($version = null, $encoding = null, $addRoot = true) + { + $doc = new \DOMDocument($version ?: $this->defaultVersion, $encoding ?: $this->defaultEncoding); + $doc->formatOutput = true; + + if ($addRoot) { + $this->setCurrentNode($rootNode = $doc->createElement($this->defaultRootName)); + $doc->appendChild($rootNode); + } + + return $doc; + } + + private function visitNumeric($data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $this->currentNode->appendChild($textNode = $this->document->createTextNode((string) $data)); + + return $textNode; + } + + return $this->document->createTextNode((string) $data); + } + + public function visitLink($data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + } + + foreach ($data as $collectionName => $linkNodes) { + if (null !== $rootNode = $this->document->createElement($collectionName)) { + $this->currentNode->appendChild($rootNode); + } + + foreach ($linkNodes as $nodeName => $links) { + $n = $this->document->createElement($nodeName); + $rootNode->appendChild($n); + + foreach($links as $link) { + foreach($link as $attribute => $value) { + $n->setAttribute($attribute, $value); + } + } + } + } + } +} diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/XmlSerializationVisitor.before.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/XmlSerializationVisitor.before.php new file mode 100644 index 0000000..8c57984 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/XmlSerializationVisitor.before.php @@ -0,0 +1,284 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\Fixture; + +use JMS\SerializerBundle\Exception\RuntimeException; +use JMS\SerializerBundle\Metadata\ClassMetadata; +use JMS\SerializerBundle\Metadata\PropertyMetadata; +use JMS\SerializerBundle\Serializer\Naming\PropertyNamingStrategyInterface; + +/** + * XmlSerializationVisitor. + * + * @author Johannes M. Schmitt + */ +class XmlSerializationVisitor extends AbstractSerializationVisitor +{ + public $document; + + private $navigator; + private $defaultRootName = 'result'; + private $defaultVersion = '1.0'; + private $defaultEncoding = 'UTF-8'; + private $stack; + private $metadataStack; + private $currentNode; + private $currentMetadata; + private $hasValue; + + public function setDefaultRootName($name) + { + $this->defaultRootName = $name; + } + + public function setDefaultVersion($version) + { + $this->defaultVersion = $version; + } + + public function setDefaultEncoding($encoding) + { + $this->defaultEncoding = $encoding; + } + + public function setNavigator(GraphNavigator $navigator) + { + $this->navigator = $navigator; + $this->document = null; + $this->stack = new \SplStack; + $this->metadataStack = new \SplStack; + } + + public function getNavigator() + { + return $this->navigator; + } + + public function visitString($data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $this->currentNode->appendChild($this->document->createCDATASection($data)); + + return; + } + + return $this->document->createCDATASection($data); + } + + public function visitBoolean($data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $this->currentNode->appendChild($this->document->createTextNode($data ? 'true' : 'false')); + + return; + } + + return $this->document->createTextNode($data ? 'true' : 'false'); + } + + public function visitInteger($data, $type) + { + return $this->visitNumeric($data, $type); + } + + public function visitDouble($data, $type) + { + return $this->visitNumeric($data, $type); + } + + public function visitArray($data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + } + + $entryName = (null !== $this->currentMetadata && null !== $this->currentMetadata->xmlEntryName) ? $this->currentMetadata->xmlEntryName : 'entry'; + $keyAttributeName = (null !== $this->currentMetadata && null !== $this->currentMetadata->xmlKeyAttribute) ? $this->currentMetadata->xmlKeyAttribute : null; + + foreach ($data as $k => $v) { + $entryNode = $this->document->createElement($entryName); + $this->currentNode->appendChild($entryNode); + $this->setCurrentNode($entryNode); + + if (null !== $keyAttributeName) { + $entryNode->setAttribute($keyAttributeName, (string) $k); + } + + if (null !== $node = $this->navigator->accept($v, null, $this)) { + $this->currentNode->appendChild($node); + } + + $this->revertCurrentNode(); + } + } + + public function visitTraversable($data, $type) + { + return $this->visitArray($data, $type); + } + + public function startVisitingObject(ClassMetadata $metadata, $data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, false); + $this->document->appendChild($this->currentNode = $this->document->createElement($metadata->xmlRootName ?: $this->defaultRootName)); + } + + $this->hasValue = false; + } + + public function visitProperty(PropertyMetadata $metadata, $object) + { + $v = (null === $metadata->getter ? $metadata->reflection->getValue($object) + : $object->{$metadata->getter}()); + + if (null === $v) { + return; + } + + if ($metadata->xmlAttribute) { + $node = $this->navigator->accept($v, null, $this); + if (!$node instanceof \DOMCharacterData) { + throw new RuntimeException(sprintf('Unsupported value for XML attribute. Expected character data, but got %s.', json_encode($v))); + } + + $this->currentNode->setAttribute($this->namingStrategy->translateName($metadata), $node->nodeValue); + + return; + } + + if (($metadata->xmlValue && $this->currentNode->childNodes->length > 0) + || (!$metadata->xmlValue && $this->hasValue)) { + throw new \RuntimeException(sprintf('If you make use of @XmlValue, all other properties in the class must have the @XmlAttribute annotation. Invalid usage detected in class %s.', $metadata->reflection->class)); + } + + if ($metadata->xmlValue) { + $this->hasValue = true; + + $node = $this->navigator->accept($v, null, $this); + if (!$node instanceof \DOMCharacterData) { + throw new RuntimeException(sprintf('Unsupported value for property %s::$%s. Expected character data, but got %s.', $metadata->reflection->class, $metadata->reflection->name, is_object($node) ? get_class($node) : gettype($node))); + } + + $this->currentNode->appendChild($node); + + return; + } + + if ($addEnclosingElement = (!$metadata->xmlCollection || !$metadata->xmlCollectionInline) && !$metadata->inline) { + $element = $this->document->createElement($this->namingStrategy->translateName($metadata)); + $this->setCurrentNode($element); + } + + $this->setCurrentMetadata($metadata); + + if (null !== $node = $this->navigator->accept($v, null, $this)) { + $this->currentNode->appendChild($node); + } + + $this->revertCurrentMetadata(); + + if ($addEnclosingElement) { + $this->revertCurrentNode(); + + if ($element->hasChildNodes() || $element->hasAttributes()) { + $this->currentNode->appendChild($element); + } + } + } + + public function endVisitingObject(ClassMetadata $metadata, $data, $type) + { + } + + public function visitPropertyUsingCustomHandler(PropertyMetadata $metadata, $object) + { + // TODO + return false; + } + + public function getResult() + { + return $this->document->saveXML(); + } + + public function getCurrentNode() + { + return $this->currentNode; + } + + public function getCurrentMetadata() + { + return $this->currentMetadata; + } + + public function getDocument() + { + return $this->document; + } + + public function setCurrentMetadata(PropertyMetadata $metadata) + { + $this->metadataStack->push($this->currentMetadata); + $this->currentMetadata = $metadata; + } + + public function setCurrentNode(\DOMNode $node) + { + $this->stack->push($this->currentNode); + $this->currentNode = $node; + } + + public function revertCurrentNode() + { + return $this->currentNode = $this->stack->pop(); + } + + public function revertCurrentMetadata() + { + return $this->currentMetadata = $this->metadataStack->pop(); + } + + public function createDocument($version = null, $encoding = null, $addRoot = true) + { + $doc = new \DOMDocument($version ?: $this->defaultVersion, $encoding ?: $this->defaultEncoding); + $doc->formatOutput = true; + + if ($addRoot) { + $this->setCurrentNode($rootNode = $doc->createElement($this->defaultRootName)); + $doc->appendChild($rootNode); + } + + return $doc; + } + + private function visitNumeric($data, $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $this->currentNode->appendChild($textNode = $this->document->createTextNode((string) $data)); + + return $textNode; + } + + return $this->document->createTextNode((string) $data); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/YamlDriver.after.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/YamlDriver.after.php new file mode 100644 index 0000000..d93a2b5 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/YamlDriver.after.php @@ -0,0 +1,214 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\Fixture; + +use JMS\SerializerBundle\Exception\RuntimeException; +use JMS\SerializerBundle\Annotation\ExclusionPolicy; +use Metadata\MethodMetadata; +use JMS\SerializerBundle\Metadata\PropertyMetadata; +use JMS\SerializerBundle\Metadata\VirtualPropertyMetadata; +use JMS\SerializerBundle\Metadata\ClassMetadata; +use Symfony\Component\Yaml\Yaml; +use Metadata\Driver\AbstractFileDriver; + +class YamlDriver extends AbstractFileDriver +{ + protected function loadMetadataFromFile(\ReflectionClass $class, $file) + { + $config = Yaml::parse(file_get_contents($file)); + + if (!isset($config[$name = $class->getName()])) { + throw new RuntimeException(sprintf('Expected metadata for class %s to be defined in %s.', $class->getName(), $file)); + } + + $config = $config[$name]; + $metadata = new ClassMetadata($name); + $metadata->fileResources[] = $file; + $metadata->fileResources[] = $class->getFileName(); + $exclusionPolicy = isset($config['exclusion_policy']) ? strtoupper($config['exclusion_policy']) : 'NONE'; + $excludeAll = isset($config['exclude']) ? (Boolean) $config['exclude'] : false; + $classAccessType = isset($config['access_type']) ? $config['access_type'] : PropertyMetadata::ACCESS_TYPE_PROPERTY; + + $propertiesMetadata = array(); + + if (isset($config['accessor_order'])) { + $metadata->setAccessorOrder($config['accessor_order'], isset($config['custom_accessor_order']) ? $config['custom_accessor_order'] : array()); + } + + if (isset($config['xml_root_name'])) { + $metadata->xmlRootName = (string) $config['xml_root_name']; + } + + if (array_key_exists('virtual_properties', $config) ) { + + foreach ( $config['virtual_properties'] as $methodName => $propertySettings ) { + + if ( !$class->hasMethod( $methodName ) ) { + throw new RuntimeException('The method '.$methodName.' not found in class ' . $class->name); + } + + $virtualPropertyMetadata = new VirtualPropertyMetadata( $name, $methodName ); + + $propertiesMetadata[$methodName] = $virtualPropertyMetadata; + $config['properties'][$methodName] = $propertySettings; + } + } + + if (!$excludeAll) { + foreach ($class->getProperties() as $property) { + if ($name !== $property->getDeclaringClass()->getName()) { + continue; + } + $pName = $property->name; + $propertiesMetadata[$pName] = new PropertyMetadata($name, $pName); + } + + foreach ($propertiesMetadata as $pName => $pMetadata) { + + $isExclude = $isExpose = false; + if (isset($config['properties'][$pName])) { + $pConfig = $config['properties'][$pName]; + + if (isset($pConfig['exclude'])) { + $isExclude = (Boolean) $pConfig['exclude']; + } + + if (isset($pConfig['expose'])) { + $isExpose = (Boolean) $pConfig['expose']; + } + + if (isset($pConfig['since_version'])) { + $pMetadata->sinceVersion = (string) $pConfig['since_version']; + } + + if (isset($pConfig['until_version'])) { + $pMetadata->untilVersion = (string) $pConfig['until_version']; + } + + if (isset($pConfig['serialized_name'])) { + $pMetadata->serializedName = (string) $pConfig['serialized_name']; + } + + if (isset($pConfig['type'])) { + $pMetadata->type = (string) $pConfig['type']; + } + if (isset($pConfig['groups'])) { + $pMetadata->groups = $pConfig['groups']; + } + + if (isset($pConfig['xml_list'])) { + $pMetadata->xmlCollection = true; + + $colConfig = $pConfig['xml_list']; + if (isset($colConfig['inline'])) { + $pMetadata->xmlCollectionInline = (Boolean) $colConfig['inline']; + } + + if (isset($colConfig['entry_name'])) { + $pMetadata->xmlEntryName = (string) $colConfig['entry_name']; + } + } + + if (isset($pConfig['xml_map'])) { + $pMetadata->xmlCollection = true; + + $colConfig = $pConfig['xml_map']; + if (isset($colConfig['inline'])) { + $pMetadata->xmlCollectionInline = (Boolean) $colConfig['inline']; + } + + if (isset($colConfig['entry_name'])) { + $pMetadata->xmlEntryName = (string) $colConfig['entry_name']; + } + + if (isset($colConfig['key_attribute_name'])) { + $pMetadata->xmlKeyAttribute = $colConfig['key_attribute_name']; + } + } + + if (isset($pConfig['xml_attribute'])) { + $pMetadata->xmlAttribute = (Boolean) $pConfig['xml_attribute']; + } + + if (isset($pConfig['xml_value'])) { + $pMetadata->xmlValue = (Boolean) $pConfig['xml_value']; + } + + $pMetadata->setAccessor( + isset($pConfig['access_type']) ? $pConfig['access_type'] : $classAccessType, + isset($pConfig['accessor']) ? $pConfig['accessor'] : null + ); + + if (isset($pConfig['inline'])) { + $pMetadata->inline = (Boolean) $pConfig['inline']; + } + + if (isset($pConfig['read_only'])) { + $pMetadata->readOnly = (Boolean) $pConfig['read_only']; + } + } + if ((ExclusionPolicy::NONE === $exclusionPolicy && !$isExclude) + || (ExclusionPolicy::ALL === $exclusionPolicy && $isExpose)) { + $metadata->addPropertyMetadata($pMetadata); + } + } + } + + if (isset($config['callback_methods'])) { + $cConfig = $config['callback_methods']; + + if (isset($cConfig['pre_serialize'])) { + $metadata->preSerializeMethods = $this->getCallbackMetadata($class, $cConfig['pre_serialize']); + } + if (isset($cConfig['post_serialize'])) { + $metadata->postSerializeMethods = $this->getCallbackMetadata($class, $cConfig['post_serialize']); + } + if (isset($cConfig['post_deserialize'])) { + $metadata->postDeserializeMethods = $this->getCallbackMetadata($class, $cConfig['post_deserialize']); + } + } + + return $metadata; + } + + protected function getExtension() + { + return 'yml'; + } + + private function getCallbackMetadata(\ReflectionClass $class, $config) + { + if (is_string($config)) { + $config = array($config); + } else if (!is_array($config)) { + throw new RuntimeException(sprintf('callback methods expects a string, or an array of strings that represent method names, but got %s.', json_encode($cConfig['pre_serialize']))); + } + + $methods = array(); + foreach ($config as $name) { + if (!$class->hasMethod($name)) { + throw new RuntimeException(sprintf('The method %s does not exist in class %s.', $name, $class->getName())); + } + + $methods[] = new MethodMetadata($class->getName(), $name); + } + + return $methods; + } +} diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/YamlDriver.before.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/YamlDriver.before.php new file mode 100644 index 0000000..067840e --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Fixture/YamlDriver.before.php @@ -0,0 +1,193 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\Fixture; + +use JMS\SerializerBundle\Exception\RuntimeException; +use JMS\SerializerBundle\Annotation\ExclusionPolicy; +use Metadata\MethodMetadata; +use JMS\SerializerBundle\Metadata\PropertyMetadata; +use JMS\SerializerBundle\Metadata\ClassMetadata; +use Symfony\Component\Yaml\Yaml; +use Metadata\Driver\AbstractFileDriver; + +class YamlDriver extends AbstractFileDriver +{ + protected function loadMetadataFromFile(\ReflectionClass $class, $file) + { + $config = Yaml::parse(file_get_contents($file)); + + if (!isset($config[$name = $class->getName()])) { + throw new RuntimeException(sprintf('Expected metadata for class %s to be defined in %s.', $class->getName(), $file)); + } + + $config = $config[$name]; + $metadata = new ClassMetadata($name); + $metadata->fileResources[] = $file; + $metadata->fileResources[] = $class->getFileName(); + $exclusionPolicy = isset($config['exclusion_policy']) ? strtoupper($config['exclusion_policy']) : 'NONE'; + $excludeAll = isset($config['exclude']) ? (Boolean) $config['exclude'] : false; + $classAccessType = isset($config['access_type']) ? $config['access_type'] : PropertyMetadata::ACCESS_TYPE_PROPERTY; + + if (isset($config['accessor_order'])) { + $metadata->setAccessorOrder($config['accessor_order'], isset($config['custom_accessor_order']) ? $config['custom_accessor_order'] : array()); + } + + if (isset($config['xml_root_name'])) { + $metadata->xmlRootName = (string) $config['xml_root_name']; + } + + if (!$excludeAll) { + foreach ($class->getProperties() as $property) { + if ($name !== $property->getDeclaringClass()->getName()) { + continue; + } + + $pMetadata = new PropertyMetadata($name, $pName = $property->getName()); + $isExclude = $isExpose = false; + if (isset($config['properties'][$pName])) { + $pConfig = $config['properties'][$pName]; + + if (isset($pConfig['exclude'])) { + $isExclude = (Boolean) $pConfig['exclude']; + } + + if (isset($pConfig['expose'])) { + $isExpose = (Boolean) $pConfig['expose']; + } + + if (isset($pConfig['since_version'])) { + $pMetadata->sinceVersion = (string) $pConfig['since_version']; + } + + if (isset($pConfig['until_version'])) { + $pMetadata->untilVersion = (string) $pConfig['until_version']; + } + + if (isset($pConfig['serialized_name'])) { + $pMetadata->serializedName = (string) $pConfig['serialized_name']; + } + + if (isset($pConfig['type'])) { + $pMetadata->type = (string) $pConfig['type']; + } + if (isset($pConfig['groups'])) { + $pMetadata->groups = $pConfig['groups']; + } + + if (isset($pConfig['xml_list'])) { + $pMetadata->xmlCollection = true; + + $colConfig = $pConfig['xml_list']; + if (isset($colConfig['inline'])) { + $pMetadata->xmlCollectionInline = (Boolean) $colConfig['inline']; + } + + if (isset($colConfig['entry_name'])) { + $pMetadata->xmlEntryName = (string) $colConfig['entry_name']; + } + } + + if (isset($pConfig['xml_map'])) { + $pMetadata->xmlCollection = true; + + $colConfig = $pConfig['xml_map']; + if (isset($colConfig['inline'])) { + $pMetadata->xmlCollectionInline = (Boolean) $colConfig['inline']; + } + + if (isset($colConfig['entry_name'])) { + $pMetadata->xmlEntryName = (string) $colConfig['entry_name']; + } + + if (isset($colConfig['key_attribute_name'])) { + $pMetadata->xmlKeyAttribute = $colConfig['key_attribute_name']; + } + } + + if (isset($pConfig['xml_attribute'])) { + $pMetadata->xmlAttribute = (Boolean) $pConfig['xml_attribute']; + } + + if (isset($pConfig['xml_value'])) { + $pMetadata->xmlValue = (Boolean) $pConfig['xml_value']; + } + + $pMetadata->setAccessor( + isset($pConfig['access_type']) ? $pConfig['access_type'] : $classAccessType, + isset($pConfig['accessor']) ? $pConfig['accessor'] : null + ); + + if (isset($pConfig['inline'])) { + $pMetadata->inline = (Boolean) $pConfig['inline']; + } + + if (isset($pConfig['read_only'])) { + $pMetadata->readOnly = (Boolean) $pConfig['read_only']; + } + } + if ((ExclusionPolicy::NONE === $exclusionPolicy && !$isExclude) + || (ExclusionPolicy::ALL === $exclusionPolicy && $isExpose)) { + $metadata->addPropertyMetadata($pMetadata); + } + } + } + + if (isset($config['callback_methods'])) { + $cConfig = $config['callback_methods']; + + if (isset($cConfig['pre_serialize'])) { + $metadata->preSerializeMethods = $this->getCallbackMetadata($class, $cConfig['pre_serialize']); + } + if (isset($cConfig['post_serialize'])) { + $metadata->postSerializeMethods = $this->getCallbackMetadata($class, $cConfig['post_serialize']); + } + if (isset($cConfig['post_deserialize'])) { + $metadata->postDeserializeMethods = $this->getCallbackMetadata($class, $cConfig['post_deserialize']); + } + } + + return $metadata; + } + + protected function getExtension() + { + return 'yml'; + } + + private function getCallbackMetadata(\ReflectionClass $class, $config) + { + if (is_string($config)) { + $config = array($config); + } else if (!is_array($config)) { + throw new RuntimeException(sprintf('callback methods expects a string, or an array of strings that represent method names, but got %s.', json_encode($cConfig['pre_serialize']))); + } + + $methods = array(); + foreach ($config as $name) { + if (!$class->hasMethod($name)) { + throw new RuntimeException(sprintf('The method %s does not exist in class %s.', $name, $class->getName())); + } + + $methods[] = new MethodMetadata($class->getName(), $name); + } + + return $methods; + } +} + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/LibrariesTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/LibrariesTest.php new file mode 100644 index 0000000..a39002f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/LibrariesTest.php @@ -0,0 +1,145 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser; + +use Scrutinizer\PhpAnalyzer\Model\Comment; +use Scrutinizer\PhpAnalyzer\Model\FileCollection; +use Scrutinizer\PhpAnalyzer\Util\TestUtils; +use Symfony\Component\Config\Definition\ArrayNode; + +class LibrariesTest extends \PHPUnit_Framework_TestCase +{ + private $em; + private $analyzer; + + /** + * @dataProvider getLibraries + */ + public function testLibrary($zipFile) + { + $libName = basename($zipFile, '.zip'); + + $config = array(); + if (is_file($configFile = __DIR__.'/libraries/'.$libName.'-config.json')) { + $config = json_decode(file_get_contents($configFile), true); + } + + $files = FileCollection::createFromZipFile($zipFile, null, isset($config['filter']) ? $config['filter'] : array()); + $this->analyzer->analyze($files); + + $actualComments = $this->dumpComments($files); + if ( ! is_file($commentFile = __DIR__.'/libraries/'.$libName.'-comments.txt')) { + file_put_contents($commentFile.'.tmp', $actualComments); + $this->fail(sprintf('The comment file "%s" was not found.', $commentFile)); + } + $this->assertEquals(file_get_contents($commentFile), $actualComments); + + $nonExistentFiles = array(); + foreach ($files as $file) { + $fixedFilePath = __DIR__.'/libraries/'.$libName.'-'.$file->getName(); + + if ( ! $file->hasFixedFileWithChanges()) { + $this->assertFileNotExists($fixedFilePath.'.diff'); + + continue; + } + + $diff = \Scrutinizer\Util\DiffUtils::generate($file->getContent(), $file->getFixedFile()->getContent()); + + if ( ! is_file($fixedFilePath.'.diff')) { + if ( ! is_dir($dir = dirname($fixedFilePath))) { + mkdir($dir, 0777, true); + } + + file_put_contents($fixedFilePath.'.tmp.diff', $diff); + $nonExistentFiles[] = $fixedFilePath.'.tmp.diff'; + + continue; + } + + $this->assertEquals(file_get_contents($fixedFilePath.'.diff'), $diff); + } + + $this->assertCount(0, $nonExistentFiles, "Some files are missing:\n".implode("\n", $nonExistentFiles)); + } + + protected function setUp() + { + $this->em = TestUtils::createTestEntityManager(); + $this->analyzer = \Scrutinizer\PhpAnalyzer\Analyzer::create($this->em); + + $defaultConfig = array(); + foreach ($this->analyzer->getPassConfig()->getConfigurablePasses() as $pass) { + $node = $pass->getConfiguration()->buildTree(); + assert($node instanceof ArrayNode); + + if (array_key_exists('enabled', $node->getChildren())) { + $defaultConfig[$node->getName()]['enabled'] = true; + } + } + + // Some manual changes. + $defaultConfig['suspicious_code']['overriding_parameter'] = true; + $defaultConfig['verify_php_doc_comments'] = array_merge($defaultConfig['verify_php_doc_comments'], array( + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + )); + + $this->analyzer->setConfigurationValues($defaultConfig); + } + + public function getLibraries() + { + $libraries = array(); + foreach (\Symfony\Component\Finder\Finder::create()->in(__DIR__.'/libraries')->name('*.zip')->files() as $file) { + $libraries[] = array($file->getRealPath()); + } + + return $libraries; + } + + private function dumpComments(FileCollection $col) + { + $files = $col->all(); + ksort($files); + + $content = ''; + foreach ($files as $file) { + if ( ! $file->hasComments()) { + continue; + } + + $content .= $file->getName()."\n"; + $content .= "---------------------------------------------------\n"; + + foreach ($file->getComments() as $line => $lineComments) { + foreach ($lineComments as $comment) { + /** @var $comment Comment */ + + $content .= "Line $line: ".$comment->getKey()."\n"; + } + } + + $content .= "\n"; + } + + return $content; + } +} diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/ClazzTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/ClazzTest.php new file mode 100644 index 0000000..03b846e --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/ClazzTest.php @@ -0,0 +1,78 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Model; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\BooleanType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\DoubleType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\IntegerType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NamedType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NoObjectType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\StringType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnknownType; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\InterfaceC; + +class ClazzTest extends \PHPUnit_Framework_TestCase +{ + /** + * @dataProvider getIsSubtypeTests + */ + public function testisSubTypeOf($thisType, $thatType, $expectedResult) + { + $this->assertSame($expectedResult, $thisType->isSubTypeOf($thatType)); + } + + public function getIsSubtypeTests() + { + $tests = array(); + + try { + $registry = new TypeRegistry(); + + $foo = new Clazz('Foo'); + $foo->setSuperClass('Bar'); + $foo->setSuperClasses(array('Bar')); + $foo->setImplementedInterfaces(array('Baz', 'FooBar')); + $foo->setNormalized(true); + + $tests[] = array($foo, new InterfaceC('FooBar'), true); + $tests[] = array($foo, new InterfaceC('Foo'), false); + $tests[] = array($foo, $foo, true); + $tests[] = array($foo, new Clazz('Bar'), true); + $tests[] = array($foo, new Clazz('FooBar'), false); + $tests[] = array($foo, NamedType::createResolved($registry, new InterfaceC('Baz')), true); + $tests[] = array($foo, NamedType::createResolved($registry, new InterfaceC('Moo')), false); + $tests[] = array($foo, NamedType::createResolved($registry, new Clazz('Foo')), true); + $tests[] = array($foo, NamedType::createResolved($registry, new Clazz('FoooFooo')), false); + $tests[] = array($foo, new UnknownType($registry, false), true); + $tests[] = array($foo, new NoObjectType($registry), true); + $tests[] = array($foo, new BooleanType($registry), false); + $tests[] = array($foo, new IntegerType($registry), false); + $tests[] = array($foo, new DoubleType($registry), false); + $tests[] = array($foo, new StringType($registry), false); + $tests[] = array($foo, $registry->createUnionType(array('string', new InterfaceC('Baz'))), true); + $tests[] = array($foo, $registry->createUnionType(array('string', 'boolean')), false); + } catch (\Exception $ex) { + echo sprintf("Could not get tests for isSubtypeTests(): %s\n", $ex->getMessage().' on line '.$ex->getLine().' in file '.$ex->getFile()); + } + + return $tests; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/CommentCollectionTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/CommentCollectionTest.php new file mode 100644 index 0000000..980cf1f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/CommentCollectionTest.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Model; + +class CommentCollectionTest extends \PHPUnit_Framework_TestCase +{ + public function testAdd() + { + $col = new \Scrutinizer\PhpAnalyzer\Model\CommentCollection(); + + $a = \Scrutinizer\PhpAnalyzer\Model\Comment::error('foo', 'bar'); + $b = \Scrutinizer\PhpAnalyzer\Model\Comment::error('foo', 'bar'); + + $col->add(1, $a); + $col->add(1, $b); + $this->assertCount(1, $col->all(1)); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php new file mode 100644 index 0000000..2752738 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php @@ -0,0 +1,72 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Model; + +use Scrutinizer\PhpAnalyzer\Model\FileCollection; + +class FileCollectionTest extends \PHPUnit_Framework_TestCase +{ + public function testCreateCollection() + { + $col = FileCollection::createFromDirectory(__DIR__.'/Fixture/DirWithSomeFiles'); + $this->assertCount(3, $col); + + $files = $col->all(); + $this->assertArrayHasKey('A.php', $files); + $this->assertArrayHasKey('Sub-Dir/B.php', $files); + $this->assertArrayHasKey('text.txt', $files); + } + + public function testCreateCollectionWithPattern() + { + $col = FileCollection::createFromDirectory(__DIR__.'/Fixture/DirWithSomeFiles', '*.php'); + $this->assertCount(2, $col); + + $files = $col->all(); + $this->assertArrayHasKey('A.php', $files); + $this->assertArrayHasKey('Sub-Dir/B.php', $files); + } + + public function testCreateCollectionWithFilter() + { + $col = FileCollection::createFromDirectory(__DIR__.'/Fixture/DirWithSomeFiles', null, array('paths' => 'Sub-Dir/*')); + $this->assertCount(1, $col); + $this->assertArrayHasKey('Sub-Dir/B.php', $col->all()); + + $col = FileCollection::createFromDirectory(__DIR__.'/Fixture', null, array('paths' => 'DirWithSomeFiles/*', 'excluded_paths' => array('*.php'))); + $this->assertCount(1, $col); + $this->assertArrayHasKey('DirWithSomeFiles/text.txt', $col->all()); + } + + public function testCreateFromZipFile() + { + $col = FileCollection::createFromZipFile(__DIR__.'/Fixture/zip-file.zip'); + $col2 = FileCollection::createFromDirectory(__DIR__.'/Fixture/DirWithSomeFiles'); + + $this->assertEquals($col2, $col); + } + + public function testCreateFromZipFileWithPattern() + { + $col = FileCollection::createFromZipFile(__DIR__.'/Fixture/zip-file.zip', '*.php'); + $col2 = FileCollection::createFromDirectory(__DIR__.'/Fixture/DirWithSomeFiles', '*.php'); + + $this->assertEquals($col2, $col); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileTest.php new file mode 100644 index 0000000..210111c --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileTest.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Model; + +use Scrutinizer\PhpAnalyzer\Model\File; + +class FileTest extends \PHPUnit_Framework_TestCase +{ + public function testCreateConvertsParserErrorToComment() + { + $file = File::create('missing_semicolon.php', 'assertInstanceOf('PHPParser_Node', $file->getAst()); + + $comments = $file->getComments(1); + $this->assertSame(1, count($comments)); + $this->assertContains('This code did not parse for me. Apparently, there is an error somewhere around this line', (string) $comments[0]); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/Basic/DefaultFoo.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/Basic/DefaultFoo.php new file mode 100644 index 0000000..7e7d73c --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/Basic/DefaultFoo.php @@ -0,0 +1,29 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Foo; + +class DefaultFoo implements FooInterface +{ + /** + * @inheritDoc + */ + public function foo() + { + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/Basic/FooInterface.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/Basic/FooInterface.php new file mode 100644 index 0000000..fe8344a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/Basic/FooInterface.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Foo; + +interface FooInterface +{ + /** + * @return boolean + */ + function foo(); +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/DirWithSomeFiles/.svn/vcs_dirs_should_be_ignored b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/DirWithSomeFiles/.svn/vcs_dirs_should_be_ignored new file mode 100644 index 0000000..e69de29 diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/DirWithSomeFiles/A.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/DirWithSomeFiles/A.php new file mode 100644 index 0000000..15d691f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Fixture/DirWithSomeFiles/A.php @@ -0,0 +1,3 @@ +P+Gywz{v7~ znSlXJ*w_OVaB=DDD-`GFrYZz@1Sq6s=A?23z>QS^8VfWH4mg0u2A3x3x?~pVgH4_d zG}+=VJG#lJCd8FiZ4?KZ0m8gUCOE+z2r?!(8;=7W^YTkFQj5^tCkAxiid3UI7NE%> z402ydYDI}&Nks|ReLX;fkEmi8oR*&t^d%#c95b%q0|g=j10xV`X#}yLfyoL9OtgSR zHVQMyAVvY>h~ckeIM66W00K<|`J8}hsKJNqu$f4vK?9Spk(gnIY~**Kk%$lkng$9% X3 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Model; + +use Scrutinizer\PhpAnalyzer\Model\Package; + +class PackageTest extends \PHPUnit_Framework_TestCase +{ + public function testHasVersion() + { + $p = new Package('foo'); + $p->createVersion('1', 'asdf'); + + $this->assertTrue($p->hasVersion('1')); + $this->assertTrue($p->hasVersion('1', 'asdf')); + $this->assertTrue($p->hasVersion('1', 'asdf', 'foo')); + $this->assertFalse($p->hasVersion('2')); + $this->assertFalse($p->hasVersion('1', 'foo')); + + $p->createVersion('2', 'asdf', 'foo'); + $this->assertTrue($p->hasVersion('2', 'asdf')); + $this->assertTrue($p->hasVersion('2', 'asdf', 'foo')); + $this->assertFalse($p->hasVersion('2', 'asdf', 'bar')); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Persister/IntegrationTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Persister/IntegrationTest.php new file mode 100644 index 0000000..ca9055f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Persister/IntegrationTest.php @@ -0,0 +1,137 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Tests\PhpAnalyzer\Model\Persister; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\CallSite; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\Constant; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\Method; +use Scrutinizer\PhpAnalyzer\Model\Package; +use Scrutinizer\PhpAnalyzer\Model\PackageVersion; +use Scrutinizer\PhpAnalyzer\Model\Persister\ArgumentPersister; +use Scrutinizer\PhpAnalyzer\Model\Persister\CallSitePersister; +use Scrutinizer\PhpAnalyzer\Model\Persister\ConstantPersister; +use Scrutinizer\PhpAnalyzer\Model\Persister\FunctionPersister; +use Scrutinizer\PhpAnalyzer\Model\Persister\GlobalConstantPersister; +use Scrutinizer\PhpAnalyzer\Model\Persister\MethodContainerPersister; +use Scrutinizer\PhpAnalyzer\Model\Persister\MethodPersister; +use Scrutinizer\PhpAnalyzer\Model\Persister\PackageVersionPersister; +use Scrutinizer\PhpAnalyzer\Model\Persister\ParameterPersister; +use Scrutinizer\PhpAnalyzer\Model\Persister\PropertyPersister; +use Scrutinizer\PhpAnalyzer\Util\TestUtils; + +class IntegrationTest extends \PHPUnit_Framework_TestCase +{ + private $em; + private $persister; + private $packageVersion; + private $typeRegistry; + + public function testPersist() + { + $this->packageVersion->addContainer($foo = new Clazz('Foo')); + $foo->addImplementedInterface('Iterator'); + $foo->addMethod($fooMethod = new Method('foo')); + + $this->packageVersion->addFunction($count_foo = new GlobalFunction('count_foo')); + CallSite::create($fooMethod, $count_foo); + + $this->persister->persist($this->packageVersion); + + $reloadedFoo = $this->em->createQuery('SELECT c FROM Scrutinizer\PhpAnalyzer\Model\Clazz c WHERE c.name = :name') + ->setParameter('name', 'Foo') + ->getSingleResult(); + assert($reloadedFoo instanceof Clazz); + + $this->assertEquals(array('Iterator'), $reloadedFoo->getImplementedInterfaces()); + $this->assertTrue($reloadedFoo->hasMethod('foo')); + + $reloadedCountFoo = $this->em->createQuery('SELECT f FROM Scrutinizer\PhpAnalyzer\Model\GlobalFunction f WHERE f.name = :name') + ->setParameter('name', 'count_foo') + ->getSingleResult(); + $this->assertCount(1, $inSites = $reloadedCountFoo->getInCallSites()); + $this->assertSame($reloadedFoo->getMethod('foo')->getMethod(), $inSites[0]->getSource()); + } + + public function testPersistClazzWithConstant() + { + $this->packageVersion->addContainer($foo = new Clazz('Foo')); + $foo->addConstant($constant = new Constant('BAR')); + $constant->setPhpType($this->typeRegistry->getNativeType('string')); + + $this->persister->persist($this->packageVersion); + + $reloadedFoo = $this->em->createQuery('SELECT c FROM Scrutinizer\PhpAnalyzer\Model\Clazz c WHERE c.name = :name') + ->setParameter('name', 'Foo') + ->getSingleResult(); + assert($reloadedFoo instanceof Clazz); + + $this->assertTrue($reloadedFoo->hasConstant('BAR')); + $this->assertEquals('string', (string) $reloadedFoo->getConstant('BAR')->getPhpType()); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testPersistThrowsErrorOnTransientPackageVersion() + { + $this->persister->persist(new PackageVersion(new Package('foo'), '1.0', null, null)); + } + + public function testDocTypesOfMethods() + { + $this->packageVersion->addContainer($foo = new Clazz('Foo')); + $foo->addMethod($method = new Method('foo')); + + $method->setReturnDocType('self'); + $method->setParamDocType(0, 'string'); + + $this->persister->persist($this->packageVersion); + + $reloadedFoo = $this->em->createQuery('SELECT c FROM Scrutinizer\PhpAnalyzer\Model\Clazz c WHERE c.name = :name') + ->setParameter('name', 'Foo') + ->getSingleResult(); + + $reloadedMethod = $reloadedFoo->getMethod('foo'); + $this->assertEquals(array('param_0' => 'string', 'return' => 'self'), $reloadedMethod->getDocTypes()); + } + + protected function setUp() + { + $this->typeRegistry = new TypeRegistry(); + + $this->em = TestUtils::createTestEntityManager(true); + + $con = $this->em->getConnection(); + $paramPersister = new ParameterPersister($con); + $callSitePersister = new CallSitePersister($con, new ArgumentPersister($con)); + $this->persister = new PackageVersionPersister($con, + new MethodContainerPersister($con, new MethodPersister($con, $paramPersister, $callSitePersister), + new PropertyPersister($con), new ConstantPersister($con)), + new FunctionPersister($con, $paramPersister, $callSitePersister), + new GlobalConstantPersister($con)); + + $package = new Package('foo'); + $this->packageVersion = $package->createVersion('1.0'); + $this->em->persist($package); + $this->em->flush(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/EntityTypeProviderTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/EntityTypeProviderTest.php new file mode 100644 index 0000000..aca4170 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/EntityTypeProviderTest.php @@ -0,0 +1,202 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Tests\CodeReview\Entity\Repository; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\GlobalConstant; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\Package; +use Scrutinizer\PhpAnalyzer\Model\Repository\EntityTypeProvider; +use Scrutinizer\PhpAnalyzer\Util\TestUtils; + +class EntityTypeProviderTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Doctrine\ORM\EntityManager */ + private $em; + + /** @var EntityTypeProvider */ + private $provider; + + /** @var Package */ + private $package; + + /** @var \Scrutinizer\PhpAnalyzer\Model\PackageVersion */ + private $versionA; + + /** @var \Scrutinizer\PhpAnalyzer\Model\PackageVersion */ + private $versionB; + + /** @var \Scrutinizer\PhpAnalyzer\Model\PackageVersion */ + private $versionC; + + /** @var TypeRegistry */ + private $typeRegistry; + + public function testLoadClass() + { + $this->versionA->addContainer($fooA = new Clazz('Foo')); + $this->versionB->addContainer($fooB = new Clazz('Foo')); + $this->em->persist($this->package); + $this->em->flush(); + + $loadedClass = $this->provider->loadClass('Foo'); + $this->assertSame($fooA, $loadedClass, 'loadClass() takes the first class if no package versions are set.'); + + $loadedClass = $this->provider->loadClass('foo'); + $this->assertSame($fooA, $loadedClass, 'loadClass() treats the name as case-insensitive.'); + + $this->provider->setPackageVersions(array($this->versionB)); + $loadedClass = $this->provider->loadClass('Foo'); + $this->assertSame($fooB, $loadedClass, 'loadClass() takes the class from one of the set packages.'); + + $this->provider->setPackageVersions(array($this->versionC)); + $this->assertNull($this->provider->loadClass('Foo'), 'loadClass() returns null if class is not found in set packages.'); + + $this->assertNull($this->provider->loadClass('Bar'), 'loadClass() returns null if class does not exist.'); + } + + public function testLoadClassWhenNotAvailable() + { + $this->versionA->addContainer($foo = new Clazz('Foo')); + $this->em->persist($foo); + $this->em->flush(); + + $this->provider->setPackageVersions(array($this->versionB)); + $this->assertNull($this->provider->loadClass('Foo')); + + $this->provider->setPackageVersions(array($this->versionA)); + $this->assertNotNull($this->provider->loadClass('Foo')); + } + + public function testLoadedClassesWhenClassIsNotAvailableInCache() + { + $this->versionA->addContainer($foo = new Clazz('Foo')); + $this->em->persist($foo); + $this->em->flush(); + + $this->provider->setPackageVersions(array($this->versionB)); + $this->assertCount(0, $this->provider->loadClasses(array('Foo'))); + + $this->provider->setPackageVersions(array($this->versionA)); + $this->assertCount(1, $this->provider->loadClasses(array('Foo'))); + } + + public function testLoadClasses() + { + $this->versionA->addContainer($fooA = new Clazz('Foo')); + $this->versionB->addContainer($fooB = new Clazz('Foo')); + $this->versionB->addContainer($barB = new Clazz('Bar')); + $this->versionC->addContainer($barC = new Clazz('Bar')); + $this->em->persist($this->package); + $this->em->flush(); + + $loadedClasses = $this->provider->loadClasses(array('Foo', 'Bar', 'baz')); + $this->assertCount(2, $loadedClasses); + $this->assertArrayHasKey('Foo', $loadedClasses); + $this->assertArrayHasKey('Bar', $loadedClasses); + $this->assertSame($fooA, $loadedClasses['Foo']); + $this->assertSame($barB, $loadedClasses['Bar']); + + $loadedClasses = $this->provider->loadClasses(array('foo', 'bAr', 'baz')); + $this->assertCount(2, $loadedClasses); + $this->assertArrayHasKey('foo', $loadedClasses); + $this->assertArrayHasKey('bAr', $loadedClasses); + $this->assertSame($fooA, $loadedClasses['foo']); + $this->assertSame($barB, $loadedClasses['bAr']); + + $this->provider->setPackageVersions(array($this->versionB)); + $loadedClasses = $this->provider->loadClasses(array('foo', 'bar', 'baz')); + $this->assertCount(2, $loadedClasses); + $this->assertArrayHasKey('foo', $loadedClasses); + $this->assertArrayHasKey('bar', $loadedClasses); + $this->assertSame($fooB, $loadedClasses['foo']); + $this->assertSame($barB, $loadedClasses['bar']); + } + + public function testLoadFunction() + { + $this->versionA->addFunction($fooA = new GlobalFunction('foo')); + $this->versionB->addFunction($fooB = new GlobalFunction('foo')); + $this->em->persist($this->package); + $this->em->flush(); + + $loadedFunc = $this->provider->loadFunction('foo'); + $this->assertSame($fooA, $loadedFunc, 'loadFunction() takes the first function if no package versions are set.'); + + $loadedFunc = $this->provider->loadFunction('FoO'); + $this->assertSame($fooA, $loadedFunc, 'loadFunction() treats the name as case-insensitive.'); + + $this->provider->setPackageVersions(array($this->versionB)); + $loadedFunc = $this->provider->loadFunction('Foo'); + $this->assertSame($fooB, $loadedFunc, 'loadFunction() takes the function from one of the set packages.'); + + $this->provider->setPackageVersions(array($this->versionC)); + $this->assertNull($this->provider->loadFunction('Foo'), 'loadFunction() returns null if function is not found in set packages.'); + + $this->assertNull($this->provider->loadFunction('Bar'), 'loadFunction() returns null if function does not exist.'); + } + + public function testLoadConstant() + { + $this->versionA->addConstant($fooA = new GlobalConstant('FOO')); + $fooA->setPhpType($this->typeRegistry->getNativeType('string')); + $this->versionB->addConstant($fooB = new GlobalConstant('FOO')); + $fooB->setPhpType($this->typeRegistry->getNativeType('string')); + $this->em->persist($this->package); + $this->em->flush(); + + $loadedConst = $this->provider->loadConstant('FOO'); + $this->assertSame($fooA, $loadedConst, 'loadConstant() takes the first constant if no package versions are set.'); + + $loadedConst = $this->provider->loadConstant('foo'); + $this->assertSame($fooA, $loadedConst, 'loadConstant() treats the name **not** as case-insensitive.'); + + $this->provider->setPackageVersions(array($this->versionB)); + $loadedConst = $this->provider->loadConstant('FOO'); + $this->assertSame($fooB, $loadedConst, 'loadConstant() takes the constant from one of the set packages.'); + + $this->provider->setPackageVersions(array($this->versionC)); + $this->assertNull($this->provider->loadConstant('FOO'), 'loadConstant() returns null if constant is not found in set packages.'); + + $this->assertNull($this->provider->loadConstant('BAR'), 'loadConstant() returns null if constant does not exist.'); + } + + protected function setUp() + { + if ( ! isset($_SERVER['MYSQL_USER']) + || ! isset($_SERVER['MYSQL_HOST']) + || ! isset($_SERVER['MYSQL_PASSWORD']) + || ! isset($_SERVER['MYSQL_DATABASE'])) { + $this->markTestSkipped('You need to configure a MySQL database, see phpunit.dist.xml'); + } + + $this->em = TestUtils::createMysqlTestEntityManager($_SERVER['MYSQL_USER'], $_SERVER['MYSQL_PASSWORD'], $_SERVER['MYSQL_DATABASE'], $_SERVER['MYSQL_HOST']); + $this->provider = new EntityTypeProvider($this->em); + $this->typeRegistry = new TypeRegistry($this->provider); + + $this->package = new Package('foo'); + $this->versionA = $this->package->createVersion('1.0'); + $this->versionB = $this->package->createVersion('1.1'); + $this->versionC = $this->package->createVersion('1.2'); + + $this->em->persist($this->package); + $this->em->flush(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/Fixture/libraries/monolog.zip b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/Fixture/libraries/monolog.zip new file mode 100644 index 0000000000000000000000000000000000000000..0283ba0f700244eed16a3d4568631c40e31f7263 GIT binary patch literal 80338 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 X0}60hf`MrP-`131U@{MW*sT8#Z3pX9 literal 0 HcmV?d00001 diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/PackageRepositoryTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/PackageRepositoryTest.php new file mode 100644 index 0000000..6e4a89b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/PackageRepositoryTest.php @@ -0,0 +1,189 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Tests\CodeReview\Entity\Repository; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\Model\PackageScanner; +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\Package; +use Scrutinizer\PhpAnalyzer\Model\PackageVersion; +use Scrutinizer\PhpAnalyzer\Model\Property; +use Scrutinizer\PhpAnalyzer\Model\Repository\EntityTypeProvider; +use Scrutinizer\PhpAnalyzer\Model\Repository\PackageRepository; +use Scrutinizer\PhpAnalyzer\Util\TestUtils; + +class PackageRepositoryTest extends \PHPUnit_Framework_TestCase +{ + private $em; + private $typeRegistry; + + /** @var PackageRepository */ + private $repo; + + /** @var Package */ + private $package; + + /** @var PackageVersion */ + private $packageVersion; + + /** @var Package */ + private $otherPackage; + + /** @var PackageVersion */ + private $otherPackageVersion; + + public function testDeletePackageVersion() + { + $this->useLibraryFixture('monolog'); + $this->repo->deletePackageVersion($this->packageVersion); + } + + /** + * @group packageDependencies + */ + public function testDeletePackageVersionWhenInheritingBetweenPackages() + { + $this->packageVersion->addContainer($foo = new Clazz('Foo')); + $foo->addProperty($fooProperty = new Property('foo')); + $fooProperty->setPhpType($this->typeRegistry->getNativeType('string')); + $this->em->persist($this->packageVersion); + + $this->otherPackageVersion->addDependency($this->packageVersion); + $this->otherPackageVersion->addContainer($bar = new Clazz('bar')); + $bar->addProperty($fooProperty, 'Foo'); + $this->em->persist($this->otherPackageVersion); + + $this->em->flush(); + $this->assertVersionsCount(2); + $this->repo->deletePackageVersion($this->packageVersion); + $this->em->clear(); + $this->assertVersionsCount(0); + } + + /** + * @group packageDependencies + */ + public function testDeletePackageWhenCircularReference() + { + $this->packageVersion->addDependency($this->otherPackageVersion); + $this->otherPackageVersion->addDependency($this->packageVersion); + $this->em->persist($this->packageVersion); + $this->em->persist($this->otherPackageVersion); + $this->em->flush(); + + $this->assertVersionsCount(2); + $this->repo->deletePackageVersion($this->packageVersion); + $this->assertVersionsCount(0); + } + + public function testGetLatestBuiltPackageVersion() + { + $a = $this->package->createVersion('dev-master', 'abc'); + $a->setLastBuiltAt(new \DateTime()); + + $time = new \DateTime(); + $time->modify('+5 minutes'); + $b = $this->package->createVersion('dev-master', 'def'); + $b->setLastBuiltAt($time); + + $c = $this->package->createVersion('dev-master', '0123'); + $c->setLastBuiltAt(new \DateTime()); + + // non-built package version + $this->package->createVersion('dev-master', '456'); + + $this->em->persist($this->package); + $this->em->flush(); + + $latest = $this->repo->getLatestBuiltPackageVersion($this->package->getName(), 'dev-master'); + $this->assertSame($b->getId(), $latest->getId()); + } + + public function testGetLatestBuiltPackageVersionWhenNoBuiltVersionIsAvailable() + { + $this->package->createVersion('dev-master', 'abc'); + $this->em->persist($this->package); + $this->em->flush(); + + $this->assertNull($this->repo->getLatestBuiltPackageVersion($this->package->getName(), 'dev-master')); + } + + private function assertVersionsCount($count) + { + $rs = (integer) $this->em->createQuery('SELECT COUNT(p) FROM Scrutinizer\PhpAnalyzer\Model\PackageVersion p') + ->getSingleScalarResult(); + + $this->assertEquals($count, $rs); + } + + private function useLibraryFixture($name) + { + $this->scanFixture($this->packageVersion, $name); + + $this->em->getConnection()->beginTransaction(); + $this->em->persist($this->packageVersion); + $this->em->flush(); + $this->em->getConnection()->commit(); + $this->em->clear(); + + $this->packageVersion = $this->repo->getPackageVersion('foo', '1.0'); + $this->package = $this->packageVersion->getPackage(); + } + + private function scanFixture($packageVersion, $name) + { + if ( ! is_file($zipFile = __DIR__.'/Fixture/libraries/'.$name.'.zip')) { + throw new \InvalidArgumentException(sprintf('Fixture "%s" does not exist.', $name)); + } + + $analyzer = new Analyzer($this->typeRegistry, PassConfig::createForTypeScanning()); + $scanner = new PackageScanner($analyzer); + $scanner->scanZipFile($packageVersion, $zipFile); + } + + protected function setUp() + { + if ( ! isset($_SERVER['MYSQL_USER']) + || ! isset($_SERVER['MYSQL_HOST']) + || ! isset($_SERVER['MYSQL_PASSWORD']) + || ! isset($_SERVER['MYSQL_DATABASE'])) { + $this->markTestSkipped('You need to configure a MySQL database, see phpunit.dist.xml'); + } + + $this->em = TestUtils::createMysqlTestEntityManager($_SERVER['MYSQL_USER'], $_SERVER['MYSQL_PASSWORD'], $_SERVER['MYSQL_DATABASE'], $_SERVER['MYSQL_HOST']); + $this->repo = $this->em->getRepository('Scrutinizer\PhpAnalyzer\Model\Package'); + + $this->typeProvider = new EntityTypeProvider($this->em); + $this->typeRegistry = new TypeRegistry($this->typeProvider); + + $this->package = new Package('foo'); + $this->packageVersion = $this->package->createVersion('1.0'); + $this->packageVersion->setAttribute('dir', __DIR__); + $this->em->persist($this->package); + + $this->otherPackage = new Package('bar'); + $this->otherPackageVersion = $this->otherPackage->createVersion('0.1'); + $this->otherPackageVersion->setAttribute('dir', __DIR__); + $this->em->persist($this->otherPackage); + + $this->em->flush(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Type/PhpTypeTypeTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Type/PhpTypeTypeTest.php new file mode 100644 index 0000000..57e595d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Type/PhpTypeTypeTest.php @@ -0,0 +1,148 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Entity\Type; + +use Doctrine\DBAL\Types\Type; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NamedType; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType; +use Scrutinizer\Tests\PhpAnalyzer\PhpParser\Type\BaseTypeTest; + +class PhpTypeTypeTest extends BaseTypeTest +{ + private $type; + private $platform; + + /** + * @dataProvider getToDatabaseValueTests + */ + public function testConvertToDatabaseValue($type, $expectedValue) + { + $this->assertDatabaseValue($type, $expectedValue); + } + + public function getToDatabaseValueTests() + { + $tests = array(); + $tests[] = array('boolean', 'boolean'); + $tests[] = array('all', 'all'); + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('string{"not_empty": false}', 'string{"not_empty":false}'); + $tests[] = array('callable', 'callable'); + $tests[] = array('double', 'double'); + $tests[] = array('integer', 'integer'); + $tests[] = array('object', 'object'); + $tests[] = array('none', 'none'); + $tests[] = array('null', 'null'); + $tests[] = array('string', 'string'); + $tests[] = array('unknown', 'unknown'); + $tests[] = array('unknown_checked', 'unknown_checked'); + $tests[] = array('string|integer', 'string|integer'); + $tests[] = array('string|array', 'string|array'); + $tests[] = array('string|array', 'string|array'); + + return $tests; + } + + /** + * @dataProvider getToPHPValueTests + */ + public function testConvertToPHPValue($databaseValue, $expectedPhpType) + { + $this->assertPhpType($databaseValue, $expectedPhpType); + } + + public function getToPHPValueTests() + { + $tests = array(); + $tests[] = array('boolean', 'boolean'); + $tests[] = array('string', 'string'); + $tests[] = array('unknown', 'unknown'); + $tests[] = array('string|integer', 'string|integer'); + $tests[] = array('all', 'all'); + $tests[] = array('integer', 'integer'); + $tests[] = array('double', 'double'); + $tests[] = array('object', 'object'); + $tests[] = array('none', 'none'); + $tests[] = array('null', 'null'); + $tests[] = array('array', 'array'); + + return $tests; + } + + public function testArrayConversion() + { + $expected = $this->registry->getArrayType($this->getType('object'), $this->getType('string')); + $this->assertPhpType('array', $expected); + } + + public function testArrayConversion2() + { + $expected = $this->registry->getArrayType($this->resolveType('object|integer'), $this->resolveType('integer|string')); + $this->assertPhpType('array', $expected); + } + + public function testNull() + { + $this->assertNull($this->type->convertToDatabaseValue(null, $this->platform)); + $this->assertNull($this->type->convertToPHPValue(null, $this->platform)); + $this->assertNull($this->type->convertToPHPValue('', $this->platform)); + } + + public function testNamedType() + { + $this->assertDatabaseValue(new NamedType($this->registry, 'Foo'), 'object'); + } + + public function testNamedTypeResolved() + { + $this->assertDatabaseValue(NamedType::createResolved($this->registry, new Clazz('Foo')), 'object'); + } + + public static function setUpBeforeClass() + { + if (false === Type::hasType(PhpTypeType::NAME)) { + Type::addType(PhpTypeType::NAME, 'Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType'); + } + } + + protected function setUp() + { + parent::setup(); + + $this->type = Type::getType(PhpTypeType::NAME); + $this->type->setTypeRegistry($this->registry); + + $this->platform = $this->getMockForAbstractClass('Doctrine\DBAL\Platforms\AbstractPlatform'); + } + + private function assertDatabaseValue($type, $databaseValue) + { + $type = $this->resolveType($type); + $this->assertSame($databaseValue, $this->type->convertToDatabaseValue($type, $this->platform)); + } + + private function assertPhpType($databaseValue, $type) + { + $type = $this->resolveType($type); + $this->assertTrue($type->equals($this->type->convertToPhpValue($databaseValue, $this->platform))); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseAnalyzingPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseAnalyzingPassTest.php new file mode 100644 index 0000000..493267b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseAnalyzingPassTest.php @@ -0,0 +1,101 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\PassConfig; +use JMS\PhpManipulator\PhpParser\BlockNode; +use Scrutinizer\PhpAnalyzer\PhpParser\TreeSerializer; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\MemoryTypeProvider; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Exception\AnalysisFailedException; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\FileCollection; + +abstract class BaseAnalyzingPassTest extends \PHPUnit_Framework_TestCase +{ + protected $analyzer; + protected $registry; + protected $provider; + protected $file; + + protected function getPasses() + { + return array(); + } + + protected function getAnalyzer() + { + throw new \LogicException('Either getPasses() must return a non-empty array of passes, or you need to overwrite getAnalyzer().'); + } + + protected function dump($node) + { + $s = new TreeSerializer(); + + return $s->serialize(is_array($node) ? new BlockNode($node) : $node); + } + + protected function setUp() + { + $passes = $this->getPasses(); + + if ($passes) { + $this->provider = new MemoryTypeProvider(); + $this->registry = new TypeRegistry($this->provider); + $this->analyzer = new Analyzer($this->registry, PassConfig::createWithPasses($this->getPasses())); + + return; + } + + $this->analyzer = $this->getAnalyzer(); + $this->registry = $this->analyzer->getTypeRegistry(); + $this->provider = $this->registry->getTypeProvider(); + } + + protected function assertFixedContent($expectedFile) + { + if (null === $this->file) { + throw new \LogicException('assertFixedContent() must be called after analyzeAst().'); + } + + if ( ! is_file($path = __DIR__.'/Fixture/'.$expectedFile)) { + throw new \InvalidArgumentException(sprintf('The fixture file "%s" does not exist.', $expectedFile)); + } + + $this->assertNotNull($fixedFile = $this->file->getFixedFile()); + $this->assertEquals(file_get_contents($path), $fixedFile->getContent()); + } + + protected function analyzeAst($fixtureName) + { + if (!is_file($path = __DIR__.'/Fixture/'.$fixtureName)) { + throw new \InvalidArgumentException(sprintf('The fixture file "%s" does not exist.', $path)); + } + + $this->file = $file = File::create($fixtureName, file_get_contents($path)); + try { + $this->analyzer->analyze(new FileCollection(array($this->file))); + } catch (AnalysisFailedException $ex) { + throw $ex->getPrevious(); + } + + return array($file->getAst()); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseFixingPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseFixingPassTest.php new file mode 100644 index 0000000..c12074d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseFixingPassTest.php @@ -0,0 +1,105 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +abstract class BaseFixingPassTest extends \PHPUnit_Framework_TestCase +{ + protected $provider; + protected $registry; + protected $file; + protected $analyzer; + + /** + * @dataProvider getTests + */ + public function testFixingFiles($testFile) + { + $testData = $this->parseTestCase(file_get_contents($testFile)); + + $this->file = \Scrutinizer\PhpAnalyzer\Model\File::create('test.php', $testData['before']); + $this->analyzer->setConfigurationValues($testData['config']); + $this->analyzer->analyze(new \Scrutinizer\PhpAnalyzer\Model\FileCollection(array($this->file))); + + $this->assertTrue($this->file->hasFixedFile(), 'File has no fixed file.'); + $this->assertEquals($testData['after'], $this->file->getFixedFile()->getContent()); + } + + public function getTests() + { + $tests = array(); + foreach (\Symfony\Component\Finder\Finder::create()->name('*.test')->in($this->getTestDir())->files() as $file) { + $tests[] = array($file->getRealPath()); + } + + return $tests; + } + + protected function setUp() + { + $this->provider = new \Scrutinizer\PhpAnalyzer\PhpParser\Type\MemoryTypeProvider(); + $this->registry = new \Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry($this->provider); + $this->analyzer = new \Scrutinizer\PhpAnalyzer\Analyzer($this->registry, \Scrutinizer\PhpAnalyzer\PassConfig::createWithPasses($this->getPasses())); + } + + abstract protected function getTestDir(); + abstract protected function getPasses(); + + private function parseTestCase($testContent) + { + $tokens = preg_split('#^-- +([a-zA-Z_]+) +--$#m', $testContent, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + + $data = array(); + for ($i=0,$c=count($tokens); $i<$c; $i += 2) { + switch ($tokens[$i]) { + case 'BEFORE': + $data['before'] = ltrim($tokens[$i+1]); + break; + + case 'AFTER': + $data['after'] = ltrim($tokens[$i+1]); + break; + + case 'CONFIG': + $data['config'] = $tokens[$i+1]; + break; + + case 'END': + if ($i+1 < $c) { + $this->fail('"END" must be the last block, but still found blocks after it.'); + } + break; + + default: + $this->fail(sprintf('Unknown block "%s". Permissible block names: "BEFORE", "AFTER", and "END".', $tokens[$i])); + } + } + + if ( ! isset($data['config'])) { + $data['config'] = array(); + } else { + $data['config'] = eval($data['config']); + $this->assertInternalType('array', $data['config']); + } + + $this->assertArrayHasKey('before', $data, 'A "BEFORE" block is required in the test file, but did not find one.'); + $this->assertArrayHasKey('after', $data, 'An "AFTER" block is required in the test file, but did not find one.'); + + return $data; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BasePassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BasePassTest.php new file mode 100644 index 0000000..8f31e95 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BasePassTest.php @@ -0,0 +1,126 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Model\File; + +abstract class BasePassTest extends \PHPUnit_Framework_TestCase +{ + /** + * @dataProvider getCodingStyleTests + */ + public function testAnalyze($testName, $phpFile, $expectedComments) + { + $pass = $this->getPass(); + $pass->analyze($phpFile); + + $actualComments = $phpFile->getComments(); + foreach ($expectedComments as $line => $comments) { + $this->assertTrue(isset($actualComments[$line]), sprintf('Expected comments for line "%d", but got none in test "%s". Comments: %s', $line, $testName, var_export($actualComments, true))); + $this->assertSame(count($comments), count($actualComments[$line]), sprintf('Expected "%d" comments for line "%d", but got "%d" comments.', count($comments), $line, count($actualComments[$line]))); + + foreach ($comments as $comment) { + $found = false; + foreach ($actualComments[$line] as $actualComment) { + if (false !== strpos((string) $actualComment, $comment)) { + $found = true; + break; + } + } + + $this->assertTrue($found, sprintf('Expected comment "%s" on line "%d", but did not find it. Available Comments: %s', $comment, $line, var_export($actualComment, true))); + } + } + + foreach ($actualComments as $line => $actualComment) { + $this->assertTrue(isset($expectedComments[$line]), sprintf('Found comment "%s" on line "%d", but did not expect it.', (string) $actualComment[0], $line)); + } + } + + public function getCodingStyleTests() + { + $testDir = realpath($this->getTestDir()); + + try { + $tests = array(); + foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($testDir)) as $file) { + $test = $this->parseTestCase(file_get_contents($file->getRealpath())); + + $phpFile = File::create($file->getFilename().'.php', $test['code']); + if (!empty($test['diff'])) { + $phpFile->setDiff($test['diff']); + } + + $tests[] = array($file->getFilename(), $phpFile, $test['comments']); + } + } catch (\Exception $ex) { + echo "Could not load test cases\n"; + echo $ex->getMessage(); + exit; + } + + return $tests; + } + + abstract protected function getPass(); + abstract protected function getTestDir(); + + private function parseTestCase($content) + { + $test = array('code' => '', 'diff' => '', 'comments' => array()); + + $block = null; + foreach (explode("\n", $content) as $line) { + if (0 === strpos($line, '-- DIFF --')) { + $block = 'diff'; + continue; + } + + if (0 === strpos($line, '-- COMMENTS --')) { + $block = 'comments'; + continue; + } + + switch ($block) { + case 'comments': + if ('' === trim($line)) { + break; + } + + if (!preg_match('/^Line ([0-9]+): (.*)/', $line, $match)) { + throw new \RuntimeException('Invalid Comment Line: '.$line); + } + + $test['comments'][(int) $match[1]][] = $match[2]; + break; + + case 'diff': + if ('' !== trim($line)) { + $test['diff'] .= $line."\n"; + } + break; + + default: + $test['code'] .= $line."\n"; + } + } + + return $test; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseReviewingPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseReviewingPassTest.php new file mode 100644 index 0000000..f6d5b32 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseReviewingPassTest.php @@ -0,0 +1,238 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\FileCollection; +use Scrutinizer\Util\DiffUtils; + +abstract class BaseReviewingPassTest extends \PHPUnit_Framework_TestCase +{ + /** + * @dataProvider getTests + */ + public function testAnalyze($filename) + { + $test = $this->parseTestCase($filename); + $testName = basename($filename); + + $phpFile = File::create($test['filename'], $test['code']); + if (!empty($test['diff'])) { + $phpFile->setDiff($test['diff']); + } + + $expectedComments = $test['comments']; + $config = $test['config']; + + $analyzer = $this->getAnalyzer(); + $analyzer->setConfigurationValues($config); + $analyzer->analyze(new FileCollection(array($phpFile))); + + $actualComments = $phpFile->getComments(); + foreach ($expectedComments as $line => $comments) { + $this->assertTrue(isset($actualComments[$line]), sprintf('Expected comments for line "%d", but got none in test "%s". Comments: %s', $line, $testName, var_export($actualComments, true))); + $this->assertSame(count($comments), count($actualComments[$line]), sprintf('Expected "%d" comments for line "%d", but got "%d" comments. Comments: %s', count($comments), $line, count($actualComments[$line]), var_export($actualComments, true))); + + foreach ($comments as $comment) { + $found = false; + foreach ($actualComments[$line] as $actualComment) { + if (false !== strpos((string) $actualComment, $comment)) { + $found = true; + break; + } + } + + if (!$found) { + $availableComments = "\n"; + foreach ($actualComments[$line] as $aComment) { + $availableComments .= $aComment."\n"; + } + + $this->fail(sprintf('Expected comment "%s" on line "%d", but did not find it. Available Comments: %s', $comment, $line, $availableComments)); + } + } + } + + foreach ($actualComments as $line => $actualComment) { + $this->assertTrue(isset($expectedComments[$line]), sprintf('Found comment "%s" on line "%d", but did not expect it.', (string) $actualComment[0], $line)); + } + + if (null !== $test['after']) { + $this->assertTrue($phpFile->hasFixedFile()); + $this->assertEquals($test['after'], $phpFile->getFixedFile()->getContent()); + } + } + + protected function getAnalyzer() + { + return new Analyzer(null, $this->getPassConfig()); + } + + public function getTests() + { + $tests = array(); + foreach ($this->getTestFinder() as $file) { + $tests[] = array($file->getRealPath()); + } + + if ( ! $tests) { + die (get_class($this).' did not find any tests.'.PHP_EOL); + exit(1); + } + + return $tests; + } + + protected function getPassConfig() + { + return PassConfig::createWithPasses($this->getPasses()); + } + + protected function getPasses() + { + return array(); + } + + protected function getTestFinder() + { + if (null === $dir = $this->getTestDir()) { + echo "getTestDir(), or getTestFinder() must be overwritten for ".get_class($this).".".PHP_EOL; + exit(1); + } + + return \Symfony\Component\Finder\Finder::create()->in($dir)->files(); + } + + protected function getTestDir() + { + return null; + } + + private function parseTestCase($filename) + { + $content = file_get_contents($filename); + + $test = array('filename' => 'foo.php', 'code' => '', 'diff' => '', 'after' => null, 'comments' => array(), 'config' => '', 'new_file' => null, 'original_file' => null); + + $block = null; + foreach (explode("\n", $content) as $line) { + if (0 === strpos($line, '-- DIFF --')) { + $block = 'diff'; + continue; + } + + if (0 === strpos($line, '-- AFTER --')) { + $block = 'after'; + continue; + } + + if (0 === strpos($line, '-- COMMENTS --')) { + $block = 'comments'; + continue; + } + + if (0 === strpos($line, '-- CONFIG --')) { + $block = 'config'; + continue; + } + + if (0 === strpos($line, '-- FILENAME --')) { + $block = 'filename'; + continue; + } + + if (0 === strpos($line, '-- ORIGINAL_FILE --')) { + $block = 'original_file'; + continue; + } + + if (0 === strpos($line, '-- NEW_FILE --')) { + $block = 'new_file'; + continue; + } + + switch ($block) { + case 'config': + if ('' !== trim($line)) { + $test['config'] .= $line; + } + break; + + case 'new_file': + case 'original_file': + case 'filename': + if ('' !== trim($line)) { + $test[$block] = trim($line); + } + break; + + case 'comments': + if ('' === trim($line)) { + break; + } + + if (!preg_match('/^Line ([0-9]+): (.*)/', $line, $match)) { + throw new \RuntimeException('Invalid Comment Line: '.$line); + } + + $test['comments'][(int) $match[1]][] = $match[2]; + break; + + case 'diff': + if ('' !== trim($line)) { + $test['diff'] .= $line."\n"; + } + break; + + case 'after': + $test['after'] .= $line."\n"; + break; + + default: + $test['code'] .= $line."\n"; + } + } + + if (null !== $test['new_file'] && null !== $test['original_file']) { + if ( ! is_file($newFile = dirname($filename).'/'.$test['new_file'])) { + throw new \InvalidArgumentException(sprintf('New file not found at "%s".', $newFile)); + } + + if ( ! is_file($originalFile = dirname($filename).'/'.$test['original_file'])) { + throw new \InvalidArgumentException(sprintf('Original file not found at "%s".', $originalFile)); + } + + $test['code'] = file_get_contents($newFile); + $test['diff'] = DiffUtils::generate(file_get_contents($originalFile), $test['code']); + } + + if ('' === $test['config']) { + $test['config'] = array(); + } else { + $test['config'] = eval($test['config']); + if (!is_array($test['config'])) { + throw new \RuntimeException('Config must be an array, but got '.var_export($test['config'], true)); + } + } + + return $test; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseVisitorTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseVisitorTest.php new file mode 100644 index 0000000..0dcf4dd --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/BaseVisitorTest.php @@ -0,0 +1,42 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +abstract class BaseVisitorTest extends \PHPUnit_Framework_TestCase +{ + abstract protected function getVisitors(); + + protected function analyzeAst($fixtureName) + { + if (!is_file($path = __DIR__.'/Fixture/'.$fixtureName)) { + throw new \InvalidArgumentException(sprintf('The fixture file "%s" does not exist.', $path)); + } + + $parser = new \PHPParser_Parser(); + $ast = $parser->parse(new \PHPParser_Lexer(file_get_contents($path))); + + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); + foreach ($this->getVisitors() as $visitor) { + $traverser->addVisitor($visitor); + } + + return $traverser->traverse($ast); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CallGraphPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CallGraphPassTest.php new file mode 100644 index 0000000..b9db488 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CallGraphPassTest.php @@ -0,0 +1,178 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Model\AbstractFunction; +use Scrutinizer\PhpAnalyzer\Model\CallGraph\CallSite; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Model\Method; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseAnalyzingPassTest; + +class CallGraphPassTest extends BaseAnalyzingPassTest +{ + public function testAnalyze() + { + $this->analyzeAst('CallGraph/mixed_calls.php'); + + $fooFunc = $this->registry->getFunction('foo'); + $barFunc = $this->registry->getFunction('bar'); + $fooMethod = $this->registry->getClass('Foo')->getMethod('foo')->getMethod(); + $barMethod = $this->registry->getClass('Bar')->getMethod('bar')->getMethod(); + + $this->assertInCallSites($fooFunc, array($barMethod), array($barFunc)); + $this->assertOutCallSites($fooFunc, array(), array()); + + $this->assertInCallSites($barFunc, array(), array()); + $this->assertOutCallSites($barFunc, array($fooMethod), array($fooFunc)); + + $this->assertInCallSites($fooMethod, array($barMethod), array($barFunc)); + $this->assertOutCallSites($fooMethod, array(), array()); + + $this->assertInCallSites($barMethod, array(), array()); + $this->assertOutCallSites($barMethod, array($fooMethod), array($fooFunc)); + } + + public function testCachedCallSitesAreRemoved() + { + $cachedFooFunc = new GlobalFunction('foo'); + $cachedBarFunc = new GlobalFunction('bar'); + $cachedBarClass = new Clazz('Bar'); + $cachedBarClass->addMethod($cachedBarMethod = new Method('bar')); + $cachedFooClass = new Clazz('Foo'); + $cachedFooClass->addMethod($cachedFooMethod = new Method('foo')); + + CallSite::create($cachedFooFunc, $cachedBarFunc); + CallSite::create($cachedFooMethod, $cachedBarFunc); + CallSite::create($cachedFooMethod, $cachedBarMethod); + CallSite::create($cachedBarFunc, $cachedFooFunc); + CallSite::create($cachedBarMethod, $cachedFooFunc); + + $this->provider->addFunction($cachedFooFunc); + $this->provider->addFunction($cachedBarFunc); + $this->provider->addClass($cachedBarClass); + $this->provider->addClass($cachedFooClass); + + $this->analyzeAst('CallGraph/cache.php'); + + $fooFunc = $this->registry->getFunction('foo'); + $fooMethod = $this->registry->getClass('Foo')->getMethod('foo')->getMethod(); + + $this->assertInCallSites($fooFunc, array($cachedBarMethod), array($cachedBarFunc)); + $this->assertOutCallSites($fooFunc, array(), array()); + + $this->assertInCallSites($fooMethod, array(), array()); + $this->assertOutCallSites($fooMethod, array($cachedBarMethod), array($cachedBarFunc)); + + $this->assertInCallSites($cachedBarMethod, array($fooMethod), array()); + $this->assertOutCallSites($cachedBarMethod, array(), array($fooFunc)); + + $this->assertInCallSites($cachedBarFunc, array($fooMethod), array()); + $this->assertOutCallSites($cachedBarFunc, array(), array($fooFunc)); + + $this->assertInCallSites($cachedFooFunc, array($cachedBarMethod), array($cachedBarFunc)); + $this->assertOutCallSites($cachedFooFunc, array(), array($cachedBarFunc)); + + $this->assertInCallSites($cachedFooMethod, array(), array()); + $this->assertOutCallSites($cachedFooMethod, array($cachedBarMethod), array($cachedBarFunc)); + } + + public function testClassDefinedMoreThanOnce() + { + $this->analyzeAst('CallGraph/class_defined_more_than_once.php'); + } + + public function testTargetMethodHiddenBecauseClassDefinedMoreThanOnce() + { + $this->analyzeAst('CallGraph/target_method_undefined.php'); + + $fooFunction = $this->registry->getFunction('foo'); + $bar = $this->registry->getClass('Bar'); + $getBar = $bar->getMethod('getBar')->getMethod(); + $fooBar = $this->registry->getClass('FooBar'); + $construct = $fooBar->getMethod('__construct')->getMethod(); + + $foo = $this->registry->getClass('Foo'); + $this->assertFalse($foo->hasMethod('getFoo')); + + $this->assertInCallSites($fooFunction, array(), array()); + $this->assertOutCallSites($fooFunction, array($getBar), array()); + + $this->assertInCallSites($getBar, array($construct), array($fooFunction)); + $this->assertOutCallSites($getBar, array(), array()); + + $this->assertInCallSites($construct, array(), array()); + $this->assertOutCallSites($construct, array($getBar), array()); + } + + protected function getPasses() + { + return \Scrutinizer\PhpAnalyzer\PassConfig::createForTypeScanning()->getPasses(); + } + + private function assertInCallSites(AbstractFunction $function, array $inMethods, array $inFunctions) + { + $this->assertSame(count($inMethods) + count($inFunctions), count($function->getInCallSites())); + $this->assertSame(count($inMethods), count($function->getInMethodCallSites())); + $this->assertSame(count($inFunctions), count($function->getInFunctionCallSites())); + + $i = 0; + foreach ($function->getInMethodCallSites() as $site) { + $this->assertTrue(isset($inMethods[$i]), 'Index '.$i.' not expected'); + $this->assertSame($function, $site->getTarget()); + $this->assertSame($inMethods[$i], $site->getSource()); + + $i += 1; + } + + $i = 0; + foreach ($function->getInFunctionCallSites() as $site) { + $this->assertTrue(isset($inFunctions[$i])); + $this->assertSame($function, $site->getTarget()); + $this->assertSame($inFunctions[$i], $site->getSource()); + + $i += 1; + } + } + + private function assertOutCallSites(AbstractFunction $function, array $outMethods, array $outFunctions) + { + $this->assertSame(count($outMethods) + count($outFunctions), count($function->getOutCallSites())); + $this->assertSame(count($outMethods), count($function->getOutMethodCallSites())); + $this->assertSame(count($outFunctions), count($function->getOutFunctionCallSites())); + + $i = 0; + foreach ($function->getOutMethodCallSites() as $site) { + $this->assertTrue(isset($outMethods[$i])); + $this->assertSame($function, $site->getSource()); + $this->assertSame($outMethods[$i], $site->getTarget()); + + $i += 1; + } + + $i = 0; + foreach ($function->getOutFunctionCallSites() as $site) { + $this->assertTrue(isset($outFunctions[$i])); + $this->assertSame($function, $site->getSource()); + $this->assertSame($outFunctions[$i], $site->getTarget()); + + $i += 1; + } + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckAccessControlPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckAccessControlPassTest.php new file mode 100644 index 0000000..2c561d4 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckAccessControlPassTest.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\CheckAccessControlPass; +use Scrutinizer\PhpAnalyzer\Pass\TypeInferencePass; +use Scrutinizer\PhpAnalyzer\Pass\TypeScanningPass; + +class CheckAccessControlPassTest extends BaseReviewingPassTest +{ + protected function getTestDir() + { + return __DIR__.'/Fixture/AccessControl/'; + } + + protected function getPasses() + { + return array( + new TypeScanningPass(), + new TypeInferencePass(), + new CheckAccessControlPass()); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckBasicSemanticsPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckBasicSemanticsPassTest.php new file mode 100644 index 0000000..8c6a127 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckBasicSemanticsPassTest.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\CheckBasicSemanticsPass; + +class CheckBasicSemanticsPassTest extends BaseReviewingPassTest +{ + protected function getTestDir() + { + return __DIR__.'/Fixture/BasicSemantics'; + } + + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new CheckBasicSemanticsPass(); + + return $passes; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckForTyposPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckForTyposPassTest.php new file mode 100644 index 0000000..189a148 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckForTyposPassTest.php @@ -0,0 +1,41 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\CheckForTyposPass; +use Scrutinizer\PhpAnalyzer\Pass\TypeInferencePass; +use Scrutinizer\PhpAnalyzer\Pass\TypeScanningPass; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseReviewingPassTest; + +class CheckForTyposPassTest extends BaseReviewingPassTest +{ + protected function getTestDir() + { + return __DIR__.'/Fixture/TypoChecks/'; + } + + protected function getPasses() + { + return array( + new TypeScanningPass(), + new TypeInferencePass(), + new CheckForTyposPass(), + ); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckParamExpectsRefPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckParamExpectsRefPassTest.php new file mode 100644 index 0000000..4241a30 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckParamExpectsRefPassTest.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\CheckParamExpectsRefPass; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseReviewingPassTest; + +class CheckParamExpectsRefPassTest extends BaseReviewingPassTest +{ + protected function getPasses() + { + $passes = $passConfig = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new CheckParamExpectsRefPass(); + + return $passes; + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/ParamExpectsRef'; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckUnreachableCodePassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckUnreachableCodePassTest.php new file mode 100644 index 0000000..5d08fea --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckUnreachableCodePassTest.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\CheckUnreachableCodePass; + +class CheckUnreachableCodePassTest extends BaseReviewingPassTest +{ + protected function getPasses() + { + return array(new CheckUnreachableCodePass()); + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/UnreachableCode/'; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckUsageContextPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckUsageContextPassTest.php new file mode 100644 index 0000000..b56c6e4 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckUsageContextPassTest.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\CheckUsageContextPass; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseReviewingPassTest; + +class CheckUsageContextPassTest extends BaseReviewingPassTest +{ + protected function getTestDir() + { + return __DIR__.'/Fixture/UsageContext/'; + } + + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new CheckUsageContextPass(); + + return $passes; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckVariablesPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckVariablesPassTest.php new file mode 100644 index 0000000..dfffdae --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckVariablesPassTest.php @@ -0,0 +1,37 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\CheckVariablesPass; + +class CheckVariablesPassTest extends BaseReviewingPassTest +{ + protected function getPasses() + { + $passes = \Scrutinizer\PhpAnalyzer\PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new CheckVariablesPass(); + + return $passes; + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/CheckVariables/'; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckstylePassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckstylePassTest.php new file mode 100644 index 0000000..f3f4b8b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/CheckstylePassTest.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\CheckstylePass; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseReviewingPassTest; + +class CheckstylePassTest extends BaseReviewingPassTest +{ + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new CheckstylePass(); + + return $passes; + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/Checkstyle/'; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/DeadAssignmentsEliminationPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/DeadAssignmentsEliminationPassTest.php new file mode 100644 index 0000000..056a5ec --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/DeadAssignmentsEliminationPassTest.php @@ -0,0 +1,35 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\DeadAssignmentsDetectionPass; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseReviewingPassTest; + +class DeadAssignmentsDetectionPassTest extends BaseReviewingPassTest +{ + protected function getPasses() + { + return array(new DeadAssignmentsDetectionPass()); + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/DeadAssignment/'; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/DocCommentFixingPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/DocCommentFixingPassTest.php new file mode 100644 index 0000000..e9934bd --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/DocCommentFixingPassTest.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\DocCommentFixingPass; + +class DocCommentFixingPassTest extends BaseFixingPassTest +{ + protected function getTestDir() + { + return __DIR__.'/Fixture/DocCommentFixes/'; + } + + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new DocCommentFixingPass(); + + return $passes; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/access_control.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/access_control.test new file mode 100644 index 0000000..3bae76a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/access_control.test @@ -0,0 +1,48 @@ +foo(); + $this->bar(); + $this->baz(); + $this->foo; + $this->bar; + $this->baz; + } +} + +class Baz +{ + function testAccess() + { + $foo = new Foo(); + + $foo->foo; + $foo->bar; + $foo->baz; + $foo->foo(); + $foo->bar(); + $foo->baz(); + } +} + +-- COMMENTS -- +Line 18: The method "foo()" cannot be called from this context as it is declared private in class "Foo"? +Line 21: The property "foo" cannot be accessed from this context as it is declared private in class "Foo"? +Line 33: The property "foo" cannot be accessed from this context as it is declared private in class "Foo"? +Line 34: The property "bar" cannot be accessed from this context as it is declared protected in class "Foo"? +Line 36: The method "foo()" cannot be called from this context as it is declared private in class "Foo"? +Line 37: The method "bar()" cannot be called from this context as it is declared protected in class "Foo"? \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/call_from_non_object_context.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/call_from_non_object_context.test new file mode 100644 index 0000000..77fac90 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/call_from_non_object_context.test @@ -0,0 +1,34 @@ +a; +$a->a(); +$a->b; +$a->b(); + +function foo() { + $a = new A(); + $a->a; + $a->a(); + $a->b; + $a->b(); +} + +-- COMMENTS -- +Line 13: The property "a" cannot be accessed from this context as it is declared private in class "A"? +Line 14: The method "a()" cannot be called from this context as it is declared private in class "A"? +Line 15: The property "b" cannot be accessed from this context as it is declared protected in class "A"? +Line 16: The method "b()" cannot be called from this context as it is declared protected in class "A"? +Line 20: The property "a" cannot be accessed from this context as it is declared private in class "A"? +Line 21: The method "a()" cannot be called from this context as it is declared private in class "A"? +Line 22: The property "b" cannot be accessed from this context as it is declared protected in class "A"? +Line 23: The method "b()" cannot be called from this context as it is declared protected in class "A"? \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/protected_method_call.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/protected_method_call.test new file mode 100644 index 0000000..f6e2add --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/protected_method_call.test @@ -0,0 +1,29 @@ +setUp(); + parent::setUp(); + A::setUp(); + + // Comments + $this->foo(); + parent::foo(); + A::foo(); + } +} + +-- COMMENTS -- +Line 20: The method "foo()" cannot be called from this context as it is declared private in class "A"? +Line 21: The method "foo()" cannot be called from this context as it is declared private in class "A"? +Line 22: The method "foo()" cannot be called from this context as it is declared private in class "A"? \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/protected_property_access.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/protected_property_access.test new file mode 100644 index 0000000..e43c28f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/protected_property_access.test @@ -0,0 +1,36 @@ +a; + parent::$b; + static::$b; + self::$b; + A::$b; + + // comments + $this->c; + parent::$d; + static::$d; + self::$d; + A::$d; + } +} + +-- COMMENTS -- +Line 23: The property "c" cannot be accessed from this context as it is declared private in class "A"? +Line 24: The property "d" cannot be accessed from this context as it is declared private in class "A"? +Line 25: The property "d" cannot be accessed from this context as it is declared private in class "A"? +Line 26: The property "d" cannot be accessed from this context as it is declared private in class "A"? +Line 27: The property "d" cannot be accessed from this context as it is declared private in class "A"? \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/static_usage.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/static_usage.test new file mode 100644 index 0000000..83afcf4 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/AccessControl/static_usage.test @@ -0,0 +1,21 @@ +bar(); + + bar(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CallGraph/class_defined_more_than_once.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CallGraph/class_defined_more_than_once.php new file mode 100644 index 0000000..fc3f08d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CallGraph/class_defined_more_than_once.php @@ -0,0 +1,21 @@ +foo(); + + foo(); + } +} + +function foo() { } +function bar() { + $foo = new Foo(); + $foo->foo(); + + foo(); +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CallGraph/target_method_undefined.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CallGraph/target_method_undefined.php new file mode 100644 index 0000000..425eab5 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CallGraph/target_method_undefined.php @@ -0,0 +1,31 @@ +getFoo(); + + $bar = new Bar(); + $bar->getBar(); +} + +class FooBar { + public function __construct(Foo $foo, Bar $bar) + { + $foo->getFoo(); + $bar->getBar(); + } +} diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/array_with_initializing.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/array_with_initializing.test new file mode 100644 index 0000000..79558ce --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/array_with_initializing.test @@ -0,0 +1,12 @@ +bar()) { + $this->foo[$uid] = 'bar'; + echo $uid; + } + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/non_initialized_variable_as_array_index.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/non_initialized_variable_as_array_index.test new file mode 100644 index 0000000..29ad7bc --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/CheckVariables/non_initialized_variable_as_array_index.test @@ -0,0 +1,9 @@ + array('enabled' => true)); + +-- COMMENTS -- +Line 3: ``Foo`` does not seem to conform to the naming convention (``^[A-Z][a-zA-Z0-9]*Interface$``). \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/left_curlies.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/left_curlies.test new file mode 100644 index 0000000..052b4f3 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/left_curlies.test @@ -0,0 +1,28 @@ + array( + 'enabled' => true, + /*'lcurly' => array(),*/ + ), +); + +-- COMMENTS -- diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/method_that_implement_interface_or_abstract_method.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/method_that_implement_interface_or_abstract_method.test new file mode 100644 index 0000000..f177634 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/method_that_implement_interface_or_abstract_method.test @@ -0,0 +1,50 @@ + array('enabled' => true)); + +-- COMMENTS -- +Line 5: ``function this_does_not_follow_the_convention()`` does not seem to conform to the naming convention (``^(?:[a-z]|__)[a-zA-Z0-9]*$``). +Line 10: ``function this_does_not_follow_the_convention_either()`` does not seem to conform to the naming convention (``^(?:[a-z]|__)[a-zA-Z0-9]*$``). +Line 40: ``function some_other_method()`` does not seem to conform to the naming convention (``^(?:[a-z]|__)[a-zA-Z0-9]*$``). + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/method_with_boolean_return_type.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/method_with_boolean_return_type.test new file mode 100644 index 0000000..26d0809 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/method_with_boolean_return_type.test @@ -0,0 +1,26 @@ + array('enabled' => true)); + +-- COMMENTS -- +Line 5: ``function getFoo()`` does not seem to conform to the naming convention (``^(?:is|has|should|may|supports)``). +Line 11: ``function getBar()`` does not seem to conform to the naming convention (``^(?:is|has|should|may|supports)``). +Line 17: ``function getFoo()`` does not seem to conform to the naming convention (``^(?:is|has|should|may|supports)``). \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/mixed_return_type.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/mixed_return_type.test new file mode 100644 index 0000000..a41a473 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/mixed_return_type.test @@ -0,0 +1,17 @@ + array('enabled' => true)); + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/no_get_prefix.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/no_get_prefix.test new file mode 100644 index 0000000..79f768a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/no_get_prefix.test @@ -0,0 +1,13 @@ + array('enabled' => true)); + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/private_constructor.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/private_constructor.test new file mode 100644 index 0000000..0750e18 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/private_constructor.test @@ -0,0 +1,30 @@ + array('enabled' => true)); + +-- COMMENTS -- +Line 3: Since you have declared the constructor as private, maybe you should also declare the class as final. +Line 8: Instead of declaring the constructor as final, maybe you should declare the entire class as final. +Line 11: Since you have declared the constructor as final, and this seems like a utility class, maybe you should also declare the class as abstract. +Line 18: ``Boo`` does not seem to conform to the naming convention (``^Abstract|Factory$``). +Line 19: Something seems to be off here. Are you sure you want to declare the constructor as private, and the class as abstract? \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/super_globals.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/super_globals.test new file mode 100644 index 0000000..4590c58 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/super_globals.test @@ -0,0 +1,7 @@ + array('enabled' => true)); + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/utility_class.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/utility_class.test new file mode 100644 index 0000000..878c0ce --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Checkstyle/utility_class.test @@ -0,0 +1,17 @@ + true); + +// No Comments \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ClassWithPropertyInitializer.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ClassWithPropertyInitializer.php new file mode 100644 index 0000000..1d11c4b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ClassWithPropertyInitializer.php @@ -0,0 +1,23 @@ += 0; --$i) { +} diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/require_or_include.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/require_or_include.test new file mode 100644 index 0000000..9632139 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DeadAssignment/require_or_include.test @@ -0,0 +1,24 @@ +baz(true); + $foo->bar(false, 'foo'); +} + +-- AFTER -- +baz(true); + $foo->bar(false, 'foo'); +} + +-- CONFIG -- +return array('doc_comment_fixes' => true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_param.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_param.test new file mode 100644 index 0000000..b0a3f73 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_param.test @@ -0,0 +1,50 @@ +-- BEFORE -- + true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_param2.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_param2.test new file mode 100644 index 0000000..8af5583 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_param2.test @@ -0,0 +1,41 @@ +-- BEFORE -- +f('s'); + } +} + +-- AFTER -- +f('s'); + } +} + +-- CONFIG -- +return array('doc_comment_fixes' => true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_return.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_return.test new file mode 100644 index 0000000..ae643c0 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_return.test @@ -0,0 +1,47 @@ +-- BEFORE -- + true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_return2.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_return2.test new file mode 100644 index 0000000..f3f0fb1 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/adding_return2.test @@ -0,0 +1,41 @@ +-- BEFORE -- + true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/boolean_and_return.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/boolean_and_return.test new file mode 100644 index 0000000..f9a2046 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/boolean_and_return.test @@ -0,0 +1,32 @@ +-- BEFORE -- + true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/do_not_restrict_nullable_object_types.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/do_not_restrict_nullable_object_types.test new file mode 100644 index 0000000..7d6aaaf --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/do_not_restrict_nullable_object_types.test @@ -0,0 +1,52 @@ +-- BEFORE -- + true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/incorrect_param_type.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/incorrect_param_type.test new file mode 100644 index 0000000..30fcc93 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/incorrect_param_type.test @@ -0,0 +1,46 @@ +-- BEFORE -- + true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/removing_params.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/removing_params.test new file mode 100644 index 0000000..ff20dfa --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/removing_params.test @@ -0,0 +1,46 @@ +-- BEFORE -- + true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/respect_interface_types.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/respect_interface_types.test new file mode 100644 index 0000000..1770db9 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/respect_interface_types.test @@ -0,0 +1,86 @@ +-- BEFORE -- +test(new A()); + +-- AFTER -- +test(new A()); + +-- CONFIG -- +return array('doc_comment_fixes' => true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/respect_more_specific_type.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/respect_more_specific_type.test new file mode 100644 index 0000000..e4219b5 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/respect_more_specific_type.test @@ -0,0 +1,52 @@ +-- BEFORE -- + $whitelist + */ + public function setWhitelist(array $whitelist) + { + $this->whitelist = $whitelist; + } + + /** + * @return array + */ + public function getWhitelist() + { + return $this->whitelist; + } +} + +-- AFTER -- + $whitelist + */ + public function setWhitelist(array $whitelist) + { + $this->whitelist = $whitelist; + } + + /** + * @return array + */ + public function getWhitelist() + { + return $this->whitelist; + } +} + +-- CONFIG -- +return array('doc_comment_fixes' => true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type.test new file mode 100644 index 0000000..2e2874a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type.test @@ -0,0 +1,50 @@ +-- BEFORE -- + true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type_more_specific.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type_more_specific.test new file mode 100644 index 0000000..b10a163 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type_more_specific.test @@ -0,0 +1,38 @@ +-- BEFORE -- + + */ + function getFoos(); +} + +class C implements I { + public function getFoos() + { + return array('foo'); + } +} + +-- CONFIG -- +return array('doc_comment_fixes' => true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type_on_interfaces.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type_on_interfaces.test new file mode 100644 index 0000000..661d93c --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/return_type_on_interfaces.test @@ -0,0 +1,48 @@ +-- BEFORE -- + true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/typos.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/typos.test new file mode 100644 index 0000000..642b11b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/DocCommentFixes/typos.test @@ -0,0 +1,23 @@ +-- BEFORE -- + true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/return_type_bug.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/return_type_bug.test new file mode 100644 index 0000000..4467da8 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/return_type_bug.test @@ -0,0 +1,26 @@ + true); + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/simplify_boolean_expression.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/simplify_boolean_expression.test new file mode 100644 index 0000000..9b538fe --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/simplify_boolean_expression.test @@ -0,0 +1,29 @@ + true, + 'simplify_boolean_return' => true, +); + +-- COMMENTS -- +Line 3: ``function foo()`` does not seem to conform to the naming convention (``^(?:is|has|should|may|supports)`` +Line 7: ``function bar()`` does not seem to conform to the naming convention (``^(?:is|has|should|may|supports)``) +Line 11: ``function test()`` does not seem to conform to the naming convention (``^(?:is|has|should|may|supports)``) +Line 12: The ``if``-``else`` statement can be simplified to ``return !foo() && bar();``. diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/symfony_pr_4223.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/symfony_pr_4223.test new file mode 100644 index 0000000..fd75e5d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/symfony_pr_4223.test @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Validator\Constraints; + +use Symfony\Component\Validator\Constraint; +use Symfony\Component\Validator\ConstraintValidator; +use Symfony\Component\Validator\Exception\UnexpectedTypeException; + +/** + * @api + */ +class DateValidator extends ConstraintValidator +{ + const PATTERN = '/^(\d{4})-(\d{2})-(\d{2})$/'; + + /** + * Checks if the passed value is valid. + * + * @param mixed $value The value that should be validated + * @param Constraint $constraint The constraint for the validation + * + * @return Boolean Whether or not the value is valid + * + * @api + */ + public function isValid($value, Constraint $constraint) + { + if (null === $value || '' === $value) { + return true; + } + + if ($value instanceof \DateTime) { + return true; + } + + if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) { + throw new UnexpectedTypeException($value, 'string'); + } + + $value = (string) $value; + + if (!preg_match(static::PATTERN, $value, $matches || !checkdate($matches[2], $matches[3], $matches[1]))) { + $this->setMessage($constraint->message, array('{{ value }}' => $value)); + + return false; + } + + return true; + } +} + +-- CONFIG -- +return array( + 'verify_php_doc_comments' => array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), + 'suspicious_code' => array( + 'overriding_parameter' => true, + ), +); + +-- FILENAME -- +src/Symfony/Component/Validator/Constraints/DateValidator.php + +-- COMMENTS -- +Line 28: Please define a more specific type for parameter ``$value``; consider using a union like ``null|Object``, or ``string|array``. +Line 41: The class "DateTime" does not exist. Did you forget a USE statement, or did you not list all dependencies? +Line 49: Consider using a different name than the parameter ``$value``. This often makes code more readable. +Line 51: ``$matches || !checkdate($matches[2], $matches[3], $matches[1])`` cannot be passed to ``preg_match()`` as the parameter ``$matches`` expects a reference. +Line 51: The variable ``$matches`` does not exist. Did you forget to declare it? diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/symfony_pr_4271_FunctionNode.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/symfony_pr_4271_FunctionNode.test new file mode 100644 index 0000000..1478f6f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/symfony_pr_4271_FunctionNode.test @@ -0,0 +1,317 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +use Symfony\Component\CssSelector\Exception\ParseException; +use Symfony\Component\CssSelector\XPathExpr; + +/** + * FunctionNode represents a "selector:name(expr)" node. + * + * This component is a port of the Python lxml library, + * which is copyright Infrae and distributed under the BSD license. + * + * @author Fabien Potencier + */ +class FunctionNode implements NodeInterface +{ + static protected $unsupported = array('target', 'lang', 'enabled', 'disabled'); + + protected $selector; + protected $type; + protected $name; + protected $expr; + + /** + * Constructor. + * + * @param NodeInterface $selector The XPath expression + * @param string $type + * @param string $name + * @param XPathExpr $expr + */ + public function __construct($selector, $type, $name, $expr) + { + $this->selector = $selector; + $this->type = $type; + $this->name = $name; + $this->expr = $expr; + } + + /** + * {@inheritDoc} + */ + public function __toString() + { + return sprintf('%s[%s%s%s(%s)]', __CLASS__, $this->selector, $this->type, $this->name, $this->expr); + } + + /** + * {@inheritDoc} + * @throws ParseException When unsupported or unknown pseudo-class is found + */ + public function toXpath() + { + $selPath = $this->selector->toXpath(); + if (in_array($this->name, self::$unsupported)) { + throw new ParseException(sprintf('The pseudo-class %s is not supported', $this->name)); + } + $method = '_xpath_'.str_replace('-', '_', $this->name); + if (!method_exists($this, $method)) { + throw new ParseException(sprintf('The pseudo-class %s is unknown', $this->name)); + } + + return $this->$method($selPath, $this->expr); + } + + /** + * undocumented function + * + * @param XPathExpr $xpath + * @param mixed $expr + * @param Boolean $last + * @param Boolean $addNameTest + * + * @return XPathExpr + */ + protected function _xpath_nth_child($xpath, $expr, $last = false, $addNameTest = true) + { + list($a, $b) = $this->parseSeries($expr); + + if (0 === $a && 0 === $b) { + // a=0 means nothing is returned... + $xpath->addCondition('false() and position() = 0'); + + return $xpath; + } + + if ($addNameTest) { + $xpath->addNameTest(); + } + $xpath->addStarPrefix(); + + if (0 === $a) { + if ($last) { + $b = sprintf('last() - %s', $b - 1); + } + $xpath->addCondition(sprintf('position() = %s', $b)); + + return $xpath; + } + + $position = $last ? "(last() - position() + 1)" : "position()"; + $compare = ($a < 0) ? "<=" : ">="; + + if (0 === $b) { + $xpath->addCondition(sprintf('(%s mod %s) = 0', $position, $a)); + + return $xpath; + } + + $xpath->addCondition(sprintf( + "(%s %s %s) and (((%s - %s) mod %s) = 0)", + $position, + $compare, + $b, + $position, + $b, + abs($a) + )); + + return $xpath; + } + + /** + * undocumented function + * + * @param XPathExpr $xpath + * @param XPathExpr $expr + * + * @return XPathExpr + */ + protected function _xpath_nth_last_child($xpath, $expr) + { + return $this->_xpath_nth_child($xpath, $expr, true); + } + + /** + * undocumented function + * + * @param XPathExpr $xpath + * @param XPathExpr $expr + * + * @return XPathExpr + */ + protected function _xpath_nth_of_type($xpath, $expr) + { + if ($xpath->getElement() == '*') { + throw new ParseException('*:nth-of-type() is not implemented'); + } + + return $this->_xpath_nth_child($xpath, $expr, false, false); + } + + /** + * undocumented function + * + * @param XPathExpr $xpath + * @param XPathExpr $expr + * + * @return XPathExpr + */ + protected function _xpath_nth_last_of_type($xpath, $expr) + { + return $this->_xpath_nth_child($xpath, $expr, true, false); + } + + /** + * undocumented function + * + * @param XPathExpr $xpath + * @param XPathExpr $expr + * + * @return XPathExpr + */ + protected function _xpath_contains($xpath, $expr) + { + // text content, minus tags, must contain expr + if ($expr instanceof ElementNode) { + $expr = $expr->formatElement(); + } + + // FIXME: lower-case is only available with XPath 2 + //$xpath->addCondition(sprintf('contains(lower-case(string(.)), %s)', XPathExpr::xpathLiteral(strtolower($expr)))); + $xpath->addCondition(sprintf('contains(string(.), %s)', XPathExpr::xpathLiteral($expr))); + + // FIXME: Currently case insensitive matching doesn't seem to be happening + + return $xpath; + } + + /** + * undocumented function + * + * @param XPathExpr $xpath + * @param XPathExpr $expr + * + * @return XPathExpr + */ + protected function _xpath_not($xpath, $expr) + { + // everything for which not expr applies + if ($expr instanceof ElementNode) { + $xpath->addCondition(sprintf("not(name() = '%s')", $expr->toXpath())); + + return $xpath; + } + $expr = $expr->toXpath(); + $cond = $expr->getCondition(); + // FIXME: should I do something about element_path? + $xpath->addCondition(sprintf('not(%s)', $cond)); + + return $xpath; + } + + /** + * Parses things like '1n+2', or 'an+b' generally, returning (a, b) + * + * @param mixed $s + * + * @return array + */ + protected function parseSeries($s) + { + if ($s instanceof ElementNode) { + $s = $s->formatElement(); + } + + $s = (string) $s; + + if (!$s || '*' === $s) { + // Happens when there's nothing, which the CSS parser thinks of as * + return array(0, 0); + } + + if ('odd' === $s) { + return array(2, 1); + } + + if ('even' === $s) { + return array(2, 0); + } + + if ('n' === $s) { + return array(1, 0); + } + + if (false === strpos($s, 'n')) { + // Just a b + + return array(0, intval((string) $s)); + } + + list($a, $b) = explode('n', $s); + if (!$a) { + $a = 1; + } elseif ('-' == $a || '+' == $a) { + $a = intval($a.'1'); + } else { + $a = intval($a); + } + + if (!$b) { + $b = 0; + } elseif ('-' === $b || '+' === $b) { + $b = intval($b.'1'); + } else { + $b = intval($b); + } + + return array($a, $b); + } +} + +-- CONFIG -- +return array( + 'verify_php_doc_comments' => array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), + 'checkstyle' => true, + 'suspicious_code' => array( + 'overriding_parameter' => true, + ), +); + +-- FILENAME -- +src/Symfony/Component/CssSelector/Node/FunctionNode.php + +-- COMMENTS -- +Line 62: Please add a ``@return`` annotation. +Line 80: Please define a more specific type for parameter ``$expr``; consider using a union like ``null|Object``, or ``string|array``. +Line 86: ``function _xpath_nth_child()`` does not seem to conform to the naming convention (``^(?:[a-z]|__)[a-zA-Z0-9]*$``). +Line 141: ``function _xpath_nth_last_child()`` does not seem to conform to the naming convention (``^(?:[a-z]|__)[a-zA-Z0-9]*$``). +Line 154: ``function _xpath_nth_of_type()`` does not seem to conform to the naming convention (``^(?:[a-z]|__)[a-zA-Z0-9]*$``). +Line 171: ``function _xpath_nth_last_of_type()`` does not seem to conform to the naming convention (``^(?:[a-z]|__)[a-zA-Z0-9]*$``). +Line 184: ``function _xpath_contains()`` does not seem to conform to the naming convention (``^(?:[a-z]|__)[a-zA-Z0-9]*$``). +Line 187: The class "Symfony\Component\CssSelector\Node\ElementNode" does not exist. Did you forget a USE statement, or did you not list all dependencies? +Line 188: Consider using a different name than the parameter ``$expr``. This often makes code more readable. +Line 208: ``function _xpath_not()`` does not seem to conform to the naming convention (``^(?:[a-z]|__)[a-zA-Z0-9]*$``). +Line 211: The class "Symfony\Component\CssSelector\Node\ElementNode" does not exist. Did you forget a USE statement, or did you not list all dependencies? +Line 216: Consider using a different name than the parameter ``$expr``. This often makes code more readable. +Line 227: Please define a more specific type for parameter ``$s``; consider using a union like ``null|Object``, or ``string|array``. +Line 229: Consider making the return type a bit more specific; maybe use ``array``. +Line 233: The class "Symfony\Component\CssSelector\Node\ElementNode" does not exist. Did you forget a USE statement, or did you not list all dependencies? +Line 234: Consider using a different name than the parameter ``$s``. This often makes code more readable. +Line 237: Consider using a different name than the parameter ``$s``. This often makes code more readable. diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/comments_in_between.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/comments_in_between.test new file mode 100644 index 0000000..fd445f2 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/comments_in_between.test @@ -0,0 +1,10 @@ + true); + +-- COMMENTS -- +Line 3: Please always use braces to surround the code block of IF statements. diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/else_if_with_space.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/else_if_with_space.test new file mode 100644 index 0000000..4edc63f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/else_if_with_space.test @@ -0,0 +1,10 @@ + true); + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/empty_loop.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/empty_loop.test new file mode 100644 index 0000000..aedd79d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/empty_loop.test @@ -0,0 +1,10 @@ + true); + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/loops_without_braces.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/loops_without_braces.test new file mode 100644 index 0000000..d50f235 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/loops_without_braces.test @@ -0,0 +1,19 @@ + true); + +-- COMMENTS -- +Line 3: Please always use braces to surround the code block of IF statements. +Line 4: Please always use braces to surround the code block of ELSEIF statements. +Line 5: Please always use braces to surround the code block of ELSE statements. +Line 6: Please always use braces to surround the code block of WHILE statements. +Line 7: Please always use braces to surround the code block of FOR statements. +Line 8: Please always use braces to surround the code block of FOREACH statements. diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/nested_ifs.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/nested_ifs.test new file mode 100644 index 0000000..ebbf5da --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/LoopsMustUseBraces/nested_ifs.test @@ -0,0 +1,11 @@ + true); + +-- COMMENTS -- +Line 4: Please always use braces to surround the code block of IF statements. diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ParamExpectsRef/function_call.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ParamExpectsRef/function_call.test new file mode 100644 index 0000000..32a481d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ParamExpectsRef/function_call.test @@ -0,0 +1,9 @@ + 'bar'); +test($a['foo']); \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PhpunitAssertions/assert_false.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PhpunitAssertions/assert_false.test new file mode 100644 index 0000000..817179a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PhpunitAssertions/assert_false.test @@ -0,0 +1,25 @@ +assertFalse(count($a) > 0); + $this->assertFalse(0 < count($a)); + $this->assertFalse(count($a) >= 4); + $this->assertFalse(5 <= count($a)); + $this->assertFalse(count($a) > 0, 'Foobar moo'); + } +} + +-- CONFIG -- +return array('phpunit_checks' => true); + +-- COMMENTS -- +Line 9: Instead of ``assertFalse()`` use ``$this->assertLessThanOrEqual(0, count($a))``. This will lead to a better error message when the test fails. +Line 10: Instead of ``assertFalse()`` use ``$this->assertGreaterThanOrEqual(0, count($a))``. This will lead to a better error message when the test fails. +Line 11: Instead of ``assertFalse()`` use ``$this->assertLessThan(4, count($a))``. This will lead to a better error message when the test fails. +Line 12: Instead of ``assertFalse()`` use ``$this->assertGreaterThan(5, count($a))``. This will lead to a better error message when the test fails. +Line 13: Instead of ``assertFalse()`` consider using ``$this->assertLessThanOrEqual(0, count($a))``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PhpunitAssertions/assert_true.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PhpunitAssertions/assert_true.test new file mode 100644 index 0000000..5a5b9d6 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PhpunitAssertions/assert_true.test @@ -0,0 +1,25 @@ +assertTrue(count($a) > 0); + $this->assertTrue(0 < count($a)); + $this->assertTrue(count($a) >= 4); + $this->assertTrue(5 <= count($a)); + $this->assertTrue(count($a) > 0, 'Foobar moo'); + } +} + +-- CONFIG -- +return array('phpunit_checks' => true); + +-- COMMENTS -- +Line 9: Instead of ``assertTrue()`` use ``$this->assertGreaterThan(0, count($a))``. This will lead to a better error message when the test fails. +Line 10: Instead of ``assertTrue()`` use ``$this->assertLessThan(0, count($a))``. This will lead to a better error message when the test fails. +Line 11: Instead of ``assertTrue()`` use ``$this->assertGreaterThanOrEqual(4, count($a))``. This will lead to a better error message when the test fails. +Line 12: Instead of ``assertTrue()`` use ``$this->assertLessThanOrEqual(5, count($a))``. This will lead to a better error message when the test fails. +Line 13: Instead of ``assertTrue()`` consider using ``$this->assertGreaterThan(0, count($a))``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PossibleNotices/access_char_on_empty_string.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PossibleNotices/access_char_on_empty_string.test new file mode 100644 index 0000000..45aa7f8 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/PossibleNotices/access_char_on_empty_string.test @@ -0,0 +1,14 @@ +getName(); + +$class = new ReflectionClass('Foo'); +$class->getName(); + +$method = new ReflectionMethod('foo', 'bar'); +$method->getDeclaringClass()->getName(); + +$property = new ReflectionProperty('foo', 'bar'); +$property->getDeclaringClass()->getName(); + +-- AFTER -- +getName(); + +$class = new ReflectionClass('Foo'); +$class->name; + +$method = new ReflectionMethod('foo', 'bar'); +$method->class; + +$property = new ReflectionProperty('foo', 'bar'); +$property->class; + +-- CONFIG -- +return array('reflection_fixes' => true); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReflectionUsage/ignores_all_except_objtypes.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReflectionUsage/ignores_all_except_objtypes.test new file mode 100644 index 0000000..90710ef --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReflectionUsage/ignores_all_except_objtypes.test @@ -0,0 +1,9 @@ +getName(); // $foo has NoType here + } +} + +// No comments expected. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReflectionUsage/is_subclass_of.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReflectionUsage/is_subclass_of.test new file mode 100644 index 0000000..7bcef3b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReflectionUsage/is_subclass_of.test @@ -0,0 +1,16 @@ +getName(); + +$ref = new ReflectionMethod('Foo', 'foo'); +$ref->getDeclaringClass()->getName(); +$ref->getName(); + +-- COMMENTS -- +Line 13: Consider using ``$ref->name``. There is [an issue](https://bugs.php.net/bug.php?id=61384) with ``getName()`` and APC-enabled PHP versions. +Line 16: Consider using ``$ref->class``. There is [an issue](https://bugs.php.net/bug.php?id=61384) with ``getName()`` and APC-enabled PHP versions. +Line 17: Consider using ``$ref->name``. There is [an issue](https://bugs.php.net/bug.php?id=61384) with ``getName()`` and APC-enabled PHP versions. diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReturnType/builtin_function.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReturnType/builtin_function.php new file mode 100644 index 0000000..27f3a17 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/ReturnType/builtin_function.php @@ -0,0 +1,12 @@ + true); + +-- COMMENTS -- +Line 4: The ``if``-``else`` statement can be simplified to ``return !$foo;``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_else_cond.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_else_cond.test new file mode 100644 index 0000000..063ec9e --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_else_cond.test @@ -0,0 +1,15 @@ + true); + +-- COMMENTS -- +Line 4: The ``if``-``else`` statement can be simplified to ``return !$foo;``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_else_wo_boolean_cond.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_else_wo_boolean_cond.test new file mode 100644 index 0000000..fcb0c51 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_else_wo_boolean_cond.test @@ -0,0 +1,15 @@ + true); + +-- COMMENTS -- +Line 4: The ``if``-``else`` statement can be simplified to ``return (bool) $foo;``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_wo_else_cond.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_wo_else_cond.test new file mode 100644 index 0000000..79473c7 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/if_wo_else_cond.test @@ -0,0 +1,15 @@ + true); + +-- COMMENTS -- +Line 4: This ``if`` statement, and the following ``return`` statement can be replaced with ``return !$foo;``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/return_same_value.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/return_same_value.test new file mode 100644 index 0000000..e2109fd --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SimplifyBooleanReturn/return_same_value.test @@ -0,0 +1,24 @@ + true); + +-- COMMENTS -- +Line 4: This ``if`` statement and the following ``return`` statement are superfluous as you return always ``true``. +Line 12: This ``if``-``else`` statement are superfluous as you return always ``false``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/alias_conflict.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/alias_conflict.test new file mode 100644 index 0000000..b542e45 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/alias_conflict.test @@ -0,0 +1,16 @@ +foo(); + $foo = $foo->foo(); +} + +-- COMMENTS -- +Line 11: The assignment to ``$foo`` looks wrong as ``foo()`` always returns null. +Line 15: The assignment to ``$foo`` looks wrong as ``$foo->foo()`` always returns null. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/assignment_to_closure_use.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/assignment_to_closure_use.test new file mode 100644 index 0000000..889afd3 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/assignment_to_closure_use.test @@ -0,0 +1,9 @@ + array( + 'overriding_parameter' => true, + ), +); + +-- COMMENTS -- +Line 4: Consider using a different name than the parameter ``$foo``. This often makes code more readable. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/empty_catch.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/empty_catch.test new file mode 100644 index 0000000..684d521 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/SuspiciousCode/empty_catch.test @@ -0,0 +1,42 @@ + 1); + $options = array_merge($options, array( + 'foo' => 'bar', + 'enabled' => true, + )); + + /** @type string */ $options['foo']; + /** @type boolean */ $options['enabled']; +}; + +/** @Assertions(4) */ +function testArrayMergeWhenNumericKeys() { + $tupel = array_merge(array('a', 1), array(3.4, true)); + + /** @type string */ $tupel[0]; + /** @type integer */ $tupel[1]; + /** @type double */ $tupel[2]; + /** @type boolean */ $tupel[3]; +} + +/** @Assertions(2) */ +function testArrayReplace() { + $options = array_replace(array('foo' => 1), array('foo' => 'bar', 'enabled' => true)); + /** @type string */ $options['foo']; + /** @type boolean */ $options['enabled']; +}; + +/** @Assertions(4) */ +function testArrayReplaceWhenNumericKeys() { + $tupel = array_replace(array('a', 1), array(3.4, true)); + + /** @type double */ $tupel[0]; + /** @type boolean */ $tupel[1]; + + // The following two could be discussed. Theoretically, we could know that + // we know all defined items, and then automatically assign the None, or + // Unknown type when items for which we know for sure that they do not exist + // are accessed. + /** @type string|integer|double|boolean */ $tupel[2]; + /** @type string|integer|double|boolean */ $tupel[3]; +} + +/** @Assertions(5) */ +function testArrayMergeRecursive() { + $ar1 = array("color" => array("favorite" => "red"), 5); + $ar2 = array(10.4545, "color" => array("favorite" => true, 43.432)); + $result = array_merge_recursive($ar1, $ar2); + + // Resulting Array + // ['color' => ['favorite' => ['red', true], 43.432], 5, 10.4545] + + /** @type string */ $result['color']['favorite'][0]; + /** @type boolean */ $result['color']['favorite'][1]; + /** @type double */ $result['color'][0]; + /** @type integer */ $result[0]; + /** @type double */ $result[1]; +}; + +/** @Assertions(4) */ +function testArrayReplaceRecursive() { + $base = array('citrus' => array("orange") , 'berries' => array("blackberry", 434), 'others' => true ); + $replacements = array('citrus' => 'pineapple', 'berries' => array('blueberry'), 'others' => array('litchis')); + $replacements2 = array('citrus' => array('pineapple'), 'berries' => array('blueberry'), 'others' => 'litchis'); + + $basket = array_replace_recursive($base, $replacements, $replacements2); + + /** @type string */ $basket['citrus'][0]; + /** @type string */ $basket['berries'][0]; + /** @type integer */ $basket['berries'][1]; + /** @type string */ $basket['others']; +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/boolean_not.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/boolean_not.php new file mode 100644 index 0000000..1f0c862 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/boolean_not.php @@ -0,0 +1,31 @@ +tokens = array(new Token()); + $this->previous = $this->token = $this->next = null; + } + + /** @Assertions(3) */ + public function test() + { + /** @type object|null */ + $x = $this->token; + + /** @type object|null */ + $x = $this->previous; + + /** @type object|null */ + $x = $this->next; + } + + /** + * @Assertions(0) + */ + public function moveNext() + { + $this->previous = $this->token; + $this->token = $this->next; + + $this->next = null; + $i = 0; + while (true) { + $nextToken = $this->tokens[$i]; + if ($foo) { + continue; + } + + $this->next = $nextToken; + break; + } + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/list_assign.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/list_assign.php new file mode 100644 index 0000000..2d759b1 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/list_assign.php @@ -0,0 +1,23 @@ + */ + returnsTupel(); + + /** @type string */ $a; + /** @type integer */ $b; + /** @type boolean */ $c; + /** @type integer */ $d; + /** @type string */ $e; + /** @type boolean */ $f; +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/method_interpreter_integration.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/method_interpreter_integration.php new file mode 100644 index 0000000..60714cb --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/method_interpreter_integration.php @@ -0,0 +1,17 @@ +asXml(); + $b = $x->asXml(__FILE__); + + /** @type string|false */ $a; + /** @type boolean */ $b; +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/phpunit_mocks.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/phpunit_mocks.php new file mode 100644 index 0000000..5a2b5da --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/phpunit_mocks.php @@ -0,0 +1,38 @@ +getMock(); + + /** @type object */ + $x = $this->getMockBuilder(); + + /** @type unknown */ + $x = $x->getMock(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/phpunit_teardown.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/phpunit_teardown.php new file mode 100644 index 0000000..bc625d5 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/phpunit_teardown.php @@ -0,0 +1,34 @@ +logger = new Logger(); + + $this->nullableLogger = new Logger(); + if ($foo) { + $this->nullableLogger = null; + } + } + + /** @Assertions(0) */ + protected function tearDown() + { + $this->logger = null; + } + + /** @Assertions(2) */ + public function testFoo() + { + /** @type object */ $x = $this->logger; + /** @type object|null */ $x = $this->nullableLogger; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/property_refined_in_closure.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/property_refined_in_closure.php new file mode 100644 index 0000000..92675b3 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/property_refined_in_closure.php @@ -0,0 +1,15 @@ +a = 'foo'; + $x = $a->a; + + /** @type string */ $x; +}; \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/property_refined_in_global_scope.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/property_refined_in_global_scope.php new file mode 100644 index 0000000..10fa01f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/property_refined_in_global_scope.php @@ -0,0 +1,12 @@ +a = 'foo'; + +/** @type string */ +$x = $a->a; diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/reverse_interpretation_of_case_statements.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/reverse_interpretation_of_case_statements.php new file mode 100644 index 0000000..40daf51 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/reverse_interpretation_of_case_statements.php @@ -0,0 +1,23 @@ + */ $x instanceof A: + /** @type object */ $x; + break; + + case /** @type object */ $x instanceof B: + /** @type object */ $x; + break; + + default: + /** @type object */ $x; + } + + /** @type object */ $x; +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/this_in_closure.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/this_in_closure.php new file mode 100644 index 0000000..40e2d6c --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/annotated-code/this_in_closure.php @@ -0,0 +1,31 @@ + */ $this; + + function() { + /** @type this */ $this; + + function() { + /** @type this */ $this; + }; + }; + }; + } +} + +/** @Assertions(1) */ +function foo() { + function() { + /** @type none */ $this; + }; +} + +function() { + /** @type none */ $this; +}; \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/array_pop.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/array_pop.php new file mode 100644 index 0000000..0b1086a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/array_pop.php @@ -0,0 +1,6 @@ +" +while ($y = array_pop($x)) { + $y; // should be "string" here +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/constant_as_default.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/constant_as_default.php new file mode 100644 index 0000000..f8c9933 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/constant_as_default.php @@ -0,0 +1,13 @@ +foo; + } + + public function __construct(Foo $foo) + { + $this->foo = $foo; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/deadlock_test.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/deadlock_test.php new file mode 100644 index 0000000..6b9f8bc --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/deadlock_test.php @@ -0,0 +1,42 @@ +{0:Node} + * 2nd: array{0:Node,1:Node} + * 3rd: array{0:Node,1:Node,2:Node} + * . + * . + * . + * nth: array{0:Node,...,n:Node} + * + * The special problem here is that the method is called recursively and thus a change in the + * returned items changes the return value in the next iteration. Type Inference only stops + * when it reaches the maximum number of allowed iterations which can take some time, and + * slows down reviews considerably. + * + * Possible Solutions: + * 1. Drop the item types on array_merge if we don't know all types that are part of the + * array_merge (or other merge function) call. This should generally be done as we + * cannot say anything reliable about item types anyway if we do not know all + * argument types. This should fix that situation, not sure if it fixes all situations. + */ +class Node +{ + private $subNodes = array(); + + public function addSubNode(Node $node) + { + $this->subNodes[] = $node; + } + + public function getSubNodesRecursive() + { + $subNodes = array($this); + foreach ($this->subNodes as $subNode) { + $subNodes = array_merge($subNodes, $subNode->getSubNodesRecursive()); + } + + return $subNodes; + } +} diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/defining_expr_for_variable.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/defining_expr_for_variable.php new file mode 100644 index 0000000..5b14099 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/defining_expr_for_variable.php @@ -0,0 +1,10 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Symfony\Bundle\FrameworkBundle\DependencyInjection; + +use Symfony\Component\Config\Loader\LoaderInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\DefinitionDecorator; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Finder\Finder; +use Symfony\Component\HttpKernel\DependencyInjection\Extension; +use Symfony\Component\Config\FileLocator; + +/** + * FrameworkExtension. + * + * @author Fabien Potencier + * @author Jeremy Mikola + */ +class FrameworkExtension extends Extension +{ + /** + * Responds to the app.config configuration parameter. + * + * @param array $configs + * @param ContainerBuilder $container + */ + public function load(array $configs, ContainerBuilder $container) + { + $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + + $loader->load('web.xml'); + $loader->load('services.xml'); + + // A translator must always be registered (as support is included by + // default in the Form component). If disabled, an identity translator + // will be used and everything will still work as expected. + $loader->load('translation.xml'); + + if ($container->getParameter('kernel.debug')) { + $loader->load('debug.xml'); + $container->setDefinition('event_dispatcher', $container->findDefinition('debug.event_dispatcher')); + $container->setAlias('debug.event_dispatcher', 'event_dispatcher'); + + $container->setDefinition('controller_resolver', $container->findDefinition('debug.controller_resolver')); + $container->setAlias('debug.controller_resolver', 'controller_resolver'); + } + + $configuration = $this->getConfiguration($configs, $container); + $config = $this->processConfiguration($configuration, $configs); + + if (isset($config['charset'])) { + $container->setParameter('kernel.charset', $config['charset']); + } + $container->setParameter('kernel.secret', $config['secret']); + + $container->setParameter('kernel.trust_proxy_headers', $config['trust_proxy_headers']); + + $container->setParameter('kernel.default_locale', $config['default_locale']); + + if (!empty($config['test'])) { + $loader->load('test.xml'); + } + + if (isset($config['session'])) { + $this->registerSessionConfiguration($config['session'], $container, $loader); + } + + if (isset($config['form']) && !empty($config['form']['enabled'])) { + $this->registerFormConfiguration($config, $container, $loader); + $config['validation']['enabled'] = true; + } + + if (!empty($config['validation']['enabled'])) { + $this->registerValidationConfiguration($config['validation'], $container, $loader); + } + + if (isset($config['esi'])) { + $this->registerEsiConfiguration($config['esi'], $loader); + } + + if (isset($config['profiler'])) { + $this->registerProfilerConfiguration($config['profiler'], $container, $loader); + } + + if (isset($config['router'])) { + $this->registerRouterConfiguration($config['router'], $container, $loader); + } + + if (isset($config['templating'])) { + $this->registerTemplatingConfiguration($config['templating'], $config['ide'], $container, $loader); + } + + if (isset($config['translator'])) { + $this->registerTranslatorConfiguration($config['translator'], $container); + } + + $this->registerAnnotationsConfiguration($config['annotations'], $container, $loader); + + $this->addClassesToCompile(array( + 'Symfony\\Component\\HttpFoundation\\ParameterBag', + 'Symfony\\Component\\HttpFoundation\\HeaderBag', + 'Symfony\\Component\\HttpFoundation\\FileBag', + 'Symfony\\Component\\HttpFoundation\\ServerBag', + 'Symfony\\Component\\HttpFoundation\\Request', + 'Symfony\\Component\\HttpFoundation\\Response', + 'Symfony\\Component\\HttpFoundation\\ResponseHeaderBag', + + 'Symfony\\Component\\Config\\FileLocator', + + 'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface', + 'Symfony\\Component\\EventDispatcher\\EventDispatcher', + 'Symfony\\Component\\EventDispatcher\\Event', + 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface', + 'Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher', + + 'Symfony\\Component\\HttpKernel\\HttpKernel', + 'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener', + 'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener', + 'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver', + 'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface', + 'Symfony\\Component\\HttpKernel\\Event\\KernelEvent', + 'Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent', + 'Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent', + 'Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent', + 'Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent', + 'Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent', + 'Symfony\\Component\\HttpKernel\\KernelEvents', + 'Symfony\\Component\\HttpKernel\\Config\\FileLocator', + + 'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerNameParser', + 'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver', + // Cannot be included because annotations will parse the big compiled class file + // 'Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller', + 'Symfony\\Bundle\\FrameworkBundle\\HttpKernel', + )); + } + + public function getConfiguration(array $config, ContainerBuilder $container) + { + return new Configuration($container->getParameter('kernel.debug')); + } + + /** + * Loads Form configuration. + * + * @param array $config A configuration array + * @param ContainerBuilder $container A ContainerBuilder instance + * @param XmlFileLoader $loader An XmlFileLoader instance + */ + private function registerFormConfiguration($config, ContainerBuilder $container, XmlFileLoader $loader) + { + $loader->load('form.xml'); + if (isset($config['csrf_protection'])) { + if (!isset($config['session'])) { + throw new \LogicException('CSRF protection needs that sessions are enabled.'); + } + $loader->load('form_csrf.xml'); + + $container->setParameter('form.type_extension.csrf.enabled', $config['csrf_protection']['enabled']); + $container->setParameter('form.type_extension.csrf.field_name', $config['csrf_protection']['field_name']); + } + } + + /** + * Loads the ESI configuration. + * + * @param array $config An ESI configuration array + * @param XmlFileLoader $loader An XmlFileLoader instance + */ + private function registerEsiConfiguration(array $config, XmlFileLoader $loader) + { + if (!empty($config['enabled'])) { + $loader->load('esi.xml'); + } + } + + /** + * Loads the profiler configuration. + * + * @param array $config A profiler configuration array + * @param ContainerBuilder $container A ContainerBuilder instance + * @param XmlFileLoader $loader An XmlFileLoader instance + */ + private function registerProfilerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + { + $loader->load('profiling.xml'); + $loader->load('collectors.xml'); + + $container->setParameter('profiler_listener.only_exceptions', $config['only_exceptions']); + $container->setParameter('profiler_listener.only_master_requests', $config['only_master_requests']); + + // Choose storage class based on the DSN + $supported = array( + 'sqlite' => 'Symfony\Component\HttpKernel\Profiler\SqliteProfilerStorage', + 'mysql' => 'Symfony\Component\HttpKernel\Profiler\MysqlProfilerStorage', + 'file' => 'Symfony\Component\HttpKernel\Profiler\FileProfilerStorage', + 'mongodb' => 'Symfony\Component\HttpKernel\Profiler\MongoDbProfilerStorage', + 'memcache' => 'Symfony\Component\HttpKernel\Profiler\MemcacheProfilerStorage', + 'memcached' => 'Symfony\Component\HttpKernel\Profiler\MemcachedProfilerStorage', + 'redis' => 'Symfony\Component\HttpKernel\Profiler\RedisProfilerStorage', + ); + list($class, ) = explode(':', $config['dsn'], 2); + if (!isset($supported[$class])) { + throw new \LogicException(sprintf('Driver "%s" is not supported for the profiler.', $class)); + } + + $container->setParameter('profiler.storage.dsn', $config['dsn']); + $container->setParameter('profiler.storage.username', $config['username']); + $container->setParameter('profiler.storage.password', $config['password']); + $container->setParameter('profiler.storage.lifetime', $config['lifetime']); + + $container->getDefinition('profiler.storage')->setClass($supported[$class]); + + if (isset($config['matcher'])) { + if (isset($config['matcher']['service'])) { + $container->setAlias('profiler.request_matcher', $config['matcher']['service']); + } elseif (isset($config['matcher']['ip']) || isset($config['matcher']['path'])) { + $definition = $container->register('profiler.request_matcher', 'Symfony\\Component\\HttpFoundation\\RequestMatcher'); + $definition->setPublic(false); + + if (isset($config['matcher']['ip'])) { + $definition->addMethodCall('matchIp', array($config['matcher']['ip'])); + } + + if (isset($config['matcher']['path'])) { + $definition->addMethodCall('matchPath', array($config['matcher']['path'])); + } + } + } + } + + /** + * Loads the router configuration. + * + * @param array $config A router configuration array + * @param ContainerBuilder $container A ContainerBuilder instance + * @param XmlFileLoader $loader An XmlFileLoader instance + */ + private function registerRouterConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + { + $loader->load('routing.xml'); + + $container->setParameter('router.resource', $config['resource']); + $router = $container->findDefinition('router.default'); + + if (isset($config['type'])) { + $argument = $router->getArgument(2); + $argument['resource_type'] = $config['type']; + $router->replaceArgument(2, $argument); + } + + $container->setParameter('request_listener.http_port', $config['http_port']); + $container->setParameter('request_listener.https_port', $config['https_port']); + + $this->addClassesToCompile(array( + 'Symfony\\Component\\Routing\\Matcher\\UrlMatcherInterface', + 'Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface', + 'Symfony\\Component\\Routing\\RouterInterface', + 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher', + 'Symfony\\Component\\Routing\\Generator\\UrlGenerator', + 'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface', + 'Symfony\\Component\\Routing\\RequestContextAwareInterface', + 'Symfony\\Component\\Routing\\RequestContext', + 'Symfony\\Component\\Routing\\Router', + 'Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableUrlMatcher', + $container->findDefinition('router.default')->getClass(), + )); + } + + /** + * Loads the session configuration. + * + * @param array $config A session configuration array + * @param ContainerBuilder $container A ContainerBuilder instance + * @param XmlFileLoader $loader An XmlFileLoader instance + */ + private function registerSessionConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + { + $loader->load('session.xml'); + + // session + $container->getDefinition('session_listener')->addArgument($config['auto_start']); + + // session storage + $container->setAlias('session.storage', $config['storage_id']); + $options = array(); + foreach (array('name', 'cookie_lifetime', 'cookie_path', 'cookie_domain', 'cookie_secure', 'cookie_httponly', 'auto_start', 'gc_maxlifetime', 'gc_probability', 'gc_divisor') as $key) { + if (isset($config[$key])) { + $options[$key] = $config[$key]; + } + } + + //we deprecated session options without cookie_ prefix, but we are still supporting them, + //Let's merge the ones that were supplied without prefix + foreach (array('lifetime', 'path', 'domain', 'secure', 'httponly') as $key) { + if (!isset($options['cookie_'.$key]) && isset($config[$key])) { + $options['cookie_'.$key] = $config[$key]; + } + } + $container->setParameter('session.storage.options', $options); + + // session handler (the internal callback registered with PHP session management) + $container->setAlias('session.handler', $config['handler_id']); + + $container->setParameter('session.save_path', $config['save_path']); + + $this->addClassesToCompile(array( + 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\SessionListener', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\NativeSessionHandler', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\AbstractProxy', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\SessionHandlerProxy', + $container->getDefinition('session')->getClass(), + )); + + if ($container->hasDefinition($config['storage_id'])) { + $this->addClassesToCompile(array( + $container->findDefinition('session.storage')->getClass(), + )); + } + } + + /** + * Loads the templating configuration. + * + * @param array $config A templating configuration array + * @param string $ide + * @param ContainerBuilder $container A ContainerBuilder instance + * @param XmlFileLoader $loader An XmlFileLoader instance + */ + private function registerTemplatingConfiguration(array $config, $ide, ContainerBuilder $container, XmlFileLoader $loader) + { + $loader->load('templating.xml'); + $loader->load('templating_php.xml'); + + $links = array( + 'textmate' => 'txmt://open?url=file://%%f&line=%%l', + 'macvim' => 'mvim://open?url=file://%%f&line=%%l', + ); + + $container->setParameter('templating.helper.code.file_link_format', isset($links[$ide]) ? $links[$ide] : $ide); + $container->setParameter('templating.helper.form.resources', $config['form']['resources']); + $container->setParameter('templating.hinclude.default_template', $config['hinclude_default_template']); + + if ($container->getParameter('kernel.debug')) { + $loader->load('templating_debug.xml'); + } + + // create package definitions and add them to the assets helper + $defaultPackage = $this->createPackageDefinition($container, $config['assets_base_urls']['http'], $config['assets_base_urls']['ssl'], $config['assets_version'], $config['assets_version_format']); + $container->setDefinition('templating.asset.default_package', $defaultPackage); + $namedPackages = array(); + foreach ($config['packages'] as $name => $package) { + $namedPackage = $this->createPackageDefinition($container, $package['base_urls']['http'], $package['base_urls']['ssl'], $package['version'], $package['version_format'], $name); + $container->setDefinition('templating.asset.package.'.$name, $namedPackage); + $namedPackages[$name] = new Reference('templating.asset.package.'.$name); + } + $container->getDefinition('templating.helper.assets')->setArguments(array( + new Reference('templating.asset.default_package'), + $namedPackages, + )); + + // Apply request scope to assets helper if one or more packages are request-scoped + $requireRequestScope = array_reduce( + $namedPackages, + function($v, Reference $ref) use ($container) { + return $v || 'request' === $container->getDefinition($ref)->getScope(); + }, + 'request' === $defaultPackage->getScope() + ); + + if ($requireRequestScope) { + $container->getDefinition('templating.helper.assets')->setScope('request'); + } + + if (!empty($config['loaders'])) { + $loaders = array_map(function($loader) { return new Reference($loader); }, $config['loaders']); + + // Use a delegation unless only a single loader was registered + if (1 === count($loaders)) { + $container->setAlias('templating.loader', (string) reset($loaders)); + } else { + $container->getDefinition('templating.loader.chain')->addArgument($loaders); + $container->setAlias('templating.loader', 'templating.loader.chain'); + } + } + + $container->setParameter('templating.loader.cache.path', null); + if (isset($config['cache'])) { + // Wrap the existing loader with cache (must happen after loaders are registered) + $container->setDefinition('templating.loader.wrapped', $container->findDefinition('templating.loader')); + $loaderCache = $container->getDefinition('templating.loader.cache'); + $container->setParameter('templating.loader.cache.path', $config['cache']); + + $container->setDefinition('templating.loader', $loaderCache); + } + + $this->addClassesToCompile(array( + 'Symfony\\Bundle\\FrameworkBundle\\Templating\\GlobalVariables', + 'Symfony\\Bundle\\FrameworkBundle\\Templating\\EngineInterface', + 'Symfony\\Component\\Templating\\StreamingEngineInterface', + 'Symfony\\Component\\Templating\\TemplateNameParserInterface', + 'Symfony\\Component\\Templating\\TemplateNameParser', + 'Symfony\\Component\\Templating\\EngineInterface', + 'Symfony\\Component\\Config\\FileLocatorInterface', + 'Symfony\\Component\\Templating\\TemplateReferenceInterface', + 'Symfony\\Component\\Templating\\TemplateReference', + 'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateReference', + 'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateNameParser', + $container->findDefinition('templating.locator')->getClass(), + )); + + if (in_array('php', $config['engines'], true)) { + $this->addClassesToCompile(array( + 'Symfony\\Component\\Templating\\PhpEngine', + 'Symfony\\Component\\Templating\\Loader\\LoaderInterface', + 'Symfony\\Component\\Templating\\Storage\\Storage', + 'Symfony\\Component\\Templating\\Storage\\FileStorage', + 'Symfony\\Bundle\\FrameworkBundle\\Templating\\PhpEngine', + 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Loader\\FilesystemLoader', + )); + } + + $container->setParameter('templating.engines', $config['engines']); + $engines = array_map(function($engine) { return new Reference('templating.engine.'.$engine); }, $config['engines']); + + // Use a delegation unless only a single engine was registered + if (1 === count($engines)) { + $container->setAlias('templating', (string) reset($engines)); + } else { + $container->getDefinition('templating.engine.delegating')->replaceArgument(1, $engines); + $container->setAlias('templating', 'templating.engine.delegating'); + } + } + + /** + * Returns a definition for an asset package. + */ + private function createPackageDefinition(ContainerBuilder $container, array $httpUrls, array $sslUrls, $version, $format, $name = null) + { + if (!$httpUrls) { + $package = new DefinitionDecorator('templating.asset.path_package'); + $package + ->setPublic(false) + ->setScope('request') + ->replaceArgument(1, $version) + ->replaceArgument(2, $format) + ; + + return $package; + } + + if ($httpUrls == $sslUrls) { + $package = new DefinitionDecorator('templating.asset.url_package'); + $package + ->setPublic(false) + ->replaceArgument(0, $sslUrls) + ->replaceArgument(1, $version) + ->replaceArgument(2, $format) + ; + + return $package; + } + + $prefix = $name ? 'templating.asset.package.'.$name : 'templating.asset.default_package'; + + $httpPackage = new DefinitionDecorator('templating.asset.url_package'); + $httpPackage + ->replaceArgument(0, $httpUrls) + ->replaceArgument(1, $version) + ->replaceArgument(2, $format) + ; + $container->setDefinition($prefix.'.http', $httpPackage); + + if ($sslUrls) { + $sslPackage = new DefinitionDecorator('templating.asset.url_package'); + $sslPackage + ->replaceArgument(0, $sslUrls) + ->replaceArgument(1, $version) + ->replaceArgument(2, $format) + ; + } else { + $sslPackage = new DefinitionDecorator('templating.asset.path_package'); + $sslPackage + ->setScope('request') + ->replaceArgument(1, $version) + ->replaceArgument(2, $format) + ; + } + $container->setDefinition($prefix.'.ssl', $sslPackage); + + $package = new DefinitionDecorator('templating.asset.request_aware_package'); + $package + ->setPublic(false) + ->setScope('request') + ->replaceArgument(1, $prefix.'.http') + ->replaceArgument(2, $prefix.'.ssl') + ; + + return $package; + } + + /** + * Loads the translator configuration. + * + * @param array $config A translator configuration array + * @param ContainerBuilder $container A ContainerBuilder instance + */ + private function registerTranslatorConfiguration(array $config, ContainerBuilder $container) + { + if (!empty($config['enabled'])) { + // Use the "real" translator instead of the identity default + $container->setAlias('translator', 'translator.default'); + $translator = $container->findDefinition('translator.default'); + $translator->addMethodCall('setFallbackLocale', array($config['fallback'])); + + // Discover translation directories + $dirs = array(); + foreach ($container->getParameter('kernel.bundles') as $bundle) { + $reflection = new \ReflectionClass($bundle); + if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/translations')) { + $dirs[] = $dir; + } + } + if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/translations')) { + $dirs[] = $dir; + } + + // Register translation resources + if ($dirs) { + $finder = new Finder(); + $finder->files()->filter(function (\SplFileInfo $file) { + return 2 === substr_count($file->getBasename(), '.') && preg_match('/\.\w+$/', $file->getBasename()); + })->in($dirs); + foreach ($finder as $file) { + // filename is domain.locale.format + list($domain, $locale, $format) = explode('.', $file->getBasename(), 3); + + $translator->addMethodCall('addResource', array($format, (string) $file, $locale, $domain)); + } + } + } + } + + /** + * Loads the validator configuration. + * + * @param array $config A validation configuration array + * @param ContainerBuilder $container A ContainerBuilder instance + * @param XmlFileLoader $loader An XmlFileLoader instance + */ + private function registerValidationConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + { + $loader->load('validator.xml'); + + $container->setParameter('validator.mapping.loader.xml_files_loader.mapping_files', $this->getValidatorXmlMappingFiles($container)); + $container->setParameter('validator.mapping.loader.yaml_files_loader.mapping_files', $this->getValidatorYamlMappingFiles($container)); + + if (array_key_exists('enable_annotations', $config) && $config['enable_annotations']) { + $loaderChain = $container->getDefinition('validator.mapping.loader.loader_chain'); + $arguments = $loaderChain->getArguments(); + array_unshift($arguments[0], new Reference('validator.mapping.loader.annotation_loader')); + $loaderChain->setArguments($arguments); + } + + if (isset($config['cache'])) { + $container->getDefinition('validator.mapping.class_metadata_factory') + ->replaceArgument(1, new Reference('validator.mapping.cache.'.$config['cache'])); + $container->setParameter( + 'validator.mapping.cache.prefix', + 'validator_'.md5($container->getParameter('kernel.root_dir')) + ); + } + } + + private function getValidatorXmlMappingFiles(ContainerBuilder $container) + { + $reflClass = new \ReflectionClass('Symfony\Component\Form\FormInterface'); + $files = array(dirname($reflClass->getFileName()).'/Resources/config/validation.xml'); + $container->addResource(new FileResource($files[0])); + + foreach ($container->getParameter('kernel.bundles') as $bundle) { + $reflection = new \ReflectionClass($bundle); + if (is_file($file = dirname($reflection->getFilename()).'/Resources/config/validation.xml')) { + $files[] = realpath($file); + $container->addResource(new FileResource($file)); + } + } + + return $files; + } + + private function getValidatorYamlMappingFiles(ContainerBuilder $container) + { + $files = array(); + + foreach ($container->getParameter('kernel.bundles') as $bundle) { + $reflection = new \ReflectionClass($bundle); + if (is_file($file = dirname($reflection->getFilename()).'/Resources/config/validation.yml')) { + $files[] = realpath($file); + $container->addResource(new FileResource($file)); + } + } + + return $files; + } + + private function registerAnnotationsConfiguration(array $config, ContainerBuilder $container,$loader) + { + $loader->load('annotations.xml'); + + if ('file' === $config['cache']) { + $cacheDir = $container->getParameterBag()->resolveValue($config['file_cache_dir']); + if (!is_dir($cacheDir) && false === @mkdir($cacheDir, 0777, true)) { + throw new \RuntimeException(sprintf('Could not create cache directory "%s".', $cacheDir)); + } + + $container + ->getDefinition('annotations.file_cache_reader') + ->replaceArgument(1, $cacheDir) + ->replaceArgument(2, $config['debug']) + ; + $container->setAlias('annotation_reader', 'annotations.file_cache_reader'); + } else if('none' !== $config['cache']) { + $container + ->getDefinition('annotations.cached_reader') + ->replaceArgument(1, new Reference($config['cache'])) + ->replaceArgument(2, $config['debug']) + ; + $container->setAlias('annotation_reader', 'annotations.cached_reader'); + } + } + + /** + * Returns the base path for the XSD files. + * + * @return string The XSD base path + */ + public function getXsdValidationBasePath() + { + return __DIR__.'/../Resources/config/schema'; + } + + public function getNamespace() + { + return 'http://symfony.com/schema/dic/symfony'; + } +} diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/foreach_with_object.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/foreach_with_object.php new file mode 100644 index 0000000..5ffb8c7 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/foreach_with_object.php @@ -0,0 +1,5 @@ + + + return; + } + + $x; // should be object|object +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types.php new file mode 100644 index 0000000..b13dfeb --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types.php @@ -0,0 +1,34 @@ +returnsThis(); // $x should be B. +$x = $b->returnsParent(); // $x should be B. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types2.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types2.php new file mode 100644 index 0000000..4b483b4 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types2.php @@ -0,0 +1,28 @@ +returnsThis(); // object \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types3.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types3.php new file mode 100644 index 0000000..f2c486d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/late_binding_types3.php @@ -0,0 +1,28 @@ +returnsThis(); // object \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/preg_replace.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/preg_replace.php new file mode 100644 index 0000000..98f21c4 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/preg_replace.php @@ -0,0 +1,11 @@ +foo; + } + + public function __construct() + { + $this->foo = new Foo; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_property.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_property.php new file mode 100644 index 0000000..7e23da6 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_property.php @@ -0,0 +1,23 @@ +bar = null; + if ($foo) { + $this->bar = new Bar(); + } + + while(true) { + $this->bar; + if (null !== $this->bar) { + // ``$this->bar`` should be of type object inside this IF. + $this->bar; + } + $this->bar; + } + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_property_2.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_property_2.php new file mode 100644 index 0000000..f8a962d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_property_2.php @@ -0,0 +1,21 @@ +x = $x; + } + + public function sth() + { + $this->x; + while (true) { + if (null !== $this->x) { + $this->x; + } + } + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_static_property.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_static_property.php new file mode 100644 index 0000000..a8ca61b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_static_property.php @@ -0,0 +1,29 @@ +a(); // self::$a should be "object". + } + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_variable.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_variable.php new file mode 100644 index 0000000..7b5421a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_variable.php @@ -0,0 +1,15 @@ + inside this IF. + $x; + } + $x; +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_variable_2.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_variable_2.php new file mode 100644 index 0000000..a0e9098 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/refined_variable_2.php @@ -0,0 +1,9 @@ + $array) { + if (is_numeric(key($array))) { + $return[$name] = reset($array); + } else { + $return[$name] = $array; + } + } + } + + return $return; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/run_test2.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/run_test2.php new file mode 100644 index 0000000..3e1b4bc --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/run_test2.php @@ -0,0 +1,72 @@ +currentLineNb = -1; + $this->currentLine = ''; + $this->lines = explode("\n", $value); + + $data = array(); + $context = null; + while (true) { + $isRef = $isInPlace = $isProcessed = false; + if ($x) { + $c = $this->getRealCurrentLineNb() + 1; + $parser = new YamlParser($c); + $parser->refs =& $this->refs; + $data[] = $parser->parse($this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport); + } elseif ($y) { + if ($isProcessed) { + // Merge keys + $data = $isProcessed; + // hash + } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { + // if next line is less indented or equal, then it means that the current value is null + if ($this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) { + $data[$key] = null; + } else { + $c = $this->getRealCurrentLineNb() + 1; + $parser = new Parser($c); + $parser->refs =& $this->refs; + $data[$key] = $parser->parse($this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport); + } + } else { + if ($isInPlace) { + $data = $this->refs[$isInPlace]; + } else { + $data[$key] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport); + } + } + } else { + if ($x) { + if (is_array($value)) { + $first = reset($value); + if (is_string($first) && 0 === strpos($first, '*')) { + $data = array(); + foreach ($value as $alias) { + $data[] = $this->refs[substr($alias, 1)]; + } + $value = $data; + } + } + + return $value; + } + + throw new ParseException($error, $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + + if ($isRef) { + $this->refs[$isRef] = end($data); + } + } + + return empty($data) ? null : $data; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/static_and_self.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/static_and_self.php new file mode 100644 index 0000000..6182d79 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/static_and_self.php @@ -0,0 +1,14 @@ +" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "array" + "expr": + "PHPParser_Node_Expr_Array": + type: "array" + children: + "items": + 0: + "PHPParser_Node_Expr_ArrayItem": + type: undefined + children: + "value": + "PHPParser_Node_Scalar_String": + type: "string" + 1: + "PHPParser_Node_Stmt_While": + type: undefined + children: + "cond": + "PHPParser_Node_Expr_Assign": + type: "string|null" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "string|null" + "expr": + "PHPParser_Node_Expr_FuncCall": + type: "string|null" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "args": + 0: + "PHPParser_Node_Arg": + type: "array" + children: + "value": + "PHPParser_Node_Expr_Variable": + type: "array" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Variable": + type: "string" diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/constant_as_default.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/constant_as_default.ast new file mode 100644 index 0000000..6388029 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/constant_as_default.ast @@ -0,0 +1,54 @@ +"PHPParser_Node_Stmt_Class": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_ClassConst": + type: undefined + children: + "consts": + 0: + "PHPParser_Node_Const": + type: undefined + children: + "value": + "PHPParser_Node_Expr_ConstFetch": + type: "false" + children: + "name": + "PHPParser_Node_Name": + type: undefined + 1: + "PHPParser_Node_Stmt_ClassMethod": + type: undefined + children: + "params": + 0: + "PHPParser_Node_Param": + type: "false" + children: + "default": + "PHPParser_Node_Expr_ClassConstFetch": + type: "false" + children: + "class": + "PHPParser_Node_Name": + type: undefined + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Echo": + type: undefined + children: + "exprs": + 0: + "PHPParser_Node_Expr_Variable": + type: "false" + "namespacedName": + "PHPParser_Node_Name": + type: undefined diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/defining_expr_for_variable.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/defining_expr_for_variable.ast new file mode 100644 index 0000000..e9d5249 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/defining_expr_for_variable.ast @@ -0,0 +1,67 @@ +"PHPParser_Node_Stmt_Function": + type: undefined + children: + "params": + 0: + "PHPParser_Node_Param": + type: "?" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Variable": + type: "?" + 1: + "PHPParser_Node_Expr_Assign": + type: "boolean" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "boolean" + "expr": + "PHPParser_Node_Expr_FuncCall": + type: "boolean" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "args": + 0: + "PHPParser_Node_Arg": + type: "?" + children: + "value": + "PHPParser_Node_Expr_Variable": + type: "?" + 2: + "PHPParser_Node_Stmt_If": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Variable": + type: "object|array" + "cond": + "PHPParser_Node_Expr_BooleanOr": + type: "boolean" + children: + "left": + "PHPParser_Node_Expr_Instanceof": + type: "boolean" + children: + "expr": + "PHPParser_Node_Expr_Variable": + type: "?" + "class": + "PHPParser_Node_Name_FullyQualified": + type: "object" + "right": + "PHPParser_Node_Expr_Variable": + type: "boolean" + "namespacedName": + "PHPParser_Node_Name": + type: undefined diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/foreach_with_object.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/foreach_with_object.ast new file mode 100644 index 0000000..038d23e --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/foreach_with_object.ast @@ -0,0 +1,32 @@ +"PHPParser_Node_Stmt_Foreach": + line: 3 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 3 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Echo": + line: 4 + type: undefined + children: + "exprs": + 0: + "PHPParser_Node_Expr_Variable": + line: 4 + type: "?" + "expr": + "PHPParser_Node_Expr_New": + line: 3 + type: "object" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + line: 3 + type: "object" + "valueVar": + "PHPParser_Node_Expr_Variable": + line: 3 + type: "?" diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/instanceof_in_boolean_and.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/instanceof_in_boolean_and.ast new file mode 100644 index 0000000..20e24cc --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/instanceof_in_boolean_and.ast @@ -0,0 +1,109 @@ +"JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Interface": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + "namespacedName": + "PHPParser_Node_Name": + type: undefined + 1: + "PHPParser_Node_Stmt_Interface": + type: undefined + children: + "extends": + 0: + "PHPParser_Node_Name_FullyQualified": + type: "object" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + "namespacedName": + "PHPParser_Node_Name": + type: undefined + 2: + "PHPParser_Node_Stmt_Interface": + type: undefined + children: + "extends": + 0: + "PHPParser_Node_Name_FullyQualified": + type: "object" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + "namespacedName": + "PHPParser_Node_Name": + type: undefined + 3: + "PHPParser_Node_Stmt_Function": + type: undefined + children: + "params": + 0: + "PHPParser_Node_Param": + type: "object" + children: + "type": + "PHPParser_Node_Name_FullyQualified": + type: "object" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_If": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Variable": + type: "object" + 1: + "PHPParser_Node_Stmt_Return": + type: "null" + "cond": + "PHPParser_Node_Expr_BooleanAnd": + type: "boolean" + children: + "left": + "PHPParser_Node_Expr_BooleanNot": + type: "boolean" + children: + "expr": + "PHPParser_Node_Expr_Instanceof": + type: "boolean" + children: + "expr": + "PHPParser_Node_Expr_Variable": + type: "object" + "class": + "PHPParser_Node_Name_FullyQualified": + type: "object" + "right": + "PHPParser_Node_Expr_BooleanNot": + type: "boolean" + children: + "expr": + "PHPParser_Node_Expr_Instanceof": + type: "boolean" + children: + "expr": + "PHPParser_Node_Expr_Variable": + type: "object" + "class": + "PHPParser_Node_Name_FullyQualified": + type: "object" + 1: + "PHPParser_Node_Expr_Variable": + type: "object|object" + "namespacedName": + "PHPParser_Node_Name": + type: undefined diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types.ast new file mode 100644 index 0000000..045dbb5 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types.ast @@ -0,0 +1,217 @@ +"JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: -1 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Class": + line: 3 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 3 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_ClassMethod": + line: 5 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 5 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Return": + line: 7 + type: "this" + children: + "expr": + "PHPParser_Node_Expr_New": + line: 7 + type: "this" + children: + "class": + "PHPParser_Node_Name": + line: 7 + type: "this" + 1: + "PHPParser_Node_Stmt_ClassMethod": + line: 10 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 10 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Return": + line: 12 + type: "object" + children: + "expr": + "PHPParser_Node_Expr_New": + line: 12 + type: "object" + children: + "class": + "PHPParser_Node_Name": + line: 12 + type: "object" + 2: + "PHPParser_Node_Stmt_ClassMethod": + line: 15 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 15 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Return": + line: 17 + type: "this" + children: + "expr": + "PHPParser_Node_Expr_Variable": + line: 17 + type: "this" + "namespacedName": + "PHPParser_Node_Name": + line: 3 + type: undefined + 1: + "PHPParser_Node_Stmt_Class": + line: 21 + type: undefined + children: + "extends": + "PHPParser_Node_Name_FullyQualified": + line: 21 + type: "object" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 21 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_ClassMethod": + line: 23 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 23 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Return": + line: 25 + type: "this" + children: + "expr": + "PHPParser_Node_Expr_StaticCall": + line: 25 + type: "this" + children: + "class": + "PHPParser_Node_Name": + line: 25 + type: "object" + "namespacedName": + "PHPParser_Node_Name": + line: 21 + type: undefined + 2: + "PHPParser_Node_Expr_Assign": + line: 29 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 29 + type: "object" + "expr": + "PHPParser_Node_Expr_StaticCall": + line: 29 + type: "object" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + line: 29 + type: "object" + 3: + "PHPParser_Node_Expr_Assign": + line: 30 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 30 + type: "object" + "expr": + "PHPParser_Node_Expr_StaticCall": + line: 30 + type: "object" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + line: 30 + type: "object" + 4: + "PHPParser_Node_Expr_Assign": + line: 32 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 32 + type: "object" + "expr": + "PHPParser_Node_Expr_New": + line: 32 + type: "object" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + line: 32 + type: "object" + 5: + "PHPParser_Node_Expr_Assign": + line: 33 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 33 + type: "object" + "expr": + "PHPParser_Node_Expr_MethodCall": + line: 33 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 33 + type: "object" + 6: + "PHPParser_Node_Expr_Assign": + line: 34 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 34 + type: "object" + "expr": + "PHPParser_Node_Expr_MethodCall": + line: 34 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 34 + type: "object" diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types2.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types2.ast new file mode 100644 index 0000000..cb5f715 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types2.ast @@ -0,0 +1,148 @@ +"JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: -1 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Class": + line: 3 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 3 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_ClassMethod": + line: 5 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 5 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Return": + line: 7 + type: "this" + children: + "expr": + "PHPParser_Node_Expr_Variable": + line: 7 + type: "this" + "namespacedName": + "PHPParser_Node_Name": + line: 3 + type: undefined + 1: + "PHPParser_Node_Stmt_Class": + line: 11 + type: undefined + children: + "extends": + "PHPParser_Node_Name_FullyQualified": + line: 11 + type: "object" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 11 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_ClassMethod": + line: 13 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 13 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Return": + line: 15 + type: "this" + children: + "expr": + "PHPParser_Node_Expr_StaticCall": + line: 15 + type: "this" + children: + "class": + "PHPParser_Node_Name": + line: 15 + type: "object" + "namespacedName": + "PHPParser_Node_Name": + line: 11 + type: undefined + 2: + "PHPParser_Node_Stmt_Class": + line: 19 + type: undefined + children: + "extends": + "PHPParser_Node_Name_FullyQualified": + line: 19 + type: "object" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 19 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_ClassMethod": + line: 21 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 21 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Return": + line: 23 + type: "this" + children: + "expr": + "PHPParser_Node_Expr_StaticCall": + line: 23 + type: "this" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + line: 23 + type: "object" + "namespacedName": + "PHPParser_Node_Name": + line: 19 + type: undefined + 3: + "PHPParser_Node_Expr_Assign": + line: 27 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 27 + type: "object" + "expr": + "PHPParser_Node_Expr_New": + line: 27 + type: "object" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + line: 27 + type: "object" + 4: + "PHPParser_Node_Expr_MethodCall": + line: 28 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 28 + type: "object" diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types3.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types3.ast new file mode 100644 index 0000000..3bdb8c3 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/late_binding_types3.ast @@ -0,0 +1,189 @@ +"JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: -1 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Class": + line: 3 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 3 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_ClassMethod": + line: 5 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 5 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_If": + line: 7 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 7 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Return": + line: 8 + type: "null" + children: + "expr": + "PHPParser_Node_Expr_ConstFetch": + line: 8 + type: "null" + children: + "name": + "PHPParser_Node_Name": + line: 8 + type: undefined + "cond": + "PHPParser_Node_Expr_Variable": + line: 7 + type: undefined + 1: + "PHPParser_Node_Stmt_Return": + line: 11 + type: "this" + children: + "expr": + "PHPParser_Node_Expr_Variable": + line: 11 + type: "this" + "namespacedName": + "PHPParser_Node_Name": + line: 3 + type: undefined + 1: + "PHPParser_Node_Stmt_Class": + line: 15 + type: undefined + children: + "extends": + "PHPParser_Node_Name_FullyQualified": + line: 15 + type: "object" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 15 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_ClassMethod": + line: 17 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 17 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_If": + line: 19 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 19 + type: undefined + children: + 0: + "PHPParser_Node_Expr_Assign": + line: 20 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 20 + type: "object" + "expr": + "PHPParser_Node_Expr_New": + line: 20 + type: "object" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + line: 20 + type: "object" + "cond": + "PHPParser_Node_Expr_Identical": + line: 19 + type: "boolean" + children: + "left": + "PHPParser_Node_Expr_ConstFetch": + line: 19 + type: "null" + children: + "name": + "PHPParser_Node_Name": + line: 19 + type: undefined + "right": + "PHPParser_Node_Expr_Assign": + line: 19 + type: "null|this" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 19 + type: "null|this" + "expr": + "PHPParser_Node_Expr_StaticCall": + line: 19 + type: "null|this" + children: + "class": + "PHPParser_Node_Name": + line: 19 + type: "object" + 1: + "PHPParser_Node_Stmt_Return": + line: 23 + type: "object" + children: + "expr": + "PHPParser_Node_Expr_Variable": + line: 23 + type: "object" + "namespacedName": + "PHPParser_Node_Name": + line: 15 + type: undefined + 2: + "PHPParser_Node_Expr_Assign": + line: 27 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 27 + type: "object" + "expr": + "PHPParser_Node_Expr_New": + line: 27 + type: "object" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + line: 27 + type: "object" + 3: + "PHPParser_Node_Expr_MethodCall": + line: 28 + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + line: 28 + type: "object" diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/preg_replace.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/preg_replace.ast new file mode 100644 index 0000000..b0453e7 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/preg_replace.ast @@ -0,0 +1,152 @@ +"JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Function": + type: "?" + children: + "params": + 0: + "PHPParser_Node_Param": + type: "?" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Assign": + type: "?" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "?" + "expr": + "PHPParser_Node_Expr_FuncCall": + type: "?" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "args": + 0: + "PHPParser_Node_Arg": + type: "string" + children: + "value": + "PHPParser_Node_Scalar_String": + type: "string" + 1: + "PHPParser_Node_Arg": + type: "string" + children: + "value": + "PHPParser_Node_Scalar_String": + type: "string" + 2: + "PHPParser_Node_Arg": + type: "?" + children: + "value": + "PHPParser_Node_Expr_Variable": + type: "?" + 1: + "PHPParser_Node_Stmt_Return": + type: "?" + children: + "expr": + "PHPParser_Node_Expr_Variable": + type: "?" + "namespacedName": + "PHPParser_Node_Name": + type: undefined + 1: + "PHPParser_Node_Expr_Assign": + type: "array" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "array" + "expr": + "PHPParser_Node_Expr_Array": + type: "array" + children: + "items": + 0: + "PHPParser_Node_Expr_ArrayItem": + type: undefined + children: + "value": + "PHPParser_Node_Scalar_String": + type: "string" + 2: + "PHPParser_Node_Expr_Assign": + type: "array" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "array" + "expr": + "PHPParser_Node_Expr_FuncCall": + type: "array" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "args": + 0: + "PHPParser_Node_Arg": + type: "string" + children: + "value": + "PHPParser_Node_Scalar_String": + type: "string" + 1: + "PHPParser_Node_Arg": + type: "string" + children: + "value": + "PHPParser_Node_Scalar_String": + type: "string" + 2: + "PHPParser_Node_Arg": + type: "array" + children: + "value": + "PHPParser_Node_Expr_Variable": + type: "array" + 3: + "PHPParser_Node_Expr_Assign": + type: "string" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "string" + "expr": + "PHPParser_Node_Expr_FuncCall": + type: "string" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "args": + 0: + "PHPParser_Node_Arg": + type: "string" + children: + "value": + "PHPParser_Node_Scalar_String": + type: "string" + 1: + "PHPParser_Node_Arg": + type: "string" + children: + "value": + "PHPParser_Node_Scalar_String": + type: "string" + 2: + "PHPParser_Node_Arg": + type: "string" + children: + "value": + "PHPParser_Node_Scalar_String": + type: "string" diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_property.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_property.ast new file mode 100644 index 0000000..04b6531 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_property.ast @@ -0,0 +1,135 @@ +"PHPParser_Node_Stmt_Class": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Property": + type: undefined + children: + "props": + 0: + "PHPParser_Node_Stmt_PropertyProperty": + type: "null|object" + 1: + "PHPParser_Node_Stmt_ClassMethod": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Assign": + type: "null" + children: + "var": + "PHPParser_Node_Expr_PropertyFetch": + type: "null" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "this" + "expr": + "PHPParser_Node_Expr_ConstFetch": + type: "null" + children: + "name": + "PHPParser_Node_Name": + type: undefined + 1: + "PHPParser_Node_Stmt_If": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Assign": + type: "object" + children: + "var": + "PHPParser_Node_Expr_PropertyFetch": + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "this" + "expr": + "PHPParser_Node_Expr_New": + type: "object" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + type: "object" + "cond": + "PHPParser_Node_Expr_Variable": + type: undefined + 2: + "PHPParser_Node_Stmt_While": + type: undefined + children: + "cond": + "PHPParser_Node_Expr_ConstFetch": + type: "boolean" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_PropertyFetch": + type: "object|null" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "this" + 1: + "PHPParser_Node_Stmt_If": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_PropertyFetch": + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "this" + "cond": + "PHPParser_Node_Expr_NotIdentical": + type: "boolean" + children: + "left": + "PHPParser_Node_Expr_ConstFetch": + type: "null" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "right": + "PHPParser_Node_Expr_PropertyFetch": + type: "object|null" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "this" + 2: + "PHPParser_Node_Expr_PropertyFetch": + type: "object|null" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "this" + "namespacedName": + "PHPParser_Node_Name": + type: undefined diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_property_2.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_property_2.ast new file mode 100644 index 0000000..007d605 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_property_2.ast @@ -0,0 +1,118 @@ +"PHPParser_Node_Stmt_Class": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Property": + type: undefined + children: + "props": + 0: + "PHPParser_Node_Stmt_PropertyProperty": + type: "null|object" + 1: + "PHPParser_Node_Stmt_ClassMethod": + type: undefined + children: + "params": + 0: + "PHPParser_Node_Param": + type: "null|object" + children: + "default": + "PHPParser_Node_Expr_ConstFetch": + type: "null" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "type": + "PHPParser_Node_Name_FullyQualified": + type: "object" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Assign": + type: "null|object" + children: + "var": + "PHPParser_Node_Expr_PropertyFetch": + type: "null|object" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "this" + "expr": + "PHPParser_Node_Expr_Variable": + type: "null|object" + 2: + "PHPParser_Node_Stmt_ClassMethod": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_PropertyFetch": + type: "null|object" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "this" + 1: + "PHPParser_Node_Stmt_While": + type: undefined + children: + "cond": + "PHPParser_Node_Expr_ConstFetch": + type: "boolean" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_If": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_PropertyFetch": + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "this" + "cond": + "PHPParser_Node_Expr_NotIdentical": + type: "boolean" + children: + "left": + "PHPParser_Node_Expr_ConstFetch": + type: "null" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "right": + "PHPParser_Node_Expr_PropertyFetch": + type: "null|object" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "this" + "namespacedName": + "PHPParser_Node_Name": + type: undefined diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_static_property.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_static_property.ast new file mode 100644 index 0000000..0cd0aa0 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_static_property.ast @@ -0,0 +1,226 @@ +"JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: -1 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Class": + line: 3 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 3 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_ClassMethod": + line: 5 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 5 + type: undefined + "namespacedName": + "PHPParser_Node_Name": + line: 3 + type: undefined + 1: + "PHPParser_Node_Stmt_Class": + line: 8 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 8 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_Property": + line: 10 + type: undefined + children: + "props": + 0: + "PHPParser_Node_Stmt_PropertyProperty": + line: 10 + type: "false|object" + 1: + "PHPParser_Node_Stmt_ClassMethod": + line: 12 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 12 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_If": + line: 14 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 14 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_If": + line: 15 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 15 + type: undefined + children: + 0: + "PHPParser_Node_Expr_Assign": + line: 16 + type: "false" + children: + "var": + "PHPParser_Node_Expr_StaticPropertyFetch": + line: 16 + type: "false" + children: + "class": + "PHPParser_Node_Name": + line: 16 + type: "object" + "expr": + "PHPParser_Node_Expr_ConstFetch": + line: 16 + type: "false" + children: + "name": + "PHPParser_Node_Name": + line: 16 + type: undefined + "else": + "PHPParser_Node_Stmt_Else": + line: 17 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 17 + type: undefined + children: + 0: + "PHPParser_Node_Expr_Assign": + line: 18 + type: "object" + children: + "var": + "PHPParser_Node_Expr_StaticPropertyFetch": + line: 18 + type: "object" + children: + "class": + "PHPParser_Node_Name": + line: 18 + type: "object" + "expr": + "PHPParser_Node_Expr_New": + line: 18 + type: "object" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + line: 18 + type: "object" + "cond": + "PHPParser_Node_Expr_BooleanNot": + line: 15 + type: "boolean" + children: + "expr": + "PHPParser_Node_Expr_Variable": + line: 15 + type: undefined + "cond": + "PHPParser_Node_Expr_Identical": + line: 14 + type: "boolean" + children: + "left": + "PHPParser_Node_Expr_ConstFetch": + line: 14 + type: "null" + children: + "name": + "PHPParser_Node_Name": + line: 14 + type: undefined + "right": + "PHPParser_Node_Expr_StaticPropertyFetch": + line: 14 + type: "false|object" + children: + "class": + "PHPParser_Node_Name": + line: 14 + type: "object" + 2: + "PHPParser_Node_Stmt_ClassMethod": + line: 23 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 23 + type: undefined + children: + 0: + "PHPParser_Node_Stmt_If": + line: 25 + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + line: 25 + type: undefined + children: + 0: + "PHPParser_Node_Expr_MethodCall": + line: 26 + type: "null" + children: + "var": + "PHPParser_Node_Expr_StaticPropertyFetch": + line: 26 + type: "object" + children: + "class": + "PHPParser_Node_Name": + line: 26 + type: "object" + "cond": + "PHPParser_Node_Expr_NotIdentical": + line: 25 + type: "boolean" + children: + "left": + "PHPParser_Node_Expr_ConstFetch": + line: 25 + type: "false" + children: + "name": + "PHPParser_Node_Name": + line: 25 + type: undefined + "right": + "PHPParser_Node_Expr_StaticPropertyFetch": + line: 25 + type: "false|object" + children: + "class": + "PHPParser_Node_Name": + line: 25 + type: "object" + "namespacedName": + "PHPParser_Node_Name": + line: 8 + type: undefined diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_variable.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_variable.ast new file mode 100644 index 0000000..e51e0dd --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_variable.ast @@ -0,0 +1,88 @@ +"JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Assign": + type: "null" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "null" + "expr": + "PHPParser_Node_Expr_ConstFetch": + type: "null" + children: + "name": + "PHPParser_Node_Name": + type: undefined + 1: + "PHPParser_Node_Stmt_If": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Assign": + type: "object" + children: + "var": + "PHPParser_Node_Expr_Variable": + type: "object" + "expr": + "PHPParser_Node_Expr_New": + type: "object" + children: + "class": + "PHPParser_Node_Name_FullyQualified": + type: "object" + "cond": + "PHPParser_Node_Expr_Variable": + type: undefined + 2: + "PHPParser_Node_Expr_Variable": + type: "object|null" + 3: + "PHPParser_Node_Stmt_While": + type: undefined + children: + "cond": + "PHPParser_Node_Expr_ConstFetch": + type: "boolean" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_If": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Variable": + type: "object" + "cond": + "PHPParser_Node_Expr_NotIdentical": + type: "boolean" + children: + "left": + "PHPParser_Node_Expr_ConstFetch": + type: "null" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "right": + "PHPParser_Node_Expr_Variable": + type: "object|null" + 1: + "PHPParser_Node_Expr_Variable": + type: "object|null" diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_variable_2.ast b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_variable_2.ast new file mode 100644 index 0000000..eca26a5 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeInference/typed-asts/refined_variable_2.ast @@ -0,0 +1,65 @@ +"PHPParser_Node_Stmt_Function": + type: undefined + children: + "params": + 0: + "PHPParser_Node_Param": + type: "null|object" + children: + "default": + "PHPParser_Node_Expr_ConstFetch": + type: "null" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "type": + "PHPParser_Node_Name_FullyQualified": + type: "object" + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_While": + type: undefined + children: + "cond": + "PHPParser_Node_Expr_ConstFetch": + type: "boolean" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Stmt_If": + type: undefined + children: + "stmts": + "JMS\\PhpManipulator\\PhpParser\\BlockNode": + type: undefined + children: + 0: + "PHPParser_Node_Expr_Variable": + type: "object" + "cond": + "PHPParser_Node_Expr_NotIdentical": + type: "boolean" + children: + "left": + "PHPParser_Node_Expr_ConstFetch": + type: "null" + children: + "name": + "PHPParser_Node_Name": + type: undefined + "right": + "PHPParser_Node_Expr_Variable": + type: "null|object" + "namespacedName": + "PHPParser_Node_Name": + type: undefined diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/class_with_interfaces.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/class_with_interfaces.php new file mode 100644 index 0000000..5be4a6a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/class_with_interfaces.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Foo; + +interface A { + const A = 0; + function a(); +} +interface B extends A { + const B = 0; + function b(); +} +interface C { + const C = 0; + function c(); +} +interface D { + const D = 1; + function d(); +} + +abstract class Bar implements D { + const BAR = 0; + private $bar = 0; + abstract function bar(); +} +abstract class Foo extends Bar implements B, C { + const FOO = 0; + private $foo = 0; + abstract function foo(); +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/doc_comments.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/doc_comments.php new file mode 100644 index 0000000..0dc8fa3 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/doc_comments.php @@ -0,0 +1,36 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace FooBar; + +class Foo +{ + /** + * @param string $foo + * @param Bar $bar + * @param foo $ignored + * + * @return self + */ + public function foo($foo, $bar) { } + + /** + * @param boolean $foo + */ + public function bar($foo) { } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/global_constants.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/global_constants.php new file mode 100644 index 0000000..ec7cd31 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypeScanning/global_constants.php @@ -0,0 +1,4 @@ +foo; +$x->bar = 'bar'; + +$x = new A(); +echo $x->foo; +$x->bar = 'bar'; + +-- COMMENTS -- +Line 8: The property "bar" does not exist. +Line 11: The property "foo" does not exist. +Line 12: The property "bar" does not exist. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__call.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__call.test new file mode 100644 index 0000000..9053add --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__call.test @@ -0,0 +1,36 @@ +foo(); +$a->bar(); + +$b = new B(); +$b->foo(); +$b->bar(); +B::bar(); +B::baz(); + +C::foo(); +C::bar(); + +-- COMMENTS -- +Line 20: The method ``foo`` does not exist on ``object``? Since you implemented ``__call``, maybe consider adding a [@method annotation](http://www.phpdoc.org/docs/latest/for-users/tags/method.html). +Line 24: The method "foo()" does not exist on ``object``? +Line 27: The method ``baz`` does not exist on ``object``? Since you implemented ``__callStatic``, maybe consider adding a [@method annotation](http://www.phpdoc.org/docs/latest/for-users/tags/method.html). +Line 29: The method "foo()" does not exist on ``object``? \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__get.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__get.test new file mode 100644 index 0000000..8c46330 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__get.test @@ -0,0 +1,16 @@ +a; +echo $x->b; + +-- COMMENTS -- +Line 12: The property ``a`` does not exist. Since you implemented ``__get``, maybe consider adding a [@property annotation](http://www.phpdoc.org/docs/latest/for-users/tags/property.html). diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__set.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__set.test new file mode 100644 index 0000000..a8925fc --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/__set.test @@ -0,0 +1,16 @@ +a = 'foo'; +$x->b = 'foo'; + +-- COMMENTS -- +Line 12: The property ``a`` does not exist. Since you implemented ``__set``, maybe consider adding a [@property annotation](http://www.phpdoc.org/docs/latest/for-users/tags/property.html). \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_method.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_method.test new file mode 100644 index 0000000..7ac74d9 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_method.test @@ -0,0 +1,28 @@ +shoudSkipRoute(); + } + + public function testMethodDoesNotExist() + { + $this->foobar(); + } + + public function testCallMethodOnUnknownObject() + { + $a = new Bar(); + $a->foo(); + } +} + +-- COMMENTS -- +Line 11: The method "shoudSkipRoute()" does not exist. Did you maybe mean "shouldSkipRoute()"? +Line 16: The method "foobar()" does not exist on ``object``? diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_property.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_property.test new file mode 100644 index 0000000..03059d4 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_property.test @@ -0,0 +1,22 @@ +exclsionStrategy; + } + + public function testNonExistentProperty() + { + $this->foo; + } +} + +-- COMMENTS -- +Line 11: The property "exclsionStrategy" does not exist. Did you mean "exclusionStrategy"? +Line 16: The property "foo" does not exist. Did you maybe forget to declare it? diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_property_on_interface.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_property_on_interface.test new file mode 100644 index 0000000..d25e0bf --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/missing_property_on_interface.test @@ -0,0 +1,12 @@ +bar; + } +} + +-- COMMENTS -- +Line 7: Accessing "bar" on the interface "Foo" suggest that you code against a concrete implementation. How about adding an ``instanceof`` check? \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/property_inside_isset.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/property_inside_isset.test new file mode 100644 index 0000000..fae9fdd --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/property_inside_isset.test @@ -0,0 +1,11 @@ +foo); +echo $x->foo; +echo $x->foo; // ignored + +-- COMMENTS -- +Line 7: The property "foo" does not exist. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/stdClass.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/stdClass.test new file mode 100644 index 0000000..6f3f77b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/stdClass.test @@ -0,0 +1,15 @@ +foo = 'bar'; +echo $x->foo; + +$x = new A(); +$x->foo = 'bar'; +echo $x->foo; + +-- COMMENTS -- +Line 11: The property "foo" does not exist. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/undeclared_property.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/undeclared_property.test new file mode 100644 index 0000000..15b1193 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/TypoChecks/undeclared_property.test @@ -0,0 +1,17 @@ +foo = $foo; + } + + public function test() + { + echo $this->foo; + } +} + +-- COMMENTS -- +Line 7: The property "foo" does not exist. Did you maybe forget to declare it? diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UnreachableCode/exception_with_include_require.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UnreachableCode/exception_with_include_require.test new file mode 100644 index 0000000..cbce5bc --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UnreachableCode/exception_with_include_require.test @@ -0,0 +1,24 @@ +used(); + } + + private function used() { } + + private function unused() { } +} + +-- COMMENTS -- +Line 11: This method is unused, and could be removed. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/__call_method.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/__call_method.test new file mode 100644 index 0000000..de487b7 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/__call_method.test @@ -0,0 +1,18 @@ +foo(); +$a->foo(new stdClass, 'bar'); +$a->bar('foo', 'bar'); + +-- COMMENTS -- +Line 11: The call to ``foo()`` misses some required arguments starting with ``$foo``. +Line 12: ``new \stdClass()`` of type ``object`` is not a sub-type of ``string``. +Line 13: ``'bar'`` of type ``string`` is not a sub-type of ``array``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/__toString.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/__toString.test new file mode 100644 index 0000000..1d76a89 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/__toString.test @@ -0,0 +1,19 @@ +`` is not a sub-type of ``string``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/array_udiff.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/array_udiff.test new file mode 100644 index 0000000..c795a29 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/array_udiff.test @@ -0,0 +1,12 @@ +bar = $bar ?: new Bar(); + } + + public function foo() + { + return $this->bar->getBar()->getResult(); + } +} + +class Bar +{ + public function getBar() + { + return 'foo'; + } +} + +-- COMMENTS -- +Line 14: The method ``getResult`` cannot be called on ``$this->bar->getBar()`` (of type ``string``). \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/call_method_with_variable_parameters.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/call_method_with_variable_parameters.test new file mode 100644 index 0000000..23e88a9 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/call_method_with_variable_parameters.test @@ -0,0 +1,6 @@ +`` is not a sub-type of ``callable``. diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/foreach_value_by_ref.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/foreach_value_by_ref.test new file mode 100644 index 0000000..38fbb7c --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/foreach_value_by_ref.test @@ -0,0 +1,8 @@ +a = $a; + } + + public function foo() + { + $this->a->foo(); + } +} + +$x = 5; +$x->foo(); + +-- COMMENTS -- +Line 17: The method ``foo`` cannot be called on ``$x`` (of type ``integer``). + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/ignore_unknown_type.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/ignore_unknown_type.test new file mode 100644 index 0000000..645923c --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/ignore_unknown_type.test @@ -0,0 +1,8 @@ +/** + * @jms-builtin + * @return mixed + */ +function returnsUnknown() { } +function test(array $foo) { } + +test(returnsUnknown()); diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/integer_double_parameter_types.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/integer_double_parameter_types.test new file mode 100644 index 0000000..07e6dcb --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/integer_double_parameter_types.test @@ -0,0 +1,25 @@ +iCollection[] = $i; + } +} + +$config = new Config(); +$config->addI(new C()); // this is fine. +$config->addI(new D()); + +-- COMMENTS -- +Line 19: ``new \D()`` of type ``object`` is not a sub-type of ``object``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/invalid_type_arg.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/invalid_type_arg.test new file mode 100644 index 0000000..a1a7f3b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/invalid_type_arg.test @@ -0,0 +1,22 @@ +foo( + 'bar', + new Bar(), + 1); + +-- COMMENTS -- +Line 15: ``'bar'`` of type ``string`` is not a sub-type of ``object``. +Line 16: ``new \Bar()`` of type ``object`` is not a sub-type of ``string``. +Line 17: ``1`` of type ``integer`` is not a sub-type of ``boolean``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/missing_parameter.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/missing_parameter.test new file mode 100644 index 0000000..38a1f77 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/missing_parameter.test @@ -0,0 +1,26 @@ +foo('a', 'b'); + $foo->foo(new SubBar()); +} + +-- COMMENTS -- +Line 20: ``'a'`` of type ``string`` is not a sub-type of ``object``. +Line 21: The call to ``foo()`` misses a required argument ``$baz``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/missing_parameters.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/missing_parameters.test new file mode 100644 index 0000000..e4b1192 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/missing_parameters.test @@ -0,0 +1,8 @@ +assertEquals(array('foo'), array('bar')); + $this->assertEquals(); + $this->getMock(true); + } +} + +-- COMMENTS -- +Line 23: The call to ``assertEquals()`` misses some required arguments starting with ``$a``. +Line 24: ``true`` of type ``boolean`` is not a sub-type of ``string``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/subtype_check_ignores_all_type.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/subtype_check_ignores_all_type.test new file mode 100644 index 0000000..56dc707 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UsageContext/subtype_check_ignores_all_type.test @@ -0,0 +1,18 @@ + no comments expected. +foo(new C()); + +-- CONFIG -- +return array('check_usage_context' => array( + 'argument_type_checks' => 'strict', +)); + +-- COMMENTS -- +Line 9: ``new \C()`` of type ``object`` is not a sub-type of ``object``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/all_use_statement_removed.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/all_use_statement_removed.test new file mode 100644 index 0000000..223f91a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/all_use_statement_removed.test @@ -0,0 +1,18 @@ +-- BEFORE -- +nodeMapping['array'] = 'Scrutinizer\PhpAnalyzer\Config\ArrayNodeDefinition'; + } +} + +-- AFTER -- +nodeMapping['array'] = 'Scrutinizer\PhpAnalyzer\Config\ArrayNodeDefinition'; + } +} + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/multiple_groups_simplified.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/multiple_groups_simplified.test new file mode 100644 index 0000000..35b84be --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/multiple_groups_simplified.test @@ -0,0 +1,21 @@ +-- BEFORE -- + array( + 'remove_unused' => false, +)); \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserve_indentation.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserve_indentation.test new file mode 100644 index 0000000..08641f9 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserve_indentation.test @@ -0,0 +1,22 @@ +-- BEFORE -- + array( + 'remove_unused' => false, + 'preserve_multiple' => true, + 'order_alphabetically' => true, +)); \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserve_only_multiple.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserve_only_multiple.test new file mode 100644 index 0000000..f433cc1 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserve_only_multiple.test @@ -0,0 +1,26 @@ +-- BEFORE -- + array( + 'remove_unused' => false, + 'preserve_multiple' => true, + 'order_alphabetically' => true, +)); \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserving_multiple.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserving_multiple.test new file mode 100644 index 0000000..f7c169e --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/preserving_multiple.test @@ -0,0 +1,23 @@ +-- BEFORE -- + array( + 'remove_unused' => false, + 'preserve_multiple' => true, +)); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/remove_unused.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/remove_unused.test new file mode 100644 index 0000000..c47f2e3 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/remove_unused.test @@ -0,0 +1,40 @@ +-- BEFORE -- + array( + 'remove_unused' => false, + 'order_alphabetically' => true, +)); + +-- END -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/split_multiple.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/split_multiple.test new file mode 100644 index 0000000..fc3e182 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/split_multiple.test @@ -0,0 +1,23 @@ +-- BEFORE -- + array( + 'remove_unused' => false, + 'order_alphabetically' => true, +)); diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/use_with_comment.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/use_with_comment.test new file mode 100644 index 0000000..242796c --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/UseStatementFixes/use_with_comment.test @@ -0,0 +1,16 @@ +-- BEFORE -- + + */ +abstract class AbstractCollectionPersister +{ + /** + * Initializes a new instance of a class derived from AbstractCollectionPersister. + * + * @param \Doctrine\ORM\EntityManager $em + */ + public function __construct(EntityManager $em) + { + } + + /** + * Deletes the persistent state represented by the given collection. + * + * @param PersistentCollection $coll + */ + public function delete(PersistentCollection $coll) + { + } +} + +-- CONFIG -- +return array( + 'verify_php_doc_comments' => array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/ask_for_additional_annotations.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/ask_for_additional_annotations.test new file mode 100644 index 0000000..aa96a1f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/ask_for_additional_annotations.test @@ -0,0 +1,45 @@ + array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 3: Please add a ``@param`` annotation for parameter ``$foo`` which defines the array type; using ``array``, or ``SomeType[]``. +Line 5: Please add a ``@param`` annotation for parameter ``$bar`` which defines a more specific range of types; something like ``string|array``, or ``null|MyObject``. +Line 7: Please add a ``@return`` annotation. +Line 16: Please add a ``@param`` annotation for parameter ``$foo`` which defines the array type; using ``array``, or ``SomeType[]``. +Line 18: Please add a ``@param`` annotation for parameter ``$bar`` which defines a more specific range of types; something like ``string|array``, or ``null|MyObject``. +Line 20: Please add a ``@return`` annotation. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/ask_for_additional_array_type_in_union.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/ask_for_additional_array_type_in_union.test new file mode 100644 index 0000000..1e318c8 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/ask_for_additional_array_type_in_union.test @@ -0,0 +1,21 @@ + array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 3: Please add a ``@param`` annotation for parameter ``$foo`` which defines the array type; using ``array``, or ``SomeType[]``. +Line 6: Please add a ``@param`` annotation for parameter ``$foo`` which defines the array type; using ``array``, or ``SomeType[]``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/more_specific_array_in_union.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/more_specific_array_in_union.test new file mode 100644 index 0000000..f6c0803 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/more_specific_array_in_union.test @@ -0,0 +1,27 @@ + array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 4: Should the type for parameter ``$foo`` not be ``null|array``? Also, consider making the array more specific, something like ``array``, or ``String[]``. +Line 10: Should the type for parameter ``$foo`` not be ``null|array``? Also, consider making the array more specific, something like ``array``, or ``String[]``. \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/more_specific_type.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/more_specific_type.test new file mode 100644 index 0000000..effb07a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/more_specific_type.test @@ -0,0 +1,71 @@ + array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 4: Please define the element type for the array of parameter ``$foo`` (using ``array``, or ``SomeType[]``). +Line 9: Please define a more specific type for parameter ``$bar``; consider using a union like ``null|Object``, or ``string|array``. +Line 14: Please define a more specific return type; maybe using a union like ``null|Object``, or ``string|array``. +Line 21: Please define the element type for the returned array (using ``array``, or ``SomeType[]``). +Line 29: Please define the element type for the array of parameter ``$foo`` (using ``array``, or ``SomeType[]``). +Line 34: Please define a more specific type for parameter ``$bar``; consider using a union like ``null|Object``, or ``string|array``. +Line 39: Please define a more specific return type; maybe using a union like ``null|Object``, or ``string|array``. +Line 46: Please define the element type for the returned array (using ``array``, or ``SomeType[]``). \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/param_type_mismatch.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/param_type_mismatch.test new file mode 100644 index 0000000..b677e57 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/param_type_mismatch.test @@ -0,0 +1,28 @@ + array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 4: Should the type for parameter ``$foo`` not be ``string``? diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/regr_abstract_query.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/regr_abstract_query.test new file mode 100644 index 0000000..b3c4525 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/regr_abstract_query.test @@ -0,0 +1,66 @@ +. + */ + +namespace Doctrine\ORM; + +use Doctrine\DBAL\Types\Type, + Doctrine\ORM\Query\QueryException, + Doctrine\DBAL\Cache\QueryCacheProfile; + +/** + * Base contract for ORM queries. Base class for Query and NativeQuery. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Konsta Vesterinen + */ +abstract class AbstractQuery +{ + /** + * Sets the ResultSetMapping that should be used for hydration. + * + * @param ResultSetMapping $rsm + * @return \Doctrine\ORM\AbstractQuery + */ + public function setResultSetMapping(Query\ResultSetMapping $rsm) + { + $this->_resultSetMapping = $rsm; + + return $this; + } +} + +-- CONFIG -- +return array( + 'verify_php_doc_comments' => array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 44: Should the type for parameter ``$rsm`` not be ``Query\ResultSetMapping``? diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/regr_paginator.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/regr_paginator.test new file mode 100644 index 0000000..cbcbf13 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/regr_paginator.test @@ -0,0 +1,246 @@ +. + */ + +namespace Doctrine\ORM\Tools\Pagination; + +use Doctrine\ORM\QueryBuilder, + Doctrine\ORM\Query, + Doctrine\ORM\Query\ResultSetMapping, + Doctrine\ORM\NoResultException; + +/** + * Paginator + * + * The paginator can handle various complex scenarios with DQL. + * + * @author Pablo Díez + * @author Benjamin Eberlei + * @license New BSD + */ +class Paginator implements \Countable, \IteratorAggregate +{ + /** + * @var Query + */ + private $query; + + /** + * @var bool + */ + private $fetchJoinCollection; + + /** + * @var bool|null + */ + private $useOutputWalkers; + + /** + * @var int + */ + private $count; + + /** + * Constructor. + * + * @param Query|QueryBuilder $query A Doctrine ORM query or query builder. + * @param boolean $fetchJoinCollection Whether the query joins a collection (true by default). + */ + public function __construct($query, $fetchJoinCollection = true) + { + if ($query instanceof QueryBuilder) { + $query = $query->getQuery(); + } + + $this->query = $query; + $this->fetchJoinCollection = (boolean) $fetchJoinCollection; + } + + /** + * Returns the query + * + * @return Query + */ + public function getQuery() + { + return $this->query; + } + + /** + * Returns whether the query joins a collection. + * + * @return boolean Whether the query joins a collection. + */ + public function getFetchJoinCollection() + { + return $this->fetchJoinCollection; + } + + /** + * Returns whether the paginator will use an output walker + * + * @return bool|null + */ + public function getUseOutputWalkers() + { + return $this->useOutputWalkers; + } + + /** + * Set whether the paginator will use an output walker + * + * @param bool|null $useOutputWalkers + * @return $this + */ + public function setUseOutputWalkers($useOutputWalkers) + { + $this->useOutputWalkers = $useOutputWalkers; + return $this; + } + + /** + * {@inheritdoc} + */ + public function count() + { + if ($this->count === null) { + /* @var $countQuery Query */ + $countQuery = $this->cloneQuery($this->query); + + if ( ! $countQuery->getHint(CountWalker::HINT_DISTINCT)) { + $countQuery->setHint(CountWalker::HINT_DISTINCT, true); + } + + if ($this->useOutputWalker($countQuery)) { + $rsm = new ResultSetMapping(); + $rsm->addScalarResult('_dctrn_count', 'count'); + + $countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Tools\Pagination\CountOutputWalker'); + $countQuery->setResultSetMapping($rsm); + } else { + $countQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Doctrine\ORM\Tools\Pagination\CountWalker')); + } + + $countQuery->setFirstResult(null)->setMaxResults(null); + + try { + $data = $countQuery->getScalarResult(); + $data = array_map('current', $data); + $this->count = array_sum($data); + } catch(NoResultException $e) { + $this->count = 0; + } + } + return $this->count; + } + + /** + * {@inheritdoc} + */ + public function getIterator() + { + $offset = $this->query->getFirstResult(); + $length = $this->query->getMaxResults(); + + if ($this->fetchJoinCollection) { + $subQuery = $this->cloneQuery($this->query); + + if ($this->useOutputWalker($subQuery)) { + $subQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Tools\Pagination\LimitSubqueryOutputWalker'); + } else { + $subQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Doctrine\ORM\Tools\Pagination\LimitSubqueryWalker')); + } + + $subQuery->setFirstResult($offset)->setMaxResults($length); + + $ids = array_map('current', $subQuery->getScalarResult()); + + $whereInQuery = $this->cloneQuery($this->query); + // don't do this for an empty id array + if (count($ids) > 0) { + $namespace = WhereInWalker::PAGINATOR_ID_ALIAS; + + $whereInQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Doctrine\ORM\Tools\Pagination\WhereInWalker')); + $whereInQuery->setHint(WhereInWalker::HINT_PAGINATOR_ID_COUNT, count($ids)); + $whereInQuery->setFirstResult(null)->setMaxResults(null); + foreach ($ids as $i => $id) { + $i++; + $whereInQuery->setParameter("{$namespace}_{$i}", $id); + } + } + + $result = $whereInQuery->getResult($this->query->getHydrationMode()); + } else { + $result = $this->cloneQuery($this->query) + ->setMaxResults($length) + ->setFirstResult($offset) + ->getResult($this->query->getHydrationMode()) + ; + } + return new \ArrayIterator($result); + } + + /** + * Clones a query. + * + * @param Query $query The query. + * + * @return Query The cloned query. + */ + private function cloneQuery(Query $query) + { + /* @var $cloneQuery Query */ + $cloneQuery = clone $query; + $cloneQuery->setParameters($query->getParameters()); + foreach ($query->getHints() as $name => $value) { + $cloneQuery->setHint($name, $value); + } + + return $cloneQuery; + } + + /** + * Determine whether to use an output walker for the query + * + * @param Query $query The query. + * + * @return bool + */ + private function useOutputWalker(Query $query) + { + if ($this->useOutputWalkers === null) { + return (boolean) $query->getHint(Query::HINT_CUSTOM_OUTPUT_WALKER) == false; + } + + return $this->useOutputWalkers; + } +} + +-- CONFIG -- +return array( + 'verify_php_doc_comments' => array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 119: Please add a ``@return`` annotation. + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/return_type_mismatch.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/return_type_mismatch.test new file mode 100644 index 0000000..ea588cd --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/return_type_mismatch.test @@ -0,0 +1,21 @@ + array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 4: Should the return type not be ``string``? diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/shortest_imports.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/shortest_imports.test new file mode 100644 index 0000000..662b98c --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/shortest_imports.test @@ -0,0 +1,31 @@ + array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 15: Should the type for parameter ``$foo`` not be ``FooBar``? diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/type_from_comment.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/type_from_comment.test new file mode 100644 index 0000000..d67b83b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/type_from_comment.test @@ -0,0 +1,24 @@ + array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/unprecise_param_type.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/unprecise_param_type.test new file mode 100644 index 0000000..4e9f032 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/unprecise_param_type.test @@ -0,0 +1,22 @@ + array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 6: Should the type for parameter ``$foo`` not be ``null|array``? diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/unprecise_return_type.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/unprecise_return_type.test new file mode 100644 index 0000000..11a53bb --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/VerifyDocComments/unprecise_return_type.test @@ -0,0 +1,19 @@ + array( + 'enabled' => true, + 'suggest_more_specific_types' => true, + 'ask_for_return_if_not_inferrable' => true, + 'ask_for_param_type_annotation' => true, + ), +); + +-- COMMENTS -- +Line 3: Should the return type not be ``string|null``? diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/scalar_values.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/scalar_values.php new file mode 100644 index 0000000..30d118d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/scalar_values.php @@ -0,0 +1,7 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Util\TestUtils; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseReviewingPassTest; + +/** + * @group passes + * + * @author Johannes + */ +class IntegrationTest extends BaseReviewingPassTest +{ + protected function getPassConfig() + { + return new PassConfig(); + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/Integration'; + } + + protected function getAnalyzer() + { + return Analyzer::create(TestUtils::createTestEntityManager(), $this->getPassConfig()); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/LoopsMustUseBracesPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/LoopsMustUseBracesPassTest.php new file mode 100644 index 0000000..062dbf8 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/LoopsMustUseBracesPassTest.php @@ -0,0 +1,35 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\LoopsMustUseBracesPass; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseReviewingPassTest; + +class LoopsMustUseBracesPassTest extends BaseReviewingPassTest +{ + protected function getPasses() + { + return array(new LoopsMustUseBracesPass()); + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/LoopsMustUseBraces/'; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/PhpunitAssertionsPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/PhpunitAssertionsPassTest.php new file mode 100644 index 0000000..0d94008 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/PhpunitAssertionsPassTest.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\PhpunitAssertionsPass; + +class PhpunitAssertionsPassTest extends BaseReviewingPassTest +{ + protected function getTestDir() + { + return __DIR__.'/Fixture/PhpunitAssertions/'; + } + + protected function getPassConfig() + { + $config = PassConfig::createForTypeScanning(); + $config->addPass(new PhpunitAssertionsPass()); + + return $config; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/PrecedenceChecksPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/PrecedenceChecksPassTest.php new file mode 100644 index 0000000..8d3c254 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/PrecedenceChecksPassTest.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\PrecedenceChecksPass; + +class PrecedenceChecksPassTest extends BaseReviewingPassTest +{ + protected function getTestDir() + { + return __DIR__.'/Fixture/PrecedenceChecks'; + } + + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new PrecedenceChecksPass(); + + return $passes; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReflectionFixerPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReflectionFixerPassTest.php new file mode 100644 index 0000000..259f81d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReflectionFixerPassTest.php @@ -0,0 +1,35 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +class ReflectionFixerPassTest extends BaseFixingPassTest +{ + protected function getPasses() + { + $passes = \Scrutinizer\PhpAnalyzer\PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new \Scrutinizer\PhpAnalyzer\Pass\ReflectionFixerPass(); + + return $passes; + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/ReflectionFixer'; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReflectionUsageCheckPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReflectionUsageCheckPassTest.php new file mode 100644 index 0000000..d14c03b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReflectionUsageCheckPassTest.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\ReflectionUsageCheckPass; + +class ReflectionUsageCheckPassTest extends BaseReviewingPassTest +{ + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new ReflectionUsageCheckPass(); + + return $passes; + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/ReflectionUsage/'; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReturnTypeScanningPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReturnTypeScanningPassTest.php new file mode 100644 index 0000000..009c7eb --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/ReturnTypeScanningPassTest.php @@ -0,0 +1,98 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\ReturnTypeScanningPass; +use Scrutinizer\PhpAnalyzer\Pass\TypeInferencePass; +use Scrutinizer\PhpAnalyzer\Pass\TypeScanningPass; +use Scrutinizer\PhpAnalyzer\Pass\RepeatedPass; + +class ReturnTypeScanningPassTest extends BaseAnalyzingPassTest +{ + public function testSimpleReturnType() + { + $this->analyzeAst('ReturnType/simple_return_type.php'); + + $function = $this->registry->getFunction('foo'); + $this->assertEquals('string', (string) $function->getReturnType()); + } + + public function testImplicitReturn() + { + $this->analyzeAst('ReturnType/implicit_return.php'); + + $function = $this->registry->getFunction('foo'); + $this->assertEquals('null', (string) $function->getReturnType()); + } + + public function testCompositeReturn() + { + $this->analyzeAst('ReturnType/composite_return_type.php'); + + $method = $this->registry->getClass('Foo')->getMethod('foo'); + $this->assertEquals('string|false|null', (string) $method->getReturnType()); + } + + public function testUnknownReturnType() + { + $this->analyzeAst('ReturnType/unknown_return_type.php'); + + $function = $this->registry->getFunction('foo'); + $this->assertEquals('', (string) $function->getReturnType()); + $this->assertNull($function->getReturnType()); + } + + public function testReturnTypeOfInterfaceMethod() + { + $this->analyzeAst('ReturnType/interfaces.php'); + + $method = $this->registry->getClass('Test')->getMethod('getFoo'); + $this->assertEquals('', (string) $method->getReturnType()); + $this->assertNull($method->getReturnType()); + } + + public function testReturnTypeOfBuiltinFunction() + { + $this->analyzeAst('ReturnType/builtin_function.php'); + + $function = $this->registry->getFunction('ignored_return_type'); + $this->assertEquals('', (string) $function->getReturnType()); + $this->assertNull($function->getReturnType()); + } + + public function testReturnTypeOfBuiltinMethod() + { + $this->analyzeAst('ReturnType/builtin_method.php'); + + $method = $this->registry->getClass('Foo')->getMethod('foo'); + $this->assertEquals('', (string) $method->getReturnType()); + $this->assertNull($method->getReturnType()); + } + + protected function getPasses() + { + return array( + new TypeScanningPass(), + new RepeatedPass(array( + new TypeInferencePass(), + new ReturnTypeScanningPass(), + )), + ); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/SimplifyBooleanReturnPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/SimplifyBooleanReturnPassTest.php new file mode 100644 index 0000000..2a17f9d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/SimplifyBooleanReturnPassTest.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\SimplifyBooleanReturnPass; + +class SimplifyBooleanReturnPassTest extends BaseReviewingPassTest +{ + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new SimplifyBooleanReturnPass(); + + return $passes; + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/SimplifyBooleanReturn'; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/SuspiciousCodePassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/SuspiciousCodePassTest.php new file mode 100644 index 0000000..e1c077f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/SuspiciousCodePassTest.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\SuspiciousCodePass; + +class SuspiciousCodePassTest extends BaseReviewingPassTest +{ + protected function getTestDir() + { + return __DIR__.'/Fixture/SuspiciousCode/'; + } + + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new SuspiciousCodePass(); + + return $passes; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/TypeInferencePassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/TypeInferencePassTest.php new file mode 100644 index 0000000..d9f2ab6 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/TypeInferencePassTest.php @@ -0,0 +1,502 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Model\GlobalFunction; +use Scrutinizer\PhpAnalyzer\Util\TestUtils; +use Symfony\Component\Finder\Finder; +use Symfony\Component\Finder\SplFileInfo; + +class TypeInferencePassTest extends BaseAnalyzingPassTest +{ + /** + * @dataProvider getPropertyTests + */ + public function testProperties($name) + { + $ast = $this->analyzeAst('TypeInference/'.$name.'.php'); + + $nodes = \PHPParser_Finder::create($ast)->find('Expr_PropertyFetch[name=foo]'); + $this->assertSame(2, count($nodes), 'There are 4 accesses to the "foo" property.'); + + $expectedType = $this->registry->getClass('Foo'); + foreach ($nodes as $node) { + $this->assertTrue($expectedType->equals($actualType = $node->getAttribute('type')), 'Expected type "'.$expectedType.'", but got "'.$actualType.'" for property access on line '.$node->getLine().'.'); + } + + $nodes = \PHPParser_Finder::create($ast)->find('Stmt_PropertyProperty[name=foo]'); + $this->assertSame(1, count($nodes), 'There are two properties named "foo".'); + foreach ($nodes as $node) { + $this->assertTrue($expectedType->equals($actualType = $node->getAttribute('type')), 'Expected type "'.$expectedType.'", but got "'.$actualType.'" for property declartion on line '.$node->getLine().'.'); + } + } + + public function testSelf() + { + $this->analyzeAst('TypeInference/static_and_self.php'); + $class = $this->registry->getClass('Foo'); + + $createSelf = $class->getMethod('createSelf'); + $this->assertTrue($class->equals($createSelf->getReturnType()), sprintf('Expected return type "%s", but got "%s" instead.', $class, $createSelf->getReturnType())); + } + + public function testStatic() + { + $this->analyzeAst('TypeInference/static_and_self.php'); + $class = $this->registry->getClass('Foo'); + + $createSelf = $class->getMethod('createStatic'); + $this->assertTrue($class->equals($createSelf->getReturnType()), sprintf('Expected return type "%s", but got "%s" instead.', $class, $createSelf->getReturnType())); + } + + /** + * @group refined + * @group refinedProperty + */ + public function testRefinedProperty() + { + $ast = $this->analyzeAst('TypeInference/refined_property.php'); + $this->assertTypedAst($ast, 'refined_property'); + } + + /** + * @group refined + * @group refinedProperty + * @group refinedProperty2 + */ + public function testRefinedProperty2() + { + $ast = $this->analyzeAst('TypeInference/refined_property_2.php'); + $this->assertTypedAst($ast, 'refined_property_2'); + } + + /** + * @group refined + * @group refinedStaticProperty + */ + public function testRefinedStaticProperty() + { + $ast = $this->analyzeAst('TypeInference/refined_static_property.php'); + $this->assertTypedAst($ast, 'refined_static_property', true); + } + + /** + * @group refined + * @group refinedVariable + */ + public function testRefinedVariable() + { + $ast = $this->analyzeAst('TypeInference/refined_variable.php'); + $this->assertTypedAst($ast, 'refined_variable'); + } + + /** + * @group refinedVariable2 + */ + public function testRefinedVariable2() + { + $ast = $this->analyzeAst('TypeInference/refined_variable_2.php'); + $this->assertTypedAst($ast, 'refined_variable_2'); + } + + /** + * @group instanceOf + */ + public function testInstanceOfInBooleanAnd() + { + $ast = $this->analyzeAst('TypeInference/instanceof_in_boolean_and.php'); + $this->assertTypedAst($ast, 'instanceof_in_boolean_and'); + } + + public function getPropertyTests() + { + return array(array('properties'), array('constructor_injection')); + } + + public function testTypeInferenceDoesNotGoIntoInfiniteLoop() + { + $this->analyzeAst('TypeInference/infinite_loop.php'); + } + + public function testGlobalConstants() + { + $this->analyzeAst('TypeInference/global_constants.php'); + + $constants = $this->registry->getConstants(); + $this->assertEquals(3, count($constants)); + + $this->assertTrue(isset($constants['foo']), '"foo" constant exists.'); + $this->assertNotNull($type = $constants['foo']->getPhpType(), 'PhpType is not null.'); + $this->assertTrue($type->equals($this->registry->getNativeType('string')), '"'.$type.'" is a string.'); + + $this->assertTrue(isset($constants['bar'])); + $this->assertNotNull($type = $constants['bar']->getPhpType()); + $this->assertTrue($type->equals($this->registry->getNativeType('integer'))); + + $this->assertTrue(isset($constants['baz'])); + $this->assertNotNull($type = $constants['baz']->getPhpType()); + $this->assertTrue($type->equals($this->registry->getNativeType('double'))); + } + + /** + * @group arrayPop + */ + public function testArrayPop() + { + $this->registry->registerFunction($arrayPop = new GlobalFunction('array_pop')); + $arrayPop->setReturnType($this->registry->getNativeType('all')); + + $ast = $this->analyzeAst('TypeInference/array_pop.php'); + $this->assertTypedAst($ast, 'array_pop'); + } + + /** + * @group foo + */ + public function testFoo() + { + $this->analyzeAst('TypeInference/foo.php'); + } + + public function testInheritedDocComment() + { + $this->analyzeAst('TypeInference/inherited_doc_comment.php'); + + $d = $this->registry->getClass('D'); + $toString = function($param) { + return (string) $param->getPhpType(); + }; + + $a = $d->getMethod('a'); + $this->assertEquals('boolean', (string) $a->getReturnType()); + $this->assertEquals(array('string', 'integer'), array_map($toString, $a->getParameters()->getValues())); + + $c = $d->getMethod('c'); + $this->assertEquals('string', (string) $c->getReturnType()); + $this->assertEquals(array('string'), array_map($toString, $c->getParameters()->getValues())); + + $d = $d->getMethod('d'); + $this->assertEquals('?', (string) $d->getReturnType()); + } + + /** + * @group definingExpr + */ + public function testDefiningExprIsCheckedForVariables() + { + $this->registry->registerFunction($function = new GlobalFunction('is_array')); + $function->setReturnType($this->registry->getNativeType('boolean')); + + $ast = $this->analyzeAst('TypeInference/defining_expr_for_variable.php'); + $this->assertTypedAst($ast, 'defining_expr_for_variable'); + } + + /** + * @group constant + */ + public function testConstantAsDefault() + { + $ast = $this->analyzeAst('TypeInference/constant_as_default.php'); + $this->assertTypedAst($ast, 'constant_as_default'); + } + + /** + * @group pcre + */ + public function testPregReplace() + { + $ast = $this->analyzeAst('TypeInference/preg_replace.php'); + $this->assertTypedAst($ast, 'preg_replace'); + } + + /** + * @group late-binding + */ + public function testLateBinding() + { + $ast = $this->analyzeAst('TypeInference/late_binding_types.php'); + $this->assertTypedAst($ast, 'late_binding_types', true); + } + + /** + * @group late-binding + */ + public function testLateBinding2() + { + $ast = $this->analyzeAst('TypeInference/late_binding_types2.php'); + $this->assertTypedAst($ast, 'late_binding_types2', true); + } + + /** + * @group late-binding + */ + public function testLateBinding3() + { + $ast = $this->analyzeAst('TypeInference/late_binding_types3.php'); + $this->assertTypedAst($ast, 'late_binding_types3', true); + } + + /** + * @group foreach + */ + public function testForeachWithObject() + { + $ast = $this->analyzeAst('TypeInference/foreach_with_object.php'); + $this->assertTypedAst($ast, 'foreach_with_object', true); + } + + /** + * @dataProvider getAnnotatedFiles + * @group annotation-code + */ + public function testAnnotationCode($file) + { + $ast = $this->analyzeAst('TypeInference/annotated-code/'.$file); + $this->assertAnnotatedAst($ast); + } + + public function getAnnotatedFiles() + { + $tests = array(); + + foreach (Finder::create()->in(__DIR__.'/Fixture/TypeInference/annotated-code/')->name('*.php')->files() as $file) { + assert($file instanceof SplFileInfo); + $tests[] = array($file->getRelativePathname()); + } + + return $tests; + } + + /** + * @group deadlock2 + */ + public function testDeadLock() + { + $this->analyzeAst('TypeInference/deadlock_test.php'); + } + + /** + * @group deadlock3 + */ + public function testDeadLock3() + { + $this->analyzeAst('TypeInference/run_test.php'); + } + + /** + * @group deadlock4 + */ + public function testDeadLock4() + { + $this->analyzeAst('TypeInference/run_test2.php'); + } + + protected function getAnalyzer() + { + return Analyzer::create(TestUtils::createTestEntityManager(), PassConfig::createForTypeScanning()); + } + + private function assertAnnotatedAst(array $ast) + { + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor($visitor = new AssertingVisitor($this)); + $traverser->traverse($ast); + } + + private function assertTypedAst(array $ast, $filename, $withLines = false) + { + if ( ! is_file($astFile = __DIR__.'/Fixture/TypeInference/typed-asts/'.$filename.'.ast')) { + throw new \InvalidArgumentException(sprintf('Could not find file "%s".', $filename)); + } + + $this->assertEquals(self::dumpAst($ast[0], $withLines), file_get_contents($astFile)); + } + + private function assertType($expectedType, $actualType) + { + $expectedType = $this->registry->resolveType($expectedType); + $actualType = $this->registry->resolveType($actualType); + + $this->assertTrue($expectedType->equals($actualType), sprintf('Failed to assert that actual type "%s" equals expected type "%s".', $actualType, $expectedType)); + } + + /** + * Dumps only the information of the AST that is relevant for determining + * that all types are fine. + * + * @param \PHPParser_Node $node + * @param boolean $withLines + * @param integer $level + * @return string + */ + private static function dumpAst(\PHPParser_Node $node, $withLines = false, $level = 0) + { + $output = ''; + $writeln = function($line, &$buffer = null) use ($level, &$output) { + if (null === $buffer) { + $buffer =& $output; + } + + $buffer .= str_repeat(' ', $level * 4).$line."\n"; + }; + + $writeln(json_encode(get_class($node)).':'); + + if ($withLines) { + $writeln(' line: '.$node->getLine()); + } + + $attrs = $node->getAttributes(); + if (!array_key_exists('type', $attrs)) { + $writeln(' type: undefined'); + } else if (null === $attrs['type']) { + $writeln(' type: null'); + } else { + $writeln(' type: '.json_encode((string) $attrs['type'])); + } + + $childrenContent = ''; + foreach ($node as $name => $subNode) { + if ($subNode instanceof \PHPParser_Node) { + $writeln(' '.json_encode($name).':', $childrenContent); + $childrenContent .= self::dumpAst($subNode, $withLines, $level + 3); + } else if (is_array($subNode)) { + $childContent = ''; + foreach ($subNode as $k => $aSubNode) { + if ($aSubNode instanceof \PHPParser_Node) { + $writeln(' '.json_encode($k).':', $childContent); + $childContent .= self::dumpAst($aSubNode, $withLines, $level + 4); + } + } + + if (!empty($childContent)) { + $writeln(' '.json_encode($name).':', $childrenContent); + $childrenContent .= $childContent; + } + + } + } + + if (!empty($childrenContent)) { + $writeln(' children:'); + $output .= $childrenContent; + } + + return $output; + } + + public function getRegistry() + { + return $this->registry; + } +} + +class AssertingVisitor extends \PHPParser_NodeVisitorAbstract +{ + private $assertions; + private $curAssertions = 0; + private $testCase; + private $registry; + + public function __construct(TypeInferencePassTest $testCase) + { + $this->testCase = $testCase; + $this->registry = $testCase->getRegistry(); + $this->assertions = new \SplStack(); + } + + public function enterNode(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Stmt_Function: + case $node instanceof \PHPParser_Node_Stmt_ClassMethod: + $this->assertions->push($this->curAssertions); + $this->curAssertions = 0; + break; + + case $node instanceof \PHPParser_Node_Expr_FuncCall: + if ((null !== $comment = $node->getDocComment()) && preg_match('#@type ([^\s]+)#', $comment, $match)) { + $this->verifyType( + $this->registry->resolveType($match[1]), + $this->registry->getCalledFunctionByNode($node)->getReturnType(), + $node->getLine() + ); + } + break; + + case $node instanceof \PHPParser_Node_Expr_ArrayDimFetch: + case $node instanceof \PHPParser_Node_Expr_PropertyFetch: + case $node instanceof \PHPParser_Node_Expr_StaticPropertyFetch: + case $node instanceof \PHPParser_Node_Expr_Variable: + if (null !== $comment = $node->getDocComment()) { + // For some reason, doc comments are inherited for DimFetches. A behavior + // that we do not want in this case. + if ($node->getAttribute('parent') instanceof \PHPParser_Node_Expr_ArrayDimFetch + && $comment === $node->getAttribute('parent')->getDocComment()) { + break; + } + + if (preg_match('#@type ([^\s]+)#', $comment, $match)) { + $this->verifyType( + $this->registry->resolveType($match[1]), + $node->getAttribute('type'), + $node->getLine() + ); + } + + if (false !== strpos($comment, '@no-type')) { + $this->curAssertions += 1; + // We cannot use assertNull here because in case of an error, PHPUnit takes endlessly to dump + // whatever was passed as first argument. + $this->testCase->assertTrue(null === $node->getAttribute('type'), sprintf('Actual type was "%s", but expected no defined type (no node attribute).', $node->getAttribute('type'))); + } + } + break; + } + } + + private function verifyType(\Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType $expectedType, \Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType $actualType = null, $line) + { + $this->curAssertions += 1; + $this->testCase->assertNotNull($actualType, sprintf('Actual type was null (not defined), but expected type "%s" on line %d.', $expectedType, $line)); + $this->testCase->assertTrue($expectedType->equals($actualType), sprintf('Failed to assert that actual type "%s" equals expected type "%s" on line %d.', $actualType, $expectedType, $line)); + } + + public function leaveNode(\PHPParser_Node $node) + { + switch (true) { + case $node instanceof \PHPParser_Node_Stmt_Function: + case $node instanceof \PHPParser_Node_Stmt_ClassMethod: + if (0 === count($node->stmts)) { + break; + } + + if ((null === $comment = $node->getDocComment()) + || ! preg_match('#@Assertions\(([0-9]+)\)#', $comment, $match)) { + $this->testCase->fail(sprintf('Each method, and function must have an @Assertions() annotation, but found none on line %d.', $node->getLine())); + } + + $this->testCase->assertEquals($match[1], $this->curAssertions, sprintf('The number of expected assertions does not equal the actually performed number of assertions for function/method on line %d.', $node->getLine())); + + break; + } + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/TypeScanningPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/TypeScanningPassTest.php new file mode 100644 index 0000000..8bc6b15 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/TypeScanningPassTest.php @@ -0,0 +1,154 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\Pass\TypeScanningPass; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseAnalyzingPassTest; + +class TypeScanningPassTest extends BaseAnalyzingPassTest +{ + public function testConstantDefinitions() + { + $this->analyzeAst('TypeScanning/global_constants.php'); + + $constants = $this->registry->getConstants(); + $this->assertSame(2, count($constants)); + } + + public function testOptionalParameter() + { + $this->analyzeAst('TypeScanning/optional_parameter.php'); + + $test = $this->registry->getFunction('test'); + $this->assertSame(2, count($params = $test->getParameters())); + $this->assertFalse($params['foo']->isOptional()); + $this->assertTrue($params['bar']->isOptional()); + + $foo = $this->registry->getClass('Foo')->getMethod('foo'); + $this->assertSame(2, count($params = $foo->getParameters())); + $this->assertFalse($params['foo']->isOptional()); + $this->assertTrue($params['bar']->isOptional()); + } + + public function testVariableParameters() + { + $this->analyzeAst('TypeScanning/variable_parameters.php'); + + $foo = $this->registry->getFunction('foo'); + $this->assertTrue($foo->hasVariableParameters()); + + $bar = $this->registry->getFunction('bar'); + $this->assertFalse($bar->hasVariableParameters()); + } + + public function testMagicProperties() + { + $this->analyzeAst('TypeScanning/magic_properties.php'); + + $foo = $this->registry->getClass('Foo'); + + $this->assertCount(2, $props = $foo->getProperties()); + $this->assertTrue($props->containsKey('foo')); + $this->assertTrue($props['foo']->isPublic()); + + $this->assertTrue($props->containsKey('bar')); + $this->assertTrue($props['bar']->isPrivate()); + } + + public function testClassWithInterfaces() + { + $this->analyzeAst('TypeScanning/class_with_interfaces.php'); + + $b = $this->registry->getClass('Foo\B'); + $this->assertInstanceOf('Scrutinizer\PhpAnalyzer\Model\InterfaceC', $b); + $this->assertEquals(array('Foo\A'), $b->getExtendedInterfaces()); + + $foo = $this->registry->getClass('Foo\Foo'); + $this->assertInstanceOf('Scrutinizer\PhpAnalyzer\Model\Clazz', $foo); + $this->assertEquals('Foo\Bar', $foo->getSuperClass()); + $this->assertEquals(array('Foo\Bar'), $foo->getSuperClasses()); + $this->assertEquals(array('Foo\B', 'Foo\C', 'Foo\D', 'Foo\A'), $foo->getImplementedInterfaces()); + $this->assertEquals(array('foo', 'bar'), $foo->getProperties()->getKeys()); + $this->assertEquals(array('FOO', 'BAR', 'D', 'B', 'A', 'C'), $foo->getConstants()->getKeys()); + $this->assertEquals(array('foo', 'bar', 'd', 'b', 'a', 'c'), $foo->getMethods()->getKeys()); + $this->assertTrue($foo->isNormalized()); + } + + public function testDocComments() + { + $this->analyzeAst('TypeScanning/doc_comments.php'); + + $fooClass = $this->registry->getClass('FooBar\Foo'); + $this->assertEquals(array( + 'param_0' => 'string', + 'param_1' => '\FooBar\Bar', + 'return' => 'self', + ), $fooClass->getMethod('foo')->getDocTypes()); + $this->assertEquals(array( + 'param_0' => 'boolean', + ), $fooClass->getMethod('bar')->getDocTypes()); + } + + /** + * @group overridden-method + */ + public function testOverriddenMethod() + { + $this->analyzeAst('TypeScanning/overridden_method.php'); + + $a = $this->registry->getClass('A'); + $this->assertTrue($a->hasMethod('a')); + $aMethod = $a->getMethod('a'); + $this->assertEquals('A', $aMethod->getDeclaringClass()); + + $b = $this->registry->getClass('B'); + $this->assertTrue($b->hasMethod('a')); + $bMethod = $b->getMethod('a'); + $this->assertEquals('B', $bMethod->getDeclaringClass()); + + $this->assertNotSame($aMethod->getMethod(), $bMethod->getMethod()); + } + + public function testMethodWoVisibility() + { + $this->analyzeAst('TypeScanning/method_wo_visibility.php'); + + $a = $this->registry->getClass('A'); + $this->assertTrue($a->hasMethod('a')); + $this->assertTrue($a->getMethod('a')->isPublic()); + $this->assertTrue($a->hasMethod('b')); + $this->assertTrue($a->getMethod('b')->isPublic()); + } + + public function testPropertyOnInterfaceIsIgnored() + { + $this->analyzeAst('TypeScanning/property_on_interface.php'); + // should not produce a fatal error + } + + protected function getPasses() + { + return array(new TypeScanningPass()); + } + + protected function setUp() + { + parent::setUp(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/UnusedCodeChecksPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/UnusedCodeChecksPassTest.php new file mode 100644 index 0000000..640eaf0 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/UnusedCodeChecksPassTest.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\UnusedCodeChecksPass; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseReviewingPassTest; + +class UnusedCodeChecksPassTest extends BaseReviewingPassTest +{ + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new UnusedCodeChecksPass(); + + return $passes; + } + + protected function getTestDir() + { + return __DIR__.'/Fixture/UnusedCode/'; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/UseStatementFixingPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/UseStatementFixingPassTest.php new file mode 100644 index 0000000..1df690f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/UseStatementFixingPassTest.php @@ -0,0 +1,37 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; + +class UseStatementFixingPassTest extends BaseFixingPassTest +{ + protected function getTestDir() + { + return __DIR__.'/Fixture/UseStatementFixes/'; + } + + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new \Scrutinizer\PhpAnalyzer\Pass\UseStatementFixerPass(); + + return $passes; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/VerifyPhpDocCommentsPassTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/VerifyPhpDocCommentsPassTest.php new file mode 100644 index 0000000..7ca515d --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/VerifyPhpDocCommentsPassTest.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\Pass; + +use Scrutinizer\PhpAnalyzer\PassConfig; +use Scrutinizer\PhpAnalyzer\Pass\VerifyPhpDocCommentsPass; +use Scrutinizer\Tests\PhpAnalyzer\Pass\BaseReviewingPassTest; + +class VerifyPhpDocCommentsPassTest extends BaseReviewingPassTest +{ + protected function getTestDir() + { + return __DIR__.'/Fixture/VerifyDocComments/'; + } + + protected function getPasses() + { + $passes = PassConfig::createForTypeScanning()->getPasses(); + $passes[] = new VerifyPhpDocCommentsPass(); + + return $passes; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/DocCommentParserTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/DocCommentParserTest.php new file mode 100644 index 0000000..844d981 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/DocCommentParserTest.php @@ -0,0 +1,169 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser; + +use Scrutinizer\PhpAnalyzer\PhpParser\DocCommentParser; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; + +class DocCommentParserTest extends \PHPUnit_Framework_TestCase +{ + private $registry; + private $parser; + + public function testParseParam() + { + $param = $this->createParam('foo', '@param string $foo'); + $scannedType = $this->parser->getTypeFromParamAnnotation($param, 'foo'); + + $this->assertNotNull($scannedType); + $this->assertTrue($this->registry->getNativeType('string')->equals($scannedType)); + } + + public function testParseParam2() + { + $param = $this->createParam('foo', '@param foo string'); + $scannedType = $this->parser->getTypeFromParamAnnotation($param, 'foo'); + + $this->assertNotNull($scannedType); + $this->assertTrue($this->registry->getNativeType('string')->equals($scannedType)); + } + + public function testWithNamespace() + { + $this->parser->setImportedNamespaces(array('' => 'Foo\Bar')); + $type = $this->getTypeFromParam('Baz'); + + $this->assertNotNull($type); + $this->assertTrue($this->registry->getClassOrCreate('Foo\Bar\Baz')->equals($type)); + } + + public function testWithAbsoluteNamespace() + { + $this->parser->setImportedNamespaces(array('' => 'Foo')); + $type = $this->getTypeFromParam('\ReflectionClass'); + + $this->assertNotNull($type); + $this->assertTrue($this->registry->getClassOrCreate('ReflectionClass')->equals($type)); + } + + public function testWithImportedNamespace() + { + $this->parser->setImportedNamespaces(array('' => 'Foo', 'Bar' => 'Baz\Moo')); + $type = $this->getTypeFromParam('Bar'); + + $this->assertNotNull($type); + $this->assertTrue($this->registry->getClassOrCreate('Baz\Moo')->equals($type)); + } + + public function testSelfReferencingTypes() + { + $this->parser->setCurrentClassName('Foo'); + + $type = $this->getTypeFromParam('self'); + $this->assertNotNull($type); + $this->assertTrue($this->registry->getClassOrCreate('Foo')->equals($type)); + + $type = $this->getTypeFromParam('$this'); + $this->assertNotNull($type); + $this->assertTrue($this->registry->getClassOrCreate('Foo')->equals($type)); + } + + /** + * @expectedException \RuntimeException + * @expectedExceptionMessage "self" is only available from within classes. + */ + public function testSelfReferencingTypesFromOutsideOfClasses() + { + $this->parser->getType('self'); + } + + /** + * @dataProvider getParseTests + */ + public function testParse($docType, $expectedType, array $importedNamespaces = array()) + { + $this->parser->setImportedNamespaces($importedNamespaces); + $type = $this->parser->getType($docType); + $expectedType = $this->registry->resolveType($expectedType); + + $this->assertNotNull($type); + $this->assertTrue($expectedType->equals($type), sprintf('Actual type "%s" does not equal expected type "%s".', $type, $expectedType)); + } + + public function getParseTests() + { + $tests = array(); + + $tests[] = array('array', 'array'); + $tests[] = array('int[]', 'array'); + $tests[] = array('(int|string)[]', 'array'); + $tests[] = array('array<*,string>', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('Foo\Bar\Baz', 'object'); + $tests[] = array('Foo\Bar', 'object', array('' => 'Baz')); + $tests[] = array('Foo', 'object'); + $tests[] = array('int[optional]', 'integer'); + + return $tests; + } + + /** + * @dataProvider getInvalidTypeTests + * @expectedException \RuntimeException + */ + public function testParseThrowsExceptionForInvalidType($docType) + { + $this->parser->getType($docType); + } + + public function getInvalidTypeTests() + { + $tests = array(); + $tests[] = array('Sonata\AdminBundle\Model\ModelManagerInterface;'); + $tests[] = array('array'); + + return $tests; + } + + protected function setUp() + { + $this->registry = new TypeRegistry(); + $this->parser = new DocCommentParser($this->registry); + } + + private function getTypeFromParam($str) + { + $param = $this->createParam('x', '@param x '.$str); + + return $this->parser->getTypeFromParamAnnotation($param, 'x'); + } + + private function createParam($name, $docComment) + { + $function = new \PHPParser_Node_Stmt_Function('Foo', array( + 'params' => array( + $param = new \PHPParser_Node_Param($name), + ), + ), -1, $docComment); + $param->setAttribute('parent', $function); + + return $param; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/NodeTraversalTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/NodeTraversalTest.php new file mode 100644 index 0000000..8250781 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/NodeTraversalTest.php @@ -0,0 +1,186 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser; + +use JMS\PhpManipulator\PhpParser\BlockNode; +use Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal; + +class NodeTraversalTest extends \PHPUnit_Framework_TestCase +{ + public function testScopeChanges() + { + $function = new \PHPParser_Node_Stmt_Function('foo', array( + 'stmts' => $functionBlock = new BlockNode(array( + new \PHPParser_Node_Expr_Assign( + new \PHPParser_Node_Expr_Variable('foo'), + $closure = new \PHPParser_Node_Expr_Closure(array( + 'stmts' => $closureBlock = new BlockNode(array( + )) + )) + ) + )), + )); + + $callback = $this->getMock('Scrutinizer\PhpAnalyzer\PhpParser\Traversal\CallbackInterface'); + $functionScope = $closureScope = null; + $t = new NodeTraversal($callback); + + $callback->expects($this->atLeastOnce()) + ->method('shouldTraverse') + ->will($this->returnValue(true)); + + $self = $this; + $callback->expects($this->atLeastOnce()) + ->method('visit') + ->will($this->returnCallback(function(NodeTraversal $t, \PHPParser_Node $node, \PHPParser_Node $parent = null) + use (&$functionScope, &$closureScope, $function, $closure, $self) { + if (null === $parent) { + $functionScope = $t->getScope(); + + $self->assertSame(1, $t->getScopeDepth()); + $self->assertSame($function, $t->getScopeRoot()); + } + + if ($parent instanceof \PHPParser_Node_Expr_Closure) { + $closureScope = $t->getScope(); + + $self->assertSame(2, $t->getScopeDepth()); + $self->assertSame($closure, $t->getScopeRoot()); + } + })); + + $t->traverse($function); + + $this->assertInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope', $functionScope); + $this->assertInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope', $closureScope); + $this->assertNotSame($functionScope, $closureScope); + } + + public function testTraverseCatch() + { + $catch = new \PHPParser_Node_Stmt_Catch($name = new \PHPParser_Node_Name(array('foo')), 'foo'); + $catchBlock = $catch->stmts = new BlockNode(array()); + + $callback = $this->getMock('Scrutinizer\PhpAnalyzer\PhpParser\Traversal\CallbackInterface'); + $t = new NodeTraversal($callback); + + $callback->expects($this->at(0)) + ->method('shouldTraverse') + ->with($this->anything(), $catch, null) + ->will($this->returnValue(true)); + $callback->expects($this->at(1)) + ->method('shouldTraverse') + ->with($this->anything(), $name, $catch) + ->will($this->returnValue(false)); + $callback->expects($this->at(2)) + ->method('shouldTraverse') + ->with($this->anything(), $catchBlock, $catch) + ->will($this->returnValue(true)); + $callback->expects($this->at(3)) + ->method('visit') + ->with($this->anything(), $catchBlock, $catch); + $callback->expects($this->at(4)) + ->method('visit') + ->with($this->anything(), $catch, null); + + $t->traverse($catch); + } + + public function testTraverse() + { + $function = new \PHPParser_Node_Stmt_Function('foo', array( + 'stmts' => $functionBlock = new BlockNode(array( + $try = new \PHPParser_Node_Stmt_TryCatch(array(), array( + $catch1 = new \PHPParser_Node_Stmt_Catch(new \PHPParser_Node_Name(array('Foo')), 'ex'), + $catch2 = new \PHPParser_Node_Stmt_Catch(new \PHPParser_Node_Name(array('Bar')), 'ex'), + )), + $echo = new \PHPParser_Node_Stmt_Echo(array(new \PHPParser_Node_Scalar_String('foo'))), + )) + )); + $tryBlock = $try->stmts = new BlockNode(array( + $throw = new \PHPParser_Node_Stmt_Throw(new \PHPParser_Node_Expr_Variable('foo')) + )); + $catch1Block = $catch1->stmts = new BlockNode(array()); + $catch2Block = $catch2->stmts = new BlockNode(array()); + + $callback = $this->getMock('Scrutinizer\PhpAnalyzer\PhpParser\Traversal\CallbackInterface'); + $t = new NodeTraversal($callback); + + $callback->expects($this->at(0)) + ->method('shouldTraverse') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $function, null) + ->will($this->returnValue(true)); + $callback->expects($this->at(1)) + ->method('shouldTraverse') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $functionBlock, $function) + ->will($this->returnValue(true)); + $callback->expects($this->at(2)) + ->method('shouldTraverse') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $try, $functionBlock) + ->will($this->returnValue(true)); + $callback->expects($this->at(3)) + ->method('shouldTraverse') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $tryBlock, $try) + ->will($this->returnValue(true)); + $callback->expects($this->at(4)) + ->method('shouldTraverse') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $throw, $tryBlock) + ->will($this->returnValue(false)); + $callback->expects($this->at(5)) + ->method('visit') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $tryBlock, $try); + $callback->expects($this->at(6)) + ->method('shouldTraverse') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $catch1, $try) + ->will($this->returnValue(true)); + $callback->expects($this->at(7)) + ->method('shouldTraverse') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $this->isInstanceOf('PHPParser_Node_Name'), $catch1) + ->will($this->returnValue(false)); + $callback->expects($this->at(8)) + ->method('shouldTraverse') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $catch1Block, $catch1) + ->will($this->returnValue(true)); + $callback->expects($this->at(9)) + ->method('visit') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $catch1Block, $catch1); + $callback->expects($this->at(10)) + ->method('visit') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $catch1, $try); + $callback->expects($this->at(11)) + ->method('shouldTraverse') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $catch2, $try) + ->will($this->returnValue(false)); + $callback->expects($this->at(12)) + ->method('visit') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $try, $functionBlock); + $callback->expects($this->at(13)) + ->method('shouldTraverse') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $echo, $functionBlock) + ->will($this->returnValue(false)); + $callback->expects($this->at(14)) + ->method('visit') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $functionBlock, $function); + $callback->expects($this->at(15)) + ->method('visit') + ->with($this->isInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\NodeTraversal'), $function, null); + + $t->traverse($function); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Scope/ScopeTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Scope/ScopeTest.php new file mode 100644 index 0000000..cb3177b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Scope/ScopeTest.php @@ -0,0 +1,44 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser\Scope; + +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; + +class ScopeTest extends \PHPUnit_Framework_TestCase +{ + private $registry; + + public function testDeclareVar() + { + $scope = new Scope($this->getMock('PHPParser_Node')); + + $this->assertNull($scope->getVar('x')); + + $scope->declareVar('x', $this->registry->getNativeType('integer')); + $this->assertNotNull($var = $scope->getVar('x')); + $this->assertSame($this->registry->getNativeType('integer'), $var->getType()); + $this->assertTrue($var->isTypeInferred()); + } + + protected function setUp() + { + $this->registry = new TypeRegistry(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Scope/SyntacticScopeCreatorTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Scope/SyntacticScopeCreatorTest.php new file mode 100644 index 0000000..95e0ae3 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Scope/SyntacticScopeCreatorTest.php @@ -0,0 +1,56 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser\Scope; + +use JMS\PhpManipulator\PhpParser\NormalizingNodeVisitor; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\Scope; +use Scrutinizer\PhpAnalyzer\PhpParser\Scope\SyntacticScopeCreator; + +class SyntacticScopeCreatorTest extends \PHPUnit_Framework_TestCase +{ + public function testCreateScope1() + { + $scope = $this->createScope('$a = $b = null;'); + + $this->assertEquals(array('param1', 'param2', 'this', 'a', 'b'), $scope->getVarNames()); + } + + private function createScope($src) + { + $lexer = new \PHPParser_Lexer('parse($lexer); + + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); + $traverser->addVisitor(new NormalizingNodeVisitor()); + $ast = $traverser->traverse($ast); + + $traverser = new \PHPParser_NodeTraverser(); + $traverser->addVisitor(new \PHPParser_NodeVisitor_NodeConnector()); + $traverser->traverse($ast); + + $rootNode = $ast[0]; + $scopeRoot = $ast[0]->stmts[0]; + + $sc = new SyntacticScopeCreator(); + + return $sc->createScope($scopeRoot, new Scope($rootNode)); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/ArrayTypeTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/ArrayTypeTest.php new file mode 100644 index 0000000..471b51f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/ArrayTypeTest.php @@ -0,0 +1,32 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser\Type; + +class ArrayTypeTest extends BaseTypeTest +{ + public function testInferItemType() + { + $type = $this->registry->getNativeType('array'); + $inferredType = $type->inferItemType('foo', $this->registry->getNativeType('integer')); + + $this->assertNotSame($type, $inferredType); + $this->assertTrue($type->getItemType('foo')->isEmpty(), 'There was a type for item "foo".'); + $this->assertTypeEquals('integer', $inferredType->getItemType('foo')->get()); + } +} diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/BaseTypeTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/BaseTypeTest.php new file mode 100644 index 0000000..d98108c --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/BaseTypeTest.php @@ -0,0 +1,72 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; + +abstract class BaseTypeTest extends \PHPUnit_Framework_TestCase +{ + protected $provider; + protected $registry; + + protected function setUp() + { + $this->provider = $this->getMock('Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeProviderInterface'); + $this->registry = new TypeRegistry($this->provider); + } + + protected function assertTypeEquals($thisType, $thatType) + { + $thisType = $this->resolveType($thisType); + $thatType = $this->resolveType($thatType); + + $this->assertTrue($thisType->equals($thatType), 'Expected type "'.$thisType.'", but got type "'.$thatType.'".'); + } + + protected function createUnionType($types) + { + if (!is_array($types)) { + $types = func_get_args(); + } + + return $this->registry->createUnionType($types); + } + + protected function getNative($type) + { + return $this->registry->getNativeType($type); + } + + protected function createNullableType($type) + { + $type = $this->resolveType($type); + + return $this->registry->createNullableType($type); + } + + protected function resolveType($type) + { + return $this->registry->resolveType($type); + } + + protected function getType($type) + { + return $this->registry->getNativeType($type); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/PhpTypeTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/PhpTypeTest.php new file mode 100644 index 0000000..74cff2b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/PhpTypeTest.php @@ -0,0 +1,851 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NamedType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; +use Scrutinizer\PhpAnalyzer\Model\Clazz; +use Scrutinizer\PhpAnalyzer\Model\InterfaceC; + +class PhpTypeTest extends BaseTypeTest +{ + /** @var TypeRegistry */ + protected $registry; + + /** + * @dataProvider getEqualsTests + * @group equals + */ + public function testEquals($a, $b, $expected, array $extends = array()) + { + $this->setUpInheritance($extends); + + $a = $this->registry->resolveType($a); + $b = $this->registry->resolveType($b); + + $this->assertSame($expected, $a->equals($b), sprintf('Could not verify equality of $a (%s - %s) and $b (%s - %s).', get_class($a), $a, get_class($b), $b)); + $this->assertSame($expected, $b->equals($a), sprintf('Could not verify equality of $b (%s - %s) and $a (%s - %s).', get_class($b), $b, get_class($a), $a)); + } + + public function getEqualsTests() + { + $tests = array(); + + $tests[] = array('string', 'string', true); + $tests[] = array('string', 'boolean', false); + $tests[] = array('object', 'object', true); + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', false); + $tests[] = array('array', 'array', false); + $tests[] = array('array', 'array', false); + $tests[] = array('array', 'array', false); + $tests[] = array('array', 'array', false); + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', false); + $tests[] = array('object', 'object', true); + $tests[] = array('object', 'object', true, array('Foo' => 'Bar')); + $tests[] = array('this', 'object', true); + $tests[] = array('this', 'object', true, array('Foo' => 'Bar')); + $tests[] = array('this', 'this', true); + $tests[] = array('this', 'this', true, array('Foo' => 'Bar')); + $tests[] = array('all', 'all', true); + $tests[] = array('unknown', 'unknown', true); + + $tests[] = array('boolean', 'boolean', true); + $tests[] = array('boolean', 'false', false); + $tests[] = array('false', 'false', true); + + foreach ($tests as $test) { + if ($test[0] === $test[1]) { + continue; + } + + $tmp = $test[0]; + $test[0] = $test[1]; + $test[1] = $tmp; + $tests[] = $test; + } + + return $tests; + } + + /** + * @group equals + */ + public function testEqualsWithNamedAndResolvedType() + { + $a = $this->registry->getClassOrCreate('Foo'); + $this->assertInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\Type\NamedType', $a); + + $b = new \Scrutinizer\PhpAnalyzer\Model\Clazz('Foo'); + $b->setNormalized(true); + $this->assertTrue($a->equals($b)); + $this->assertTrue($b->equals($a)); + + $c = new \Scrutinizer\PhpAnalyzer\Model\InterfaceC('Foo'); + $c->setNormalized(true); + $this->assertTrue($a->equals($c)); + $this->assertTrue($c->equals($a)); + } + + /** + * @group equals + */ + public function testEqualsWithResolvedNamedAndResolvedType() + { + $a = new NamedType($this->registry, 'Foo'); + $b = new \Scrutinizer\PhpAnalyzer\Model\Clazz('Foo'); + $b->setNormalized(true); + $a->setReferencedType($b); + $this->assertTrue($a->equals($b)); + $this->assertTrue($b->equals($a)); + + $a = new NamedType($this->registry, 'Foo'); + $c = new \Scrutinizer\PhpAnalyzer\Model\Clazz('Foo'); + $c->setNormalized(true); + $a->setReferencedType($c); + $this->assertTrue($c->equals($a)); + $this->assertTrue($a->equals($c)); + } + + /** + * @dataProvider getTestForEqualityTests + * @group testForEquality + */ + public function testTestForEquality($a, $b, $expected, array $extends = array()) + { + $this->setUpInheritance($extends); + + $a = $this->registry->resolveType($a); + $b = $this->registry->resolveType($b); + $actual = $a->testForEquality($b); + + $this->assertNotNull($actual); + $this->assertEquals($expected, (string) $actual, sprintf('Could not verify equality result for $a (%s - %s) with $b (%s - %s).', get_class($a), $a, get_class($b), $b)); + } + + public function getTestForEqualityTests() + { + $tests = array(); + + // Resource Type + $tests[] = array('resource', 'boolean', 'unknown'); + $tests[] = array('resource', 'integer', 'unknown'); + $tests[] = array('resource', 'double', 'unknown'); + $tests[] = array('resource', 'string', 'unknown'); + $tests[] = array('resource', 'array', 'false'); + $tests[] = array('resource', 'object', 'false'); + $tests[] = array('resource', 'null', 'false'); + $tests[] = array('resource', 'object|array', 'false'); + $tests[] = array('resource', 'boolean|array', 'unknown'); + + // Boolean Type + $tests[] = array('boolean', 'boolean', 'unknown'); + $tests[] = array('boolean', 'false', 'unknown'); + $tests[] = array('false', 'false', 'true'); + + // Callable Type + // We could have modeled callable as a true super-set of the string, array, and + // object types. However, since not all strings, arrays, and objects are valid + // callbacks, we chose to use a bit more strict rules. Namely, there is no valid + // callback which would evaluate to true with any of the below types. The empty + // strings, or a string consisting solely of integers are not valid callbacks. + $tests[] = array('integer', 'callable', 'false'); + $tests[] = array('callable', 'integer', 'false'); + $tests[] = array('double', 'callable', 'false'); + $tests[] = array('callable', 'double', 'false'); + $tests[] = array('null', 'callable', 'false'); + $tests[] = array('callable', 'null', 'false'); + $tests[] = array('boolean', 'callable', 'false'); + $tests[] = array('callable', 'boolean', 'false'); + $tests[] = array('resource', 'callable', 'false'); + $tests[] = array('callable', 'resource', 'false'); + + //// Object Types + // Tests that are unknown because they depend on runtime values. + $tests[] = array('object', 'object', 'unknown'); + $tests[] = array('object', 'object', 'unknown', array('Foo' => 'Bar')); + $tests[] = array('this', 'object', 'unknown'); + $tests[] = array('this', 'object', 'unknown', array('Foo' => 'Bar')); + $tests[] = array('this', 'this', 'unknown'); + $tests[] = array('this', 'this', 'unknown', array('Foo' => 'Bar')); + + // Tests that are unknown because they depend on not resolved types. + $tests[] = array('object', 'object', 'unknown'); + $tests[] = array('this', 'object', 'unknown'); + $tests[] = array('this', 'this', 'unknown'); + + // Tests for which we know they are always false. + $tests[] = array('object', 'object', 'false', array('Foo' => 'Bar', 'Moo' => 'Boo')); + $tests[] = array('this', 'object', 'false', array('Foo' => 'Bar', 'Moo' => 'Boo')); + + // A == B is equal to B == A + foreach ($tests as $test) { + if ($test[0] === $test[1]) { + continue; + } + + $tmp = $test[0]; + $test[0] = $test[1]; + $test[1] = $tmp; + $tests[] = $test; + } + + return $tests; + } + + /** + * @group leastSupertype + * @dataProvider getLeastSuperTypeTests + */ + public function testGetLeastSuperTypeDefault($a, $b, $expected, array $extends = array()) + { + $this->setUpInheritance($extends); + + $a = $this->registry->resolveType($a); + $b = $this->registry->resolveType($b); + $expected = $this->registry->resolveType($expected); + + $this->assertTrue($expected->equals($actual = $a->getLeastSuperType($b)), sprintf('Expected type "%s" does not equal actual type "%s".', $expected, $actual)); + $this->assertTrue($expected->equals($actual = $b->getLeastSuperType($a)), sprintf('Expected type "%s" does not equal actual type "%s".', $expected, $actual)); + } + + public function getLeastSuperTypeTests() + { + $tests = array(); + + // A, B, Expected Type + $tests[] = array('boolean', 'double', 'boolean|double'); + $tests[] = array('boolean', 'boolean', 'boolean'); + $tests[] = array('boolean', 'false', 'boolean'); + $tests[] = array('false', 'false', 'false'); + + $tests[] = array('array', 'array', 'array'); + $tests[] = array('array', 'array', 'array'); + $tests[] = array('array', + 'array', + 'array'); + $tests[] = array('array', + 'array', + 'array|array'); + $tests[] = array('array', + 'array', + 'array|array'); + + // Unknown-Type Array, and All-Type Array + $tests[] = array('array', 'array', 'array'); + $tests[] = array('array', 'array', 'array'); + $tests[] = array('array', 'array', 'array'); + $tests[] = array('array', 'array', 'array'); + + return $tests; + } + + /** + * @dataProvider getGreatestSubtypeTests + * @group greatestSubtype + */ + public function testGetGreatestSubtype($a, $b, $expected, array $extends = array()) + { + $this->setUpInheritance($extends); + + $a = $this->registry->resolveType($a); + $b = $this->registry->resolveType($b); + $expected = $this->registry->resolveType($expected); + + $this->assertTrue($expected->equals($actual = $a->getGreatestSubtype($b)), sprintf('Expected type "%s" does not equal actual type "%s".', $expected, $actual)); + $this->assertTrue($expected->equals($actual = $b->getGreatestSubtype($a)), sprintf('Expected type "%s" does not equal actual type "%s".', $expected, $actual)); + } + + /** + * The greatest subtype of type A and B is also known as + * the infimum, meet, or greatest lower bound, and typically + * denoted with A ^ B. + * + * When looking at the type hierarchy, this is the type where both type + * paths meet. The worst case, is to meet at the bottom No type. + * + * @return array + */ + public function getGreatestSubtypeTests() + { + $tests = array(); + + // A, B, Expected Type + $tests[] = array('boolean', 'boolean', 'boolean'); + $tests[] = array('boolean', 'false', 'false'); + $tests[] = array('false', 'false', 'false'); + $tests[] = array('unknown', 'boolean', 'unknown'); + $tests[] = array('integer', 'double', 'none'); + $tests[] = array('array', 'array', 'array'); + $tests[] = array('callable', 'integer', 'none'); + $tests[] = array('callable', 'object', 'object'); + + // Unions + $tests[] = array('string|integer', 'string', 'string'); + $tests[] = array('string|integer', 'double', 'none'); + + // Objects + $tests[] = array('object', 'object', 'none'); + $tests[] = array('object', 'object', 'object'); + $tests[] = array('object', 'object', 'object'); + $tests[] = array('object', 'object', 'object', array('Foo' => 'Bar')); + $tests[] = array('object|object', 'object', 'object|object', array('Foo' => 'Baz', 'Bar' => 'Baz')); + $tests[] = array('this', 'object', 'none'); + $tests[] = array('this', 'this', 'none'); + $tests[] = array('object', 'this', 'object'); + $tests[] = array('this', 'this', 'object', array('Foo' => 'Bar')); + $tests[] = array('this', 'object', 'object', array('Foo' => 'Bar')); + $tests[] = array('object', 'this', 'object', array('Foo' => 'Bar')); + $tests[] = array('object|this', 'object', 'object|object', array('Foo' => 'Baz', 'Bar' => 'Baz')); + $tests[] = array('this|object', 'object', 'object|object', array('Foo' => 'Baz', 'Bar' => 'Baz')); + $tests[] = array('object|object', 'this', 'object|object', array('Foo' => 'Baz', 'Bar' => 'Baz')); + $tests[] = array('this|this', 'object', 'object|object', array('Foo' => 'Baz', 'Bar' => 'Baz')); + $tests[] = array('this|this', 'this', 'object|object', array('Foo' => 'Baz', 'Bar' => 'Baz')); + + // Unknown + $tests[] = array('unknown', 'integer', 'unknown'); + $tests[] = array('unknown', 'array', 'unknown'); + $tests[] = array('unknown', 'none', 'unknown'); + $tests[] = array('unknown', 'all', 'unknown'); + $tests[] = array('unknown', 'object', 'unknown'); + $tests[] = array('unknown', 'object', 'unknown'); + $tests[] = array('unknown', 'object', 'unknown', array('Foo' => 'Bar')); + $tests[] = array('unknown', 'this', 'unknown'); + $tests[] = array('unknown', 'this', 'unknown', array('Foo' => 'Bar')); + + // A ^ B = B ^ A + foreach ($tests as $test) { + if ($test[1] === $test[0]) { + continue; + } + + $tmp = $test[1]; + $test[1] = $test[0]; + $test[0] = $tmp; + $tests[] = $test; + } + + return $tests; + } + + /** + * This test differs from the other isSubTypeOf tests in that we need + * to check the behavior of NamedType resolved against, Clazz instances. + * + * @group isSubTypeOf + */ + public function testIsSubTypeOfWithForObjectTypes() + { + $this->registry->registerClass($foo = new Clazz('Foo')); + $this->registry->registerClass($bar = new Clazz('Bar')); + $foo->setSuperClasses(array('Bar')); + $foo->setNormalized(true); + $bar->setNormalized(true); + $named = new NamedType($this->registry, 'Bar'); + $named->setReferencedType($bar); + + $this->assertTrue($foo->isSubTypeOf($named)); + $this->assertFalse($named->isSubTypeOf($foo)); + } + + /** + * @dataProvider getSubTypeTests + * @group isSubTypeOf + */ + public function testIsSubTypeOf($a, $b, $expectedOutcome, array $extends = array()) + { + $this->setUpInheritance($extends); + $a = $this->registry->resolveType($a); + $b = $this->registry->resolveType($b); + + $this->assertSame($expectedOutcome, $a->isSubTypeOf($b), sprintf('Could not verify that $a (%s - %s) is a subtype of $b (%s - %s).', get_class($a), $a, get_class($b), $b)); + } + + public function getSubTypeTests() + { + $tests = array(); + + // Every other type is a subtype of the Unkown type, and the Unknown + // type is a subtype of all other types + $tests[] = array('integer', 'unknown', true); + $tests[] = array('unknown', 'integer', true); + $tests[] = array('double', 'unknown', true); + $tests[] = array('unknown', 'double', true); + $tests[] = array('string', 'unknown', true); + $tests[] = array('unknown', 'string', true); + $tests[] = array('array', 'unknown', true); + $tests[] = array('unknown', 'array', true); + $tests[] = array('array', 'unknown', true); + $tests[] = array('unknown', 'array', true); + $tests[] = array('object', 'unknown', true); + $tests[] = array('unknown', 'object', true); + $tests[] = array('object', 'unknown', true); + $tests[] = array('this', 'unknown', true); + $tests[] = array('unknown', 'object', true); + $tests[] = array('unknown', 'this', true); + $tests[] = array('number', 'unknown', true); + $tests[] = array('unknown', 'number', true); + $tests[] = array('all', 'unknown', true); + $tests[] = array('unknown', 'all', true); + $tests[] = array('callable', 'unknown', true); + $tests[] = array('unknown', 'callable', true); + $tests[] = array('none', 'unknown', true); + $tests[] = array('unknown', 'none', true); + $tests[] = array('null', 'unknown', true); + $tests[] = array('unknown', 'null', true); + $tests[] = array('resource', 'unknown', true); + $tests[] = array('unknown', 'resource', true); + + // Every other type is a subtype of the all type. + $tests[] = array('integer', 'all', true); + $tests[] = array('all', 'integer', false); + $tests[] = array('double', 'all', true); + $tests[] = array('all', 'double', false); + $tests[] = array('string', 'all', true); + $tests[] = array('all', 'string', false); + $tests[] = array('array', 'all', true); + $tests[] = array('all', 'array', false); + $tests[] = array('array', 'all', true); + $tests[] = array('all', 'array', false); + $tests[] = array('object', 'all', true); + $tests[] = array('all', 'object', false); + $tests[] = array('object', 'all', true); + $tests[] = array('this', 'all', true); + $tests[] = array('all', 'object', false); + $tests[] = array('all', 'this', false); + $tests[] = array('number', 'all', true); + $tests[] = array('all', 'number', false); + $tests[] = array('callable', 'all', true); + $tests[] = array('all', 'callable', false); + $tests[] = array('none', 'all', true); + $tests[] = array('all', 'none', false); + $tests[] = array('null', 'all', true); + $tests[] = array('all', 'null', false); + $tests[] = array('resource', 'all', true); + $tests[] = array('all', 'resource', false); + $tests[] = array('all', 'all', true); + + // The None type is a subtype of every other type + $tests[] = array('none', 'unknown', true); + $tests[] = array('none', 'integer', true); + $tests[] = array('none', 'double', true); + $tests[] = array('none', 'string', true); + $tests[] = array('none', 'array', true); + $tests[] = array('none', 'array', true); + $tests[] = array('none', 'object', true); + $tests[] = array('none', 'object', true); + $tests[] = array('none', 'this', true); + $tests[] = array('none', 'number', true); + $tests[] = array('none', 'callable', true); + $tests[] = array('none', 'null', true); + $tests[] = array('none', 'resource', true); + + // Boolean Types + $tests[] = array('boolean', 'false', false); + $tests[] = array('false', 'boolean', true); + $tests[] = array('boolean', 'boolean', true); + $tests[] = array('false', 'false', true); + + // NoObject type is a supertype of every other object type. + $tests[] = array('object', 'object', true); + $tests[] = array('object', 'object', true); + $tests[] = array('this', 'object', true); + $tests[] = array('object', 'object', false); + $tests[] = array('object', 'this', false); + $tests[] = array('object', 'object', true, array('Bar' => '')); + $tests[] = array('this', 'object', true, array('Bar' => '')); + $tests[] = array('object', 'object', false); + $tests[] = array('object', 'this', false); + $tests[] = array('object', 'object', false, array('Bar' => '')); + $tests[] = array('object', 'this', false, array('Bar' => '')); + + // An Object type O1 is a subtype of Object type O2 if O1 has a parent + // of O2, or implements an interface of O2. + $tests[] = array('object', 'object', true, array('Foo' => 'Bar')); + $tests[] = array('object', 'object', true, array('Foo' => 'Bar', 'Bar' => 'Baz')); + $tests[] = array('object', 'object', false, array('Foo' => 'Baz', 'Bar' => 'Baz')); + $tests[] = array('this', 'object', true, array('Foo' => 'Bar')); + $tests[] = array('this', 'object', true, array('Foo' => 'Bar', 'Bar' => 'Baz')); + $tests[] = array('this', 'object', false, array('Foo' => 'Baz', 'Bar' => 'Baz')); + $tests[] = array('object', 'this', true, array('Foo' => 'Bar')); + $tests[] = array('object', 'this', true, array('Foo' => 'Bar', 'Bar' => 'Baz')); + $tests[] = array('object', 'this', false, array('Foo' => 'Baz', 'Bar' => 'Baz')); + $tests[] = array('this', 'this', true, array('Foo' => 'Bar')); + $tests[] = array('this', 'this', true, array('Foo' => 'Bar', 'Bar' => 'Baz')); + $tests[] = array('this', 'this', false, array('Foo' => 'Baz', 'Bar' => 'Baz')); + + // If a no resolved type is present, then object subtype checks always fail. + // This will generate some false-positives if not all classes are present in a + // review which should regularly be the case though (unless someone has a filter + // which excludes them). If we change this, then we need to re-visit all the other + // methods (getGreatestSubType, getLeastSuperType, etc.) to consider no resolved + // types specially. + $tests[] = array('object', 'object', false); + $tests[] = array('object', 'object', false, array('Foo' => 'Moo')); + $tests[] = array('object', 'object', false, array('Bar' => 'Baz')); + $tests[] = array('this', 'object', false); + $tests[] = array('object', 'this', false); + $tests[] = array('this', 'this', false); + + // Each Array type is a subtype of the generic Array type. + $tests[] = array('array', 'array', true); + $tests[] = array('array>', 'array', true); + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', true); + + // The generic Array type is not a subtype of a more concrete Array type. + $tests[] = array('array', 'array', false); + $tests[] = array('array', 'array', false); + + // Array with known item types. + $tests[] = array('array', + 'array', false); // Known item is is not a subtype. + $tests[] = array('array', + 'array', true); + $tests[] = array('array', + 'array', false); + $tests[] = array('array', + 'array', + false); + + + // An Array type A1 is a subtype of Array type A2 if both A1's key type, + // and A1's element type are subtypes of A2's key and element types + // respectively. + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', true); + $tests[] = array('array>', 'array', false); + $tests[] = array('array>', 'array', false); + + // Unknown-Type array and All-Type array + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', true); + + // String, Array, and Object types are subtypes of the Callable type. + $tests[] = array('object', 'callable', true); + $tests[] = array('callable', 'object', false); + $tests[] = array('array', 'callable', true); + $tests[] = array('callable', 'array', false); + $tests[] = array('string', 'callable', true); + $tests[] = array('callable', 'string', false); + $tests[] = array('object', 'callable', true); + $tests[] = array('this', 'callable', true); + $tests[] = array('callable', 'object', false); + $tests[] = array('callable', 'this', false); + $tests[] = array('object', 'callable', true, array('Foo')); + $tests[] = array('this', 'callable', true, array('Foo')); + $tests[] = array('callable', 'object', false, array('Foo')); + $tests[] = array('callable', 'this', false, array('Foo')); + $tests[] = array('array', 'callable', true); + $tests[] = array('callable', 'array', false); + + // A union type is a subtype of a type U if all the union's alternates + // are a subtype of that type U. + $tests[] = array('integer|double', 'integer', false); + $tests[] = array('integer|double', 'double', false); + $tests[] = array('integer|double', 'integer|double', true); + $tests[] = array('integer|double', 'integer|double|string', true); + $tests[] = array('object|object', 'object|object', true); + $tests[] = array('object|object', 'object|object', true, array('Foo' => 'Baz')); + $tests[] = array('object|object', 'object|object', true, array('Foo' => 'Baz', 'Bar' => 'Boo')); + $tests[] = array('this|object', 'object|object', true); + $tests[] = array('this|object', 'object|object', true, array('Foo' => 'Baz')); + $tests[] = array('this|object', 'object|object', true, array('Foo' => 'Baz', 'Bar' => 'Boo')); + $tests[] = array('object|this', 'object|object', true); + $tests[] = array('object|this', 'object|object', true, array('Foo' => 'Baz')); + $tests[] = array('object|this', 'object|object', true, array('Foo' => 'Baz', 'Bar' => 'Boo')); + + // A type U is a subtype of a union type if it is a subtype of one of + // its alternates. + $tests[] = array('integer', 'integer|double', true); + $tests[] = array('integer', 'double|string', false); + + // If types are equal, they are subtypes of eachother. + $tests[] = array('integer', 'integer', true); + $tests[] = array('double', 'double', true); + $tests[] = array('string', 'string', true); + $tests[] = array('array', 'array', true); + $tests[] = array('unknown', 'unknown', true); + $tests[] = array('none', 'none', true); + $tests[] = array('object', 'object', true); + $tests[] = array('null', 'null', true); + $tests[] = array('callable', 'callable', true); + $tests[] = array('all', 'all', true); + + // Unrelated types (non-exhaustive). + $tests[] = array('integer', 'double', false); + $tests[] = array('double', 'integer', false); + $tests[] = array('callable', 'integer', false); + $tests[] = array('integer', 'callable', false); + $tests[] = array('resource', 'integer', false); + $tests[] = array('integer', 'resource', false); + $tests[] = array('string', 'resource', false); + $tests[] = array('resource', 'string', false); + $tests[] = array('string', 'object', false); + $tests[] = array('object', 'string', false); + + return $tests; + } + + public function testIsSubtypeWithInterfaceAndClass() + { + $bar = new \Scrutinizer\PhpAnalyzer\Model\InterfaceC('Bar'); + $bar->setNormalized(true); + + $foo = new Clazz('Foo'); + $foo->setNormalized(true); + + $this->assertFalse($foo->isSubtypeOf($bar)); + + $foo->addImplementedInterface('bar'); + $this->assertTrue($foo->isSubtypeOf($bar)); + + $namedBar = new NamedType($this->registry, 'Bar'); + $this->assertTrue($foo->isSubtypeOf($namedBar)); + } + + public function testIsSubtypeWithResolvedNamedTypes() + { + $bar = $this->registry->getClassOrCreate('Bar\Baz'); + $bar->setReferencedType(new InterfaceC('Bar\Baz')); + $bar->getReferencedType()->setNormalized(true); + + $foo = $this->registry->getClassOrCreate('Foo\Moo'); + $foo->setReferencedType(new Clazz('Foo\Moo')); + $foo->getReferencedType()->setNormalized(true); + + $this->assertFalse($foo->isSubtypeOf($bar)); + + $foo->getReferencedType()->addImplementedInterface('Bar\Baz'); + $this->assertTrue($foo->isSubtypeOf($bar)); + } + + public function testIsSubtypeWithPartiallyResolvedTypes() + { + $interface = $this->registry->getClassOrCreate('I'); + $interface->setReferencedType(new InterfaceC('I')); + $interface->getReferencedType()->setNormalized(true); + + $class = new Clazz('C'); + $this->assertTrue($class->isSubtypeOf($interface), 'Non-normalized types are always subtypes.'); + + $class->addImplementedInterface('I'); + $this->assertTrue($class->isSubtypeOf($interface)); + } + + public function testIsSubtypeWithNamedTypes() + { + $bar = new \Scrutinizer\PhpAnalyzer\Model\InterfaceC('Bar'); + $bar->setNormalized(true); + + $foo = new Clazz('Foo'); + $foo->setNormalized(true); + + $this->assertFalse($foo->isSubtypeOf($bar)); + + $foo->addImplementedInterface('Bar'); + $namedBar = NamedType::createResolved($this->registry, $bar); + $this->assertTrue($foo->isSubTypeOf($namedBar)); + $this->assertTrue($foo->isSubTypeOf($bar)); + + $namedFoo = NamedType::createResolved($this->registry, $foo); + $this->assertTrue($namedFoo->isSubtypeOf($namedBar)); + $this->assertTrue($namedFoo->isSubtypeOf($bar)); + + $unresolvedNamedBar = new NamedType($this->registry, 'Bar'); + $this->assertTrue($foo->isSubtypeOf($unresolvedNamedBar)); + $this->assertTrue($namedFoo->isSubtypeOf($unresolvedNamedBar)); + + $baz = new InterfaceC('Baz'); + $baz->setNormalized(true); + $this->assertFalse($baz->isSubtypeOf($bar)); + $this->assertFalse($baz->isSubtypeOf($namedBar)); + $this->assertFalse($baz->isSubtypeOf($unresolvedNamedBar)); + + $baz->addExtendedInterface('Bar'); + $this->assertTrue($baz->isSubtypeOf($bar)); + $this->assertTrue($baz->isSubtypeOf($namedBar)); + $this->assertTrue($baz->isSubtypeOf($unresolvedNamedBar)); + } + + /** + * @dataProvider getDocTypeTests + */ + public function testGetDocType($type, $expectedDocType, array $importedNamespaces = array(), array $extends = array()) + { + $this->setUpInheritance($extends); + $type = $this->registry->resolveType($type); + + $this->assertEquals($expectedDocType, $type->getDocType($importedNamespaces)); + } + + public function getDocTypeTests() + { + $tests = array(); + + // Primitive type tests. + $tests[] = array('boolean', 'boolean'); + $tests[] = array('integer', 'integer'); + $tests[] = array('double', 'double'); + $tests[] = array('string', 'string'); + $tests[] = array('array', 'array'); + $tests[] = array('resource', 'resource'); + $tests[] = array('callable', 'callable'); + $tests[] = array('string|integer', 'string|integer'); + $tests[] = array('string|null', 'string|null'); + + // Array type tests. + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array<*,string>'); + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + $tests[] = array('array', 'array'); + + // Object type tests. + $tests[] = array('object', 'Foo\Bar'); + $tests[] = array('object', 'Bar', array('' => 'Foo')); + $tests[] = array('object', 'Bar', array('Bar' => 'Foo\Bar')); + $tests[] = array('object', 'Bar\Baz', array('Bar' => 'Foo\Bar')); + $tests[] = array('object', '\ReflectionClass', array('' => 'Foo')); + $tests[] = array('this', 'Foo'); + + return $tests; + } + + /** + * @dataProvider getTypesUnderTests + * @group typesUnder + */ + public function testGetTypesUnder($method, $a, $b, $expectedRestrictedA, $expectedRestrictedB, array $extends = array()) + { + $this->setUpInheritance($extends); + + $a = $this->registry->resolveType($a); + $b = $this->registry->resolveType($b); + + list($restrictedA, $restrictedB) = $a->{'getTypesUnder'.$method}($b); + + if (null === $expectedRestrictedA) { + $this->assertNull($restrictedA, sprintf('Expected null, but found type "%s".', $restrictedA)); + } else { + $this->assertNotNull($restrictedA); + + $expectedRestrictedA = $this->registry->resolveType($expectedRestrictedA); + $this->assertTrue($expectedRestrictedA->equals($restrictedA), sprintf('Failed to assert that expected type "%s" equals actual type "%s".', $expectedRestrictedA, $restrictedA)); + } + + if (null === $expectedRestrictedB) { + $this->assertNull($restrictedB, sprintf('Expected null, but found type "%s".', $restrictedB)); + } else { + $this->assertNotNull($restrictedB); + + $expectedRestrictedB = $this->registry->resolveType($expectedRestrictedB); + $this->assertTrue($expectedRestrictedB->equals($restrictedB), sprintf('Failed to assert that expected type "%s" equals actual type "%s".', $expectedRestrictedB, $restrictedB)); + } + } + + public function getTypesUnderTests() + { + // Available Comparisons: + // - Equality = loose comparison + // - Inequality = loose comparison + // - ShallowEquality = strict comparison + // - ShallowInequality = strict comparison + + // Structure + // Comparison (see above) | Type A | Type B | Restricted A | Restricted B | Inheritance + $tests = array(); + + $tests[] = array('Equality', 'false', 'false|object', 'false', 'false'); + $tests[] = array('Equality', 'false', 'false|object', 'false', 'false', array('B' => 'A')); + $tests[] = array('ShallowEquality', 'false', 'false|object', 'false', 'false'); + $tests[] = array('ShallowEquality', 'false', 'false|object', 'false', 'false', array('B' => 'A')); + $tests[] = array('Inequality', 'false', 'false|object', 'false', 'object'); + $tests[] = array('Inequality', 'false', 'false|object', 'false', 'object', array('B' => 'A')); + $tests[] = array('ShallowInequality', 'false', 'false|object', 'false', 'object'); + $tests[] = array('ShallowInequality', 'false', 'false|object', 'false', 'object', array('B' => 'A')); + + // true is not added here since at the moment, we regard true as a boolean, and do not have a true type. + foreach (array('false', 'null') as $nativeType) { + $tests[] = array('Equality', $nativeType, $nativeType, $nativeType, $nativeType); + $tests[] = array('ShallowEquality', $nativeType, $nativeType, $nativeType, $nativeType); + $tests[] = array('Inequality', $nativeType, $nativeType, null, null); + $tests[] = array('ShallowInequality', $nativeType, $nativeType, null, null); + } + + return $tests; + } + + public function testAddAttribute() + { + $type = $this->getAbstractType(); + $this->assertNotSame($type, $newType = $type->addAttribute('foo', 'bar')); + $this->assertSame($newType, $newType->addAttribute('foo', 'bar')); + $this->assertNotSame($newType, $newType->addAttribute('foo', 'moo')); + $this->assertNotSame($newType, $newType->addAttribute('bar', 'moo')); + } + + protected function setUp() + { + $this->registry = new TypeRegistry(); + } + + private function getAbstractType() + { + return $this->getMockBuilder('Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType') + ->setConstructorArgs(array($this->registry)) + ->getMockForAbstractClass(); + } + + private function setUpInheritance(array $extends = array()) + { + if ( ! $extends) { + return; + } + + foreach ($extends as $class => $extendedClass) { + if ($this->registry->hasClass($class)) { + continue; + } + + $this->setUpClass($class, $extends); + } + } + + private function setUpClass($class, array $extends) + { + $class = new Clazz($class); + if (isset($extends[$class->getName()])) { + $parentClass = $this->setUpClass($extends[$class->getName()], $extends); + $class->setSuperClasses(array_merge(array($parentClass->getName()), $parentClass->getSuperClasses())); + $class->setSuperClass($parentClass->getName()); + } + + $class->setNormalized(true); + $this->registry->registerClass($class); + + return $class; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/StringTypeTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/StringTypeTest.php new file mode 100644 index 0000000..6252252 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/StringTypeTest.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser\Type; + +class StringTypeTest extends BaseTypeTest +{ + private $string; + + public function testSheq1() + { + $types = $this->string->getTypesUnderShallowEquality($this->createNullableType('string')); + $this->assertTypeEquals('string', $types[0]); + $this->assertTypeEquals('string', $types[1]); + } + + public function testSheq2() + { + $types = $this->string->getTypesUnderShallowEquality($this->getType('string')); + $this->assertTypeEquals('string', $types[0]); + $this->assertTypeEquals('string', $types[1]); + } + + protected function setUp() + { + parent::setUp(); + + $this->string = $this->getType('string'); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/TypeCheckerTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/TypeCheckerTest.php new file mode 100644 index 0000000..93f60b4 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/TypeCheckerTest.php @@ -0,0 +1,87 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeChecker; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; + +class TypeCheckerTest extends \PHPUnit_Framework_TestCase +{ + private $typeRegistry; + private $checker; + + /** + * @dataProvider getMayBePassedTests + */ + public function testMayBePassed($expectedType, $actualType, $expectedOutcome, $level = 'lenient') + { + $this->checker->setLevel($level); + + $expectedType = $this->typeRegistry->resolveType($expectedType); + $actualType = $this->typeRegistry->resolveType($actualType); + + $this->assertSame($expectedOutcome, $this->checker->mayBePassed($expectedType, $actualType)); + } + + public function getMayBePassedTests() + { + $tests = array(); + + // Strict Tests + $tests[] = array('integer', 'integer', true, 'strict'); + $tests[] = array('integer', 'double', false, 'strict'); + $tests[] = array('integer', 'string', false, 'strict'); + + // TODO: This should be removed once we have support for parameterized types, and anonymous classes. + $tests[] = array('object', 'object', true, 'strict'); + + // Lenient Tests + $tests[] = array('integer', 'integer', true); + $tests[] = array('integer', 'double', true); + $tests[] = array('integer', 'string', true); + $tests[] = array('integer', 'double|null', true); + $tests[] = array('integer', 'string|null', true); + $tests[] = array('integer', 'array', false); + $tests[] = array('integer', 'double|array', false); + $tests[] = array('double|integer', 'integer', true); + $tests[] = array('double|integer', 'string', true); + $tests[] = array('integer|string', 'string', true); + $tests[] = array('string', 'integer', true); + $tests[] = array('string', 'double', true); + $tests[] = array('double', 'string', true); + $tests[] = array('double', 'integer', true); + + // Allow the generic array to be passed in place of more specific arrays in lenient mode. + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'integer', false); + $tests[] = array('array>', 'array', false); + $tests[] = array('array', 'array', true); + $tests[] = array('array', 'array>', true); + + return $tests; + } + + protected function setUp() + { + $this->typeRegistry = new TypeRegistry(); + $this->checker = new TypeChecker($this->typeRegistry); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/TypeRegistryTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/TypeRegistryTest.php new file mode 100644 index 0000000..125e63a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/TypeRegistryTest.php @@ -0,0 +1,246 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; + +class TypeRegistryTest extends BaseTypeTest +{ + /** + * @group resolve + */ + public function testResolveType() + { + $this->assertResolvedType( + $this->registry->getArrayType( + $this->getNative('string'), + $this->createUnionType($this->getNative('integer'), $this->getNative('string')) + ), + 'array' + ); + } + + /** + * @group resolve + */ + public function testResolveType1() + { + $this->assertResolvedType($this->getNative('boolean'), 'boolean'); + } + + /** + * @group resolve + */ + public function testResolveType2() + { + $type = $this->getNative('boolean'); + $this->assertSame($type, $this->registry->resolveType($type)); + } + + /** + * @group resolve + */ + public function testResolveType3() + { + $this->assertResolvedType($this->createUnionType($this->getNative('string'), $this->getNative('integer')), + 'string|integer'); + } + + /** + * @group resolve + */ + public function testResolveType4() + { + $union = $this->createUnionType($this->getNative('string'), $this->getNative('array'), $this->getNative('integer')); + $this->assertResolvedType($union, 'string|array|integer'); + } + + /** + * @group resolve + */ + public function testResolveType5() + { + $resolvedType = $this->registry->resolveType('unknown_checked'); + $this->assertSame($this->registry->getNativeType('unknown_checked'), $resolvedType); + $this->assertInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\Type\UnknownType', $resolvedType); + $this->assertTrue($resolvedType->isChecked()); + } + + /** + * @group resolve + */ + public function testResolveType6() + { + $resolvedType = $this->registry->resolveType('array{"not_empty":false}'); + + $this->assertInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\Type\ArrayType', $resolvedType); + $this->assertTrue($resolvedType->getItemType('foo')->isDefined()); + $this->assertTypeEquals('false', $resolvedType->getItemType('foo')->get()); + $this->assertFalse($resolvedType->getAttribute('not_empty')); + } + + /** + * @group resolve + */ + public function testResolveWithAttributes() + { + $type = $this->getNative('string')->addAttribute('not_empty', true); + $this->assertResolvedType($type, 'string{"not_empty":true}'); + } + + /** + * @group resolve + */ + public function testResolveWithAttributes2() + { + $type = $this->getNative('string')->addAttribute('foo', array('bar' => 'baz')); + $this->assertResolvedType($type, 'string{"foo":{"bar":"baz"}}'); + } + + /** + * @group resolve + */ + public function testResolveWithAttributes3() + { + $type = $this->createUnionType( + $this->getNative('string')->addAttribute('not_empty', true), + $this->getNative('integer')->addAttribute('not_zero', true), + $this->getNative('boolean')); + $this->assertResolvedType($type, 'string{"not_empty":true}|integer{"not_zero":true}|boolean'); + } + + /** + * @group resolve + * @dataProvider getInvalidTypes + */ + public function testResolveTypeWithInvalidType($type, $expectedException, $expectedMessage) + { + $this->setExpectedException($expectedException, $expectedMessage); + $this->resolveType($type); + } + + public function getInvalidTypes() + { + return array( + array('foo', 'RuntimeException', 'There is no native type named "foo".'), + array('boolean', 'RuntimeException', 'The type "boolean" cannot have any parameters.'), + array('array', 'JMS\Parser\SyntaxErrorException', 'Expected any of T_TYPENAME or T_FALSE or T_NULL or T_OPEN_BRACE, but got ">" of type T_CLOSE_ANGLE_BRACKET at position 14 (0-based).'), + array('object<>', 'JMS\Parser\SyntaxErrorException', 'Expected any of T_TYPENAME or T_FALSE or T_NULL or T_OPEN_BRACE, but got ">" of type T_CLOSE_ANGLE_BRACKET at position 7 (0-based).'), + array('integer,boolean', 'JMS\Parser\SyntaxErrorException', 'Expected end of input, but got "," of type T_COMMA at position 7 (0-based).'), + ); + } + + public function testResolveNamedTypes() + { + $this->registry->getClassOrCreate('Foo'); + $this->registry->getClassOrCreate('Bar'); + $this->registry->getClassOrCreate('Baz'); + $this->registry->getClassOrCreate('FooBar'); + + $foo = new \Scrutinizer\PhpAnalyzer\Model\Clazz('foo'); + $this->registry->registerClass($foo); + $registry = $this->registry; + + $this->provider->expects($this->at(0)) + ->method('loadClasses') + ->with(array('bar', 'baz', 'foobar')) + ->will($this->returnCallback(function($classes) use ($registry) { + $registry->getClassOrCreate('Moo', TypeRegistry::LOOKUP_NO_CACHE); + + $bar = new \Scrutinizer\PhpAnalyzer\Model\Clazz('bar'); + $baz = new \Scrutinizer\PhpAnalyzer\Model\Clazz('Baz'); + + return array('bar' => $bar, 'baz' => $baz); + })); + + $this->provider->expects($this->at(1)) + ->method('loadClasses') + ->with(array('moo')) + ->will($this->returnCallback(function($classes) use ($registry) { + $registry->getClassOrCreate('foobOOH', TypeRegistry::LOOKUP_NO_CACHE); + + $moo = new \Scrutinizer\PhpAnalyzer\Model\Clazz('Moo'); + + return array('moo' => $moo); + })); + + $this->provider->expects($this->at(2)) + ->method('loadClasses') + ->with(array('foobooh')) + ->will($this->returnCallback(function($classes) { + return array(); + })); + + $this->registry->resolveNamedTypes(); + } + + public function testGetClass() + { + $this->registry->registerClass($foo = new \Scrutinizer\PhpAnalyzer\Model\Clazz('Foo')); + $this->assertSame($foo, $this->registry->getClass('foo')); + $this->assertSame($foo, $this->registry->getClass('FoO')); + + $this->registry->getClassOrCreate('Foo\Bar'); + $this->assertNull($this->registry->getClass('FoO\BAR')); + $this->assertNull($this->registry->getClass('Foo\Bar')); + } + + public function testGetClassOrCreate() + { + $this->registry->registerClass($foo = new \Scrutinizer\PhpAnalyzer\Model\Clazz('Foo\Foo')); + $this->assertSame($foo, $this->registry->getClassOrCreate('FoO\FOO')); + $this->assertSame($foo, $this->registry->getClassOrCreate('Foo\Foo')); + + $bar = $this->registry->getClassOrCreate('Bar\Foo'); + $this->assertSame($bar, $this->registry->getClassOrCreate('BAR\FoO')); + $this->assertSame($bar, $this->registry->getClassOrCreate('Bar\Foo')); + } + + public function testHasClass() + { + $this->registry->registerClass($foo = new \Scrutinizer\PhpAnalyzer\Model\Clazz('Foo')); + $this->assertTrue($this->registry->hasClass('FoO')); + $this->assertTrue($this->registry->hasClass('Foo')); + + $this->registry->getClassOrCreate('Bar'); + $this->assertFalse($this->registry->hasClass('BaR')); + $this->assertFalse($this->registry->hasClass('Bar')); + } + + public function testGetFunction() + { + $this->registry->registerFunction($foo = new \Scrutinizer\PhpAnalyzer\Model\GlobalFunction('foo')); + $this->assertSame($foo, $this->registry->getFunction('FOo')); + $this->assertSame($foo, $this->registry->getFunction('foo')); + } + + public function testHasFunction() + { + $this->registry->registerFunction($foo = new \Scrutinizer\PhpAnalyzer\Model\GlobalFunction('Foo')); + $this->assertTrue($this->registry->hasFunction('foo')); + $this->assertTrue($this->registry->hasFunction('FoO')); + } + + private function assertResolvedType($expectedType, $typeToResolve) + { + $resolvedType = $this->registry->resolveType($typeToResolve); + $this->assertTrue($expectedType->equals($resolvedType), 'Expected '.$expectedType.', but got '.$resolvedType.'.'); + $this->assertEquals($expectedType->getAttributes(), $resolvedType->getAttributes()); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/UnionTypeBuilderTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/UnionTypeBuilderTest.php new file mode 100644 index 0000000..6a86c35 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/UnionTypeBuilderTest.php @@ -0,0 +1,105 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\NamedType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\ThisType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\UnionTypeBuilder; +use Scrutinizer\PhpAnalyzer\Model\Clazz; + +class UnionTypeBuilderTest extends BaseTypeTest +{ + public function testAllType() + { + $this->assertUnion('*', 'all'); + $this->assertUnion('*', 'number', 'all'); + $this->assertUnion('*', 'all', 'number'); + $this->assertUnion('*', 'all', 'integer', 'none'); + } + + public function testEmptyUnion() + { + $this->assertUnion('NoType'); + $this->assertUnion('NoType', 'none', 'none'); + } + + public function testUnionTypes() + { + $this->assertUnion('*', 'all', 'string|object'); + $this->assertUnion('object|string', 'object', 'string|object'); + $this->assertUnion('string|object', 'string|object', 'object'); + $this->assertUnion('object|string|integer|double', 'object|string', 'number'); + } + + public function testUnknownTypes() + { + $this->assertUnion('?', 'unknown'); + $this->assertUnion('?', 'unknown', 'unknown'); + $this->assertUnion('?', 'unknown', $this->registry->getClassOrCreate('FooBar')); + $this->assertUnion('?', 'unknown', 'null'); + $this->assertUnion('?', 'unknown', 'array|null'); + } + + public function testObjectTypes() + { + $class = new \Scrutinizer\PhpAnalyzer\Model\Clazz('Foo'); + $class->setNormalized(true); + $this->registry->registerClass($class); + + $this->assertUnion('object', new NamedType($this->registry, 'Foo'), $class); + + $named = new NamedType($this->registry, 'Foo'); + $named->setReferencedType($class); + $this->assertUnion('object', $named, $class); + } + + public function testNullableThisType() + { + $class = new Clazz('Foo'); + $class->setNormalized(true); + $this->registry->registerClass($class); + + $builder = new UnionTypeBuilder($this->registry); + $this->assertCount(0, $builder->getAlternates()); + + $builder->addAlternate($this->registry->getNativeType('null')); + $this->assertCount(1, $builder->getAlternates()); + + $builder->addAlternate(new ThisType($this->registry, $class)); + $this->assertCount(2, $builder->getAlternates()); + + $type = $builder->build(); + $this->assertInstanceOf('Scrutinizer\PhpAnalyzer\PhpParser\Type\UnionType', $type); + } + + private function assertUnion($expected) + { + $builder = new UnionTypeBuilder($this->registry); + + $types = func_get_args(); + $types = array_splice($types, 1); + + foreach ($types as $type) { + $type = $this->resolveType($type); + $builder->addAlternate($type); + } + + $this->assertEquals($expected, (string) $builder->build()); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/UnionTypeTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/UnionTypeTest.php new file mode 100644 index 0000000..9c71aa7 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/PhpParser/Type/UnionTypeTest.php @@ -0,0 +1,52 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser\Type; + +use Scrutinizer\PhpAnalyzer\PhpParser\Type\PhpType; +use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; + +class UnionTypeTest extends \PHPUnit_Framework_TestCase +{ + /** + * @dataProvider getEqualsTests + */ + public function testEquals(PhpType $a, PhpType $b, $expectedOutcome) + { + $this->assertSame($expectedOutcome, $a->equals($b)); + } + + public function getEqualsTests() + { + $registry = new TypeRegistry(); + + $tests = array(); + $tests[] = array( + $registry->createUnionType(array('integer', 'string')), + $registry->createUnionType(array('string', 'integer')), + true + ); + $tests[] = array( + $registry->createUnionType(array('number', 'string')), + $registry->createUnionType(array('string', 'number')), + true + ); + + return $tests; + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/StubsTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/StubsTest.php new file mode 100644 index 0000000..53c294f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/StubsTest.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\Tests\PhpAnalyzer\PhpParser; + +use Scrutinizer\PhpAnalyzer\Util\TestUtils; + +class StubsTest extends \PHPUnit_Framework_TestCase +{ + private $em; + + public function testDateIntervalHasProperties() + { + foreach (array('y', 'm', 'd', 'h', 'i', 's', 'invert', 'days') as $name) { + $this->assertClassHasProperty('DateInterval', $name); + } + } + + private function assertClassHasProperty($className, $propertyName) + { + $class = $this->em->createQuery("SELECT c FROM Scrutinizer\PhpAnalyzer\Model\MethodContainer c WHERE c.name = :name") + ->setParameter('name', $className) + ->getOneOrNullResult(); + $this->assertNotNull($class, sprintf('The class "%s" did not exist.', $className)); + $this->assertTrue($class->hasProperty($propertyName), sprintf('The class "%s" does not have the property "%s".', $className, $propertyName)); + } + + protected function setUp() + { + $this->em = TestUtils::createTestEntityManager(); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-comments.txt b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-comments.txt new file mode 100644 index 0000000..ae4d863 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-comments.txt @@ -0,0 +1,123 @@ +schmittjoh-cg-library-c4bebbe/src/CG/Core/AbstractClassGenerator.php +--------------------------------------------------- +Line 55: php_doc.return_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/src/CG/Core/DefaultGeneratorStrategy.php +--------------------------------------------------- +Line 65: typos.non_existent_method +Line 60: php_doc.return_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/src/CG/Core/GeneratorStrategyInterface.php +--------------------------------------------------- +Line 33: php_doc.return_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/src/CG/Generator/AbstractPhpMember.php +--------------------------------------------------- +Line 37: php_doc.param_type_all_type_non_commented + +schmittjoh-cg-library-c4bebbe/src/CG/Generator/DefaultVisitor.php +--------------------------------------------------- +Line 103: php_doc.param_type_all_type_non_commented +Line 210: php_doc.param_type_array_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/src/CG/Generator/DefaultVisitorInterface.php +--------------------------------------------------- +Line 49: php_doc.param_type_all_type_non_commented + +schmittjoh-cg-library-c4bebbe/src/CG/Generator/GeneratorUtils.php +--------------------------------------------------- +Line 33: suspicious_code.assignment_to_parameter +Line 30: php_doc.param_type_array_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpClass.php +--------------------------------------------------- +Line 177: suspicious_code.assignment_to_parameter +Line 242: suspicious_code.assignment_to_parameter +Line 254: suspicious_code.assignment_to_parameter +Line 285: suspicious_code.assignment_to_parameter +Line 297: suspicious_code.assignment_to_parameter +Line 46: php_doc.param_type_all_type_non_commented +Line 104: php_doc.param_type_all_type_non_commented +Line 129: php_doc.param_type_array_type_not_inferrable +Line 146: php_doc.param_type_array_type_not_inferrable +Line 163: php_doc.param_type_array_type_not_inferrable +Line 185: php_doc.param_type_array_type_not_inferrable +Line 203: php_doc.param_type_all_type_non_commented +Line 222: php_doc.param_type_array_type_not_inferrable +Line 265: php_doc.param_type_array_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpFunction.php +--------------------------------------------------- +Line 35: php_doc.param_type_all_type_non_commented +Line 40: php_doc.param_type_all_type_non_commented +Line 65: php_doc.param_type_array_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpMethod.php +--------------------------------------------------- +Line 116: php_doc.param_type_array_type_not_inferrable +Line 130: php_doc.param_type_all_type_non_commented +Line 133: usage.argument_type_mismatch +Line 132: usage.argument_type_mismatch + +schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpParameter.php +--------------------------------------------------- +Line 63: php_doc.param_type_all_type_non_commented +Line 78: php_doc.param_type_all_type_non_commented + +schmittjoh-cg-library-c4bebbe/src/CG/Proxy/Enhancer.php +--------------------------------------------------- +Line 46: php_doc.param_type_array_type_not_inferrable +Line 60: php_doc.param_type_array_element_type +Line 76: php_doc.param_type_all_type_non_commented + +schmittjoh-cg-library-c4bebbe/src/CG/Proxy/InterceptionGenerator.php +--------------------------------------------------- +Line 44: php_doc.param_type_all_type_non_commented + +schmittjoh-cg-library-c4bebbe/src/CG/Proxy/LazyInitializerGenerator.php +--------------------------------------------------- +Line 85: typos.non_existent_method +Line 84: typos.non_existent_method +Line 139: typos.misspelled_method_name +Line 131: php_doc.param_type_array_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/src/CG/Proxy/MethodInterceptorInterface.php +--------------------------------------------------- +Line 38: php_doc.return_type_all_type_more_specific + +schmittjoh-cg-library-c4bebbe/src/CG/Proxy/MethodInvocation.php +--------------------------------------------------- +Line 41: php_doc.param_type_all_type_non_commented +Line 41: php_doc.param_type_array_type_not_inferrable +Line 53: php_doc.return_type_all_type_more_specific + +schmittjoh-cg-library-c4bebbe/src/CG/Proxy/RegexInterceptionLoader.php +--------------------------------------------------- +Line 25: php_doc.param_type_array_type_not_inferrable +Line 44: php_doc.return_type_not_inferrable +Line 44: php_doc.param_type_all_type_non_commented + +schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Core/ReflectionUtilsTest.php +--------------------------------------------------- +Line 37: coding_style.naming +Line 42: php_doc.return_type_not_inferrable +Line 46: php_doc.return_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/AbstractPhpMemberTest.php +--------------------------------------------------- +Line 54: php_doc.return_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Proxy/EnhancerTest.php +--------------------------------------------------- +Line 16: php_doc.param_type_all_type_non_commented +Line 16: php_doc.param_type_array_type_not_inferrable +Line 68: php_doc.return_type_not_inferrable +Line 68: php_doc.param_type_array_type_not_inferrable +Line 91: php_doc.return_type_not_inferrable +Line 113: php_doc.return_type_not_inferrable + +schmittjoh-cg-library-c4bebbe/tests/bootstrap.php +--------------------------------------------------- +Line 19: suspicious_code.assignment_to_parameter +Line 26: suspicious_code.assignment_to_parameter + diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-config.json b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-config.json new file mode 100644 index 0000000..c8cceb6 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-config.json @@ -0,0 +1,5 @@ +{ + "filter": { + "excluded_paths": ["schmittjoh-cg-library-c4bebbe/tests/*/Fixture/*", "schmittjoh-cg-library-c4bebbe/tests/*/generated/*"] + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Core/ClassGeneratorInterface.php.diff b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Core/ClassGeneratorInterface.php.diff new file mode 100644 index 0000000..cf557f1 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Core/ClassGeneratorInterface.php.diff @@ -0,0 +1,9 @@ +@@ -18,8 +18,6 @@ + + namespace CG\Core; + +-use CG\Generator\PhpClass; +- + /** + * Interface for class generators. + * diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpClass.php.diff b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpClass.php.diff new file mode 100644 index 0000000..ca9290a --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpClass.php.diff @@ -0,0 +1,8 @@ +@@ -19,7 +19,6 @@ + namespace CG\Generator; + + use Doctrine\Common\Annotations\PhpParser; +- + use CG\Core\ReflectionUtils; + + /** diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpParameter.php.diff b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpParameter.php.diff new file mode 100644 index 0000000..1139257 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpParameter.php.diff @@ -0,0 +1,10 @@ +@@ -75,6 +75,9 @@ class PhpParameter + return $this; + } + ++ /** ++ * @param string $value ++ */ + public function setDefaultValue($value) + { + $this->defaultValue = $value; diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Proxy/Enhancer.php.diff b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Proxy/Enhancer.php.diff new file mode 100644 index 0000000..cd0033b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Proxy/Enhancer.php.diff @@ -0,0 +1,8 @@ +@@ -19,7 +19,6 @@ + namespace CG\Proxy; + + use CG\Core\NamingStrategyInterface; +- + use CG\Generator\Writer; + use CG\Generator\PhpMethod; + use CG\Generator\PhpClass; diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Proxy/InterceptionGenerator.php.diff b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Proxy/InterceptionGenerator.php.diff new file mode 100644 index 0000000..a821b6e --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Proxy/InterceptionGenerator.php.diff @@ -0,0 +1,10 @@ +@@ -19,9 +19,7 @@ + namespace CG\Proxy; + + use CG\Core\ClassUtils; +- + use CG\Core\ReflectionUtils; +- + use CG\Generator\PhpParameter; + use CG\Generator\PhpProperty; + use CG\Generator\PhpMethod; diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Core/DefaultGeneratorStrategyTest.php.diff b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Core/DefaultGeneratorStrategyTest.php.diff new file mode 100644 index 0000000..9195bbc --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Core/DefaultGeneratorStrategyTest.php.diff @@ -0,0 +1,8 @@ +@@ -3,7 +3,6 @@ + namespace CG\Tests\Core; + + use CG\Core\DefaultGeneratorStrategy; +- + use CG\Generator\PhpProperty; + use CG\Generator\PhpMethod; + use CG\Generator\PhpClass; diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpClassTest.php.diff b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpClassTest.php.diff new file mode 100644 index 0000000..2454ad8 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpClassTest.php.diff @@ -0,0 +1,8 @@ +@@ -3,7 +3,6 @@ + namespace CG\Tests\Generator; + + use CG\Generator\PhpProperty; +- + use CG\Generator\PhpParameter; + use CG\Generator\PhpMethod; + use CG\Generator\PhpClass; diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpFunctionTest.php.diff b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpFunctionTest.php.diff new file mode 100644 index 0000000..2c2491f --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpFunctionTest.php.diff @@ -0,0 +1,8 @@ +@@ -3,7 +3,6 @@ + namespace CG\Tests\Generator; + + use CG\Generator\PhpParameter; +- + use CG\Generator\PhpFunction; + + class PhpFunctionTest extends \PHPUnit_Framework_TestCase diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpMethodTest.php.diff b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpMethodTest.php.diff new file mode 100644 index 0000000..f79219c --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Generator/PhpMethodTest.php.diff @@ -0,0 +1,8 @@ +@@ -3,7 +3,6 @@ + namespace CG\Tests\Generator; + + use CG\Generator\PhpParameter; +- + use CG\Generator\PhpMethod; + + class PhpMethodTest extends \PHPUnit_Framework_TestCase diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Proxy/EnhancerTest.php.diff b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Proxy/EnhancerTest.php.diff new file mode 100644 index 0000000..5b73ef5 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/tests/CG/Tests/Proxy/EnhancerTest.php.diff @@ -0,0 +1,8 @@ +@@ -87,6 +87,7 @@ class EnhancerTest extends \PHPUnit_Framework_TestCase + + /** + * @param string $name ++ * @return null|\CG\Core\NamingStrategyInterface + */ + private function getNamingStrategy($name) + { diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library.zip b/tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library.zip new file mode 100644 index 0000000000000000000000000000000000000000..32141d0c945504cf239ff8aa9223406896871130 GIT binary patch literal 54883 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'Scrutinizer', __DIR__); +AnnotationRegistry::registerLoader('class_exists'); + +assert_options(ASSERT_BAIL); \ No newline at end of file From 23ca124968514f1e6e0063f0532e852970388f5c Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 4 Mar 2013 12:09:37 +0100 Subject: [PATCH 02/62] adds a warning if xdebug is enabled --- src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php index f37166e..b065a42 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -46,12 +46,18 @@ protected function execute(InputInterface $input, OutputInterface $output) } $dir = realpath($dir); - $output->writeln('Caution: This command is currently only designed for small libraries; it might be slow and/or memory expensive to analyze bigger libraries.'); + if (extension_loaded('xdebug')) { + $output->writeln('It is highly recommended to disable the XDebug extension before invoking this command.'); + } $output->write('Scanning directory... '); $files = FileCollection::createFromDirectory($dir); $output->writeln(sprintf('found %d files', count($files))); + if (count($files) > 100) { + $output->writeln('Caution: You are trying to scan a lot of files; this might be slow. For bigger libraries, consider setting up a dedicated platform or using scrutinizer-ci.com.'); + } + $output->writeln('Starting analysis...'); $analyzer = Analyzer::create(TestUtils::createTestEntityManager()); $analyzer->setLogger(new OutputLogger($output, $input->getOption('verbose'))); From 13b23160e31ad3818c460d1eb290e13eeff4326d Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 4 Mar 2013 12:19:00 +0100 Subject: [PATCH 03/62] adds travis ci --- .travis.yml | 13 +++++++++++++ phpunit.xml.dist | 10 ++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..5548e02 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,13 @@ +language: php + +php: + - 5.4 + +before_script: + - curl -s http://getcomposer.org/installer | php + - php composer.phar install --dev + - mysql -uroot -e "CREATE DATABASE php_analyzer CHARACTER SET utf8 COLLATE utf8_general_ci" + - "sed -i 's/<\!--//g' phpunit.xml.dist" + - "sed -i 's/-->//g' phpunit.xml.dist" + +script: phpunit diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 16a143c..87c7efc 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -13,10 +13,12 @@ > - - - - + From 62074238ff7294f5428ffa51e66ab6348a6432e1 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 4 Mar 2013 12:46:47 +0100 Subject: [PATCH 04/62] fixes travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5548e02..717dad9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ before_script: - curl -s http://getcomposer.org/installer | php - php composer.phar install --dev - mysql -uroot -e "CREATE DATABASE php_analyzer CHARACTER SET utf8 COLLATE utf8_general_ci" - - "sed -i 's/<\!--//g' phpunit.xml.dist" + - "sed -i 's/<\\!--//g' phpunit.xml.dist" - "sed -i 's/-->//g' phpunit.xml.dist" script: phpunit From 294691d84acbd3ee19c83b2154e5813f983a48f0 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 4 Mar 2013 13:02:16 +0100 Subject: [PATCH 05/62] fixes build-test-database command --- .travis.yml | 1 + res/test_database.sqlite | Bin 1096704 -> 1742848 bytes .../Command/BuildTestDatabaseCommand.php | 8 ++++---- .../PhpAnalyzer/Command/RunCommand.php | 3 ++- .../Model/Repository/EntityTypeProvider.php | 11 +++++++++-- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 717dad9..6e4e2c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ php: before_script: - curl -s http://getcomposer.org/installer | php - php composer.phar install --dev + - php bin/phpalizer build-test-database --verbose - mysql -uroot -e "CREATE DATABASE php_analyzer CHARACTER SET utf8 COLLATE utf8_general_ci" - "sed -i 's/<\\!--//g' phpunit.xml.dist" - "sed -i 's/-->//g' phpunit.xml.dist" diff --git a/res/test_database.sqlite b/res/test_database.sqlite index 7567159a445e07544794d3ec1865c012f36aa12d..4071627a6fbf86602fe633d81e28359f0ae608b7 100644 GIT binary patch literal 1742848 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

    iCt%dQj>+~{pMmGl|`8E%e@R<(1e*>dC0X$ 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

    kEp*j^XZ7)A&ah5SUQrhkKI~8Raog*7; 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 gkq#O$UqKIiIUK@P_U#Wdo}N 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

    M1Q2kQ5HuN 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%0D1f2p{&Lsgi$06wP+|U_YG7$ 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⩔waV+5yZNtI-k`jZd4T^W=7Ij3nFslA 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

    c_D6=eO1%ME{)wt^U4<1#kwe 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ν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
    L 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 literal 1096704 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

    ?<{fr6ds?1zbE1CN%(pao}PrC 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 kst7<$0% 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�YlV|qgxItjXFaY1p|sGVqcvE#% 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

    RYv{4jQsz|Fgt<4?tOrxH0Lcj|BD8vKY~065-+C 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 diff --git a/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php index bf400bf..cc509c6 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php @@ -51,14 +51,14 @@ protected function execute(InputInterface $input, OutputInterface $output) $analyzer = Analyzer::create($em, PassConfig::createForTypeScanning()); $packageScanner = new PackageScanner($analyzer); - $output->write('Scanning PHP 5.3 files... '); + $output->write('Scanning PHP 5.4 files... '); $package = new Package('PHP'); - $packageVersion = $package->createVersion('5.3'); + $packageVersion = $package->createVersion('5.4'); $packageVersion->setUuid(uniqid(mt_rand(), true)); - $packageScanner->scanDirectory($packageVersion, __DIR__.'/../res/php-5.3-core-api'); + $packageScanner->scanDirectory($packageVersion, __DIR__.'/../../../../res/php-5.4-core-api'); $output->writeln('Done'); - $output->write('Persisting PHP 5.3 files... '); + $output->write('Persisting PHP 5.4 files... '); $em->persist($package); $em->flush(); $output->writeln('Done'); diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php index b065a42..f3b7f5f 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -59,8 +59,9 @@ protected function execute(InputInterface $input, OutputInterface $output) } $output->writeln('Starting analysis...'); - $analyzer = Analyzer::create(TestUtils::createTestEntityManager()); + $analyzer = Analyzer::create($em = TestUtils::createTestEntityManager()); $analyzer->setLogger(new OutputLogger($output, $input->getOption('verbose'))); + $analyzer->setRootPackageVersion($em->getRepository('PhpAnalyzer:PackageVersion')->getPackageVersion('PHP', '5.4')); $analyzer->analyze($files); $output->writeln('---------------------------------------------'); $output->writeln(''); diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Repository/EntityTypeProvider.php b/src/Scrutinizer/PhpAnalyzer/Model/Repository/EntityTypeProvider.php index 64faf3f..2dcd559 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/Repository/EntityTypeProvider.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/Repository/EntityTypeProvider.php @@ -214,19 +214,26 @@ public function loadConstant($name) return null; } - private function addPackageCondition(QueryBuilder $qb, $alias) { - if (null === $this->packageVersions) { + if (null === $this->packageVersions ) { return; } $packages = array(); foreach ($this->packageVersions as $packageVersion) { + if ($packageVersion->getId() === null) { + continue; + } + $packages[] = $qb->expr()->eq($alias.'.packageVersion', ':package'.($i = count($packages))); $qb->setParameter('package'.$i, $packageVersion); } + if (empty($packages)) { + return; + } + $qb->andWhere(call_user_func_array(array($qb->expr(), 'orX'), $packages)); } } \ No newline at end of file From eeb8f0e38a15e665023c8fc890b5ac321723fc3d Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 4 Mar 2013 13:20:22 +0100 Subject: [PATCH 06/62] adds more verbose output for building the test database to avoid timeouts on travis --- res/test_database.sqlite | Bin 1742848 -> 75776 bytes .../Command/BuildTestDatabaseCommand.php | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/res/test_database.sqlite b/res/test_database.sqlite index 4071627a6fbf86602fe633d81e28359f0ae608b7..0c078ff56c84a6739ee1e562b02d9d2a174ce001 100644 GIT binary patch delta 158 zcmZqJkkxR3Wr8%T4Fdy%*F*(-Mw^WZ3&a<7uuQ69+sr2Oi+u_s%VL%mp2aK`ESp(O z{xEN9U=!HP=JAVp5sL^|8BjU}C^hAe@S++Wn8r0g`4*l{%VyR;|Cu+lwEW?QDBsQ|!uSs;!19M50BA=#Q2+n{ literal 1742848 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

    iCt%dQj>+~{pMmGl|`8E%e@R<(1e*>dC0X$ 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

    kEp*j^XZ7)A&ah5SUQrhkKI~8Raog*7; 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 gkq#O$UqKIiIUK@P_U#Wdo}N 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

    M1Q2kQ5HuN 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%0D1f2p{&Lsgi$06wP+|U_YG7$ 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⩔waV+5yZNtI-k`jZd4T^W=7Ij3nFslA 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

    c_D6=eO1%ME{)wt^U4<1#kwe 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ν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
    L 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 diff --git a/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php index cc509c6..989bd8a 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php @@ -50,13 +50,14 @@ protected function execute(InputInterface $input, OutputInterface $output) $analyzer = Analyzer::create($em, PassConfig::createForTypeScanning()); $packageScanner = new PackageScanner($analyzer); + $packageScanner->setLogger(new OutputLogger($output, $input->getOption('verbose'))); - $output->write('Scanning PHP 5.4 files... '); + $output->writeln('Scanning PHP 5.4 files... '); $package = new Package('PHP'); $packageVersion = $package->createVersion('5.4'); $packageVersion->setUuid(uniqid(mt_rand(), true)); $packageScanner->scanDirectory($packageVersion, __DIR__.'/../../../../res/php-5.4-core-api'); - $output->writeln('Done'); + $output->writeln('Files scanned.'); $output->write('Persisting PHP 5.4 files... '); $em->persist($package); From ae7743d8654ae48cf981efcb2bb34c90ede1044b Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Mon, 4 Mar 2013 13:29:53 +0100 Subject: [PATCH 07/62] Refactored output formatting to allow XML output. --- .../PhpAnalyzer/Command/OutputFormatter.php | 29 ++++++++ .../Command/OutputFormatter/TextFormatter.php | 57 ++++++++++++++++ .../Command/OutputFormatter/XmlFormatter.php | 68 +++++++++++++++++++ .../PhpAnalyzer/Command/RunCommand.php | 36 +++------- 4 files changed, 165 insertions(+), 25 deletions(-) create mode 100644 src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/TextFormatter.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/XmlFormatter.php diff --git a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter.php b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter.php new file mode 100644 index 0000000..c7d14fc --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter.php @@ -0,0 +1,29 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Command; + +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Controls the output format of the analyzer. + */ +interface OutputFormatter +{ + public function write(OutputInterface $output, $fileCollection); +} diff --git a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/TextFormatter.php b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/TextFormatter.php new file mode 100644 index 0000000..8ded2e5 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/TextFormatter.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Command\OutputFormatter; + +use Scrutinizer\PhpAnalyzer\Command\OutputFormatter; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Format the output of PhpAnalyzer as human readable text. + */ +class TextFormatter implements OutputFormatter +{ + public function write(OutputInterface $output, $fileCollection) + { + $output->writeln('---------------------------------------------'); + $output->writeln(''); + + foreach ($fileCollection as $file) { + /** @var $file File */ + + if ( ! $file->hasComments()) { + continue; + } + + $output->writeln(''); + $output->writeln($file->getName()); + $output->writeln(str_repeat('=', strlen($file->getName()))); + + $comments = $file->getComments(); + ksort($comments); + + foreach ($comments as $line => $lineComments) { + foreach ($lineComments as $comment) { + $output->writeln('Line '.$line.': '.$comment); + } + } + } + + $output->writeln(''); + $output->writeln('Done'); + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/XmlFormatter.php b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/XmlFormatter.php new file mode 100644 index 0000000..9f076cf --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/XmlFormatter.php @@ -0,0 +1,68 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Scrutinizer\PhpAnalyzer\Command\OutputFormatter; + +use Scrutinizer\PhpAnalyzer\Command\OutputFormatter; +use Symfony\Component\Console\Output\OutputInterface; + +use DOMDocument; + +/** + * Format the output with XML (machine readable) + */ +class XmlFormatter implements OutputFormatter +{ + public function write(OutputInterface $output, $fileCollection) + { + $dom = new DOMDocument('1.0', 'UTF-8'); + + $root = $dom->createElement('analyzer'); + $root->setAttribute('timestamp', time()); + + $dom->appendChild($root); + + foreach ($fileCollection as $file) { + /** @var $file File */ + + if ( ! $file->hasComments()) { + continue; + } + + $fileElement = $dom->createElement('file'); + $fileElement->setAttribute('comments', count($file->getComments())); + $root->appendChild($fileElement); + + $comments = $file->getComments(); + ksort($comments); + + foreach ($comments as $line => $lineComments) { + foreach ($lineComments as $comment) { + $commentElement = $dom->createElement('comment', $comment); + $commentElement->setAttribute('line', $line); + + $fileElement->appendChild($commentElement); + } + } + } + + $dom->formatOutput = true; + + $output->writeln($dom->saveXML()); + } +} + diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php index f37166e..ce2d8ac 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -24,6 +24,7 @@ use Scrutinizer\PhpAnalyzer\Util\TestUtils; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -35,6 +36,7 @@ protected function configure() ->setName('run') ->setDescription('Runs the PHP Analyzer on source code.') ->addArgument('dir', InputArgument::REQUIRED, 'The directory to scan.') + ->addOption('format', 'f', InputOption::VALUE_REQUIRED, 'The output format ("text", "xml")', 'text') ; } @@ -56,31 +58,15 @@ protected function execute(InputInterface $input, OutputInterface $output) $analyzer = Analyzer::create(TestUtils::createTestEntityManager()); $analyzer->setLogger(new OutputLogger($output, $input->getOption('verbose'))); $analyzer->analyze($files); - $output->writeln('---------------------------------------------'); - $output->writeln(''); - foreach ($files as $file) { - /** @var $file File */ - - if ( ! $file->hasComments()) { - continue; - } - - $output->writeln(''); - $output->writeln($file->getName()); - $output->writeln(str_repeat('=', strlen($file->getName()))); - - $comments = $file->getComments(); - ksort($comments); - - foreach ($comments as $line => $lineComments) { - foreach ($lineComments as $comment) { - $output->writeln('Line '.$line.': '.$comment); - } - } + switch ($input->getOption('format')) { + case 'xml': + $formatter = new OutputFormatter\XmlFormatter(); + break; + case 'text': + default: + $formatter = new OutputFormatter\TextFormatter(); } - - $output->writeln(''); - $output->writeln('Done'); + $formatter->write($output, $files); } -} \ No newline at end of file +} From 221ceaffaca85cbf1ca170de2ed401c99de98d23 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 4 Mar 2013 13:31:16 +0100 Subject: [PATCH 08/62] fixes a regression on the run command (closes #8) --- src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php index f3b7f5f..13d0d1d 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -61,7 +61,6 @@ protected function execute(InputInterface $input, OutputInterface $output) $output->writeln('Starting analysis...'); $analyzer = Analyzer::create($em = TestUtils::createTestEntityManager()); $analyzer->setLogger(new OutputLogger($output, $input->getOption('verbose'))); - $analyzer->setRootPackageVersion($em->getRepository('PhpAnalyzer:PackageVersion')->getPackageVersion('PHP', '5.4')); $analyzer->analyze($files); $output->writeln('---------------------------------------------'); $output->writeln(''); From 1df53dc021d99bef790a21469aa19ee6e580cbf6 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 4 Mar 2013 13:32:00 +0100 Subject: [PATCH 09/62] avoid rebuilding class cache on Travis machines --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6e4e2c3..717dad9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,6 @@ php: before_script: - curl -s http://getcomposer.org/installer | php - php composer.phar install --dev - - php bin/phpalizer build-test-database --verbose - mysql -uroot -e "CREATE DATABASE php_analyzer CHARACTER SET utf8 COLLATE utf8_general_ci" - "sed -i 's/<\\!--//g' phpunit.xml.dist" - "sed -i 's/-->//g' phpunit.xml.dist" From c33d469ad9a0f2428365cdfd6f02647dd4f6c6df Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 4 Mar 2013 13:59:41 +0100 Subject: [PATCH 10/62] reverts test database to 5.3 core api --- res/test_database.sqlite | Bin 75776 -> 1097728 bytes .../Command/BuildTestDatabaseCommand.php | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/res/test_database.sqlite b/res/test_database.sqlite index 0c078ff56c84a6739ee1e562b02d9d2a174ce001..e8c359cccf9e6d263fa6714d85098412899d87de 100644 GIT binary patch literal 1097728 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

    WRsucMA_u$co3drg?>Hb@p>wf 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 z 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 PU05Y=NBl8{78&{n$d}+V delta 212 zcmZo@aBjH3GC`WvhJk^>YodZZqs_*I1>%!xST?g%FtKcAlljFyg^^`3O9c>@aDeE| zEGB=LH#M*TIVBvMSv>wQFJch^YJjLo0m`%d;Rf?dL?C)5Ad3ODfDK;ri+NK83z7`T z8 AfdBvi diff --git a/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php index 989bd8a..1984c62 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/BuildTestDatabaseCommand.php @@ -52,14 +52,13 @@ protected function execute(InputInterface $input, OutputInterface $output) $packageScanner = new PackageScanner($analyzer); $packageScanner->setLogger(new OutputLogger($output, $input->getOption('verbose'))); - $output->writeln('Scanning PHP 5.4 files... '); $package = new Package('PHP'); - $packageVersion = $package->createVersion('5.4'); + $packageVersion = $package->createVersion('5.3'); $packageVersion->setUuid(uniqid(mt_rand(), true)); - $packageScanner->scanDirectory($packageVersion, __DIR__.'/../../../../res/php-5.4-core-api'); + $packageScanner->scanDirectory($packageVersion, __DIR__.'/../../../../res/php-5.3-core-api'); $output->writeln('Files scanned.'); - $output->write('Persisting PHP 5.4 files... '); + $output->write('Persisting results... '); $em->persist($package); $em->flush(); $output->writeln('Done'); From 8e5fa01f53be36b93d1f036d91b351e8a72a70b2 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Mon, 4 Mar 2013 19:52:27 +0100 Subject: [PATCH 11/62] Refactor towards usage of JMS Serializer --- .../OutputFormatter/SerializerFormatter.php | 54 +++++++++++++++++++ .../PhpAnalyzer/Command/RunCommand.php | 25 +++++---- src/Scrutinizer/PhpAnalyzer/Model/File.php | 9 ++-- .../PhpAnalyzer/Model/FileCollection.php | 28 ++++++++++ 4 files changed, 99 insertions(+), 17 deletions(-) create mode 100644 src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/SerializerFormatter.php diff --git a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/SerializerFormatter.php b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/SerializerFormatter.php new file mode 100644 index 0000000..38d6e5a --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/SerializerFormatter.php @@ -0,0 +1,54 @@ +outputFile = $outputFile; + $this->outputFormat = $outputFormat; + } + + public function write(OutputInterface $output, $fileCollection) + { + $commentedFiles = $fileCollection->getCommentedFiles(); + + $jsonVisitor = new JsonSerializationVisitor(new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy())); + $jsonVisitor->setOptions(JSON_PRETTY_PRINT); + + $xmlVisitor = new XmlSerializationVisitor(new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy())); + + $serializer = SerializerBuilder::create() + ->setSerializationVisitor('json', $jsonVisitor) + ->setSerializationVisitor('xml', $xmlVisitor) + ->build(); + + if ( ! empty($this->outputFile)) { + file_put_contents($this->outputFile, $serializer->serialize($commentedFiles, $this->outputFormat)); + + return; + } + + $output->write($serializer->serialize($commentedFiles, $this->outputFormat)); + } +} diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php index dbc2ebb..d6b59a2 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -36,7 +36,8 @@ protected function configure() ->setName('run') ->setDescription('Runs the PHP Analyzer on source code.') ->addArgument('dir', InputArgument::REQUIRED, 'The directory to scan.') - ->addOption('format', 'f', InputOption::VALUE_REQUIRED, 'The output format ("text", "xml")', 'text') + ->addOption('format', 'f', InputOption::VALUE_REQUIRED, 'The output format ("plain", "xml", "json")', 'plain') + ->addOption('output-file', 'o', InputOption::VALUE_REQUIRED, 'File to output xml or json output to.', null) ; } @@ -48,31 +49,29 @@ protected function execute(InputInterface $input, OutputInterface $output) } $dir = realpath($dir); - if (extension_loaded('xdebug')) { - $output->writeln('It is highly recommended to disable the XDebug extension before invoking this command.'); - } + $output->writeln('Caution: This command is currently only designed for small libraries; it might be slow and/or memory expensive to analyze bigger libraries.'); $output->write('Scanning directory... '); $files = FileCollection::createFromDirectory($dir); $output->writeln(sprintf('found %d files', count($files))); - if (count($files) > 100) { - $output->writeln('Caution: You are trying to scan a lot of files; this might be slow. For bigger libraries, consider setting up a dedicated platform or using scrutinizer-ci.com.'); - } - $output->writeln('Starting analysis...'); - $analyzer = Analyzer::create($em = TestUtils::createTestEntityManager()); + $analyzer = Analyzer::create(TestUtils::createTestEntityManager()); $analyzer->setLogger(new OutputLogger($output, $input->getOption('verbose'))); $analyzer->analyze($files); switch ($input->getOption('format')) { - case 'xml': - $formatter = new OutputFormatter\XmlFormatter(); + case 'plain': + $formatter = new OutputFormatter\TextFormatter(); break; - case 'text': default: - $formatter = new OutputFormatter\TextFormatter(); + $formatter = new OutputFormatter\SerializerFormatter( + $input->getOption('output-file'), + $input->getOption('format') + ); + break; } + $formatter->write($output, $files); } } diff --git a/src/Scrutinizer/PhpAnalyzer/Model/File.php b/src/Scrutinizer/PhpAnalyzer/Model/File.php index a5c6fb7..63d908e 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/File.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/File.php @@ -2,13 +2,13 @@ /* * Copyright 2013 Johannes M. Schmitt - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -181,6 +181,7 @@ public function hasComments() /** * @Serializer\VirtualProperty * @Serializer\SerializedName("comments") + * @Serializer\XmlMap(entry="comment", keyAttribute="line") */ public function getFlatComments() { @@ -324,4 +325,4 @@ public function getProposedPatch() return DiffUtils::generate($this->content, $after); } -} \ No newline at end of file +} diff --git a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php index d9d8e60..84864ae 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php @@ -24,8 +24,18 @@ use Symfony\Component\Finder\Iterator\FilenameFilterIterator; use Symfony\Component\Finder\SplFileInfo; +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\ExclusionPolicy("ALL") + * @Serializer\XmlRoot("analyzer") + */ class FileCollection implements \IteratorAggregate, \Countable { + /** + * @Serializer\Expose + * @Serializer\XmlList(inline=true, entry="file") + */ private $files = array(); private $size = 0; @@ -220,6 +230,24 @@ public function getIterator() { return new \ArrayIterator($this->files); } + + /** + * Get a FileCollection with just the commented files. + * + * @return FileCollection + */ + public function getCommentedFiles() + { + $commentedFiles = array(); + + foreach ($this->files as $file) { + if ($file->hasComments()) { + $commentedFiles[] = $file; + } + } + + return new FileCollection($commentedFiles); + } } class ZipFileIterator implements \Iterator From 858fa5e246ae1af6999507a1f13cd9f6bf9e8594 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Mon, 4 Mar 2013 19:54:40 +0100 Subject: [PATCH 12/62] Revert changes to warnings --- src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php index d6b59a2..7a8c48e 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -49,12 +49,18 @@ protected function execute(InputInterface $input, OutputInterface $output) } $dir = realpath($dir); - $output->writeln('Caution: This command is currently only designed for small libraries; it might be slow and/or memory expensive to analyze bigger libraries.'); + if (extension_loaded('xdebug')) { + $output->writeln('It is highly recommended to disable the XDebug extension before invoking this command.'); + } $output->write('Scanning directory... '); $files = FileCollection::createFromDirectory($dir); $output->writeln(sprintf('found %d files', count($files))); + if (count($files) > 100) { + $output->writeln('Caution: You are trying to scan a lot of files; this might be slow. For bigger libraries, consider setting up a dedicated platform or using scrutinizer-ci.com.'); + } + $output->writeln('Starting analysis...'); $analyzer = Analyzer::create(TestUtils::createTestEntityManager()); $analyzer->setLogger(new OutputLogger($output, $input->getOption('verbose'))); From 3b20b98a698f4b6b55f4335779e3bacc2e8f102d Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Mon, 4 Mar 2013 20:00:26 +0100 Subject: [PATCH 13/62] Remove XmlFormatter --- .../Command/OutputFormatter/XmlFormatter.php | 68 ------------------- 1 file changed, 68 deletions(-) delete mode 100644 src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/XmlFormatter.php diff --git a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/XmlFormatter.php b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/XmlFormatter.php deleted file mode 100644 index 9f076cf..0000000 --- a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/XmlFormatter.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Scrutinizer\PhpAnalyzer\Command\OutputFormatter; - -use Scrutinizer\PhpAnalyzer\Command\OutputFormatter; -use Symfony\Component\Console\Output\OutputInterface; - -use DOMDocument; - -/** - * Format the output with XML (machine readable) - */ -class XmlFormatter implements OutputFormatter -{ - public function write(OutputInterface $output, $fileCollection) - { - $dom = new DOMDocument('1.0', 'UTF-8'); - - $root = $dom->createElement('analyzer'); - $root->setAttribute('timestamp', time()); - - $dom->appendChild($root); - - foreach ($fileCollection as $file) { - /** @var $file File */ - - if ( ! $file->hasComments()) { - continue; - } - - $fileElement = $dom->createElement('file'); - $fileElement->setAttribute('comments', count($file->getComments())); - $root->appendChild($fileElement); - - $comments = $file->getComments(); - ksort($comments); - - foreach ($comments as $line => $lineComments) { - foreach ($lineComments as $comment) { - $commentElement = $dom->createElement('comment', $comment); - $commentElement->setAttribute('line', $line); - - $fileElement->appendChild($commentElement); - } - } - } - - $dom->formatOutput = true; - - $output->writeln($dom->saveXML()); - } -} - From 3e077094686459861ac4d55ee37039b2639ac87a Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 4 Mar 2013 21:20:08 +0100 Subject: [PATCH 14/62] fixes casing issues on sqlite (closes #3) --- res/test_database.sqlite | Bin 1097728 -> 1042432 bytes .../PhpAnalyzer/Model/AbstractFunction.php | 2 +- .../PhpAnalyzer/Model/ClassConstant.php | 2 +- .../PhpAnalyzer/Model/ClassMethod.php | 2 +- .../PhpAnalyzer/Model/ClassProperty.php | 2 +- src/Scrutinizer/PhpAnalyzer/Model/Clazz.php | 2 +- .../PhpAnalyzer/Model/Constant.php | 2 +- .../PhpAnalyzer/Model/GlobalConstant.php | 2 +- .../PhpAnalyzer/Model/InterfaceConstant.php | 2 +- .../PhpAnalyzer/Model/InterfaceMethod.php | 2 +- .../PhpAnalyzer/Model/MethodContainer.php | 2 +- .../PhpAnalyzer/Model/Property.php | 2 +- .../Model/Type/CaseInsensitiveStringType.php | 34 +++++++++++++++++ .../Model/Type/CaseSensitiveStringType.php | 34 +++++++++++++++++ .../PhpAnalyzer/Util/TestUtils.php | 6 +++ ...est.php => BaseEntityTypeProviderTest.php} | 19 +++++---- .../MySqlEntityTypeProviderTest.php | 36 ++++++++++++++++++ .../SqliteEntityTypeProviderTest.php | 29 ++++++++++++++ .../Fixture/Integration/built_in_class.test | 8 ++++ .../Fixture/Integration/symfony_pr_4223.test | 1 - .../libraries/cg-library-comments.txt | 4 ++ .../src/CG/Generator/PhpParameter.php.diff | 10 ----- 22 files changed, 171 insertions(+), 32 deletions(-) create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Type/CaseInsensitiveStringType.php create mode 100644 src/Scrutinizer/PhpAnalyzer/Model/Type/CaseSensitiveStringType.php rename tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/{EntityTypeProviderTest.php => BaseEntityTypeProviderTest.php} (92%) create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/MySqlEntityTypeProviderTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/SqliteEntityTypeProviderTest.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/built_in_class.test delete mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/libraries/cg-library-schmittjoh-cg-library-c4bebbe/src/CG/Generator/PhpParameter.php.diff diff --git a/res/test_database.sqlite b/res/test_database.sqlite index e8c359cccf9e6d263fa6714d85098412899d87de..0cf6e146770a07dd64f81ef9a9418983d7fa41d1 100644 GIT binary patch literal 1042432 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

    3Ny*x{4qCwZo%B#xgl461w_IN!{pDQ!Abrc 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

    gPrTROK)lc1NW9HN_^PfMtsEHPJGnf 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

    k+W*`V8KE`vQ}_+a)TZpiYsG8jZ~ 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

    WRsucMA_u$co3drg?>Hb@p>wf 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 z z|4iceKeZhHr@c|_n*f&BuH2|ON3mutX=*0X& zBJ&GL%r7J}zmUTGLMrnMY0NLAGry3*{6Z%43t7xBWHY}IVtyfq`Gs8O7dkV)(1rPh zuFNmwF~4vC^9$XWU+B*KLJ#H_dNRMzi}{5EnP2G5{K7%ZFZ5x4p)d0b`OGgI%=|(> z<`?=izfi#Z!T{zM2KxAgLCh}fa&I|4)U^Z#E?Q5*I7uqWj`E!@O1(AOq zMg*{z>>qmqqvz=BK7skH6PeFCiTSK0%x5iSK5H5CStr+1$>l5PSkK(V3g#wGVQyk2 za}%qWn^?`<1axdPK10LC`?Ny8#t7{iBXnzw(5x{+uf_i2G_qgvL*^0w{jhnI@ew2YB|mCpzvTVqar*xI!SE0NWdECK z530scs2GDdH|NdZwJ4}MgBv7u(!(#)JC*A=1=|xDSQXBd1kzNQb?p;umaP>X&}wNUsrp2{X)c%IltRis^A}hT^bWu;*smHjSHMIv zOH!+f&G}v}vf4i0T<_&W#cHmUHlYsDZkmg{1c_~Eu9X`>2?V3zn1<#WuOX%7(A=7< zymLh7YA%yb$2p$%(frvviB+cNLf>yFOwHA}`3!D%#bk3fED1vL1A16JLen6P@HBzOk!!fxLKBv2;I|i^-kc^Ud8$HlDkn@M7jzD3X|{5|Oygjf zW*awY8hKD7%z)X&HBR#fK{J0tGgAWaX)ZRqN&nvuuKe)-c>z0k?h0OtmA87>@*Ik9 zxd3|rbwV7_cd--Lt=J3XR7CNuKpepChy(b8{Q&EK_h2`GOA!lnIo1geMfC82HqUlM zJkSrYFW9}X1-#g7!0sSNoAwTwECo``4D&QX^dW#B{S4vfQyQMHlS3v-P=wDgPfBRM zP7Zkyamo`CmM_^M2O?;6XPC#mkbFrFIS)bYI>S8XhU4qtOrf+ir0u6re4QL}6XL2K zm1uh@4tWPb=L^X#5`r($A^#w5*TZ;8D9~Ofhx~*1)Q2SWUVDd}f^aX>&4UQL*WMvl zApZFPV(uk66Qqji=6(&hm*|k|4{Dum?n4qq+e>uF?T3@@MG}SDOLWNLhm-E1B*fY4 z*SDc52xHkDO3}=^zdnSYIwa)4mt2}p*tkDUI%A1rKF*v+bOVK zhC@C&ST~tw{uUioFUcV<9rWfjbDJAcFU=tr9caR*nOprYQldjHI=J*SbBjjO%XG*+ zC(s8;H^)TLOL2x$Rvxl$B137sorv|C>I|XOZb-e6Qzag27l&MP0>hBJFMi~_6laiI z-QGylyd;O5bGZ3?+=zK;&Ol0|=I^G6cy6@3BxitIb{C~nWVrTD0i~s&>`tU5I^>bV zceq2psCEwd;{=jWVtZw2Cx<+7(ACq-Ho2h`C!bR2HgAv=tZGc?=#Vc?AOope`8)04 zkT(vV$TYKs0@fm;E&c9--m9+7)*5t zPj-4rZMEhaq{k!{}1w4GWW0mg_ z`>OrM{)!d;P~afM^`3-1f#wC4AUenf-YfV-ddW z!@n7kML+rvP5*`mSQ_g1@tQp{I%;Q{Ej)8g^SyZHW}XNniQiCj3r~kgq4(A7aP#RG zJzBF}>eMg5+y-Zaw7@iaIA*h4-hC6zJ}kT@1*TP&nw_}`c35Cq{CC^j#PjyF=ugw! zAvM$MVs4O{-A~lqF3pO33Fb!Fh4l$ci}?!8tz5};8U@Uqd}q^Tj4*fceIPb3$LKV7 z%TFDO%zcrc7_7|w-cK6N%mdy}iZE&(l!|49GWSG&4eD?1<=JOChD!60kQhYG!(3*D zjIaj#^kRmZ0VfuN{j@gg zo8itA<_VrlXLyr|c~VZ5`NljYzhpi#Ps??6!ZOcD%Y3104fZ0Yc4LM!&%zwDAaEG* z0@0yw&5QhC=5h#`NH9$EcW#O#Q;aI}8(fVB1~efmXps3Qzdf228+8j)Md* zKsZ9Vb#W5MKeC3t|1t#iv90m#=h&Xu2V^+D|8m#?&W7dB$gPeo z{;$C1=L`EI_WEd#X#ZU?A{73=W$zPjEK-XINPbE|_EQSdpHh(jl!64P6l6f9AO$J~ zIZ!D`f=WRaR0`6dQjiCgf<&kkWJ0DeQ=2=Lf?TK+BtxYj8!83qP$|fVNA&) z^Q=GO1)xUQ|eXox>B#1 zHRt1`Qtz1$lzQKMsMH7MBc(nxA1n2d z`9!IY&8JFzVz5&;Y^CO!PtE5_eP+H;>T~m@QeT*_l={+OM{hpkEAx#~Uz=~0`o?^x z)VJn)rM@#iDD}PhyHY=xAC>yM`G-}afZ(;RwySWy-fS!oT z=r7G7{~vH&bIsp*sMDxq=}tYR_d@y)oKC)Q6p<{`Sxy;!knw%Y*qG{&FA$i-x#l|w zy2L?(vz%p=oR8#hB{>oxIMX4oAg=8j$@78(XF5yVtgj`@3k;m$oJ3i@QR7#VMJDzX z6gbT}k#gvEzLXr8&m*8zszW|P+_Wzwox^6OIOHM(wrsBXT#_jeaEe1NLY(@Uq*4&z zRA-S}#ix?W?MZXUM~JWZi6(QXzf^~Og!qadOF9SsO?Jph2n^(0^N}PY=x>TcK0u@fU&43M)Y5|%GV^zAH+AsAy*^rgI6V&0{A97pK1Q7QvRkw&*&z=jPJGF&y(YyW?;@`BMMPwH z88M48Vh&}*49bZ4lM%BgBj!#<%$$svHyJT&GGfkT#Ei*^`H~T{B_rlaM$D9qm?s%A zOEO}PWW)@~i20Ebvm+zsMn=qxjF=Z0F)K1+PGrQ4$cXun@h9_7#-GhEjQ=#hGX7$I zWBk<`#^2!o5e#6{CmUe2Hpm#T35-G8f-%9iWNcwuF}Ad=8C%&ljIC{3#x}McV_Vyv zv7PO}*xq(z>|i@FcC?9%ooo_gqD^K@vMG$oHkC2OrZJ}4bjCEB!I*9{88d7aegD18 z7K8tLI0i^EB!J1#=B>nzf1B-n(Ea}sNP^~nNT3wne@mhFzZzQqM+2`1z6=I}Y4H6U zi+F+ag3A#%=yL40cOU%!KmH&1jC=x&FIuf_m6KqHs9+NtGuO6d<);Wj8Zg!T)Fr`= z(i3Dxg4=&2tgUV76RjlQ7tYqU@X2J+(RXbdULcT*`NPxNfKT3wgtfIn)(}g1mj^OG z`fk$~NY?z~yKZ!JSo3oTu}1WUC|-vzvaU_=-At26z_zuodz3pf|6pNyE(xG@96s45 zN-0j!u*tTQuM~%0wn?n9mD zfyN>NStWM-J1V#UdwbRgPsO^#*@#bY1$-2C!BgRG?DqE*yn^0B7pBc* zVrByZ@Xn%N2?8wyS_-rhXf4o2psheVf%XC&1Ud?I5=azC5=a(E5l9tC6G#`x5XcnB z637+^3FHXm3Un6eBG6SJPv8K7ZUWr}dI0D$^QqKN{ave z2x50_3N8#zLp-1E!B&X=@fdahScf&gNr?N~8j%3@!ye!-;0)&Ru3y>Kn9mS3=w|Hu z7dFSB68xoy*+&NAz0HaYHi(a$9%fG&%E*jlU}(w+v$qUnZkrLwpkO(f;Y<=$pb@a? zksKblGQ$~eR$3&B{iHL(>_0>GrAD$S7IIRUy=Zcglj6=B8DVy#q0-5`(}1^8L3WtE zY5E~2iF5p$6r_dOtp@44v+oT=e%p!*M6*9#!t8@H4B0I?y9v9I6>dc>hqlJHkVZr{ z9mor_SI#KpC2*cJEQ&Mh5@s(QxbuIhS_5WY6lz8Hbk*QnPK+aq4!CH;d`45 zWQYGh_TB?tlA>xK?&_X<;z0#YIgCZj&+{;$e-;$DAqhOk0`G@v!>oBO{p=>l>HoKo4*E|1NnD zsCr5#P$Hhd`cM+Xs{6JQ9rNKTKVS|+2J9@+kssEIyf38#Hi6C(o&4eKznMjK5P>Nr zI{w4jr1v;mj}Th_`>g9N{Qnc8dVCCjW1GQ_e-!XPX94YZzk0`Rg~dOHdEgvq0)LOw zfN#L(*9>Pj#N94JTX-SP=iZK(yRXvM|8M?hN>L=}&_}MOh9w=I6;w-DD#DzkIz-%- z(dH`;t+&lO@D3!ZnDv$^0gC?5dR-**27dO{wC;%7(M}jyrl)>2UA8Vpw(sp<4c3)4 zBL=7$_1T8seAQc*ZTibsJ$(_iDA2Hwe}2_B5K)T*9PGoxn>XNfU-eIms3mLWVcAy= z)G?7~wxCOX)h#=Mx>;6DmJT;(Shcadbx!jpYel{X`|O0TGqWC$cPJ^Oo@7m*^|-t* zKiShOT2HdcPS-&t+#q4rUu2Kv7t$jJx=icoaE0z@T5LTfO*M)^4QV|QF5m@5vz{?q zV5%Uk$3)7Ps<4N!9x@Z4d9)redw_b!deBTEm8JElSqL+<^)P+^2S9ZX%-=Ea=UY@K zs4oKV`(2#uy$o@FZ&G&x>-!|m_`hRY_BuG>-wiK-^DraqVIN>0VJGYiqI#F@uh`!} ztiX%xD-h57R{I|N5yTIA4XD6~vjO}AO>;JfJz+8A`6HbX_!s+}a}rMXe-D!U4U)cs4oP1@i=?lhN0KYjBjYNnb&$ zq_3b?(pS(d=_}}#^cA#A`U?6beFY7ZzJiWPUqQ>Hub^krSI{)+E9jc^6|_zI3i>8} z1&x!wg3d`_LF=Tipm)+&t*TvLwW$t$)vh}ARfp=*SDmU`Uv;S-ebudc^;M7R(^tK! zUtjg90e#i4rs=BzHCA2wtG2C&2cYhtGVvw9JQ%? zIah7wUT&&3cP}?nTez2-t1aEjEz~^sa!a+9dpS>S?OtxBws9}FR@=Il+o<{O<+f@& z_j114-o4yT?ciQ+uXc1VcThXImpiJR-OHWSE+qf=!LHyu>)hd-hv=V2WAD9@{T#mH z^WnE62FZV2c>lZ|IKQt04|J4T1ccwZ)?3!ou+rXST@Ih$XIh`L(x@W*Z-X+RWHum9 z)~RX-3dFE}88|WnE5f#COceh7y3%fOInw)wzXu3z5H`@JoKFKkc- zWK7q)%>jE-0>ENAVQa$OtXBp$%mzja6>qiVi1o_=h3N|CA>hI$WdOqTeYfo5{8^uwpuI(~!Hbwla`o zI&ZEn=eqZ5DFZ`h!$yia=TM&KI;^b>9GNaP+i+1v?#8;xfRyQ$&NA{`k9A#TK+JUh zOe5dDYeyMqGaHBfan~7czIW$s$_zY9LP8$=uf#y=Ei*uk_8!v>QOA^Ky334KqrJy8 zgT~Pfawlcb*05b?XcaB3|A72iK>h6k1n;;yS)B{to_~Us{~db+Abqz$ z)StuQ`C~a&`BUxh!teLB&Q*~jPbVeUX%~n z>om0_^d+^G_w@4i2z`BREhjaqw*rkZ6nESfdo(6sElJDI%yY~ zAvY-F*oPK_ccvM1Qh66j=%8Xd>4|v#GERPIS$Idx=(PUN!{-e@eJkxR*k6Qi-)~_j ze*t2CT@7D-x7v4Ot$zaE`d+i&1G;}L`0Hy$#E*Z;M)yB3eEw6#|K&YEb|;)*>|lzW zK2z-TnPQjE6nlK8*x@t9{+=mz_e`<3XNsLYQ|#-RVpq=;dwQnW(KE$%o+P)duXNpZaQ|!>0VtdXMdvm7P zm@~z$oGG^COtBwl3JnrdD3zE(&%_j}C#KLwF@=JPDRfp$p~hkg%@$KAyO=`%#S|(r zrqGfxh2o6X|4wT$#sB^_Vt-X(Z{HK=cP80y*$>%QLE=x?3+-<8uDS=9->)Fr->%sI zD@xoo~TRLl;Iq|!;t zQqwxXz11gjgR8$iYISW2u6(kPoyf%%ky9F#W{MIl_ERh&m9?KW#9#f-M+Z^N0)Xqp3W91e_&G7YN1+U6w}LKNM%N{L-}Nk8a;g@+-kmeD}!q^ zS&U~h#bkz>-Mb+=haO&stu*+OE0b|>^ltzTdir{fLNc9GKYp@Liz}2fik1J!SpUI>j1C zfd>D2wno?apNjiICNuH;svNzN?ybNu3oVhpbr}+=(PV-0=gvb*7a1*eIpT%<5c+y3 zH!++}#fLDhfO~LDbj*(6=6(#b7AA(5%JA#oBGgAFYaumC{WxcHyaKv&Xa=Jj*G*sp zn}K=DPhv)mott7nP-kGQm^YM}Yua2?(Qpoo7q*<|ex;ku0oRiH8|9WUS6#yfXM>-< zp3qYS_^F>~fv>@Qy>go^wy%HOX)_zQ)!;^*o6i8(UiJ58uJ~9ozHBI$Pc4rXllt|| z9z=l!D4@SWx0Cz=xruyE=Cr=)c-7S7fmh9(IZV?u?e$D+uof_fUJKxxJUCAWZm8$Q z!G1J~dQdMIE{{L>WbDo81K;**;FHG`#_nEYwsvcy7U^D?(Ss+WxiRo$yl~Pz6UkyM zm8NxQRyUeYquu?A-O4;(`8dEjy9=yT=bBliiQpyqf2MVfh5t8NcUTWv&su*|>*7q$ zj_?Jv6exhNsf&ODen`Cx4uh zfa@hrWQthav2GWl6#1*q);WpP$Ve0_Ae_lGQifuMLN*?ys7|v2=@?4Uz1T)>a!&~R zr`XON$RK{GfBgGF@=8Z%nv9e}L$DB?#Wr?b9?8XIK6+4~a5|NX?qn9GFBV^2yck_* zcAA&0A7pnnbnBY^OlsXC1}4{K=|_TE3y|jeTq+5Ln%`?kzn<$J$=b9;bh(J+_oHpHk@O%>Gl2MA$Hp5TLrDI6kngJgA+44zF zG+Mq*unfry$>{cG<%MJ{A0LZOr|*9&>jaAb_n`HP^^uwc`}^+j0k#_WpP#535&Q3X z`1aozcKU>WEBFM)pGZtJT!3Gkx*F6NIDfCIc37XL}m4=ix@bK;02 zUIk+J$A~I?GkgF%<-8uA0vN-shU2;Hit%hBdOjbw#_xD`JQqEWk6YtcAs$O7qd#;r z3&-Lm{6M~ME*d@8e6a;c2+8P{frrg;+7{+}Dol(=4=~G3@JG3i`I&K&9?bihU$$iE z(Mr+Tyzh9z8|Ts8%rWk#>-rX(Z_voql`b*cKaoitJCTeoFyHD#rZAQoDMmLp8TDK< z-yB#gV(DekHuH<36l1WoOUGgzrO~~yowh&GW(Ia(D#aO24@47Iq=QVxo{}^lfNFHh!v+TB8W4()K6UnC60*MeHDe-lA zQsNxK76pU4*xaT^5YjTS@nq8(QuS~g6MOW#?vF%jdGs9j2Mx6Edp{=9(X-tj5E-N2 z(}OORnKzbP*>sG&CCu%Kp<;4nF_9gQr82lZZ6b@#*?LSOI~i}DEZsoNKCkm_UE^xr zeniidcQd@2#yA$}LiC&ZxmMG|>ojpJq=r}Xwj}yBw+`NkM8Bb*nsOmZN5Af7kECf{ zIYYN%H>^Ke7s0Df0)^;b-=`o68C&dPDzOTKD;G=U-3|Z1eqbT# zO$${fi|hm-i1h4h$ZyOMCsl&33JlZt32a%Jg+wIolA+;=k&z_r(R%g{Y(hM?>_jm) zL7R-;z0evG%+1!Y6zR6Ne@}4Gp0=LDYi{Qf@X(&kstIxo>YX{DK$d7)UNGO6>Z-`&q{BbvbWROv~G+h^X?$P`kY2~&wOOljyaU= zSHErJ>h**4Y!mnz+}iyop!I)HO|r1=Ps0v>u{sia{ZrZN&&@#pz5o<}V{eGKJ~I&i zZ$IFHRw0(pdBFMI1SIh5K=%z|zBmjP!;ZexTKK>ApNIsIIEF^@_zIUM z)TuJtQW7b9)afEd&~GR;!SGd?_mPkun!tiMG%}HiH*X_LZZK7JKF!;T$l&M6N7+1I zM22v>F14L3sPSYf-SoCBTJf<&D&KsMZV~OW6WC!p6a*TZ4c>MqGKGA;IpOk;=5x)j zxIeHKHovB89n0pLZg4Z8D{X#Rc2@DReA9KhS7_riRDd*9Y`Rn@VLw$Ef-*H$Pzz-t zi*u5Q1qFH z{7z>_n?DpW9n;`Y9BUkA!qJIT!ahq^hUDaORF7{vv&{as2>irMb7CxBgrq-|WnGbd zwr(sk)7cnS{8hPRIyG#6&rcu6iXFqwFgG!tv%f1cAyo$525vzGXpGq6j!@Cmj9Wx! zxQv+$c1@6uhGN4Iqmqf{!$jVMJmcojgHIHi57$o#NeV(!v1!Pwf&`zT_^SMntOU(~ zj*$GRMWUgJ34GloFTEK~*K*Vw`h`PD*!(qG|GP;4_Y_XqW_@Tq1nl4G!2KDT!0u(3Y<%_JI8V9e)VmaO6-~W* zGSdw79#YHkdRQOdo5G?*i!U!qnk9`b-Vg>WuY}Xb%w@~uh^0rf5NpQ9X?5!zMQcbf zk#5p_dW58wgJWo(WH~W)O|EsO$LyV zBr`OeP0#|?aTEkI$|pU#Cr*tO$7y})_-w;WF*0-<*(fug&60@JcLZ)5mK$j(kY+rQ zW!u8xU@>e9d~*!*k<=)J9_Ut3P5)sHcw+H5K2wip;4|Pc#vRwQB9_mWepJfRoz!zMGU++Ia`c>(IfQQ+57BiH7)T@y zFvvte*#|btmX1Jn_W{VJo(z=E!}@|<5%N3sM}FW1CQ`A{jA&Nr`=4sw;=S6Dlz%+xYmY3qG1if^Bg5#2(z6!&^4i9W85PIB;!vlcX7OOO9A;q=KQcmQ0W z4uPG2wK@f{KCb~1_yu_WoDA*XPKf>&hfbhop9Ssz?LY;+>8$HacXo!iuw!sW|BLYT zNgluNcb;o7LHxUtL`=%YQxK0J3zD?SVwv?PkvNe<3Yy_n{84@+k~0$Hu}nOfR%>}& z@oYLB%VC!W;JOHD#6^h(+FW6J9al3%#?%>@kTrALs6lk9>)m4 z24iY%**BmB|HikPwQlpeoYTB_sn+o`U`3<%Ardtp7OW?yS||fLeAw*&?)5SyLVk>^ zHt+c;$**`_uSfA7MV$osAe|kyp7l!5G?LH6(uw5o#Hd=&dotQBfKzpOeT0okc4S0t z;yo%QWYiR|D%gRI#!vIQfYQ0`YD1Hknx0SPirKvC^=^`pN~e15$V`l*(t>u5LT{TD zTWSNZ({dQSE3)~77`RkF?f~?qt97NpTd9V=dV()J6jkAG=V&^anTR{ds zgH{7scp}aSo&jv(+0Y(b1a#q*_I37+z!%<$XuuC)E_oLI2HvpWvp<3bVI80hr#hWZ zKX8Vd!MeDEv(VWC(SZ+wrr~JpP?lo0S&mbLWz0EWh1BwGcm?^9a|yf;U5)dEH#xV# zGsu0=L_7(v27h(la^C-UO+IV755@hEC_u{QYlr`G6d={a*UkJl%6~ZukXoCsISP>C zC_sv%04a_Fq&NzY;wV6hqW~$60;D$PQj_^FM*&hC1xRreAl1U@90f>m6d={kDINTm zqW~$60;D(!km4vns+V*7_-{Y|9pJwl1xQWj>p}iIga2|AAjMID6h{G490f>m6d=V> zfD}goQXBfYcG3awPxdC_sv%04a_Fq&NzY zI)-y&{CAlD#`!Nt0a8i69^t>E{FkEuDUJf9I0}&BC_sv%04a_Fq&NzY%F_3rPzPJ^ z_ezWl3jM)-F)L-Z$n z_kRJh_*MHI`|tSb*L60=S>ayz7TC<$1|GzBbM{6Qg2NDtc*GgU&g3|J?fkLj$SRoN^rh<R@5T_N8Sa<-6j zgnVDfxk7#*q~|5@Ok z3}EVs~OV zJ`|fMW}#z-H12$)B}huf28R?6&d2)6D2=Vp5lgqoOMzA<9RUIrP83y^Q?qGo8VIU~ zX9g}a;)+F+`P4GFkA(kv!yW=&)x zvy7JWHX`C~%%~uzj2A{DYwI`8iP&94#N(qhOm8VP0~$k-jm>Ax=9Ac{5*8{lXr^P^1G74PA(2f;|2M^2VBz%tH}DPb z<@DMgVP!to9>sn?g5Cdj;R|##7zm#SKJXkX2UhdnW+lMmS&gGLEKrBC;tP8ivgts* zO2cUg8V#kR13a(ItsvAy8_HT zNkXxtHU65^yW5lqMt=yZ)OsVg6uy6$a%f~UEVp%u!1V{$mje)mx1qRgF;yhE#fWjc z%}Ru~H&kox?J`+tM9BD5*FHksH)!8Ph95lP-X~OUW(g>KQ%maJ2>O5+Mwij1`6Zz7 zI}WdZ6rkfsS5KPw6f9lz5~zi~d1CX@+9*j{(@^JO2b+g&4dzy!NBj~qOMvh*6u0c4ec&{{~gv+3vv1` zbxs8OXE$fMv%dXT`(FDO*sGt29sEJC{I}p7z+LK6=mm1{{Wk}?{zt6yQ0%|(Z+;1Q z{hdk6DxJI2!E6pje454bUUn&P0(Bc(U%fAUn-UQGJ5#6qlO<`@L}$+|0oC6^s%!2= zDDN`MhsIOm{DERx7#f3}3X3>c`%1v{w~>uT?pnvoJb?5!=7EA+rkU;%0sG0=qThg2 zgh~m@j!L>pgy|?5Fpd=lZz8{zfp0lI>;X=5m?_)QS1Bj6ooe8 zI|Elw31I!n#D&#gIB0C}QwT?I3Fv%d-i6gr`225YN(rF+ww7Q^QTgQ3G&Ern()Bl$ zU_)UE@cTA0p2>3+j!k3Q8YOTw%1kK%ci+-R4I+d!BMeeV-=x%sbh?M1j^wTqQ1xxp z%TieqHKhnCM%Y;7Pc8MJ2~Tp3yqKd&1PO_O62!oN97mu;GL?_zFRA@|C zdNv|;ChD3~q7!Y4{D+{r=x*+kOo%c}wu$6QaMSnSPX2#xf%ZP*Z0}5g7VawS)(gP? z&4%xvm!bE&0J?w?xY^oVO@Zg1`>ZRiZ&<4uc>D>@1|20J_B_KQ#Aa9eO4ER7F9E1G zg+?+dxk+nFx?sF7I!)D80!YuZh#Ey{bZ|Z(dX4f4K#%;665x3aZViDAx!one^E`{G zU%NNyx0Ha)n?f>xZkx0mMO#a|Bd5>E5xW7h+Dbs)dFElNRSTfV>n#ClH-$bpuR@mo zNM;*?avdz4rA1&NJAFM1vinK^*G-{0FqrL0is0!g0aq976}}5gjC>2A=^ETZ0~0z+ zfY3F_W08bHo@W^C>?t{v7oY7*+7Rsw8p3K=ZjHZpFOKV9G$U9)C)X$P>m25YK_ z*?flH5-@Xt-Vy_YQO9;A;O4emj9cj?;ht=o#eYu$o}MSKQ${&2blGev2g-8pv+2=TDL9X z=-kdEru^e2600oi!N6FIqaf}7X8`(-|F2>9->PQ8{&%=4K=*e6G=BG}=hX+$@y|f? zpFN<{Ps1nJ*Ae&kSJ)%GWPjjn2x(zE#QcrJL-#4r!C#Ag#FO7nwdPO$eZU#n*-E2JJ2nNC! zHhW`5^{UxWB(F#%ieu`pX8GdqaCW8ArZK6qNaIL-WZZrHYg(7pYqAHGRCN6WS?^%a`n}QDOLNIl^|Zm5j;+EX z4QzM3XgdZYzs=Xh?sU}7${5@zPNgNcRWD!ly%jqXSB;#exa zEQ8IFy4`3hWso-Nexp$$1*vz;O8K<Jj_a$y)}`L(+= zjNEV&F~l=*j20AcFU7!MNITf#0Ema#0-0?k!1n@@17#+&BU}*hy}E+>v}$_^*uA<; z`VzP#0r$eU^wxR;?wQgC_bIOoT$Z4Fb!9Qok=a)|0+|6(gfvRNg&I69C1Cdg5)?0- zTs07TfvR&_U5L!C5}tHg`AOULtg!`7}^R z4M7&9wZ6AR=sZ(2^R%*p8zC0L=LJ|;`%CCOeGb31L>Rq3WAKQA4L9g45kAlCYJMic zCs0ojJkM;lt8D5l;b={;AezkzLTUJZ$TnN$Ne~QA;Af*lH6{z~5qw|_SZMw4!>5e@ z;`@6yME*?UD?bG;p9|=qT@vz~aZ{KV`2lI7@GY_6ZlFn*ak zkm&7uiZt2 zp32%CuK?e_m&xufwhGn*eF4?8HC_Rvc$ZaF*s{Fu5o`~C$rwMq!Dpw(3Lf;@E!Z?- z@Q-)xO6z|o;)?_Se-lpXeg!swec}5rYCi?fe`mn^&n|X5*8V@K%b@$qt54&M&?eS9 zi1v96bO0++u<^g{GSsH#f+z!t_Pes(?I=TCYObd~15I3Is7cLu5~RSO&sb$68jL^ksS_&1UyfI2px%>W!y zF0jRBF1<+&SEIUtCpPQGF(gdcUVd*0AY!v;hGd0wVQ^?(UuiX1%=H=V*C@Fm0vdv+ zw*<&=pc;b*h()dj5aBgdqx*571aR;a+622YlTnS}BvI3x5@5ko$RN>x%T>yI+%ro+ z279|+QV$q)y4)DWsCb|RQ1BXW&)7|V5TJkq4683Bccg5Fxf*WVM&ZL*+L5!UgkAqJknJ;S0%v_IzyO}EzNOAV z9Dx5|f6zz&{67I!+$ZFIArA<7P{>0<9v1S5kVl0)CggD;PYC&okSB#aCFE%#&j@)| z$a6xT7xIFT7lpheGj!SB1PLj_z3$Ob|-6tanhOrd7vKt9n zB7s6m>xVFm4XB$(6h5d;_JEJB*#iizll}-6}N??QG`O*F2xhRU}~U z*eFj6pF0Nya5>0MGVe}7sZ=ts`NawM9m1{fJU({xMHG&9`R(&^+$ZS7?h7W@00%A2 zZE(7QLqvge>P_tot7i?_wD*9vr7I}whumY)p#?*#=UlAP?V&qwx=-cF2jgy%363wz8Hw&J!ROF zO=}cO(WXe(Q|=FPxDp+JBk=8oIy%dJ;4m~Z*a{osTz45(=1>~~!dzP!W@b|xWyo?Z zWmuX`wT>sswU%LIHl;k$*FhrVhk~8ie5fE0kedu!bD+rrS=5M!)-sIEX5AXUh>~q( zn3&DRQisvwAa80JR^=&OzJTs3>srdNC7Vx?;}a(+f+&l@965`^l>y;pR^}H0mdmV+ zGDb+r*;WRG%WNBTbMB$r?lOQ|=3DU8bF`U6;qEd3TLA_WoykoFXv@5>Xh)FKUIsAB zl#FSVxr(`|WuULj=Wz9M2*HSqKEJo13c}bVom_VrNGh`}u1e0;$aR+inKBvZEqG6a z8hXkAN|{4|Hy0+y)G`23X1m<&M@t#FC-XTy({yV&iX5ZGzGa%e{~l`(%XthsydOJX zM*Pox5Y=NNVDcZaZ?Jy|dtb)h$KDbafcJs?zXI_;bMOo}7xB4XgwL?=!|T_Gh0rrF zn77cE#KvBltmEwQK|9f%Qij=_ffd^B3GIE1pB6TA6MuztC}pH9>%RxeyMlvMnEH4+ z)t!gtKLz(_?68Low&g{*KXG~YPi5k1ctY@bI?J%22i&Z33)yuAn$lZ_@!UjKkP{Ea zqKPL9u=JH-Kj$;+?o*J-c7zar9#2;pMsx<~XdZbMFTb}8E4q0bX#AiP0f^6I=`O>J zZn`8E=O8{qZy5%31Dr!$LK;SbThcS})4+rtVj-_0=nt2rtqc=-8!4VezvR6%6mKoV zM&8kZJpB}+;UKd@OBuHDj<#?X-xC&bel!~O@MR;~D`-DqZWdV44|mW&N8rH z2Ks0o$1*d=JsHyVd51#CI_Kf0p0{@B*CwyHmZ0_w&KFvJR= zGr*VO6wkx?oX_G^UKMBYE`=uXKIf%+iQu135!-o=oHKZCQHCc9t0LEk zhB}yo={#ACTnoV#J|lx!G;dB6B3BEVT=LN2#U@+y^PB=-$>i!M@`}NQG(f>$7K1am z62pw&zRpiT{}q!>O`_xm2fa(usYG59RXHUQkV89+Xr&0j+0X`DwM^B;nF+1e0!D#S|SLgaBVv3vKY#Gz~|5qTn5hv<5nHV(Fo#z52h z-Ye%v!1vv>QLwPIwP{kYFg3MlgJ2rnzG*|hG^u)ZuWHx;wG^q6*fiODCYr5*=f(~! z^0YTLcp<>UJQHBk72azmViG9gv76SS?|-g^wK!%?z^mVP;NjysoCSKqdQ&y4HuwTv zgn1yNzJPWACpZQCka`7Y{yK5eZ*MzkA7_6Fu|lr3@35bRAK=N(Z1@5@#2JB(;4Jt8 z`z3sezi7z=Geo0U9AV_i2f;Lko_r_|A$;hSg8JA%d#o59k&0LRMVaXaEMFpF=;<5v!9U! zmy>BAcI>N+W+r(4v43VTOOnfcjls+lQNg~`>-QXHmD~h&LH1=vYxT#D337QVxx)T~ zj7x3^XK_DVEMK;tDj;h6C*g{ugJ7++e;Tfc-njj=heXK@jmGUu4JI1L$4&rgV?SU# zpO;D=gzN{6=R-~`p0*$H@H40}S=2p|EZ9#3Yaui>4$}`O6ZTU^E&4$oGhVbLu}81- zjn31!ar-=jmA)vM@$I{eu|uA#?Awe!qXhRINi1T*N#%wp-Dud8W*tbkZ#NRCy#1*0 zw3L9E9`Fr}sVj}1)ET)|_7&k&3cO(dg5>`W3;3VMo$G-AIUcL{R`CAy2+rr9Vvk_8 z?^ho|?!O$KzX*#kCYuv5h%T{3=B&b zftE29aV!tYr2rv5dZVihC`%XN!%ZGPzqL$gmOd@XjN3nCwchrb$wD5z%Ry;2KvO@{&&$YJ!PO@jIa*cgBrDl zwnw;GPZ{8s7D7LHt#%(y@BgNifq@A&$K`PAq2>&hfraryI#6q%MoVLBlMr|;?X`$; zpbTh?ALJy!$om`SnqA%x9kl@M(yt$n1_v6nTZ<>zNwIMhXhs=WnJ#)mv`?Y|1gWwi z=U^GQb`z}cRZH@oQDt{|Z)_Gw`bLdhTZo~f446BQPrbQi?~$(ZrMnD}ySWdDtuK&QlYly(x?=J{DOCNJj8VsTX@rlm#ZT?S}#WFM1jeA!59BpZp# zx+qUMj@U_wNWy$bjAk6UNkk3_CsK0`G%ExrF&-RZ?CYL>{4}Lef`zai^WPOJ0jGG>(@4wf& z%)m-N)Jr4$|bGme3T^=|K&S@e71~chXaZVLEDwsp{ozkcXSN7FL zt-wI1QfJ6}k?K;;NiuZwPxoazC(9Q*K8*U3E4`C;H>vSHP}&&1Eoj36d;_|^^1zOE8`sc{=99Hfcf(@fM= zR?owJ1B+r`Y*ZOFZ8 zqL{^$N^W{%Bs#X00j298%afLXXlDTBKB2oh%Yf0DYGKOD0Fp0${5#6P(V1#tovpq6 zmw}@*mC-sE(l&I_97wOD3@BZL3eZJ-ccADR-CeRf$^g(!W{U?D!DtwDtanVarwr_z zY1beQk^nu9_A-!j;SG}uSZ^x>Fvq=O?4}Bc*MN3)lmU-3_cT+g1hwE}W;;$ZcgH-@@(Duc5UJ(3@#0pgQFpw3PvNt1Bk` z*IEYFEnG~p+REeg#bCT8m(3kzK;4Y9w%o7K#Xw_(-1ah%ZY{KlT zmm-t4iC$(#XSJ7cJSF@xu=Mg-()Kb=rXno22IMB_=Y%AkjieX`) zg5%31Z)zC_Qd-Eu;LkV{pDSi2FID`^zC%b^>yA9VDj3*|@gwj&R@sl>X zo2ZwmCAk&!0JQ%92miN*+3R0Q7GTx(LUs_cqmZ41>?~v#Aq#{o6tYOju0nPbvb&JQ zLiP}{M97{(_7bwUkbQ*gD`Y<*pAxdakOPDqDC8g^2MhVMkVAwVD&#Xl4ij>?kRyZ~ zDde+4juLXTkRc(*2#E<977`bd5Rw!!B4kv^n2?l^r9zeoNedYlk`a;>k`r>Qki3wB zkfM+YAnsA za~XC5Pyb6F&3~tmY~T{Z^GJI~wl3%Avi*@H_KtP2Y|JDjlMxk)^E(m!gQ@T<<=kY} z$tFnWA`#@7mmwmoA9McbR}nDaIgg9Ag7|6ncC>NA{S803&W(PRhE2}7zb=`Ka?XAJ zBMA3!wm9ZIAR7s)R;%whl!fz%?1cSvSmm61A&qZuD^6rf8I-8-nIT@mo!gBYh#d}6 zgL9ivk)%$HJAV*mzh4n{t>S*zxx;8Z^RxE>=gx5Dv}8Nl(CF90r-461P`J6V#~RK^{RC@v<7Ed%iS0tGb+Htwc(tVmNGE5*h3v@o`ZVl z_6nin+!L85A4xeC0OWirj&gmSZdU~mxd6U~O}Hx&Ls&Kq6#(P{C?C#;4}5n1&{+XM zu0EUHZ{gOR6@cXGvtcUZR<4QSB8RdNV@1(6hjJ4+b=;qk;o(X3?cM z-(K*G;=o&|s4#F*9CZs6oj|-Lc*^0fXs_7yMVSFbyDK>8X8NP@Hs885t^b2i{^S4C z);nq=H4O(P_fPT?+tkWp9#;t2jVo~YFGt-gn8jM_WmDrTHyV2cW4ZX zSpUy)e(Kx_9O0|~oyGiLDl0)6*^J8Wy~I9Cwj=0k?0ZETkn92ipV+@Q?7`!3<}{zi zBRO@l|18rp^U|CRVZi=@%(-3~mO4P~>>rAjn3D;rZl7Z$^v zNw($ob4Ft%$u$pO9bo2rd>^Mh7uaGk&X2^mn}-RX0$>lt60jM-)O^937+jn6kLnp1 zWsDjUFk}_%AIq}IttR*|Tm3IFo(&6n#(qW?DB(ha+vdL*Z5H*ctuaQz3LS`8_8$r` zvi<&Hk)>QlA2;zk^X>o>+P9d68RKRDR+eBX>>Bv(YYoQY7%k!Uea0&$s{sN-+V^|V zlH3ps4)(1^A56eg7Gb^YpBs;i=&Rm6ercxDVAA96kKuI81T-FXv^H)j54szT5x}m+ zFdBJS+JAB}62M&}qSr5=FWs5mK0ELs6f6vyWXVghy|Q_pehh>cBZFXcn(ns@dL7e6 zuDR1lKrDewa~G}uoz@{1>~)s_y*CX1e|`4HknXRAm*3A}?O%ws-%)>2H(@Vus>;GP zu$7vONWp)wet=j&hcx_Nr&kEUO5TX{?2Km}6>l%B;wlu!RuJC3zXBkuxwzEvfoVns zP*yg~x|V6-VpTUSGosSq$qtBC4_wV$h65Nd3{(i#N-*KNcCofce06kH2;oY?Nj;Y= z^MrGy^+9Xrq&;v)$-0*I3NWswlE%wM3%V)FTSDM#(15Yjk^saIU1;(hU|n)=-L8%AN{AT}e^t>Jr(=1v7PlMh-aID+GD zxPgRCZ6HSn(YoDJ!8sKl+#m*ac2voM48hS^!C4g_GAtZ|$0n>oPsKc`V#>N~-UG+< zNsKsH*}bN&vLOV_keC z;lTzfK%oS@QOZ1!TZKO;Q5W>=K}=A95UQ!&-WJA z1o4ms*1igXQRquI>%)L@9d&_cumVU*7ftL9=37f-)=|Mh6Yt=gaYHsc z^;YPN2_ebqs^O0T74%o=hzY&;Iu<>;!8E->=S=8L1s@t8O9F=oVcL+z?mznfh7!zw zBT*Eq-xcybA!iFYN67buoGau9LVhUZJR#=``H_$x3%NkZg+eY8aY6Y_H*mkYT<$S;IkDdZ|4R|~mD$hAU#DdajK*9-ZTkY5Y=jgT9J+$iL?LT(cB zJ0Uj z^01Icggh$bF(Ho&c|yovgghzaDIre_c}B>yLY@=yypR`!yeQ-)AukJgMaW-;yei~1 zA+HO0L&%##-V*Y*kavWDCF<-{SR1Qw($Q#>sIS8YysFp?E|m> z6~zC#5s3eHvHzck*xw_F{BbeRKhFX4*N&)M`$1RuIUxSNiF1QjK=c2I^YVY=vq2bQ zR!)zvf@^3B-Zu^q114bF-^Rx6qhya?mx~z>p62bNW$S2WvrJ&8G$_cZRl-g{p<^$t zF9m2B6a>o}W@PhrS`^>ree{7Gdv<*p*2vpK^-Y(*7pQpLxS?KC8xQ5t9Eq==}dn3-YfqOizViBH>Dig)K!a4UK~%EC!RH>^je7X$Y{9I%!CxX{htW`!4tf zDgcnwiJZcxeZ+#Ry#gdjoj^%k+#bS`gxh0!(*;vkg)k*yH2_ZIlS5+Uw^ayM5>^9@ zCgvfpwE|R$iJV~(a+D|BI^^`McGiDExd#6=!L?jTfww@Ji0~IAsm>!4Z;A;?vzUt%3t3pLE+%?y+eVoGkeyHtD?X3eJ|8 z0DtZfOqlEr7|rjl;8;l`2KForhOP>ZmDG(R+5<`ijGhY4lhkdFU^;+n$5f286ZHLe z;V2LM|J~^P!1)5A?JdN4-iZAI{Cr-3^L^upHk8zsC&7?g##0WN34OGeWLnA`ehAxket)fjpomH5CjFZ|fm(K31k{KwxRR*+h zIRFUyP)ujF89ZSvAtnh?(DYWx97J4(SaNkh@ShGG?m+h?(STo$4zTbCL-&z4+ z)ASP{9~;fKtrbFR5<1R&q5?IlyFxHcatC0(CK)=c?d_}(R5SdVg@MZxTC=V^pyK2P z91J}b0&IrW7v`GORUy!3c&+ePqwWd;H|Z8;>&fO$%Oq~mULo{mc;Y7q>c}Mde=dT0 zSZ@LQKNXnq?cm+xXf=*Fz^CGCzZjaoJMiVdj8nfG*?sT>vO7>f3A=Pe}O?8RWd1pfHd!|O+@mO4s0~<<0oO= zpd(|=pYjV~dTriU+jc?@K-4aB3kd$s-Zg7Z<(wy~bA#_qK-+Y|cH-#(?<8t^i=W9L}d(&@T zscnn_CpBs}Jr)W>6EM@!0ZjHw(|nY7UoxNZ)^lbw1hupI5e;thRvDup~Tyo~5o- zk0AC(JHGfV;sIS`KY$p$Ti~4EQlNy+$8O6}*C zUWVfw(G2HC68yUC=3Ev&K!y!1LIa*DFPU=q8?^K>A}@i)u@@ik40!=wrW*s!s>$B3 zE@KG6;Z76)fsscp9jtH34&6xh5oy-9>oPIzxW@<1nhw`)wxW`hx`s%2C(B0O<-&p6 zKv2Ff2eZi^40#Z81AKjP7S7)I_n8C-U!qa9))WHVlCj=+_Dh?bi@mU)OBs@ii zzT0m3&aIO+ji|%@qW>Un;Fsn^)FD1Mv;=Dow0LTe_Y;F2e#PrFV<_TWCAt%N0cS9D*&a*1pllU}Citmh3nqbSC|v!P%)LdEc5phaZA zb*8L|LBDNhW3m4oY(aZ>B_jBc_ph1GI@teTiP#?rpnj$x&i9?_5<~zSQoE{Y%EtMB z^7)su4qn5z-(H2;)dTlw1qvUDhrBVZI*3f#Fwz9?W=@RL8J6J*3IfR{?d~e9uAV91 zW#f3Ug2d{t!st4M>>EZs+FgKmK)Sz5rq?wyWhmBIPqkl5VEPD>zMHNL9355IT|JA9 zmrcN8IZgrH=c{azA8|Xo;Pean+G3sN$@d& zT4q)OmGpxvx=b{M#k1LEDcW&CaZ5LxQ3Y($>jamRXRZ+E^eQ1J>4j@H-nkUfMf5wfR{y@c#7WFH~> z3fWJ{r-bY;uAqsfAdJjIqf3Cg^uK+ti^Y<$D3g=oiD`oBJep1}zdOwHsz6DGZ^Y(tpQpVF zv}9NYb^QpnR{@l4kjc`o$p1%M&eO2rSDjeH>*kv^&)s>Ta9_ zI2CchmZ*N~eZ&g=1$+e_?SK7ix|&&qU1iFm;K$2t4;pvzn6s)dtxVai0V`B+6inVV z6?2!szS6Kuv?&@q-BlP@!XuAwO!P$a3D$4|8l#lKup%P8oM?4Bufxvx~mGXq!%AZ4;I7kcuy4| z$?#W8YB0d=lX?0MW>f)=3=eVU2pnJpXI~ZI$Z$6^r@uF9uL2br9$fCNx~l|;G$dlT zz3dVgcj&C{htebw8}Gn>hiz4WAj9hd9j)M^fIo(d%E>+Y^t!45K8E|r#W*0prwX)V zxSuGWU%q_2z&eKCmT~A0mGoADatyPKW3Z;Y-tMdJ0hZ7-G4A6J=uVqf0d$nUc4ACSj?$glN1sK2cW0A#ou$@LTRNd6zR&a&|TLhE|#&o~48cQr{3 zsvUszUj_`&nehKhKEPgs1)$sB5k7#*_IH5}xQDg=li(?28)pyaNFaw#cFu(k;V$Qy zHO&V9rF0Lxz!5m3N;IbcFYr>w-~}B4*G+@90}E;)x=w&qiZ_XVSF_4|AB_eW)5+z@ zbabr%qj*V*uI)3f)*HsAtwrmL8dGHW^Ip%7L|H@W063@OsiMRXjjrnzAk~b^Ux=>f zJt^-KqZV3#F9H=5Q;Ajjc0-~d@`7cvNx+MTtxuqMxo#-!YenD7F|=ZtI1ElViMEqd zcq4zWsHHeTd>@jlK^=$Tt;U%!-i~IhcSV;MD(R{bbvUng1lF?#CYl!C7R_vkgIrr{ zWm+hQU6Q;fdbUs&`^tXbcxGtVFxBhW$HFX;MDO!&Dt-vPuDr(YAXz`PpHV99uD8GS zd3eFMey0Zwctiq#MaH^aw7yhOC$b>&`?_QnVQ$rY!W|6{NLZh)b;5Z?bLu-c!mu2Fx$ z$)9)m^#2a_r|e<)0{RL({$63zu{;1j~+edR`@qexoT-ayIA<(tN9<17gi@nNWh5g+6s<2F=+ z<`P!1TRLhuy(Lm}!CN7Y)ROkoy2EcU9XZ#Z;fs3u0Y9ZOa{VQ-?ob_+M!|xg@P`T~ zacp88ireE`Nk_-5mxHVl*5koP z(ovmt%ysu(q>8g14wmLk#w(#T91XA@4W{vSL z^M?Q2uIm8n0e`j=G1>Z~&*h1Qulg+w?TGIY`Tsx*9{VrG3LbN|b2heL!}omw(7xmF z`PZjDfCrGP)EU48?5=uo{^t?+{Q5dh{U6xyVP*Og&ZLBEk}!kH!Q?ZxzUhuy|%5IlAH!9=|r zzNNeC>!||DxF!zX`VCY8V+<=fxHTR^8qMjc0?*j69@i2uqY5x%ctar@q>$yItqNFU zSP-Ro5%=k=jvz0z6(Aqcvcc-A0@@gs=Ux0SichZs-Pmw9$7Tq8#};lo{Pskn3NcIQmi8K~ER$(Z2_eg^2kve&1b}U=!NTIYZg4YUW#%l{R_d~n zw3TeF!I~1z!p%7gCX{g22)n0ft*u|56&t1vU2AQ<`mB{%vf;JX0ALJP2tTyQYN-Lf z=pK}H8?Oriv=}ZV4(M8IKq`i_uymuowi-~1?(tf;zEmPbe)L*v&Gp5S$4VBEiQyXE zQa~hzvtqjE0Z0sIVJpn{0uC{ph2!&_rRuYAGL5rIJ z0)N;*pGMnhXa`VwunG_&8`(nN20zuQ zPg?dAdvkkN#P&(sCt>Zs!M@*q*>Ti+P6zh)pH)u+)Aw!65WoFj@bC4HW|#lue_{`a zEUGnc`ZKUkke$7kY7Tw-co7$MrZJA~<7C(2=8%(JjY&1gBzV1qQx-pzL@}2C4L*!0ojNX=|vX$4;9b`%@y^yNS?tP=p5iVA(q8WcczG zU90`+Krc|oX*I2V$Y4b6;~fB^oPeTEE8gtgKbcKycI?H0X1OAboeVsf7KH4PzzZPJ z$sP^#UA^38j|Gk;2?J@aF^}1Y{>T3Ri676ukST`MVIgrL2_Z=#BSJ=nj0s5zSt?|i zkhG9-AsHcAAvqz(3dsv82q_Ag5VBmz3Lz_ntP-+X$Z7NkYCTVP8V{9kTZpRO~}`Ud_%}Lg?vlM zSwg-o7z(Y%70)2_9ccTn>hjSAGO{d9r1rv?mU_yHtaLjgK!06_*0#pH(k^1U^n z9~rWyH&Xl%tVCcBX1GOHjj)d-m4;d1_zd|SwLawcA>Tj#0_WEn0@zst@-cMw1s=DP zA=dSWLn$L|6ZBHMW2`6Y#OTat_F`f5Nw znrJp+B()BQU}#Id6*wY8~JqxmZ6F)x+M|xFX%PJvBfe&2u@# z1q%^2tp%K7z`c5E06-e9gNQ-LMjC|=F>p+;0rxnEdN=fl?v@2dfoVt5T?6XTQ$o3! zBv-J$njUMaeyq@zn6@ICXX_fEj&sOdgL)>=wW5wj=abtYAfBU_NDLS3+M=C;%GRcw z!m0v-`WSA}{w~^XIJ;d&Iv0kpH@_{KQ}T)`Y7%na8$bP~{cSfpNN&B5#fUBBym^;(fIjVw3kmqz`N@nA1Z#S4zM?l3>O zM_^T-bF+xX!Blc${9E05Xbzt~;kfUxB#$Nwjy4HVA7WWqpA|=(fa_UD0K|;-Ue~!+}#}dtx#LAj*AK_avdg!3k zeVQ{xVWW~wXX<8Qv~cLnAsH`k$u@xo5j0lt`J>a{TsxvB!KZTCI!||#*D2rCMKU;} zHHOfT7-(_0-)WBP?n63#z~d{MwXmPiDVlFoSIEb==sej{IUYt~lhxL;6Y%_=7L)2r zp`=v>^<`ZGh+pe_vM1xnIXb|QbvCX4UDh!a|Kn!(@i-AaJ(j=&m_lUVU)ZO@0~4O^b`NJ)&SG+qb~3gly;RrfM|rXFw`+4 zcGQ5*2%RxS>;!V&iQKjtkQsb*)m*h?&TXwNsjHOSE1=l4+8!uI`kdfmmW<^`+z_2$ z>#qTg5jw!n!8=T*ff^tfVL3^%=km_A@JUGCw_S+9pU#*j58%GAw?O|3~C? z)E4QIhD?F)0ij8`B=C~qk`w}!O9C%x__pPHiuX~@1yVAcJIql~k=tGaIx=)p6oDc% z;HCylWZi17O_Ubas2!1QfX(^FhM!E--%|q?(p*%fLtIaq;25X@18FYK%n^ue%3Odz z)^P=#r!p5%kab+LMC(@tuD;r~=n=A{7(Gqdn5H?NCU|;kfI`-_o0%wzCUXD^*_cB+ z8f&is3CSndjj_Pf0*ZInfP$=(c3sb-VCbv?0$JDjUf7qe+7`$To)Pw9yrOtZ4cJE` z{s;H!C^?m6`@h=N!m0jcSocps%&&{pb%^t`t9nwsr9QSN***4L;C}YCkFdvJ|34Xi z0WYIevgu|6b?$Pn-_^KbR@Y#nJ*`Gk$Ei=yzm}r=ynQ z$5~a46n4+7%CaW8F0a)on!|Gpt!grTFU_VhO;^fl;2p)cEt&55&R8vRm@)coBS}t` zMD<#|)N>iFDzfy!aeTB-?nv>tk}EOw7NUpCnz}5{K4~@(zcb7D$NI8PrsE^2e4*HM zzO*MDCs8Xsk!=1*il*aZqxoF(tKP5dicIrg!8!7&H0^69W#&zcWSaIi z>V!l!57R)?K}KtkmdQ397);6Ln+}#2&$Z)V5;^D{N@SY$5~+)mxufVXo*WNs(kF$D zJZkEyriFE7pvc5J4aip0;UYvx8N!i>wA!?b$d#NTg*OA^D?7W7vSyFtUr!@on#^|fT#9LPl-OaD2vqnZjH8Si5 zeK|ld!g7VDX|Dlo9dNI~O+aXD?(8FV#isOwO{Qe`)BvfjTfk@!%I>;RL0|3gM*S)I z6p|Y}T{U2;TgZqX=yR`*wi>Y1u1S*nT6^F|+4kC@b*&d91~Lb0fKL07fw^eCt9LLC z)BvF7Mc?edfRlIT0*bnhE8u$@T)j15sl#e2FwMv3!)M2d1z_riEHWdbmiF2KbOI`mR`<3}Q7du_kEOgMB!-PE9t@d@+Y4)G(7r>{-9Gr#U@#bAo4Bg2tCD)d`U2i6CfVR4la6m3kY${%2xfSpGLOfL?(=f9Bg1h$2ol>gWkpyR zPi(`EG@5c)X)*bZ}CVea-vZ;s$!smgh zA`4Ak4JMB4slN)YKt50YTq8R)$RMb2WXJl9VU9jLuRenTu95BZcVpZ`HX)InX#H=s zwxj+3oj~xO%m|=9ME|)3y1te0{ne-5fd`=P0};F@wExfJjKJ5d5o^0SCjy?)u?Ulk zUQT=`1lZuh*@6oMhyM#p&8Y#g(U^M#xMg()VXPmz#NMkv1%Q?E2WXg4&o+BlgJsQ>>#~z-Gh;IKrXUL zCk_!eLl%SSH9$8_Pm9L5@YuPjKyNl~Doq{$*w9Q4#(^3@oaQdxuaFrh@+ol5sR75? zMy-^VkPynUHSgjfGLyeKnGwJ}tCmBZ1lZIHq;#U7IKS_TZQ~y$ZbMy7xD)ocL=#t$X!D27V<|S_Xzou zkUtB#SIB)r?iccakOzf4B;;Wsj|h2G$YVkt7xILVzX*9!$Wua|7V?acXN5c`q*q9vkbWTpLZ%6sE@Y6t|5i0X`o95nEKd7f26XRj z>e>H?z3%|CrKq;3`v^XwY(e<@R2!%oJ6jU3jl8Ot|}MMy;R?Rr5k!1!|D@*UF)@5hlP&RX#8yG%2wD zRGH+B;xGx;`rLI{_ow|!8mtYgZZ8mpiLe%|yNXdK{Y@%=88d(=&sqW?F^`9F`t z`*#+6_&fU>de3@yBgS_QzP~Q`03JaE@L7lkUhMqIdCOw?!7jh1zO;<->#4 zwLB{F zHqRpF;Ejh8RbHM&3_|U;qoG9A7iBj_b;~Omy#wJ;@HBd}h*7Y;l2JADG*D?#7SRf| z+X}lzwau~{pju7s-@F^)Mqz0dkqk;VuhRatTa%&=jV{X~u)$8X6%Ekz9o1cwMWjRR zadH3>j0xjd7GV#zz8f`ZY`jadh<>QOi!gU0yKj9mb?fR;?n6HYR9liwt*brWL{M>I z7C{oVcO~q2T6QHpS;R}&KGEm~q*tx8FpI#6+AXn5t+hoKF%-4GH1-$GGU#`+EW#?@ z=m(BoKUx19+$S8I^K~G&|8IlO|1+@tKkq)_C;b+Gb6EHK!3(?!w!LqF&-1eTvibJk zg#Y1BfGf&cdC@?Jn(7l$TJkh%32Q-@Q!6RV*x0wL88*3N<@&`pOD0-urPH%({Fcf! zIIQ7sT)Du8qF_q*8`oXMypMi;j2S$pi5X?&9~LLZe$ z$K-B7dtta$_I^V(FxqnK4%&NxYKv72SEbk+Xh85@=1o`2LwkhxdyYA(5||CV7tL=N z8Z*S?;Js8?Dhi_a+sabe`g^~lDOK9mTF*s)tNeLc|2v%n9se=^dYt}oJhJ~U^EdYX z4FCSU$N*NrobVoG0qyo&_Xo%Y{z3O7oDH(-ywPb}YA?`}MC6ba_vS3P7$ryLmo&~wt_RZ-n!U~=q5ldBjcFP)K z8j~SjoE1j172%~AZo~h zxZKtNk+F!G^49Dk*uZ*FP9xo@9Nju%gw0v7m0RRTq0kbwW`(6JT^S`rX)|UVEm@%` z%XOx+(Fxl0F_5OL5R_XYStx1Df}7kTl3*yNxyCGL$!$&1C21pAkOlp?MQ(~$nBvx~ zFpgzxrh7<159EVr&w^@PFG)k;7mwC{rdvQJrYtzdEux39$*4wbFNqu3BHMyq_D0Pr zH7uHEIZ31TvMhMVwN)`y+QJDPb>;hSaSn0(pZRzCmmqilyZvQ2|My4UP2M@)(cV(e zaUX;~aK_!w-Q3*>r+z%@e8#!JnZzYk|GKhpRjR&bo&|g_BOva=2WLpio!LWi$KoI6 z9czWzF&tYoNf&l|7CuYs;0;#jA2qhtt}NJu+JkwoWfBt?&xoE8h5PBq3aK#kK&wbA z;r9|nussWAVRTrl{EB^GenFdLD3hdQz?*@XR z-eYC;w73h>a7)dEm6v3}SX3pxva+61iFVB(mSsU+)c3lwqMops<`DRl7iERYDBG&a zy0JxNX%?hL>k|xbOI|omxN?JdaeA}DZ?smHcvbe=nH7SgwFriljDdb(b{ABzf^zlO zkXlgokp!E~EX)S{Ml<+|T6{Npvchk)SSea7otfe-4AN)%=`{S41 zAAQ%k-ro?B!kdE&c#J>m7yYaKFMtd1A3Xhou6`VrIyzjpx%oqqGSqdMKa_^Hfa(%H z>Tx;K2ghGXYG^#T)Ss!dNosi2c9K7#PNW6+Vn8s!=brp2H93?{gDDX(-`w5l5QYtJ zcyeW`hnlF6UywOlsq1oDgE`whwb?qvB!;AxaU^=Ra2b-%*-M zC4WxWGZfLeneidz@g=`wm$A*{w|O)18P7l1G>myrxa^NpzmrOOp2r#VVawm6Yo#RF z9o3NIIFjED|JKKudWd>*#p4w(R>~yv3bIG{Wya=ahrsUZ3l6DHy^Cqe!Wsx$0Er&C zc;wSe?ZYQb{#WW^+NGc?YmyY@v;c#sSq1N8>P-F?Ogtpd=rQv)O~@Z-nLi|fMDow(4@`~|$s74(h2JK1tMo> z;c4u~5d=B4?F{8!6Yni9Gik}aM*fhYP_vYIZShjR2;K&KSA)7H*|=99ugo{Z+k_7- zsEkhn-cKtPyVt_EA*g^;4%e6Oe_Q8V2PgXdz79~NpdPA zs38q%89bvq=`+F{Q_Uw^gd&E+*f8-;hpi^~N`m^ehW>BL7hGV!$v> zy^U|AA)6*Y$F~)KPHdY>(%*pSoZ(45Ta72txbF?Fk${}px+Q$B!)qtTC-5z0#!|2I zV;RxyZ0a1|&j|8~rOq`HRaa9Nu(uIB&cW1qY*qirtW4b+$ug;|xeOIEnN-d+h@UWZ z8R;|fa~fJs>KCM}Xc6C6CUHz%ZVAM#VhCfI)Q9;i$`#N#K;-#xRDfv)1y4i;qeu)h zoq94VNKb;Zl=?|jFrk+`6%}AU8=gu1G%CO%F_B6AjMJoat8?Mg(chxmrhd+!8FDN% z@?<6c%>8WGjFhH_+*^WoU8|)hacl04T+qy=TE-)v+?&D&CYOtD<$fmkFth>b{T{HsvX1L0V`L zoro$Z>I@CfN)`s4*T^ebm<5BuI=2s%B<-f0XKU5!$byL6BKlX@l>Em;a9C)2HXtOM z9SWL3g+Sbr9l_rjE$hwMNmt;XSZrKIBhR+!GGR*li z(6f}%Yxa6QS@4amz#Q~ow#6oM1{&+gf^Tfcy`U0pC42&lvcfl(9X2-LGDP`N(z8(U zG?@oxL_H>?Jqzk_uun%d^ZFrHPsMFnkdNziPpPep&CbG{rtV&hp*0J}agdM-7pqji zVhDS(M?omtD-J++WRmaEdTE=ppcw~yPBb8=`p#j`toJAM;>!1Vc4~ZTm5!_<3vO`@ z`P?*SEnMG~jnj+KdhpfAF~q1L>;Hgzqyzun``r`WQFjtdzf+<47u}28%dzvn9vZ;s z+&gg+_`}!-{1BOdpK)KnnLvL*KH#@_8+nahhquVv0%wHo;=RM$ADn^rddDGe*h!c> zR(of7S#KVvhkeAm#`~0a3-Siv4K~5Iyze7^_~+hp-b;uy_&cJA*Y`Jtx1rl#>TiX7 zL%aL$@(=Ql@ZX2oXawBiS^pI9iwpjRIBWbWfr6BWzCCg0P&hC1ESV)`V>c+Y+`TY){yMup?n7!p?-Z6Lul&O4yCC zJ7EvPo`k&!?;z|=cqidqgnbD6680nPPdI>ZAmJdw!GuEyhZ5dRIE-*O;RwQ!grf-W zA-tDxG~pP+`v~tRe1LE);W)zagcAsTgcAwCY(%|A!G=%ggL@W!YaaQ!WzO_!YPDP38xWGC!9ezlW-Q{Y{EH&a|!1WvV6dB+obP-C+tvgRfBtS*-%xQV^1%SGo*>=omCN3mgv z9k?|$9f$zdB_EN+fo)n-q_sVfH2tqUy-YacK#&J)|hi3zpc%u=v$4B^DgyDo>hYRFRZH zZ92c=?f`#g^zUc5LDC#!iR(<4Yb359=uHo2OPoi$f!2f0t_Q>fnnL1Ab4PleD)fo9 zW-Kh4(tyasYHn-Ui0n4;o8T=v->y3}py$pdZWaB%4MBYVk72R95YhkdME;)_k^kp* zoc}k0o&FZyM(*#x2$b_bCJ_C%$oaeTxN{RU|2~cVlP|C-C$tIirWkuAPPdhe1CHC1 z6P|=+qnv=XcyxHRt^X{^B~Zs=twT%EBn6C;63-s>$|X6WN=U^>&9*DzZDz&AIj|)n z7g|MosD?3!2D~UIJPC_?Q&H2L6w;eRtV0w?RZ+>b)ssbtLlkaUQHkT~%1U5^D3ZqX zAFqWGb!H`^K@`4<8o{C9P1#e?jkvqi?S=+2IAuUKDBW2^ELfpvrtQcoBI+Q56s%~o zp!>jXBD)-kOt8FZK`ZE>IV+(E;tGsEetD2t1Rhvk1YE_RSqwGNp&XrAgdNn24V~I> z)vM5(m0$y@5ZyjgX9Qn?jsqbEmcA^Lm`S+Mk*~{a!kDYJ==xfmWA9gvG1%)z~DIR#ZVHqk$*(Owk7J!iPJZ7flBXD=h`lOz1AItX?GxN&cU;5wHu_f zfoRj5a4|Q+Sj`;Vhr*^DD3?~=hiHVYIj}3OTZ;{$Gbe0HYZgMtUvw@u+FhEfM+Mo$ zo8MdVu4@e%Q==XF;+#+?<+YD34VcvXVZn&z_TC&=lTm7PT|a_K7&Yh5g*k8~qtx7$ zmCQ`MFeg+=%g4smC}_>RbqjOCm0V{n(^hXzsFIe~FWwf1)tM8Lq&%)#_lU>UkrQsD zOiS?!!KB`t6F#KOtf4%d)pNpuln*@=#ckb~)pJ6Els76?CA5aiYa{H(So_)th9>&| zVkht5e;-3k|D(?D+_$)k+`ZkS!1Os2r-0vq(|>=7bHMAN3G9vhz!TsFT!IY24|zZF z{@|~N^M7_gT)?2e*1!DUi~ki>VO{@hokf*p)o{&u=Tv2^eCde~8kJZT9}yUJ?$fpc zB@2Ufc3$EtTk#TMcurs9V@6}v_CypN^q080vP~-!SmNVGFV+iX6-r!V-%6M=K9MzA zs#erU8B+&@6(YeCO@EMX720CVM0(Rz>}0yM<6uUt>Q($u*StsIBNybwAZ? zHuO1(Z?Z3zA2{)0quLv}s`fd1Xp#PYiaiPz4-F)4w4bSHEhgD-;#zxnvW-eyVLu>! zXw;=YXZNS&x~scARy?LYp!87UBW53_Bc7Y2-wP&C-ml?l>WiO_ZxXzAYp9UT%}z?nY84R4M8e&IiK z%A&-B7{S6Eh?%h)Wu^EJ*OUWAGYn>x8_~@$u5ZtQpc#AE(MO?fF^6G}7zF8P zd_1)a`4%-qbit-}HSS+I$qA`!=2At|k@AT~k`D%d&dmLT-ptQV;~ z7a=G*lY?W(C^qEgjF(;LDI>{mn95@4NzI#Hktst z=HzncqJCuAaEGG5g<#;CbRZ+RVnqDqC!42+zePOB^<2cFxY63+u8D>Msz-X#Juzx^ zVrX{4%|sP6xr{r)bz0h)R5uyOAald+snIQH=UL<2WJ-RE@l3|?^E0H>q@}$di zwFA+^+>@dq;SE{oPDD2*^{1^rR}H!SQSFoG(zEUvkr>=DcQ_gp{?ztYL_;9w%AJjd zFeCIQcl1sF-#>f)p<|^)C==!h=Mydx z_$c8j!p8_#6FyG3hHx$6I>ILi*As3ae3I}f!i|Ja6K*2hO!y4pvxHj+w-Rn6+)nr$ z;SR#*311+5k?u*3 zUlE=m{F?AA;W@%@2+tFKOL&3$|G|#`Q~xW-+~i)#Ff}VS$BrC`DDlhXPz34;DhC6lmfW0g-tZataDcOgW`F1fsUwQI!|cA2>k+C#WZ}pDa8xQpODONo-7mdhlhCalRu5 z@<~jtoBzImP1T+Q`6T{G^h{b43(}E8v`CH1q0y-IwkL;Jk=X8v&13s$4zHEFL%2x% zvGCa2IniwwAXduY2WJb&;SHWBGr*x*dk!HZHO6UpNUb?UjKrQ%VEoW)5ib(E zR)jQyK-`f-%t-7WEjOoLzF)=VdOVLBQB{mkkyz`ZMTMyWyK)E)iG5R%nCCZiO^YHXofYV za6Hvd1=5si#Q|E?P^3XzLVQimQmI6lkgB2eCtnIjHL-eTCN)Am6%{7dj3VUth46xj zHA=rtnq2<8vhEyw)1fiVNC&~-o(U(j-W+_>>S;0N3R5czj@5R=JuTi4WA`wXf=Cop>CK6k z+HxTWRWKgz4N<8x2Y+?oh&B~4Si8bXb4T&fh%)nd_txGN|A>Bs>bv<C9+<9XWAEivukF zI5l_`eYEDl5)aqdV4&uhq0Sum;kGx@$YqbKl;WNoxZ$=n%v2BsPLrRahebIs!)>aE zRcCT)GN{&-13|n)bVO)SdS;QS*FPu`NcuQN(2$tb;t$P)SWfq+g?PIp2ex>JxIHV{ zG1bDccjZ7Guhn4~f!&z{b6jsf{_Nrb6}6hbcooCF6)1% zdx-G=R)X_;gL{wrBlmT$1^GY@@Qw$A_agBB?ngF&zazS5E9?yp_lNup@`PXLU*jI) z-+^<(p3ynr&Hv|c+QwWoGJ=4mW*QEIU@NSYk|$U`7jHc-B!NiF-VzTP6KV_sQ82k9 zY{YvTSG(W>2<6?M@iwI15R}XDXc_|Ny)_;RrVg!GC|ENcYT=dmRP^fLRLTY}Orcyd zYI&Pdfe8xdCc}Yj6t9kBKXAC@g7_0)q`IzYUTZLLlju5(>pLiT3=mWW{T)IRo!pJ+ zO(s|@_4(lG2oK1L13WyqN9b(*qp;d)JZ7eE1|b;|D71AjKHNJOES(16f=qpZN{93$ zRS~oT2U}`6*Ikq{t}b3S;FxTV1 z^^TI0T(blyftK!>RpECm0h#)A~d=N#1Uv5rgBgg7dP#X>o2d z_ZiCc)HEf@+`{$0PvZZ-s{Ef3e_wwI;(wmSSN{nxfX2Loyv@7>P6N5e{iwSJvB5jK z_0CJ!{a^2#4G!QN|Le|!uwpNhQ$quTLZOQGNIiKWu2{YdR>4gfCnYAao_u4CI&xUE zEHDf#>CJ=D(jn~xQ?53I*-jq2A&B+lh1pWsS$r$sm9Iw~aSWOXSKHy%5hKTNy7C~k zSc|V!!EA23@}RTSu3;9;o;>(uP@~tqLsARzP8Ck_V@}L#vAZjT&uvkXT~wEUhFaeMmd< z;IUYdDwK(;!hL9K9wZja-4)68V&Sh?w7#%qMDpn1QdNT^@l`(<9UOS5mU^NM(3}Bj zXC4gH4rxF3>O`7SdtR8QqTSffF!TU+=Dph2hhE@3h^FBp%+5u-5l;*HZ_a~Y8rp9n zF+?3X&`PUr9ZDe96S?*F94Mth=#pL;^J#YG0zRqX21RNQHS;&^|8G2j{l}#=tiDKi ziSRPv_k>pne<1vk@G9X?gg+BrBfL)d3*oPXzY+dU_&35o6cP@>C3pm%kRT)pDMB6L zErj(5ZzZfxcpG5@!iI#62pbbNA#6&hCoCW|5E=C zm#~nqh_INjgs_yb8DSY=bHWyc<%BH>TM@P{>_vD7VQ<1a3GX88L)e$FA7OvO0fYky2N4b?96~sh@NU9kvi`R@$H@AB z7rgan!IHO!-{$?n`wmX|DuVyJv$v`HqI;kFDfcYo1lSi@f*t4Q&fU(n&gr;pUH=y4 zx5u<4>|?XK)d;Y_?A4nGW5nL{vzjrTi!)wlM^HyXzPFxXpd=}Xy7M56*!F;mU=5id z^I(hEQ#Y#wl#%ZIR+zeFbquC{$^&{DTIkAyHWJ&SnI=MVNNXO<5o_^+I~^(P%|hRv z2XiFKI7FH3!8rFX&VxN-6J&J~uQqiz=fNbgIh%w8)!IhJy0 z_!J}d)JWa?Xd%sv4-Zc#`_1l^n?Ra+{AbO^%j^tccJp5``(GAW_Dlb-W=j@GpxgN- zBcsu{%x~hq9P5i#9{*Qn_hv4~rUv_d+KBvT;+;|^W+wmFW)sb;BD0SF=PH4G0CSnt zgR#zW1zu(UZ?O(g7#RQjmntQ4FEXw9FUER^Y_$GgVm+8!cs}+hWy|LOuA*pgrT+)B zyXWnQ8B`3Z{;RPTY4!4d8M|Dpvi=_{>WQJ&|C2Eduua*{>lWYtjoA`cl*`utOI4!4 zKIlIeyK8BUQ-S|l>_Le@Jp^;JsRt@XrBD3tu{#Zn*Z%AAVq?nne;<3d)QaN2U|wu^ zDeCHteL+$f4X;jq*;JoKa3Q$Cve$R7G6T2Dl)~m-%k>}m|DN=3gH3N7+`XlK0p0wTHn*jAgz(51(#FkF~r|Y~oHf z%ZpEUZ-~VyO_4;;Rz}BSuuJm$pz0n~RT*Owgwdj6Zys)5+vmY%D}2rQcjEELuVX^S z^scxTp^ctAc-ppQgl$j}5ndtcbmzg>u2#3W)efqFxot-wYAtR8r$dXt?OkgU4+ppy7D54t%mxVw>pBgU7v&Dl;?v zlH0X24;puqC{7H!v|0&lC?IlMHWYg-diQ9gCl4OCZSrBIm^G{`zZ2?MCZDK|#89A> zC3*0;?F1@17McBZ8aD3{D)#2V=dOM$;>Ird{yUtb9pv`D2e~zb|FZ|q|NJW={=bCm zUaP%humfmy|L#5oP2i(o1fSsU<#sv$fVOZCB8E=Kr8WL7&cmOhpP5nr!!O-Rc8ei) z=Hc3j9&1=@M(wSr(2<90CralTR+wJJDWxM1w@ytt-Xy&q{+t@}(HXd=RSs`XO?hxV z{5ZDxg(DCZAtOIVdwvLV%P>Uw#0un@(&oi?Bj22vZUXU0dPFq$_B>oS);Ag6AH4l~ zIea(Om!~s0$w1!9jyxDwmQjtDLuNjsjyy-RB*6rk0AI!K*Fjy0?I}I-_n_L5YO|XTj$n;2eh|4 zF@>} zLv>1&Hh(c)KkD|G?4O+C7GaQzq?T$)pE!}mlS9n!F6Ejww>llJzc+nxVU@}hxc)on z^9n22X>a|#m}xW=$_E%FruBEHW)~OZ{qc9B8XF3tw732q)JY=|;vD>4=`0HiD^lwE zdvc2s%B}ps{yR;BYW9$o2&Rq17IbArwvfbfQ*9Zknm`5)uH*evOI%iH8 zzb^Q56*6&UlGg_>K>FnLP--bDFLRUW)k>Nv2U5*y`Z(_<@=!t{w^NatBeKO$8RYZa zoxZpz3F{+afnn8riy?cpW1anrdB2bbw|1Zz65pT!Zdvq@;UP`)>X?ikTEsq_kMOo6 zjo;AR#B^#8wkm%k(IeFT)Shfda|?i4)<2N(<|~SZhP*Q?iYAA=bGb1HE<^&bS>*6_ zE_Aw_Ip1--i=8{1%blP5-@-}0r(jQixYz6NgiHX>Vy}NIcmR{$Va~U_ot!!Et=JJf zf~;VdAye1@GJ|i1Frxq1xgg%<-0OtLmvbYPJjU;E-ohEf8|JGGI%pr5RvGwqaVG8L z?3jBY20O(2Q*8{1XwxIJbz7nMZ2o4@web#Ool6~x!ciIo2B$Jf>DWDmk1i1MuX z;1qd3H9^H;){7{ogb#JZ`x77PI8yjbX2xdWG)>+qZ^pHJDMzrEoJHF46wbEs3LL>n z*k!{BOZJ+3CIo9a@xW@wgUJV`R>Q?7{#Wllh)?Exri4N;^6(*yRSwFWcM-=bn#yyrmoe^)YW6x%={n=lhkvhr7PF(0ANtkpKTt z_p|QS&Li#zom-rj-L!i+tbV8Z7b9NasTvLbzbe8w7irtxvwX!F!UztCQVl1ESJgo! z^FGJd3k2`b`hkhlB*o3R@^idm%q$uLsWD?%GKN!kLbMWZ1TynW)LbSr-nV+kZFa#F zFg&8&@D5H_?LKX7`pc|e{D1H&=V_$s??3B zf(*-TP68DlFn5S(ZM6dqn8mhEKH_TvhK!zR+lSN~0Sjk%$lDkdPURdZ=KsD)q_jys zjl!?;rl&{ow&Fw}W6Vf=6QT$CdRqD~l+VPd=j{?s#n17UaJ4aGChqXQ1m38J|KErv zzT}`|`=56K`{51ymEAISMVWGC^S zAe)xMj3(VCf2$hbrac75@#`I^q^Rh46Q*rppWu5B7$J!U$ktHJz|9FAIw9}DFZmhS z8lpw#s`b2=^j(JdJ-`L?+fu|da!@iI}82awxAp8GT z9OwuB?^ogfJKaCdU+VqFy90awQ(^Dl%6psp8$|v~3sj4B)e7B6-FdJs;$A@=vUZB38tAS&58_3QD#7xO zDx2j&zUYwnllX`#vpt|{M;;97m|u&7j~tyKP{%B9I-W4A1)6Bj3xV1)MX-g)(Fy8w zjq%1DouE#~+)1X1(9zkQ2XET;XW=6qjhl2f%Y!++vn2mj-E4RBlP~84xu;$Lg<%>a zZq0*3ZMjWVrW`#8Tk>E}N0IX?3zFh&n+J7zU%6Gbdg{8n!e@(R6YcGm2cLRhagzSK z*O+u@Y9SxMW)oL$mj~T?Uoqs=?CMmuse_D?sdeQ826kWtlc%LI=EnKgmKO$g51Os2 zflhn!!o0S~YMi3QkZjo~gm*3WLNf$4x#Pcs@25R4)N6TGh5^Jzf{#!3|8M61HPi7w z1xTzof^a0^D8hRP?xQuW);lqS02p=I_ zN%$z?D#FJIR}(%?xQ1{o;X1-62-g#CAbgVWDZ-6}PZMq;+)Vfk;j@HW2)7b$$M zumBc?ow#2YF42?1>|2=X78k&zXo+TLE<92z9t7N05JH7an1TOJo0GIr+6uT7RjpLy zQANG(0*Dp%GRE$Zq64mJ@a<8hwE${`wKlPaxCkNKtN>O;i#X;u=~9S`E7DS->cRpD z&{elz8T;H*00-K3UFu!YYo_O%=%B%Yw%uk{oxrnJ00p}GzSs^4!#xEMpx4opsz2Hj z2+-^3$=LsU3t&LUd`lcnl!O@V^b|mXw%0E{Cl1HB6nhGwLEC;awxj+zt%!Dd3!p(; z`B$wf^aZLuRtT8Tu{Xo^P4*TxKwlENWBi3yLy^C*05Y`Y47BQm{=$NAp+(bFWx(7O zU5bIfumCc2Y;%YVdnH)*_V#cJ#q~YyqY?AV7vqHEoc*cieT`aNJ@=1HAa^q`>G!9r3 z0eibw4M`$>Vp{;oDiuE;tgli`1CFAWEvp3V4r~5%~|Cq$0d3XmH^Dm!fG@Ez_(jH?5 zE&`cCyo2QXZ*z}wkneLA`F*d)Ngv;Jf9I{|^>{lX>VFjH{9T4j!1sDjdawE$VOBU8 z+5gY>ulTRz`mFU5{Vytuy%`SIIpr-}muzarTNHa`!&TE;92?Hi@W9-tw={MG;-*3>F9`T~ zEs0&ho;Ry3Lyya1qlsxm-kR9G8DpilMXVJy4ti^2p8|>Fx+;6y)RG9}$J@4sM0E{s zdF;1iYgAW|EDKp=yscuNt5qT6Z5g{Cii~>VnMgzPTTw=h!`m+Q;3>kV>1`h$q^31d zU$wVG>>H1?DK9v@fge8wlIG3ZDc)A3qvo<@i7HZ-GsJ5@+tb-EZ<?j~A!s7M>;-LA?0zxAy`WN%1z80b| zcNP#BQKLd=1Z^uIG$M>EXZz9u?VoLhEvuwhR*YiWQ9wjQnD~a*LTYu6poogjg_su7 z5!(w0iwGm;*g%l1R|k)1h|25b8wqwx9RJZ7ZyR@gf~lRp7Kdz*u4eBI8<+&#NA;$&8XB`K#W7x)>Cv12p1O+ z;83;2m5s8c;%GetIoMwSA0hn{NTZ^2HR{RwzudXO(R`ohBHQQ9IOp#%_c`}(-iBT` zvi~38eZZT9-){*jecAP#pTP@I?>yq2g4dUt6qpjZ8k{e}K^{@(sk{)oTQJyfFs z?nNG;mntWR|K#6PobZ8-PmuBcEg9_x26wFO+yStfpy| zMDa+v;Zuqf*o29L$D<3B*TfUywc*r~d|NmWl*we2Tt6%^RFA|xT*T3orpLxvlR^-a z0Exuc!Vv~Ded6<>dr*^;-y8jjcP?>P*gA~=lIt;(78X&>@*0_l3?_ z{hPzcB<>H3`Tm&q=Zq>xI;SXel`g8n%N=0;uxjl1;G0HiYCR1Gh50djg zzU6-w8o+A*NSxyPHe>*L7~gjRR)IaS{=bGOpfBP)z|}ba+8vPzfB|JDh&UX}zbQdJrB3{KN4`>yHT-2&!J_b}-T&Re+z_ZX+ z>{lQ4Itz%nh*4ebdZ^G|K-5L0z7+*!v==JFF3?dljGn^2xLR%oFN0_jkpKU6=LzRd=PKt6=lJ0JuYp|! z_=0T%CZ73tw2q+r_5xhMHZ_1XbZyYvg%db_yXJbm7G7Z6;mvCU{k^>ahi~Qkf~#ev z!_^%HcywdLXdN3@DwT`#RzC3Pnc-?K|B$y80@rQy1A-Ea&Ay~%Xeo&6Homb4WF3Wx zs-7k3yE3};T6k<@zrRW~nMZp;0xK*hKkiv5A0}yhdjatj6=I~4)>Q~CcNP#$VLOXs zDhDcb6cA2fZ7Sr6hKdU0iwg*+u(VIe%@nMv4A&&o>nb3u!rI$Z)I*K7!Z1eK6MMX> zoa$=PUKqk7kd#)z94s=?j7DU8*H%DSMQ|W5+E&G#yDLb03J9vGnB-XlTq)7UQK!2g zkrgr>M87WUOwY`63(#9Q5mm&>Us*-A5TcNwosL39ghe7-aj4n= zqAV(2GY$m$i^>sb5&uPu7^Wocpfb>c3X)cmZC-mp0xjf?iEbm%pdc3g|4sjYjk)VT zT|~#~=LmNYK2P`p;fsVX5xz{glkgS7U4**{_Yl5HxR>xX!q*A+5$-2EKzNYw5aD6M zHwfP(e2ef1;oF4o5FRCbm+(Ep_X&>?9w+>O@I%6n2tOt~L3onz6T(x3pAvpXc$)BY z!Y>HFB>al-4B^*=X9>>{enWVk@LR$Qgx?WfB)mj;necnUD}+A~{z!P0@F&8b39k`e zC;Wx*SHj;2e<%DK;U5Y~hu{)Cf=@^gl7tkYj_?-3dW5$U)+fA;umNF1!bXIR37Zf$ zCDaoZ5E|tB?{$|s?mOTCSP4e|jfnGmRQLZIdA;xf9DoeqlVAc|j5ELPgjVotcbWG( z&i!h}DM7nqzn?Z9!Uz1H{--~ge}xOVH#3?T*4qi$?A0B|&0ZK&F){63%!r_%2s>I6 zuOp!|*oUFYB{Va~s=y=@RrpZ6*`f4G@4R@?@X0H^Y`kbBz1lmU8^54sSv6&~@=WU5 zpgb)t=Hi#bD&XZSiY8~h3*tpcJLMHBisr_>bK*sl!=v7X6-86C-bLIj2cv)!pct<- z4a0YdyZ@lljD)p&AB@+7!OS}&eyd_b(_6i)qUzj$cXqsJH99VvIGYi$bth*>k`HlP zzta49zY%B5-w(jl0Ci;5(9r5WBv#fu&rNtGu$9y@IWf`%5;bE-4#h%?B~%ULf`-yqJM*)&AO$H|1 z&G`_IV3u-u69O9Xz#0uFK(YYmGSUA#afB!0f4_?Szvm+EXD{Uc`Mvio?;4!$Gv*xz z8(@c*01Nmb_mhYV9Ci1{lc;l^bsjz9YtY} zh_+uL57e~c2DRnJ+}lwEYoy|O^c-qoZADN_OX#c%NdnjL;Sc>C&Qu zfeVW|Qef3!9zPx%HG2zSZ7aVg+<8}cSEacEc-u9a;|2yJ8UTYfh`?;Q#u6+9FOTbu18Q zWNuQ8H5oSuqOrq-f-oBQ>KZXbQ6#DRajquPvgY+i{{D|rJCGt;`1<6qHTQZ(C6l)P zamJtNA8F?rt~bH@@^#ZDPK3uW5SlscTuY~|&|)xM>pqwUtGWr=uZ=`po>oT#&XUfI6 zS~o@QD|UrBXHZsyOx^jhA@frHtaZ~hL`XC>ihR!}*AmS_yBMvTiN$k8`}ew2&3nTK zigyMPuFxvat}2Ehb7kE*v1TH}OkI|NjOLD1U`R(;VA4Z%Yhur0JUyVn#xk;1^8GJz zQx3fRhkL{D>U|8W{arZw^La$|ZvwC04#)(skK5-y4rb82+lh$Z=V1^0o4c#OpSuaR zGDrI-VGj79{~7;l@b|s&KW!HHzZ(w&gb^80cMLz-X|WQfPUj0cJ%$)h{F2jstH$s) zW}wv#rw&{%;cnu&)9F+le|V`SamSKy$sFvFJj=Llj0p2SSUTp=kK~!gI|!ks)kvOU z{9e*s|8!bC`N`Ayqf6_0uVJ}WhTCqeY{w;K?scALwV(2KVHq0l!&gmB&!6u%#+dS3EB|Y)? z(4S|FxrvuTCoZ*|WFo9$o?GIpW+0QJ+pQYFHp(@QNsYx}u9(EIc`{mNQm`cYILlcf zIf-%eu(Y0N?a_ChSYfvd8M4GA2JCiGCYeVP@2M=r3zIm!;%cdQr0DzL-=kRhxA$5-*L@Z~fZN?m+*90s#QZOJ7dU@*e&l?`x!O4o z4ZPvM_9DnI7Ec+mpQCG|L*ko@LWL1)IadapTcYQfKtE|If&*ibiALAr)s!<&R3;Rd zh-fq#oQDEgdlB>(tH;r`So_WSDG;|7L4L6u3!~xTDiAglL40WvKZ>rpqk3=(%A1N? zLYIhYstj$HxU2F%-=-R-A(NqM}MK3by>*!je*fkYFafwTeQrA`lyTw)r z(UCbqR67H;r9*}hxT!|h8mC5MaVc&~M8Sg;pS=zpd=`s$#VB|gdSh{M#U*%&C;)>c z)|R|+dWDc!gxV6`5i%<3z(8EFeOh>`hD_B`?19Mghm5YB8D7PsOxlXw@w=5VhYx*m z5%D8RWQjI5RnrkV?=2#NM9uY4z4)AkO6^4nAF+esWJV2@<@O@tN2Er zQ*{(2BqY9X8{xZ3^8bfn-L@DFymE58 zxe;+7b{65-jzTIe}dn8U2@f=UaEaCX~S z0JV;iU|~{=x`Wrd>K&@!mK5Otk8wG*sSFOF(iGEeMNn2_XBVhk*p3)%TM?wyYN?r8 z+lxY6t$e`{fb$2a|dZ#;wj$E9?vG!dE!EreD= z8=;-hLFgoO5xNOIgkHiz!Xmmea1`M^g!dATCLBX}AL0Fk4-k$e97i~wZ~~!^a3Z0fFhCe23=xJ2 zBZN`H7$HqKiLin&PM9D}5~c{#gp&y~gbZPpFh^KPSVdSZ-+z<0hvV(xy&w7gPD6IT zYr*_^5d8n&cz^Xb^n3j6{eArRYb4;+{;mE){tx`;|Knf9n^*iVd;;96hPlSXDsR|m z{wi)ZAyfOnM1OkR&v2V8Wz#Tf`X*74{5?A}I5+E$aNEj)^n@NH?2mD~Z3?kf_D_hF z;97rxdvw-;>f|457sxfo+1FsvpYhFkr@Uq+Ek%Rejt50@U0>`vDLLM5S~@?`9U4r^E@I=E< z;SbTe!F+JO$*^Ry!)d}1zeMY)DKqM|pBMeV10+8G7dZd(dcWvT`0w_&@ZaM74Dmk~ zcqhUC-|f8xCxATe-i?!iCEwp6NUph|o&a{WGy8`8zXe4w-C7!;-eBlZI^@hVs3yyb zLU7v~#oS-xwULZ%eQLGA-d^aGL7c_XA_#9SyM;|urgpJCTeLUwiC&ro95yuszkPmzzGXceG#m;Fy=!OTcNb6 z2&P+;T%dQ0hNs2R4@plEEH_(omGV9-yC~|k6)mcp%EO$bkS-{K>ee9peQ}h|>7^)c zEcT;eYlj{Pnu_4GS!MvJq1%nY4JYg>xorq|1>iJiIjZb&AOwHCoix6D;4R&%I! z3M#twP6xv6@Tx)FRsJ|gA9MeJ$e#|J`hB3+ha6y6 zKpXgu_q<={H~Cw`HgF7PhypAHclh7-fAPO?P5XazOW`!n`AULVKo}Y1{N&HjmXBF| z2o~HyVT@o_!;I;l6wdcX0?r3klB2_=mzL5#E0gDB*q4#T`!aqi^c8f1m>wk19M1UT zwEv3;9zTC|xQ5A}OkCxk77j=YgN0;mu)OG{SoCFQ?VoO<^x2>(m0hSTr03AMZ+f$Y z=q%%(O|MFYRB~VWXN6Bohrqu2q{%aCUZm}vS#v0u$mF_nL(N25O#5r-R5YEZF+WX@ z!|CIn5-#BK*^86JpA8?<*er5^rYB(%_TLje4K19So0Zb{hCiAZPI106=sLmgd{o%- zIP%KQ^^XqwN76@uL1@~!plZfn5enEaoXwLs1aroJf2eeE#>52Rzb|~s@X=ttlSAj_ zWl`^v{{dP5yPWqq{;%*o-;TKcGvL!d!0+__==~UHfL!IB4*uURUNa(qeu9j@=i?NR z!`*F=2k@`XFP!_GPdev28C+iVuel_I7%SueW04e^n2?%F!i9;8(iAn7ga{++nK3QP zYN;2smcW0pWAS&{YKUr9tTNqIyWvG4~{DbQi&V2@idj8gV}*s&o{=e5n{k=(2>otysx@ z3Eh{FwidyCv3_=RVLWmWHW!8XB5zqhjGyAZmDUg?#_L zIK~&>|2O^H{L2vmG>jY{+xrVJ13ZbmA2%Qda0R#lJ0TC)>o^hMUYrS*b0@$S-o@>4 z6V9)lZ#%a;mpN-|o(0@of-5aJ-Heu74Rpq+T1)VzS-&3MGnr>`^py;`1czFn42cBk z7jz1Sthoe_TF|DsN@iz>8cJ}fwa7E$TRVeycLL>YB{D7fE9Yjx+no%)*x;f{qegX4b5O()6_T zKD3wMGqawY%I!A-WY=J;G~GWtW6qUN;r*hI^hh$nS`?lXA{mLoJ%;5kR{{@c|w6uB$Nnc!aU)8!Ucp2 z2^SGQNVu5rA;KkuO9__|E+>4La0THbgewUjC0s@L7~yKd#|hUEt|eSY_ypm4!VQE^ z5d@BraK!b60I3Ev=mlkhFVBZO}gzC(DF@Lj_92;V0>MtGd?1Hump zKO+2?@C4yW`TiF=S2+0Jjfm*|w(}fL0crye_(*rsEy5yj7c2t5^VWwIa5r!P5F!E& z@Mpmd`lWgYmLlgzpTEZc5cq%J{O59jxh3Nv4>N=AZM1~y-=adepW}`xESQ^i@8HIe zMRKkLEGbjSsXpv}fqUX=Nk3HAe)mysoGkII`+4rNqB3P`WM-Cqc z4!I^z2YbNI1aHZM_LI{hIe~O^$o-k!x+U1oecFDewgfjk>;Am^gOZsBi)Gr%85#NU-()|7ULEoPd>?thu5!osC$}5>)!#bbK`yY1 zoJo@lthoe(qowU&phJ>I2bxHC34EZKeH|u~fw}a!VTGbfdkK^vOZl4VUlkt7q++mv zs>C#OLEKUT8OYM3?MquqU;@Qu;dPBA(13ys8jUBo6b;swzyYckiv+&Z5!qo2)2+S) z?oUvf2})Z^ApF>R)=CpyhAWy&p!?YBwk-n5$9i5XO;CVd1$vKtm5EP-sHp@}k8Pr0 zq?$^E$P?`{qUM@P;O^)(hHipahgx()X>UlxQ)489V^dBzC>Qj3}HFD$HoJ2A!#dtb7So#Cc%z|Rn6$>Ev2{HBbWJi98RQ3s>-0;Snmkt zK+4f-LkVmf`x%`ym8P*sm^RV#247G}VAvxzmUci-B2m|mVTYlqjuHs3F)LDfB0Y{X zzGh*4fV{ONtk)h~$d6n8|1^AJqhdd6C~XU2v?Coio7@GZZBQ=1Aulq;ZKbVIEItVq z502p{4mV};{dYUZ$^QRgc=s>E{(scp&tHrTKrbP;*X=m>YZ~kRZr);i{V(9_zs=LxVr4Qdl)Aq!Vk>ICxXqZYja_Xn%{ic47^W5pF5L|5zpCiHj{I_#3Na zJS(xgBp$}dJBTJV>FmH7SlH!67TG$(zi4lrtvd7pb(F-#7~M1~NanVIH6|fTX9@mA z+khBWFgwQ161USkOk#|GK%$=3&IMr05)m&D&_ZTTTHqP7y; zj1>`d!L67Acr~N{odZ*GH(;u0Dt8^h%ABU zyVLFm5E-=GZE*hX{L*^G0QV2tB1CsEC!aSIxN-OZiDLeW!P7A^)MVLfp+(ohl)M)bsy9dL3x>9i!?i+H)VUJ|cG)Qr@Zv6SGeu#3^F7Q;bd z7h~ust}lsGLVhCtoNS}M1XqMr$|mYdt7D~Xp`o-2rP1&-hk*`T91l@B4pf|?Ry2q5 zXxM|pY0*8~O0zZJ6&(2qX?H1ui=x#?G#JSE5b8`UlX1sJV*Eq;d#Pu2`>z@Na~FD5M;MOYjIjAwftIQiM9fTL|kB-bz@X@HWB* zgbfKB5jG}lLfDj0Pgp=`AT$!12+f2RLMx$-&`#(ebP~D<-Gm-OFJU2J5n(Z531KN= zGr}^$=7cQ>%L!W&wjyjz*oLqzVLQV1gdGSw5_Tf&On5tC7s9TD-3YrA_8{yj>wl+% z{GZRl|9^+>|NF52Ukd&I6)*tqf&VY(4S@x?CH#NSBRB9zkOTDn?rz8d{H$}2bFnju zi}hb?S@twmpaa7-xfm`hV?)!n2j*0xwJ@j(4nIVLBEm$oy+9$5iEUXK`x~um^h(hW zYaP&vx{J%$^Vn&QtLlzUi+-`Jj7^Z;zcAR=+2&TJO`}Pzqh4EiOU$m(#!9*#96`3m zewowT%gdomiXN*vGi1u%8^=aZRE+L2oS4?^trweP9_377ROu~mjw*6ojoG-F34U-* zaGp6TEiH>@bGNXPIu3=Ehi9kR#>1I@X<59SZ%{K_HX6%IQ8Q9jamF@I+(u{3qmJey(N$v2k8{TbZ^nxmkp z49BOnT_2x9*lt=>pXRdoJ+1vwdU`vNLex?ghi7yP$m)yJCugTbUuY@AaqckL*PvoqQRa{m}PXWPr-?u=-vvNMLKG)S1zSQejWbZ_|O$l`1)H&qIt zVq+YQWpR1Nu7KtYfqefR&OQ?V`!)Y6#Q(j|-x1&b%dq`@1>C>2-k`Ua*XaJ%y%*Vk z*CPIJH^lw^#d*s4I^Pj<3mj)lCv zygvply$3t8v8h#kOg;;7TX{cRuCM&~cyzg8ax5vs^4A~}rc57E_L2BG_Go5lc^~w$ z3o4qKRS0a@T*8)QpLma&o0Z>%CigZ?hSf4-b2z7X)ns3g$OBcEl*LfEGpd>?cw!id zDc0!I14Cm4jy>mR-%}R5q5SmK6@xkp%CI5U%kP5+uM<V$}lL_@5O<_&w*2ahSV^T9@MiynS=#H>n_8-Sik)`E27H6GK`G%^0VNkVPG8B zlj8e8=@>)wtGd3-f$LEck_$+3RNO1b<}VH<7b9Z|=;M^R5wM|%(xWH_;M zO_q;93~7*y{$KCy=^)GZk;wnC8hQS1^6vM3iX4CS{^rmGKH$$FD&SiGPXGIFo&ko3 z_2xh82^hYqoNi&xcuCx5h^$(M*KKktVRHHK1PXlv6XzJBE^EPo66V87TyEH{DzftS zBuX^|k_|mkt`=yHoy3K9FKi0Y9;35knZyNjiE&JJil4;1Avjz8Ba2R=80$oj zYLq&fPf-6q*72Xj`JY$$Ipp&^5Z=F}_cVNeAMw_}^S8CPk^7SS9rsq`|Cw@+fY-0l z`5Q6-+~<56UcZ&jvDOP=|7UYq4D>SZ2ReV4e!00k5f?#aFht6x@_1}n#$072jb)hT zEgc5S0+tKRVXftp(3+(k&~8Iva~T$S^{%lLHkbZcikiwW#jEmY7B2uL9pzDb)*PBt zbrcH8ApKR%<&pUKG0KV6GqS9;m0^8X>$F+*gNrA`Hs4krGE(zQptudLKoz~Vr#uL$ zEC<%LS|jSZtqfayeAgid<{9TeM;SKxXu8L+LOOsyR5LlVL$=@Dx6l*K|X_YwW_m36wxu+v9*1n6^B)h*DUI?Axs zNB0udFe*}S8RmLBL3es|QqIql?NeX>0HbPp%P`&Bm7qmWBElk`vcC-Ty`5;ls-z7m zSGTPU8-7Ib9fMmNq4rA7*Cz)%z z0@h3of)jEPRlPkDX zX)KJz_DDX;WNYenNo~wO(z4BUK4BOu@`vs^)QlnfsvEdYYBdJ37`w%1nAWdK&}TkG z=d)E;8r#Utc4xAA4Lkd!;f3iiu-;%Lbv{*5Ch;ksHr%P8o(8Sl6st&D_KoHyB`dVw zX$Dj|ZKXcIpkt--Fr%1f@z<&&6_P7!iNo-O_*je)TW>4wGy+0yYwozYe=A?Z4L!yED|DRGyJzfOHLUP5L%1hC>%xnLAD*+XyUU zlfpbqmG~CumJO>dwr!*CmV908vW&ZxRS0{KRLr=`O~+_Vm#pE{*xP5^y%_F2qDjV5 z7xFzC#V!>DehD8OTr&t;s%zdO2#`uytbwixUPlQC=u%+f;=_U=_gDr2j^ZG6#J9P( zQlFQh4@kP=;hEI8`8i9G>^Bimrg>1^U81VS4w~AMk3*|s$C+{8ZpJFtN`cuCXWad% zwuUvujGA%xwYsvbqp2-OiTNbARI_Ih;T6B5W=B^cM}dH98Nfba3tX8Oql7U+ns5?f1!0^pL6{^=5vBN5~Tjgd(9tC==!h=Myd< zTu8Wx@Ik`GgbxueAzVthjBq*O!-OjcA0b>x_$c8j!p8_#6Fx5c|Ao%ca{ku?{-^y5 z{5eGU?+V@D^?v0&lLSqaVu?S#I^B~@INQ2l$>FIGJ zhEUcp58{ndI%uUv-Z`ZfHO|+eJaV{wByu0rr~Dum&AiY;Z(b9A8Q-f(4LWp6Emq*HMrA2M2PD}$?}_L}HIlQ03&<}w&N zHmeTJ;t|m51k#SSYTj{(XkyY)F>pAf6AK;C9=i$_k`;hzd72oq0 zfCapbzlVR2*NyyNBi;gUJ^yU~BZv}y9X4<@NM(S8C$y44V2a^;{&9loMsJ!w_fO%*+(>O@4l1!rj+%jmYdau*cBsORAF2IA5gdZ|aB^ zYcBo*wO30Z&M8WrJE$%jq3q7_=??c#WJGIMy8P|28nFK9m&WuO9Np)5M?!l|KE|zG zK!Htuk9+MX3LyDK?pd@%=n4K3J{vGuQX81(AsT8+OhE0&_GBP3ICvT+& z9@DG4EF71D2eCf5W`6 z6;A#-0(k<~z+Z5we;t^^-}_h1{BM5(|0@4&Ht1_rrARI@TkIe)dU87&2bdH*xf$Q@ zD1&%%Ss)jkEV*Uym#pl`rTjXA?A*zoKq{J5a`WIXQNWU0(6V7?R!?pdj7=>Q$>sd; zj$BLR08{^yR)HuP{?*ns*l_oc`!`rs#wPj){g2abpp8g@ zCbsaev8utTFza8-jks209)JHjZnLc-UVA;a*>*Xn9RCx%f9~W{CdoekGN%00d-+hz zW?!8Hsbk`0;t)t39W*6j{mBdX*i4Xr^1?tU^6QKQsEUlp0Oy05f_? zsAuM1G=iX*!OM;`1 zSA)B4r9?$SO<6K853U7%BI*Nfk< zB9qLc;^KMG-0a+Srf2+ILdOYxJxk^n)^5;L>_@Ihjn`Q^57JwQuy6u}E#9IWy1|;u z=X+3d@9LUnjYM)SF_ew;&yCAQX!$(2ac@*z9%xj3**q9?P13q*)MgMt(^5A&gL?CM z;n3}cx<(VNs4W8t)8%b84^~~1R9;uZaQb1X$B;Ll2g&Z=X*aCAbRMj`S`RK5bC@2# za~?!IJDAE0H#`EZcOFbU+kYq@Ums>psvncOck7uKKAz-4!sRflYaMwm+8^uG&x4xR z)DYaORKabv%!8NLAv%5V6VFae8(GtQ16masTSdUoG~RMt)iA#RgOaw)LpH}hH_g|h z+}aa{nFkx^H-$ttu;z-172NvC`oA1>KIc`O=Cd`v@RM-z*QXHU`%U+0_a)EwHia&* zqqiU8f5vbczf}c8=ljM6(UC(YnqErEZE}i4};--a~YBH6<-9Bt}5~Fyc% z+k2nibHC?z7yZ$%-Bop}x~AfLPMyj-G5u}g88xpd9hs+-^Uh93=2V$VN5+>U@n9x0 z|9f&eGW@mW^=AHuPdhXHzs|M=dHv}cG)HoIC#1g%o(#C~FAqf#cXD|Hx~#{SLf#c= zd9WJEUts?eMPHsROVZxq&y4B1P81sTm-2qlRT%y`Ki|{pvauxpH#-0C?)a~O{pz@_e_i^{v+3*LlH7tL=avpasblRQWbN1ruLD-mveWaqMuvx1E!6Ex8 z3|`X)VOv_Vb$VE{7##oLq$1F41ct-o2e-tq$vH4QMR06Yw-W4s5L!D38`I1^7$%d^ ztS>Rrq(NAmhD~KHTF~841hY4uItbg-9J5UjGt)64cJd(1P|G$$5sjBge~}sDS}KVO z!&HeHogD+Y!DxY~Rf9BCr9)bX!<-WOBVr!fjO-idH=cyVdZ8rW7Ny;+(Fza6&0n z0kc)9ir5lSeluSBmyTLKNE=p~&d7)ISCucc^YDd(Ja`hC+d!B#h%d519y;L!nx=HS z%tJxpAkLU%PUe%HRo4X*27?17v3dxP^-}pbP!jUg82Wialm5g(9wlMxjeaEOYx)}0 zR1jA)xE9JoyQ=VSX%)MuURc^mgE&!=qxlAlYMZ2_ZgIF|47(VpRV$grQnhbgL;F&k zUO-gN{{`Oq4(|Bc8MgjM!RPno-d)}cumEzf(_a%7zz4trC<)J?*W!lYm;BFi_WNI6 z{^!&HR#jN)b~ZOIt<$^hu*}6owtwh7xxrSfeb{n$3BPZ{Vdi-npU!I0r$tU8V1b72mVT>3bR^k1CWU+S zgX8b8IX)y*U`iG(J=TVMg$l>_*v5eHZ#Xbk5cSEsQ!H|O6RM=6iFfb?A59tUZEc+g z#RRA;ggvqL0Baw72{PM0los>p5|(T4P%OS%*s@PZnwm^<+}$zsP5KtY0!IEFIRDqs z|Nn=$|LaWH`tJvBuM)fe&oBnu=ADNdLG=#sa?ca}-@UL5O1N{~9dYu1l=HpwD!hiB z>l~Bw9)OBLTD#JGF{7~%V#w4z<%6_$jp`;Co(_hoYdBbD5H*3p&{aHGk0F?TF7#U% zYNo;^gD`UqtF0JjzF12KVd5%!n_yNz7?$d?%`6?HeQOnDh5~UoMy9ONL7KJ30vB?n zh|-h}!k#rA7jvH$u1a`INg zic1tORk%#ya)m1tu2i^6;cA6z6s}dcPT_im8x(F-xJlt=g?wmO z2sXRWG?NiUobiLSZy`Hil4G%K%~Ux^TNm!YZ90O6e*v%9l)KO&r)m)PF2Yu5wK2R- z?%)h!R1d=DMGlFFVu;63_@Yzq?d5|oeo4Db5c>j7h*DnUQ8-BZm(bdxv#m>R?<^do z^-CzAVZI)-FB+unOQ^D28s^Vy=bEc%kZ04PAz0=~E(_zrG)duLOFTeRj2*ze>DBG}AdaJje`PXb>cOjMFgT884FEy94k{kRakN+>u4s`<<=|Wd z@t4UYq7SjI%p$r85u$5sF7a%Q&H2C9-N$kFfk)47obkT~H~qfke&YTUw*XDS9YD?S z_|$L8HZv?WARR^ zk;kc(NAL>f{c=LJW8_h4vk?lQk^RVJ5fNOCj+~F}-vrOKm||)-vN;kB`oP5_kB>xy zca`>~BNrHpuLV-$zLCd9(o(-a@))%(u`J-rY94f5Dx$S&ggYypdspLJ+TBB|Tn9H2 z^~ho{D_qP{(%~nYc0`MS+i`^lgzdeGABdD118#HU$Zn;r>3l7Jl=1F#F_`y(5#8c< zHSbA_Mhm4c(u6(7H!ym6_nTn2Ck?KU$h$VJGN3QhyazIgs8Fr%%)8F228ryVg}iIh zx&iFjJJ(%*2_gc^9P1&Z}zj`XUOcIbEV&R|WFO2DQmTN;2>kwy=Id6F6}+Ob!4e z>)HQ{-5(uT`0fM!-Vl2F173yuBhCQ6=6#J*fQ9e{v@y;B?&Ht*m-(mpSK*$(w|=qq z`QI?csm{^vkirHRyGD!+Y#Ut8bc~#cE+(B^yrP)Le5+ zhC$xeIYY>KbK;t!bW|iQR}14YOk&d;c`tO;gd7Pti;Yt)7fxm8-K*mOH}?6@Xvb5g zi-(GtY5qYFvXrw}U=g18M(}^V{3Gvl?Xqg- zoPUfC4WawE^ET2xpCK3WpSHrxtE-1bq@fc-AxHiZzt;(25m?fC+;!NZ1LTNj)U1cE zTbg0lgXOc{5I5pyom$c%K|o%m6_QE7t&X@|heAeN*w~5l*i9XID{}omj`x4P5C1748w5xxhkFaxJkvDj z`7*p-BL#bxFYYvaSGNa;nktdM+hoP z!RREs%B&>|ay zik`|ZOsyUj6=YtX8jXO^YSqjREM0MG6oNy0Bm}23<0+9)W(zWzts2cNsDrB1DrlqP zeTSECVTULe?b&U5)EHN#aAG8V$r&Qhw|8?xGnARQZIzC#s!}*M5>nG54vD;w4zN6h zvm+VprA0_HeHAGjAd#)FH4ckFU+3J#Ri;KFoD2MTI31ZFLU}45CE(s!hqIsrRKZAa zUasJv{Otb~&I0=Xei$0Q6Z{4Ko|x|oy}#r3ulu|+;Sp$e=mrbi@31TQ9lZY?hm$|E z-D>A&=MCpp=QJe!cmKwx$U|<7f=V;jw$6{j4X`+~io>97Jn&MLf(b$9SJ7x)>3E1S zE(HsMjN&^ks7pI{ZHkry+}h^MP9s&OXg5GDd#*^xt1JbZfsE4!D-9gt2_sOHf}Oya z8YZVJXf&e0q4xL`i~`~xi+f92=QY(KYYgrkLN}yf5RmbruOjBQs5`n8EC4dz_B70# z@28;pkB*c$0ox^app~bf@Xxe2D-~K3su>?tlY*i@!wP7y-pnRE2b+Ca3R?d7N2fze zQc&*4%ZzVg%84mx^@~W6h~OY|xwtN__WyUg54lgeFSxH^p8puSzCXD?;Ozej z-YBmS_W_T`8el!#0J{I2hIfhr=Jh67M+N5HjeU4sSshdslfk;@!s~dae-us^o#3AW zE#&!NBCo}5BzO4_`cL@J`>(<~`A7bj{`dYr{@uame{(#gZu1pJDy*QeqQXiFD=Vy` zu&Tmp3ZoQ8E3B@thQb(yu?htWg$hLq#R??~r3z&VgTjsqJ1Oj}u#3X33cD%nuJ9{`Jrwp-*h^t= zg?$wERoG8qe}x0s|HpbW9B&3}{aT^zKg+us=YC(u-rt4&&lL31L;S@!7kn8!0KVjZ z_`kVd{qk-9l^RgyiH>aaydBmD=D^n9M)$TF*3l*icER6RH^%aRF!arHm-=h#c2{1t z&7DgQ0_$ggecdn1YuT6kQ z{^-67&)?^|z3u{cSCBph&R?B(oQItAola+4w3#(iw8YsKD;qtJy*$bhYmP}NTIXzv z=%%x<_*jzYK^e81Ma-I19ab)Jvq)~RG_J00V6qd^=0TWJv`Al&qQwq(rncmo3(If3 zFHgZ(XN)ZS;ZqhXW4ePAjzZiGm!)8?6S!2xzJ%8*WRAELrD(4c+G%PGh%HOeSf>Wr znVO6%{j|MOQ3}>Nk}k06fJ@poUMDs-1&bZI70W{CQ_8{D!(J!sMo*W75uxQNSntGF z`}h(x6fSd1Q!wF)uYu(TC%;Lb0nOQf-%pO(4N#hdfS4w zy$xFtu99m~u*!i2abV+<`H59T7siIUbzQ-husQ{MpCX#fNU+9#1xEz;`^q|rZ-a+6H+h?Dq`OWRYiJp9F7Ompm@BHz~Ga0{@>6+Ki}D# z=k;Lzzg_fv|L|Aw%Y^&i2`2)N^)G;i@5Nuv{r^{H$p5u*F&|;<1V7nQC;L;3aZL@Q z)buv=7UQ(>V56Z}1kD)=<6MQUe0}5US;BZ;cV(yxXGId|@k!V`v^KUht*YvPkUTxG zw;GlW*zn7H%%>Q$M}%VP8>Nl&Fz=?n^Hewp(5VO4!zBd#=Jbl=vHj zN@i=LwL&X3PMsO&3LXBMoc~LmUpY9fcbk7I?*5zM7lHeG4QBubu^-q8_x`!C`?(GG zeYN1m&vo3Doln5`pXGERQI5ab6zy9$4%>_y(rl~B8>3xyil#1{ezPM{34$n7QZ#u% z6Np8T!Z*{UJB_E0lxr!fQZ#^}kMpQFrQ0a2HU(3d&{Y~%C^(e}v?YjClY%Ww=oDur zk~I*-DNVr;W(;ROo~%%1HuSPsRUxn<1tXZu1P}zL^$Jxfn80KvAPYAa*TTk(Pr(8v za=b>f&^XHPBBOCBSi*!4pG0Db+FoM8EJkA4sw^BU?Kr0<1sj>n{2MJ48BIv4O~G0w zL#0}ruzdg`)udoJlO;%JK~eG}PI-zpG$DH5MA@x(Q&X^{*^pGW7H{TWd+Y*jg2iLY(**}PfF1WC$!|vtyD$KnpC5;!dz?V)+SyP zSDS*}eA=^bbhVv6Jw7f4>-hrG?NUDxD}c<&anApvy-gi3d;56p=<}Dt&gT=H>n+5o z-rcbu==ZM%2lqjauKvrb|Ku8o7@lxiNgq1Qze{(V)-D;AIjfofpxGE{dt{&;e(cD9 zz-*zSM@I7>jvTBGjz|W{^6#yMwSgGf(9DJ1J${Td{~@z~Qo*`Z$Ui4i5KN}&bB_6U z=$76-fI((+pZ{p2EDTY52{mWRzb#TLcH~Z7PUK&aD@=Fp`Ikk$A=gp8{A(iT$1Mu0 zkB%?$uZ)&hk9hL*RsMCk(m}Z_o;C8X;{0Fc?BV!t;r!3J@brDCKieZGe8GHN?)Y1icCmr^qH9PLohWDUEX9LrC0Xyz%70h zh^ii<#W|Ot0SBc&Dr~C3kBKEm^$?8ChlzsQkXSDjLoh!N+pSw}V!(*-@*!HGXRmiG zhw{{MIfKo-q%s9t^ssHONl$xcEKk88J%@O6gISY;9eVbHR+iy`zZ}m0qr6QVZxfmS zPse?~ui@^WQhzgO<~p$>xWRw=7r+16!`y%Ro5&PzwxzbJ962WvC=|dFn8e7ilK)%v z)`yPB={gAHL}okS{0oPTVH|A!1-dQHAw#I~j{Ng-ir{n|WO7kX5saak3uHu_p2iJT7_#Au2#58;Yx)o6fRe|OyN?6OB60vxJcnbg$oqU zS2$1MT!r5%oTG5I!dVJuDx9J48->#qeywnj!odoMC>*L#r*N1;y}}%Y28Bk2CWW~Q z^AzSQG%Fmgut1?jVWC2+LYu-Og(DQ&6*?3;6}l7_D;%k?L}97IGKHfQj#fBE;aG*^ z6pmNuR_IYkC?pkn75WtV6$TVeP&iTHB!!a|1{G2YLkg!ToT_jd`+tef|J!(b;HKXr zuxG7FY{5!Fz!lTmn0Q3vt%xLI3x^XaaKg#{ZPJN{%e&)XM|tL6{YT3 zkyk9Idv^Gh99neG3BM8-VeW6$%Ai3?zeG!ME@=81(>BQVbtO~-G?Aiy5NAND*YHB| zut92VTQT~gt$hV(BA`%}gk(+gQGh^?fr*`Jm64$+)TOvsG=K(_B&x3AQ4Y;;74H8F z-5$sP#D5Alcc=QT{=Q%UCi<(vYVRG`@m=km;&plZVSiA7699jJCZOj(rH%j3eCPBb zn1!y(Ljbn7-)8q+w{2-!2p!byMp(GmP3avpJ#T`87i=qQhF~ii+StiWPqx|*HQ4x+;-Lx1oQFAdKR%~nQQMJrWOsV zu;RVJdmNU#e}Vpg60H9YhHdWg{;#10c+7vz|N4KXPyCY0|DS3=r}UP_dNGJocL^PN z+v$EZ_PP#UMf0{-t+fR4$W7i%oipVHdSV@VOWtm=ca2Rgd3FO=I$m%(cXyqJgZD5j z%-c1TJ^8e{`c80vbGka4^0o;TSb{LrwlB@wGM=Kn39bs!znbz6)P1+e7js1D8G^8b z)R-?4Mtx7x~t@MJv@hf0dA_-s2LzzvTHWeVp(c=&_iYNApu)u5aa8j)nZz|*s&YlW8i2xUelWGu9 z#krzLrPMVy1_V7MRa6JTg}H(&s}L*Fr+Cg#k;QeSE7`GdVkX>~l#j?gnb#(Fo2riju1>bFAUDqir z2vUxUNUR)-_fk)*8I`VHI*qz93mS8w7bNl`iAr52q87r1$yT%ju>aRMjr9NjD0cSe_($TT|CW9& zJOI9p6Tp|_zRx4PUA^fz|N9U3755%^|LbuNcDIKWaHTuK`N(oWy#c2>+PvT^%^&%@T)x0UtV|8Hgn-@re!fT%>boI$By3zPEH! zgvzRS;-W5ID;xaiXl+HCAWVj;i7Z_vmpzrC0FuGkdF7Ks^FUG2&-XDR`3k|qWSI6dWNcz!|ytj%j6aMt01rH zwVA92@5-?|f_qTjshX)?RDR7`f#C9-g4yEML=7Q?#{;< zyk?xr+Yq+DK28C=>fMPmz#ZO!-qzkYZzcCj+zW6!#(;i!1K$Ncz>1x3owslf_*|z4 zLbCp9=doaHi0k9p@;dEZ;f9F%EuM=w()-qj3CaAn#&l;cY(j`!ioQPEn7&6I6C3e< z3Z<^c+n$DP;%hV@o-~Q|8aix7o;W8+yYBMS)(2_VO{c9q4DV!YnhyKJW;m${%_Dh^ zTV026X>QYV{R|`UGaQN-1)QL#H`XtO0iDc4K6=F=2#~Hkou@N+auY4zgKy@8nJ1g| zbojy2p#@!kjf3!7K5crYcn2~nt7V;>!(7Dy2$zPuPOgSrv_D0%iL3*Wp^jO(Um$nw zoN^2HWkNR8wZjdyXrDmd+EID6dm~^%4dSnb@x8rX7v|A^S-ltHNL8+tt18iK%JxJI zaR{*%Yb?~NIkoJ8z}4xhV68^DClV`0r|?&JDa~n3_Bm}%sN%xi@m`MAuE`4S(8=6& zig&|%X_#v+TF}t3?t1A4Sh_1E@e8I!M-=?Tg}Vf~Ov~iLUwCJ{mtS~V^cODOi2 zY1z}+juggUe;P+y9Slo%;7jH{H9Pn18Af4Kqq%R#Oekn-GFwsTkZX~bl=6XmLp)>HKcSaZM=wCJ6TouVQFhg37{9O90$oc@) zU*63Xl1!&F;?pU{``T`|R#FwGFYE3+;u?RF3(zt)Vb4=6p3 zvRTQS29=CC5I-7z{*q%6CcM_BO}Nq?%{ATr%8o%$6>DWv@?&+Gu?{V{;%Lg0Kjj#CPAjUu7KR7f!s~9?_ z=hz(NxIsL}`9Y2wL~(!Cyc1Kx%6 ze~-D(zz4|d(8qt|e&K%W{uN%rJZS1y!_An|QOqCGLcK!}f)Ce-6Bd zw|br4GVgeJ2{_q14d;u_hmG;o@DuPm?;hME^aS*bzX#v=9;}YP^1g@V;ZN`tu#!I- z7Rcp(tv?yw0ye;@gf0B-{9WLiWPeyFHu{IdPw8TC6+Qj{#;nt^Z@JLF9Quo!{X1~? z&?C@gya2BOZ}}f!T>HlVv;PA=^Z&_To{z@k^67be`f#a+UEm0L=E*ak&%BZHT!GL0 z75N;wk~~-DbA?s-Tya%CS6YqFRYu8kG@q-kF3&aiTy2az$MQL^xC z%cse6O?j>*&$aoiSVx}I`K(-*&#LwKtX`kbaU1YCenUPdY$VT(`JA|kJU5l+40&$G z=cJkPoWsb?fChhtKsIj5!uWU8gfhM{Go9I$|R-(-9kynU2_q%yh&?WTqoF zBC{N^5t-$jMpKblj+pGsa>RgVmLujovm7z*neB+F&um8we`Y&k1~l6dqoBxc=|wvHG?ZSP#im^(PvE8L)PBVkA9CWV_7Zc(_Eu#O4ZIa~@TAjBuFq zxWW?(Pbxe`sCS-Lct+t_h36EWC(LnPPYEOxBiLLjB1rj+z2C0c*VOaR`+)?Us=xP*rzrklPl+vGO8XVx6Na@QU4&h%^of{ zY9b`J+3DO$x~X@NFPokHWz;=LUb7>4Rd-YQAV=0ZYm+9xU+0em)=km zcT*7|Yw%gR<)axWpr{mFcF6 zLYz9x@~KsF3~h%pCjYqHgLd zMDS)(M?sb-<_ZX@VsFuqOrGrjmCgaw|2>ZWpM;m+UE%d-W$!!e{%`P3!1{fAZ!K>X z_Z!&Y-hjTp09wB(*dKrDJc+&kY0eTP&h=N`P0B&eXVyWb8_?GBTa$k7-WI`fQA>DR z1xZESq8A`Zb|`N@%4iKsyQv%yGWppv`+> ztfXijW!+RI$am}}wjCJ!EEG+ovYR@EaUw&BF>!4ht_G?TG}Vfg3c5@M6?Ie3Am6YfD=6~~W!=;=i0mD5$)Y z2k!%D0B^vK{b<+)@9eGXmEtVm2jBs&bx*=Q!8^KZ!xPXC&IcF?Zgfs}mO@PSUqLrH z389BuP^{3%Oh!UJrbXwAbeT%JsWw=B96otL^J0A+%n^m%a}g%<&jJoB8j5~X*qzoE zEXYhu=rRS}R2N7A7DNj`^?(#$L976U-P96DCWmJ-K}{BS*9U11kEN;XJ`6#^UN*z8 z0B>#xl^n~S%5JI$B*Oe*B2YUZU1XlB%fj=gjG5FDNYkCii#aS9bzagfY63R=xmvDp z7H{SA zIq}>}x~UV87FZwT9<;!sZt4Z32=(zIh+cp-hWj-Fg_SfxDg~qnaK9g}04fEf2=(zI z6m?TCAlV!i&t^x4Fq^|-+3XNxb67MRY6T>l!{XVn|JSPipZx#nehV!9r^5#bZvcEA z9Nl?d(p%u|iSs$tu>Sc*Yyd6+KX?TE0MBqs&?(+^9&|3m9YDic095s0UE@j1caG0) z`fS-fSlM{;NzU>7+VogZ*~3MRq&+TY(y|^|+pso{0}z#J_D};M0Y}9Gu&UC4Ww8J! z2v`~o=%&I!L@kL0P}?8@N5%rEYmk7&u>k5BB%mu6Kn;TgbjAXxT#$f{SO8TE63`wC zpi)5sj)(1vLngqAikQY&TU1GM=;s zJz9DuRR+>CTf<$Zu$$@vk<%KHQ{7Ef!4x*Pg={Yz=i$8?r>;XY5w!+VIEkVG$ZSG4 zl?Cfd+H{MF3&2N|byIO5Eo)&qUb;z_bW?dCV^d4;CBfKK*u5agx+T+^Wo$k?9gwLo zl!^TRq3%|WyA|g1Ux5KU)NO(upu=4T{%^n?f)?OB_fp&nbhCRWbO4XL&tU|3%l!}< zfbXCY{MpO*Rt5iG=GEf1py}SmVE?!EcJcOt#Xvpw4sEb0J_aMmNnrlZ_AbP^q8q(C zaKp$GxLx#haQ>fp-+F(?O~WgI?=OaL;K>+!HUZbaga0cq{fA*UvIwV+jt9$sihmY3 z{wv|7@D6w)djkCa>;8LS_rLZ3j!*c1_@_k5>k5A$G&*k(nw&QYbDg&c^PIO8-XY9) z-X%0U?-34n-dFg5u)z6H;Uk5Q6+Th;l+faQrtrDK7Ybi0d_`F3e68?}!XFjBCA2!< zDSWT+CqkR^XNA8I7CC=a_#5E}=kJ7e=O2U)=LbTk^G`yT^CMxg^Dn}Y&QF9T&d-FU zu0vP`od)12*CQP5`h;WL5ej*PW8Hj(k%Z&i6%3g1Yyt|U&%7WeQDu$~H_PDDV zjuK3`qYYOVOuB0b_PS#P``odH1%mxVpuA8f?H--E_k9_VOS}6l3Qh1 zEqJn9V^}LV=#DcSFPL&C7)}%%awi#17CgnBVmMXsRCk);nuco$p60G?xQ^j;!*vCJ z?XD+yy1TyMZ`=(8&u};7{9i%)pZERy(Z7y`H||;fINyQw-<>!Ma2$H^2HuLW`*{X> zz#+`~d%7E7)&Do=b>}YUx48E=ht*G}GnV&E=FCr{5@$$H9JS-jMhovA;y~8}CeV{z zi!&s4)nU7n@*c2&mN=CwF(^PwoXU|HT%aW$%#|2qpd}v6kr<4iB|bS<;+k~glXD~n zFKCHR%9R+@pyhm0j>O;xE%AxD5`!GH#3$xR43^LmpO7mtXhKVTLRR9*J>Uwx_2s7; z;N6V4u$uPLc2F$+vtiDd+5^(i+gPK@rHaEvmfsj;qUAb}m1{{4=tNI8VNQRT7eIq4 z>j9%^Df_ch*7Sf(^h7uB^mX8-@%DPm!a7R^BvW+{2t}`g8%d`x*wTlhU{_Y%17gvl z^yZFI)B}FeleK`8j4TGKdcZE)!Zwj}kyzdXlF^f?+(~55CnwfbL-gfNnGa-Pr=z|Eqcb_XoKDgZF>V^LO;u@yB|9fgg~2psPO~I{a;*+g}m$ z{mZxkb8cpB zhTo;A2ZW)8{5BF&+5?i%lO3INPTY39tOp#S^_z3D`b|L(2trS6(VeqH#^|LzpaxCk z+1Vn&44TNZvqYBlfEKjSvvP!j8nnYne9t*esz@!WJQqI+SU~$p zPRslx_>IeY!2MZ{r)A|>(*yd?6YYp|D(>~famf0XFuezh#-bk3fF}FYm~0S#Ci~PZ z+2uXp{%qJkCD*VI_RkWZl9ibKzsfn-@!v)NzuZ3&*1x-84L-{I6KsEf2TuS;dxv^k zVs*a))&MWLH@atHXRyD!5iEay#0@}qIOjOWB6-fgs-Af)m<+$y%31KHu=Nx^xuged zo^_gQTbr8T+BMzF%X&cQd16}STst4uvYj|Yq@gTx4_G~ueNDD(*hy9OfZy|kPIInN z*YegrWO|U?LGxMe*JR~hpU(Z79Jzz+v)r#9CU>xXmiyI8*2Z!#?E&3q9q#H#`OumQ zdqDMhvM+V6#z%*~8%&?&d{uVN;8F^E!1r0wtHMc3dqDQtD0F2cDKaeT0o!Md?@AtB zPv=CeYFzuzvO#m+P%o_My@#!2H>7csW>evFS`pF6;sSXC=KX zT~ZmRLH^k|eHk=ib@9?x^neERL=)y*hQm{laI}un9*}|dsh46}Y{wO)>1<1SKnU8; zeu=(KhgJ4~6!b*l=Um*<4Db7~U#+AE%%CN{IGh+?TiOF=&~m*vKFnA4fE+Z*7v+`= zlF%eylqDHNp-H|dF1e%!Ora&bFq}|o5?rCxP24Tq9l!wW?;ZyG z-bJtjJRbZ1Q*a~jg|Gp<(Y*t^|0kdWeBFJ|{S4NBfA<{N{*CsE!3$2t&VLj5@Yw-Y zfBSofVc)+9{)CQ)Cy`U2J@{X_>zDo0S?&_ND z&)wW`3&Sl1&v&;n+}dy(!3*4N4YxDgUhqP92g4l=cM`nF-Pv##!(9b0c6T$}-SAg} zm$-WfUh3{Cc$vGG;ogS(2wv{)Yq+1_74H6mSGorn9w>N~dywJ5f>*nT7#?a^XLy+4 zHEzA(9K!~~M!{>{Cd0Xg^8~MR=NmQ~9xiyjyTGu;aG~H0ZmVIN;Ud8s-6IU!4Lb}w z4Z8$yau*vOX}H92so^rgo86-fj~2YeJx1_W_gKL@+~WlAbdNXeHtaD>2;Su;4SNmy z4EqfS1n+iFFg(%lB*T*p2Mtq#_qaox|I2Cr{~q@L=fI|RUs&6Y!kt~z{-1~&0q6mI zW!wk;Ff4z%!47WfuHk$Ijo+0{e_;0y5%O1&0O#$A%HO$@Gevmp#Ee{=0QK#Ofr4`< z&d4^C2B1~A>r^J(^f+~=xzvmt?5j+G1oz||uyZG;8QGi$N={^7-2*b*6I&PO4qQJ^ z+2I8irmAs0pv65guXb*wj#+$A#?6z)_kbh!rpfO177V9wQ`ZsrsSD*-+XKej6Y~-0 z<_5TM=#WFpI{s!hpkU9v0y=zfZf?a2Rkye^;o@UA{EvnQwLRd`y(-!jI5%Ns2$v0W zo0o)34$GL*9&qZOaK6q>xNbLMf?nMNUfsU@CewF^YaT0|+8!|MR@j?{D{N5@*mhe2 z+>}{=N*O`7TN!U0zKo#Wt&BHjml5>4mGQ>m$_Ogn%6Q{&Wi0CfFK-Kq8w2|Wtqzp4 zst4q}Esk!8tOu`+p_<|G$g-f3JW&{T!VBo#d|w-T&=4`L`IW|5;uQ zn$Tz9{;z@FuN5}{t?Q0<{_MQ$+yeWbBck^JR3^xcX+M1|S3j*xkRHJB;XEXjW~~7ARhb}3rimZQotQkCCVnt0 zF^Mrv{9x|HB*QfE16helg=yjkawjGqrit&*N-S)c3|jZ+N?ed26{g$%`y??2Uin_~ zUz+QExe}Hn$bMdQT)*@?M(oo?Hnl5~RKKH@-VQmB8?B za)P|qG#NGT#+A=?xF%pBeT%>-Cfublc8*Vw029L^N20=Ka!XS*F72)oE3-&6K6LJ; z=La!8430|`C01g2q@UfL=|EC}P*B^a+@1SVprE!-xhwuDC|_*?Dry^C@4}~Ke}qh( zP*dB~c~^AmEKTGgNJ+N47R?XMLQ*;?sjYN(Z74NpFhpGhGE@cZ|%^p=z38e|LUOEfD+BhdP3u1gKOOW-_LcAJ17=?N$ zOOW-l(5xa>CCGi%Nbh+C+tgNQba5kCXtu9RkO0#L`}ePjAQz^IpU;`N zGC?{_^M5W^{v`>LVmd@T+tvy$!EslG%pH=qiqx?$dD?>F+4-?0ryP9vjiV> z&o(?q@FDlNhUW@C?4DbO=5`5Er+VB~}X9eGKpEG=3@NM@6!FSvj1>bdFGJIL^J@@y5@4K%Ee&D`p_?qB{ z?(2qsFnmMsBlk_iw*)_S-!^6*{bN55Tj|@K+{KEaj@KeDr z-Omg^*Zu!q)c-x|UxGWh5Aiq0sapruIk$nmTL4CHeQz~*{d&s142)odJKHV6+W$4@ zW}Nz2;_Q{9>(nMlK#Qfc^HED1Okr{PLVNQfsAn@a&!q{H(W=4vP?tOw2-dPRK{DC` zl^VA|OjxxE^3f{(!{NneSm_TU;za^kX_fH7a1v@0B&Rjf`@=^fQLT~Q8!l35f@HOR z&AZuUAycgq-W^UtZGw!oMtW!XNTjYc(%ZvDDo>EU78`fxtziEgu3IwLD&wu;WRxbz zWb6058Toba(-kMkVyjN>O_B&<;UuwD_?yECuT7B5)<|y*7pXcyR=b4PusMHFQ|Vx> z7N{jAB&d4URp;x=U3F3mt*g%0hgo$}6RoSx*Rxlh+agfcm9OVmby62?p;@cW2?=VW zwTQ1Rw}_&Y76r^}!xWL4X)WSw*+rycS_|=7RuQ%T@6Ypp4?zEaJo^6(zW`QwFGKs6 zg5Ce-UNKJkzXiivd0No0U{|;yW9Q|Kj6(`6zX*>8Xv}8l~t4xq* z(lyCf0HvtX@XRf zHuJBKoDY^JI4dF}6qzOqjPwB+Uq~`(8~%E@He8w@)1(r3rESh^`Bc(NC7EcQZLvsb4U-bo1FtVd`XX8+5t|tzCM2j2UMFYF&Nhn&iKU4q zW-IYNk5r!gHdGB;pzd=rIn*Yo71rP8^JrNz;%gIB3~Qv%hKp34poUnv-A@r|z1WAN zcB&Ip6KA5V8;gQ3sZCH%tXX|BTvo*is*1HUeawAA_L`8zu^1-0r=?{zz8tgtH2H5Z@Txv_9x-afd*hScK?q$mpk1K z?k@g!{)&@inX~{uu}510aGs<#Nq$K`;3sVFniqBjM2)d=ENikr*);l{FEMZac~V{fKRX-SGF$T`Nhck}{+WA>N|Joirv3x`b!txS@6(g^>^9f7QqM)-TK2;-9Eo~B6_f6GLO_3D}= zNhtA4>V#v3dvr;Xx+5L&{wfr9@bh9cOj2)TVPdY6`C%)QR2*p$|C%X5<|9jzR2*sI zzr+(Ks58>Uf619RL5-0n{&Togtlk9mM4I@|xe`|ivjzRK|NnQ!uk1Lo zfBMS(((o(8uMNKu{M!Aa;kSn034Y^#FZf6IPlDgNe>VJ!;CJp{4gV(iz592=e;EE? z_)oz>XR zlHtmRs|fz+tt$90Z#BW6yitau4Ocf@!*Gn?&)!(W0>eVXBBJYf#fBwT)~?xxS}^ja3yc5;WWcF4c9VU zTX1D>9l=$+>4K|z>k6*st!KEt;3#hc!O`A^h8qd4?rki%hPR2}7;jU-vEB^90&g?J znTE3rXB%!VSmQn@N))Mc)bO_GXSEuk9`8Wu)ft_pLP zCu~ZRid`+C6A_lHgw*k>P-l5Ui<4CN>Z17P(4tt@yHxe+diUpC>s@Mlb-nv@P@IT2 zjEPCAd!-Q0&&w+W`+upko8!NYTfNSL{%>!8D!hNZk5hUl!}5PqZ!|Q2kHZ4+czFHZ z6np=FLhpZrbF#A#iL(C6ljKUI+;rEktC>uFmnVfSksrD!SgcquWK}0gmrRi0!Z0CX zQLtO6Ns=?sU$u~22yVP>YOlkE2o?vGHz7&BL^hFbVP?@|cfVRZZlsfBO|-Cuxe6=1 ziIyf;VX5@g!WIlySZY4Cum!^wmRe6OEUqXBRF63dOWmgywjftwMf)j*EyynHq$Jg! zvIBR=hH?p5v&?TWF-cXZw%#$zYd8~=)QD=tHI^4~Qj(fc&3pCb<~=1z6{+^J(LuA8 zO--&|MrEmHKYIDuQ+uk}k6Lc_ehwTf56Rl9X`KW{aIwe+MUb*L(6wdD$$n50To z%eLzB%2u4DW>qJgRYDUE`ohE{b*d_3<>kpJNm9WoTNHOC(Vtq8(OasM)U9e8T`AaG zlZ>+{=q%d*w{vis_Ey~fbs#){kH*=b*S%Z3({XzDS2+Dw5 zij&k~=xUAnhdvmxXjCw)MTiPvRpE#!w|;E zEgMcoX_A@@{eaR4L5p@&oTLUrf1A>nk|Ig{g$genPIzrHt;ujphKsa8lA4TNr8O3Z zei1an<+YpYBy}6w4T^@FSE$?2d8KIBd4+lnomYxNxknm3s)GH$n)ZLM`oDwsj}Cu7 zeIl4KvR+=Th^i-kh@U>`~t%7S4UH82aZ@Qj#%o#sG=Y#ybB$cxf==ZqSk6f zNpdbKeWQr<$|T7aF(ZMu)278u5$F6c{w+$9Y!Nr_?gkm#E(d42k|bHi$PcwX+PX2} zsGOoC$ra6Rebn4~X=<)0Nn#}vvaW`pGK-R;_#mm{GJZG>^&XmrZ^LP*@X!*h8!G`- z9h!#m!_uhY$b^KYQMI8V(_?9<(#V8l(v&1cpCP4Q2WjAROrQ9ovLw|R;&#nl3m)gW zpRqbZXlXL7$8e{{cRH0x>M?X)n3`)|s7z9sp%JF!jzD#WMwpx{LP?UU3>}Ong(*7x zekDmNF)S?3{UxcnP{EUO3#QgW6Hm-aJU5+qV(!FLP-x-_;ZkAvuS`-up*c^;mAEQN z9fd6K-SNs8i&bA{BCJSKK~W`5c04DSaJbAc)J^DYFh11#vuBuJ_&>Da|Hhy2Cq>@2 zhT9o#Z@7cuj)KMBPJ$)g&Vr@hE{3}r?j~5~?QZxh!E$d8!#xf6GTd9R!rMo%(%V3H{uugECcbMRKuikKuVT0fVuhFncaH2QYaGu~K zZ@yu(;o*Xly#<0(ycWT!-a^Ax!L__L!F9Yvg44Yt4BG|Q^*RhY4Z8%_^A;N(DY(A3 z#BizMGQkbJqXakfjuza=JI3%>!{Y=u_Kp|a#OoHE;q?e^<|Pc1f-}8d!#=@TUccdh z;B4;%!xIHJ_f8Vr!aLb;P;hH6WjG|bjdzOSse;>jrwMN7{aSE)?{vW(yx$m}A-JP= zrr}wFJ9%dto+G%6_gld|y>kuE_q$D$NcNy|F;t-fHv~i@V@b$g7@E~c>bH_ zje-Tx^X@IM0XPz~|9ZIf?<;5kdF#)7B$mIjUeZ0{%){Nwjv^w4|X4H@D%s)YuVcWIn!^JkB^-TI?i;dgK<| zh?yu4cl46QnI!ToTDGjpUeY%@I`5c~Wn(YOTi#3BMpvgh;_9)E4&20M!6?hPUQ#!5 z$jIFxlRm6oM^Vaq$>4}zh#(d(0u0W6l=hOo5qG!l_L;LVSOg)5l3prP#b<`QoobZz ziLi=ZYE$L7hr4YiVOnrSFBPd8zD+zFA6L>#O{&V?CQCMTsG4@`9BB)CsXCRrirlR= ztrobVm#Wet8nC!qh{tCwPx_QpFEym%ro-I=4%~2?NPX;@y6Rr)NGHkqWb?UpYk0`i z9iLv)OKqtfv3FX7 zb1KD|6|V}ErK~rfG9(<{e{ro#d#4>hMkN>YQfn%P-tJ6Et@TvdOFgL^=5aUE`#VBK zL&Cyd9}%>MHw)KrVJ|hL8ZaXi;8ylhJu1p)ca!k%8Q4j&|5rGBI{qvE-8lc(>F?xE z2Ltdm?0;^7{a-5>fc3xuegpqM*TMRqw|=eTuIhXvEWk<5A|#FdmGuf0CEq?j*uCiw z&aGE3nJC?Q%@3J8I;ahrP6O>Qk#3G#f8x?+NPT|zu=xlXpMEIoMaR`xX>D>L% z=NIGp!#eG9;Zca^P>`Cr=q9O7^0mwSKnUP1pq3+Mm# z^)`gx-@jn@f17){SO9YN{|**_H{;&VwzS{>U=%3pCAp=`fFq*I0CfM#UJ_dRQAe~l zEyNX{;=nr8Ldauj3ppZZ3#sWPf2HH|B4M9!D`xmt#F>%eUeZ@O$}9?vG9a%idP!dC zEVihn4c^E?1&|Vwz|s=p)Mc&`lETswF3MTL+FtTka-`R7!|>I$uqjs&$zo{{VOf_x ziHagt_L95OA|QRN2qUugkb;{_x~ zr3FO#>;hKwlA+Q{ZjD#66p`$d7O^#F5sQ1bOXt22qs(IKLz0+UBu%_9XX2_}Dv~rt zOU@Xzy;~!O*1!Td@a$^u$Y!C+d#Om$;dVi;;g_U5w(!RJhN{_=T3LqSi=rXwI3#FZ=&s;QFtj z?4S1bE)d+uyHIdn?;^qdyo&|*_bw4U)VtL1GQ-OS>%1!ruQa?$@G$Rc!)pw$6|DEJ z6P)8+FWBJSV0fcoqj!_x&4NwdErz!W&h>6H{GH%D?{>pG1m}Bq8s24iw_vk(kKw(B z_X!^E-Ea7S-~#VK!-otX7Hshz5nSj!YWSF7tM|C!6NXP3K4ti{V4L@h;j@O%89s0L zg5V(Yd`qyyd)x3G!A|d8!}ko|7wqyr zF#J$(vGbX-WP^n3NG`$GW^=`8^b>uek*vC_nqPQhJP~r zv*BL^kM{m5c#QWq-Ty=X_c8SU7r_7L!I=L`ydQD<&%NFyIRD$|Z3PcMKD>WD3BUg* z!Z+~Fq6Pe1e1HsM{|`N2RWGS+9cPZtInLDflH%3@_o(5g9AUeK);uac<&f^yDF^9u zO*v$}b;>y^=afV4TZ?$qFhwK>u0>ond=W{8>#VpeUPLnCT12GJE@D|P*>IhqnKMRdFUfG-^(@Zb^#~g-$rtBLUew!w@BtYrVX^e=?7xxfB#U#k%VO*DJ?B^a`;k{)6!BW z;-w~)rKL{9N=*Vw>naf|bwwY^EB$eL(z%9z9MV^sVRt-3GFX~ncPv9cond!YhGefa z!{c*gSky-nOQjx%PLLs6Yx<~d*2aJAu#KO3XDzN=@nBzqjaFGN)yz5|9~&Kz(b6h= zschEHd2H^^Nu9HH&SQt^oK!k%`HmU3d{jSc`Hl(o71^s&|EzP`G4VM~N=PlVmhhO| zC8RQ1OL$Dq5^Dc%qyMi*asIE@Z@}$;Nu1fOEW~aEtF2@B!w!pSsUN18}x` z9Q^<83?D#6&c9#{{IGL2Sb%@`Z&DxmvuQ#FU%>rJ9c-+OnF#G{Kz~f?BblZ#&mTS} zdPzkeNj0sd^K+1~MSbMebpAM(HeG2xsHl&8nuh!~7D6gbL(YkXkV4atvtuEo&NSq# zSO_UI4LLIwLb^;t&WMGOD$|hP#6n1sX~^lZ5MjoI`TBJ%B*TfF773~8BPXU!^i;4R zV2jejZ9ozi_X#N`W85jx9$(T&K1>IaQ^Nfk19ExaIEvO}G0|u+<$a{VGA2n3EWIUOKBKr8ki1!h+ZCOM#2n$peN;*55OP9j2th4Y^idt9W9tby#@1i<|NrjL6^&>6r+*m!VE9kL zW4#{@|7G}-;m?Y`BY2$e3Lfu!g5ADvIKnVbu*c6AO!y-WS1?>rFzK&kxU%6Yg1!E# zhN~Hl672Iw3--%l8E$R3jo{V(wuajoZg04Q;5Gh^hC3PVEO@QI zi{Y+<*ZI2{?k;$P|0}~il>f*1pO^fb{FHw<^ndI5t9gI*Uc&t!DerKc{~zoA*?kpv zf1l+p#uH2DLDJ*13g!a>>1p=9^;9hyGdGM_yc0T^mnT+(%km zbGtU0TTvhRaJj41y~ey#A}d*=lLXhX`x>l5pfQe(-Nk+6!o{hndrk12s?ROzBMYu# zug-{t!>X!2^4}`<>TI#dxVn%0w^rZPf!KKUkq6fgx;pwnWql;T<*EYrD%wcwQPj1#wP1el4+v^uMwTpLEdM};aM-E)0 zUb+0JHGL$*b)j(uG=sdPGNO&bFFU!9jJS%sV)^0<`$&z;scH9e6i&;BBGvQ>B`%w; z%ZAb47xa-AR}K7SAq{*@pXjb7?WMz}r3PEmUK&bU(I@I_S$tiRV;Nf0N9FZ8Lcd%T z$gT^jUt3IdA2ryj{k#y`r$tzeh4+N`@hbbM!d64q3p?k-Iz1c#bvUh$O6+y$9L2pb zE1%$J4we?||KoW6=RNrUzZxe1x^VB-On3mw_ddrRUAN;7pkr|kXj^Zpw}$(J`ytK( zU5$Hyj&$qb2XIYy6m9}~*Lldf5+{O=aCWQiBY`(gTGk!3@qr~r%#&VmABj9|wYSe{ z=?XeMR&OPJr0{f&cKf{cridwSAL%)+O(I}Dt_DCi?Ar}^9#{=ME*hCQE!u6_ zMI#BPMY}btXidyZigs(bXe8dW2)9OxM!L=3M~X(WO^bGGyl7aR6`5e?=VIQeA-5lJ~5R@JjSlCBKEeHsT zFTX6AG%e#T*<~b&rdiz_F5^hyE3^QkobR1ioIB+n zuzCo}^;gnQDp0@mVc5#l1trIiRn|`$Q2CdKJK7uSn$y-k_{GZlNdj6ZQ)WVuQAs~} zK$ZKDm}iH&O206HQX>z=YoxTFRG?PZgYm%1eo}xsx;_wY2*FmZw4X$vrhXuvy11WQ zpmve_Lt`5ob3ds-E$;o{v5mXdeiDJ&!tT$EZK$AKP}09 zp^|Wv?axqu_k~M>{EGTX{b@<=%anxOr#~;9+kM%&k@nNv?v3Y`;r;H-%8k6A=5}u^ zH!^ROa3BV)l{d(_-Eo zEoL9-J9PET{YE0!C{Jk9N{cy2{~)W9hzbZ5kQds$x> zLbMy*5p|Y^3j1aMpKH+izrU0H)6M=~hI+~C3vU5Snw|YNW&$DOAVI^-t8Y{c(ma$hQ|ut;~!^uyx_flw_%TA!Z0a#pWkcP zXV`BzAb7ujg5imVCmEh>I4JmlpE4X0e9%8d@FD+H!_x#G_J3`7y5VmO&oDgG@GQf# z4bKsL#Q&|~xrXN%o^N=8;f0158D4C7iQuFDrG}RoUT%1W;gyD08D4F8jn4nj|9yn{ z|61I#OZ)##{Bn2z{Rp@8UJD!G#kkXFhF1wcET6y&==JVtxEp9c+yGYU{N#M#Jmy^O zq@4Ds4zQ$OHYu{~evA`)po&|O^AGnYI`~Q0kv4I!z%Z%@ER0irkPhpxl71=#LSaEV zuEhGO0tm?rR)koYm-LhV4}}E_5Sf*!00_wp(#bqY6+kE~NQZf{vY$!-abf7nH$;YG z46Bv>)CE`sUAsg#CPn>J3Ft8Y=pwiq*PVpa0aXH;@1xVT>N3u94(bW#UY4uryjbh3DxfH0j`q@0=M87iQxpLzic&04$_^;0vT zU;jw#>!}pb93RR0dTInhVUe$=QXmu-e1&{HwF05A;49?oGkSqXvc8^r0ZYfQAf0?Y zl>+*GQqI`dQ!iklSzlk$PlbTWm1S?Fl~WZE3X6Or)c~Qe$Tw025DE**D&JU`35$KB z_Wy&}{~yQtKjj|*42m9Z*aE0OvjKV`z5wdy21wh+3(*BoKX*X70D2+PWY3cj{37c4fdd6K`XDH(2-WEjBKMOemb7G zte^a%o_c<&Rq7>3itb<9Pm)nT@u|k<&iPI4;pQUjqHI5(ipwqSC&j3lKA9azZc)WP z5ve&8x1^s0qt@IL;hID1FYPC}s0km>PPlP8;p4G{zpVeW#;t$rg{+@&V$$$>!y625 zG`z|1X2V+yZ#BHl@OOfb`?nk3A^3!Ur{P_KPx^NYKIPwIc(37of=~PR8$KZTjQ^nF zLxv9#E&b*CmPPaH z?WaMhiuxI zLN$e!^r89l`dv68U=S2;U7{)brqU+oY2i)8;_iW30uzytWjumGOx z?Tq_<$HD^m4fl5R{v&V;z`E{OoB@0e_P;4-K9cjVbU?NlQX8Md%P?-B00q=Dj~~xP zKc3eP78I)s8gAs&G!#k zze;~bpYZye_O6ckfht?3DC!e5SW6v&VLS|{2=Bq22ln((!F!u0(AHvIpe z=N}3GUo-p)*#C3)e}y;Xb>IZ>W;g--llwlr0Nwx(Aji1%?l#cTj_HeN75R!}wIUkBp{8hF6~89{p=%%A*a2FM0# z1%Dkcd&vNqK6h7=j!S3yMJ&^T0n&e3#a~3Kp46Yck5s+Tev;7_@r)`5$or{z{O9Ut zdR{$THt4DkUr;eX@=ulHpEtMSTEI}a)SVE3BK`BY^wI$`fclM}#RDq_NC2wE?x!K! ztYC;AH$Vzdr^8Ph=Ho;|UFhU)X09R`sH6O+(LpBDZ-f(+B7Pb#MfCtlK~4Wj?)1Ox z|1pUCH~wt@G}3Sd!xaTT7_pM!%7&{Lt}6K9h}8^734SzUwBhQ8YY2WkVvONf!veui zMid$r34S`F*s#Q~)UZtOvk~QjpO2_8tTe0={9;74VU1y};W)uBM~pX|U^vlmlHgY( zCL2yMoN74Da81Lt1iv1!w&6O4)Bg{9XBpVWv9)3Ct}w;4jX^TV4mD+Frj!|OF-;sN zaht@coitEp%aSe0a+y+Q<~C(!=BCWt1`0{j@4V+6X?L}&^t<ZuFBn*3xm5W_fYPs+)KH)av$bz!F`qcDfd?%pgd4{ z5cBuof0%y+4`%)uJVbe@@-XG$$|IDc(Ekq(?2qyPbF>2ZJnJOd0kn&?hBc7x0DFVh z|6O99VNNvnqniNY}g@F&%2Y3vb;lFs7JsJ6tl!H6YrEhwkp2ia#W+{k)po&WAV*XECZjZanOzrr2GTwJR_r#oCx^#C|Gn64 zaMuNAfs7h{bBr3e&9@x|zj@0CM}d?Nx6QcA2Pc7)Z=t7r@DWHk7P`s@|A79xt9)<` zNck3)mk*u+>2?-+%Lng(ln)o$l*-3-0SAHPwV+rAs*6Eg@D1p{7t6pE!F~b$p%!>E zf@453!sR!mjCfQ7*MJN~=DSBV@C#^wdsMT79Wb*vc%iaYb!~44%qRwM;ouOETA1%G z96JSg3XO|*N`>Q54SWJJs+s3Ms)190?+P~Nm5*xR5|B*im1kPr1&@F%!1)z@ZD}G= z+r{nxF3vB`;&5HT8z5Eki@UDi3D5v{U2SRyxa(>YJHTC6EdTQl`Ad1R@%=ZG^RDds zUyIHFTS&KnJWP9lGv-uY0gyDqbP53W0OpKN<6yc8beOR`tpI$3ZUi|uFw^4!Omty3 z!&4+PFn!FVDfVQZe!)Z+rZXCP)Rflob|@7o*@gK`V-prJFQF}a9V95xcQ9?@#N&C4 z8Kq;Mx-hMg3SVMxX(O*yq6>nf%*~eI>#=_hsB2v;IP%Yd%fd=;2mKs_x}Z18x3Hx6 zjnH^}P#2U%{rBQGLT^(|m#ru+aVU!P>Q;9_QPkpLY-ekYT`VW^@3Ex(_egd@Pm~A$ z%jd!AaHHxj$cke5FZ;o%IEgNZit^xpxgVSxJ(d+&{`|{PSo$%lyPztnNxQK0LsWM` zQ$(EEr!j_Ucx4xsbs zyZ5~Vv>}D53!hwM#>ksarsa%S)d~K~dzzCT55O*K?>pi4?>{XXv`cQ2OZyr=TP9Jk$(Ulw}hs zNQwMWP%M|)$c2NJC{-IQFI+qYEs=#5(`p?z4tEgR4)_$rL`i9tr)*9^PGs50G-;zt zYv%+yqr+MA5R6kSEb?1qx=Y5DOZ#EssbDD+vpkdf6vRb#8JR|TCe-jZq#!TKFJoXs z%cwFvv@r#Rk{C@U}A6oxcZyCJ)_XZmMcbL1HjnvkDVmv~7e`e9z zzwM1x=?vgs18)cB(D^?n(p^A%=_fQOh1m&jjx<X-x_~1D++D)9K&W zwGW1=NtHYX=CKsCo(7TanpDYSz(KB5@EC}}BgzfJVIV<=mm7q;zz%X4tWCjVz(YTC zPrjT<`!6beQwm-K-VbZmOqe=#O8exAGo5=mX<*Tqg7bj)37a*YIHt0=DzP}UXh^|@ zAmgl>vF(#+p5z#3(XUpQf-6DBSvB_QS;gM5E(M1IFPk)LCbo@h#VHncAy-Yot*|Ed zuhqD>sbw_XU`&U$Ou=!Kd|WwOq5<8|6dVo1Ick+eo7gr9n|R&vs#EYe48*|P95lYA zxFMBhUv(*X91;@3C&ahUEC$18lY+lNMhk=tOmD7ek5M@Ueg_Fz!4)zv1*gLb z{7NrBir;=?l@$C8^7b!}*z)#Qr{G=?Bg?t=?5v)GZ-Ljnn9GiBo!CmppQSDZPlNpa1Im7XN{jD*Xkb*p`o?cKHD*6mf70(;WHG`{}dt|Iiy!nDg+iJhR~ZjEY}DeF}3Q z8DJMCwzQQG69=Vu3dBE3!PP7sjCAtvcC%EM`ValHd=!0STU%(yK>xELU`Bj}rYXXLKl!V*N~4bO?_U{Y+L^Gy0aL=%>1(Z&8YVsx$iLrRb-) zqHk7;eu^Fa-|@e*x%&VAZyrCL5`2JpYH*J7LFQ?}hm;R9PY*t#e3W@c@G<4%%rk>e zD4%4W6?{thG_x!CjPhA#D)^l8d1iO;1?7v(bnqqR%gjvh73HhUp5SZD-r(!ZZ14?c zF8C%hAAF117kpd!4zmz^SNWduedPzt{@`5Z*})H)=LA1uo*VpF`3dv9;HS#Zm=^>; zSAL=Vl6hh9E9KY9Z6xK)DR_`p~k<<&?`aZwRfRTv0htxf1in(8}ol>jK*atoP{t&-1D8{}12)@w54= zc^!HFjx@KTb3YauuNrrf*KdY#0PXr;F7Pv*{&Q{Mj6f?T3?x&tsA1tVKg`Rir}VkE zqdo;SU%KbZ(0@Bs9Fk~~DMLOxJzOhM+Ca?Gw&4k-Roj!S*ZLBsZB3fjMv z<5Hh;kR+H$!3iLe+NIuGG*a*aXsG8Fjd%(U0C|Q>UC%&2W^)QY04d-lxM*qA6k4n6 ztOcs@+7w&?qOM*-cU6opjvC3ph!lJQd{3i!am!NfX(T(1DR>8l!lhtd49Rk0+Ze|o zMO++s38Xj|VE{<$a3;BaHyVUCrQj@(snCVfX|6{Rj&=@m>4zJdg3~~z7Z;9g>*Q1R z`1&5lc$bP)mx2?4&)hdJq{D_~+E_Xrs6GW>!f@`ZFF-b^88$;>D9WZj)k@*KB*^4& zXL@=?hNj?FXylpc1!d;9&@r0KP1(Z$FOzwmTg)Atf{Q`Myys~WzsW6J4Kk}dx7+|+ z4PxNjiUtO!;C7H$=TwX(-~Zvb|NDOHTw49Vw>6yS{tua#nP-`8=I%7+kI>HF$Bo%^ z^5+<1Yooz1$mjn+;L5;hfy3!1uKYK+8$$hHo|xQ7OZKPY>c}y!2_bz74c$=fMa8_4 zZo$$>`pVM$ZIy0l_cD&U5h5@BRQOuEq1wyWdZYi>n(T&fFCSv@U@zyVK)J`eq20^J zbOX%{aa@tSQIvB-H-vjB+6|tfaT%c8OBrtPFGIW=+P!3Oy*C4B_maW&{uw~Nmkh4= z&mh?i4PPGeI-k~t-s*;K2>6oCb^h5v!>(|oZYNP2g3di+2R2lJZ z$ocZ5*Nz@LmJ|Z}GPguG@_St6`+KCI?91YR-q8wMUa)o~seE;=LN%0r&hNvc0e2?o_;*SKfnmi0n=<*pMRCTkwhP9;T z-DBFv&Mf)ux*@LBOF-*ny4RO98V;mfliiTl@HWqAPjXwUMmK6 zj-S|8yex`K4P{MAjq|pAN}cS6wkG-CSt)<$Ym&vC-u$7i6$3r_Lr;_Z@2r$Rq%?_w zGp&4z*w774O{A0CJ<78W6kV-5aAA;U@fTl~`}yCKQRliXbCNubTi zlick8B#`4Io0}_T15r-0xv5e%aG*;zH~D7+2fAc)Q>AR+M3-!C^vQ-AHhljLxc_@D z-T!qN-TyI~&i`&AG3l>Eyq&jHBoVz!63`@HOrJxgpTy zy!#ssL3KAYC~3%_;`fc!Ncz|k-B6*V19+;l^_XcSwW@^7zYWAFd77sxJq>gzd73AE zo`$~m>TYOMlKYcoxkIIr+@JKx9b%Q_{$!=xp<79mC;X!%x}jn5Mo05;cLBMvfs!R3 z`{S;bfFFNk$@=5|)`xUM+FF~(+K)}5k@P64KpNkV9c3?Ip&y{Odq;{UL;FXimn-#k zwcR_E!XEL2LGzMy50`~iceC!rSwG~;E!hp}OKJrNb@?<7jonbe65PSg(OMDv#Xd9M z4M9w5W)5ytr3s6~;A(>^RtzkkuysQllk9QamrwTbZpdVk{sC{bLoAc@IKay{J#;fk zf4?_9++C6$M{@b5hv!Su-{(ya|Cgk{&p&;l8?G>Uaqoo(W>RU!${!V6U>XV!fgQ?k z6}(_#{$79c|LT8ewf_4*)lUW~tCZEun?g0pT4kJhb10##Q`R$Y2{kAinYV_L%-cdu z%4X$Y=Ix;&%Av|(%sWEEnRkX(RgO@urd*wQS7;68n##45YcuZ-t)pC*c~59P<@(Hf zLmMbJRBpt)FSN086XyM)O_iH59|&!(+=4kLw54(@<<`n=m=A`wWj++zj`?tCd*&md z9hi@Xc4R&l+KKsiXryvywXJVH5&`F!X|b?pq;cx6{q-cfp-f4GgU$Rt?O}B{^eO40-*ojQRoxJ! zcx9vcM%!fDnP1fnMM?r*cLr2?rxlWEE>%wy2n!#X?9;}fh(Fkm(pc%vkQ$$Y60gI`P4$P8#0sR z@j|6M#+LGU!Dqw*eM$1b!8bm6#JgE%;$HiC^88XEZDpgX8}gE@p?tohb)2K{5SPR- z4#n{`%*qlQe$H$7h?3#w+=dS?8OEtNK8CBi4?|iO&7PfB^5Sxp9$HF_Q*(S0H*_CD zQDngUjQ@Zc&R%)4XZ&q6cEj;2FUQl~mxGpq4)2EVm#?KUpYEiYXv>6A?iYaH5s1Lu z>#-d7tiR#lh-DrIz~kx^6gz#S8s(F%MO*xJuw1mdAP8|8bJt za1+a0_LP4SWd47UeE;Xt>3{oM>(btzAL;fV%>O6y*G=G>05)e~X*0n?DJR_3wo+%YYBxHi85^sdCyK?;?18FO8M^m?q8hIF;A zBqgy-?>89b(x*xzl zC5b-p4oe|V$*c8&|EpEo4S`Cg3-7a=StT|4Q3iEGnUXx;FM1YuD1Tfj&-cA~+HR!x z{qt<>h8sy%v%YuCwDzf^NAU_HTPd#Zh9gPTdyUc2-mdLCe>3nR$%DP;pGkc;d`M#A zUCE@(1RO|W0vq^!TB7=HxRJ!fJH961LlP6%$?sz#*=>7}Xg|N_rgBm>lilzj$tP5d zGRom7pdUHe4L6c}|8Mzx|6~QNI39=_S9Q9@d#F)Gx{P3*THJfQjAD^?k7I#?#Qgq^11a z+fqXH64Rgin2x6tFwO1EXPz-Z8giEmHa>HW3DOX`|4T@uA#+KYKlP~#C|pt( zpO)1Hd{0u~PkjoUNW<$Sc0cj?1>kbhP@i1kd6HZ|Da#cOC&~2_pIqZ<+uQW9x0>K> zl4|ElY(#9k(T*+23rFx*U1;E!Ad{&)UQEye%v$MdJRLhZ^a%(p|wC_9+% zggTW|neT?CDUW5o7n-h|p`6KlKQv2uobq_(3Cs^dCn`^3&JCTcJVkk`@-*e?$}^N_ zGCvHRrR-9sl-ple+=Em{3&!h^XJeV%wIxxGJg%-#hf3yo4Fu#4|8GYUgmG1 z`MYFc*g&RX(PCT=@j^uh5gsC84L7e}|ry{(oPr z|9^z;|2~25|Bh4d|FQWv>Hnvgqs@`#aC14j`{ONRj&TKf049+Ju(453UckA5M+4W; z31CwL``VvSV;V|3&!H?s8&+xwi%XJe%u$_&+Rl@6%Wy58u1Z5>=N8ZkOzR+b9MVx| zU7d!sE=dA*66&XG(~#A9AZi6@NHMNW*Yi+`>eEowr8WM0#-xe7XuLyvJPwDXF5ydj z!mHEJ(nUr1%g&Wj#?w&JrMsi;t=xZ0VX;3k4JlpP@x|_^uyypswmp6d=;$(>UR?GR zRcQ$5Vs4S!9CULj-l8&d5Y5HhqB3(eX=vuWht>R(_gqN9sT9>|Xysz?Pun2Z6ohiA zsXu&c3M#pz{JktCByvgln@`I6H1u%^U+5Fwn1)0y%MKRc3Y5uH_v5!hO3l9o6ml82 z%$FFtc8CJ2(h$g{@_sE<9tAX{p^eLE^%u`*l_S8VEfIe9j{vu}MEJ=+0-V|s;YYs+ zjcGWyWqZdD-h~46sWhbF;T97=_?c)(!@n&NzW0kzmxhm9*8hKpW38p$ib|H~f3*Mi zb3XqgODh2Pqy0Z|^H1|V^Fdnqe;Ty_TbZ@SAI1m9eY6I!)7Xzj|5br`f!6}J1hRo? z{`-I9X$WxqfmkcMJ`jG-puzFmVy#^Ewm^I1x4~M;=WR%)A-wUmc-BBZ8gE=%>)1VM zU|)J28q!eTct?!2B29bJGOrd&x9wZm#>sRL^zG&pMNq95l(7idHPpa)~BJr$pc1w92+B_Vy1y!ZtD3>nMEH!A{MZ!HUFQjRIR9ski#U(?ttT({--w6Nzm)28s|3{YY|2v5H z{{_si%ooht%ziona9=wAzt;H6c!x#+=NiWu2a*q9725yzYT$M{`+o{0Fa6bLAjt7j zU#n>XUBl;GZbv_MV}|88sG?S~t#cH8c+ME4snuto$%%zz`DMqXs?}wn$*n9F?Aw^R zen?kq$Uu_g1us_8dC_yR0vj_><+#zclC&PL-E#_QV+PWk#+XD7hp9zXmTk~WU7vv- zr)Bhc%H|9tIbQW@HI{FCDjKQHK$?@ErIGgD(}4x0Myxpvc}@&8R5Xx=OeY2!JO-f8 ziGljc1|Zalf%-B7b!muoQq6TFmpXqXZvG(G$=g;Z_ElMINJFKQA0W{>Y06aBrbc=N z8qyHyBtm@LL^|ctxzv{%1gLcK<<(NVGj()PM5IlEHEHN`JbbZgsr4)dkz!nvhBT)^ z)M^%kct{3Gj$KGr?UdpsN@$X4XmOgC>x1Kd3M!mDWUc*4@iz|fO}_COpKm;oX5|gj zajTjZE069NO`iF7TDl6^xjGFunb@s%*^Q^+9h2fzd5Z%FnIx-nC96-vLng%;t>Q}g@BF{ibp2QV1M?><5PDYm9McFruY7@NhF(;@q$&TlwUFjhQ4C16#AOEa_Af7x6D;S-!TV;zGqg2eo+3%tPcI8{Fzx3`h{5= z`c*kkIbXRzxls8VGamY#nF#&CtPB0AT*RyoEmr=;YzQq;{>^L*2b2ag88(%cGN=qG z!^(&<%4`b9lmnE@D3?_(r(9mS0<$^1qH>^eCFbDp%F0!kL&AfURm@@GYGn;`c(|6i zYB;V;Fh_*zl=aF6=4#WlB=K zwKjT^4oo~tZn$^`QoN*HyF6_?10h}l*P;nb+qjv|lu+R{(3=t>yacW(-J3Hd6nG6R zPg$LT052`=>eK=0uoq*g48(WoGFLC_GOII?-zC**b}FtM2=9{F2v=s*1=VDryYo&D zYXrJdXCa}wYdY5xuu(|v61b|%D3!A&1Ib;CuIeyK>6$YT-DPMn+;?a|eem!MWcLv~ z${I%Fw9%cN?JaF|ne(y5&a*g-Y0f}`7jwfZnQP9l8qem2_(q~JMQsL>ywvTGvbt@~ zK#-SQ23Ix!U0w_fE;CS*fif=@((D*kV&t5GD9`G+)ohO_`PYUb&*wK-&CbCjRbyiY zqP&a}n<|WCp~>r5*pVgI9FJsKmFG%nvh(F&9?8OoF5{#oXXYG%mJc*$;6&FFR2a#^ zhpsVvN3x>-k^c|pe_UgASw~xY(h8t~=6v%1%`q=EPo)-MH*;M&|Njr;L*ohK8g2td z8mk#A2EGeC7r2S^zhl_{H#h?&Zgn2>Y*qS+MvZBu?S9Tz8k(HEwOhH~TB_5!3dyJ(5beakCgldIGm!1%{oR<}BTYub-kJ<#J9+6hp5EGev<7jj!-^f}x-ni( zXJ(M>B(sgZnL)3U%r*{D1>D0GtBM&-H1Gf?Rya6@^; z?Wc=ppwMZcyxq3892`+aNY92 zx(wXsVt5^I*Zc4IpMIJD;g82pYla6i*9s3&4rQ(#9;O`5TqnG$as+eT@M_HU!mBIS zV6Gotles~7E#=zEb(kB5*Hx~kTwl2XbEEKv%8is8D>q?o9Ntv9nR0XG7R*h;TPn9= zZW`X2xmkD{=H}sTnOlUnQ*N)^fw^UPN99h;t->RfJ1ci#ZXMp0xlMRCyN4$*_XxKsk5V43oXFfWJc+qic(SrxIfc1*_!wmebDwah zaw>D*@HFOr;bWQmho>_S2+v?17@o;IC_Ib#pYU<$|LX%g2CNTg|Id}yncV-cYemhk z&8N&O%#+L`%uPxA`^|WRZvM*B?w`Hr?w^$c^GW-=CD0u>nv&8U$_x~B>G^jnZgCwo zxwVycr`XMIU4}(Y~c;>@Fflp;~IpKvtJ}+*wA-Wdou5477ETly)wS zNSu!Yd0qSiBP%}+GbUYy36B?^m&|N z83^y|^E{mRVfd;REZ>@Szl=@Uj5SBlX~70~soJdpc z`V0hfK9a&Zuvl_h*-FLa@MH#hxzx%5#c(mrpEH@L%Rn(_C$F_X)_}T$lNo5{Vqrgj z3&{+$bBVI=L^|4fT4@trF_UBl8oET;$HxlI;HxrF)8*IMhsq$up!!c{prlLMy(^`K zq%LXqcBh4wE@}7jNlVRHO@;+^{(1L;lUv&ttPNXASa3!3{2x(mk9<2Xh2^9TFM1!le{@ zcuG;5fjeBLRJ&toL-AB}s?z2RT;aSv-r5Z(9*!z?n)-Ru1h63kXE<+)uy&&tZQr36Z_CP=r{iem!azH|pilT4F({eyV zlg!6d${bpnWIo0>bC%QiJ09c79BP_mKE@|=2x^k~=t`MGPLs?>`(_RiO`d$TCv#|L zlKE(#%psad=0{e_9NL*=exz^awrqB!Cv(VVlKGK7nL{~~%w;>W+y4)dss|F9d?PyK zaehVg@z(aRkj53ygGN_>0SQgAALWxh1T@M12>)kq?16|T*&iVzE>HHXqH*>|c%B~m znPh*2PxkP2OZJCX%HDQ&A6_AQxVz<-Kirc&T-}oW;Xc{J(=FK_Rw;Yi*L|38_W#cR zrSyb<-%G;H9Fx$d+ zD(_O>%{(f6kMdsSeawmB`LFETsBFDYMEzM_0p`5JR-_;u#A@EgiEW&A%mV0}vKf3C2) zt;yEz)(E=&XTJHGd5d`tt^PTL*8err>Yw*$1Tfn;*%)t(q#HoOfgkAZ@9P4&z~uk` zx6{}I9bA?-P4@1u#0atnVz>;~uv^t0LH0lam)35QPisdVNkb2GaG7mR((Ntway2#% zIb4iSavHDeffz0#DXqh#V>PHB(?JqFU1JXm;yf5U3MFbOAGy@`KoyrU{82>%#W6hR z3~gL;hK15&)%QRcmxOJ+fw7oc&ZBGSfjZ82SXymU+sisxjBk6Okc(xkmo8aO_COt% z3Y$WR_!%v{cqPsCWjxNr1ITCf?wLMVFWehsOIfSLzV{H$_at)*T zN=MP1!Ucm;E(M$5E*L~|DcE?Qf^l_0DwniaPw03kmdRQE80V9g2OKPw^N%&oyQr22 z9MH?9)U@%rtkjUpC1-4kcH|8Iwv@WHQqJ&l%UFZX>@GhYjB|#gTXLp3T3OEUb4$*c zzd3S-k6UskJwjei36*IEek1mD^B88VXAl8Lw+tf2dIk~r{u={31*|vd_P;Eh|8)TE z{%f!Xn7^2B^6h`8nq%n;2pa6>*ByEbocL0@g9g` zvTSLVYg-eUPxP=R)`ZC~Z3i6RX-}WIN+65L_=g7dSVSiOrB^8412s&{&h(mv5;lm< z&hRk{4NT1Hh5(0Ih+krMM!DI>9_U`uL`~O5#8KHa*-rLA`I6t`SfAg6qd@nPC^+Yc z+Y^Tsdc_kxP`-HUur-a2XLN*OLf-?;OD6PFy%YL1dZ2f0$e%%{WAiW#?rAABEw6A` zqwjpR9*AGO*VuAK_up&W10_sqr_;07xCiQ&272}y_dxyPeZN+xW3O?d2f~-UfgSGJ z;5LM{FP!jZb&&dUENzG_p8i(V1LaG;2|SZL7Qa)_y~N}(J|-c2CD`OK9+U7=i^*f0 zCI|MwG0g|}TT^gwKTYsg>486*PoA`<;73BEYy|3i;D?q*drEnuP48_(4_wjGXixDp z+Eo0i9=M{V5ZIGldalMExSyp7nJjx5oYNKhEt5TPL(8i*d1Bk-)^Vh;N%~@oJ)#HB z=(YLnASH41h#fbOOk)bOP|5=6U9H^8h*l zWF_Ml<7MM!qtBQ^9)NY|`=1whD{wd6|8<<_-amRi{;ThSa3+%LS@eNY??f+VQF<`w z>xOV9+T~gD1R6+HnCO9GCVtkl-1`~Hczq8fGckRpuW3kTV){(4X^3TF`b>}Mx*pcb zSV}sh_-5Hdfw~^n$vF7*DeaxSZC`&PDp*4gG%^{2oZ=aRP;=MV1BFbQms4DA5C0<6 zFx2)yDwCG$6e+v>m(4>X6Z0o~%v0jV9%yA^{$#ItYFQe3AeD)Ull)CUFcT9eRWJeN zOiY~UZvx_(m^iV530BVd6+OXYg1ZF>XHp9%IBS8s1!!i{2%X?E&sD^d8F&B3JC6q_ zzVWp^(9Oj1@gB>N%f#~WUd!-u$zvbqDKn3h;NTL=$2l!iD;Mv9cS|fE*U>s<;%LX= zckv#0wKUM1EgV{s?JWOn;m(q5XO(5!&;w_dv_!KsTN*vvCnEei|EG86fB571)AaD$ z%o*W#lWl=GRVhZiu<2rp!w8U9WAyYdg_S>ZpG zi|GyK>|CgZ?fL^2i|6FsHc^I7l+C(0JFO6r78;xG$7-L^!ZCU}mfMx)5=oH}7 z=>9MA0mOTuuS+9#zH8h_O?GXsEv}#Myrzn>kM}}cmxSke6GB^;#_hbagtfg8)nzty zE*)6mJYXo^3qf6sp5rn~IX3h{QI}TnY@7}@s?2g#FGTfP_Sf}`Ta|rrfn+bFbUsnV zDomhFaT8lRoK6f3-Fu;?i@iWi zm!)(bdt{}dciLqYodbJab}^djg^VtCd);>V2Y`$&Me6Y;g@7(edwi0zc+ROmgGXP#NZa4ak$#eq1W=2zB5uF0|c;NcL>2wP4KmJwsLYt z?d4_JLX(qhFI!5s5a=Y^%beL(_d=Ny!CVC;u z$pg*yc_8Rny>9;1&(#Fi_3~Ks2AFsdlx$M;%bC*+!>~M(U(=%3&*&uNxNVyUA@>cmFm&)*zk=@(hJIp zQrF9#ac;NHFZ%_kMEL&e1N+GN-?ORzA8+kq4Ywk+|K~~bYV&0B|I_{7d;`c6bpLl3 ztpMD`7*6W{xAf)D4jfBK-G9x!5Z+`N-_3ZvoM)2p9E?Pa;k{7cWOvEUCDFy^!5B6qP!L?&Xo6pGx1@3*Ai$cSD83L4lLP zT`&EMLxttSL4=bGuJ_nHl%2(P?^s;it7Ov8fp}t`B^40Z1wUY<9s;q=$zPcBRowU4Hy4vKrUiO%=*(<#X z6TR#%V;$v+QtwoJ=43B?W-?m6LVtFroJckM@BE*t|9|-7`P1yky2|yG>oYHlY@pmw zxsh^X=H-!1l$$CyQ*O?@BC>^YOXXI~D% z@=)e2k;9m`Mh;gVp&X?=QaPG=dt{8VMLAa4svO6>BQjn&LD{A}ig{P$XyruZB;{o0 zJ&|_h6y-6>4rM3vzQ|PNH080%>CF2hGn6xxvy{gvk7v$_oS-~Wd6M#E|9QsS#yxcM z=ds2iH14mVy}xq<4+Sm_oDeu7uw8901aldD+}BCBLr>C?F!gG6y->?#+;U&>kQ()N zP^;M33$bJcyI>!TuMyk@p+8~ z_d-LL65qO%5<^Ir65m?6#8A{lj=$Bv#PEeniEph~Vz|Vm#8e)i5;yk3EiN%`@r}{Y z3+K3uS#R#7TgzRmlj$Ix=3Y3+btF#5{?LRaPkWH%``;b&|A(#F*6G$*YiDa1 zjsL$hpEqx&{r?l_{J&<{q%g_h5&s+@he-}}g^o7|=wXt>BfdE_XCaC;@f-iJ zykuqmeJsq$LK|~MvQKR(eLGp!$i$NGo0x@8CU4@ymEOcG)G{gX!xah)%}mPjV8yQ@ z3++t4iULNjNDN{Mw6d)PFeA|qk@JeC7a`0vf5rayG3=pzq5rdsnZV)1?z>QTMBl+ zZ^7W}md2XWmi3_Q>E=S;?^iH5x}{+E`xdOO7v64pvis<&*Rn2B^uL1x*1Oj2R-R7( zI+*tVG|~RQ@6FeB{ZE^@2aN)1jK7V~jOS<#K!(-;>~CytH1as$p1_542H?SVE1>_Y zHVdgszT;Lr+Jb!v5l2&GvJ{DApmWUlf<{;sPxG!1aOf` zzZgTCk|(y)u|@2U;ue+0BQ;s5;9~lVDea}T?v%PN%Mv&j>T|zBK?9eRpO+U3`nMG7 zb8n$o_U5&0pG`e>6iM$b&O*^lA)bZwE$I=(jzJ^dnk+Q$TCT#+T4%JhPN5~|9iwN` z64vT01n+7I;&ahu&8-or%0lWMBq7*W$^ij`hBd5k^HB5?og1;zLUmi8-IfxGeoi-H zh-0Nls-Sol0=E?NW0!tTzgavBjavih*QC*)J|z#Ppm0lH`LVMS-7EPvGRLbt@2x-TH$<_YJIO*okdd7YqRWw=Ayq_mgV3qywFnU zcPbWI#{YX^{m&D0|LW<{UbmzlXk{^+&=#Z zP|L*h4<6HvS$MU@|M$JC{VE!-&BCQEllbrH#i1qlju#b9Y_a{l$95tM|FwjE=Lt<_ z;kK5J>0AGfDUpTuS`2*aF_6f@buFRactYj-r~5y?vR3|7gfTOZ6%(A)F(gYU({^c2Z~Z-lE^{mlQmBW zgm`AJ0;|nIu}kEj?upsOK4zipiP^;-vk>&e?Ba5> z$s7xLJfmCW{)PDMBIPuhgOpdxQU3IgQkR30CkJ-_F~M_ScOnNFPhNvR+!m-Ismif_ z$J5{6r8cnx1~m!YP97Nns7bqNuFXNQlSlrYAKC7>6FC|qYKFgiGEC$k)`{KUymqsY z>csAE<#w}>>f}Lw^VqG=LaCEBU}1UNLV9;~7CN1@Eeq|og;cuQEL1wlbD^idfI=tz z#lo`w0{Wcv7YptF0-Y0-IVt8spJGCllVUFL6w{z$!l@?3TwqJTL5#xSQj=mX@DvmN zG%4nSvSPxICdFJ}7t;v*JO8J*|9|+?`O_E7Um{;Je~o;l{95@9b6(_I<#)>Ol|L}& zM}AcPr2JX=3v)r_SLHnAeB}b=LgjDFg^}Nte<=S{E>bR5{>A()vPAi}FdAU~9yOGv z(ozPQe?&vdF!Rr7gt;ghWiF1!lmnE@F#n1!t6WaGymAHRlIV)cfy}?7D=Ak7gMsKO zOfx!2S*5I2)+lS4Ry58GMia_9WxcY28HzSC!_lO&i5ZDDD+e>9(IL!ObSQH`beM9u za#iLs(Gkkkn9D|2SFXWaF1n_2E#~skwUz5A*JZ8{T~E0_bH(Te$_<$VqZ=tVX08<7 zM7b$*<>+S0&6%r2w_py6Zi)UsLGr!z1+D+Tkb3_E$^X9$`Tt)u?=a6cCzJNSDzE;V zLwo-w7~307G*O2?;4sbT7#c^F@4zfDmKNTE6{-%zZ zqhwrH8r?PLps(|AC5ZcLbQObpxH3Ekp?x?y@F4E7@kT0k^}};e-X$h3wOLwB=JB$>mgS$U&HwA0y)TV>INNC<31o6%3DSol3V_I|k77lQ-v}(#u1JeM?0@ zeM1g%y<`*e%VtOpvi)EP8o^-8w2sd94re}G1z3%kgM!a%^@2gqYQ*Xs%lObCfLDT8cE521tIjH>X4h@=RZat1edQ)=_LcbImcL8}{1b#Be{1PcpDN;?2 z9rLU{{Ovv-4c~tqUE)pp-+i?Hr<2zItWCRrzcZgRuQAUwTj=!vX44?=|2^dWpK1Ju zZvLyHoBuuwJQ=toFtft#-=w=Djrm+iW_p!$0Vy&{IaUgu{_3~+sbql zrrwlX`sf;R5XZ#8%6# zWl8@#*xb@=pws`~GafcBHBL2JjIE3~-~RnT;GDp8N?hTuCI?-M?_&xMrVhT?Qj?}v zmxHLqs}h2P%i2HgZJ=w(n>)DDn_HiQxK+(9aWi@=Rn)lsBx$@Z2Yrjr&t1Ih!k$vn~g@i}%0;n?|=#Gd8-VxCbUg>UR!m z7fS=dCRx*>lV~g*$wBbqr6a+n^4z22`)8I*%>sv7!Du#Vd$S&Gt-gJVh(*7+s;cm7|Y@%o2<=J``qbZg}{%FPDJXCp@@^Ix5%2CYb=#k3N$}!3oK>IaN7Ld8~4}at3pFbS87v=q%>y(c_qF zM2}~#89hOHqVgo=$;`E)rzlTVo~AsVxpwpn<~q?cm1i;6jdm$h%5LU*(KK`YXok5# zw1>G-w3oSYG|Sv1np5VPn@0PXn?(!Ce&*)Uvzc2&&tYyEJs16dJzd|!^Z(0e|KB)k zM=NO=qyW4?Gk`Pb{O?`p{_mLa9i9JunQ?~EM(6)F1(uNS?=HIgvz>4Lk#D6b4-L7V zCwFU2Zk^lmsF1~Z=EGeux2kBWlkX0*nAk8_b&=P5QrAUb!6ls|y4I6j#C`YGE zeR(1WMcNK^^vl$nH|C&6%X|)L%erRj)Dt=A(wcsX%R0LepiJAL4(rsrHs+vCt943S zW}QbX@GHv$4y*Kl)j7DAWuiCKej#|61n07hIEK3OuFJu@EF+Ggei_5ZEEx~2lyO52 zu4X<@A~?jO9Pls>{$?4*4e=eu!RsvL8&Y0A_?@MEL;T7I$Fr1=vi27VYI5*Ci}}Hh zpPgz(=Kp&B-x=0X)>eG_|Lf*mboR$g^H6hra}eGB@rrSak*B-A_u;eu=F#mR*9OiC zw9&zV{Flr_9g=C$wlXbpoi zM_AjG1~SFl861`x^H7J_QybjcRfuBik;p?Ol9FugDM@1k2Z(z7_kkFupFeIgHKNUU$+32n$j6O!@V<`U}G8HePd2Z>^`nMQC7lTmOH4=Haa3yq8PZ@^h;lCZq?ffP_Ken9*+_++86OWZdp8dC63mf}{!htJkH}VOE z16M*f@PrP@!-cy#TV5Z15Y>>+i;~F0nJY%t^B5VNhclN~&ji;UGa7E1dv3#oEW(fY<-OVBT$BXdY|sN4NhCGJY^# zHSRKcs0}#S*xDFsEED)8@HVagxjfKCqksdY9Vq^{Di3jsuUig|9!H1i@chaX5j!JU@&%~18k^Kc3As;b~lol_i{Q2p2C z;SCa{V8>2cT+-1twW#)R@X%854&LB~{16J3_I-Q#aop|upgep&GST0zIMJseRCOL6 z9(k#@qYl*m6cTy3cBGx#&eP8QJO8I2<$w6&`O{X>^OYAcw~k(@yok9?^kU^D%x$BW zDrYmdi(aO@TzLg^`{=G|=yl5Ll{YAFRNkb#S$PX{=jg4< z+nBpVZ)ffry+e5?bGPVS%Db6+Mekwm6TO$YU-Ula0nz)JheRJx&S4%JeUN!r^daVv z(TAC%qmM9KqK_&cV~&kJu6#oIr1B|dYxHU5Gt6<(XPM)p&oL)NpJ%p3Utms(zQ~*$ zeM$K;vpxEX@>S()%GZ@|FsDS{RKBHrTltRiUFI>-_muA|KTyt9e#q>Iex&?Z`HAvV zx8vRE3t@1nN_snV0ACx~bkB$DM{8{;njQ{EW?@z6#t?R5_ zYZ9IRyPma@`Mdd{`3Ri=)NM}D^S?i#_5YU`rx;_65j6e&GH?g2{Kw7T^0!VNN_1jJ zD3HgvPKG|7T^3tti?oJ}dbXlAYlA!#>cNu4adw%+@J~j~_&Rwg*P4?aXtuN@RKCVM zbZqIgrg#VC)Y&xTS<2=fX^LkZ04W!nb1UkX;(6%Z z(qBw*RSi8&JP*ZN16@zU<%ZrZBt^3pctp@Q>$bHT|tp=i|jj`nF&r~|Wmqv|~LaG9e|w&&>dthITF z;3AMrDqH7VornG{y<3}Wn3c#w_!ePdf?J*;o7H*9-;!>8*^mwnYAMG!S2^nQa7^>k zykM)tSza8+SLflAmXxhHNJxHZ%B>*}H?;f~V`&RRJFQc&TnllSCdaX?f7GRPz&Dg|5lNA1w)6$`fu|N=TP(l_kXY9}jE~|KCGa znr{Ex#HuzInvc`Y|AWm<%xdFLW3DmBxRCsQM;O~0)wJsW&A{z}EZzLMJtf88&^&8H z{OQbSnb<~itx=vgkv_4eJS#*JuaY2_XPt;WA#^mq^N_6KoGY1!SR{hn4EHZy{D~U! zP>W>w#S9VTw1L2zPqUteJd`5&rH=KKm41lfc@~T|##eJ}+hjV8(D&=+?-%-!d=bZb zzX+&D;zOiMMENwzq8GGS*s46lBUywnjf&}bogf-XA*Xr@$*&WuMqHs&{f@eh=b;@* z*`|6wWhh4)SYGgkJS#?QnjCv{A*J(G4${STdG_r}1W(>nxOMXI@JcJ)>B`%`Vdws! zm6Aw*(D~o=2V?D=To2-(6TPwxdANq9YU$1azsFw#~Q)!Iq?10 z2I%~skE}V?`PMO{{x{S2|32OQ(@$rA>`FI(SakZ&eKhkw%GlLt2>cp&iuU|XrX>0| zq7Ooj%$&|#+RTZ*yAgembtLW?{}>k{kHkIwALFv*!#d1q{}>m#kJvr+ALBv=lDMZV zEiN?~^?lHSWcGPVxyDOBZ?X^ij|exXR1j|ZY#r$2rDaEx&_o|}An6ZIE}AQ~9V7Z| z3FxGyS>hihSbE44mlhWtR3H2|B4VBB5V6of^|9ZE*9o2IQy>~MYE7Q7v`pyHYWm>0 zkxWi-WI`|8h&&uN@`KRn{=V8?v0<&r!*e5MjxRR@kByi)?jOt~^KjhA?{-}Ax!iO9 z5qbD;#N4cljMug{uFD}Xn#2AcEe{-0aToY`US!#;o?=>89!{yoLmgHHcmHt=KMc{%~8 zJ1|k_0LeZ`I^qI2*GCoRHw1!?C=us+l!#;>G#xQ;P9*~nc*MXtJ_aD~h=H>!8Gy>J`xt<@BL)hU3_#!!0|k$PL?6^03GMTQCi|fAi1~aa^GziK zd5?jiee9;;UM=Tip!nq^`fOiK&SNFf2Vad8GV2L#=!2t1JUP97o}5G;)wW-7J{vpY73nT}N{tC^Wt z4YMa!tBflX%-&d?vYwfZH869rMrD$jk2NWqnSHUr%tCC4awxMuHcUC3d3J17o6~ft;@VHwjT4M*!s+iV;e9pjcv%B9ovX`S!`qG z<*`keSHw0|ZpOSVwz+Z(<(AAlVp}PvKM zf<9+&ax0IKR38)(8A;u(hWwi9A$`zB*5-j}F&-`MbZz6IhZ))jokYwP58d=P2j8Zc zE5`FNH>eMuPCf!Yct@KpfF=6i=#<9)4o`DDs1MFgY2I&hHSchBO7nhOS@RB0r`WsA zV{b$syqz*Ky<%x2Q@FMI;Qtgs;0o8}tW-NA`rrZ;Lzgej5Kk!J6qUG_{bO9XNhR*= ze~b&qsl>hXALGK6DseCV$GC8(O5BV7F)rMz68FM?j0<7B~ z_rV3bCcn_qF}vD`&M?+gS;^`}ajs z{?DYFKewcte-{}a8&8t*kCT74GLlA!+JI*QR|nF8DU{Il*VqTyM80i0MXk6R$?llSA?`wPkT)lTdJBqxF6)no^lk99y-wnzk}H4 z*awe-`~Z)8pMu_?`aZZ7L_3j#VI8A-E-E|=lF?&c3&naK(g){)MDsb{)s6;F zgGBQ=q}7fFr-MZEIU3cD1`mWpduVB8gDXO!`5bO)TZ3OhqWPROYDa^ULZUrTIn%~I z_$s94{f`Hg`9JOdga7X;>nv-cwX3xT`TzbjKcEx9&M{|@A7FE{&R9Sy;Jv&C@Bmr^ zIEd!|uaF1uY&!e%AXgJ0|0hv^gd@GuJDy&tz7HynxLDqHtnA>YT;W5(K2W3W_a<9v3Pp3G} z<%cjM>0kGxPxP@S!}HJAJfTDS;7yVF=c^Lx8HLb%udWZy6h7@E_^Lf1uxk*06e)pP zAzQ`i>5x9SP$Z96mX-(HD3Zr3etE!&B6+A4M;>*3@SsTIm;DmMZ6b+ZmLfP359x#7 zL<;!Q(hA6~6V@|c^2-Ab6v;!aIPw_O$KDfOL-e9O)CyGh!D%8xtru;h{BFTxBKBVN zl)14FE))6I=&VxTz7IYVX{MidH`9r}aTFxo03S{2>ING7;206pbfT%RY4|{-nSajF zNOKPZUx%3H1590}|DFH)v|j&@f8zPmBe6Z0kH+?7J{H?cxi|Ci*gniBV*4uhV?G(% zUwMG?K;~1igOvYK9?X0?c8Ky&Jmic_FRXI*M zp7}y-0`tXKoAM~-(ae`(6P1&clbJ8a+Lcq7uf&c~b|^cUug0b-rzwwRz80I#d_6Wp zIg|NDY!>s)*m2CaV#g~_V7?tYQF#*co!H6DcVnk8-;15fd_Q&?^Mlyw$}^aAV`nPQ zVtyFwQl^+6#k!Sg=Et#&vWNLetXG*;=9r(x^2$DCf%#diUwO9j9Omb-bCu^YzlfdB z{4#a{^Q+i}%8Qs^$1Y}m6T5`@ZR}FzZ02{d%b4HCE>~Wmyi$1;`u}>m!kha4Cusj~ z7oGn%(i(2XX#dYM=2hldGzZwp9BM3~IlxnN_IJ*h#P@#%0v`q*p|!uKR=oY22FC?f zg4rqewYSwO4rS^K(1ZCd@8DP54!5+AEiSZ1t6N}2n7hlbJgsh`06kdR1jTf^q%gPdi2HuRADjnxv!z70t8{%ZuD7u+t^XZTK_K^9(9L8y0!sQ)i!5fGR9~)~D`1s{mbC>gQ9By&(l? z!y9rR_=y&X4)_{H$8yMVEG#Yu8VYdnil+YwnfEC*{JN40j{kHk+Q|Yux$@W_S9)wX zaK*sKJ_g{j6$2ktG5}Al82HG?0DQAz;KND=;GPu&A9@Vb7vPzd3Cdi%qQu|IKU=tz zdafsRvH)+aWdA{>?BRr!>_6}rNEG09mC*NnLg9IpP@EF#uKh#-o>vKd*Apt=|IRZ1 zznJd-*`HSbuSmQ9Umy*zV7AlwKWm#S(#e0185bHS8He);KoPqCf&MzWiT(zx?U~ zBq2%rOIcb7K$7+s-?X&_$Ucqy0sbu2Ld)gotD`n&NC7gBOjdsOrY^RhLkiG&B-&3) ziw6I!MEkKqG|Vds@X^Yl2|wCZRQx3p1vqJCF!>{`QE{(AYb?M&n_%bM4_In7iu`kY zS}Ui=8n6Ol|wac>p#f z1@JHPU2~3k0qy?T%iPdh-k49Pf81ddjETmM#&A*qzo6Scub`X1kCd;!@_&;BNK?ES zBxK5|3Z2f`GF5qf0TR_<9CZ>h>4j-;krS+nx?p{Qbt(u@A=y`_}Y+cH6JZgDv)dlEM^78y;zdZC)RTm&d zNyuV5giYJ()8fh{tS&%(5(A6M46xwDW4=X|4Kx*YA_LM`|5>52ZY;o0Br?k%(q81~ z0m;|*d*!FBEx-jNjr(uT#+}NZD8LOQS^wtFntunlfh2?9DreACfLBPWabbmLtSi7j zBwefHOweK-{yYD#+;%N3gy&B`#I8|ZtGrHmJ@d!d4ayspH!**T-OT(sc8l^><}b0^ zl(#c~joqQVQ+XG2UhHn>{MbFpdzlMj_bKmJKEPZUo5TDq_Mq}1<-^S1V~;2wRX)c2 zBlfuR3FVW_KVwfZ7sZ}dKEqrbdsg`z^RL+R%q6iGlrJ*>j=cni0Q_PO#4<(JB@ zn334m%5Rv_*tg7B>^tUw*!Rq3Vm~mKjs3`6F7}i1XXf&;UzEQxSBTA1&S$O|TcBLX z92ome`MdHD=1Q?Ym5Y>%nJdTsVy+Tf!WX4p^W}m8^ zEI?-F*->bD=j=$MPdOeKPP9HBoY?i|5 z8KcfXNX!zbr-#~s4Fw3yJTDG8PX4qb#0$`vC3UR4-0=d0W(kaz2i6v#HS=zmP=p0t zwMwi zcxVjAvHVJwZw0}7EQPRq3&H+l41z+Ab59+Gknf+?|IVfJe=nu`eP+)DR<9#z@_*w7CtNxp@8`+4n`a!5Z! zq&4}it#b}mM$y?|whDB*~`EFPrLqC`mkO3neJE zZMnK1Dw2lK8R!~9Mw9&zkE8`jIE!YNzPcX@k|d7XW;rp0BS{?hPn_(BdL&V5{iD?M zLqOsUT%j7wyX|rh>4$nG6<6a-?Wj1e87N3nGc|rSGo&9PlGv$UnjN!br`pfX;C={7 ztMd<8<+4-y9l1F0084SI{LCZ^Z~{xE404*WE4`rrKd{(X#m`2(P;v!_R;IVw)i11C zfGc=IE@$!FQJ1)BS8;U#eqs4_S0c$lL+CN$1$G6C5pNFg1WOLZQ%Ni40GF`jFt98K zb_a6~1Iu%0D8L&mHBdaW)b%~Y3-AL=C!!~o+Vz(#zzZx@>^iN~em;EvjkK80`i%7d zE9m=gp&dZA=HKQQbpP*dbOz8Y^GI`hGfq>M&uA6U4Wt3K8oL>5(GGxL1MkrJAGrU^ zu@-PdKSZlF;gSulMSBuPwM}lBNL$}VVUFXR_`^-!59LZG)oT?$b(vJ7RQ(XFc>Wh! zgTA=&?(|fk+J0zNd<;fNw-uMBFL*I9j~weuz{Ovbrmzu^-};V61Q5;DRSGNK=XlvLNMORFw=-0FTvQ#|Vqt!hhi z^pYm}AxKF@uIj1Cct7MQDfDnxMN-o0ekf5=wBfFz4eN*aGy-B?Xc#Gy?bG>=^Qoi9 zJ2gEjSG*rul-M8UwGRbK><@FpE~8wQSvO!g@$vKbS%@})y}!++`@dnzvubA@B4>5^Z1$E zb@tl(?6b?-pSAbe_AEgUVX-}%aI`&#u*9BASZenYjp$ z?q@F%EEOC>IL=;1xW9d@;C_PR2*=y^C!Am(FE~MPBH;n{0|XBwJkUN#a5CW}`xL>c zgp=(D2~H!NVn0}LI^k6NA%Zgm4<$UvK2z{8!s+%|f`=0xVn2d#hJChRx!@eaL+urW zGwqdvRf2N`s|Du?)(9RcIG^w^d#&IC!8*Zu!3M#j1RDjL2xr-w1zQ9c3N8{{EVzXE z|5nBNx%CO__15#Oz1BML0Al=)HzEG_<(3U_4&Wg00DPf7uEx~$YMnY6cK>~^Jg@8k z?|jydvhs_GG?aP#SJx9I*8mfKXz#P$HojI zJw29Y;299+s~wD}l;=PPk*KDlq8a>LpH?QKdC`|Rh>SJoI3sGe$*MDA!NQ5zCZ)CZAA;Ci0qXpf{7sU+4~o?dI&ATml^%JgAINgonRtZ(+7 z^dY&#`Xtt9y7D2<#QKidlRjjfSf9imO`#9IO2Ht~PuwJCr5<*Xed57#R{CLgN&KPo z!!D9gqAC5bOH33EyR*^`yXY(Co6 zVZ{qfijmD>#S79a9yN&64kxcQCEuhcuT7uaGl+~1mur4PxscIe#q&*yk<8(8%}=j* z)F4tiocu^FIn;3BAhJ0nw2rIU&^fT$$89D)b&eWDHw&k%F{GR@h#nRmE9WuAwCAxB zy)9hMdFjiUH;8^0icFnR9dEw0-vN&T;Y{bI$`m~^ zoax;ENv7zZ;Y`y-{e+sIFo>QS)>`#H(Tcts)>@VRRVECg8;7-4{!g^7(zRCZNh>;b zSgRI6bPx05@9TdYy#Dw9Wc{?1@NoMvgh$wq6d4$dO^93&uyio8W!WR3*f|m$hO1RK|nc(GuR|pOY`Uw}=1A;-p5aD8bSTG_O zC0t^U2@Vk+ZQmkzCE-&0R>7+TuO>XkevRO@g4+bQ3+@oSj__FfPQqpOU4qvW`s_Cl zF1PO{Y_;D=xWaxDVVnJC!CMI1?Y9zk*l%P0zZ&iTN31)nr-A>k&N>!u0R0sF|J&dU z@LJdbIN35>{aSrhy;BXU0}%gb62t-gPI*na7w!N&O=(xEm0Uk^z#g*3kEY=U1~l5; z3ln{gA30!(yPR<}j$E1yx}DcgEHEWp!h@hDrIbhmbIK(NDYN`Y1n1z^*^I>yP7p2t z=iTbLe&m6fSYFJ2)%X-y>dyfokIjqIkD^(ATYjX0xo`{97cSpVeq6HFTHt=pfdr$|>qj>(Z70uY zN%6tZd&?iJCEL{%-*5-$1F#3+T(t*AfQhOb{D03WJE{Nwm+3Rdk9-if)=qB2I(1Rz zMmd{(n5K9F$ar=JIJrVU(n7R#J7cveI)%phl=_hzqN6++tB+gXJJ10k z5jN@f)oJWajvuKZF3swM(&YJ(6{5|O8LQgX4sn5)m7u_n z#1JnqS8eEQH+w9B8O!n`KSZ%UGjRK`UJW^Z_=ZN#q-Tr(cRhB*Xv7q#_LBPE^B~@zefF_A#`pF3(RIu3WH{;%N%H;Z zxTPqW8Ou^c$;|Pi`<6$TW!SE@=>pQ`_|bvOvSSluMSgVM7Sdw-7+|5HgSU1WXx|Ko zY3d&fk5I6@jAKCF-7j0b>H9*^(_%mRap`bC#xWdAxn1jW^o&(iy?*rQa)qE0!(ld< zKD>VP;qvGSr7#}Vq3I6&xLp2Y63XxOqZgOADJ|8@&ueU)me7sM^Y7B+`4>I8tafRF zTI~OMN(;{acR}>;KI?qzIN<+22mWsh-2UaWlv}(O3-tX5VfWvu>T=lsQvmn>eh3^u z3_SlWkUaTcsUK-0?uigRmp1^k_nNvB^oD#t5l7Vej_>SlUDaWT1pr#}{m2>7M)-{N zDda_d&SbQkNbhw8e&mg~zxMa9>+OZgi3e;3 z*LJZV8KZGD8TPMP*RjfnIt&e#`Vf*voJD`#!8Z<`Do@QPV} zy9Ch>HMR zeSAzR@uTO4llP=e?)9VlhKtaXq6p}>VIAFRb!7R`al=LEHWs1OUkw6oNL}fN^a4Nn zYxp~M(Ka~acT~Xr;YX(p>sgy#PmUkmH#`cm)X?|b-Cl6o$lV524w90;m;GKeZ z3EoY(+J2AVy@K}%-cQ(Re?ag-!G{DNCR}5GMDS6;#|YQj9~XRru*?3W;8TR%_NN7( zA?&d~EBG8?ul;$!7YNtcUle?a@HqR+gnjl`2>b1?3ce=zI^lr*kAiOyuD8EQc)a~B z!M6!F*xw=CXn&V*ll?uyQ|<2)o?-t$@I%5g?H>t#On8?46Tv?Tek%AG;o0`j1-}sd zQt&InbL?LW{#o!Zg5MCHYyYd@w}hMR-w~c?|DN!C`wxPD6a10z0{c&be;53j@Iw19 zg1-v>MtG6^AAp$b|EFLPK0hY?=x$PlyUM|&-lr~vGXRCEP5BgJf$vf_!!BTn1D4}Q>YT^63wt^`+O^veXr4sAoF|G4SGR5g zTh%ZT7W$DhXZPm?rk!<~ah>Bw_MCNJkfa+abJl%93f)MYv+na#>dx{ban8&A^I12Y z!3BE_nR8Zrev;xWKN96UZ=GkHw{rYQjdNKyCyepge&oe@8GJ5X1j-LU6=nI61805b z8ubckGlu`NOiNt4G;89(R20qk=>3_ zj!WWc^8D!ZrNh=4r^a`5Qi}(xCEt(EUfyT12`_+1uxg6^=;P(($i|M1106m6aB_ja zUR(#dd0EGX4XayC%>we^^?wtd|9RMYE$sir`+xBUkf-7N|7J@Mod2I{$x;6fw}3oO zy}wksZ(KQd&jKWNsE{21#GCh5-#AU($Q z5ir*W@?$LU8wEuHWW@OB$zY13C-4D00c69t)ehq3ZM~K~0p!A1a)n7!5J38i7tojY zuV1;cb0eps)<{Z`1>>Zbo01j>hJl2_r(|3PHv(>4JE@Q=dp~eT0 z2AfRlrAy&jLLV8$zI7daK3LRg+l#bv6az{|e;)?uYY#r&?RB^Q_|`{?EIXN8tYN3m^hWlVv*G|M^e#UG*V#NIgqk zt2U}L)FPPw{|a{j-48y1vmp*h+J8j>B+Ym@*p*^9fDfA$K;Deo=`MIR{WEw2$d~ck z?KG#w=`w(%87JFmOqLZu#*78m83m&PNSHBMx?=!WyKsyjICD<`nKEvdJ687f;vy6z zlm{|otZIi*RaOAWF&1n$3y=|G!8WrXPKI4;79bhMDXuXJ3IoW6@#nib#L3PFT7Mi0NF5Zl~*TSr$g_Clo$^;kQm<>tRDD~g#jYMs54!aoG*-oIRRwCINz&` z`GVS<05V|QTtS9v`M;n!Cs3-(wsMFeUglCdWWPAwRwD-r={x~szxV@P3EB+SO8}X# zxFkNijt?O1#eH~78(v4&+0&161>sGOO2I0@ zxr8@6ss-l}-r}ecJd*HM$9%zB!rL4R1nUIr32%2a2p%QaNO*^%NwAslPDhL2Lc+To ziv$-7E+M?faWvt*j-`b6IgSxLmhgVZGQtNOKEekb%LQ8rA9Ab^Y!hr3>>zyDu~Kjq z&;P*xe_?&WdYkof>n5uYRsf}70end@z%GY1Km%9+BOwm>TVMeMAO?UB*8c^nMfq5H zO1S|}0S_ej0rCP!-1C8?yV}5GwW_yI+lLRmDmQ?3WKvnsEoGBmW1a@&u5m=ULzmOr;NS1p%bzd4+m=(y0NO z%8;SwY3Fw1=m=`_0!YvE@O*nhG$?qH!T^%=%);IVre+&>UU)hqL(`(dJc$H7E5A+L zW14A^9YA`XiGbTycEXgQ7rHEfoIIbsyA|f-)MxL=azc)tr=43NxvrroK(sua9k|78 zIcY|4RsgwqPJ4?vEz?k)Zzg0@NDJZ z)V3NvElgMmD?d-55}x5tdDDvCb|8w-gn;VK4a+=OmOx@8Z1exAVL@PL=roi_-T zf!jr}U83t-Bw~Xxvy>G;$2S{aH}rS3_CZCH@l_B&M>pqoed^rM&&@ioPsj~j+agKG z4ISH@+x5oWu>Tjs5+3aTr>(oKgVqzQ%dM5x{j7Uiet;7|w^=TM{@-MoVsQcg_ma9x zy#W0G^Wg@tY~TRCgeU+HC|4<);TEts3y>8+qK`u+JPGmsIDQ*caZZ3ZKC(leOfc}W z0?6)hq9@FWklN#q`b0va;Q=J}_NID&+($L8jtn4`H;R8FMHEagCxApAt9d+04bph5 z<}qCjGI*@!F{2tJ?^w-a32KT0$lmd`o=16^UuR?yV64dv5RXS5&qsMB7a#fZ0!ZQU zsQIX7?8QgF(E%jz#!=cwuvfOW!MP+Ka%yoMo&a)re9Zh2Xu$F0#R25XN;Xl>%#?sRrnB2AaebRc9H3}X8WB?Adj(`{dAHyzyTPz_DkM#B~WfeIW+_!1}%(-|?;5Sj(kS)%+l> zO6WVh(Yt;C?$|YbirgU5h|CYa(bn7D-KxzdkWFzA2}Cc(najXH{z%?v8$q--;0+>$ z$cv{xCV8fFgGeH>`qu|~DL#SzZSsOhB=WrfI`RPqG31^dL^_del-F=WMZ5#%29Zl- z+vYW(;bBihybpSU$RG05_Ns~g@&u7UWXUTg$(SIKhxB1z27Ryv2SdjX^h&ePK5|(Q zxkEM?UWS!5%x!HxhtOQd)=FXIq~`xVHJf;YRqzAC>Lt=zs$e8RC_@OZ)}9UBBU5JCCV0Bw8HCR|&J;XL@NB~89Onq0OZdEFGvN!4^9WyboKN_Y;{w8$9Ty5-BzQ65 zD~?MDUv*qc_?qJ~!OIC>cU&PjNccyGUob%Uh9f8#5)2c*>4*qM3Ey(W2;X)L5x(Qt zB6ua?yN<1d?>Vj#yjt)Y!D|J#32rBR-?4-61IKlOI|)B@>>~WgaXsP3jvEAb6Mo{j zk?>Q;O@cQQe&)D^@C(PSg0~TV>9}3+4#KY-cM^W>xQp;R$K8VW5Pt8tm+%M2eT08= z+)wzU;{n2-91jxy-SH6N&yI%$AHn&*P+5iXe;$DIzvo)lfb~Bf&i{W4_y67n5rF&Q z{Qoq|2#5gux_Ym=6>b4rsn)6!;2iMx${Whv!2X{O$^Y9wPY~B1JimQs+8~!3ME3ws zm|rs^9JgvbL39jovajOzmOyUaVB9nC<+{G!fnKWa~0b2!M;C;!RKu%~=PkxZR1VoE})(@t=an1r?swYUk0y57&1*egSVP)zG zlCwZ0o!XKY(&PuxTfl4DPg3e6rvat>I6)_Q4MbwriEablH~A54zwGPij!&>q1$jYq z8hB|&_zs;3%A;eXsD2RT9ab*0w2l3zAa8D+fQtLX}G%6`8hze5puUc=x#6Ysjp=zoTF2nm zv$^o#vVk;1QY(mS8LDWT%a|@Jhzl7OIE{jWAQFxv#-Tz-$HsM9$JBjGg+ZhoNAUxg zqxlK?y2v}SZabV#(F>auMAnf7dzl5uIkMmnMnO&xDMvCOZ8oEmi?TtskrQPYUm+`q zR3i(9nFUBPvcPHsMH0&ngz%Xa*AJ!g8U%T zf;`0joJbpj@jN<+)F7`%eufoOTPJR#(HaO2JJcqT9%Su58$Wh-kjO!LgTI4dy)hKunEmqvkrw0`?{B7w(i5DiOMXa@9I8vcH%SVEGcX&P zvA)AGr7dv}KF|LU|L+Uy%hr3WL)O!+%dCf6^I-M=39SBiTF$q0TaL0!v}CFOQ9pqQ zfZNp5)poU7-5(Z7AHn<|RyG>r|BVUaN`!opwz1u~lLk*C^sY0xTcJJ+g0w23Az*CM zG8HDqyx>MqL`QLKWgAxa8ovjK#{`i})RpGF3eij<#aJb-c(2a$p#4$+p|4jrYtwM#oqq_HkJ zL1Z9#@XJjY{BncHL6WU!%Ngi3jKi={&I=;>Nc5*I2RRpm7>bk=MB0({=CEGNbqJ4~C z4*5p;IsWCcf=D*f@MYWEI5_^k{)Z;=fAEjiPro=GBmC9zIN@)OCkX%Hc#`m+j;9F! z<#?L#-;QSp|KoU8@Hs@A;&`4=b-X}malA-qb-YA4%<(c|hT|1No8wi&KR8|^+{^Jg zq22LELWkoG!8Zw=j<*P1j<*HhA#^+5CEVNb9^pQY_XR&79Pap#a9_tqgd-du6OMFz zLO9CtC&Dbpr-UBIXN1{~&k1uJUkH9F_!VKU<7>e`6M7wg5&VWQ&+%8ne8;zh1&;3s z3mxAR7CC+(EOz{jaJ1t`!Ji0A9e*brGb0KUxerXzOcS%y#x6FGvNln z8tYhVhUII^Gq4BvEI9vrFwFkHsh`6QfY;Ia-$u9xJRkgjU%@S4yTJn3l;Hm_4&jQU zm?qOhk*)5ABkq0X=`=r-1JBSoPurmoi@Ob@uH$)6j4}&_8XiLT0I{F88RC@73871X zE>yA2(DgzZn4a@P=n-IjGg9cw4xu-IHV@bip|twFQduE%1@Pc_2nI-{>&aAADF~q( zfOgQ?4uN-A-P>+B`$vUDM*tUcx=^$^A@l%nA*UM)38rRN2ps^N({yuA$p3Rr(^KW- z4WS!=j(^$?CarWy5|Yd?Ip&9u{O6ZHIK|5k4DwILG&EZQoy#qc~fc-{RZ5O_JfGYimfz=HjZ z0=EB`Db_EoFIjK3`mO!e#nzb+0sL=p{(m=||3BGstfd;x0PF+4zn9gUArjaL>SBll zmJhzaHy{#VR5@8$1~ruOUtS2;A8gYtfNG;fP~2JO4IwMY^|C+=<9LmFL&yvgQ)jEy z67#D8l6)E(U zgpd^^KFkI&Cc$1`k7J3k;$cZx5<+&6pMuDdX`U(!Aydc|36UUERAg?b81>LQ&j!*7 zmuxV$@j5;`gk)hp36FrL(}~j>iwZ+X7qVuE;h0i0QiZJf@I=kIA*2dfILjo2R-F|> zx{&+%Va7%^Duh%a-5hJ1N!^eOgZ)2GS;YMRH8A_PTIX1cVfByu|F5!~3eo@J^dCe3 zeIMBW3&HPS2eJR%5dG(IIRAepBuxEpTnO1Tik@yeMkrtm9zlb@@q192;{@9=z+-b4 z2fbrLNU-s|u(ZFe74A@h{VwrfvD*AGE`)p=XSVdeWabSa|HiF}?DB$h~3^Fm0;(Sa`8Ley?dj$$O{Slkk40W|I7LrBlj zhIL!>>VbiEK4?UAeWoe}lPN!hd>?<3ro>MIt;Z8W+K*?+rg)t~^C=D?@5gW0nD!0J z_52&tyde^Q{DzIG-w+8ve#6F8Z-^uyzhPsVH$*Ow->@;|8|svxt^xF%zF;k3i*o_tLT8;|J>k*L2EwJzqXZiTn+T6_HVd{0E+jnG zxrlI?bFttOLZ9;3N9mTclrdE6LvUT1y=~R5w3K$3w8*uBwXcO zCAeC!Q*aI8YUf(PF2YV{H{lv*58+y8FJYH+9bvcgIKe)`9%nycuXBKKopU|T|HTl- z-};vIUO4}MqID_U|5a!m2Jycz3h-s%|6d3<0OrB@zYib=&=!aR)T!2}Q`H=}1MnN= zP1ygt15N;(nD!p;Q=$%qir?EGu5;aB9>`PUx( zS5F9ubsqb>X-P*bE?6Cm2qCM^&v(o7D*TE(I{(_GYZ(zj_MCrRtN-c=A#Kj(UIV`x z%Z;2lKi{c8pC3ZXoK1t(2I`t-I+&+MgpfPuRIBw=c_C!WJ;ao(0%m@oEAHmD!XC*G z5#}OZ57%uQNEA3;kRL+MoHJcz2%e;6>J1@j&eqNDu?hmHm*I|qCzyfy`)B_L!0LCUuCF?+C`ng6R-tY2GShY?__^&IOu>(Q_W=m2ZB zRkgfhxz#cVF#wN+Rlo@KTlE#V1@uzz{Wq!y!S3H*Xa`V0=~n7xzVwEXg`>@ew#`YK z4a>sF!O>0RsKf$kA97d*& zHa6Q%PqVQ(H;l|38+50)cbff)-Y`;koc(D@*%ybAxMTIFrcw`;KQ4@<9WSR&O}zQa zX#Z0+B6Y`&@YJM6=m{fX$G!2Cczg?FZ^Fpd@hhB?xF^LMMy8Hm;pC)O7!yXaj=9H^ zG%~@!P*4kj(W^8}lpXrMZ720_>KTBb0EufHc!QB)*z4DZM1d7b~)@ES>M;+dAwYCm#@^37?B!v`tHHv zU%nVdzKv_b94G_l$}sY6tQ_KCB#p^Lx#5mS8^oSUkYn#54#LZv*9q1a}MGNO*+J)U+jNi*iZ&`tgglut zTQs)?2EY#^5zlkf7NfTnCdJ$^lJGpMZ`sh-x(>F~=@VF47%6zp8RN91&ABX$WIR7O zw5JEN!^p$)#)23*tn>rVWntvsSqBDQNt;=I7|Hk?s<0^Qi1PqoA{2y?i02B8rmE1Q zF!J#142TRI4}LG$oyUhm$sPtKJ~xa^JWm7oNc;(?&+IVq@U+yAbZl(vSO;ep@c^3& zHU<&!EZWcq$4+^tyb2~CQSU5)mun}1qJrs!%sbC~;e?M$#R1c)AdJjA9doyZF}R&+ zBOy$8Bg06%vtb^_U9Di4(~OLCJI{6Dq`9sz9B11@a9jeWyM$^e3?tjl_D{$Z#YZby zaTxh_E`2Cf>7j7r!ZYC+p0`7LnzzZmL;jsh97-y2aTs0XoLewWZUtfVlXG1Klj@4H zh`Y*zNm=BC(N)f!#c$ji0oBRv~rztKCJv};}d5=7>P74=FX&ILapV7kyGO)xHHib@rIFBV`FM( zKLp9{fDWS{)XWbfy~cj;>o&CZ3_xhNjy_q9QnNsMjZBEs^-iS$0KqZe3BiS~VjL02$HVC|tN#!gKBjd)Ob9<`K2|ckO zyb_+_dfJ{;Pt-R$-~skIZHE~0Fm%BGU`w%9*n%*!Z=wMn=rL`N1}nEPj07BSUENMc zzNM(F2fkTxm{>SGL2cWXs-WoI3nLfD*=$QHD7;Bw7}+?kv~9_iMz4Z|9KXu8)USfP zoaB+}Rf@vM&hd_fZE%!{?scH%p}))MFtT*~WiYZDja&^RvvFe)BusJ;|7R9+@K7m%#p0)%&#_Q zjyxT2Mt~q~X){N6I%j@$%FNM)&Y5E*H*@AWVf3Rjk9(EO9z0ZQ{U7*$jQ_dadN$1e zRdD)8wY*`u8*TtN9nSt#TgE~3k1uKW-MI#=>@$dsi59ShAzceIOfVPj1ZYct?Q=b`3CYI9YI2i zNrant&RUgpbBH&BY!=tmO-V&4j39}{uW(~>CQuQhBgkiQCO4+c1WJ+q1QseL2K#Ra&Lhhj}r%uNzkPZV(9-2iY$!&J9VGzF!y_uyHiFLAV>*mxCMc4WEX-EmTZt z7-=zzlW)7et#1B*>?B+2}KIqBf!d!382412tj2BzKuk zXJ}<82%~q4$G}}l<1FOv3CA5>yW%H&s2=#rSlcStW75q%_bHOhNcR0Tk{7Ud^!t0!W7W@n0PUkm*e-->z@H@g?&hG_( z5d53qkA&Ade-iw=;Ln1;5Z>VYRq!{$-Ohgq{!{Q@gf}|>E%+Zsmm;VV-sG|fS_Ov@ z-t5XCyv1b`%oO~C;9i1u!dqPqL8qWg&`o%oYj44Q1cwve?%G#y1mPX7k%FTL?{sAe zdI;}wWeesI-tEd2^b+3V$`i~dyw_Dgc%Q3Kut>0&@P5~5!4knz!UtSq1j_`+5u-v;0Rm2mpM?Z5OKZv+`^UjICrv^eobkiur^L)y#%V<<;^@kWrwX6b`T z(wqo#*%Wxm_5h8WacVq2QU)?!Fg(!K)!N^W=31N}&x?#f%{1>kplOcNA^~Ck7PPO0gHsu7h6s6;X#safQbET>(4)*t`rH58l0Jg|W&XOiCpGDk2>O=UroU}N z@A|HGy7Wm3!k-xSZbZ<>%nkH5JoZT^BaEeudzo)b`pU%-^fI$yduv+b7k$n0Od8{t z{eQ6je-Gk+Uqk#~l{Me0!0F$IEZZ#?QvB~J5dHH<^)>ZY@cs9J?|-to55)d{6;=Q{ zlna#OG!9^N1X-+NYSk}74Z=azRdD*3TRputP=B5XQd#W9c)?`K19pO>BDBO_I)i57Iv!=CegB8b$S2=Y~|=J^CQg%M<|*dBT=dA*8j^9WK` zyk31SX}t~|Q_-vXI z5`jgv{A}tHB7en07e0`pgh*boL-N^_C5#hR&nA_yAcBMytA8fd$e0sBwu(Oh#>mnK zHyA5&BS=&+H~S3iQiUbDY#4@*?1>;x#ZBXB(-zjO2s)R!zdvQ{??n-GE>p}!+mm!f zA<&w5$Dxc|u=emq(6`Lnjh-}1sX*jkrs3&H9uwk&-k1nFn0XV;6GrW(u8g0QoXn); z3CY6Pk{Y z`~Q1@|C^$YRQ|5K1-Jjk;OviYkF&owf>aj|l%FLHlz9>4xp)r#RFlT5-y1=eixdAz z6LW)tOuZ4LxLEp03MtZCEd4lz6p1aCew0FrtQJc@Od&-^i=`i=kRqMM()UwHk;`J~ zdnu$yW3lwz6jJ1`So%&1DUw($eLG275JB>a`|MjueHNNQZUosY?w4;R_RHc3l2_c0 zAb^a?N23`mWfA1D=#CTHn|N(7^m=HFa3nCHHRnZ;%3{0eP1q*_XF?!2wBf5Flf}Ii zqCQey(juU@=0}jp;yLpTJ#oCnlt$3;R7~ssKZ4w6o;S5Qs5FA^Cw}bp^pE95(D}qg zeO1p*FKTH7eNe3BmGoMQBjk>vGQFIt_MrMb5%fy&$oH~oaxE5ILio1pXu@|~O9|g~9Ygq@>sZ3~UCRhRaQO&7 zbS)?R$kj^tv1o~za!f##uf&+x#xz-CFPx!rSgWyKNO@u$VP7pki@Nce@ z2!C{)O!$-Q6vAIzrwX1Xc)H*jf@iY*5BL9l0`b4LTQ@`ezgpP)>#_U_(SIL<^ZyrH zj<+nf%(4_h{GSih8zKI87u^3nMRow*24?^}wcGz-bs0q}oX=SQ*4eHb|Im#*QRKmS zi2KzPgJxnB`S0mu(Eb7vxSs`2Q9{UFEpPx2xior%iN1dnsqo23&!;?ro*PAGoF}$l z8A3>s=mjd4>%3*%-Mvxt6v*LSmnW!p|6z8h= zE|C;KN}LmZmy~c+1SxSojr#4XzTWlg#JL|qBAiowo0Mu~gjjI0cmIm(ODz#n;GF2M zNr^^9kOJqdzA5(Dh^!p~HM}myg58p$2 zWXd@Ga8r6u6lpS+?2{lto{S|B4+?hr(0^d>PDvC=GS1VzhdhxigMK3n5 zlmD@?{NJP2 z>!AO4Tbry?;p~qE7{I520~oZN0DFMuTE;^Jke}6e)VtLy)ic!PunRC3d;lLR&nY{V zOOy?%V}N8uk&C0K=$Yfzc5GtTKV&&7ibNcZ%9;CV`}&})o+#39bf_V7KZtl1FKA&D zc{hr{k_iz^;DTE??cCm>1=$6i!=p&N5l5Ig7CA!d+eo(2jVPI8;m`y606+py7etY0 zBcd;}%(y8^n;OSNk!Pb7RAw2)xM>?m@(kk?8AZB{BJ*UHK^DBs;_d{_-zaizMDJvd z!LMzOzz7X7H%e?9?xM>aqh0$!$>H;4MUiZyeIuD;^cz8;_=Qm-+0YWmEKQ>qskVI5 zTbisFsW#SIYSfz@MW&6mYh;%2VRY?PvZKhgv1qheq z7n2=D?u_DhWagp)AUhDzW{Q$Oi)OT3oXxONX@ddHX6Vu4qU6%uBUBz3TeG9&%|Zhv zGbd3gy0R#=NoGz;rRdILr8%be^F+~+#gc53q&Qj%5}rIgX(rF#*Z;_cU+@CNOvQDf;6;KL6Yk}@gwWx-l+fk6Oz?6-x9bYQLBhRV ze!_iR0m9*~pkRn_UsqT#LO8+|6^s#%bPWk^AspqpQgAC_mg_3Ps|h`>YXq+)%yw-f z%yDfO+#z@!VXkYZ;4Z=I3B9fx1a}kWxo#xPcilu-;JTTx&~*!8k?U5%V%Keiqg}TX zmbmU9EOp%}c$eVagkxOy2;M7rA7Pp6e!&L>A0!;>dPwkL!u?#22tF$K7~weA99=LKI7e35XX>m|YiTrU$I=z2x)Rl(N?C%Il1{G;F- zf^QN|cD*I|w%|L0?-EXNy(joS&i^IKQjGugs`Wm&|LY{U0ld+Ah;_8pZTS(-|2}Nl zWeLDO03UJymJHelI0P2JD)lJ!U=?ox{xjGBH!A^%0kG86k@BOs@SsiYnbT-sniAjC z4&!Kc6nz6cpRjx~Jw-z(ItF-5V-ZO}eRdRm0(%$Z5PFa=t`Bx{GbdwwDcp4ILp#d2&WBeoj3WEbR>ox0b^*pNC|e}`IonBTvPHI^vz?TjEpq*w z?IhDgIXsFyKbvv~Y9Yp=$nEnyeIU=%RCJ{BS;v7?YA!lj5y;-N7qG^ae6{p#jd-^V%Pe*psTj~{-4jR&slGf3Pt zXIMQ2P5{qSC#w4@KP&Gkk0{%fQ}(zAC_9GB6K>!Y^p1K19}~l+$wV@x=0LlK6F}WS z`*jdWpqW&7JSB#_BKP_^hF*_7D~7xxYo9~fxqrdCWyg?MG>Y_$vt!61vcmF2g~%9k zs`5mI$QK$#afMN23t8dp1cgx~3^~>81cgx~42>dPVM!FpLSCO9v4?dua)#Utk09Oj zAN;6MqzdUoQ0C#Vk^-XexP-;1Cra!fwZFp+{SW+XQJogdoYiKyE&&HzT2>(~$l1;^ zrSwFR5@g9?5EryZU-IQdkrAZ8ewj1z0z$17!m=+fihLlgU|D8Zic=>?T9B2_Ovnx? zL0;b-3bEq`I$P2C4ecU7N~|C?t)%#}q?33-dU;3*x6f%cR~AKPkVoAaX-8eE1tbZ% zSTjtO?};K$$dW@$$~{r!2w5`SBq@v{KgfgW!6{dCc~RsD$IxJWFkj-SS0WV$NkUeA zut{}x6bV9ZoYM@A6GkSq{}-#X6?HcB=?2)_w_IHf@jW)eJwKaaw@*mj3Ne3ghE@N= zumj*_hym~sSODLtzgQH@A1wP=vMoihJ8%+22$~H$1scFpu-vlRvd*&6a++l`>>mhO zwpy-(I6`-W9r3i~WndLQf_sI(v;1OJtbefX13W_!oHm#Q_Qq_ub+7?qk1n^ahB0U( zoJ86Tw~>TkPr`N9n_+L_!*D<8%dkt~Bd}Dyv;G3b{{O{4vZJQDJ{0_j@F3U6f}aTf zN$^v`X|B%%KNtK$@JqsjU0(@)E%;}`>8`&J9^(3jaE9xzg5MGz>iSObd%+(FXS)6- z_@m%YgonBQPB_c;v*0g;hr50i{EhGk*FOaRNjTf}FTsBc{)e#Ktq7`u7Q#7htKcxf z3_%-Vg*#L54}yCM+6gP&4ne1&i?GV=7TjBKAHm^-bKUz2ju0FvIEt{^oh9fI%ofZM z%q5)X_6p_+<`dSq3j_-ViwKW&7YmLSEDYw1|pRMZI>Ke5kqW|P5|5pB_JPi>*&Q{jw@qe;oNMrCwGv6@M&_rDZ zBA)B!(`ad!sFA`jiu7r4Obj^;wh)foqlJJD2+sJ(#Ej7c!P<{Z%orUHMvQ^=XsNMoh9ve4bYC9F;?A^I4&7}bd-L??q$WGEqe8MuUV)0L3SJM=kl#&Z)h zMn?l{pPQI5dK!!(J>#+%x)=DBtM>fL=xyMfs}gfYM+2*`O3WFZ3r3Nib9M~f3aqd) zQ6c&gI2FW52A_wa1EA}`DAE;{#n5BGuTrt+S3wT~=UkDPGx`r$JzL;<&fNbODAqS& z|8KniJ0Su9_WvtjCddAt1Mz>}R3A{U0qcL6S_QZN?4$goJg?lQgp@Pj{=Wq@8GB;5 zB4PG^5iD~w&p0rjFeKh%7oWO3!#zldL=tnsV8VLkj;=FD~7%U zb}F<$0^Pzai=p#?4Y%gBh8qn<=u05Kb!KydsTo5j0vl1yW+N(wt^}^%CUgB}#n6|) zC2E2%%O4Mlnjb?S0<*eJiGCxfve7a09psaHsWDNm5!9X-x)8WXjiw@bV(2(Ce%|Y^mdmW zi#rooq__AnF?1$y3G338kVXx3EpWzli5a7Bfty=hV#erPFpBhy%VOwV;8$L-=T}B& z1LwRTF=zBPu=)jwIisV&DAIGzj-j`K71kyyL~jG9s!ddgjs~MhS6CK9PXoWo{5`!2 z_Wwc%;br|C*8jHv|F_Y4ESvxyYu(F&5x{P=_$})p0_b#0HrxR6E{p(I!XAK5hyp$d zMu0DsXO&&h|5s4&PxGJr*h(l0_klI-E6h7GAW@pkqhcPiE|2P-8adHp2AQQ;BtWKE=@`0So>ZDwsEzq7AQHkiy&s+kdqc+DP-Gy`_=e8J|uAWHs#E?Axw}Ph zAz`a~5#b8=V!`d`)%vgCAFD{~`EXgzCt zdN=gIvt=>l$k{$$57$S+5ar`b5smIF7&r4{$e7c?rp)!U%LmUj;fT(QgR&UX=B#L7 zPl`%oNTTy*F$`w0zAJeP4{R1Iiy@27`ug{*4@q^_hgW8&(N`QpVtp))(QpLD@S^&V ztmMX!V&_2~!_2At1N~@J?n!F zU1{{eD~ydHV?U0zJoT)^2(!Mv-VLc@`ew(F!Dln9=eYG9hVw;bG34wyx9&aVRvJSJ zpG%LCd{TXCn&OGiC*!T#oKt=I1 zDi}hxteA$pb2%66$#H`>YX~_ro)yk9&I(0C$e7U)-psSRJG;6%%_nG~K0QOooN==` z3jz>!>kTS*h=?=F_Dn8#d=&K#A$7*fqcd0t|LtAh*M=8N<_;lW#sl!_iAi&Zh%qC* zrzHzB^^~V33vIgalw=|Lu{qC^VepFYaD@UD4h;h#?{GbdB4s7+aLpYehc=b!#AMy* z(q`Q!Bnq>J(5cO}zsXqp-2Yc9;8(i`ZvQ;px(ZhRNDys>ctQPunErp>;t!dJP)h?bCs1)_W$y)UEs2?uohU>`&I#zY`X*6Qa5D{NAQ-u;Dsh12P^TnGD zf*X4K*1|4wun~+J(1sX7+KXa{WdVJ5mOz$nr8^zQ=IlvQ(DgudZ#$QOK?Kd8@zW2ol`uOU6M4Fl@6hQ ziihlrxx1&@ot{60zAC0#E*`+JW#*|$+yDFjhR+^$1}uji0u5kK%!VBUlVImS5$qt? z2X+!D>MyXX;7izD@D}Vccp7#a+zq=9t^-yg1iKJ6!)}C)uq$D;x*T>WG{8=U+3F$x zWytxzET;9-4es{|uXn#kxXb;n;5&kE6Yg}sCHSV`8-&-n|46vQ{W{@x_iKW$5^i(9 zBKWf4OM)*FUh95A@Oi=K2(NKJOL(>W8NsIsuW~;n_@v+ygj?N@3qD48rTbCAM+6@x z+~R&n@Ik=`2#4JF3*IMqFJa7mkKo;ccM+cKKAZ3q_c?^8y3Zv%&AplMboY6LXSmNN zJkxyv;aTnr3D0(4M0k$-V#0IXmk@4tUn+Q+;N^tpxvvl$6!Z%Q2+wy11w(>i!VBCH z!Kh%2@IvR9iTf(Ss|hc4Un6)e;brb^g4+dm5MJ)Sj_?ZiPQpR= zE<(TidcuJF2Ew3wx8RL}HxY*1Hw)fE7Rj@ zZ2{|lUx@$l8tmG+#L@@n|E9t1AK$4jsk_zl;r`EBbsXIM{RQ0ojdOn+o&EzlbBM@f z8ufSa2&UU;#Y03Tlap&_ssISk`-_H%Po}ARXX=SBZz#?w@5JHIJdk;ZkW;3>5t-MS zHNY$84k4rLp_yj~SlbX6C_ed&9zs^Rn3lcUyWzxH8%B?nfmoZ@iiVJ2=BatRSwB4j zE8~J8WSMyi-j-y4fX$yfgd8&+^2*!>WBvNB^>PU{*!o37NHMc2g8(nRB@|WiB~G$U#%wwajabxj;=93?U26CAius(<(A| z2)SskgsV+P9;L3B^4|WiJ0!Da)TbRH+wXtLZzyG+#J`?qyEC zHD&UGA@nozD_)tpkmz6LLSC7!kmzUTT&_%$3;LTmmo2GtL9a9CvL#(E=zr#1wxrAj z`~NU&uVQ_l?EhZ)^Y?$h*TC;J@PDTU#tosbchoFoSa0Y7Yrl8J8i;^&SW{>Bx~`7J z3u>#n;M8!>z~PX+cL;sIZ2w=MWd9crq3@T1GG*>cJFAihm}b>oDdsF#nDF`^?*IA- zZvVshpY_(UR^0vbs^tzk`@0Nm^%9Fk{TS~59#T()-9Hs7u*k}1%EPepf3wm-w|~J5 zTacju<6Y6xSX}xEqtFDrzm0Fyip-hX*8XD^tFKKD2YHV0ksXdaHm!XW0KawEL z_GTzRjA+UmT3~AqEpFA4+ze$#Tr#)5wzhszZGA;~b4`7n_E2t)scdys&5aeBtROo> zInbb>xuLwFp{hg_RUac#dSlaRyS5PHO+0Qt1!NM z;qVM)a{RHndhJ0ilfr#W56o+BZkSh9URf0{#one;n1y+6(|21~)i|fVN&oPp$R zhu8AWcACB^v>Q!Q=rEP2rfzOcZB z52mk$s&!GONz_o^sDH>ZTZVE(Txn%pldqz@VqTT6xn@CCeY`o2%g9iw%+Enn_Ep!` z&nd6vBwB6-!}Nydt7(8wS6{oZ%C``9?(@elu%?tBq{&My8Olt~%8-81yz=HM_zK!n z1>mqVG;cj4O^*FPPdOIj|2zVF?a#2TfV)47E&qVsf45tLaQp93mZ_G#)o)-;z5{Om zSpnz%3!wLZpxmPjLG-_4_c%-z9BR(IuDPmlZh3`X;RQ2H@&@QRN43;9>+;+~OwGq6 zE17QU_>EP~Esb@}FzhtVjlX^I!KQ&n6E{~a*1xQGnyD={HABnSYj5;H8Orqd=d5Uf zp1+{6>Zq2gcpopAYI+H55DUv|TlAM0J;kI0&2%ezClQ+Yyp9d`Erpjy;@)zJ{^cQ)+zUj{4x zlOXn2MBS<017pEEz}5X`*&A*Kn_+1LUhiax6|~**jO8n<)#|lQw9bJz;>TJ2);r+1S ztIqUrZjjtp37rwXd0oBb#u3BRF&0((5v-qT%gyEoo94kJY`JOlFtvgotSWDUNyJxP zyQq9glMgJO>iWi-@;b{sg~QZYsUA79r55G)<_uFOo8*;MbIV(5n=N;FhN%-x5*SDz z#ob(GSh~55Rdp5fEH}i<7SDKR{IMge7S%M(vs|AyOr6dO`4=BpAW-7+xit$c_m>P) ztI`O4)i6wgg8PbwsYfI|!@}|f2jhVx_n^nv!Z}crF zUu-*4o~UiAXkHB8u-1B#6pDYTsRNs~!Z)wHuClhO(Ynz)Oq~XWG6|uB!BlMBkULDB zs>^VRQtK1ZCR4J;ss&&JX|fZf(XmQNaH3W$U)AD<7FcOn@8t2IqQ0`KsjAubk~H`F zy1FV_4*1IFKu@Zwv}JI|1rtP*)YUgGD6h5Il9I?&Vat@ttZ%7n_VLr1`|_|*LBBOt z!Q!V02apjw>Qpqqh|*vkl-g{7x~zb|{ZdHyyMAGn^DHj}&qJ&s9?vQotH9oB!tZB0OkPHQ zs;sYQvdxeND8J2ZsjY2*IofupyrldNvo_4#wYGz$SlZ8x^(_syY364a)K|8^qQ!QI zd?|VMsB+s(a{-#l8)|IRr6wBdDwg1I{VWfn6^%>4Fqs35buJ7nw%4_M@mDZmeekVq zuS%uSqYEmh*)w`cEYDeXSkAJnfU`gO>QCU4yA5^#9#6ObIbn==PT8G!`yVi;3r(g77>4t!mNYME z&`n`)i^;0v2Q)*bxY=ZA;W`veSff>#*JLtf@R8~&-H_1KD#{zmo9AhXz4H@P&rge6Cs3W@piIsnXHU42=NX*DZj zL9*#sGS8&U{G66!LAB{!s;VoS>MQ2QKTFYEv$YOGW&Hx5aqUuEW%}}S>l^3PRQejL zz*N>U8C_{wGr)x0G|wmH(Vi))FlAIx3q(XieQiyJPMH+VF+BkTyr|HP<$`k4%fJ)Z zaT|4c$!t@N@Zu?vaw$H-^gcLpB|b9xaMSzHN-Xi2{8^^vh&6_vNPFGV!%Qs=I|H}q z78u#}Mq4n`^g{C+=NwcE{D3aU`M&@*@xlMjgcv@%l}Et__)-0XIu_#ltXD4wFZ?U& zcb0v@3%JNK0Fi+10cP-f>nQLNE&*?02u6+fljifZKNtrvSZUJ$_6m&Az)&K628+dc zzVf;yYhWy$X#T0Gd~VfRNIuT+^PKXgnu?V$RE{_N2<9&=&R4;VI^FPVbyHIvn2OCc zz>chjaS)u5dWLn)wF^26z)xO zc3rb_U!oG?2OtB`0>*h&rShN{Nu&g9gxX5TLi(B#G$z-C8vliKg%U89A@K=nJa$=tY%o%)FHVGtpV8x<@Q7!73EL`FkAWP4X+ftoQnZENDM8B z%`#=Hv5qhgt(2$%-$=RHSVzVufC+1);Z?aN-6LQj`pTOsYHF0-IRAU$_&)gm9)R_F zKSbb|0sH^Ihx4xclc#SoQm1@9#482(?i8UU^NqN?EU;`j7Yb(&O|& z$=Fe(^=d=c{_8T7YNpkUPjPpWPNF?KsW(GuO82a(>uD+SdQ4VALu1WC==GX(LU)ET zKThdU&B3P!gL^>@P*BiQjN^SlmudKgT#NB%YG9~$?ZiZo@? zq;gog12L#&TD06WeK*5Gp$^tNwdMK*U+go@y!dgMtTQnA%S^UUOC5CB=Ej-|SR46_ zwNP+u@|QQ#dilqgDp4ChwX)_c)xSK}aYbY8TuoGTwCOd#L_?0%Xo!|AF_jUX01F;y zAQ*v&v(PjZEH;%GZFEUjJ$iW~tleswm7b}k|@V~c|Z&Vw^_MQYDzGGmQ??rIh z|4}&e`>iDtBL7VXp06FE0bC9|-vbcG=Vz-6JcX6uFE|h4hP`P0G(HIYzy1H>^Ep;E zdG~VSrULy&p0g1!XH4d)m4AfpOg^*WaeIRWZ1^|CEff41zkX)oPfg8PX036Cwis5G z2gbA0y&E&)Qx~g+_J>BM^5?iILjoSSdSE7*Wl)pg=i4_yTVs85eMNn3lk%&%T4?BU zB@_uAvDoOlQv8mudu)o|v7sIXT*fq0nRJJ4J}h`)ClwkX^b#%2UUNani*pE&4G`Z> zdkWk(+M-~t`DyYa7nr{f&eZ7A+sj-Eqn&+3eEP*wQ2qL#3Z!m+G1s(k?xPb5756Lb z7q{40ozdAeU6?3&<0e>{(3p!A)ujATHcXw*)&eF)DOv!&hL$<7H1R=)^uelK`Fnh> z)*h3I3m+k~e`+wMb4>-w+s(tu|?p_5H*xku_W_M?oxQQhwLQhZ6 zOz+He&vy6h&XAf6N|Gc95;_i1KtNEDoD3)e3W}nDf(U{Lf&@h*M+u4nf$uqWD&5l)&)iQYo!NNh=^Yq<}Ol}jDMxC7}Il0 zP|RLU^%kRg))P{g^@L(xJ1+Q`h29+&>iL|Wk+|QaoCmMA=-A+`!8JbX6Yf1G*mJ2m2Y!WxpViujxLi6u zo*aYkbP^UtYbo7*bnsovXYw%4+7i7-1urIjz(N&QKT6MMg7+rhSla^Cb)+^?iT(&9 z7ujr88+}IvA7TD_+9e-{B^XDh-9qv8Y0r>4NgSKSu|*tP#j#Bs+r_a%96QCaOB}n!u}2(x#j#Hu7l`9Raa<&h{o=S- z9G8gWCgQlMIBq76n~UQX;<%+aE)~aR;<#KKSBT?EaokEASBc}+;<$}CZYz%4iQ~t_ z@#EsSy*PeC9Cr}M9mO#&jsxPD5XV7rOp4=>I1Y>Bh&ZOiakV&(isP6#j*DYj95doL zA&zUrF)NNaam$93X3C63eLxRW^UERMT~ZH4ad&atLmc-M$GyaH zZ*km59QPH+{lsy9ar~q>eo7n<5XS?>@gQ+LSR429IKovF8zK_?Gt$zWVk3 zxqb`sf%fB@-wHX16YwXl!53dZM)HIFBm86Wy`PMnpy&A)`d8pyS#dl@9FG;p&xzx4 z;&{9`o)Ggv%5Y9(C^D27$_y2TDnpH7hT$ZJlNnB7IF;cvhSM27&u|9AnG9z!e1YL? zhI1IsW%we)c?{<>e2L-93}0cmfZ?kQ7cyMLa52Lr43{!o#&9{q6%1E0T*YuT!`B$T z&hQO}Z!%oN@GXXKGhEB?9fs=|u4lM`;kyjqW4MvwCWh}b{D9$Rh95Hgh~XB7A2a-f z;Z}y*7;b0yDZ|eg?qIl+;pYr@G5mtzZiagpe#vkz!+i|DVz{5-*9;FZJV@XFBIf`H z|COD~oSR_Td)bX*1-B!1`Z^3d{$B0gf-nA0-g@39-VR^`eiGmFx!4=*Zp_(l`5X8> z{?`6D=Hz4ivoHt$(0|Z>@qNCJ;961}E2dxy-N7scb-6NjOb3_pY{ZxhF8#QWEgS2C z>v66kEq-lXg>)}2GbVSrK(c*y>EPNA?ODvaE#I$_+-<8vJr~r%t%8e8%ZRmmaGgf# zCz;*^QE+*1Wk+>b33UbUNS1>8)g64+R3SKtD}s+r>D9!CTowEo>g-~>1#gCR_J-hM zA3Ev=!7FRFTVL=7s2uF?_FyS~4`L60H25F_&aqDfAD=~G+yWg0p@~ciVxdpoem8~- zfQ@7d2Vv=R{ctI*irh%J0hkY+f7XfSCvwg^;ZjoMoqtFQfbId6=A5^~!efK+3D*q^ zQ)$li!kx$^CY*P}E##eC$>}^-F3yWYqO7gpuCHIQ< zpD4KnMUWq*iNKOmZWtxjUqtYNG-tEex?~FOtmVtMF2EZ-9@p#X{vtvdW|73uvlf@1 zFi`>hMMN~rB1vz4SQ60*Y$o7-iq^!qNA5Qm-ZNP|1l`>QMMORX z?mytlQun{4*c^KFeE-Zg3ihG5h=2&mi8jtNx%gHM_7@Qop>Ij~u52Hll3ZLwh=hKH z!ji&hsYDkR5ip^DbiDOo6^-%FLsovxZs;x|Y(kojU|g`}R8yTr1W!ow6dt5;A1Zl587dO-n8adCvTd_`6cNRaYd!T48 zpok3Yqy##Oh@Fse3|at_kE-u0B7Qabr#pJzf5YvL>bWhzYx@4 z{CA1-Bj+LKO?Lx0*@xljI~K9`-*fMEpY>6KH>Pi0C%mhF zGVW(x0W0c2CY~L1UYq5tGy-p&muERkeOk_|#>lIiWD_nLc3v@qx%FE+XP6enaI1f( zWrd~AZ{NRine&LbT<}cM(}&F@YlVKSMcO9qaj?r*MT~-Dm8(z@4^t{pW9dr~&XWRY zPay3NI=_LsK$JyO1N{gr{rH&kU|kiN#8PzDL&jktY-ps!6jDRV<+mp&3~|=?>}umW z+{;Y=MnL)>_clMCewg$+JEvL?O#KA55hU>!Gq`%UAes1k09hvwXS# zX0U9PF>v+20M7n6tZp7Sz2Ear_4f5X?#;zY|4!uLI2>a_4|e?gHRAq@IN@LZ zTU-R~NRR5okEmmjs1a&WaXW4Aot4s}1Q!+&Eu@Ek-CjDA#~eLr0`?XZx3T6t{K{F- z^f2^>#1eQGM$#Zuvfvn2w<}7`|g~aSKanpf+hX4L#|_ zMFbz|m&U%Z=BubHFDho^6y~fKLcxsD_h((&cTL^6msIWanL?+2VSMW(@)lNE#h)vR}hgiP^uh&ytWHlmw zrMj25x41C$JcU;^*idhAK}cwptI_=5=-%$QPr0|lj=#(s^Y+7Te_z7)|4Z*F@1K6F z;Pvn2AM3gP+5R{DyZmSW<){Ba<$wAK7%CZAFX+3;ji&I0(UK%J;eN=>jH;f-r}1Qd zBs1vFF*768LYWaN&!F?BQEAj^G%-FCv>?#c=wnY#;B$Vzs@&RzLE`~?#x{fkBx#Uz zg&>!9$53T}5VQySCi$V_OjMG`eIG1wB^6W^W5~+k4lULPeNcRV}T z!RKXa$@bG9G@4kv=K=cu=XuQzZ1-olKrbymbA0^tjX6&S-*eW5=>u3Ad~bD3!?;oBsVOd(;l7&$=~Tp$+c_j| zhg`1=+9>Oy@M9p+B#kMV>S=JYqwk}^Ug~It;oy*>=zO~bzZ_BxWsU|4m6Wt~@r3XM zJ``+&9twSZ+Xp|*V2X;?;4ovyJ|u%rA`tU17`zSqKAg3pIn>|$gvwUY6dW9J2B}~R zNdIqjMv4D(J-lms_^Xip<5lmc-evIGPasF%M((Td`h5-Fzyd~VmG}2d=OCOE{MS`P zc#kyk1s9S^ZR;)~#z$Iaqy(OwSWqgFjv``wq&6l-V`&I5^@#GRuh#~TwjzRjWXcUb zpGIzVc25x@K3YMe$%{1Vpu)ePn6Wf&`Vj?_MKQ=#Q+>s>rA&);K`IR+J0e%GTvk&3 zMMU~&Wt#MSsP6&7y^`!Gj_Dgi@EX#7Cca@Q32is9pzACm_(yBZ2;!i{+z6Q3s?YsJME(S>N!}NxoFUx8 zB7e6P5dkFM4jAhOkaHtxsNwy^xYZ6@(+m89A|f%Jk58#9E-oStNUsSd)1$ELr3-;G zl<2}DqJi`}GoQ&|U67u}Is=SPSZX!7xxa{zAbk_`rYPH!imFg8_7xEr6kNv5vYJ{@ zH1R=65uy-?1W}FA{NL%^>)^lV!2Vt2egb~KW8L%M@4wG|#rrV4e&bjX91G^owTSh7 z87qP&f0>^~p5V{Hvw_)EaEfq0ud$@Iz>ZJWq~^Cqf;@Hj}S35x}({& zMTW%j93m{p-1-OHBZbLRnRq`DOa-r$h@^IYXP!7$%JRp}Vn;-E!v_GiW2yiP0C@tO zM{$eNTs+RIHjI@#LOD;!AX{<4%&7Aio};vGjuWrcm(S&9g2@iVzR0EWvC_? z1e!7LpQzLksM+9(ArYtNGa4?WAkQ&#Rt(E;J)q>erOx6ZdeGNGWZYK*y+wrigj-QV zrV{EaBHBj|mAVyewpUV}#RKcFMTT}GaDWz|$4I6%@vSR?jv@km&3qW`q#c^FBgLl~7+1p*`}&4z^_f^4 zi2W-_MhUO1^?eg`0794{{6R<7baFc#PBe~ zZy6q8c$DEWhQ}Fx$MAcGCm8;~@Fc?@8J=Qzn&BCSXBnPjc%I<}h8G!LVtAS16^2(C z{>1Pa!|M!hFucj|XNJEpyv6WWhQBfVo#7u0Z!`Rp;T?u|8Qv4%It(s@$KW$W7@`a@ zhB*u$V)!t_dJO9`Y{2jlhL19A$gmN^#td^A<}u7?Xkch$Xkut)Xkln&Xk%z+=wRq% z=wj$*=waw(=wn#Gu#jO9LqEe}h9wM}Fl@@O8N=obTQF?Nu#{mL!*Yfd3@aJ7Vpzqn zHP8P;j{hk5KWD(3zm?yP?B5T<{(l}U0K0(mhrCiQ&;KW3@9%N9-+9k@1T3I4um{)> ze;R!ykQFc-!4s3FHJ|dpBKHpX2x_e9E^PqipruZV=x1`*g9Rn<6{Nch^8_2Ip%SNu z$C3$?g08!S@FFwoNU?Or66q@;z(|gerX`^*T2c#32s4taGdVW}tmmrheI>*i$<~w{ znFjdEN~*PlP$QWH6)W$2#-8QdN{BErmI+i6FH4=;Rzhe|pq839wTLDP)Dn+P)wY)q zJtU`SzO3Mqsp__p8#uB{JjabK8o?gj%+(Je@^^{YZlW{aE6eP)wxi z*n%Pge&kz50z#Lo7i%mc>ZeOld!Rq6^EWFZ)Mu0{=zLNwX9?<4;){z2`;pcHB_0ay zQ=J=K|QB~TRceX28gy>DtkOSEc*<4T{~R00*TN1Yo;s9FN&P@gxL%u~ui?U3&* zfoh1?R{b#XvEfW%FqhNnZ$}CILX1ZNf$>58l5~_nEv&EKN_D%l1VUl>0X0ez9?fxEdEHtcdzrO?mA>OZmP;MNHZpx%Wskc;r z7L>pw#8@+nWUxWd2*VA+e?hY;(=bhg8_v?;EMg!S)?F83iLn&Yw5Zld|KG&$^dW*@_k<8{t^tJcM;>W2yCDU!45bRIRL&3e!vTe+G+DwAWmnU zzmI>UUjakla{s%q2|kF}yVw6)YV*HC*f5(`#x65|Y!$oQ{IM!_h52La*p;xWfc!Q% zuv}Pq5}9%2euX7yC^8LW4l-PZYtoS^PU%J!{FO#B%&n%91QJ$ocEQLVY|7E4={Tas z<71KCL((GiU}R6p*`hXJmyhfwXS2HBI_hy4c+0= zR63G}3k=ypsSBzMR;b8Yn7Y8tH^o#qX`i3VA;sThWR1B}E&&6`Se*Kq<*a^mI#T3E z3bNbDfyrTH#Z=m+_Z2q&N%I4-p~of%iEN%9@lIf49~<4l{=r8@9fVyk_OR@8DmPIO zmU8gAl2iVb@+w?Bm|8n9y%V^#{^bF2qmUes@l|tH%g0H7 z;oqE;ydC;`Y;4Y$^=Eo|&ZwjwqBcQx>N#;!0I$bTX3n5#eSB(8(p0D86Z!0%5mTMc z&DqhkPL&DsXD$<;GeGlyr?WHV|M>wT>yGqu;PrkOF?qlCt^*g~2t@L21NN_rowOp$a-RdT-(LloTwh|mXm=`UPR9c&mT1s&0*bi$U zrB#%U5?nd&x{37kp$H-d8-jy82}TM1-I`$@oSYNpnX66lfk-9lf3 z4??Rn9iC#40cHU@LL!`&sO zHikvAwg{+=cq^5NRH#>2iaE{y3!%(oFVDxEzqpOa{*ytj@6Wr}!T;(I&2?UDEA zDCauF@P5O)$-5If13ZJszd6DWn81EvpG0JC4P(dGv4hzANB_+}M*I&-<%EqKlET{_ zr>~nlJac5WZ5nj*Q~5bVT9EQPA+Hy^@gewC_H|LlnUNHzqagi~Lzdld)Y66eR7@h6 z3(Tn($SD@5rqaYMAx%7mF$6y^PP~FWe$=ue1IU0Is{OjTuBxS}9=W$MiIKp?oSe=+ z9jy73@L{XFyqeu+whXe6$m?GzbrxKo-pCx%eRIdYW>qLAw7BGDra5Annm8Bg&*kQB zu`B|;JWdl95)lfg|C~!WwGDLz)q$ScVwXxy24WKr+J1%Ez+PRSFQA) zH3cGxtN#qo(8T)5BUh{cJih?=TMXfYSgphT4^_l}j+H3PIhfAIp<2XtFeMx}5gTB| zhGfzi(LgR1H&U`>$MquaJkQ1Z7yFs)Pc~ivQy%woCqFXOp@47k4kN<_Kj)t`Ih7g` zET{1Se$V}X@WaLElttJDQXeAmY;MkntWr{11Q&RYNArJ=vzp@nehl6HB>zCf^sGb% zz<0s^{TXs~%pi(?46*$iAq()M*a7@_J4dv$7S3CyryrBP8jOS#a6 z#SR$ug+U6lFPwzg*?O{|gxR-b_)yIy@WJe=L47mLrA(+w|HLgNP`~VV4vPbIBP}Hm zzJhi7_irhUh3ba1;@MIHy(@5@$(>+R z8(tLqbZ?5>UOB`B9*dR0<=)NSeOL$l-QU<>h&bS^zrTM1_(NAgi+I3)>0f>z|6f+J z=A|e6!J)J}7A{L=-SN7zwQibqE_3dfn+X@?UCIfH9dfi(a@>_RE2{{TkDF!nOqcSm zO-Rp>V_TT1z+&8`kP;ZktitTLJIN}WDJ1p8r8Fk6O9o3Z3%lz=T^m{EPKAq>yVK#K z74A;qqLuE>;i9eFUBX4H++9Pxrnnkc8ZLGJMzU@pEC+qb-JLaJEthgBtOv$JQzG;S zch7LK(Bj;^Lcd{ZeAwMP^u&a!=D-idS zp^L#*nH+OJRaXj?(>);6#8?t747vw~p6OW1Jt*|7ki31=Jvh``BK2cQ>mCy7EjD&? zKOK@Ck7u#6O}dAM8itxM=^jSmTW;$^ z*#T`nX)eQ89yo14sWVMwILdAN&KgzIQucxk!g8+ay2`j6*kknDFfj%SxkXf{)zREYq35>Z!8?=XkJvUJs~; z(ouqwJlH@$EpIKsD{ia&*xppD%AFs6J_C6H0=-*QZ^DBDY5 zpxVC$j}Pk1wi5WK_S+ZuCE7|Lp9X6&5UF$9OQ4?GP4nobs_Fahru@H8`*&j3t}~GV zAPbM)JaB*>!d@R=#%#Z<7st+DbKDn@3*;K)1U$lB>u!TQ;hyt6yoTR#&UHRpmkqe9 z3|GGTq9{qbuz+SW8NI%0DZ`C#Kjx`%{g_+I@ZQ^X>&%hncyBJlD<5cCU$m{vZh6zP?Z0R%!z~}^ zFj>1)hg-_<$=lByWB$S{R&n;)o^=xUR`x+ zRQIX13=h2hslnK(SJUlfINbwHlO2h+(BABqSR2V&%V4|Nr)4Jx zG^3%V43eAu6J_&yE@k`wBMumSZ@6>ZE_~S&U;&?q2%xXKx5MK1GP3-(BMxu?p1@Bc zGr$>$47|zv1u}%Zg&hDE2;Kja{_)s5zfcAKlT{%tSU3EdsN*Ctdt%d((`yubw69z4$sBzF(G-L!`)*;dSPbF{amOC zr75__g_{r>hI@QSy`FGS2x+E5g>g@0Q@0)#wCdv)L&_x-Cbtx7b&XpNbu~NSRzfF2 zb#tp>u?e>pF3P(z;WP6I_oUDdMsK!za;P6U_mq%W4&RM?YUtU>r+!+vI7wfqdwN|l zZQSU}96|aC$>G2~BlJ9TG>Euoh8qzhk9$_Qdl;?UFN9^`OBzkOXV({FTy)O~UylY; z_uSAU%S{frU#u&eaL)^!E!-LI`85A`I6HCvpR@c!kY#&QFbIx>*z^U)^uc-`2eP4?^&bt^6BW6aDd|S%!(f8{b z?5c!q_GDdS8UFbmT?bF4tY|LBF^K63(WtCyE5kFtsi~q(xv;sRu7ztpR0}$xtnDqs zE5EHiSM9YZojbY-IOk0hN=VkWmf@aXqMLv_5#g&@S=mvBZ+^>gWg)dz);E>6v!4>V zW@Sxt8IF0(BEQz2%TNy5TOo3V; zKw4`nvxi>R!VhLs+Iq|I(1Rf-z6h<{ftfRyOz2s(vkW)A(p9t&9DwE~;HR%s5m#e- zUnS95hO@q|iFi&o(OZVkzOExVe9P7vtGf)xy`pC5jwHyNsV>x4hQ}TZ&)^M-%^k2x zS5lp2c{VQwoWKy`|m9? z=Qh|K_*6+3R~@4He={WYa-MPi=5CC2{dSoD_r*?Mr@0rp-$CU6@7&j6{oB}E3@gBD ztOXAC%E$tEIrx8fB7gS_$lOhtLbmc#{w}Z`d=?(WuMiW!`8BfeKlXot1L(+E1w2P0 zc7k^lJuNiRT3&W+fDsV3fpPqFu z4j1L!OG0znq$@q=x-*kw?qwmxL$XxdrJ*4ot0MREP#IQH?iHajth(GQ*N?aju)Ad^ zlisK0+=EwyNIMigk8jEU9ebbY&52JArZWETO+jirKAiNQkT(Pg5D#)x^th1$IUqUa zKPe|clA*9&Xdrq2F(bv!_dl{To~}hdi~pz*SeqJ5X8b?M2Zap~v19;!B6@_pIC#9E zCajr^k42X-2LQpl*=&3|T9Wt8e-ceIAN_>9Z|sE^-Cf={N6IT!MpPMV3j-OX3W%ra z0?}ovEmfGwMwhA{P#HJ>an*wXP@_hp`!FpJyaA99qI;=IJmADgR2c#V_frr;qLTCo zdE`FKMURzFf&VNdqGjCzr6h?C>U#D7Mo*HjBGE^25&2j))n{eWcm$uM@4pWwJp6Yq z*7Emb4=^9Qe{b)uL-y}4!2bVB_ZfWuUHJN^5D!p;_WylY{-4D@9gT<-9!A8_vB(4P zb?m$Gp#S{)r~>a-%Li)ZxD%z+hk6d=KDX1Yg; zmxcezI+yAPi6n|0kg?@yEW%GjpDV5z{VOwIbSd~LNbAOtOVNMMTFFF`=L?@SFsdd1{a4tq=w zX7aRy9)3RBusPZ$yP~R9d8_;hQUg#ISjkG{y$<=5xir|6w^87f!8|7JeAb&EE~U*k zy?Oi$G~PE9s~0eQmEl5$ix@6uxP;+ShRYZ( zXSjmlN`|W#u4ece!`B(U!SGFnYZ$)8@NI@`8NS1C9mDkuH!ysc;d=}>GTg-QeTE+} z+|2Mph95E9!ti5;pD^6Ya2vzz3_oS~8N(e6cQX8(;Vy<>Fx<^>55q4R?q#@-;a3dz zGyIz20fq+|e#7t(!@~@}Wq5?)QHIAD9%uL+!|xfMVE6;WlMH`kc#7d^hG!U_Wq6L^ zd4?AlUSxQQ;bn$b7+z)g6T@o^uQR;C@Fv5b8UDiX7QJckhJP@;&G1i#ci8_o zM)v=o```9YhYp|eH}gL#A^>i{P9H~myJ1JKO~C*AD?ETVgA;H9tN;UUkLx>s0Q>JN zumOzmce1byz8!*Tn-mg7CA-? zEK^u&h~K0QpB-gz@nEbqLcvT;-DS}6u=+FgL{$wWfNd*-mWQRVEn?;VD1(=`OfTR` zku6~UPsYdPI=!t7cAhZ~2!YJdfUIpVgP^y0@N`%aRdri=r@E7q2~!K6Ua0AWbuOrS z;o50Wo=^_R6S#6$tIMwq^S&+p0V1%H>T_nO=VE@Obs+~WwU82 zgP&(=rt($|hxN!Go%x+Cs(TF#UBSR%p<|GCa<5 z{IP|gJ_$uw**yBo@I1!@jX_VQ?AAm8w}XQhl;MV!Bb97X1o$C`qb;^&8P4c6_6UM? zYceZRPo?1)lxeM?DXK1PUWSKy+&)7Ol|m0hTuH!)wWJKEb<&pCdwtY(y1xtuw!A%| z5n>qT1a;xt>o3Ed9gxHx=x_ieFk;h_p3n~Jm1Q`#cebx@1wMrC6$=t|n~TeEc_-}C zIAW4g+RgLQIr!Um1+}z(XKQ6@EIg%rsJ9#s{Rx+(NtVP|%5zBK?00 z*#E%lnU9_Sj)#AL4zm4Uk7&PNxr?#S-`mdX-bRQ5+6>XZquzno6X;A>|E~A$a93j& z@Mpb0`%!}&>F8O!_cEP^nAEH&l=awOAd$>P z&y=<;ybOcLWsTU}Od@)Q>I|*55ipdD?yIkqOhgBi&4vu;@Z(2!GX-L!_vqfrtOSa= zwBT%}Wu%Q_OqsC;GtqUb7xa!vdvNsR&^^N9Pq4)1O*nHq|YC{vPHqeef=h6^!>VkawnJYb5 zkjOL>-A|bvN8&J|P(%^Bkc}Rrep1};uzDmk9kTKpJzjMRvp_VVIwb?1quuKFRuRxJ z04Aed>i15i#Y9X&E73Kq|BpESbI9=hL;q6b0Hz#(bHV?46#H~uwF!7k(gAs^u7P8G2~BaYKnX%$MevQOj^WG+>sOnU|76ObNc?Ud}8sRsMR zR4WsSs_v+OegYj|wXLids=loP3JMf>T`y)mRoh+x3B@$7j6$lqtpXN`Ia%75Of5(# zfm$-|sM?kaI4B@im$Rv_cL{_;8FHt*-(?3MPVp2qXqY2$*W9w*p=Y`dcSO83B|~O9ku{ z+^`Z#Pa4`xO9kWg#FYp=`^Kc1>2RwhFJ zO@BZjwb~tk2SL>}SHK{J|5Tld(Na~lRw98*!oHr-jF_brP)KuaZVF@eTFk0Q>4DLT zmVIgvN0J0KAgcBjR=_QV;#q$RS&9w!r=dg zUzrk_|vVuR}}w)-gzXEL-S9)<5BP9s7aNJyIieUJu`knv*yZ#@e3^&CE~g&)S@yw%%c&E7KG0=xX?$I9A&&VY zY+etXCX_UPyuM=~^p5+q)hj|F>@&pZ;g8k#U^tn<7m=Oz_ozP!qssD?{+jxeXt>Ej zgYb8+?*U~-@ki^=p>k0-5&Q}0aZ-7K21Z}zYO%XMj+Ee&NIOc^JJmm?baI_|x@$Q~ z+CG!2j^NHkIZub~3+ONSVO5n67@vkeuHUQ~H} ztsZ(CDxkcm^0f(V{TAaNVU1$e=%2-SuPcrEG# zYeHzKfYGAL@uRDOy`cgUiz?3!>WROx0`7{sfIZPQRzO)%6|jBk8L+tmstV6W7*9yi z)D(>73J5ByY9LV6T>&u#vpdKicy|U010thz0b4=nvs)@)rCkC& z_6gWBBm~nPNUj6OQWVf7`gI2ql*$O|xVl191?2D^c~jH5!2wOxX|6034@=zcbPkI% zeMile1-dGfg1DmsVz|*D$#o|@ed>B06|lpD^#L8Ss{)QVXggAwqw}Q)O|{To0ae^+ znIvIn;_a+}E{>;RG)3vxQ|EV7z!*0@NM~RNp+%CaZ>xYaZnQvJDd2ZewJjCU#_?n7 z=Hc^Gb#0Y4`%LL*RJ9-Y|LTXW|92(qSb0x?=PoKg) zumQtI7(U9dA;U%t8#Byhn8z@mp@E^1p^2fHp@pH9p^c%Pp@X55p^KrLp@*TDp^sq! z!$O8d4E+p?8I~|?!mugBW(=D%Y{9T4!%~K249gi-Fsx+QieVMQ)(qP)Y|F46!^apt z&agehCm42M*pVU5Fu;&t7-UE?3^5Edj4-4aRx^w;j4_Neq!}^{6AWt@vJ5$fJi{cz zT84EDQw-A#J2C9cunWVk47)KD7Bc97feo!Zv&qi*nE1b?nE@NwqIXgcv zHX1pL^)agytIKrccXh&8+C{#|N}VMvOl}dGiq0yh{~P&5xEuNWbmS{_7o1F|)tA@S5iGIDXSZ{op6 zZe^8Lw?V0sO*8ieyCY7ag+t_*!H1PijweQjBX`u5X7b6%4}*^ovM9y9J{No}k}?&! zGuZWPW+)fAFxW(HWHL`Xt3-Yu>^zIL)D>(aEx!)>gW{ zp#tAIRtr>bTcYMy;5l#Oa%<7iSb^JI-g>|SwWtEG`3@{E6mKlu^TP657=X{rY$Cs; z0w;R%{RH9Km>kz8*v1Nc>hfv>L~m4&v#|nix~{MmKaCYQ(sczKcj}Cm3Y_S2=`bJ- z9ICFl0uQ?UsRx2TbyEfIbNP#6DP#RAO%?dgb&b7jYN^0yZY~vA95q+qE!US43n$f! zrV8BT;2qE}k;D1{k58J}8Y=LUs})^3uPvL6m85mERz-7VP+Uc6v;j761O&$OX}7#3ANHlQ7^4HZPM=yKygZm1w`MU_vQ-=?9m zy(u3W)2o1n%EwLlm|1eO|8H+cWdHjJGJ6id6L_3^E0Z zi*uKEkMm7f0-tei_TKP4v4wX1^4J3PXL1rgl2{)%J6;$| zPo!eK?1&jJEElbzq^I7TMAldsZFb|))3%@p+f=UJU_<4?aOP)bJ1ITwr)E0|8@vfK z&UC%42E=?ag-}0st#5J~Taf#cfwO3uo=notyllMNE?{z+Oj8zVte%BoZ~K64i}Djn zbKvHIlPHfZJ|*mYNS4b_utQBe4p8ASe?@;NpC(yW#ZVT##kx&Hx*mt+65RA3v+Ivr zkc@23g;!wL-)+o54hoQM4Qp69<)gP+PeQeh%-7MM$X7!217lY7N9spk26947`t|5X z$6sCiW{nq;u|_2}mR`0r*2>;8dQ+CiTG$_lKQhD1mL_A(>aD`x%agGt_PilgVJg<9 zTA4`UZEUyxS{dt5&Ct6G*>3q-r^fuNc^*$Ay;*^u0&zzCi+FCfibp}xp$W>rtgZ^S z1M%eii}@|K&dN=X4}j_JU&7DKs=>4hqwuAC2Q)Kzhw<~HVNm?Ap3Lm5W+-ox=l^NP zf6BiD{J+!u!(rPWgkHaq_h-!hHwp_N?E=yX58z+iKf3p0WH=Y||4vvZG&*lNzjbbP zu6E9LKIcparvL5=+!omEW43I}ax9)-f&ZeT#igu}x%fm%7SFA~h0(&r8O6+MtiXYR z$%teHr(X@U^D7`7VREI4o$`7vZmWQG1bYb;OGit=XdN9D(2o$6N3}3JAAY5|7xQOs6$On z?hrx*q|C+@FoYTq?}mtRgJ zr2RCt`qo+j!3WBg6u?3umC%Y>TLqLJ{06czWHD>0fXaiZUDgKdZJiYmc*J$3OT6CP z2F?yNHFC-cpLx(B*H!^hM_f5UK9RaBgPbF-ENTN+ZmEEXBkJmJwxP0*m_r2t)N<=J zRQ8tT!TXqX!YhaRzQEnt6bNw?g|L6u=diZouC|@l!GC7WAiJZyW(vR z6}MIjTIYqPI1$jUS}VH+D{Tdf=KoITU0!le!>uZsw*L#8|4^^4TA{(#>hx2|OXq3hZGU3w(y_4CbcNc35@;upBdFGw0 z2!!f#*jzTA_3j8%=Hls89)d((3CDf1l*z7XU z46w}|Ie9tgZVf!c`) zyc-Ylj2^xO2xZ=HSx1vq(BCk0k=B_GuM)2}jEkOuBlpeafs$d!gB_yd*wb4@r+bGy$aK*5u!FQl!x~rfZVVt+F zlS*TuYKgQ~!8^jdYKfTbCi|+O9f8n8iUS@mvLVZDbMbVH^KU^F1f-A6Dn&#V)tQA= zP>{BtRV+Z7ZmEKXgo%+ZiZ>_F+vX}rNLY!hI#3i;^KDg-kE9-kVzI@oi3FKf1?i|w z>R}m0_HM6&WrUZ4n#+yArv=~Q&`@ehzB3D|AR2AY)wq+P)Uf!C3K)aZ^m9tF?kYG( zP(Y~_Ta3COMLMbFS=K|KSa#$@7+Hk?@yPv0&D+* zccga;b_2fN`zhA_uljS5A1v+f>K}pm|6)W9{2X!quhb0z9~96NFzYW^yi#c|%?oR> z{t`->H_GN+E@5JTm$IcuTk}>2qy(kN8@C&$!8~IZz=Y+=tzo!rOn{!uUdjc+YU+*g z%t1wUzI<MWR@I=HAZcE(ggx>&e8VEW&5)Y8tcn3*IKIK9FR+U6swH-Wpc>W|u+hUY2K5 z62R4MN`|)u+Y+dXp0?Z!iT<>#$=*8FYOP{nMfTR3hb@R4AZvJ=g~~9#dz**KK-};) zH9v~9cY4F-C8DB%xVI=EMAQjyA$|WJ#Q**~2P<~0?#Zwh!`=-0Fzm~)AH)6(pJezH z!vPEjG91KkFvB4XpJq6e;V_278IE8$lHoH9M=>1D@L7gq7>;H59K&%8$1|M3a3VvI zp~O&Ts4!F+Y78?BCo!DNa0+JL~_*|ND~v zYwQ3Lo=a3*Vsc2u{4{u2<*l2=qIs9jZX2%*wjmkg7~s$dh!7RI4D zj}ZSZozO({jw(onfqK48b%ow4$c0#-&=vT6z8Op(#-Gzy1=A2ZeVtHlBx4dLFRX%h zD4!2ErSCV;+M+6Gh&$M=8M#1%EmhDGq1Dr6;mi&+(pm*C5o-`t7dWxC3TC2JIT)W# z>rKa6s?15GGcge&}jG{PIXWFWLVj)D;bSgP!%w{u_ji9oF#QLyAJ7-z7r5uYW99pI&ZZx<^}pu{uu@G?k$C6u4v*08w9ZrY z#n>Cqd7ABKQd$P1sO{I?53>>-tQGsWyX&zTELf#?fOpsDC55b}?QyZ7bzWdgr&UTe z4rGLKo)2`7)Z>(SJys`0%O|Ib%5AM~B!`A5P8?y)=Oi)r?)e-w4!6>Sn5lW(` z3epZtr}F*-ZU-gPTLpawx>QJp-49BrqnZ>7nG_O!CYy}kS{)QhgV-HJxMINZP$#!m zLF$1?|K?{Zx-ZMFofg4&}`N@S3JLz{vdtDyH_ zvgVVJf{R0Y2WDi2p+k8)kJs0xOU)a@*Nnic8zbV?JudaI!PNWIe%WW`%uhvxrH zK;FTBH#-kGFFNnKbKM0PWJa+A_+f6%Js)|%ZvhwRDfdlpJ+A}10Bz^3flcsGWC*zg zxd0#Vo&ghhp5KRE14m#L{4{m}KNtA`Z})%mUm6|$l~BM1qu)?|*}Y%R?$yB8;@!&@ zlA$!Ip0wTV*kJ4nrVLCZyf72V*cqmbtilxD7dw;9CUh8+&jfZziO+;U3yA-KoLhbS{;weTHXob(aOkPu}fuuotSIEY+j_1i-pmZ)d<=|1e z(wwLCRqrZuNue})ml`3Z@OoD>Q-zwMuv_n9o)E>~MoslDXXDUNo~-*KcZvT4X1t&X zer^BzY}~?M6X>&llWK;xAQ#p&k*xD(ea>WR(7%yyYHFACRzARJmI6A5I@6j*4LDr4!?ojnG}Fuh_A)t6n=FY7IHC}OH|Z}Ob)R} z_<4yE=*cme=~VoUbV#GINBJR(0;nt_$;4>vaW-knGWmM_jvuKkL=8N-OO0*M_iN&YJ!g}MoAYLg zMkbwzvQX#%X3wYjzu8I9{C|`Gd2snx`Ay*c-i>(Q6TP*_`~P8l`8T?!Am`UAcRkGe z-$S(DUO2)0>!^Yxg7vRG+>%>g4Ke*ya75z4`krGU@f2!cC;G0+wi z**BG6T?sC(f=B{Gfh`zv!7I@vRZvQjK~bodSQKLsMLz?!;Z?Hz)&1*kiDmO6nMr6k zS^?>=f@>1Gd6vXZ0)Z4in^eI(F=~>SwFJ#y(gm@SHpHAIRZvkvoefhURA>9Dd)xCf zH_TiKYj24KRghJTK441`(ZDnY@`{=4Z81D5CDmWuqwcPQv<4;FR|TOZ)E-OPSM9BW z-(seHaaESGF4|iK&m|Yu#ZAB#~ z6fR+e(@w?K^2{gxOb^7StUq%ju}SOC$#iTTkLGk=anO|WF`3R<6kyF9dxfU}^*1q+ zVsG-CLuDAFbFp`?!;2OgbjD50XccIamT?FPqB>E=BBlQvkwIb~yH=>gO== zC}K~WCTUR^d(Qklis?W0g84OsYkXUR;`G5h~d__O|K%7--~wGTkL|QS2pi0#ZI;GnUwUMgsBix!7x#grF(Lo;4*Pj?p>q znu|=N24nv;0&t<>X~$kQjS?d=_M-LoWMU%rI#2oZ!${I$>=~ZT#}O$(G*S#$*kJs< zU?JxCv1G&v79xrYlJBwtgwu%;NQMMtfB?(*ZPo|ua-kUe@33ZMSI|%izWG17b8=G$ z+G@i6!3X|7qsaVw{vSJ5e#USI!<`I2XSj>u7YuhZ+{5rohI<+AWB3)r{S3cmc!1$S zhTkwe#PBe~Zy6q8c$DEWhQ}Fx$MAcGCm8;~@Fc?@8J=Qzn&BCSXBnPjc%I<}h8G!L zVtAS16^2(C{>1Pa!|M!hFucj|XNJEpyv6WWhQBfVo#7u0Z!`Rp;T?u|8Qv4%I}9#^ z$KW$W7@`a@hB*u$V)!t_dJO9`Y{2jlhL19A$gmN^#td^A<}u7?Xkch$Xkut)Xkln& zXk%z+=wRq%=wj$*=waw(=wn#Gu#jO9`~R^2-yfj=pMm*$59I${4u-GqJq^CkW!Uj+ zowp6v{SLVQKZ7mcB-jAsZnyI;a{k@!Tm;o&-7MctcWncqo?uf}Vr`HkPZ(t3(^Gm; zZw)Ljs3(@lKo**2K5b=@=&6D01)Gp1G>q*W$ljxED4jJBy+9VXWYWoDEYj7LnrfhV z!Iol{p{k~<27(tXcXTS-QhAh(YcES@4Jq}C*6UK1WUPX`w2>7a1>?x0V zSD)EiMYx81DwJXo36Q|LMo0@hr}_<8P(|nlmK@Xu3yJ*!2M4l~wmYt~ick*u6R=oF zpreXt4lF>!?WlWfuO6-YDm!C4_2yR*$pDYQSNF8AiVzNC z02eDF2x|JelIy4*GTY*Om8xg^{~nJ2JAD6VBKyyf-{rjvZT>dzQsn;I9eaN+@S^T> z?l0VLVo#uhVE=D--f-?l%+HLo$1GodxTvoNM=KV1GTKh>*TJv1>PBY`E?4}$nRr2ss(B3&XJ`TCt(P+K5gCnC87uMjE#WR+YBG5*f{sk3H$t|k&h#ze>xxj9|?KQY;@zLP5A+MDj8FkE3M-84^ zyvI~62hE9i(qy!2tHFUwTv}5fU#s7!)*3k17zC_ZvrA`N4czPCsn{q^-9UQ{ENs~? zdEtP)yapDwY?%qs7|+eQpkISu8n)<3|8iHYS&VD-hC0D$A+ug+_9iGR}WFL zjd9uri1G)(Ag%h)Sp(NP*bX+3%$RIQi)vt5`|bu1bfH>WSldv%bC%$6 zd=gFwT-289t$}hKoIS;;k1dl-TA=P4$k+I2tj5InXA#Xw|L=m?AOF4Qwqf_r93uNE z{`VU94);m-ZLh^!<>kDCypu2<{0RKtzhmE@mHt|=f6w$U2mAL9|B?E&eRvS~-|#mt zu84IhBBTVZb~m;RX9fon#I6vz`!N{cJ<3O3lf+oNZURx1h`5`Kyedhcb|rH>BY)zB zw`h}`wvktOr3Subn%&jInZjT$x6EzkrCp$6d~l`PG;8@*ZsRNsbjd4)u3 z0ttu|ld^Gsg)-GS6Pwfjf4zdGW87loG`H0^pTQM-8q|%o(yBip39HXJHMTL^HGVW^{t{ zh2krz?i$#LMmK@7R@YEZ4J<^{Y53EGIX}>;O>1BxrgW!sv!@4D7u}==RwCR5@)p4t zQE5iuuK@8yIJt~4D2lTS!>w81%%VzoNez5O7_4V$S*SpE62B!i&=zNx#plSKGVLz6 zWzGFreOIzu)<9rfqx)cF>yn_VGn#8)GGck8esXIPZ>nu6)_<}JpP@Rbr3Mz`LVZ#o z3rlAWBu1l>nq&&<k(Rj2uqzy5grqxTsEk*k1$N(R@g=WLi)cUQ`415&A~3LE+iulnY9b^#68enBxC# z^Dp#|g9ra({)XPm-aXzo!2bD^H-eo%efJ4)04_xC@13weXp{3-MEzfnoFDt)ME=)N zgTKUlaAL%_GraWH;4rbq3CxRvYZ?etUQmOl#5@Jjh?Nvob-A|&CrPL+xHUQDh7xM8 z!9N0(Rz3jHmX+bMqXyqdsK1m_R-N8m182#6(&BWPfK`cf)WB2ZpO76zYlXknE~~nFRZV-AFJaPG=3Qq)=Z2&aaLd7)hZ^*c9o`8mLI2 z1_GSqjv9zap$6#1Q1{SX0|hDcqsqLwN@Ph593(TI;R{p?K4|-JoYOj6$#&JiMKZU{ z?A(AvM~#U{@}bZR7O3y6frw=8NURkD0zEa5k<8CWv8HuXOM4BRB=e?+uhCuuEy+~l z8wgy1^#4u=8+ShMyyJcp`~U8M{Qif*%6EbLJ@;O*0-!A5ac>vzSor$B56i%7u#|R# z8N3hlg)96!{Xfbv;D0qp?Vkcl!NW*kUx}oDt<=;}2>U=f?|+9CY@!?pqT~P^Hi8s1 z%o@3_0Bu8*53vTS%b~(?gl23c)D#wv+*FEvnu6AlOX3%eW8R4UmesWhC`D=&8mxh8qU=s6q|-Z*6}*XIO54Mke10l>D2ixD9ZXOYa4{yMkFgrb!j!HodWURQ$WkyM zZQzj^jXul@D@#gS3GKjy=Aw79dR|wD(|*oG-au7>SyUKGqqnmLuB+FoI?x=VFL4x} zRVnic$rA0>kbMdob+DuouJL4Er$b%dj8A{tTaF_!Pqd3ZoWO7*Ly@7xP-dtwR2gavGYls&oJ`;UVyEnY z`}36ZU9f-WVb`x6-JRV-+>^1_=XKZz>`~+bh`?{-lg0)Pv_nGV1s>T| z`5M;n?z#v3%rOW=5&g$CjsQpS{S} zL$WJK_8Z~CEFR-GLxt&VdN^`T@Gi$PnTg01LBVmFmm*&d6(SsGG;&d}Pe|`fDN`c% z1b-W0%o#z$w*`M2QrM6XmsS*!OM)#SC$#uA9}2dFVt$2w8~oW&u72c)gZ&harpT8< zg&ElLA~&$+p&lsqxSB*(-p9hCiCil3?XV~XE=Fz&iw-8&M$QcvLXC~ggbT-z6#CL| zqvDbNh}QqDPMr4tyb19?M}W1riN8MVe|Lc0f4sM|x3$-ZynlDYBd|Bdg-+-1*z@CB z=M?Pv6&GK4Zw+ozvl<5%9M5b793_h0RZFFw8hoZ^9ixPDWAU|mE!$Uv1J&5tlnf`h z)0UFn8r-S%m!rfjlUk^!2Ip%1<>>3wGQBl;TI(CiljB|sb=BZyHA_6zC(yghox#6a ze<_d@jGudp8VJ%Ey*37K47wRoTFH%y%+^Dy(G@i?rl;TcgwW1L>a6}6*we;3B#g!6 zc89Kqr3Y?HdrCWN2iWUQP!X^uDrAPV8@jUw+O%1iN&&bm)wOzRAWPe~Em|O+neBZ7 zN!l#8Wg~*?sha7ofgN2ZA|8km>8*hlZGI>E6mV16TMuRseM4iXAmDoa=R3s|K>Oc{9aznC7P>`f6Z0o9{_TnB=ocist`rcaGz3 zg`K|&*a5VRh@WfR+uVoUSKRl!jgbK;?R^^FzstOv5bN^_*u4v}Kj7|u(Lc{^#(aN= z|9f|i|HglLw*TKL$d-UCk~mG#Q;x}GYZJMloG_Q*08R>0(<0QIzBgsUd6+5S3FZi%}tVJ&MZ7*A%9P zGEq6tnnJKZqhFKDT-_#3J5lL4V$pSU?W^qmO;O2}a;=G0I0Yfbk5TO0Oq=|OPd9p_ zT=BESU|}*pw2iF#e&A$Tg<*xhI6nCYJi~(81QHWQ1gyz17UrWjSdHoxHlOl6`F!XU zJXtRMt|c!ofQT++Y)?k7m5X_jhn0n5nF`=EVOPy>S>2Nx0>g@7-`h>{xzV}QX+H1U zoa|3@8rvh|Nq{Yk+!gAI*IAw6dg>=_@Du%xv<-*`#i^m*UN5gmFB)#GAhson$t`I4 z^-ChVGXm4jkyi=5l5nKO&XZ47S20B`_C;w`qH=OwBkm`5HV0_s;>1Al@22m6LoeYV z$~TV;pA^&g6Yoji$5%cKHqa^lH(}v>?tkY;`$4b%S3Ch8J1JltiE(oy&R_X$R0Y^? z8Y)OO@7%)%KdT(2SO7sY8FzkBcak76ICqD&>PKzJkAs^}XT{ zsK4+>A>#-V#U}DO=f|7~mh07S?17e?pV$|HQ=9it!KW|$_n_@KXYl|a8_6P>3_1J3 zMa?^B+tmC^f14M9R`3A$02jIy>=U{U-hzI2W2_0Dg#F-p=gZDIIskt+tOv^&;shm3liZmCdbm6=iu%h{S zO`6iVGoBV*uC6q1#x=JAtLVy$~IIF7ku?#JeB4g8t%1{rSiMumYCA3?c}QKn{R& zu>Z%mumi|l{%`$f{-^5$R!>2$LT=MFlh}=YAscQ`k|$p%Xl~f}C=vZUQ=~*Ol4eJb zG=Ed%Q*@klNUEp5DH1Cm-GQeZU5IawY(&wtKACry--Cm~knCjyoQ>!~YVUOM&v_^UlqI$y4YH_Alfg7=x-9v;8mdQ^(&lbon#pPrNSvsajf${QlYe6GA#M?Vqe= zY2@@z;a`-7Yq=lqY4Y-B0Qcp~3L&vZ@Q>FQ5F@I8lDQy^ndV$N=;t7{On6Pe%suDR+D1|69*_4Z8*0?p))1!8v@^{eS1pfQE;GHb=9d zHrBMyfP4o#3uThPR7x9Pldn~cTFo=y++ohMGEu0ic{3o|p*_w>p-Sh^fLn(FT4ttD z#q(xBr(i)Z5vjSs-kHId^n8shH$BBnrFa%Lsu>0 zrK)O~0oe`AGE`{-rmAb40l7_HiD&`()>~)5VFS^gx}a$a>a3O-u-Ldo%?(v`%`@P! zaYq!jQ&lz0fX0St4Q&dGpepa20ecN5J~)t(ADiqN#QCwJA3A3?H3C9s3<-41fV2h^ zm1u!3TUQUZnyM#KYN&pr8F19*wYlk(o;o{b5G+DgFT`DA4AsdxRHxf#5GI0Ghm;{m zfPfIN6}HbHNW@fAz$_R>I!vl#1_2^yU7kIdT01aJ6jRlD_Y5LKV2!l4)KOdXD3Okt zUeSalB6i(T^<6VP!YpUi%l&$kME4A0K!O(m(^rh`N~C=TaUi%2s}TwvR@Kcj2m>Ld zkVipVDQTQR42aRRhxMD)IMZ%dB-g0MX#VeWa}Id_`-0zhs{18G`+pbqzx&+BvDe>Q zp6_jh=)dL213u~P?Hvx^-xs~FVOPL=ygy*~uXe-&41)<&^{+x6@DJ<+wD#cN6)!m`-)JTQwtmd1W){k1Hnw!I?3<*{4LY0G0bm_Js;zH9zi z8T+33W2@MW=8sjeo6H|u$G&g=*e3P^^T)Qan^|jupAAXuD4X6SHqtzVl?_!$c^V=I z@#I5g$;?pXQ2WnpN2(x950H?@0D# zp6R&+theZwWY1``FuC8AzXh+VrC(qc=DEKED;rY6BJue{@>k>bG>6>(xa^%Q2Xo3_ z%7lN}NGQh5@8{Kdu-1@({Y?X%oQ2ivFJUuBumxc!Wj3$Bn9U?X0q9xGANDul^?$G$ z))apceg7Zi|EACO-}R4)6{j+s#&9~r=NZmmIFsQlhA%Lj&2SFGxeQ-qIFI3chA%OE znc*u87chL4;X;Os7%pbGgyB+#%NQnbh6fpb!|)Kp!wkP=c!c3mhQ}BlXZRh% z?-`z8_yfa}41Z*Jis5O7XBeJkc#h$Dh8GxKWO#|;Wzzo_IFpY5oPR%7>z5-3*irsY zege6FKLQ)zW8SUs{GE>YzX@+Eui1UueGJyWOOO}vU}y~6!}_-&q5&Rte(YR~c;JK4 z5dCYMfrArj2>Be>rUsK*!)ly?S5sDqjCD#4X`F#OQ&z+$2UGft_8E9Fp$kz{@doj2VW)MXnOY^$R%`9+0S~g;+LgB3fH#5EP&)C)1Sp&bZtEANJk@OtPYCAHSgkIqbyliJJil8wk7P zndzR{W+!d;%o6fPcUL_xOCj@3;H-_%d~>>ej8k_g2+8?>VP^2F?H&u4)+-rDxy=VA>%IwsLX} zM>HIcXmku5Yl*O!59k(6Giy1Y$~a|ObtU~nrG`i4R#Nc#+^{OT8iZ6T^c zYn}m%ALq{k%)a?-uuV_TfV+>GK+K=fF>}y0qi&w*XB+Tvtu{?FeVhQCe!>HD^UT4j zGE~^`Iu0(-G;@%uEPC*;a?{L#>;ihNFq~-X%mKV*ltzx6^8PPy#^n9K3l;!o02{`x zJ_Rqp-@pR!W#j;Ro5}&Ui?_Y|tosnO03U-+Q1XAK@a{k0e9O5EdBBcECyvunglbkj ztvFR8hp)NcmLjyXVR@i*O&6h`#Uz>NNGcGLX_THhFCtW-lR_cXwN^_NEy)PGXP~nc z{)!bf2`1Pu3|!9)w6{W^uqs696J0aV;>uCfsv&`w!b?Dri%WnsI4DMz=@C(>L%C=w z^v+O=TbLXj1YHGb1)&j)y2SL(K#PmBV5Ca4mxVLX;jV6|A_r+GK&_Y*GiPFYkwy(l zsOb$W2eb!#^9*QLrZ`_Pxm4R{z_ePdYv%_CR<2yRTDNGQ0lmr+tyr~UMIZvH$`UPK zzG7t{0+-4bEnB&_7PZZsiuWeG)~dah1rji)Y>9Ox@TE+5xx(10y_YQy8i5&Q8Znfv zmbA>Ah$mcM2tE}fx;#Att`nXUrKK1eP%%)04^I0Gcush$jnInP+dcz^lPwC(RxL9i zHsN8GnA8(cL7QK^X9jF0JX9!GNhmX*=fgY*#jdH*Is-BjzC5TQz9oC_845sP(t=2o z|K=HRm+)~xi&YjGsd)xmB^K{v6}QeDsk)J6Ei$y$nIi&$c)16UvF!hMa!zv)*Yk&f zUppUno^!Wydk_II2R_hS-8!;>eiIqNe(S#E6uo9|7x)BkglF)%$Q1Ae?`Cj-pYjvX z1MJ}s`qS7uTmnDhAH0etfC_xI_{%6^&z&5dNb2aOVX;xyE2wU)a z<1XX5jWrRoCAqAz5V2O0uW2mI4Gtz(H5MMyzaqK!titgX$vtNm4kTBS#}STGV!$M| zTYI#0#j<6~lKal?WMgu##zIhxlDo|+EM$^-|3keX3fr z5i9tQ@z|}JT3SQ@^H#Z~ZS=3O#$c-{ea)eg;1?3SNJTdCbl^QxsA6XLuDN5@WP~JN zD{@R#1V8frVV+)A)IpEDm(37N93vf|$a~R@*$5cm$a{gub?KS`i6ViIyqChuSn-Oy zztNHswz6U>d4CUuv%*mM@o<2VAXa`t*8d*y|NW`|73}>_M`Vu!{rSG0xsB0GC2d8h zJh4R+;gCvOV?KK=#UAw~RT89-G3DtZRGhjywy=b)MJhQ}BirM)qX;D@Hj06u;aVNR zwd{>_OEDdk%ff2LkSeCI3b8k-ACW67;l2Hw~#GSP2-qZ4orLwX_IkLZ9qb@oGvE57Eo> zPz8qG}CWGm`d%2Ah^5*$_&Y9}fzz z|E|ja*Yyzj_cb`vkGO{+?yp4t|15lfZ-f8OBgg^1h1ZVQ|Epp9KNNhRqIVfi1~-Ed z{73izB@i$0HTZ7i5%Kp-zvO=emj4_5`}~Lfr_lZXh=0`b8t;n@W0S)fXmsHhq2uZs z$wu+2cpulLpllFU(9tob>)~lBMy2zqGcSw{PfrYt#~us+oXm{Jbg&)r_GWWKAP6JI zPCj;~8BU-8@NWs)!LX6T=VvquJT!& zCdET7_NJh#!e~aidTY=Q1?=i_FI&FptngXeP7}S_y50c0!7fCUg)w z30;J4LJy&rFrTo1u#m8bu$Zufu#~V9VQ0cFgx3&uCG1Anov;UC8DTkL1z{y&Pr_b= zy$SmeRuNVc_9g5`*q?9!;XuMcgo6ovgnq&RAw$R#1_?uiHG~}D5W-r*Fkyr+N*E*m z2m1eC`?uocevyBYKjE+PyZpHKn0LQ-Eu#JvaSB+6wSNouFJJ)PfDGXmxJM#Czyh2C zeg*!|=MWF<&06!%m#MP|?WWmMVRte;7SV#Y6`|$C#=;u;Xgu{seRO1EY%M}?7+G%-dQWKBWM?gYFOn-w?56mj zn<`z!{gt9msz6VSI1|}S|CAMDrwFdZJ!o2n&m#G=&3wh3RZBg50EksD_zN6_*7+l$<&wuZ@|dwj$U~`j=O-;4Iiy z1h+{`;6$Ar4BE67L2c6at|X?jrsA$j2d?ft;GMM(3jx&$DdlFNMo;+X*|1u z!(^W3F}Sr_N6XeC2u!-;b@o8pieN5<@6BXBNc!1TTo62cR5?b^=Cc0J$1xuN`xMUe zw}1isXE*M4!yjn8(;%Fx>Ei@;&JIqm|FanJP+;<1^Q{xlvJgSW%eXxeQ#Ex@`#bri?lXJIw z1+l*T_9XY>n>!7YVm{Xow$JncP78g>i*?J02#N~HrJ2bl>!b`vTk<7NUP9(dqfEB_ z>d{VqNKa;@?_4JN-noXO-ty%8=DHp~4axWG-yqVRes_}}AWbJa7_(#~KgbhHgH&$t z9dowRFK6<@p;S$m&`0I1<>Xut-k*e2!nCmb-C--ERls2cp@-CzmiS1@SOTdM%*@eD z>Cu(6$Ww%BHX+Li244+l1jbl3fbgfQd2rt8at_neO}Cue$fR zk9jTLa&HXLJ}z_)^GzXcY2Jb!B@9(2IqT;<(sy%QYy-y_Zr(NC8Dads*p!5c7kh0#I2~?EGRCG%F4CJkR+9=1JA@EmjR1AsE z?YPRrp|2ONp>pl&$X5=+t@-ytyq6oMoYfg!<>-DU#8*Lou`|UI1)X-Xogw%#QqZmq z1#0-vK;T6m$sxuxJR{(-RyYYYzl6tjkFX{b4a%FXfS?clXE5}Yp$wle@s^XP@K8vv z-~%r=2Ilj|DW%dV?CIQt8OMDu;(=A7eCX*))Y0l1e&jRqNzAWLBCe!=CAo;u{7$b- ze8PJ~o`=UcYoY?zifok?r*FznLV6da`l(P%0lBx_xOca|o3nl7=Z>{;)leP`Q&6If zB(N67boAok478*08O{#Em3vfT3df&Q&D-$*O_7e|5C2Bqw8>O8hBr`NGOrt5?#MgV zkKu;CwORKbH2LGAm^-=WpJN{ygaVvi=GFJ7F>Soqv;a!>sA}j~2ude9dK3H6-Q$_3p+xaoaEO zc@WB|p5M$AwoSQ#*vq)zE%{-b$YrL~mr_j&zP5ty=g|CassV$L;X(oRrXhHciW#Bl zD^CIc>nQvsm+v_Ot!X`O{83!AnOh3hntVhGO|lL6FE`TJ|=M@ z+Ft_N2-@tbwPyH%3)oFV0XGrf65^NWZ>#&lhc`Ef?~o3Or!sRT;HMhvU~}~ZOknAS zUEE!Z=9>5%lw%Zq?wcUEp3@%)Ci=%RQ|^Z#(eAtQu^q+Fh4lcNw!U#pqSjr;L5(vC zLvh)WN&{d^$M?lR+^u77i|1ky$;Vguzmxe(a}sC&zyEt{cf7(sAI)Rorazh{S)wP-)*{G* zIK&3|ZcUTUBB+D7f9o73r#2(*E`mIW*|o$xrkM(zMX(2>?d5nEia{fcifuFCq9S;N z#_l-#OKEypR0OHeR1<#%OeH8+_?}9R&_Fe@v^W%6S!H8|-Hv(j)aN&-*_yDC5-i z&Hae}Z;?}w_y2qT7s1{+7dE_{zua%~UQ$^Az6d|xvvBf11U^8m?u+g(;RpPA>GkOCTZj38A6 z9}sUbMi&^ALK%pFlm)ggBWo>!{>Kh!tTKXB5d=Us3XEZ)Ojv;GVu95wlnD)x(`3w1 zM%GdU50En+aVTsqo~CA8djXm1%|#FZ@k6jU(7L9JVE^H3CdIRc)=~rk5SK7MLZ+`& z5$rz<%QTYr&&b+~;Q!%=5SjKPGNR@pD1dqhm{(KWQUv)=-3TnY`Ak5@?kIx!r(PJ8 z2X@=A70G|ferx4mYbzeBA5mi;HZ9tV$LL2y`cvB*BWfvv_J<+#fsuu%B0*NJ=HeUF zh;_NC-dsG&6eAVIMpN8T1nWwmtRv(J z1;PYjlCYkzfv}MV29 z?;>1CcsF5&P$ZNHWkQ8eCDaIY!Y0Cd2p179CcKyMKEnG6mk>Tc_#oj!gbx!gC0s`M z2;p+VM+qMze4OwJ!Y2uzB7B{6e$; zai*K|Usnkh3+z43;SxtN74*P-y3!>WE)=^;XfN2Fj3Lo-D1_}IB19llBkV1KaVXq* zMVLX$Fubd&k}CD;Rg9gF=faIZx&-E-)%OS%&YfrV%ZRT$h*2r8l_jN~&+m%v4|gepvM*b-z!TUdaC z&j>q8;3MjVj*~xONz)~e60N3kUR-aQrb?hCS~DcHDI-glz)Q3ms<6sNm@1K)XnwZ- z$wDv(9i<%`$Aegire(SWI-=FB3d|e|K|!>HLKd{1Bk&F_p;BRlEx|XmgndJO;n68o z0?W|4O#~bWc5$f^XoZ$+MSm{v{YaI-DYRsx8$*w_wh{=1YA?%&E0m;4U=v!cpv?$= zt8@uEb8DERW3VKcdq|ZMk%r&}2D_Qg5-5dwH_n4tWH&DB|1Qoa9Wei&MD*`%-A-@- z4|XTqM&d)80lYq7U~2-yE; z`W649&JPhs4lfzC8O;nzJs^5Jqar%lbjdVYCAOvD-n<`I|{9tDD%DTsM)0AO^f6R zCZ~RH8!C%t2^DwVGekVyt5EX2E$snK_w|G0mz;=}74SYM$Lv8WZgKM1NRb@plOxe0 zy#L8bdm?a<9-WZ8Nxq(1Ypp+2inTmm&WYqvRKo>=e139#BKg|Lkkm4hJUm*K&yVGk z>mmaXZfEka$N=PrKq#o;WS&|xeH~S-t~3?tH8%!QVe(M>7Z%1N{3Vm?BmKh00)Fzq zn&cZIbx{m`L-OcIr=w%TgN5WV4P{VxBsWC*#B;7}O3Bx04k_OWJRr$YO&?^**xKZH zOmxyQ{Yy*gy9oGRTMUT{ztB zcNf80__%X7I0Nr>&T!U8U+c~i^b+{!n6ErWDY^5^_o}00R1*9I;v`XhS= z6VTnr(>WOeVJfE>nMRl z6j>+j%|b^B{2@!qkZ$2M!5*@%DJm!HyA9@$^})w>A^6~@N}vr{GEqpFPCH7V3|W`N z(rkshPM1Ixid+(h&af%?LRM2ueIfL0>nMRV6qV-J1+4aT3EZJb#|T7ZI!>2BAhLuT z<;60>R0-4}>t=A(U_`0X@@pu62b$z5b$0)N?;9HcY9Axc2>abNDqM+t2B8onBDfzdF7LU-GW^?(%-={n`5`VuAO-@2?Lr zLyuN5|1R~fh8OW4qu+x6hyIFuf)Oh)d3@wsZIn@dFKMk-;8B zR^s@jn(Mx97_sXH2fTgkzt<0V`v&U;xCpd{cmu&#A7x^1$a;H3iiXGfCcKQ*6Sj$7 zU$A(fmDoL3SZxN_%`&SEo@H;9)kdXPUT#%@ozFYK`WvgMx2N?t*y-NE_TQsJ-a+=? zxV`D=={vOLrc>UJj`Ao)JX$>$BzJ|BARRJGKZ$ImA#BKEswEkW{ zQ1Dg7f*pukmYCEqCIT=uwgFa|*xzOeK#rKq7Gf{R`rqZO0pkSc z|Ihd{$m6pXu|Kv1-Qrg7WAOZ+LjLb2_i5w;{4%uuCm~C~&hFOE6V6@Emz;`o0-CCS zy(MTFt>ZZE#8{Edr>3h!gP{2g$%=+&H28Y>?d!Z#|iWVd7F2PC&^OG4pZ_o;{&|89i z&>Fr}P8)JBWLVv;T z5{!%1aFpD(40V=yE87Qs#y_OEfT=8#{MC-}L7Ia{ZwVx3KVmQ&F#0ac$vi^5F zMAHV`idwb#xaIAM8ya8@Tyx)Jq-~T}WaM%hj zN6esy_yu^S|Nob?4)RYEr~ZqID-HkSq<>ja_juY8u-#sPQG%@ProU7EMK#^qn@G>0 z0SEdh(w*k6URn+)5$ME zsY|9KZF1x4L7vVb9&Y08(Kbdjo_Jei1f~s)SBZ1yl)yBbID1YByblxS=#2_TohwYs zu;y#60t-jhLXn7tNmy6#Wk~kwgS3`TA|NaR@~lmE&BfDEY)7PLn?&&ZOyW?IGWE3M zof0aKt|Fcc= ziw7Jhs3a0c&o#S24asnuIBK)~@0Gq=|J8CDR=!5~I^i0^HwfP(e2egH!gmPQ60Rd$ zPxvn32EvVmn+P`(zDKx)a4X?9!uJWc6MjJWA>j_forJpxKO)>s_%Y!g!o7t12=@~n zApC^zQ^L;(KPNm$_yyr1!Y>KGBK(^08^Ui14-6X7w!%%~9i%KBh2pKEvX)c0WX9+|c**%5T z?44hC33MDYV08eS=IO``r@I7NPP76J_jZJd61X|$0_;H)z^48D66iUyE0^n2EX#j{ zgx6UDQzz1eIt7|8x=JAH$jO1XpaPDKW%`3TT~GpHM?z~@a>OMYMeeBZ_|a1Wb0?g5 z)rp$WKo{3l0*6OmM!MIu>A;dUzXUQ5?nKF;CXkJf+>*`w>n(xVgPn4u4q~58=7VF( zf)e;W7;U7AB&b4$g-LVEEhUhB5YS6ilHW`7;hIY)DiVxv!LS`M)tgHs`RI@drnsjB zl8<#V2-C}&8eJvOee6S-PBUxd=@JM(*7jMYn>E6&5?DW0V=8|`lU}+6?vK?tCmB~w ztA5_mw?zQ1o+9-P2n+FJr2$U2l*>1Rz3T_tdXtN}_D`@|^k|9oeI z*#B=r^v^2d|L6UEu)mLk1ALeFRqsRI`QCBJ0l25v=KdAzzgxlns~`^0u)CYP1p!N;~J3RY$3eRzF{y!gSV%%40}78hw@ROq=&Z& zgF9|B6bsGRNYiCl+~rBa8!nm?d{e{te=TL0+=a@fg{DzU8P;}PE^$9hd3PC>cKt;Y zGBvbWQIc-Dtc~sHaF(#G3}d@kupx{#Yb(Rjt|d`2c54}CcA+SuO(gbFOL?1MhSx(*bLTn-E1N^I%W0PT!wL7 z$fD|otP8=cu3P9pC1GdrKmXqRIBEt4EtaAA6 zpuI*;mxw4;hDlEK8D{A*gGrTXk+VHCjBLj;EOIT()B76m7?kU3wb;vQeHwPM{R2eooHGM`n7TkKO43nIa zjU!(w(-WB?r^~R&sZK{k-53?Nmtl}oKNqaMjUt%iln4nsqN0v6jB)BdWn0yUO{PtA8Pqs@bR-Lo^({)57wTz3mT3fLgEw|K_v!M21|f!GI!u+ph*OhqT86UL za<5)n^?Ga?$@zb0apAiGdA%QYo^=y$i@TG%Ki2oxscgWPyH|nn|FGvG3&?VB*n=N1 za(}%Cc|yPC-R(W%yM9W={+vYQkPG2I@M-_+$ocg%9}c+xiGS2ZiSJ(!b}%-d4pNN% z5ZjeTAN~bnLToo0Xo7-5Yjw+L+^4gju ze+wBgwo5p+z;7d#4KL0Z6tUM(p{JTam@}ff&d2*n!&pOD+tf zLqjL4BGQJa9kCVKmtM7vMx=->v96_^-D8Wx(KdE)WsfH8{4Ks!_W-hqRw*5Z$uH z+l*6bP>#J=yv1DAl&TF}yp_+-RJM@aIG#`3$vzLw;@hHJB&Pc(5t`k5vsJG1U5fhH z({aA0v1ybfz0>YX>~C7UvGM0WI7!pWTMU1{z~2RbYtK@Y{oT|7H6@F`U*uFz8xP89 z_hmkg)1iYAs{K>m|DBwt9r*noie3HLu<>1i7(WlVfAO|OzR#V#ec}Iq6g+^+-bcNw z-B#}w?E0Vf?(zQMy@Z^9OZ6`hY?!cPWbGr%kme;?mF{AGNx;_u~KgpYM!-$>sSvOkYz*G}T7A^#n}*ffy+ zXns)g^qs>W0IMr}K_yUKypO-CEW1!;#Lo&U=(RAu7uCILU2fbG#P>Gi#-<`zu;V)H zuxcVpxmtVTds25Fl!od11Yxy`y zaKB)giZA4o85Uw{=Qmcwk`-TIZeBb14#eMOs#&{(`0i$2p=i+ewo6cCHVX0G7$^Wg zS9U`@YleVv8rR!#)3>!zj32;H0vz~Ma4I2C@>w{~j148D)9?$9m-&&DtiLRoMrO!0 zaFt#&7Ow=gO*+P%%m~6gP<#*b+pD!cuD^_G>0ghnU;K1)S7OeAWg?r2pT;*Dbte0f z_9A|&`33YLINoKR2>VnV?=;P*a)}=wxE2q`HGM%guzEH(=l}VyeMDZR6&0&(gmyxT zkS25xItg8bZbA>CmoT5OfUuCTh_INjgs_yb6Jck}+)WKOq0lwb;GC z2O5B5{87XJobPYpJ?Z_#`v&;_=Og!D4qQOj{fT>{`$hK>_Z;_FzZc zs-V*G8c|Cbgd?c7@G*;&?^p)QNS(<00>xXZ3}%r!8KE1A%Yq01rk~a_C`Eci5kaa9 zE|F;jvqBcZ3d2Sq5~)TFf|fEkL~2yH5@e>qyfWBBZ8BP`u&oTnkUBM@vdZ{tsyCNG z6jHMnDc-RRevrDiOrRHRDuWS3T`HC%)4|d*h(LXEJ)Dds)P(p}MdDGInoG){105ta zg9>sc4l@p$ik)T9f}m%DMg_JD(N7`wT&TTlFM|@KeyUlbbQx42b@FG7+-V6?VY*F~ zK?73L94^>K)>a1jM@b z+{c6h@OzX%Z*YvDxeQj1`YG@u1Z$|W60<+D7CUFo>v~wb#bT<3;T5;9&}UKR_@aiX?CMVBK!Z8 zgLp*usJMTUiW3h{Wuu9|1x-h*TEa$MZX=apY>q+UWPBlFZrJT&-;IU zphe^~hM>a{%mk{_VF4vPnwF^`DDTo|+OSySJ}J>V_2F4W;yePkpDBb;U~BiW-DB=+ zJy-QdX%ILM3R>kuVlIRp-9I;WW?m#1JOinMq^-~4ybRzm_)sDp9(|&aRQWkVJC-s3lm}&8paDU13 zO4trLEp;4?g8LimcT>|3Awz<=ziPZ5!>#CFU8ehy#vcPUCUQ`>$>+=c9Rj80?E4D1 zO!n{bC#^gP#*Bw!qHm-7>&Ct%xRCMwaev=9XE?=6{$+er#f<}}QWZYXeVXi`@ZN)Z zoco6x?{RVziz<$8I4VhW)hYMU*)`UVf-VX<0`1Aq`xmbNr^xz$w||ZQQ80i{_g{<1 zo_qLh-ap|3{6p_+U;$i!41nvA`DZ6@OK^dI;$H85!ad(T3O)mSyIo)dJO=IIcM$`m zgdM=E{cEehcB8)N<|t)8MCl4lH)@fP=SGK0G{V*jY&Yub+#qPGz;dHLqC(6v)tf3X z+^AAH$(quZ3T!s&<1BiU>G0!Nfx$+N$s9&ai`I&7E~_*%L6hbREH!FThy+t* zLkmnt1qK?WrKU+t0l|tZkt%~vp%%!TaM~n*W3aJlErUv-=0#p| zY>`Z(_A(e0YBdft5=PWq25CZ#U8$Q)ac7w%35hxe)20yUFr&c+rnwA~1ed{)@z8C# zxeRKADppDj(^+#Fga}ovOf05&UKvCPwF|;>Z3KTDrvR>Nk) zv}i7a?4Wwb(;n*kTg#v~sL8+~TTa!cetQ|L1~nPM>Dq`|${;kTi}REnmV?Bg%7@_m z5MEAD*`#3Yaw(@a$Zj1`hNSeyW>PK)01ZY#*Rz618M>jBjP6l%$>wmXm>I465 zxQJ+RVQp?)v|5Tm?*27gU~ReD{=3hI>xUMCbv~p*1?ctTIqI#rhI2p{QvD@Gg}#l` z^3ihtMg^Rdi60Xyo=+{M=;Wh;uVRCtQKB)bRV<^gh*mldeC!~q;G`oIA^3G{VWb3? zjU8AU6)S``$=&@yCOD^QGJwmgHB2UCx!!ZsaKx(WfY{Gn5v0gpp zxLA-uE7l$Mqe5lIx@7%d;Jnd+zy6Il{lD9PBlv#{y_doAzXK=#4|!+9=YPoC4Y9xe z?*1NLK;M9eU>W&=UI!lFYup`?0rVl*4nOI<8=bt`zjOs=T&(Y6HQG209rj>uF!(;D zD=_3ngm&PE3hcNMA)L+3mn~g^B{w2O%w8jGtI(FqYr?)B=pouFOVtOFk_{0FO}Uh8 zj7Vt8rDV{OG*@WK1%Cu?ZUN1$xdKxz)&&-?GNWp)z=#_Z?`evgD)ZHs8?~*Bj?EPq zZdn;Cc~H5z(qk2`Fnu&vK&%RC2U%8|D_~Z!*yfeARluvl3X3Z?Fj1N-;8d}JysxJF zwhBm8XfRSh6BSb3NLnkPPhst)1V?KlXs>`Wg|(Lgn777)O;kq(bSZmZB)RT_$?K?q zETyEjp~iGOuL7==T12ggB~2Ajq|~-gtT?7>dj;GmwfYC&RU=wh0X=H9?7il)>X=%o z3dmAw0|s}7;VESVFtVi;@TB^rhs@Y8)Ji%GgR0k$J&P5Dqyo|u9#lD7iLn|q|8Ocg zE8tBj-HQ4uH;Pjgkf+oLW~*h|E8FPXQ-=uovYWxpuWYT@nseDLOdVPOk96}6^7>7| zum4!&^*#f-y?5drzX%z?KI(o3+P<$L3dl|F?e5*!`Tr7MfycoFdJ+4CExhf$R`3EA zAv?$l#0NPTUy4z0(t8~&hR1uS!D@IOqJ`9uLHJVeh(7Oq1z(iwv7fjDdBc8=?81*g zzxY@0Wk2R`ji|yYzt>;t@9yvA@9z&Fp2#|XBiP8tV7KvR|7`yP#3p!;{{e86KkZ+M z2qWLd_v-t|JMe)25MmcR=0EMf@M@o*|D249)wdDOCY(cfJK_zK}F!qtSY623j_f zorJpxKO)>s_%Y!g!o7t12=@~nApC^zQ^L;(KPNmW@Bd=w9ggz}c>mo4KHobO|K~t= z5>dWp+>g80K@<2G-t{!tKWn_B@kU>Y%%DF)e$eNU14Q!vt%m*o6u*W{0AI!%`ETX{ z;SN*#Sm{ls@_++pVi4)!lZ&~tF*U~e6BkmuVoJE_RmuFI(MT?c_>1Wtp}fatjvX$V z>yoO1?Bw8&oLtDwoW8&~9Muxx_`G4WPzYIPSn zM!V9f6_TA1XFEC^3bi(qcz2|gmWV|@JDQk@Tt|GN5ymp1Stj~Ax^zQ6apvsWC_N+M zGbsM5Om3KXN95j=KpY0opQAW4l6WVN5$2-OO%ORVaY6L%lu%7s;=IV+Vbz4izE2nj zqid7hkuC!nnBm!pWKU!mIE!NiM{J=KcheXK{>CqkctZ(I2ry;C*};j#05`{`ET0=% zGm*%U{-AslC;aQVRhGY?2SHAm>jLp)F5_RzlUyWoJGc4%3v-BYB|Mz|-}Iwvr-Tp4 z-2U@??ySJLF`fGcLC|rJE4GOz{jyKcpdVBZw=p{+nui_35;(KWrMg`%Aqvede5)G7P8kIRiF(wyOOpFY$MocvKu=JbZZ6n5o|Om ziEK1sBf&P0g2+a5Q3ZCA{ftNtN(^!E-?gkPODeFO9E7dvl1lM{ohB)qx!U8(Ps z8B%WrL}>YuBQ+ycmR7)vHl1nRIi3O}=tacrhMHhYo0|Pdkt(XbwR6?%t$;FZF00g< zQ2s?bOIJXcmeZh&OiTr07BIu^s(>>Mo1qedUo{SDmhHH-qypA7et#v0b%Md&#cxBZ3fH^WlXmIw6_8>wW*@#x}lej3OLm`2=Qtd z%~&3ZNz6_4RKThRnOjNm4HTBrU z$dg}&b#O4B&H6X#^$p)QM8ZJs1L&XqoAm;gmBIKo>K-I2{POALF*ow}ikOK?qtb+{ z{Ms`9*j9SswTfYLD$F|c`CPJLdRhsXZiF_!9%4UX~ zC_3FtG@O2Hz?v7-)TF{#zux*t2S!z|@_EPNdaEK5ogqAyv~FOI+}^R+E68 zhR8-9+d^-3mNnbzq`Cgy?^*E{?7gZ@CG~%Ucnb5 zHt@Az2>t#)@fK~q#{VrdphIuS^EEpcMr@6F#2L*<0_4Uj<~7q%79~z^Y?D5O;A9|s zjUXaX>^^-yumocLkZ?w^`}HX;kgbnhuXo<2D2z%JySL%G66H5mGcT>aF1>4Gzl)9= z`_gRes##@&v1+tW)EmsiZqXljJq8pal2GjCS%q$_A}Z4cQ^+-u;X0~4cp=H{cZ7{!b<;T?;^zd z&3k*m_y5m`2Y3~t0iTXt!fwd;@kjXnzt1@d&755-N5!2X>@J36)11kH=paWp<{6YN zhkU=yW@S<3NNXdmD#MYrfYhneYp|g+)s|F_;6^O$(^ShK6H_kOKrgL;>nD51*%e^| z9zpCi(`9c33_#gug*7o=HPWyOh=2`MbjB!CrMm)3AZ+#QWe{YIhW+RK3V4CR*#-=j zIqLLOKoOK3n;Ht94{R0+<6!9p`^$6%WI@@*su}}h<5SqFnlW@#KpK?oTqv|+sC8CA z9E2j7(jdQ>Y1~x-fl#)51FfJ_+NpxUWUuba%;^9WvHFiA3h@Z{s+ z)?A~z0zzTXhpr+{IHp2J1w_K&4%8M0TbfV`9${394Nxcrl`tyB_Qy!)SHL9OYT9C6J_98kdt-0Ki z3J8aDRs=J}KAkM7fPnZ46;=PH$Hf&866N$U>(bHF=fVmYiZE`>u9rhnIn$f0{|nrm z9cb>S;QzDE-N&6l#=m!Ym$@JFy4>HmcY^WrO>epToMHkzh^PSn025%RaAyGjpHCqQ z*pGcl@A$v>A2-kA%BLi81GjaO;V3@_+Ldr-U=Yk?61(zS+aSSrWHg~2{Tf6Pj3KcL z7r+M5x0%>xK~lK)LdOYqL(E>$WQ`o?qK zx#2w))*!UPbODN5bWsT}g`^NzwFY79^Jcj0OKa2N8DT|T1P>|iZ9Ec5#X~0w-r4$Q z)(#Z*(NPQBUfocY$)urXMGeb}%9;w5yR2w-e8QdzXlnSLT5_oNkqa=; zaxJKUuLf0EP(ytiCC)v3&CIuINd?R`d?JHND)t?$#^y;d6&F{)Wy2>jsE9C`8^-c$ zRp1P3wd|>Y)Mk%Mbg@cDWqRtVfZt}48XXl--LN7B*HT$yP5bT&7;jh%m6Z8p zqcK5xDqz2v3$TJtIBU9?UjYve3zpSI0a;E5uwx3A)UFB`apnhLFOkq9=?bWE*ilgD zsn5ga0&Nx0@|D_dh?t<%bON+$OP!^jLyt(ee3TSx25^LAAd8Z32pybV2%jT^1R6xSupYJ+Y?avc0U&Q#l z$9oJ``8HVh4gll-6nOSu4!{1J{onrYUEnw0*}pdfdZEGcsvQ-?h8nvt+zE*N5)1ab zc!rmC7!UMdPAylo*Lfu>v>IgvqyQ1$cdr~S_Ck%9qIXkODovDcy?0Ky&S%Gly=u6X z!s3}7l^{>5uL~lAe4kk~ytjrI!D}*&ROenj-1$h6eDu9d;hkZVB15?_>`}2f)p1e; z#ZWNPcL=;j%uYqyU}f;QjBLvflh}P(5GSbyW5pa09%6- zyceQ>90fk$#om?Pjoy8T0Pr`z349%~1)K?6fSdyE@&EMiJw^ZZ+MG0o^Y$#Y#`yH{o6%X(aCY)5}+^a=$yfc*S0OyEpLh(0!>? z)$Wbl&FM0bK=V`M6Ye#9XoAv$dsAfGNSif{!((P_#Qg@(6hYPX*zr^H%}CeKE~~D; z&fTZ3pB;szvd_Jl&$2EY!j9ejUZe=20Q%hfB29a6o_oV7 zXB>Ir(eAt|xT+~BM%L@F5KL87xZExTPgNC;=ce}znuDck3RmdD9jYLxwn(2=k07V2 zdc&j3m+5*tR>4bclX}CWrfqW-lvFiLgsxb=EUT+FRY6DXP*ulw)qtZ={`7a89we&yD7$Wj%(r3SX+gCAFst z+9|fHwwP;_>7cm^_9-~TQUm8!Q`}bFN}V=T!zu8X0;+IZb<02k>lYSM)25}mh4PM( zHujzORFi5DSm+GTM02=I%kFAI9WtyM(NXqP;S`4ZuqrepZJ1w;h379h+%lxkFmyV> zO)aka(F3PukH`v~9}ADUi>qF=o+flP*6XdhO3fM^DplSvIQC@%J@A66GuMeZdO+)` zoTu(C=tq8k<#b{uNY?+&{NMljE@XB~5-T4f{F3l1!mkOxA^eu`FyVKE-xK~o_#@#F z!lQ&g5gsEvPI!XwXTp<&zYv}xJWY6p@GRju!e0r`6aGecf$$>XCBokcFBASj_@{z| zLvRTm!6(EBaYBNSBy2(0lCTwFYr-~!Z3){EwkPaB*pV=g&_rk^v=CYeZG?70ijXFB z5IPB6gl<9)p_ee9uz;|Tu!yjju!OLbuoGct!Y+i@5OyW(M%bOO2VoguIbj81C1Fp( zUWB~~`w&(URulFm>_^z2Z~);zdH>tpa~yE{K8);sKX;$MBL-(2$V&VW9dDLYQ1@+kg@R-ju_ZLp00ieUgOO_4fz zieX^d=y&1|b9<;O8P!}|yV-}uqLPdMS)V|8u}~Eke?sex0|D2U_+RV>mYp#EfIjW3 z2HJ9_^=t7TX{(7XQ&zS3U30X;nOW?1@w@FyS@zWULw2L6tu_7&ttC*Gf)+Wh&GNi& zL#vA4!%eYOibHYy-dUxvF~)yvkHa!+#_zL#DJ{^`bidYbsA1SvLYnI0Kd>JGTP`NL z`0Zp&adZ(WO^5M2Ub%v*9{=GhRnS(-_?_JUuao${_kiK^8Jy$KLN>p=zueyrEa2O{ zFM>C!}x1d6Ml_XgZVKcc2#mO>l+o~YR;*v(RuFpuis^G|C?{6fM z<8mDI1tU*Y!HmT%8aaq$!38_3pu}QBZDcswP7a3yPF2B!wVH})%yipX1@qNvI+Vo& z5IUu&t7N^Jo`+zQ40QM{Rj^*WWE(y>X79sORj^%gJynh%BG8ltx6x4r!4)S1B{QLS zf*a|og4T*jP}1z^`dof&RK7iCw5cjMt)}OOyX>ig%&LwJ7!7v4PzP#H*swJSt){iU zqfiDatC2NKLQi#9)w7&tqBdF6y0`ioau=dC#5NmNfvc&|8=_V0fcf23IGl>vB3dP! z@ExjfI&JE3NBc(4IQfK=PkGD9?haLWo1zFaW{R4sa5Gh>O*t#C)MwC^DqKvF^MEJl z<e4Kpq`dB9UUflm4h{~-t=0K>q^08((Zji{|2ufY4s?6RW4-@0 zbpOABuYWIm@bdnV{yU-f|0W`X{O`8y|GNwK=K6Ea02ecHk_De@Vgg(MXd zqEq=XKD8pzbc%lEEH(<-qQ5nNIZG%W?0FcA{B7qDK@|kMg1^nIF0+{-sAwhZtG^vL znO2wC5$u8s{*HW(Ex}OVWTB9Qp{yU->iq5bpxW|0QjZ{heAeHJ&$uNU$)cU)s(}ZB zKX2AGRS5B{zvZl(7|(6Y4ujq4H}k2sx-5X@qr9Iuo*ia&S{NCFJD%SZ&h=1cg|feh zyHhsf`&8vipCW;>(f4TEQ$@K!?`ghU^5-Gr*&*-QP<+VvkoQdZC&)71b7Acb{UhVv zUqkW6@e%L&tzvGICu?$IsjjKFNC_Q3S#5A4o0P;JwER%QonvBmzFVry+72aj%y?C< zH!F$VtoC}-l~`$&>FrWt8NV&6ZLk4Ltk8ErjcP(?8Wyc6^`(g|_2i<&=xnL(Ol-sB zpwhaA+T6spvj6XKCLQ?D-v$Oy1^Iv1zzctS?|JVbWB|SryMKuQvc_BHwIllHpWqFA zt@{Bm1qa-e^Q3c|^Ks`KG>`sUR6T-uxf+r#>YR*bx3!=O`Yvc2wC~7QS8_Y*^oyp_ z!YY`%U{6FVnG}kq*5WG2yI}l8Ysn8J;q1Z`SWBy5@PgYBttX#Ulho1lxU>o?@2r}3 zaz|5hNfm@%5KE$cS}7_`#ht3)^$xs3MW(wnRTosj@|`s`cos#^Z7MZaLH31)U2=_0 zkM@VfAo-f&$zX5WTwNa)XE%nm!RR%$3xP4Br3w}=jt!0U+?FcHyQUn=kLjkR3fitI zwQy<5?S_v_A2D25II{JJ10NJ|xLTMSpavU9<;R6(vqxf~V6L~nZP zu7XS}yMEYf)JrLkj2&>arwYecq3@Uq0r?>80)DS{7ZQia?xL#-r&lp7nJ)0~+VWHt zuCF-#;5iGtn@#8GYDS%fjZ7_4MwqG&L>h_f&c#r z@9j7fbhwYY-^O`=qq_u=etw2rKbJahcU~{dfBx&Jfhbm2eP9I+FXM)AF#}Kt%5MO zHW-+)s7vrjI9emLC2|APFk>#YM-}|Jb+1qz9=&I-SlQ5G_bNzrW3SR;b^~zjUabKR zZrMDPVrERcRzbddwOgPK%2eN@dh)-#g=mZ2t03sT+K5a>W^;+%t03&XS_3Ti!#PV+ zu%Jrbp8kbHqnZ7c+o=lPUij72l^BP$;e)ui3g+Gc;iRjJ$=X;@0TY6UzPk$E-X1|c zy|c4ELcLW`_MivQ1Je~$TncluJyr7cqE%!oZfY#8g0DAg1qt%+Vq^{7{?D&HnkbwTyWIo1$twj_P9skGVtXTD_rT}Z>q!Gu0SKVg87A!G@I zgdxHjLXL0j-&5fiOXsB&;WFAZ#Q|5e_B1mhd{lVT9KcrU{1= zjvyRKIEwHF!qJ3d2*(nRBfODtJmCbwiG-5~ClgK~oJu&2a5~{lgf|n;Ae>2f3*jun zTM2I?oJ}}~@OHwvg!2gRAe>LQfbdSjy9gH&-c6Vx6bU6lnNT5A2{l5Uu!-;(UK1lcw;lqSW36~K*Lb#mpQNqUvAD8!kk#miM|NY2$)b+ssTkWn# zB!ErO0^I8U)P2H>Ll3ahJH(sT{=r{GOyFO6&-pv}i;*Q@%sP5%^{NUe`&7kDJPIG%ym5kwv^!J?$^k8Q=Lkv={|QkxpHAi ze?MqjJgA0+1JK-0jkqft%QG1{lDm8I5E|AWhC#>OizmsjbQ}z`33uf|2OIJ~jUlzT806X6x}ZePPB^iNJqjE%be4KpdBJfQ7!b##EB2MG?5 z&AXX~s}1Dvq-Glnkz?5%Y`8g`f7~JKk(S#)nX>%2YZ^zPgZ<Z?p4hKY$VVjs6 z3nZx;Np(ts16kxCRwJoSWTRtQXj;aDk+j#gQ^!}OQXnzj45YONMqLjsCfWwuv13sU zT)O?V08TL4UM}`AyIOkr32jXZQ z(b$_BZ8cEuF!{R1*jS*!Xs>~Chdb30iNIzWb=JVN3s01cOO^>ZgbQjQ*oAr%B@P0S zg?)fs*Vso$ZS1arSr?uTR3Dk4yp^}RN>-h@HBrCtzs(hTs&I%4Z$3A!Jk@OeWN#HN zap4KW)W{8lNu7JD@QItTi?A?)=i&Qtz>hr#>r zGGz6=A0Ga_e!u?)Wc0iOR)If;FY@O9+B^eh1{m>+7U)43`v=A*hclpW6_8I=WvX>P z&+t>TtH{1WT*Mt6n=-6nGX}oIBTpz)TXb!>{}Z(f$oX*N05@cFsIX$iKH@(NL%(zR+%?n|Q*6Xj&ZVzd1D;)~#z&ZDDI5;3 zqN)F^^TD}$Q3Gd<%Nl2cQF3YC|CG&gFkZ?Qjp187DsTu$3?d@&A9ubd@Ba?o0S-L< zrx5q!ecsox;y>Xhk?Z4N|1iY(`=Ec7f5+x;fO+aSqcsD32UVC+n4qEFm|mNO0T+iq ze}HFfBg^MP(P}=dTBOJ;=ENiC7hgwko=dLIxBmRdbrEj_-;y=c*r6lh;wf{=#O)@S`Q=4?n3u>Ynxg%gs;u;8CYMNq>f znHId@znL#=AXVQ*7%2SXBlC(+gHWv0N5DUBE)mXK*^U0Ob9IMsqy7o9|6k;+cl<{Y z0pz=gt$#5xdB5Jzg6-ery@)8^cX-!;{d2B&gqJ~-|83o;-22_Hs{Efvxog~A-R)r) zd=OrMmpd0CBG`I99nCcuG_Z@q+{)n0W}~Hcl-jIH@jyOIde~Znr2;2oDFbQ2q~5i0$$9ofjWQ_sAOlFR`K9uR@I|dFjq^}z#M?WK-C!=9iFm1%4*;XVB4%@ z)(F!z@B_dpR^^Rn`&12-0Mp^<7=pzN1n1KB8b|;*vg(Ef%LlKu2D3kILW$s48?}UNx8PsKMwD1q|C6*J&edt-3xq2PUnG2q@MXeR2v-rVCVZ9fHNw{k*ATuz_$J|7gl`kRL%5c3 z9pQSycL_HTZY119xS8-h!Yzbb3AYixPq>}%1HumpcM$F*+(q~i;cmi@3HK20CEQ22 zpYQj6JoOd zFLaJ^{NMXOL{^;-BhSw9VE(Uy1|Xrbe}5O+KZygd0Vjlohz0m0*8lIgpK_~+5V8^3 zf){~2{DgC-^ChQ(ZeHQvf;tq&`{0|lQMgMgLL3r+AsiG`#=%##w+@XlRHBheqbf$W z`4D#2p)!W%)~;gFHoEFDWni$y1uH9bYu)GPScV~La?@`|9cp7Ne5#>DVvA5c+Un33 z~S(26-bi&w_sO=E~ zf|}7a*Psa2yQ%Sj)wj@~L+iIX|*^*!pZ>xc-WlI8OR9g)! zEnBkE46LmNhL$Y}R8nmg1_G9u z8dxpEa?q@F`Q&7%_im|yO{L3W!{N@Mtp;+G9u#5?Vg%s@K!Va838mAN zx7EOP(k&1=1j*X$2mCG&yboMkw9fb^(mJkd zWI+t3#v&UzBP&e<1)0dX8Vq`s9a$nL`->y0jFHLV2?@6osygC|xf%kK=S3)MxtKkpup!byT`P(D@@4^10 z|0ZPp`hh5m!)(zyyOw4B@W!V zfeG(uGhU?vx2|}y8HEzC@d>2NAhC%k`t`L>GB=?L%}t!BC(o>d-jSTVK?I}CdZ+QK zqJ~r~e_>!qw(R6N{BZ&S;rLy~7vwHGO5`VcI<$+uAp8I{VnGWphq z&Lnbg@=Q8!1=TV2%5pG`%qY0l+c_P97+zCJ9Z)$aD@=_D?vsQ%+@IID7pp7)JG;K~2ju;| z1Wo_H|65XDWP8fYPR?hxI7{oW*Y*Vj5W8YSfTx9Z7;#rO)->4wO@HY+th!J_X~ssb zAd$O_aA6(R-LQ+1wNR|d6N+WaO6Iko4s$P#FuDtg{3U8$L@Pi(I@8tsI*h*|F(#-a z({Ji@)nN&Sn}_abWKvShSqzu?b(n<1K5P|lu#H_@hkf{fppPtA-x8lzBFRll$UJkc z?m7&{7X4!gge$xy;k|d(VLA?}FnCp<#}9Y8-F29d(H@K{Xk~e?(^)J<<^mmcu)c6` z(iIvum+f^BzM$pO(tc|<+*t?L3m4WR_$dxc@-NeGx(>1zelRVLMz-&)gYAX3usFir zIO~^6)k*lGI7%^VtCR4ha->g!Lltbp+v*^EVMDJZ2pSnmdg`Ei3Cl)Q?dqU~nZ{Qt z48Po7C+SPoh>B8mkiKxJQKAMXq*NWeFC#<7vPmQmHWScV2iXg|f7K4U&wxbNQU}!w z#|0(m3(H&UV0VeCQO>rqPMDrL>R@!4vu&^v8L7PgJxDJDo&IJeRS3jRL=!6 ze;`S{>^{{aU@p;JKR`Xqp|~MeL%P1ddg#Imxq-l&B3<9FLAbF$P{a1r_f?Nb*i!sc zS1el=9Bw=6tJSX%))1dmGqiMlRYT{w!NE`n?h)RFuxVjK@HnLF;2=eWhx7-h@N^wq zq^NK_@Xbos!AWWmS}nm%Y7hq3?5=~Ogs(z4AUJNqX+4;Z?mEayvn%9+fF|iWSWA)a zBa;E@Qbagj2$UY_ItWY=VPS(cQ=lQj* zunuNZxI(D#u=wKQvn@W)ri%r25S_vmLe=V1*-;R^)Ku!JgZ30s_L!3vfyKiBi9K~N zpk~z&l4jTk$WXIt$Zo;ZSXu`&YS#Km#sDvAYRdk9!u^`FImh=LpRoU-MO57;2uZ>g zge?hM5w<35L)ezE9btRI4ul;E^9W6ZWb|&mXcnx7!!fu4!340Kh5tb8H5LOcQB|~6GjN5gfYT6VI3h)C=ezHlZ5qz z4TOz^DS7|ryQ7l-ZxjsQHzD)SCCL2yUH4e%_^)-}i8x>PLKEP+k9)fy=J(^U8>A2$ zY!IHpr^4^&J;?g~RsUB1r<)l<^0DCY@sI+z%j#r0U6>l3=-Ze)gL)uKFff4wgjk)E zZ)PYBOD5+E?BjC<74>09OMz^Ko#s+h-uvHnA_OeIg{@lpxa zWH+ifYspg@3i}X1FsaYjK}}eklPB?@8I-}}BzdBVo58TWi7i+sH!4x+2gVRrJnP-S z12@YM9>crQF2Fv``!3a4tbxlfX%%AYjh`N2RqnP5Cr5R+KVs;9gdMjGC|niM4uUVf2K= zy0A#cM@WnX{pb@$Vwj2-^dslx#0Vcu75~W2LKFY1?Ee?Y{{N52;Pq|)lYZGh9dUiK zi0j|vy?_`X-}62P?cd4B1h|ivcK?Am;NQhL;6m{J*Mj}Ct@D&~AI<@nIB#h@1*GdR zI$%d7N=iP?I9-};M`s-bAvt#jLiMa0ad-VFwSm-Ps9|ub>O(39Qz2bH((Zf$&LcT% zFL#73RB^3?Lqe(!=8zn^c;!eo=FU18L*b}QdLeVs&N@g#p%`IQCdS}}W5n%saEHWe zg+1GQy3RV7Lt#s3s8o0<)3T!u@({MB!R_YrljFg?rt07ig(J?5;rTKxyXv42i86uL zRB2x9ww-kliNXturd<^6rg^FkDpA<==-5aYjyqiki75R2B*;h@N2R?E7EySw{m4fd z_6ZVE*r$r7ZDj3rP>8~2IDQ8knDc>2w7Cun zkuILt7(6Xa^=xp_k>Ie`S_gwjAFova6LYh&{?8--Up#zIM-0FZEzP6 zBx?7xgw`9~Tl5T{+?k4fTNtVVlDp^}=nQ%_SDcc>@zLHHpG4c_5+~4@XnJo9UXpm@ z&M|kLXY|I3G8u%d(J^Rv(ZtFBx+XVJiPL5M?{<*?<9E>iU+Hi1&+rfR4@3@-xc7*6 z8@>cZd=>V?%Kx&`0AB8%1=i0#?hekgSog1X-tU}(#`<6HCeUj@;DK8@5*FE0UHtaYy#&7+7A&*ZpIvZuf^aLUZkrI z?hO`2HI8AXBDUqJIv6-u76Jo_mDgfX9UPqfELqgvVm_PQbx?Ak;R?DimLgN3s}6Dw z#t>A{79%5HSO-N16A{Q&WHFUv-cl_0)Irz5y+&)<0jtt=&~`9Yks9VAU3D;b>_KQt zkddeB;P2RtZ5>i~9TXniqT2DR^;Vx|OzZh|FnM68uqp(n8dGOU9h{znB6Xst8&k2X z4uTJcYIUYgIY!=D2hj)H14|wqEciZVu=c6Pv`^PT{K2iN_U7~x3PJy|g>niq!c-j$ zAUrKWOMKWu8CXEJ45uO^Yp;U`6mBE1?+SLmZFNwA!o5d+Y=dc(u7eDOk?36s?gabd zPzXj)D8w$ZFBAGq*TD)3FK2U=Qgsl6!fnv#*l=hakoCWr>;Dvdd@uGskCp$|$n3R+ z-{J3u7@vpwC*Yj_e#H2^1*iPKn0I|M{=Ys0v`fp!cOf?r`v7fX2vE#9g1%k4s9?yF|Y<+ zj`;!(J0u!NMHY`@$%?yFbEwi`BoU5p8(u;VH$&Nce5k3<$m=~RERwl-Z##I!|`oo{qKYKU0?flii%V(0LIn|F@hEIA??_Ki`EVn_&IM#~#`2rq|>^@4!w@ zwg5_hWBUR1Y=Q|K%NiM<-2^MS-mHakwI>U!z*w%UD7&}H990+xo6b~OvUApsNl@Hs5eZ zHh&XL==z>`x3lXk+5{uI?kXJ6tgaSpfB+20sZF%3%dj$VIkLyHa1$)+ z`sY;HA&{g2zqv|E5stWf6U^+`P^cTjLMsnMLpQLu>u!P`BtLsYEg0V$Ybn#TJ*4hU z$>3r^Uv`DAO^M*g1g~q>Xxlf%)yp8GMe01eY3C+z;<0fOk)C>6EbIR|_xAtO-noP} z6+~e;IRiluQ3SIoRB4M;5Ep_AU0H&)QAihAC|DDpRjc(`-;X}j+Q!DI&#LvURcjY6 zT(}d&jSCmLQ7EloeWNHS2nvG#+<$H|NojFilFbLXCv)dsZswjd^Pe*TsC*iwRno`+ z?ndp;UabBQw_&!!6iJyi;{y?|>e}6b~@3_*gwfh47bZ5OKyA^+WweMnN5R6Rm;1AO`L6e3>h= zkzZJb`XXVODC4l=@F(~)_%-+*s-suI=jdYLGuj>CdQKm4kLV@t5_gE(L=SO`xJld~ zt`paYtHc%JGI5FMCN2^ei1S1jagI1koFPsV%ZM6cIguce#0p|1v5HtttRdDCwZuAN zJ+XnPBQ_G7hWhdiM3PSvcl5>txu`bPCo4;X*YcNwon!1=LgOESxvaomniD6EA zWf~e)+c%pHVAdG&&8BOpRjrfl-!T&fKq3k4v(vv)4Z$j04|A;?-r-Nw(Aa#=3s?2OcYr~*nPs%Qx*@{0r2|9l zS&2GaPk8o~7086anzmQIFx27vHorDuD8(?@YuHTnhSH9;`GdOk2SaTPfMIPOc3(6s z1B}4!*Y^DKg4r+jTdyRg_kT*lOUF(n)iL>)IhSe9vA_hOyv|%z-ofe!s#3}z6Lp5S z9*>w3=Vk=^u(Je#^{A@P2LUfr#)H~ PU05Y=NBl8{78&{n$d}+V diff --git a/src/Scrutinizer/PhpAnalyzer/Model/AbstractFunction.php b/src/Scrutinizer/PhpAnalyzer/Model/AbstractFunction.php index ac8a851..42aac65 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/AbstractFunction.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/AbstractFunction.php @@ -35,7 +35,7 @@ abstract class AbstractFunction /** @ORM\Column(type = "PhpType", nullable = true) */ private $returnType; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_nocase") */ private $name; /** @ORM\Column(type = "boolean") */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/ClassConstant.php b/src/Scrutinizer/PhpAnalyzer/Model/ClassConstant.php index 49b2a4c..376b2c0 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/ClassConstant.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/ClassConstant.php @@ -41,7 +41,7 @@ class ClassConstant implements ContainerConstantInterface /** @ORM\ManyToOne(targetEntity = "Constant", cascade = {"persist"}) */ private $constant; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_case") */ private $name; /** @ORM\Column(type = "string", nullable = true) */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/ClassMethod.php b/src/Scrutinizer/PhpAnalyzer/Model/ClassMethod.php index 1b6c375..e2a7af2 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/ClassMethod.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/ClassMethod.php @@ -41,7 +41,7 @@ class ClassMethod implements ContainerMethodInterface /** @ORM\ManyToOne(targetEntity = "Method", cascade = {"persist"}) */ private $method; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_nocase") */ private $name; /** @ORM\Column(type = "string", nullable = true) */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/ClassProperty.php b/src/Scrutinizer/PhpAnalyzer/Model/ClassProperty.php index 3d34e1f..73bacdc 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/ClassProperty.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/ClassProperty.php @@ -41,7 +41,7 @@ class ClassProperty implements ContainerPropertyInterface /** @ORM\ManyToOne(targetEntity = "Property", cascade = {"persist"}) */ private $property; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_case") */ private $name; /** @ORM\Column(type = "string", nullable = true) */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Clazz.php b/src/Scrutinizer/PhpAnalyzer/Model/Clazz.php index e64dfd0..500b953 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/Clazz.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/Clazz.php @@ -33,7 +33,7 @@ class Clazz extends MethodContainer implements ConstantContainerInterface const MODIFIER_FINAL = 1; const MODIFIER_ABSTRACT = 2; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_nocase") */ private $superClass; /** @ORM\Column(type = "simple_array") */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Constant.php b/src/Scrutinizer/PhpAnalyzer/Model/Constant.php index 22d0f23..67fa468 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/Constant.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/Constant.php @@ -33,7 +33,7 @@ class Constant /** @ORM\Id @ORM\Column(type = "integer") @ORM\GeneratedValue(strategy = "AUTO") */ private $id; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_case") */ private $name; /** @ORM\Column(type = "PhpType") */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/GlobalConstant.php b/src/Scrutinizer/PhpAnalyzer/Model/GlobalConstant.php index af7753c..deac121 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/GlobalConstant.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/GlobalConstant.php @@ -35,7 +35,7 @@ class GlobalConstant /** @ORM\Id @ORM\GeneratedValue(strategy = "AUTO") @ORM\Column(type = "integer") */ private $id; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_case") */ private $name; /** @ORM\Column(type = "PhpType") */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/InterfaceConstant.php b/src/Scrutinizer/PhpAnalyzer/Model/InterfaceConstant.php index f9040ce..b02b220 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/InterfaceConstant.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/InterfaceConstant.php @@ -41,7 +41,7 @@ class InterfaceConstant implements ContainerConstantInterface /** @ORM\ManyToOne(targetEntity = "Constant", cascade = {"persist"}) */ private $constant; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_case") */ private $name; /** @ORM\Column(type = "string", nullable = true) */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/InterfaceMethod.php b/src/Scrutinizer/PhpAnalyzer/Model/InterfaceMethod.php index ddf2eaa..5eacf5f 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/InterfaceMethod.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/InterfaceMethod.php @@ -40,7 +40,7 @@ class InterfaceMethod implements ContainerMethodInterface /** @ORM\ManyToOne(targetEntity = "Method", cascade = {"persist"}) */ private $method; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_nocase") */ private $name; /** @ORM\Column(type = "string", nullable = true) */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/MethodContainer.php b/src/Scrutinizer/PhpAnalyzer/Model/MethodContainer.php index 7fe7d6e..e7b6c0a 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/MethodContainer.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/MethodContainer.php @@ -44,7 +44,7 @@ abstract class MethodContainer extends ObjectType /** @ORM\ManyToOne(targetEntity = "PackageVersion", inversedBy="containers") */ private $packageVersion; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_nocase") */ private $name; /** @ORM\Column(type = "boolean") */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Property.php b/src/Scrutinizer/PhpAnalyzer/Model/Property.php index 4f1d39e..a1fb0a5 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/Property.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/Property.php @@ -36,7 +36,7 @@ class Property /** @ORM\Id @ORM\Column(type = "integer") @ORM\GeneratedValue(strategy = "AUTO") */ private $id; - /** @ORM\Column(type = "string") */ + /** @ORM\Column(type = "string_case") */ private $name; /** @ORM\Column(type = "integer") */ diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Type/CaseInsensitiveStringType.php b/src/Scrutinizer/PhpAnalyzer/Model/Type/CaseInsensitiveStringType.php new file mode 100644 index 0000000..626c2c8 --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Type/CaseInsensitiveStringType.php @@ -0,0 +1,34 @@ +getName()) { + case 'mysql': + // The default MySQL collation is case-insensitive. + break; + + case 'sqlite': + $declaration .= ' COLLATE NOCASE'; + break; + + default: + throw new \LogicException(sprintf('The platform "%s" is not supported by "string_case" type.', $platform->getName())); + } + + return $declaration; + } + + public function getName() + { + return 'string_nocase'; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Type/CaseSensitiveStringType.php b/src/Scrutinizer/PhpAnalyzer/Model/Type/CaseSensitiveStringType.php new file mode 100644 index 0000000..c045f8d --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Model/Type/CaseSensitiveStringType.php @@ -0,0 +1,34 @@ +getName()) { + case 'mysql': + $declaration .= ' CHARACTER SET utf8 COLLATE utf8_bin'; + break; + + case 'sqlite': + // The default sqlite collation is case-sensitive. + break; + + default: + throw new \LogicException(sprintf('The platform "%s" is not supported by "string_case" type.', $platform->getName())); + } + + return $declaration; + } + + public function getName() + { + return 'string_case'; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Util/TestUtils.php b/src/Scrutinizer/PhpAnalyzer/Util/TestUtils.php index 709dd87..47fc5f0 100644 --- a/src/Scrutinizer/PhpAnalyzer/Util/TestUtils.php +++ b/src/Scrutinizer/PhpAnalyzer/Util/TestUtils.php @@ -90,6 +90,12 @@ private static function createEm(Connection $conn) if (false === Type::hasType(PhpTypeType::NAME)) { Type::addType(PhpTypeType::NAME, 'Scrutinizer\PhpAnalyzer\Model\Type\PhpTypeType'); } + if (false === Type::hasType('string_case')) { + Type::addType('string_case', 'Scrutinizer\PhpAnalyzer\Model\Type\CaseSensitiveStringType'); + } + if (false === Type::hasType('string_nocase')) { + Type::addType('string_nocase', 'Scrutinizer\PhpAnalyzer\Model\Type\CaseInsensitiveStringType'); + } $driver = new AnnotationDriver(new AnnotationReader(), array( __DIR__.'/../Model', diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/EntityTypeProviderTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/BaseEntityTypeProviderTest.php similarity index 92% rename from tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/EntityTypeProviderTest.php rename to tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/BaseEntityTypeProviderTest.php index aca4170..a1647bd 100644 --- a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/EntityTypeProviderTest.php +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/BaseEntityTypeProviderTest.php @@ -18,6 +18,7 @@ namespace JMS\Tests\CodeReview\Entity\Repository; +use Doctrine\ORM\EntityManager; use Scrutinizer\PhpAnalyzer\PhpParser\Type\TypeRegistry; use Scrutinizer\PhpAnalyzer\Model\Clazz; use Scrutinizer\PhpAnalyzer\Model\GlobalConstant; @@ -26,7 +27,7 @@ use Scrutinizer\PhpAnalyzer\Model\Repository\EntityTypeProvider; use Scrutinizer\PhpAnalyzer\Util\TestUtils; -class EntityTypeProviderTest extends \PHPUnit_Framework_TestCase +abstract class BaseEntityTypeProviderTest extends \PHPUnit_Framework_TestCase { /** @var \Doctrine\ORM\EntityManager */ private $em; @@ -166,7 +167,7 @@ public function testLoadConstant() $this->assertSame($fooA, $loadedConst, 'loadConstant() takes the first constant if no package versions are set.'); $loadedConst = $this->provider->loadConstant('foo'); - $this->assertSame($fooA, $loadedConst, 'loadConstant() treats the name **not** as case-insensitive.'); + $this->assertNull($loadedConst, 'loadConstant() treats the name **not** as case-insensitive.'); $this->provider->setPackageVersions(array($this->versionB)); $loadedConst = $this->provider->loadConstant('FOO'); @@ -180,14 +181,7 @@ public function testLoadConstant() protected function setUp() { - if ( ! isset($_SERVER['MYSQL_USER']) - || ! isset($_SERVER['MYSQL_HOST']) - || ! isset($_SERVER['MYSQL_PASSWORD']) - || ! isset($_SERVER['MYSQL_DATABASE'])) { - $this->markTestSkipped('You need to configure a MySQL database, see phpunit.dist.xml'); - } - - $this->em = TestUtils::createMysqlTestEntityManager($_SERVER['MYSQL_USER'], $_SERVER['MYSQL_PASSWORD'], $_SERVER['MYSQL_DATABASE'], $_SERVER['MYSQL_HOST']); + $this->em = $this->getEntityManager(); $this->provider = new EntityTypeProvider($this->em); $this->typeRegistry = new TypeRegistry($this->provider); @@ -199,4 +193,9 @@ protected function setUp() $this->em->persist($this->package); $this->em->flush(); } + + /** + * @return EntityManager + */ + abstract protected function getEntityManager(); } \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/MySqlEntityTypeProviderTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/MySqlEntityTypeProviderTest.php new file mode 100644 index 0000000..32ba899 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/MySqlEntityTypeProviderTest.php @@ -0,0 +1,36 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Tests\CodeReview\Entity\Repository; + +use Scrutinizer\PhpAnalyzer\Util\TestUtils; + +class MySqlEntityTypeProviderTest extends BaseEntityTypeProviderTest +{ + protected function getEntityManager() + { + if ( ! isset($_SERVER['MYSQL_USER']) + || ! isset($_SERVER['MYSQL_HOST']) + || ! isset($_SERVER['MYSQL_PASSWORD']) + || ! isset($_SERVER['MYSQL_DATABASE'])) { + $this->markTestSkipped('You need to configure a MySQL database, see phpunit.dist.xml'); + } + + return TestUtils::createMysqlTestEntityManager($_SERVER['MYSQL_USER'], $_SERVER['MYSQL_PASSWORD'], $_SERVER['MYSQL_DATABASE'], $_SERVER['MYSQL_HOST']); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/SqliteEntityTypeProviderTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/SqliteEntityTypeProviderTest.php new file mode 100644 index 0000000..29e95fa --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/Repository/SqliteEntityTypeProviderTest.php @@ -0,0 +1,29 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Tests\CodeReview\Entity\Repository; + +use Scrutinizer\PhpAnalyzer\Util\TestUtils; + +class SqliteEntityTypeProviderTest extends BaseEntityTypeProviderTest +{ + protected function getEntityManager() + { + return TestUtils::createTestEntityManager(true); + } +} \ No newline at end of file diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/built_in_class.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/built_in_class.test new file mode 100644 index 0000000..e875a9b --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/built_in_class.test @@ -0,0 +1,8 @@ +defaultValue = $value; From e082e5c6fb34d5713503bb01ea19224a11f8c529 Mon Sep 17 00:00:00 2001 From: Pascal Borreli Date: Mon, 4 Mar 2013 21:51:24 +0000 Subject: [PATCH 15/62] Fixed typos --- .../ControlFlow/ControlFlowAnalysis.php | 4 +-- .../PhpAnalyzer/ControlFlow/PathChecker.php | 2 +- .../PhpAnalyzer/Model/PackageVersion.php | 2 +- .../Pass/CheckBasicSemanticsPass.php | 2 +- .../PhpAnalyzer/Pass/CheckstylePass.php | 2 +- .../PhpAnalyzer/Pass/OldCodingStylePass.php | 36 +++++++++---------- ....php => SuccessiveTokenAndAstAnalyzer.php} | 2 +- .../PhpAnalyzer/PhpParser/Type/PhpType.php | 2 +- .../PhpParser/Type/TypeRegistry.php | 2 +- 9 files changed, 27 insertions(+), 27 deletions(-) rename src/Scrutinizer/PhpAnalyzer/Pass/{SuccessiveTokenAndAstAnalzyer.php => SuccessiveTokenAndAstAnalyzer.php} (96%) diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowAnalysis.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowAnalysis.php index c441f0f..fbd06ca 100644 --- a/src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowAnalysis.php +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/ControlFlowAnalysis.php @@ -475,7 +475,7 @@ private function findContinueOrBreakTarget(\PHPParser_Node $node) return null; } - // Continously look up the ancestor tree for the BREAK target, and connect to it. + // Continuously look up the ancestor tree for the BREAK target, and connect to it. $curNb = 0; $num = null === $node->num ? 1 : $node->num->value; if (0 === $num) { @@ -813,7 +813,7 @@ private function computeFollowNode(\PHPParser_Node $fromNode, \PHPParser_Node $n return self::computeFallThrough($nextSibling); } - // If there are no more siblings, control is transfered up the AST. + // If there are no more siblings, control is transferred up the AST. return $this->computeFollowNode($fromNode, $parent); } } \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/ControlFlow/PathChecker.php b/src/Scrutinizer/PhpAnalyzer/ControlFlow/PathChecker.php index c845de2..68bfd36 100644 --- a/src/Scrutinizer/PhpAnalyzer/ControlFlow/PathChecker.php +++ b/src/Scrutinizer/PhpAnalyzer/ControlFlow/PathChecker.php @@ -32,7 +32,7 @@ class PathChecker // No yet visited. const STATUS_WHITE = 'white'; - // Being visted. + // Being visited. const STATUS_GRAY = 'gray'; // Finished visiting. diff --git a/src/Scrutinizer/PhpAnalyzer/Model/PackageVersion.php b/src/Scrutinizer/PhpAnalyzer/Model/PackageVersion.php index be4dfd4..1712775 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/PackageVersion.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/PackageVersion.php @@ -63,7 +63,7 @@ class PackageVersion * were available this hash is set to null. * * This hash is necessary to determine whether a package can be used as - * a depencency in another package. For example, considering that a + * a dependency in another package. For example, considering that a * package A exists which has a dependency on package B. Package B has * also dependencies on package C for certain features. However, A does * not use these features, and therefore itself has no dependency on diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckBasicSemanticsPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckBasicSemanticsPass.php index ca53ec4..a96c693 100644 --- a/src/Scrutinizer/PhpAnalyzer/Pass/CheckBasicSemanticsPass.php +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckBasicSemanticsPass.php @@ -31,7 +31,7 @@ * Basic Semantic Checks * * This pass checks basic PHP semantics such as whether you have defined properties on an interface, or that - * classes with abstract methods must be declared abstract. Most of the errors catched by this pass would lead to + * classes with abstract methods must be declared abstract. Most of the errors caught by this pass would lead to * fatal PHP runtime errors. * * @category checks diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePass.php b/src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePass.php index 3252ae2..4be0629 100644 --- a/src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePass.php +++ b/src/Scrutinizer/PhpAnalyzer/Pass/CheckstylePass.php @@ -40,7 +40,7 @@ * @category checks * @author Johannes M. Schmitt */ -class CheckstylePass extends SuccessiveTokenAndAstAnalzyer implements ConfigurablePassInterface +class CheckstylePass extends SuccessiveTokenAndAstAnalyzer implements ConfigurablePassInterface { use ConfigurableTrait; diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/OldCodingStylePass.php b/src/Scrutinizer/PhpAnalyzer/Pass/OldCodingStylePass.php index 83c0dd5..ed36e15 100644 --- a/src/Scrutinizer/PhpAnalyzer/Pass/OldCodingStylePass.php +++ b/src/Scrutinizer/PhpAnalyzer/Pass/OldCodingStylePass.php @@ -1,21 +1,21 @@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - + +/* + * Copyright 2013 Johannes M. Schmitt + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + namespace Scrutinizer\PhpAnalyzer\Pass; use JMS\PhpManipulator\PhpParser\BlockNode; @@ -70,7 +70,7 @@ public function analyze(File $file) if (!$foundTabs && preg_match('/^(?: )*\t/', $line)) { $this->addComment($i + 1, 'Please do not use tabs for indentation, but 4 spaces for each tab.'); - // Assume that the users fixes all further occurences of tabs. + // Assume that the users fixes all further occurrences of tabs. $foundTabs = true; continue; diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/SuccessiveTokenAndAstAnalzyer.php b/src/Scrutinizer/PhpAnalyzer/Pass/SuccessiveTokenAndAstAnalyzer.php similarity index 96% rename from src/Scrutinizer/PhpAnalyzer/Pass/SuccessiveTokenAndAstAnalzyer.php rename to src/Scrutinizer/PhpAnalyzer/Pass/SuccessiveTokenAndAstAnalyzer.php index 63a02bd..96770dd 100644 --- a/src/Scrutinizer/PhpAnalyzer/Pass/SuccessiveTokenAndAstAnalzyer.php +++ b/src/Scrutinizer/PhpAnalyzer/Pass/SuccessiveTokenAndAstAnalyzer.php @@ -22,7 +22,7 @@ use Scrutinizer\PhpAnalyzer\Model\File; use Scrutinizer\PhpAnalyzer\Model\PhpFile; -abstract class SuccessiveTokenAndAstAnalzyer extends AstAnalyzerPass +abstract class SuccessiveTokenAndAstAnalyzer extends AstAnalyzerPass { /** @var TokenStream */ protected $stream; diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PhpType.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PhpType.php index 9d40aef..a7a56d5 100644 --- a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PhpType.php +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/PhpType.php @@ -551,7 +551,7 @@ public function getPossibleOutcomesComparedToBoolean() } /** - * Computes the testricted types given a successful equality comparison. + * Computes the restricted types given a successful equality comparison. * * @return PhpType[] The first element is the restricted this type, the second element is the restricted type of the * passed type. diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php index 420121a..b378d7f 100644 --- a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php @@ -419,7 +419,7 @@ public function createNullableType(PhpType $type) /** * Creates a new union with the given types. * - * If strings are passed, they are assummed to be native types. + * If strings are passed, they are assumed to be native types. * * @param array $types * From ea1765a0648f0ebfceb57be368bb738ef75b466e Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Tue, 5 Mar 2013 09:14:55 +0100 Subject: [PATCH 16/62] Allow to pass multiple directories and add a filter for the output. --- .../PhpAnalyzer/Command/RunCommand.php | 28 +++++++++++----- .../PhpAnalyzer/Model/FileCollection.php | 32 +++++++++++++++++++ .../PhpAnalyzer/Model/FileCollectionTest.php | 29 ++++++++++++++++- 3 files changed, 80 insertions(+), 9 deletions(-) diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php index 7a8c48e..9543133 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -35,26 +35,34 @@ protected function configure() $this ->setName('run') ->setDescription('Runs the PHP Analyzer on source code.') - ->addArgument('dir', InputArgument::REQUIRED, 'The directory to scan.') + ->addArgument('dir', InputArgument::IS_ARRAY, 'The directory/directories to scan.') ->addOption('format', 'f', InputOption::VALUE_REQUIRED, 'The output format ("plain", "xml", "json")', 'plain') ->addOption('output-file', 'o', InputOption::VALUE_REQUIRED, 'File to output xml or json output to.', null) + ->addOption('filter', 'r', InputOption::VALUE_REQUIRED, 'Filter (strpos) to apply on reported files.', null) ; } protected function execute(InputInterface $input, OutputInterface $output) { - $dir = $input->getArgument('dir'); - if ( ! is_dir($dir)) { - throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist.', $dir)); - } - $dir = realpath($dir); + $dirs = $input->getArgument('dir'); if (extension_loaded('xdebug')) { $output->writeln('It is highly recommended to disable the XDebug extension before invoking this command.'); } - $output->write('Scanning directory... '); - $files = FileCollection::createFromDirectory($dir); + $files = new FileCollection(array()); + + foreach ($dirs as $dir) { + if ( ! is_dir($dir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist.', $dir)); + } + $dir = realpath($dir); + + $output->writeln('Scanning directory ' . $dir . ''); + + $files = $files->merge(FileCollection::createFromDirectory($dir)); + } + $output->writeln(sprintf('found %d files', count($files))); if (count($files) > 100) { @@ -66,6 +74,10 @@ protected function execute(InputInterface $input, OutputInterface $output) $analyzer->setLogger(new OutputLogger($output, $input->getOption('verbose'))); $analyzer->analyze($files); + if ($filter = $input->getOption('filter')) { + $files = $files->filter($filter); + } + switch ($input->getOption('format')) { case 'plain': $formatter = new OutputFormatter\TextFormatter(); diff --git a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php index 84864ae..0fe2bce 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php @@ -248,6 +248,38 @@ public function getCommentedFiles() return new FileCollection($commentedFiles); } + + /** + * Merge FileCollection with another file collection and return a new one. + * + * @param FileCollection $other + * + * @return FileCollection + */ + public function merge(FileCollection $other) + { + return new FileCollection(array_merge($this->files, $other->files)); + } + + /** + * Filter files in the collection by expression and return new file collection. + * + * @param string $expression + * + * @return FileCollection + */ + public function filter($expression) + { + $filteredFiles = array(); + + foreach ($this->files as $file) { + if (strpos($file->getName(), $expression) !== false) { + $filteredFiles[] = $file; + } + } + + return new FileCollection($filteredFiles); + } } class ZipFileIterator implements \Iterator diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php index 2752738..1c87b41 100644 --- a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php @@ -69,4 +69,31 @@ public function testCreateFromZipFileWithPattern() $this->assertEquals($col2, $col); } -} \ No newline at end of file + + public function testFilterCollection() + { + $col = FileCollection::createFromDirectory(__DIR__.'/Fixture/DirWithSomeFiles', '*.php'); + $filteredCol = $col->filter('A.php'); + + $this->assertNotSame($col, $filteredCol); + $this->assertCount(1, $filteredCol); + + $files = $filteredCol->all(); + $this->assertArrayHasKey('A.php', $files); + } + + public function testMergeCollections() + { + $col = FileCollection::createFromZipFile(__DIR__.'/Fixture/zip-file.zip'); + $col2 = FileCollection::createFromDirectory(__DIR__.'/Fixture/DirWithSomeFiles'); + + $merged = $col->merge($col2); + + $this->assertCount(3, $col); + $files = $col->all(); + + $this->assertArrayHasKey('A.php', $files); + $this->assertArrayHasKey('Sub-Dir/B.php', $files); + $this->assertArrayHasKey('text.txt', $files); + } +} From 6bd3fe0cf3cc67e44150302f6a0fe2fc7324c58b Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Tue, 5 Mar 2013 10:01:00 +0100 Subject: [PATCH 17/62] uses fnmatch instead of strpos for filter to be consistent with other filters --- composer.lock | 25 ++++++++----------- .../OutputFormatter/SerializerFormatter.php | 4 +-- .../Command/OutputFormatter/TextFormatter.php | 4 +-- ...atter.php => OutputFormatterInterface.php} | 8 +++++- .../PhpAnalyzer/Command/RunCommand.php | 13 +++++++--- .../PhpAnalyzer/Model/FileCollection.php | 20 ++++++++------- .../PhpAnalyzer/Model/FileCollectionTest.php | 2 +- 7 files changed, 43 insertions(+), 33 deletions(-) rename src/Scrutinizer/PhpAnalyzer/Command/{OutputFormatter.php => OutputFormatterInterface.php} (82%) diff --git a/composer.lock b/composer.lock index 2f88439..a8a72c6 100644 --- a/composer.lock +++ b/composer.lock @@ -142,16 +142,16 @@ "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "fd45c6f6baa618d871f3201fabe76df5043abb1e" + "reference": "569f1aed578585df904c7dbfc43aa39cb09877cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/fd45c6f6baa618d871f3201fabe76df5043abb1e", - "reference": "fd45c6f6baa618d871f3201fabe76df5043abb1e", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/569f1aed578585df904c7dbfc43aa39cb09877cc", + "reference": "569f1aed578585df904c7dbfc43aa39cb09877cc", "shasum": "" }, "require": { - "doctrine/common": "2.3.*", + "doctrine/common": ">=2.3.0,<2.5-dev", "php": ">=5.3.2" }, "type": "library", @@ -165,7 +165,7 @@ "Doctrine\\DBAL": "lib/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -197,7 +197,7 @@ "persistence", "queryobject" ], - "time": "2013-01-20 11:50:36" + "time": "2013-03-04 22:37:48" }, { "name": "doctrine/lexer", @@ -743,12 +743,12 @@ "source": { "type": "git", "url": "https://github.com/scrutinizer-ci/utils.git", - "reference": "84f098e3ba952f254a7df0ae4e616c5e8607a262" + "reference": "a2f336f59c37bbaa379e86bc1e452d05dd6b94df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scrutinizer-ci/utils/zipball/84f098e3ba952f254a7df0ae4e616c5e8607a262", - "reference": "84f098e3ba952f254a7df0ae4e616c5e8607a262", + "url": "https://api.github.com/repos/scrutinizer-ci/utils/zipball/a2f336f59c37bbaa379e86bc1e452d05dd6b94df", + "reference": "a2f336f59c37bbaa379e86bc1e452d05dd6b94df", "shasum": "" }, "require": { @@ -761,11 +761,8 @@ "Scrutinizer": "src/" } }, - "support": { - "source": "https://github.com/scrutinizer-ci/utils/tree/master", - "issues": "https://github.com/scrutinizer-ci/utils/issues" - }, - "time": "2013-01-26 10:35:27" + "notification-url": "https://packagist.org/downloads/", + "time": "2013-03-05 08:41:33" }, { "name": "symfony/config", diff --git a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/SerializerFormatter.php b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/SerializerFormatter.php index 38d6e5a..0208285 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/SerializerFormatter.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/SerializerFormatter.php @@ -2,7 +2,7 @@ namespace Scrutinizer\PhpAnalyzer\Command\OutputFormatter; -use Scrutinizer\PhpAnalyzer\Command\OutputFormatter; +use Scrutinizer\PhpAnalyzer\Command\OutputFormatterInterface; use Symfony\Component\Console\Output\OutputInterface; use JMS\Serializer\JsonSerializationVisitor; @@ -11,7 +11,7 @@ use JMS\Serializer\Naming\SerializedNameAnnotationStrategy; use JMS\Serializer\SerializerBuilder; -class SerializerFormatter implements OutputFormatter +class SerializerFormatter implements OutputFormatterInterface { /** * @var string diff --git a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/TextFormatter.php b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/TextFormatter.php index 8ded2e5..cfea5f4 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/TextFormatter.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter/TextFormatter.php @@ -17,13 +17,13 @@ namespace Scrutinizer\PhpAnalyzer\Command\OutputFormatter; -use Scrutinizer\PhpAnalyzer\Command\OutputFormatter; +use Scrutinizer\PhpAnalyzer\Command\OutputFormatterInterface; use Symfony\Component\Console\Output\OutputInterface; /** * Format the output of PhpAnalyzer as human readable text. */ -class TextFormatter implements OutputFormatter +class TextFormatter implements OutputFormatterInterface { public function write(OutputInterface $output, $fileCollection) { diff --git a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter.php b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatterInterface.php similarity index 82% rename from src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter.php rename to src/Scrutinizer/PhpAnalyzer/Command/OutputFormatterInterface.php index c7d14fc..5d64af7 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatter.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/OutputFormatterInterface.php @@ -23,7 +23,13 @@ /** * Controls the output format of the analyzer. */ -interface OutputFormatter +interface OutputFormatterInterface { + /** + * @param \Symfony\Component\Console\Output\OutputInterface $output + * @param $fileCollection + * + * @return void + */ public function write(OutputInterface $output, $fileCollection); } diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php index 9543133..dd22803 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -38,7 +38,9 @@ protected function configure() ->addArgument('dir', InputArgument::IS_ARRAY, 'The directory/directories to scan.') ->addOption('format', 'f', InputOption::VALUE_REQUIRED, 'The output format ("plain", "xml", "json")', 'plain') ->addOption('output-file', 'o', InputOption::VALUE_REQUIRED, 'File to output xml or json output to.', null) - ->addOption('filter', 'r', InputOption::VALUE_REQUIRED, 'Filter (strpos) to apply on reported files.', null) + ->addOption('include-pattern', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Filter (shell pattern) which paths must match to be scanned.') + ->addOption('exclude-pattern', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Filter (shell pattern) which paths must NOT match to be scanned.') + ->addOption('filter-pattern', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Filter (shell pattern) which is applied before outputting results and which files must match.') ; } @@ -60,7 +62,10 @@ protected function execute(InputInterface $input, OutputInterface $output) $output->writeln('Scanning directory ' . $dir . ''); - $files = $files->merge(FileCollection::createFromDirectory($dir)); + $files = $files->merge(FileCollection::createFromDirectory($dir, '*.php', array( + 'paths' => $input->getOption('filter-include'), + 'excluded_paths' => $input->getOption('filter-exclude'), + ))); } $output->writeln(sprintf('found %d files', count($files))); @@ -74,8 +79,8 @@ protected function execute(InputInterface $input, OutputInterface $output) $analyzer->setLogger(new OutputLogger($output, $input->getOption('verbose'))); $analyzer->analyze($files); - if ($filter = $input->getOption('filter')) { - $files = $files->filter($filter); + if ($input->getOption('filter-pattern')) { + $files = $files->filter($input->getOption('filter-pattern')); } switch ($input->getOption('format')) { diff --git a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php index 0fe2bce..40023b8 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php @@ -19,23 +19,26 @@ namespace Scrutinizer\PhpAnalyzer\Model; use Scrutinizer\PhpAnalyzer\Exception\MaxMemoryExceededException; +use Scrutinizer\Util\PathUtils; use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; use Symfony\Component\Finder\Iterator\FilenameFilterIterator; use Symfony\Component\Finder\SplFileInfo; -use JMS\Serializer\Annotation as Serializer; +use JMS\Serializer\Annotation as Serializer; -/** - * @Serializer\ExclusionPolicy("ALL") +/** + * @Serializer\ExclusionPolicy("ALL") * @Serializer\XmlRoot("analyzer") - */ + */ class FileCollection implements \IteratorAggregate, \Countable { /** * @Serializer\Expose * @Serializer\XmlList(inline=true, entry="file") - */ + * + * @var File[] + */ private $files = array(); private $size = 0; @@ -264,16 +267,15 @@ public function merge(FileCollection $other) /** * Filter files in the collection by expression and return new file collection. * - * @param string $expression + * @param string[] $paths * * @return FileCollection */ - public function filter($expression) + public function filter(array $paths) { $filteredFiles = array(); - foreach ($this->files as $file) { - if (strpos($file->getName(), $expression) !== false) { + if (PathUtils::matches($file->getName(), $paths)) { $filteredFiles[] = $file; } } diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php index 1c87b41..c8905a8 100644 --- a/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Model/FileCollectionTest.php @@ -73,7 +73,7 @@ public function testCreateFromZipFileWithPattern() public function testFilterCollection() { $col = FileCollection::createFromDirectory(__DIR__.'/Fixture/DirWithSomeFiles', '*.php'); - $filteredCol = $col->filter('A.php'); + $filteredCol = $col->filter(array('A.php')); $this->assertNotSame($col, $filteredCol); $this->assertCount(1, $filteredCol); From d5ff981015eab8ae6a0d5323081b36d3c50eed39 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Tue, 5 Mar 2013 10:12:55 +0100 Subject: [PATCH 18/62] fixes regression in previous commit, adds some more tests --- .../PhpAnalyzer/Command/RunCommand.php | 4 +- .../Command/Fixture/TestProject/bootstrap.php | 3 ++ .../PhpAnalyzer/Command/RunCommandTest.php | 40 +++++++++++++++++++ tests/bootstrap.php | 4 +- 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Command/Fixture/TestProject/bootstrap.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Command/RunCommandTest.php diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php index dd22803..1c46f93 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -63,8 +63,8 @@ protected function execute(InputInterface $input, OutputInterface $output) $output->writeln('Scanning directory ' . $dir . ''); $files = $files->merge(FileCollection::createFromDirectory($dir, '*.php', array( - 'paths' => $input->getOption('filter-include'), - 'excluded_paths' => $input->getOption('filter-exclude'), + 'paths' => $input->getOption('include-pattern'), + 'excluded_paths' => $input->getOption('exclude-pattern'), ))); } diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Command/Fixture/TestProject/bootstrap.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Command/Fixture/TestProject/bootstrap.php new file mode 100644 index 0000000..b1b0136 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Command/Fixture/TestProject/bootstrap.php @@ -0,0 +1,3 @@ +runCommand(__DIR__.'/Fixture/TestProject'); + $this->assertOutputContains('The variable ``$x`` does not exist. Did you forget to declare it?'); + } + + public function testFilter() + { + $this->runCommand(__DIR__.'/Fixture/TestProject --filter-pattern="foobar"'); + $this->assertOutputNotContains('The variable ``$x`` does not exist. Did you forget to declare it?'); + } + + private function assertOutputNotContains($str) + { + $this->assertNotNull($this->proc); + $this->assertNotContains($str, $this->proc->getOutput()); + } + + private function assertOutputContains($str) + { + $this->assertNotNull($this->proc); + $this->assertContains($str, $this->proc->getOutput()); + } + + private function runCommand($argStr) + { + $this->proc = new Process('php bin/phpalizer run '.$argStr, ROOT_DIR); + $this->proc->runOrException(); + } +} \ No newline at end of file diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 094ba23..ede2a1d 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -6,4 +6,6 @@ $loader->add('Scrutinizer', __DIR__); AnnotationRegistry::registerLoader('class_exists'); -assert_options(ASSERT_BAIL); \ No newline at end of file +assert_options(ASSERT_BAIL); + +define('ROOT_DIR', realpath(__DIR__.'/../')); \ No newline at end of file From be5dff93c3bbc29fc84809202dd3d7177d7599f4 Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 5 Mar 2013 10:28:32 +0100 Subject: [PATCH 19/62] removes php 5.4 features from bootstrap (closes #14) This will ensure that if someone does not install via composer initially and is running PHP 5.3, he will at least get a understandable warning instead of a parsing error. --- bin/phpalizer | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/phpalizer b/bin/phpalizer index d2c82a5..c8fbd11 100755 --- a/bin/phpalizer +++ b/bin/phpalizer @@ -9,4 +9,5 @@ require_once $autoloadFile; \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader('class_exists'); -(new \Scrutinizer\PhpAnalyzer\CliApp())->run(); \ No newline at end of file +$app = new \Scrutinizer\PhpAnalyzer\CliApp(); +$app->run(); From 980458f74d42f07346d113c54387f1b530d68bb4 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Tue, 5 Mar 2013 10:44:37 +0100 Subject: [PATCH 20/62] ignore if 'free' is not available on OS (closes #7) --- src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php index 40023b8..2879c9f 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php @@ -171,7 +171,8 @@ public static function getMemoryThreshold() return 1024 * 1024 * 1024 * 1.8; // 1.8 GB } - exec('free -m', $output, $returnVar); + // Just suppress errors if "free" is not available, we will just use defaults then. + @exec('free -m', $output, $returnVar); if (0 === $returnVar) { if (preg_match('#buffers/cache:\s+[^\s]+\s+([^\s]+)#', implode("\n", $output), $match)) { // Values are in mega bytes. From af9a5f5f4689a452714ff45153600e1c4fe76e6d Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 5 Mar 2013 10:48:47 +0100 Subject: [PATCH 21/62] adds a warning about adding PHPAnalyzer as a dependency (closes #1) --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 5804674..5e8e82e 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,9 @@ PHPAnalyzer can be installed via composer very easily: composer create-project scrutinizer/php-analyzer:dev-master ``` +Please note that PHP Analyzer cannot be installed as a dependency of your root project currently, but +must be installed as a standalone project. + ## Usage ### Via The Command Line From deae25992d41d4d5600eb8cb4f4367ddefdf23dc Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Tue, 5 Mar 2013 11:11:47 +0100 Subject: [PATCH 22/62] Fix XmlOutput of Comment Parameters --- src/Scrutinizer/PhpAnalyzer/Model/Comment.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Scrutinizer/PhpAnalyzer/Model/Comment.php b/src/Scrutinizer/PhpAnalyzer/Model/Comment.php index 9964e02..1c67aa1 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/Comment.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/Comment.php @@ -49,7 +49,10 @@ class Comment /** @Serializer\SerializedName("message") @Serializer\Expose */ private $messageFormat; - /** @Serializer\SerializedName("params") @Serializer\Expose */ + /** + * @Serializer\SerializedName("params") @Serializer\Expose + * @Serializer\XmlMap(keyAttribute="name", entry="param") + */ private $context; /** @Serializer\Expose */ @@ -192,4 +195,4 @@ public function __toString() return $msg; } -} \ No newline at end of file +} From e6d942e03743963e1269b8c67b8ba0be5d483cbe Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Tue, 5 Mar 2013 12:12:20 +0100 Subject: [PATCH 23/62] reverts passing multiple directories This causes problems as we are always using relative path names internally. Having multiple root directories would cause those relative paths not to be unique anymore. Instead of passing multiple directories, you can however pass the common parent directory of all directories that you want to scan (at worst '/') and then use '--include-pattern' and '--exclude-pattern' to narrow the files down. --- .../PhpAnalyzer/Command/RunCommand.php | 25 ++++-------- src/Scrutinizer/PhpAnalyzer/Model/File.php | 40 +++++++++---------- 2 files changed, 26 insertions(+), 39 deletions(-) diff --git a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php index 1c46f93..65c534b 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/RunCommand.php @@ -35,7 +35,7 @@ protected function configure() $this ->setName('run') ->setDescription('Runs the PHP Analyzer on source code.') - ->addArgument('dir', InputArgument::IS_ARRAY, 'The directory/directories to scan.') + ->addArgument('dir', InputArgument::REQUIRED, 'The directory to scan.') ->addOption('format', 'f', InputOption::VALUE_REQUIRED, 'The output format ("plain", "xml", "json")', 'plain') ->addOption('output-file', 'o', InputOption::VALUE_REQUIRED, 'File to output xml or json output to.', null) ->addOption('include-pattern', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Filter (shell pattern) which paths must match to be scanned.') @@ -46,28 +46,17 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output) { - $dirs = $input->getArgument('dir'); + $dir = $input->getArgument('dir'); if (extension_loaded('xdebug')) { $output->writeln('It is highly recommended to disable the XDebug extension before invoking this command.'); } - $files = new FileCollection(array()); - - foreach ($dirs as $dir) { - if ( ! is_dir($dir)) { - throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist.', $dir)); - } - $dir = realpath($dir); - - $output->writeln('Scanning directory ' . $dir . ''); - - $files = $files->merge(FileCollection::createFromDirectory($dir, '*.php', array( - 'paths' => $input->getOption('include-pattern'), - 'excluded_paths' => $input->getOption('exclude-pattern'), - ))); - } - + $output->writeln('Scanning directory ' . $dir . ''); + $files = FileCollection::createFromDirectory($dir, '*.php', array( + 'paths' => $input->getOption('include-pattern'), + 'excluded_paths' => $input->getOption('exclude-pattern'), + )); $output->writeln(sprintf('found %d files', count($files))); if (count($files) > 100) { diff --git a/src/Scrutinizer/PhpAnalyzer/Model/File.php b/src/Scrutinizer/PhpAnalyzer/Model/File.php index 63d908e..9b11c0b 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/File.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/File.php @@ -1,21 +1,21 @@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - + +/* + * Copyright 2013 Johannes M. Schmitt + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + namespace Scrutinizer\PhpAnalyzer\Model; use JMS\PhpManipulator\PhpParser\BlockNode; @@ -33,9 +33,7 @@ class File /** @Serializer\Expose @Serializer\SerializedName("path") */ private $name; - /** @Serializer\Expose */ private $content; - private $comments; private $changedLines = array(); private $diff; @@ -181,7 +179,7 @@ public function hasComments() /** * @Serializer\VirtualProperty * @Serializer\SerializedName("comments") - * @Serializer\XmlMap(entry="comment", keyAttribute="line") + * @Serializer\XmlMap(entry="comment", keyAttribute="line") */ public function getFlatComments() { @@ -325,4 +323,4 @@ public function getProposedPatch() return DiffUtils::generate($this->content, $after); } -} +} From 1316e3a7eaf5185df80e9b8f7ded8a7578be97f2 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Tue, 5 Mar 2013 14:22:14 +0100 Subject: [PATCH 24/62] adds a warning when running on partial project, or w/o deps --- .../PhpAnalyzer/Command/OutputLogger.php | 19 ++++++++++- .../PhpAnalyzer/Pass/TypeScanningPass.php | 18 +++++++++++ .../PhpParser/Type/TypeRegistry.php | 6 ++++ .../Command/Fixture/PartialProject/Foo.php | 13 ++++++++ .../Command/Fixture/TestProject/classes.php | 32 +++++++++++++++++++ .../PhpAnalyzer/Command/RunCommandTest.php | 10 ++++++ 6 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Command/Fixture/PartialProject/Foo.php create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Command/Fixture/TestProject/classes.php diff --git a/src/Scrutinizer/PhpAnalyzer/Command/OutputLogger.php b/src/Scrutinizer/PhpAnalyzer/Command/OutputLogger.php index 2d167e9..3bd7d7e 100644 --- a/src/Scrutinizer/PhpAnalyzer/Command/OutputLogger.php +++ b/src/Scrutinizer/PhpAnalyzer/Command/OutputLogger.php @@ -38,6 +38,23 @@ public function log($level, $message, array $context = array()) return; } - $this->output->writeln($message); + $map = array(); + foreach ($context as $k => $v) { + if ( ! is_scalar($v)) { + continue; + } + + $map['{'.$k.'}'] = $v; + } + + $outputMessage = strtr($message, $map); + + if ('critical' === $level) { + $outputMessage = ''.$outputMessage.''; + } elseif ('emergency' === $level) { + $outputMessage = ''.$outputMessage.''; + } + + $this->output->writeln($outputMessage); } } \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/TypeScanningPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/TypeScanningPass.php index 4226c64..de5aa83 100644 --- a/src/Scrutinizer/PhpAnalyzer/Pass/TypeScanningPass.php +++ b/src/Scrutinizer/PhpAnalyzer/Pass/TypeScanningPass.php @@ -164,6 +164,24 @@ public function afterAnalysis() } $this->typeRegistry->resolveNamedTypes(); + + $unresolvedTypes = $this->typeRegistry->getUnresolvedNamedTypes(); + if ( ! empty($unresolvedTypes)) { + $resolvedTypes = $this->typeRegistry->getClasses(); + $unresolvedPercentage = count($unresolvedTypes) / (count($unresolvedTypes) + count($resolvedTypes)); + if ($unresolvedPercentage > 0.05) { // 5% was chosen quite arbitrarily, we will need to experiment with this. + $this->analyzer->logger->critical( + 'Caution: {percentage}% of used types were not defined, e.g. {example}. ' + .'This suggests that you are trying to analyze only a partial project, or excluded dependencies; doing ' + .'so can cause the various data flow analyses (like type inference) to either be inaccurate or not ' + .'converge to a fixed-point solution (i.e. be very slow).', + array( + 'percentage' => round($unresolvedPercentage * 100, 2), + 'example' => $unresolvedTypes[array_rand($unresolvedTypes)]->getReferenceName() + ) + ); + } + } } public function beforeAnalysis() diff --git a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php index b378d7f..b398dc3 100644 --- a/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php +++ b/src/Scrutinizer/PhpAnalyzer/PhpParser/Type/TypeRegistry.php @@ -80,6 +80,7 @@ class TypeRegistry private $cachedConstants = array(); private $cachedImplementingClasses = array(); + /** @var NamedType[] */ private $namedTypes = array(); private $classes = array(); @@ -743,6 +744,11 @@ public function resolveNamedTypes() } } + public function getUnresolvedNamedTypes() + { + return $this->namedTypes; + } + private function findImplementingClasses($name) { $classes = array(); diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Command/Fixture/PartialProject/Foo.php b/tests/Scrutinizer/Tests/PhpAnalyzer/Command/Fixture/PartialProject/Foo.php new file mode 100644 index 0000000..c6f63c9 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Command/Fixture/PartialProject/Foo.php @@ -0,0 +1,13 @@ +runCommand(__DIR__.'/Fixture/TestProject'); $this->assertOutputContains('The variable ``$x`` does not exist. Did you forget to declare it?'); + $this->assertOutputNotContains('used types were not defined'); } public function testFilter() @@ -20,6 +21,15 @@ public function testFilter() $this->assertOutputNotContains('The variable ``$x`` does not exist. Did you forget to declare it?'); } + /** + * @group partial-project + */ + public function testDisplaysWarningWhenAnalyzingPartialProject() + { + $this->runCommand(__DIR__.'/Fixture/PartialProject'); + $this->assertOutputContains('83.33% of used types were not defined'); + } + private function assertOutputNotContains($str) { $this->assertNotNull($this->proc); From 7b90e8c1a2836236dffd95b2ce14aba18924d109 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Tue, 5 Mar 2013 20:31:20 +0100 Subject: [PATCH 25/62] adds a command to generate cfg graphs, more efficient BitSet --- src/Scrutinizer/PhpAnalyzer/CliApp.php | 2 + .../PhpAnalyzer/Command/CreateCfgCommand.php | 88 +++++++++++++++++ .../DataFlow/LiveVariableAnalysis/BitSet.php | 94 +++++++++++++------ 3 files changed, 157 insertions(+), 27 deletions(-) create mode 100644 src/Scrutinizer/PhpAnalyzer/Command/CreateCfgCommand.php diff --git a/src/Scrutinizer/PhpAnalyzer/CliApp.php b/src/Scrutinizer/PhpAnalyzer/CliApp.php index 2856821..f4112a1 100644 --- a/src/Scrutinizer/PhpAnalyzer/CliApp.php +++ b/src/Scrutinizer/PhpAnalyzer/CliApp.php @@ -19,6 +19,7 @@ namespace Scrutinizer\PhpAnalyzer; use Scrutinizer\PhpAnalyzer\Command\BuildTestDatabaseCommand; +use Scrutinizer\PhpAnalyzer\Command\CreateCfgCommand; use Scrutinizer\PhpAnalyzer\Command\RunCommand; use Symfony\Component\Console\Application; @@ -29,6 +30,7 @@ protected function getDefaultCommands() $commands = parent::getDefaultCommands(); $commands[] = new BuildTestDatabaseCommand(); $commands[] = new RunCommand(); + $commands[] = new CreateCfgCommand(); return $commands; } diff --git a/src/Scrutinizer/PhpAnalyzer/Command/CreateCfgCommand.php b/src/Scrutinizer/PhpAnalyzer/Command/CreateCfgCommand.php new file mode 100644 index 0000000..92f962f --- /dev/null +++ b/src/Scrutinizer/PhpAnalyzer/Command/CreateCfgCommand.php @@ -0,0 +1,88 @@ +setName('create-cfg') + ->setDescription('Creates a control flow graph for the given scope.') + ->addArgument('file', InputArgument::REQUIRED, 'The file that contains the PHP code.') + ->addArgument('element', InputArgument::REQUIRED, 'The code element for which the CFG should be created. Currently, only class methods are supported in the form: ClassName::foomethod') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + if ( ! is_file($file = $input->getArgument('file'))) { + throw new \InvalidArgumentException(sprintf('The file "%s" does not exist.', $file)); + } + + if (false === strpos($input->getArgument('element'), '::')) { + throw new \InvalidArgumentException(sprintf('The element must be of the form "ClassName::methodName", but got "%s".', $input->getArgument('element'))); + } + + list($class, $method) = explode('::', $input->getArgument('element')); + $ast = ParseUtils::parse(file_get_contents($file)); + NodeTraversal::traverseWithCallback($ast, $callback = new SearchCallback($class, $method)); + + if (null === $cfg = $callback->getCfg()) { + throw new \RuntimeException(sprintf('The code element "%s" was not found in the given file.', $input->getArgument('element'))); + } + + $output->writeln((new GraphvizSerializer())->serialize($cfg)); + } +} + +class SearchCallback extends AbstractScopedCallback +{ + private $class; + private $method; + private $cfg; + + public function __construct($className, $methodName) + { + $this->class = $className; + $this->method = $methodName; + } + + public function enterScope(NodeTraversal $t) + { + $root = $t->getScopeRoot(); + + if ( ! $root instanceof \PHPParser_Node_Stmt_ClassMethod) { + return; + } + + if ($root->name !== $this->method) { + return; + } + + $container = $root->getAttribute('parent')->getAttribute('parent'); + $className = implode("\\", $container->namespacedName->parts); + + if ($this->class !== substr($className, -1 * strlen($this->class))) { + return; + } + + $this->cfg = $t->getControlFlowGraph(); + } + + public function getCfg() + { + return $this->cfg; + } +} \ No newline at end of file diff --git a/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/BitSet.php b/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/BitSet.php index 96f81b1..599b16b 100644 --- a/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/BitSet.php +++ b/src/Scrutinizer/PhpAnalyzer/DataFlow/LiveVariableAnalysis/BitSet.php @@ -1,21 +1,21 @@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - + +/* + * Copyright 2013 Johannes M. Schmitt + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + namespace Scrutinizer\PhpAnalyzer\DataFlow\LiveVariableAnalysis; /** @@ -28,9 +28,21 @@ class BitSet implements \Countable { private $values = array(); + private $size = 0; + private $value = 0; + private $efficient = false; public function __construct($initialSize = 0) { + $this->size = $initialSize; + + if ($initialSize <= 31) { + $this->value = 0; + $this->efficient = true; + + return; + } + for ($i=0; $i<$initialSize; $i++) { $this->values[] = 0; } @@ -38,32 +50,50 @@ public function __construct($initialSize = 0) public function performOr(BitSet $that) { - assert('count($this) === count($that)'); + if ($this->efficient) { + $this->value |= $that->value; + + return; + } for ($i=0,$c=count($this->values); $i<$c; $i++) { $this->values[$i] = $this->values[$i] | $that->values[$i]; } } - public function all() - { - return $this->values; - } - public function set($index) { + if ($this->efficient) { + $this->value |= 1 << $index; + + return; + } + $this->values[$index] = 1; } public function get($index) { - assert('isset($this->values[$index])'); + if ($this->efficient) { + return ($this->value >> $index) & 1; + } return $this->values[$index]; } public function __toString() { + if ($this->efficient) { + $str = ''; + $value = $this->value; + for ($i=0;$i<$this->size;$i++) { + $str .= ($value & 1) ? '1' : '0'; + $value >>= 1; + } + + return $str; + } + $maxIndex = max(array_keys($this->values)); $str = ''; for ($i = 0; $i<=$maxIndex; $i++) { @@ -81,6 +111,12 @@ public function andNot(BitSet $that) { assert('count($this) === count($that)'); + if ($this->efficient) { + $this->value &= ~$that->value; + + return; + } + for ($i=0,$c=count($this->values); $i<$c; $i++) { $this->values[$i] = $this->values[$i] & ~$that->values[$i]; } @@ -88,11 +124,15 @@ public function andNot(BitSet $that) public function equals(BitSet $that) { - if (count($this->values) !== $c = count($that)) { + if ($this->size !== $that->size) { return false; } - for ($i=0; $i<$c; $i++) { + if ($this->efficient) { + return $this->value === $that->value; + } + + for ($i=0; $i<$this->size; $i++) { if ($this->values[$i] !== $that->values[$i]) { return false; } @@ -103,6 +143,6 @@ public function equals(BitSet $that) public function count() { - return count($this->values); + return $this->size; } } \ No newline at end of file From 8669ce8afd43079dc41d83eb4ee4cf79a74122f1 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Wed, 6 Mar 2013 08:37:58 +0100 Subject: [PATCH 26/62] moved to website --- .jms.yml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 .jms.yml diff --git a/.jms.yml b/.jms.yml deleted file mode 100644 index ae70d36..0000000 --- a/.jms.yml +++ /dev/null @@ -1,19 +0,0 @@ -filter: - paths: - - src/* - - tests/* - - excluded_paths: - - tests/*/Fixture/* - - tests/Scrutinizer/Tests/PhpAnalyzer/libraries/* - -default_config: - use_statement_fixes: - order_alphabetically: true - -path_configs: - tests: - path: tests/* - verify_php_doc_comments: false - checkstyle: false - doc_comment_fixes: false From 9ee522dee06dcc064fbc2dee21fcf4ce390ee807 Mon Sep 17 00:00:00 2001 From: Johannes Date: Sat, 9 Mar 2013 09:34:42 +0100 Subject: [PATCH 27/62] adds an explicit note about PHP 5.4 (closes #20) This seems to be a common obstacle and the composer error is not very readable at the moment. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e8e82e..e0fe3d3 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@ composer create-project scrutinizer/php-analyzer:dev-master ``` Please note that PHP Analyzer cannot be installed as a dependency of your root project currently, but -must be installed as a standalone project. +must be installed as a standalone project. Also, PHP Analyzer itself needs a PHP 5.4 runtime; this +requirement only applies to the system that is running PHP Analyzer, not the code that is analyzed. ## Usage From c376d7535c94c8dc540f960d5e37a402d6a25604 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Sun, 10 Mar 2013 11:20:37 +0100 Subject: [PATCH 28/62] hides warning when free is not available (closes #21) --- src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php index 2879c9f..c5bb5a8 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php @@ -19,6 +19,7 @@ namespace Scrutinizer\PhpAnalyzer\Model; use Scrutinizer\PhpAnalyzer\Exception\MaxMemoryExceededException; +use Scrutinizer\Process\Process; use Scrutinizer\Util\PathUtils; use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; @@ -172,9 +173,9 @@ public static function getMemoryThreshold() } // Just suppress errors if "free" is not available, we will just use defaults then. - @exec('free -m', $output, $returnVar); - if (0 === $returnVar) { - if (preg_match('#buffers/cache:\s+[^\s]+\s+([^\s]+)#', implode("\n", $output), $match)) { + $proc = new Process('free -m'); + if (0 === $proc->run()) { + if (preg_match('#buffers/cache:\s+[^\s]+\s+([^\s]+)#', $proc->getOutput(), $match)) { // Values are in mega bytes. list(, $freeMemory) = $match; From 465b6a70c3c4b1f1278d5f005b6a6caa55ed8391 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Wed, 5 Jun 2013 23:14:49 +0200 Subject: [PATCH 29/62] fixes wrong types for iterator related methods (closes #33) --- res/php-5.2-core-api/SPL.php | 24 ++++---- res/php-5.3-core-api/SPL.php | 36 ++++++------ res/php-5.4-core-api/SPL.php | 10 ++-- res/test_database.sqlite | Bin 1042432 -> 1042432 bytes .../iterator_iterator_current.test | 55 ++++++++++++++++++ 5 files changed, 90 insertions(+), 35 deletions(-) create mode 100644 tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/iterator_iterator_current.test diff --git a/res/php-5.2-core-api/SPL.php b/res/php-5.2-core-api/SPL.php index ba4c9a6..0efa267 100644 --- a/res/php-5.2-core-api/SPL.php +++ b/res/php-5.2-core-api/SPL.php @@ -100,7 +100,7 @@ public function getSubIterator ($level) {} /** * Get inner iterator * @link http://www.php.net/manual/en/recursiveiteratoriterator.getinneriterator.php - * @return iterator The current active sub iterator. + * @return Iterator The current active sub iterator. */ public function getInnerIterator () {} @@ -228,7 +228,7 @@ public function key () {} /** * Get the current value * @link http://www.php.net/manual/en/iteratoriterator.current.php - * @return void The value of the current element. + * @return mixed The value of the current element. */ public function current () {} @@ -242,7 +242,7 @@ public function next () {} /** * Get the inner iterator * @link http://www.php.net/manual/en/iteratoriterator.getinneriterator.php - * @return void The inner iterator as passed to IteratorIterator::__construct. + * @return Iterator The inner iterator as passed to IteratorIterator::__construct. */ public function getInnerIterator () {} @@ -640,7 +640,7 @@ public function __toString () {} /** * Return the innter iterator * @link http://www.php.net/manual/en/cachingiterator.getinneriterator.php - * @return void an object implementing the Iterator interface. + * @return Iterator an object implementing the Iterator interface. */ public function getInnerIterator () {} @@ -804,7 +804,7 @@ public function __toString () {} /** * Return the innter iterator * @link http://www.php.net/manual/en/cachingiterator.getinneriterator.php - * @return void an object implementing the Iterator interface. + * @return Iterator an object implementing the Iterator interface. */ public function getInnerIterator () {} @@ -932,7 +932,7 @@ public function next () {} /** * Get the inner iterator * @link http://www.php.net/manual/en/norewinditerator.getinneriterator.php - * @return iterator The inner iterator, as passed to NoRewindIterator::__construct. + * @return Iterator The inner iterator, as passed to NoRewindIterator::__construct. */ public function getInnerIterator () {} @@ -995,7 +995,7 @@ public function next () {} /** * Gets an inner iterator * @link http://www.php.net/manual/en/appenditerator.getinneriterator.php - * @return void The current inner Iterator. + * @return Iterator The current inner Iterator. */ public function getInnerIterator () {} @@ -1056,14 +1056,14 @@ public function key () {} /** * Get the current value * @link http://www.php.net/manual/en/iteratoriterator.current.php - * @return void The value of the current element. + * @return mixed The value of the current element. */ public function current () {} /** * Get the inner iterator * @link http://www.php.net/manual/en/iteratoriterator.getinneriterator.php - * @return void The inner iterator as passed to IteratorIterator::__construct. + * @return Iterator The inner iterator as passed to IteratorIterator::__construct. */ public function getInnerIterator () {} @@ -1468,21 +1468,21 @@ public function rewind () {} /** * The valid() method * @link http://www.php.net/manual/en/emptyiterator.valid.php - * @return void false + * @return false */ public function valid () {} /** * The key() method * @link http://www.php.net/manual/en/emptyiterator.key.php - * @return void + * @return void */ public function key () {} /** * The current() method * @link http://www.php.net/manual/en/emptyiterator.current.php - * @return void + * @return void */ public function current () {} diff --git a/res/php-5.3-core-api/SPL.php b/res/php-5.3-core-api/SPL.php index b34e66e..0c0e4b0 100644 --- a/res/php-5.3-core-api/SPL.php +++ b/res/php-5.3-core-api/SPL.php @@ -555,7 +555,7 @@ public function getSubIterator ($level) {} /** * Get inner iterator * @link http://www.php.net/manual/en/recursiveiteratoriterator.getinneriterator.php - * @return iterator The current active sub iterator. + * @return Iterator The current active sub iterator. */ public function getInnerIterator () {} @@ -683,7 +683,7 @@ public function key () {} /** * Get the current value * @link http://www.php.net/manual/en/iteratoriterator.current.php - * @return void The value of the current element. + * @return mixed The value of the current element. */ public function current () {} @@ -697,7 +697,7 @@ public function next () {} /** * Get the inner iterator * @link http://www.php.net/manual/en/iteratoriterator.getinneriterator.php - * @return void The inner iterator as passed to IteratorIterator::__construct. + * @return Iterator The inner iterator as passed to IteratorIterator::__construct. */ public function getInnerIterator () {} @@ -1087,28 +1087,28 @@ public function hasNext () {} /** * Return the string representation of the current element * @link http://www.php.net/manual/en/cachingiterator.tostring.php - * @return void The string representation of the current element. + * @return string The string representation of the current element. */ public function __toString () {} /** * Return the innter iterator * @link http://www.php.net/manual/en/cachingiterator.getinneriterator.php - * @return void an object implementing the Iterator interface. + * @return Iterator an object implementing the Iterator interface. */ public function getInnerIterator () {} /** * Get flags used * @link http://www.php.net/manual/en/cachingiterator.getflags.php - * @return void Description... + * @return integer Description... */ public function getFlags () {} /** * The setFlags purpose * @link http://www.php.net/manual/en/cachingiterator.setflags.php - * @param flags bitmask

    + * @param integer flags bitmask

    * Bitmask of the flags to set. *

    * @return void @@ -1251,28 +1251,28 @@ public function hasNext () {} /** * Return the string representation of the current element * @link http://www.php.net/manual/en/cachingiterator.tostring.php - * @return void The string representation of the current element. + * @return string The string representation of the current element. */ public function __toString () {} /** * Return the innter iterator * @link http://www.php.net/manual/en/cachingiterator.getinneriterator.php - * @return void an object implementing the Iterator interface. + * @return Iterator an object implementing the Iterator interface. */ public function getInnerIterator () {} /** * Get flags used * @link http://www.php.net/manual/en/cachingiterator.getflags.php - * @return void Description... + * @return integer Description... */ public function getFlags () {} /** * The setFlags purpose * @link http://www.php.net/manual/en/cachingiterator.setflags.php - * @param flags bitmask

    + * @param integer $flags bitmask

    * Bitmask of the flags to set. *

    * @return void @@ -1386,7 +1386,7 @@ public function next () {} /** * Get the inner iterator * @link http://www.php.net/manual/en/norewinditerator.getinneriterator.php - * @return iterator The inner iterator, as passed to NoRewindIterator::__construct. + * @return Iterator The inner iterator, as passed to NoRewindIterator::__construct. */ public function getInnerIterator () {} @@ -1449,21 +1449,21 @@ public function next () {} /** * Gets an inner iterator * @link http://www.php.net/manual/en/appenditerator.getinneriterator.php - * @return void The current inner Iterator. + * @return Iterator The current inner Iterator. */ public function getInnerIterator () {} /** * Gets an index of iterators * @link http://www.php.net/manual/en/appenditerator.getiteratorindex.php - * @return void The index of iterators. + * @return integer The index of iterators. */ public function getIteratorIndex () {} /** * The getArrayIterator method * @link http://www.php.net/manual/en/appenditerator.getarrayiterator.php - * @return void + * @return ArrayIterator */ public function getArrayIterator () {} @@ -1510,14 +1510,14 @@ public function key () {} /** * Get the current value * @link http://www.php.net/manual/en/iteratoriterator.current.php - * @return void The value of the current element. + * @return mixed The value of the current element. */ public function current () {} /** * Get the inner iterator * @link http://www.php.net/manual/en/iteratoriterator.getinneriterator.php - * @return void The inner iterator as passed to IteratorIterator::__construct. + * @return Iterator The inner iterator as passed to IteratorIterator::__construct. */ public function getInnerIterator () {} @@ -2111,7 +2111,7 @@ public function getSubIterator ($level) {} /** * Get inner iterator * @link http://www.php.net/manual/en/recursiveiteratoriterator.getinneriterator.php - * @return iterator The current active sub iterator. + * @return Iterator The current active sub iterator. */ public function getInnerIterator () {} diff --git a/res/php-5.4-core-api/SPL.php b/res/php-5.4-core-api/SPL.php index a37f43e..d64866c 100644 --- a/res/php-5.4-core-api/SPL.php +++ b/res/php-5.4-core-api/SPL.php @@ -1477,7 +1477,7 @@ public function getSubIterator ($level) {} * (PHP 5 >= 5.1.0)
    * Get inner iterator * @link http://php.net/manual/en/recursiveiteratoriterator.getinneriterator.php - * @return iterator The current active sub iterator. + * @return Iterator The current active sub iterator. */ public function getInnerIterator () {} @@ -1683,7 +1683,7 @@ public function next () {} * (PHP 5 >= 5.1.0)
    * Get the inner iterator * @link http://php.net/manual/en/iteratoriterator.getinneriterator.php - * @return Traversable The inner iterator as passed to IteratorIterator::__construct. + * @return Iterator The inner iterator as passed to IteratorIterator::__construct. */ public function getInnerIterator () {} @@ -2717,7 +2717,7 @@ public function next () {} * (PHP 5 >= 5.1.0)
    * Get the inner iterator * @link http://php.net/manual/en/norewinditerator.getinneriterator.php - * @return iterator The inner iterator, as passed to NoRewindIterator::__construct. + * @return Iterator The inner iterator, as passed to NoRewindIterator::__construct. */ public function getInnerIterator () {} @@ -2879,7 +2879,7 @@ public function current () {} * (PHP 5 >= 5.1.0)
    * Get the inner iterator * @link http://php.net/manual/en/iteratoriterator.getinneriterator.php - * @return Traversable The inner iterator as passed to IteratorIterator::__construct. + * @return Iterator The inner iterator as passed to IteratorIterator::__construct. */ public function getInnerIterator () {} @@ -3567,7 +3567,7 @@ public function getSubIterator ($level) {} * (PHP 5 >= 5.1.0)
    * Get inner iterator * @link http://php.net/manual/en/recursiveiteratoriterator.getinneriterator.php - * @return iterator The current active sub iterator. + * @return Iterator The current active sub iterator. */ public function getInnerIterator () {} diff --git a/res/test_database.sqlite b/res/test_database.sqlite index 0cf6e146770a07dd64f81ef9a9418983d7fa41d1..4b11cc2e27882cc236d5eab1841eea02ac93551c 100644 GIT binary patch delta 2542 zcmai0dr(yO6+RDG9-@LFQ9o_C(TW_`Hj8#Tb5vacjca0^d~qPZtUQ8V?y-I$ruVDFFpfcg^0{Ft35T#nqjx4 zRxHh`SZeuoM%EI$H90liYPZ-dnYLtWnkCh0wq%$sHe*^^wk0b&&9Y!&C;%W|2fltZ zBH=Q}#_)?F|1Z~uvSVdvSdF;)I(YEyb~26BG$Bvsmr4t3@d zPE<$xaDosCfQD0xNMmZkhGit{p93E+NM~6bR zS!cr*@*C&Ms_LqG)$%n)t1(Utk(5yb&5(PvO0A+8jlV(0NqN9$xSi+o^K_FmYN0C1 zq37^p+=dkx4A6ynuhe^*9B`z>h z%P9|U3vsQu2*cnbXn}>0^UHd))_-65o@~{#7gN-xFiP{6k|A-bZn!R9!G%16ZqX4D#9WHO?_?b9xD?ZoWJPpA159mm zJj*7}tEwlA%-YpRGBIa*UQl%|%v25G6z7kX=}iCMvd$0aYCa~x6Zin$gy}NZ=e2i6 z(Og!JNUA($r%Kc+$I>3k$=7*#i)%PX%zuLp38}N_S9l*k92jsKg4D7TY9N15Zvcs2 zQ1`ZkhqG}vPX8&q5jGqB~nRm;$M$u^zJV?e)d>P~5dpIo_SHcV_ zD@J=emgX^AyrjNJrZlzOC}dk`KE~*Nid6kOFiQJ8fnu1=-Vp;HQ_Zn7(SH~NI2>lH zpmZ|gY)LgyJDfzN%qiXps;x!%b|pw9!grQf=uNWk-=>t?LMg}ILwyoi)J3u3P^9lkjW_XPPN$2slx%nt zyU~rw$Z#3j^<_U!JCQ?0tW4>&(tlTkT>^YSc6W{})=x!BD`^TLp2rTX!8CE_Jt<-f zln6gYc6isQQWF(w5f0e`YElll{552V6MJ8jN!4-zhl{ZeOAk6f-^#?^z=dcLJzj)P z-Qr_-t}jfT>cn}PWh(WOw6ykVOI>p)N-Zm(a{t?Gm|)V2nn<^4pV)p8S;>H(;VK*o z*TD;AU>eYp)>KR`mW)I7j7HVciB^9k1(+j19!Uq-#WRJ|(^Nx+_#>XhowyP+&;Vzk z6&A=X@=Ek2se2AGX-7(ErjSxhFZuh?kev&BPTamh7J006^e(wX)kf^cQ@91or6ZQL zwHuZ}?jTj0d%9{1=qPt1lPM43cB1*!A7@B zaDyj8u-P*~(CyLh^mvK|y`EPEeV!V@ja~t0@rDb&;f)d876Fn>U~*oi?>>^ z&AUc$t1nEj-50IDZSy4wZub@Vj+|tP0Es~D$VtPz*u1i*`rFEtoWW7_Q1skGdqoY^ zG?OxD90khGyNZY9ufclRQ!~+qV=)l=WOMqVP8F;UiPVbw3~@O6xu*5OKqI5&=}Uo2 zYbvT6etrUP{=%TiqJUvn;V*1qoaRo^m51W5!-gh+%+43P+v7%DMLtG+e7 GBk(_j{i72A delta 2690 zcmb7G3sjT$6~B)dL7@oh1feVqukZ{Ikf%b#p{P_D_$VqG9x^RrMLKmpK>3njwMDee zzuF#Ot(%?I7PWqLcC*@}JEz(XwAQuKYOPzfb(^mAtY_-n4eIHscH3D_?oGZg_q+e! zy}$cNb7x+2XWqIhjOwV~KEZGZ_|U#UO9xLVz<%I6VIY7F0#j_ZOj}AuazRbP0U7foA7YsG@emmTSiE3OoM(aVRu*WxgEbv+0#Y=bs2T&I^Q$F6tGq?vA z;VAe54#V@X5XQFK!}Y>$JVt)QTN=do!(QLhl;dw05jSM?#D6|H zS~IJnZj4d(EBK+9hTUhH^(BTD-N~+13;q6&wKa`JjWrF9#`z6J_0=_tm)_5ZRU7*K zCwdFxE)5Y{h+26aqx3#sA!7D$;7(r86&yxA^n2Pa@s?5`cHw6H2@ZkFunU&L@CQQ8 z(X!N$V9M3=uA;`CiDZnM34D^D;z~~E0rUkOp(dI_$!-O8(xEFl<93Y zae-E$>@%r=!?hV|TNH)sGkUOuJw0eN&jNmj8#$eB&{&*}$THyH3il)V5xO9mD3LsTh`+=poP@z}9p05TEEDW;>R4aO z;Y_Vbt?Wlxx^@%Oc|Z9YY-jn`JexD5#r`buzaR&v5#mmCVx|5AXKJ+MiTG0?U5Xyny;x#;tg%9jt+J z2`+(?oZ0Hg4z#NG2U4m&%a2B~X8;*(Ss>As(P>&QnTa9;p2jw;#BB73OR!PKN7ntZ zf!aERX6fkzsFpqB$&fz??B4KR;syyXh(4!%)FR~;fnVcsd{&$#A;4+a0S#h!|0~H^ zaTix8rEQ3zfUZ)>H7EzkqUCECX! z^Bz96C59Y&p2-_zFd0pyz<-cI8zB|sAd`&QH--Nx7y&on47>_0caS8yf|UKL4C%A+ z6swPmq%!t2_L5Z$e3aX{m`(Jx@V}a-Q#{_l6Zj(5VJ`Yf6TAvdP%LEqSZ%Y?Oipw~ zs1AQh(lrZ3^mf27A?tnK#C4pYG3&!(@mDwKk6$^}IB4c(YiIdUY0U zC367e0H5ZaTtFX7CQB&_zs2pcatg68{6;D`r`y)c&w*|QamY1y)gc@-kwj_$a52okuAVo zyp0#IUDEIw?Wa{Vk;3q=cmy{{ZCK$WXpuZV#-(n5_4Z~osrSZ_O|JaBS7rK^QPfGE zooKYggY@JGx<%dM#mh+wp2R9l6*l(BHi++qQ|b;=DZ{BuPZ&chIL=>g27;{KGyF2w za4;REjZ{XVcn#l`YML&McS+`<24e+-i8I`ZYC#ib>elhJls$uFrpmM3(z_2s>;sp|?=cS9V6qJ51b2yQsuGT;mC<5$O{D`xp+2+g9JLGQSI(`eYRtX+uV;i(pBZ&A`}sXH{QD1?xoa;PMf!^Pi1>>1 U6X`GFC*m*ikY0N+U}K+u0}PeLl>h($ diff --git a/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/iterator_iterator_current.test b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/iterator_iterator_current.test new file mode 100644 index 0000000..46afc26 --- /dev/null +++ b/tests/Scrutinizer/Tests/PhpAnalyzer/Pass/Fixture/Integration/iterator_iterator_current.test @@ -0,0 +1,55 @@ +setFlags(\SplFileObject::DROP_NEW_LINE | \SplFileObject::SKIP_EMPTY | \SplFileObject::READ_AHEAD | \SplFileObject::READ_CSV); + + parent::__construct($file); + + $this->rewind(); + } + + public function current() + { + $data = parent::current(); + + // Do some processing on $data + + return $data; + } + + public function rewind() + { + parent::rewind(); + + $this->init(); + $this->next(); + } + + private function init() + { + if (!$this->valid()) { + throw new \LogicException('The CSV file must have at least 1 heading line.'); + } + + /** @var \SplFileObject $file */ + $file = $this->getInnerIterator(); + + // Determine the CSV delimiter used in the file + // The READ_CSV flag is removed temporarily so that ->current() returns the raw line + $flags = $file->getFlags(); + $file->setFlags($flags & ~\SplFileObject::READ_CSV); + + $firstLine = $file->current(); + + $delimiter = false !== strpos($firstLine, ';') ? ';' : ','; + + $file->setFlags($flags); + $file->setCsvControl($delimiter); + } +} + +-- COMMENTS -- +Line 47: ``$firstLine`` of type ``string|array`` is not a sub-type of ``string``. \ No newline at end of file From 36a82213e272d5b6a158d223b9e35358e348c112 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Sat, 29 Jun 2013 22:29:49 +0200 Subject: [PATCH 30/62] updates constraint --- composer.json | 2 +- composer.lock | 252 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 161 insertions(+), 93 deletions(-) diff --git a/composer.json b/composer.json index 4a0c6a3..2d3e5f1 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "require": { "php": ">=5.4", "scrutinizer/utils": "dev-master", - "jms/composer-deps-analyzer": "dev-master", + "jms/composer-deps-analyzer": "~0.1", "jms/php-manipulator": "dev-master", "jms/parser-lib": "1.*", "jms/serializer": "0.12.*", diff --git a/composer.lock b/composer.lock index a8a72c6..761b340 100644 --- a/composer.lock +++ b/composer.lock @@ -1,18 +1,22 @@ { - "hash": "6f265e2f3d6df730e80e13cdb61fa8ca", + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" + ], + "hash": "f83d774d6717e988c8b0ea846c870407", "packages": [ { "name": "doctrine/annotations", - "version": "v1.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "v1.0" + "reference": "v1.1.1" }, "dist": { "type": "zip", - "url": "https://github.com/doctrine/annotations/archive/v1.0.zip", - "reference": "v1.0", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/v1.1.1", + "reference": "v1.1.1", "shasum": "" }, "require": { @@ -23,12 +27,17 @@ "doctrine/cache": "1.*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-0": { "Doctrine\\Common\\Annotations\\": "lib/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -54,7 +63,7 @@ { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", + "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" } ], @@ -65,7 +74,7 @@ "docblock", "parser" ], - "time": "2013-01-12 19:23:32" + "time": "2013-04-20 08:30:17" }, { "name": "doctrine/common", @@ -95,7 +104,7 @@ "Doctrine\\Common": "lib/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -142,12 +151,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "569f1aed578585df904c7dbfc43aa39cb09877cc" + "reference": "6a62fefefde6b2c0d8b3df70151d6a81fc028d28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/569f1aed578585df904c7dbfc43aa39cb09877cc", - "reference": "569f1aed578585df904c7dbfc43aa39cb09877cc", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/6a62fefefde6b2c0d8b3df70151d6a81fc028d28", + "reference": "6a62fefefde6b2c0d8b3df70151d6a81fc028d28", "shasum": "" }, "require": { @@ -197,32 +206,37 @@ "persistence", "queryobject" ], - "time": "2013-03-04 22:37:48" + "time": "2013-05-21 05:53:02" }, { "name": "doctrine/lexer", - "version": "v1.0", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "v1.0" + "reference": "bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94" }, "dist": { "type": "zip", - "url": "https://github.com/doctrine/lexer/archive/v1.0.zip", - "reference": "v1.0", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94", + "reference": "bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94", "shasum": "" }, "require": { "php": ">=5.3.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-0": { "Doctrine\\Common\\Lexer\\": "lib/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -239,7 +253,7 @@ { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", + "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" } ], @@ -249,7 +263,7 @@ "lexer", "parser" ], - "time": "2013-01-12 18:59:04" + "time": "2013-03-07 12:15:25" }, { "name": "doctrine/orm", @@ -257,12 +271,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "304acf0a1af15ebe049231b84a7630c75ecbe62d" + "reference": "0633aa54c84b69061c8c399f5afa551547527bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/304acf0a1af15ebe049231b84a7630c75ecbe62d", - "reference": "304acf0a1af15ebe049231b84a7630c75ecbe62d", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/0633aa54c84b69061c8c399f5afa551547527bed", + "reference": "0633aa54c84b69061c8c399f5afa551547527bed", "shasum": "" }, "require": { @@ -289,7 +303,7 @@ "Doctrine\\ORM": "lib/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -319,20 +333,20 @@ "database", "orm" ], - "time": "2013-02-21 18:03:42" + "time": "2013-06-25 17:36:05" }, { "name": "jms/composer-deps-analyzer", - "version": "dev-master", + "version": "0.1.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/composer-deps-analyzer.git", - "reference": "3170c1fba8067f18971972c55bcd52439206ba38" + "reference": "0.1.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/composer-deps-analyzer/zipball/3170c1fba8067f18971972c55bcd52439206ba38", - "reference": "3170c1fba8067f18971972c55bcd52439206ba38", + "url": "https://api.github.com/repos/schmittjoh/composer-deps-analyzer/zipball/0.1.0", + "reference": "0.1.0", "shasum": "" }, "require": { @@ -354,20 +368,20 @@ "Apache2" ], "description": "Builds a Dependency Graph from a composer.json file", - "time": "2013-01-21 16:28:25" + "time": "2013-05-15 18:04:27" }, { "name": "jms/metadata", - "version": "1.2.0-RC", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/schmittjoh/metadata", - "reference": "1.2.0-RC" + "url": "https://github.com/schmittjoh/metadata.git", + "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e" }, "dist": { "type": "zip", - "url": "https://github.com/schmittjoh/metadata/zipball/1.2.0-RC", - "reference": "1.2.0-RC", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", + "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", "shasum": "" }, "require": { @@ -379,7 +393,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.4.x-dev" } }, "autoload": { @@ -387,7 +401,7 @@ "Metadata\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "Apache" ], @@ -395,7 +409,7 @@ { "name": "Johannes M. Schmitt", "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", + "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" } ], @@ -406,7 +420,7 @@ "xml", "yaml" ], - "time": "2012-08-21 05:40:10" + "time": "2013-03-28 16:32:37" }, { "name": "jms/parser-lib", @@ -436,7 +450,7 @@ "JMS\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "Apache2" ], @@ -494,21 +508,21 @@ }, { "name": "jms/serializer", - "version": "dev-master", + "version": "0.12.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "0aded9426d08c920e299c302914f702fad6f8ee6" + "reference": "0.12.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/0aded9426d08c920e299c302914f702fad6f8ee6", - "reference": "0aded9426d08c920e299c302914f702fad6f8ee6", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/0.12.0", + "reference": "0.12.0", "shasum": "" }, "require": { "doctrine/annotations": "1.*", - "jms/metadata": ">=1.1.0,<1.3-dev", + "jms/metadata": ">=1.1,<2.0", "jms/parser-lib": "1.*", "php": ">=5.3.2", "phpcollection/phpcollection": ">=0.1,<0.3-dev" @@ -542,7 +556,7 @@ ], "authors": [ { - "name": "Johannes M. Schmitt", + "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com", "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" @@ -557,7 +571,7 @@ "serialization", "xml" ], - "time": "2013-03-01 10:16:05" + "time": "2013-03-28 16:41:24" }, { "name": "nikic/php-parser", @@ -628,7 +642,7 @@ "PhpCollection": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "Apache2" ], @@ -656,12 +670,12 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "c8829c3b675f17aa465557f721d909deb67d904f" + "reference": "1c7e8016289d17d83ced49c56d0f266fd0568941" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/c8829c3b675f17aa465557f721d909deb67d904f", - "reference": "c8829c3b675f17aa465557f721d909deb67d904f", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/1c7e8016289d17d83ced49c56d0f266fd0568941", + "reference": "1c7e8016289d17d83ced49c56d0f266fd0568941", "shasum": "" }, "require": { @@ -670,7 +684,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -684,7 +698,7 @@ ], "authors": [ { - "name": "Johannes M. Schmitt", + "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com", "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" @@ -697,7 +711,7 @@ "php", "type" ], - "time": "2013-03-03 09:30:51" + "time": "2013-05-19 11:09:35" }, { "name": "psr/log", @@ -743,17 +757,18 @@ "source": { "type": "git", "url": "https://github.com/scrutinizer-ci/utils.git", - "reference": "a2f336f59c37bbaa379e86bc1e452d05dd6b94df" + "reference": "b49c7e0117c1bff14b8f99d61a7cbf04b2d8f87c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scrutinizer-ci/utils/zipball/a2f336f59c37bbaa379e86bc1e452d05dd6b94df", - "reference": "a2f336f59c37bbaa379e86bc1e452d05dd6b94df", + "url": "https://api.github.com/repos/scrutinizer-ci/utils/zipball/b49c7e0117c1bff14b8f99d61a7cbf04b2d8f87c", + "reference": "b49c7e0117c1bff14b8f99d61a7cbf04b2d8f87c", "shasum": "" }, "require": { "php": ">=5.4", - "symfony/process": "2.*" + "symfony/process": ">=2.0,<3.0", + "symfony/yaml": ">=2.0,<3.0" }, "type": "library", "autoload": { @@ -762,7 +777,7 @@ } }, "notification-url": "https://packagist.org/downloads/", - "time": "2013-03-05 08:41:33" + "time": "2013-06-22 16:12:25" }, { "name": "symfony/config", @@ -771,21 +786,22 @@ "source": { "type": "git", "url": "https://github.com/symfony/Config.git", - "reference": "2b8694ad7f46072b154faaf5e74f2a06cb828fa7" + "reference": "51fadec8a95b6b58a8512d5418c96de28dd78d1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Config/zipball/2b8694ad7f46072b154faaf5e74f2a06cb828fa7", - "reference": "2b8694ad7f46072b154faaf5e74f2a06cb828fa7", + "url": "https://api.github.com/repos/symfony/Config/zipball/51fadec8a95b6b58a8512d5418c96de28dd78d1a", + "reference": "51fadec8a95b6b58a8512d5418c96de28dd78d1a", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.3", + "symfony/filesystem": ">=2.3,<3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -809,7 +825,7 @@ ], "description": "Symfony Config Component", "homepage": "http://symfony.com", - "time": "2013-03-01 10:42:20" + "time": "2013-06-19 09:29:07" }, { "name": "symfony/console", @@ -818,21 +834,27 @@ "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "fae82dad073a491b91a2ad6cda2ef5d8b19a5152" + "reference": "b68fd0262ebae63f796d188f48eaa470044861fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/fae82dad073a491b91a2ad6cda2ef5d8b19a5152", - "reference": "fae82dad073a491b91a2ad6cda2ef5d8b19a5152", + "url": "https://api.github.com/repos/symfony/Console/zipball/b68fd0262ebae63f796d188f48eaa470044861fd", + "reference": "b68fd0262ebae63f796d188f48eaa470044861fd", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "require-dev": { + "symfony/event-dispatcher": ">=2.1,<3.0" + }, + "suggest": { + "symfony/event-dispatcher": "" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -856,7 +878,7 @@ ], "description": "Symfony Console Component", "homepage": "http://symfony.com", - "time": "2013-03-01 06:43:27" + "time": "2013-06-23 08:16:33" }, { "name": "symfony/filesystem", @@ -865,12 +887,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Filesystem.git", - "reference": "414e4f741f2b0750a92925ada7a1864f94715388" + "reference": "7975f9df488adbc9cef2089bac2887f14085481f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/414e4f741f2b0750a92925ada7a1864f94715388", - "reference": "414e4f741f2b0750a92925ada7a1864f94715388", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/7975f9df488adbc9cef2089bac2887f14085481f", + "reference": "7975f9df488adbc9cef2089bac2887f14085481f", "shasum": "" }, "require": { @@ -879,7 +901,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -887,7 +909,7 @@ "Symfony\\Component\\Filesystem\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -903,7 +925,7 @@ ], "description": "Symfony Filesystem Component", "homepage": "http://symfony.com", - "time": "2013-01-31 21:39:01" + "time": "2013-06-11 07:15:38" }, { "name": "symfony/finder", @@ -912,12 +934,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Finder.git", - "reference": "0b33214ce24e33b6d11fd7de8784ff34ba16711f" + "reference": "d8da924d4f7d9f325ebd72feefee40c17a3e9104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/0b33214ce24e33b6d11fd7de8784ff34ba16711f", - "reference": "0b33214ce24e33b6d11fd7de8784ff34ba16711f", + "url": "https://api.github.com/repos/symfony/Finder/zipball/d8da924d4f7d9f325ebd72feefee40c17a3e9104", + "reference": "d8da924d4f7d9f325ebd72feefee40c17a3e9104", "shasum": "" }, "require": { @@ -926,7 +948,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -950,7 +972,7 @@ ], "description": "Symfony Finder Component", "homepage": "http://symfony.com", - "time": "2013-03-01 06:43:27" + "time": "2013-06-23 08:16:33" }, { "name": "symfony/process", @@ -959,12 +981,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Process.git", - "reference": "6ebe4ba544cfc0dd25bfe49402da4d5267ee1b43" + "reference": "f3f84fec23ce3ff7d0510c308c7842729cb0ba8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/6ebe4ba544cfc0dd25bfe49402da4d5267ee1b43", - "reference": "6ebe4ba544cfc0dd25bfe49402da4d5267ee1b43", + "url": "https://api.github.com/repos/symfony/Process/zipball/f3f84fec23ce3ff7d0510c308c7842729cb0ba8c", + "reference": "f3f84fec23ce3ff7d0510c308c7842729cb0ba8c", "shasum": "" }, "require": { @@ -973,7 +995,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -981,7 +1003,7 @@ "Symfony\\Component\\Process\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -997,7 +1019,54 @@ ], "description": "Symfony Process Component", "homepage": "http://symfony.com", - "time": "2013-02-18 21:28:20" + "time": "2013-06-23 08:16:33" + }, + { + "name": "symfony/yaml", + "version": "dev-master", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "82100c7732c95452702d11433aad50988700d36c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/82100c7732c95452702d11433aad50988700d36c", + "reference": "82100c7732c95452702d11433aad50988700d36c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2013-05-16 07:54:39" } ], "packages-dev": [ @@ -1007,12 +1076,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "689bc2ae2a41dff1107d9d50e2daa4c349222869" + "reference": "6924952026b77ff492da559b04ad166d25c611cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/689bc2ae2a41dff1107d9d50e2daa4c349222869", - "reference": "689bc2ae2a41dff1107d9d50e2daa4c349222869", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/6924952026b77ff492da559b04ad166d25c611cb", + "reference": "6924952026b77ff492da559b04ad166d25c611cb", "shasum": "" }, "require": { @@ -1054,7 +1123,7 @@ "keywords": [ "database" ], - "time": "2013-02-12 02:52:36" + "time": "2013-04-11 23:14:04" } ], "aliases": [ @@ -1063,7 +1132,6 @@ "minimum-stability": "dev", "stability-flags": { "scrutinizer/utils": 20, - "jms/composer-deps-analyzer": 20, "jms/php-manipulator": 20, "nikic/php-parser": 20, "doctrine/data-fixtures": 20 From 39466f0e1d94bb93cf98346fb7717ed6ae0857f6 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 29 Jul 2013 14:42:10 +0200 Subject: [PATCH 31/62] updates jms/serializer version --- composer.json | 2 +- composer.lock | 279 +++++++++++++++++++++++++++++++------------------- 2 files changed, 177 insertions(+), 104 deletions(-) diff --git a/composer.json b/composer.json index 4a0c6a3..3db919d 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "jms/composer-deps-analyzer": "dev-master", "jms/php-manipulator": "dev-master", "jms/parser-lib": "1.*", - "jms/serializer": "0.12.*", + "jms/serializer": "dev-master", "nikic/php-parser": "dev-master", "doctrine/common": "2.3.*", "doctrine/dbal": "*", diff --git a/composer.lock b/composer.lock index a8a72c6..9e54d72 100644 --- a/composer.lock +++ b/composer.lock @@ -1,18 +1,22 @@ { - "hash": "6f265e2f3d6df730e80e13cdb61fa8ca", + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" + ], + "hash": "9a499a383f8ba44af191b057f7cb9947", "packages": [ { "name": "doctrine/annotations", - "version": "v1.0", + "version": "v1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "v1.0" + "reference": "v1.1.2" }, "dist": { "type": "zip", - "url": "https://github.com/doctrine/annotations/archive/v1.0.zip", - "reference": "v1.0", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/v1.1.2", + "reference": "v1.1.2", "shasum": "" }, "require": { @@ -23,12 +27,17 @@ "doctrine/cache": "1.*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-0": { "Doctrine\\Common\\Annotations\\": "lib/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -54,7 +63,7 @@ { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", + "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" } ], @@ -65,7 +74,7 @@ "docblock", "parser" ], - "time": "2013-01-12 19:23:32" + "time": "2013-06-16 21:33:03" }, { "name": "doctrine/common", @@ -95,7 +104,7 @@ "Doctrine\\Common": "lib/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -121,7 +130,7 @@ { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", + "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" } ], @@ -142,12 +151,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "569f1aed578585df904c7dbfc43aa39cb09877cc" + "reference": "6a62fefefde6b2c0d8b3df70151d6a81fc028d28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/569f1aed578585df904c7dbfc43aa39cb09877cc", - "reference": "569f1aed578585df904c7dbfc43aa39cb09877cc", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/6a62fefefde6b2c0d8b3df70151d6a81fc028d28", + "reference": "6a62fefefde6b2c0d8b3df70151d6a81fc028d28", "shasum": "" }, "require": { @@ -197,32 +206,37 @@ "persistence", "queryobject" ], - "time": "2013-03-04 22:37:48" + "time": "2013-05-21 05:53:02" }, { "name": "doctrine/lexer", - "version": "v1.0", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "v1.0" + "reference": "bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94" }, "dist": { "type": "zip", - "url": "https://github.com/doctrine/lexer/archive/v1.0.zip", - "reference": "v1.0", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94", + "reference": "bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94", "shasum": "" }, "require": { "php": ">=5.3.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-0": { "Doctrine\\Common\\Lexer\\": "lib/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -239,7 +253,7 @@ { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", + "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" } ], @@ -249,7 +263,7 @@ "lexer", "parser" ], - "time": "2013-01-12 18:59:04" + "time": "2013-03-07 12:15:25" }, { "name": "doctrine/orm", @@ -257,12 +271,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "304acf0a1af15ebe049231b84a7630c75ecbe62d" + "reference": "de59307b8e8d689d7ca146feb52c62653e9b2b00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/304acf0a1af15ebe049231b84a7630c75ecbe62d", - "reference": "304acf0a1af15ebe049231b84a7630c75ecbe62d", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/de59307b8e8d689d7ca146feb52c62653e9b2b00", + "reference": "de59307b8e8d689d7ca146feb52c62653e9b2b00", "shasum": "" }, "require": { @@ -289,7 +303,7 @@ "Doctrine\\ORM": "lib/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -319,7 +333,7 @@ "database", "orm" ], - "time": "2013-02-21 18:03:42" + "time": "2013-06-30 08:43:27" }, { "name": "jms/composer-deps-analyzer", @@ -327,12 +341,12 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/composer-deps-analyzer.git", - "reference": "3170c1fba8067f18971972c55bcd52439206ba38" + "reference": "0.1.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/composer-deps-analyzer/zipball/3170c1fba8067f18971972c55bcd52439206ba38", - "reference": "3170c1fba8067f18971972c55bcd52439206ba38", + "url": "https://api.github.com/repos/schmittjoh/composer-deps-analyzer/zipball/0.1.0", + "reference": "0.1.0", "shasum": "" }, "require": { @@ -354,20 +368,20 @@ "Apache2" ], "description": "Builds a Dependency Graph from a composer.json file", - "time": "2013-01-21 16:28:25" + "time": "2013-05-15 18:04:27" }, { "name": "jms/metadata", - "version": "1.2.0-RC", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/schmittjoh/metadata", - "reference": "1.2.0-RC" + "url": "https://github.com/schmittjoh/metadata.git", + "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e" }, "dist": { "type": "zip", - "url": "https://github.com/schmittjoh/metadata/zipball/1.2.0-RC", - "reference": "1.2.0-RC", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", + "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", "shasum": "" }, "require": { @@ -379,7 +393,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.4.x-dev" } }, "autoload": { @@ -387,7 +401,7 @@ "Metadata\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "Apache" ], @@ -395,7 +409,7 @@ { "name": "Johannes M. Schmitt", "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", + "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" } ], @@ -406,7 +420,7 @@ "xml", "yaml" ], - "time": "2012-08-21 05:40:10" + "time": "2013-03-28 16:32:37" }, { "name": "jms/parser-lib", @@ -436,7 +450,7 @@ "JMS\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "Apache2" ], @@ -498,17 +512,17 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "0aded9426d08c920e299c302914f702fad6f8ee6" + "reference": "af613f8779fee306ef5bdbc224cd5217d1c73265" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/0aded9426d08c920e299c302914f702fad6f8ee6", - "reference": "0aded9426d08c920e299c302914f702fad6f8ee6", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/af613f8779fee306ef5bdbc224cd5217d1c73265", + "reference": "af613f8779fee306ef5bdbc224cd5217d1c73265", "shasum": "" }, "require": { "doctrine/annotations": "1.*", - "jms/metadata": ">=1.1.0,<1.3-dev", + "jms/metadata": "~1.1", "jms/parser-lib": "1.*", "php": ">=5.3.2", "phpcollection/phpcollection": ">=0.1,<0.3-dev" @@ -528,7 +542,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "0.12-dev" + "dev-master": "0.13-dev" } }, "autoload": { @@ -557,33 +571,39 @@ "serialization", "xml" ], - "time": "2013-03-01 10:16:05" + "time": "2013-07-29 10:26:34" }, { "name": "nikic/php-parser", "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/schmittjoh/PHP-Parser.git", - "reference": "958e1f4e2355ed22245920a8057a3d7c34a0fb4c" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "01123ae6af005009d1c5fd37e06130bd85aad5dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/PHP-Parser/zipball/958e1f4e2355ed22245920a8057a3d7c34a0fb4c", - "reference": "958e1f4e2355ed22245920a8057a3d7c34a0fb4c", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/01123ae6af005009d1c5fd37e06130bd85aad5dc", + "reference": "01123ae6af005009d1c5fd37e06130bd85aad5dc", "shasum": "" }, "require": { "php": ">=5.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9-dev" + } + }, "autoload": { "psr-0": { "PHPParser": "lib/" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD" + "BSD-3-Clause" ], "authors": [ { @@ -595,10 +615,7 @@ "parser", "php" ], - "support": { - "source": "https://github.com/schmittjoh/PHP-Parser/tree/master" - }, - "time": "2012-11-06 00:18:13" + "time": "2013-07-27 16:50:08" }, { "name": "phpcollection/phpcollection", @@ -606,12 +623,12 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/php-collection.git", - "reference": "3ce8ffb990e9511c7a843f20740373eb27e4c3bd" + "reference": "0.3.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/3ce8ffb990e9511c7a843f20740373eb27e4c3bd", - "reference": "3ce8ffb990e9511c7a843f20740373eb27e4c3bd", + "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/0.3.0", + "reference": "0.3.0", "shasum": "" }, "require": { @@ -628,7 +645,7 @@ "PhpCollection": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "Apache2" ], @@ -636,7 +653,7 @@ { "name": "Johannes M. Schmitt", "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", + "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" } ], @@ -648,7 +665,7 @@ "sequence", "set" ], - "time": "2013-02-25 13:15:41" + "time": "2013-07-16 08:26:26" }, { "name": "phpoption/phpoption", @@ -656,12 +673,12 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "c8829c3b675f17aa465557f721d909deb67d904f" + "reference": "1c7e8016289d17d83ced49c56d0f266fd0568941" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/c8829c3b675f17aa465557f721d909deb67d904f", - "reference": "c8829c3b675f17aa465557f721d909deb67d904f", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/1c7e8016289d17d83ced49c56d0f266fd0568941", + "reference": "1c7e8016289d17d83ced49c56d0f266fd0568941", "shasum": "" }, "require": { @@ -670,7 +687,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -697,7 +714,7 @@ "php", "type" ], - "time": "2013-03-03 09:30:51" + "time": "2013-05-19 11:09:35" }, { "name": "psr/log", @@ -743,17 +760,18 @@ "source": { "type": "git", "url": "https://github.com/scrutinizer-ci/utils.git", - "reference": "a2f336f59c37bbaa379e86bc1e452d05dd6b94df" + "reference": "b49c7e0117c1bff14b8f99d61a7cbf04b2d8f87c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scrutinizer-ci/utils/zipball/a2f336f59c37bbaa379e86bc1e452d05dd6b94df", - "reference": "a2f336f59c37bbaa379e86bc1e452d05dd6b94df", + "url": "https://api.github.com/repos/scrutinizer-ci/utils/zipball/b49c7e0117c1bff14b8f99d61a7cbf04b2d8f87c", + "reference": "b49c7e0117c1bff14b8f99d61a7cbf04b2d8f87c", "shasum": "" }, "require": { "php": ">=5.4", - "symfony/process": "2.*" + "symfony/process": "~2.0", + "symfony/yaml": "~2.0" }, "type": "library", "autoload": { @@ -762,7 +780,7 @@ } }, "notification-url": "https://packagist.org/downloads/", - "time": "2013-03-05 08:41:33" + "time": "2013-06-22 16:12:25" }, { "name": "symfony/config", @@ -771,21 +789,22 @@ "source": { "type": "git", "url": "https://github.com/symfony/Config.git", - "reference": "2b8694ad7f46072b154faaf5e74f2a06cb828fa7" + "reference": "1c24c71801c8f7d3b0c788d161a921d365db19bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Config/zipball/2b8694ad7f46072b154faaf5e74f2a06cb828fa7", - "reference": "2b8694ad7f46072b154faaf5e74f2a06cb828fa7", + "url": "https://api.github.com/repos/symfony/Config/zipball/1c24c71801c8f7d3b0c788d161a921d365db19bf", + "reference": "1c24c71801c8f7d3b0c788d161a921d365db19bf", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.3", + "symfony/filesystem": "~2.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -809,7 +828,7 @@ ], "description": "Symfony Config Component", "homepage": "http://symfony.com", - "time": "2013-03-01 10:42:20" + "time": "2013-07-21 20:19:01" }, { "name": "symfony/console", @@ -818,21 +837,27 @@ "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "fae82dad073a491b91a2ad6cda2ef5d8b19a5152" + "reference": "470446b34c029c7cd1933a55c9bdd887b9f5ec0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/fae82dad073a491b91a2ad6cda2ef5d8b19a5152", - "reference": "fae82dad073a491b91a2ad6cda2ef5d8b19a5152", + "url": "https://api.github.com/repos/symfony/Console/zipball/470446b34c029c7cd1933a55c9bdd887b9f5ec0d", + "reference": "470446b34c029c7cd1933a55c9bdd887b9f5ec0d", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "require-dev": { + "symfony/event-dispatcher": "~2.1" + }, + "suggest": { + "symfony/event-dispatcher": "" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -856,7 +881,7 @@ ], "description": "Symfony Console Component", "homepage": "http://symfony.com", - "time": "2013-03-01 06:43:27" + "time": "2013-07-21 20:19:01" }, { "name": "symfony/filesystem", @@ -865,12 +890,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Filesystem.git", - "reference": "414e4f741f2b0750a92925ada7a1864f94715388" + "reference": "59ee050f3dd735d040f6b02a1422c98050e13a20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/414e4f741f2b0750a92925ada7a1864f94715388", - "reference": "414e4f741f2b0750a92925ada7a1864f94715388", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/59ee050f3dd735d040f6b02a1422c98050e13a20", + "reference": "59ee050f3dd735d040f6b02a1422c98050e13a20", "shasum": "" }, "require": { @@ -879,7 +904,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -887,7 +912,7 @@ "Symfony\\Component\\Filesystem\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -903,7 +928,7 @@ ], "description": "Symfony Filesystem Component", "homepage": "http://symfony.com", - "time": "2013-01-31 21:39:01" + "time": "2013-07-21 20:19:01" }, { "name": "symfony/finder", @@ -912,12 +937,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Finder.git", - "reference": "0b33214ce24e33b6d11fd7de8784ff34ba16711f" + "reference": "6b6564a27b23daa5fa3dc12db7a4b0eeabf13f1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/0b33214ce24e33b6d11fd7de8784ff34ba16711f", - "reference": "0b33214ce24e33b6d11fd7de8784ff34ba16711f", + "url": "https://api.github.com/repos/symfony/Finder/zipball/6b6564a27b23daa5fa3dc12db7a4b0eeabf13f1f", + "reference": "6b6564a27b23daa5fa3dc12db7a4b0eeabf13f1f", "shasum": "" }, "require": { @@ -926,7 +951,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -950,7 +975,7 @@ ], "description": "Symfony Finder Component", "homepage": "http://symfony.com", - "time": "2013-03-01 06:43:27" + "time": "2013-07-21 20:19:01" }, { "name": "symfony/process", @@ -959,12 +984,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Process.git", - "reference": "6ebe4ba544cfc0dd25bfe49402da4d5267ee1b43" + "reference": "808d38aba6063f7e04d1592d923bbf3a007ef54d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/6ebe4ba544cfc0dd25bfe49402da4d5267ee1b43", - "reference": "6ebe4ba544cfc0dd25bfe49402da4d5267ee1b43", + "url": "https://api.github.com/repos/symfony/Process/zipball/808d38aba6063f7e04d1592d923bbf3a007ef54d", + "reference": "808d38aba6063f7e04d1592d923bbf3a007ef54d", "shasum": "" }, "require": { @@ -973,7 +998,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -981,7 +1006,7 @@ "Symfony\\Component\\Process\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -997,7 +1022,54 @@ ], "description": "Symfony Process Component", "homepage": "http://symfony.com", - "time": "2013-02-18 21:28:20" + "time": "2013-07-21 20:19:01" + }, + { + "name": "symfony/yaml", + "version": "dev-master", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "4d80b4f4c447e8ad7cab8b3afb0b51aad0431f7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/4d80b4f4c447e8ad7cab8b3afb0b51aad0431f7f", + "reference": "4d80b4f4c447e8ad7cab8b3afb0b51aad0431f7f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2013-07-21 20:19:01" } ], "packages-dev": [ @@ -1007,12 +1079,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "689bc2ae2a41dff1107d9d50e2daa4c349222869" + "reference": "b4a135c7db56ecc4602b54a2184368f440cac33e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/689bc2ae2a41dff1107d9d50e2daa4c349222869", - "reference": "689bc2ae2a41dff1107d9d50e2daa4c349222869", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/b4a135c7db56ecc4602b54a2184368f440cac33e", + "reference": "b4a135c7db56ecc4602b54a2184368f440cac33e", "shasum": "" }, "require": { @@ -1054,7 +1126,7 @@ "keywords": [ "database" ], - "time": "2013-02-12 02:52:36" + "time": "2013-07-10 17:04:07" } ], "aliases": [ @@ -1065,6 +1137,7 @@ "scrutinizer/utils": 20, "jms/composer-deps-analyzer": 20, "jms/php-manipulator": 20, + "jms/serializer": 20, "nikic/php-parser": 20, "doctrine/data-fixtures": 20 }, From 28a04993bc9a1a685f999f28ef455b5ead5227cc Mon Sep 17 00:00:00 2001 From: till Date: Thu, 15 Aug 2013 15:15:16 +0200 Subject: [PATCH 32/62] Enhancement: ignore .phar file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d27d80d..77173b9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ phpunit.xml vendor/ +composer.phar From 4f51740516abdc5483c09efd56edfda5c3ddd97b Mon Sep 17 00:00:00 2001 From: till Date: Thu, 15 Aug 2013 15:16:03 +0200 Subject: [PATCH 33/62] Bugfix: skip files which are links * example use-case: bin roles from a composer installed package create symlinks inside the project. when this symlink is followed and the path is expanded (`$file->getRealPath()`) it barfs --- src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php index c5bb5a8..5072869 100644 --- a/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php +++ b/src/Scrutinizer/PhpAnalyzer/Model/FileCollection.php @@ -141,6 +141,11 @@ public static function createFromTraversable(\Traversable $traversable, $basePat $memoryThreshold = self::getMemoryThreshold(); foreach ($traversable as $file) { assert($file instanceof SplFileInfo); + + if ($file->isLink()) { + continue; + } + $col->add(File::create(substr($file->getRealPath(), $prefixLength), $file->getContents())); if ($i % 50 === 0 && $memoryThreshold < $memoryUsage = memory_get_usage()) { From 4bce8e2b13abc49af3dab308c1c69174073e06d9 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Sat, 2 Nov 2013 11:52:07 +0100 Subject: [PATCH 34/62] updates vendors --- composer.json | 2 +- composer.lock | 403 ++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 307 insertions(+), 98 deletions(-) diff --git a/composer.json b/composer.json index bea543c..c9eadf3 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "jms/parser-lib": "1.*", "jms/serializer": "dev-master", "nikic/php-parser": "dev-master", - "doctrine/common": "2.3.*", + "doctrine/common": "~2.3", "doctrine/dbal": "*", "doctrine/orm": "*", "symfony/finder": "2.*", diff --git a/composer.lock b/composer.lock index df6bd89..9c79388 100644 --- a/composer.lock +++ b/composer.lock @@ -3,7 +3,7 @@ "This file locks the dependencies of your project to a known state", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" ], - "hash": "06b34d0ce334f853551f91977a81cbe7", + "hash": "fe5babf26ef26e1509d7c8084daf2a9c", "packages": [ { "name": "doctrine/annotations", @@ -11,12 +11,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "v1.1.2" + "reference": "40db0c96985aab2822edbc4848b3bd2429e02670" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/v1.1.2", - "reference": "v1.1.2", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/40db0c96985aab2822edbc4848b3bd2429e02670", + "reference": "40db0c96985aab2822edbc4848b3bd2429e02670", "shasum": "" }, "require": { @@ -76,32 +76,178 @@ ], "time": "2013-06-16 21:33:03" }, + { + "name": "doctrine/cache", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "e16d7adf45664a50fa86f515b6d5e7f670130449" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/e16d7adf45664a50fa86f515b6d5e7f670130449", + "reference": "e16d7adf45664a50fa86f515b6d5e7f670130449", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "phpunit/phpunit": ">=3.7", + "satooshi/php-coveralls": "~0.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Cache\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/", + "role": "Creator" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2013-10-25 19:04:14" + }, + { + "name": "doctrine/collections", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "bcb53776a096a0c64579cc8d8ec0db62f1109fbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/bcb53776a096a0c64579cc8d8ec0db62f1109fbc", + "reference": "bcb53776a096a0c64579cc8d8ec0db62f1109fbc", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Collections\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Collections Abstraction library", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "array", + "collections", + "iterator" + ], + "time": "2013-08-29 16:56:45" + }, { "name": "doctrine/common", - "version": "2.3.x-dev", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "bb0aebbf234db52df476a2b473d434745b34221c" + "reference": "d9dea98243c733ff589aab10e321de4f14a63ab4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/bb0aebbf234db52df476a2b473d434745b34221c", - "reference": "bb0aebbf234db52df476a2b473d434745b34221c", + "url": "https://api.github.com/repos/doctrine/common/zipball/d9dea98243c733ff589aab10e321de4f14a63ab4", + "reference": "d9dea98243c733ff589aab10e321de4f14a63ab4", "shasum": "" }, "require": { + "doctrine/annotations": "1.*", + "doctrine/cache": "1.*", + "doctrine/collections": "1.*", + "doctrine/inflector": "1.*", + "doctrine/lexer": "1.*", "php": ">=5.3.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3.x-dev" + "dev-master": "2.5.x-dev" } }, "autoload": { "psr-0": { - "Doctrine\\Common": "lib/" + "Doctrine\\Common\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -143,35 +289,37 @@ "persistence", "spl" ], - "time": "2012-09-20 05:55:18" + "time": "2013-09-16 09:32:54" }, { "name": "doctrine/dbal", - "version": "2.3.x-dev", + "version": "2.4.x-dev", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "6a62fefefde6b2c0d8b3df70151d6a81fc028d28" + "reference": "9efdbcebea17506fb1cdb6b4687c23a6786d2e6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/6a62fefefde6b2c0d8b3df70151d6a81fc028d28", - "reference": "6a62fefefde6b2c0d8b3df70151d6a81fc028d28", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/9efdbcebea17506fb1cdb6b4687c23a6786d2e6b", + "reference": "9efdbcebea17506fb1cdb6b4687c23a6786d2e6b", "shasum": "" }, "require": { - "doctrine/common": ">=2.3.0,<2.5-dev", + "doctrine/common": "~2.4", "php": ">=5.3.2" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } + "require-dev": { + "phpunit/phpunit": "3.7.*", + "symfony/console": "~2.0" }, + "suggest": { + "symfony/console": "Allows use of the command line interface" + }, + "type": "library", "autoload": { "psr-0": { - "Doctrine\\DBAL": "lib/" + "Doctrine\\DBAL\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -206,7 +354,75 @@ "persistence", "queryobject" ], - "time": "2013-05-21 05:53:02" + "time": "2013-09-26 21:18:07" + }, + { + "name": "doctrine/inflector", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c", + "reference": "8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Inflector\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2013-04-10 16:14:30" }, { "name": "doctrine/lexer", @@ -267,23 +483,28 @@ }, { "name": "doctrine/orm", - "version": "2.3.x-dev", + "version": "2.4.x-dev", "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "de59307b8e8d689d7ca146feb52c62653e9b2b00" + "reference": "e82e7147fa5b7bbb5c9315885e5905521c00bc29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/de59307b8e8d689d7ca146feb52c62653e9b2b00", - "reference": "de59307b8e8d689d7ca146feb52c62653e9b2b00", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/e82e7147fa5b7bbb5c9315885e5905521c00bc29", + "reference": "e82e7147fa5b7bbb5c9315885e5905521c00bc29", "shasum": "" }, "require": { - "doctrine/dbal": "2.3.*", + "doctrine/collections": "~1.1", + "doctrine/dbal": "~2.4", "ext-pdo": "*", "php": ">=5.3.2", - "symfony/console": "2.*" + "symfony/console": "~2.0" + }, + "require-dev": { + "satooshi/php-coveralls": "dev-master", + "symfony/yaml": "~2.1" }, "suggest": { "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" @@ -295,12 +516,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3.x-dev" + "dev-master": "2.4.x-dev" } }, "autoload": { "psr-0": { - "Doctrine\\ORM": "lib/" + "Doctrine\\ORM\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -333,7 +554,7 @@ "database", "orm" ], - "time": "2013-06-30 08:43:27" + "time": "2013-10-29 08:25:13" }, { "name": "jms/composer-deps-analyzer", @@ -341,12 +562,12 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/composer-deps-analyzer.git", - "reference": "0.1.0" + "reference": "912227ebdca09ca8bd67509645ac6318a136aa46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/composer-deps-analyzer/zipball/0.1.0", - "reference": "0.1.0", + "url": "https://api.github.com/repos/schmittjoh/composer-deps-analyzer/zipball/912227ebdca09ca8bd67509645ac6318a136aa46", + "reference": "912227ebdca09ca8bd67509645ac6318a136aa46", "shasum": "" }, "require": { @@ -376,19 +597,19 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/metadata.git", - "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e" + "reference": "5dcd47c8b8ff98963663388a13cdb5f1b4cc2a5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", - "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/5dcd47c8b8ff98963663388a13cdb5f1b4cc2a5c", + "reference": "5dcd47c8b8ff98963663388a13cdb5f1b4cc2a5c", "shasum": "" }, "require": { "php": ">=5.3.0" }, "require-dev": { - "doctrine/common": ">=2.0,<2.4-dev" + "doctrine/cache": "~1.0" }, "type": "library", "extra": { @@ -420,7 +641,7 @@ "xml", "yaml" ], - "time": "2013-03-28 16:32:37" + "time": "2013-10-28 16:45:34" }, { "name": "jms/parser-lib", @@ -428,12 +649,12 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/parser-lib.git", - "reference": "4d469a70c6dd03f921cbdeadafbcb261bb23e8b0" + "reference": "d5961fa3fa039aa5ee0e50021c6681ba949e360c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/4d469a70c6dd03f921cbdeadafbcb261bb23e8b0", - "reference": "4d469a70c6dd03f921cbdeadafbcb261bb23e8b0", + "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/d5961fa3fa039aa5ee0e50021c6681ba949e360c", + "reference": "d5961fa3fa039aa5ee0e50021c6681ba949e360c", "shasum": "" }, "require": { @@ -455,7 +676,7 @@ "Apache2" ], "description": "A library for easily creating recursive-descent parsers.", - "time": "2012-11-30 08:11:04" + "time": "2013-08-09 15:53:02" }, { "name": "jms/php-manipulator", @@ -512,12 +733,12 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "af613f8779fee306ef5bdbc224cd5217d1c73265" + "reference": "3eeb721fe0144971bc49bc8a7cb9b362d2c27780" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/af613f8779fee306ef5bdbc224cd5217d1c73265", - "reference": "af613f8779fee306ef5bdbc224cd5217d1c73265", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/3eeb721fe0144971bc49bc8a7cb9b362d2c27780", + "reference": "3eeb721fe0144971bc49bc8a7cb9b362d2c27780", "shasum": "" }, "require": { @@ -529,6 +750,7 @@ }, "require-dev": { "doctrine/orm": ">=2.1,<2.4-dev", + "propel/propel1": "~1.7", "symfony/filesystem": "2.*", "symfony/form": ">=2.1,<2.2-dev", "symfony/translation": ">=2.0,<2.2-dev", @@ -542,7 +764,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "0.13-dev" + "dev-master": "0.14-dev" } }, "autoload": { @@ -571,7 +793,7 @@ "serialization", "xml" ], - "time": "2013-07-29 10:26:34" + "time": "2013-10-31 10:46:05" }, { "name": "nikic/php-parser", @@ -620,12 +842,12 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/php-collection.git", - "reference": "0.3.0" + "reference": "5c8ec0d1091c95b973b59a3bf0eb19c5de72d8d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/0.3.0", - "reference": "0.3.0", + "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/5c8ec0d1091c95b973b59a3bf0eb19c5de72d8d1", + "reference": "5c8ec0d1091c95b973b59a3bf0eb19c5de72d8d1", "shasum": "" }, "require": { @@ -662,7 +884,7 @@ "sequence", "set" ], - "time": "2013-07-16 08:26:26" + "time": "2013-08-22 09:46:14" }, { "name": "phpoption/phpoption", @@ -786,12 +1008,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Config.git", - "reference": "1c24c71801c8f7d3b0c788d161a921d365db19bf" + "reference": "a199b9784fadfe18590db3d240904b127a78e718" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Config/zipball/1c24c71801c8f7d3b0c788d161a921d365db19bf", - "reference": "1c24c71801c8f7d3b0c788d161a921d365db19bf", + "url": "https://api.github.com/repos/symfony/Config/zipball/a199b9784fadfe18590db3d240904b127a78e718", + "reference": "a199b9784fadfe18590db3d240904b127a78e718", "shasum": "" }, "require": { @@ -825,7 +1047,7 @@ ], "description": "Symfony Config Component", "homepage": "http://symfony.com", - "time": "2013-07-21 20:19:01" + "time": "2013-10-31 19:29:46" }, { "name": "symfony/console", @@ -834,12 +1056,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "470446b34c029c7cd1933a55c9bdd887b9f5ec0d" + "reference": "92cdb410d68c7b6ccb6eb38ad0ffe4e2d1cd9a2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/470446b34c029c7cd1933a55c9bdd887b9f5ec0d", - "reference": "470446b34c029c7cd1933a55c9bdd887b9f5ec0d", + "url": "https://api.github.com/repos/symfony/Console/zipball/92cdb410d68c7b6ccb6eb38ad0ffe4e2d1cd9a2c", + "reference": "92cdb410d68c7b6ccb6eb38ad0ffe4e2d1cd9a2c", "shasum": "" }, "require": { @@ -878,7 +1100,7 @@ ], "description": "Symfony Console Component", "homepage": "http://symfony.com", - "time": "2013-07-21 20:19:01" + "time": "2013-10-31 16:40:24" }, { "name": "symfony/filesystem", @@ -887,12 +1109,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Filesystem.git", - "reference": "59ee050f3dd735d040f6b02a1422c98050e13a20" + "reference": "e558fd5d593ebe083dca199f52aed5374ab7b57a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/59ee050f3dd735d040f6b02a1422c98050e13a20", - "reference": "59ee050f3dd735d040f6b02a1422c98050e13a20", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/e558fd5d593ebe083dca199f52aed5374ab7b57a", + "reference": "e558fd5d593ebe083dca199f52aed5374ab7b57a", "shasum": "" }, "require": { @@ -925,7 +1147,7 @@ ], "description": "Symfony Filesystem Component", "homepage": "http://symfony.com", - "time": "2013-07-21 20:19:01" + "time": "2013-09-27 14:57:51" }, { "name": "symfony/finder", @@ -934,12 +1156,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Finder.git", - "reference": "6b6564a27b23daa5fa3dc12db7a4b0eeabf13f1f" + "reference": "e2ce3164ab58b4d54612e630571f158035ee8603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/6b6564a27b23daa5fa3dc12db7a4b0eeabf13f1f", - "reference": "6b6564a27b23daa5fa3dc12db7a4b0eeabf13f1f", + "url": "https://api.github.com/repos/symfony/Finder/zipball/e2ce3164ab58b4d54612e630571f158035ee8603", + "reference": "e2ce3164ab58b4d54612e630571f158035ee8603", "shasum": "" }, "require": { @@ -972,7 +1194,7 @@ ], "description": "Symfony Finder Component", "homepage": "http://symfony.com", - "time": "2013-07-21 20:19:01" + "time": "2013-09-19 09:47:34" }, { "name": "symfony/process", @@ -981,12 +1203,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Process.git", - "reference": "808d38aba6063f7e04d1592d923bbf3a007ef54d" + "reference": "225f6e85fbe7962f83c0ac7fe060bccac73d5709" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/808d38aba6063f7e04d1592d923bbf3a007ef54d", - "reference": "808d38aba6063f7e04d1592d923bbf3a007ef54d", + "url": "https://api.github.com/repos/symfony/Process/zipball/225f6e85fbe7962f83c0ac7fe060bccac73d5709", + "reference": "225f6e85fbe7962f83c0ac7fe060bccac73d5709", "shasum": "" }, "require": { @@ -1019,7 +1241,7 @@ ], "description": "Symfony Process Component", "homepage": "http://symfony.com", - "time": "2013-07-21 20:19:01" + "time": "2013-10-30 08:33:58" }, { "name": "symfony/yaml", @@ -1028,12 +1250,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", - "reference": "4d80b4f4c447e8ad7cab8b3afb0b51aad0431f7f" + "reference": "1f7cabb841e62ec49615bd965ac780fd994b3f64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/4d80b4f4c447e8ad7cab8b3afb0b51aad0431f7f", - "reference": "4d80b4f4c447e8ad7cab8b3afb0b51aad0431f7f", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/1f7cabb841e62ec49615bd965ac780fd994b3f64", + "reference": "1f7cabb841e62ec49615bd965ac780fd994b3f64", "shasum": "" }, "require": { @@ -1066,42 +1288,28 @@ ], "description": "Symfony Yaml Component", "homepage": "http://symfony.com", - "time": "2013-07-21 20:19:01" + "time": "2013-10-17 11:48:11" } ], "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "dev-master", + "version": "v1.0.0-ALPHA3", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "b4a135c7db56ecc4602b54a2184368f440cac33e" + "reference": "b29bad9738fada9486961f60542f2d2d77c7b501" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/b4a135c7db56ecc4602b54a2184368f440cac33e", - "reference": "b4a135c7db56ecc4602b54a2184368f440cac33e", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/b29bad9738fada9486961f60542f2d2d77c7b501", + "reference": "b29bad9738fada9486961f60542f2d2d77c7b501", "shasum": "" }, "require": { - "doctrine/common": ">=2.2,<2.5-dev", "php": ">=5.3.2" }, - "require-dev": { - "doctrine/orm": ">=2.2,<2.5-dev" - }, - "suggest": { - "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", - "doctrine/orm": "For loading ORM fixtures", - "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" - }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-0": { "Doctrine\\Common\\DataFixtures": "lib/" @@ -1115,7 +1323,8 @@ { "name": "Jonathan Wage", "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" + "homepage": "http://www.jwage.com/", + "role": "Creator" } ], "description": "Data Fixtures for all Doctrine Object Managers", @@ -1123,7 +1332,7 @@ "keywords": [ "database" ], - "time": "2013-07-10 17:04:07" + "time": "2012-09-20 10:26:34" } ], "aliases": [ From e0c8dda2fb656df2274914971a0d1b6d59c50d29 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Tue, 10 Dec 2013 17:35:06 -0800 Subject: [PATCH 35/62] Fix bin autoload.php detection when embedded via composer --- bin/phpalizer | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/phpalizer b/bin/phpalizer index c8fbd11..9ce9c8d 100755 --- a/bin/phpalizer +++ b/bin/phpalizer @@ -1,7 +1,8 @@ #!/usr/bin/env php Date: Wed, 11 Dec 2013 10:22:48 -0800 Subject: [PATCH 36/62] Add embedded instructions --- README.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e0fe3d3..c8e3bae 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,37 @@ Learn more in the [documentation](https://scrutinizer-ci.com/docs/tools/php/php- ## Installation +Please note that PHP Analyzer itself needs a PHP 5.4 runtime; this requirement only applies to the system that is +running PHP Analyzer, not the code that is analyzed. + +### Standalone + PHPAnalyzer can be installed via composer very easily: ``` composer create-project scrutinizer/php-analyzer:dev-master ``` -Please note that PHP Analyzer cannot be installed as a dependency of your root project currently, but -must be installed as a standalone project. Also, PHP Analyzer itself needs a PHP 5.4 runtime; this -requirement only applies to the system that is running PHP Analyzer, not the code that is analyzed. +### Embedded + +PHPAnalyzer can also be embedded in an existing project: + +```json +{ + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/schmittjoh/PHP-Parser" + } + ], + "require-dev": { + "scrutinizer/php-analyzer": "*@dev", + "scrutinizer/utils": "*@dev", + "jms/php-manipulator": "*@dev", + "nikic/php-parser": "*@dev" + } +} +``` ## Usage From 06e017997d483596a26eb2b8b2afe438508a27ba Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 22 Dec 2013 08:21:16 +0100 Subject: [PATCH 37/62] test against more runtimes --- .travis.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 717dad9..c071ec0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,16 @@ language: php +matrix: + allow_failures: + - hhvm + php: - 5.4 + - 5.5 + - hhvm before_script: - - curl -s http://getcomposer.org/installer | php - - php composer.phar install --dev + - composer self-update - mysql -uroot -e "CREATE DATABASE php_analyzer CHARACTER SET utf8 COLLATE utf8_general_ci" - "sed -i 's/<\\!--//g' phpunit.xml.dist" - "sed -i 's/-->//g' phpunit.xml.dist" From 89762fb14c070f8f494b816cb1e70066853caf0e Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 22 Dec 2013 08:29:18 +0100 Subject: [PATCH 38/62] fixes travis file --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c071ec0..583b58f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: php matrix: allow_failures: - - hhvm + - hhvm: true php: - 5.4 From 597191a7949286228eca6680d8299459e14c5de7 Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 22 Dec 2013 08:30:48 +0100 Subject: [PATCH 39/62] another attempt at fixing Travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 583b58f..1aa57e6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ php: before_script: - composer self-update + - composer install --dev - mysql -uroot -e "CREATE DATABASE php_analyzer CHARACTER SET utf8 COLLATE utf8_general_ci" - "sed -i 's/<\\!--//g' phpunit.xml.dist" - "sed -i 's/-->//g' phpunit.xml.dist" From 6b932a7f2c893e11433722a8451911897101bd21 Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 22 Dec 2013 17:25:53 +0100 Subject: [PATCH 40/62] fixes .travis.yml (refs #44) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1aa57e6..1365efe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: php matrix: allow_failures: - - hhvm: true + - php: hhvm php: - 5.4 From fc14028c2fc611276d44169772e02668a51a5e1f Mon Sep 17 00:00:00 2001 From: Ciaran McNulty Date: Tue, 11 Feb 2014 11:19:38 +0000 Subject: [PATCH 41/62] Fixing optional parameter in fputs --- res/php-5.2-core-api/standard.php | 2 +- res/php-5.3-core-api/standard.php | 2 +- res/php-5.4-core-api/standard.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/res/php-5.2-core-api/standard.php b/res/php-5.2-core-api/standard.php index be97fe1..da13b10 100644 --- a/res/php-5.2-core-api/standard.php +++ b/res/php-5.2-core-api/standard.php @@ -6544,7 +6544,7 @@ function fwrite ($handle, $string, $length = null) {} * * @jms-builtin */ -function fputs ($fp, $str, $length) {} +function fputs ($fp, $str, $length = null) {} /** * Makes directory diff --git a/res/php-5.3-core-api/standard.php b/res/php-5.3-core-api/standard.php index 806fd92..0e58eb4 100644 --- a/res/php-5.3-core-api/standard.php +++ b/res/php-5.3-core-api/standard.php @@ -6427,7 +6427,7 @@ function fwrite ($handle, $string, $length = null) {} * * @jms-builtin */ -function fputs ($fp, $str, $length) {} +function fputs ($fp, $str, $length = null) {} /** * Makes directory diff --git a/res/php-5.4-core-api/standard.php b/res/php-5.4-core-api/standard.php index 1f0d10f..84df8a3 100644 --- a/res/php-5.4-core-api/standard.php +++ b/res/php-5.4-core-api/standard.php @@ -6887,7 +6887,7 @@ function fwrite ($handle, $string, $length = null) {} * @param $length [optional] * @jms-builtin */ -function fputs ($fp, $str, $length) {} +function fputs ($fp, $str, $length = null) {} /** * (PHP 4, PHP 5)
    From 0e92aa8a53a7a09eb41866e9d681db9739a899de Mon Sep 17 00:00:00 2001 From: Antonio Spinelli Date: Wed, 26 Feb 2014 08:53:19 -0300 Subject: [PATCH 42/62] fix optional parameters in number_format --- res/php-5.2-core-api/standard.php | 18 ++++++++++++------ res/php-5.3-core-api/standard.php | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/res/php-5.2-core-api/standard.php b/res/php-5.2-core-api/standard.php index da13b10..dbc9e98 100644 --- a/res/php-5.2-core-api/standard.php +++ b/res/php-5.2-core-api/standard.php @@ -3971,19 +3971,25 @@ function dechex ($number) {} function base_convert ($number, $frombase, $tobase) {} /** + * (PHP 4, PHP 5)
    * Format a number with grouped thousands - * @link http://www.php.net/manual/en/function.number-format.php - * @param number float

    + * @link http://php.net/manual/en/function.number-format.php + * @param float $number

    * The number being formatted. *

    - * @param decimals int[optional]

    + * @param int $decimals [optional]

    * Sets the number of decimal points. *

    - * @return string A formatted version of number. - * + * @param string $dec_point [optional]

    + * Sets the separator for the decimal point. + *

    + * @param string $thousands_sep [optional]

    + * Sets the thousands separator. + *

    + * @return string A formatted version of number. * @jms-builtin */ -function number_format ($number, $decimals = null) {} +function number_format ($number, $decimals = 0, $dec_point = '.', $thousands_sep = ',') {} /** * Returns the floating point remainder (modulo) of the division diff --git a/res/php-5.3-core-api/standard.php b/res/php-5.3-core-api/standard.php index 0e58eb4..be24acf 100644 --- a/res/php-5.3-core-api/standard.php +++ b/res/php-5.3-core-api/standard.php @@ -4021,19 +4021,25 @@ function dechex ($number) {} function base_convert ($number, $frombase, $tobase) {} /** + * (PHP 4, PHP 5)
    * Format a number with grouped thousands - * @link http://www.php.net/manual/en/function.number-format.php - * @param number float

    + * @link http://php.net/manual/en/function.number-format.php + * @param float $number

    * The number being formatted. *

    - * @param decimals int[optional]

    + * @param int $decimals [optional]

    * Sets the number of decimal points. *

    - * @return string A formatted version of number. - * + * @param string $dec_point [optional]

    + * Sets the separator for the decimal point. + *

    + * @param string $thousands_sep [optional]

    + * Sets the thousands separator. + *

    + * @return string A formatted version of number. * @jms-builtin */ -function number_format ($number, $decimals = null) {} +function number_format ($number, $decimals = 0, $dec_point = '.', $thousands_sep = ',') {} /** * Returns the floating point remainder (modulo) of the division From 805976d83c330977c0974352f860b7f63680d442 Mon Sep 17 00:00:00 2001 From: addshore Date: Thu, 27 Feb 2014 18:24:30 +0100 Subject: [PATCH 43/62] Move enabled check to analyze method in LoopMustUseBracesPass --- .../Pass/LoopsMustUseBracesPass.php | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/Scrutinizer/PhpAnalyzer/Pass/LoopsMustUseBracesPass.php b/src/Scrutinizer/PhpAnalyzer/Pass/LoopsMustUseBracesPass.php index 46d8174..477b565 100644 --- a/src/Scrutinizer/PhpAnalyzer/Pass/LoopsMustUseBracesPass.php +++ b/src/Scrutinizer/PhpAnalyzer/Pass/LoopsMustUseBracesPass.php @@ -18,16 +18,46 @@ namespace Scrutinizer\PhpAnalyzer\Pass; +use JMS\PhpManipulator\TokenStream; +use Scrutinizer\PhpAnalyzer\Analyzer; +use Scrutinizer\PhpAnalyzer\AnalyzerAwareInterface; use Scrutinizer\PhpAnalyzer\Config\NodeBuilder; use JMS\PhpManipulator\TokenStream\PhpToken; use Scrutinizer\PhpAnalyzer\Model\Comment; +use Scrutinizer\PhpAnalyzer\Model\File; +use Scrutinizer\PhpAnalyzer\Model\PhpFile; use Symfony\Component\Config\Definition\Builder\TreeBuilder; // TODO: This should either be removed completely, or moved to a general style check pass. -class LoopsMustUseBracesPass extends TokenStreamAnalyzerPass implements ConfigurablePassInterface +class LoopsMustUseBracesPass implements ConfigurablePassInterface, AnalyzerAwareInterface { use ConfigurableTrait; + protected $analyzer; + protected $phpFile; + protected $stream; + + public function __construct() + { + $this->stream = new TokenStream(); + } + + public function setAnalyzer(Analyzer $analyzer) + { + $this->analyzer = $analyzer; + } + + public function analyze(File $file) + { + if (!$file instanceof PhpFile || !$this->getSetting('enabled')) { + return; + } + + $this->phpFile = $file; + $this->stream->setCode($file->getContent()); + $this->analyzeStream(); + } + public function getConfiguration() { $tb = new TreeBuilder(); @@ -41,10 +71,6 @@ public function getConfiguration() protected function analyzeStream() { - if ( ! $this->getSetting('enabled')) { - return; - } - while ($this->stream->moveNext()) { if ( ! $this->stream->token instanceof PhpToken) { continue; From e04acf0b9cc0f44dc04144b16d9b35604f0eeb30 Mon Sep 17 00:00:00 2001 From: Mathieu Rochette Date: Wed, 5 Mar 2014 23:12:44 +0100 Subject: [PATCH 44/62] Update Locale methods fix arguments default values & names --- res/php-5.4-core-api/intl.php | 84 +++++++++++++++++------------------ 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/res/php-5.4-core-api/intl.php b/res/php-5.4-core-api/intl.php index 5d42af5..10274a6 100644 --- a/res/php-5.4-core-api/intl.php +++ b/res/php-5.4-core-api/intl.php @@ -2206,110 +2206,110 @@ function locale_get_default () {} function locale_set_default ($name) {} /** - * @param $arg1 + * @param $locale * @jms-builtin */ -function locale_get_primary_language ($arg1) {} +function locale_get_primary_language ($locale) {} /** - * @param $arg1 + * @param $locale * @jms-builtin */ -function locale_get_script ($arg1) {} +function locale_get_script ($locale) {} /** - * @param $arg1 + * @param $locale * @jms-builtin */ -function locale_get_region ($arg1) {} +function locale_get_region ($locale) {} /** - * @param $arg1 + * @param $locale * @jms-builtin */ -function locale_get_keywords ($arg1) {} +function locale_get_keywords ($locale) {} /** - * @param $arg1 - * @param $arg2 + * @param $locale + * @param $in_locale * @jms-builtin */ -function locale_get_display_script ($arg1, $arg2) {} +function locale_get_display_script ($locale, $in_locale) {} /** - * @param $arg1 - * @param $arg2 + * @param $locale + * @param $in_locale * @jms-builtin */ -function locale_get_display_region ($arg1, $arg2) {} +function locale_get_display_region ($locale, $in_locale) {} /** - * @param $arg1 - * @param $arg2 + * @param $locale + * @param $in_locale * @jms-builtin */ -function locale_get_display_name ($arg1, $arg2) {} +function locale_get_display_name ($locale, $in_locale) {} /** - * @param $arg1 - * @param $arg2 + * @param $locale + * @param $in_locale * @jms-builtin */ -function locale_get_display_language ($arg1, $arg2) {} +function locale_get_display_language ($locale, $in_locale) {} /** - * @param $arg1 - * @param $arg2 + * @param $locale + * @param $in_locale * @jms-builtin */ -function locale_get_display_variant ($arg1, $arg2) {} +function locale_get_display_variant ($locale, $in_locale) {} /** - * @param $arg1 + * @param $subtags * @jms-builtin */ -function locale_compose ($arg1) {} +function locale_compose (array $subtags) {} /** - * @param $arg1 + * @param $locale * @jms-builtin */ -function locale_parse ($arg1) {} +function locale_parse ($locale) {} /** - * @param $arg1 + * @param $locale * @jms-builtin */ -function locale_get_all_variants ($arg1) {} +function locale_get_all_variants ($locale) {} /** - * @param $arg1 - * @param $arg2 - * @param $arg3 + * @param $langtag + * @param $locale + * @param $canonicalize * @jms-builtin */ -function locale_filter_matches ($arg1, $arg2, $arg3) {} +function locale_filter_matches ($langtag, $locale, $canonicalize = false) {} /** - * @param $arg1 + * @param $locale * @jms-builtin */ -function locale_canonicalize ($arg1) {} +function locale_canonicalize ($locale) {} /** - * @param $arg1 - * @param $arg2 - * @param $arg3 - * @param $arg4 + * @param $langtag + * @param $locale + * @param $canonicalize + * @param $default * @jms-builtin */ -function locale_lookup ($arg1, $arg2, $arg3, $arg4) {} +function locale_lookup ($langtag, $locale, $canonicalize = false, $default = null) {} /** - * @param $arg1 + * @param $header * @jms-builtin */ -function locale_accept_from_http ($arg1) {} +function locale_accept_from_http ($header) {} /** * @param $locale From 5b440f3f9706d3cb78dcf8d02d2bd416fc14e75a Mon Sep 17 00:00:00 2001 From: siad007 Date: Sat, 29 Mar 2014 21:05:28 +0100 Subject: [PATCH 45/62] added stubs for php-amqp --- res/php-5.2-core-api/AMQP.php | 28 ++ res/php-5.2-core-api/AMQPChannel.php | 179 +++++++++ res/php-5.2-core-api/AMQPChannelException.php | 14 + res/php-5.2-core-api/AMQPConnection.php | 290 ++++++++++++++ .../AMQPConnectionException.php | 14 + res/php-5.2-core-api/AMQPEnvelope.php | 194 ++++++++++ res/php-5.2-core-api/AMQPException.php | 14 + res/php-5.2-core-api/AMQPExchange.php | 240 ++++++++++++ .../AMQPExchangeException.php | 14 + res/php-5.2-core-api/AMQPQueue.php | 354 ++++++++++++++++++ res/php-5.2-core-api/AMQPQueueException.php | 14 + res/php-5.3-core-api/AMQP.php | 28 ++ res/php-5.3-core-api/AMQPChannel.php | 179 +++++++++ res/php-5.3-core-api/AMQPChannelException.php | 14 + res/php-5.3-core-api/AMQPConnection.php | 290 ++++++++++++++ .../AMQPConnectionException.php | 14 + res/php-5.3-core-api/AMQPEnvelope.php | 194 ++++++++++ res/php-5.3-core-api/AMQPException.php | 14 + res/php-5.3-core-api/AMQPExchange.php | 240 ++++++++++++ .../AMQPExchangeException.php | 14 + res/php-5.3-core-api/AMQPQueue.php | 354 ++++++++++++++++++ res/php-5.3-core-api/AMQPQueueException.php | 14 + res/php-5.4-core-api/AMQP.php | 28 ++ res/php-5.4-core-api/AMQPChannel.php | 179 +++++++++ res/php-5.4-core-api/AMQPChannelException.php | 14 + res/php-5.4-core-api/AMQPConnection.php | 290 ++++++++++++++ .../AMQPConnectionException.php | 14 + res/php-5.4-core-api/AMQPEnvelope.php | 194 ++++++++++ res/php-5.4-core-api/AMQPException.php | 14 + res/php-5.4-core-api/AMQPExchange.php | 240 ++++++++++++ .../AMQPExchangeException.php | 14 + res/php-5.4-core-api/AMQPQueue.php | 354 ++++++++++++++++++ res/php-5.4-core-api/AMQPQueueException.php | 14 + 33 files changed, 4065 insertions(+) create mode 100644 res/php-5.2-core-api/AMQP.php create mode 100644 res/php-5.2-core-api/AMQPChannel.php create mode 100644 res/php-5.2-core-api/AMQPChannelException.php create mode 100644 res/php-5.2-core-api/AMQPConnection.php create mode 100644 res/php-5.2-core-api/AMQPConnectionException.php create mode 100644 res/php-5.2-core-api/AMQPEnvelope.php create mode 100644 res/php-5.2-core-api/AMQPException.php create mode 100644 res/php-5.2-core-api/AMQPExchange.php create mode 100644 res/php-5.2-core-api/AMQPExchangeException.php create mode 100644 res/php-5.2-core-api/AMQPQueue.php create mode 100644 res/php-5.2-core-api/AMQPQueueException.php create mode 100644 res/php-5.3-core-api/AMQP.php create mode 100644 res/php-5.3-core-api/AMQPChannel.php create mode 100644 res/php-5.3-core-api/AMQPChannelException.php create mode 100644 res/php-5.3-core-api/AMQPConnection.php create mode 100644 res/php-5.3-core-api/AMQPConnectionException.php create mode 100644 res/php-5.3-core-api/AMQPEnvelope.php create mode 100644 res/php-5.3-core-api/AMQPException.php create mode 100644 res/php-5.3-core-api/AMQPExchange.php create mode 100644 res/php-5.3-core-api/AMQPExchangeException.php create mode 100644 res/php-5.3-core-api/AMQPQueue.php create mode 100644 res/php-5.3-core-api/AMQPQueueException.php create mode 100644 res/php-5.4-core-api/AMQP.php create mode 100644 res/php-5.4-core-api/AMQPChannel.php create mode 100644 res/php-5.4-core-api/AMQPChannelException.php create mode 100644 res/php-5.4-core-api/AMQPConnection.php create mode 100644 res/php-5.4-core-api/AMQPConnectionException.php create mode 100644 res/php-5.4-core-api/AMQPEnvelope.php create mode 100644 res/php-5.4-core-api/AMQPException.php create mode 100644 res/php-5.4-core-api/AMQPExchange.php create mode 100644 res/php-5.4-core-api/AMQPExchangeException.php create mode 100644 res/php-5.4-core-api/AMQPQueue.php create mode 100644 res/php-5.4-core-api/AMQPQueueException.php diff --git a/res/php-5.2-core-api/AMQP.php b/res/php-5.2-core-api/AMQP.php new file mode 100644 index 0000000..86f7739 --- /dev/null +++ b/res/php-5.2-core-api/AMQP.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/res/php-5.2-core-api/AMQPChannel.php b/res/php-5.2-core-api/AMQPChannel.php new file mode 100644 index 0000000..5c40d5d --- /dev/null +++ b/res/php-5.2-core-api/AMQPChannel.php @@ -0,0 +1,179 @@ + \ No newline at end of file diff --git a/res/php-5.2-core-api/AMQPChannelException.php b/res/php-5.2-core-api/AMQPChannelException.php new file mode 100644 index 0000000..db57c96 --- /dev/null +++ b/res/php-5.2-core-api/AMQPChannelException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.2-core-api/AMQPConnection.php b/res/php-5.2-core-api/AMQPConnection.php new file mode 100644 index 0000000..2f1c776 --- /dev/null +++ b/res/php-5.2-core-api/AMQPConnection.php @@ -0,0 +1,290 @@ + amqp.host The host to connect too. Note: Max 1024 characters. + * 'port' => amqp.port Port on the host. + * 'vhost' => amqp.vhost The virtual host on the host. Note: Max 128 characters. + * 'login' => amqp.login The login name to use. Note: Max 128 characters. + * 'password' => amqp.password Password. Note: Max 128 characters. + * 'read_timeout' => Timeout in for income activity. Note: 0 or greater seconds. May be fractional. + * 'write_timeout' => Timeout in for outcome activity. Note: 0 or greater seconds. May be fractional. + * 'connect_timeout' => Connection timeout. Note: 0 or greater seconds. May be fractional. + * ) + * + * @param array $credentials Optional array of credential information for + * connecting to the AMQP broker. + */ + public function __construct(array $credentials = array()) + { + } + + /** + * Closes the connection with the AMQP broker. + * + * This method will close an open connection with the AMQP broker. + * + * @return boolean true if connection was successfully closed, false otherwise. + */ + public function disconnect() + { + } + + /** + * Get the configured host. + * + * @return string The configured hostname of the broker + */ + public function getHost() + { + } + + /** + * Get the configured login. + * + * @return string The configured login as a string. + */ + public function getLogin() + { + } + + /** + * Get the configured password. + * + * @return string The configured password as a string. + */ + public function getPassword() + { + } + + /** + * Get the configured port. + * + * @return int The configured port as an integer. + */ + public function getPort() + { + } + + /** + * Get the configured vhost. + * + * @return string The configured virtual host as a string. + */ + public function getVhost() + { + } + + /** + * Check whether the connection to the AMQP broker is still valid. + * + * It does so by checking the return status of the last connect-command. + * + * @return boolean True if connected, false otherwise. + */ + public function isConnected() + { + } + + /** + * Establish a persistent connection with the AMQP broker. + * + * This method will initiate a connection with the AMQP broker + * or reuse an existing one if present. + * + * @throws AMQPConnectionException + * @return boolean TRUE on success or throws an exception on failure. + */ + public function pconnect() + { + } + + /** + * Closes a persistent connection with the AMQP broker. + * + * This method will close an open persistent connection with the AMQP + * broker. + * + * @return boolean true if connection was found and closed, + * false if no persistent connection with this host, + * port, vhost and login could be found, + */ + public function pdisconnect() + { + } + + /** + * Close any open connections and initiate a new one with the AMQP broker. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function reconnect() + { + } + + /** + * Set the hostname used to connect to the AMQP broker. + * + * @param string $host The hostname of the AMQP broker. + * + * @throws AMQPConnectionException If host is longer then 1024 characters. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setHost($host) + { + } + + /** + * Set the login string used to connect to the AMQP broker. + * + * @param string $login The login string used to authenticate + * with the AMQP broker. + * + * @throws AMQPConnectionException If login is longer then 32 characters. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setLogin($login) + { + } + + /** + * Set the password string used to connect to the AMQP broker. + * + * @param string $password The password string used to authenticate + * with the AMQP broker. + * + * @throws AMQPConnectionException If password is longer then 32characters. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setPassword($password) + { + } + + /** + * Set the port used to connect to the AMQP broker. + * + * @param integer $port The port used to connect to the AMQP broker. + * + * @throws AMQPConnectionException If port is longer not between + * 1 and 65535. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setPort($port) + { + } + + /** + * Sets the virtual host to which to connect on the AMQP broker. + * + * @param string $vhost The virtual host to use on the AMQP + * broker. + * + * @throws AMQPConnectionException If host is longer then 32 characters. + * + * @return boolean true on success or false on failure. + */ + public function setVhost($vhost) + { + } + + /** + * Sets the interval of time to wait for income activity from AMQP broker + * + * @deprecated use AMQPConnection::setReadTimout($timeout) instead + * + * @param int $timeout + * + * @return bool + */ + public function setTimeout($timeout) + { + } + + /** + * Get the configured interval of time to wait for income activity + * from AMQP broker + * + * @deprecated use AMQPConnection::getReadTimout() instead + * + * @return float + */ + public function getTimeout() + { + } + + /** + * Sets the interval of time to wait for income activity from AMQP broker + * + * @param int $timeout + * + * @return bool + */ + public function setReadTimeout($timeout) + { + } + + /** + * Get the configured interval of time to wait for income activity + * from AMQP broker + * + * @return float + */ + public function getReadTimeout() + { + } + + + /** + * Sets the interval of time to wait for outcome activity to AMQP broker + * + * @param int $timeout + * + * @return bool + */ + public function setWriteTimeout($timeout) + { + } + + /** + * Get the configured interval of time to wait for outcome activity + * to AMQP broker + * + * @return float + */ + public function getWriteTimeout() + { + } +} + +// End of AMQPConnection from php-amqp v.1.4.0beta2 +?> \ No newline at end of file diff --git a/res/php-5.2-core-api/AMQPConnectionException.php b/res/php-5.2-core-api/AMQPConnectionException.php new file mode 100644 index 0000000..b950421 --- /dev/null +++ b/res/php-5.2-core-api/AMQPConnectionException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.2-core-api/AMQPEnvelope.php b/res/php-5.2-core-api/AMQPEnvelope.php new file mode 100644 index 0000000..1c5fa40 --- /dev/null +++ b/res/php-5.2-core-api/AMQPEnvelope.php @@ -0,0 +1,194 @@ + \ No newline at end of file diff --git a/res/php-5.2-core-api/AMQPException.php b/res/php-5.2-core-api/AMQPException.php new file mode 100644 index 0000000..5e9017a --- /dev/null +++ b/res/php-5.2-core-api/AMQPException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.2-core-api/AMQPExchange.php b/res/php-5.2-core-api/AMQPExchange.php new file mode 100644 index 0000000..8dc5c3d --- /dev/null +++ b/res/php-5.2-core-api/AMQPExchange.php @@ -0,0 +1,240 @@ + \ No newline at end of file diff --git a/res/php-5.2-core-api/AMQPExchangeException.php b/res/php-5.2-core-api/AMQPExchangeException.php new file mode 100644 index 0000000..8612618 --- /dev/null +++ b/res/php-5.2-core-api/AMQPExchangeException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.2-core-api/AMQPQueue.php b/res/php-5.2-core-api/AMQPQueue.php new file mode 100644 index 0000000..1637e77 --- /dev/null +++ b/res/php-5.2-core-api/AMQPQueue.php @@ -0,0 +1,354 @@ + \ No newline at end of file diff --git a/res/php-5.2-core-api/AMQPQueueException.php b/res/php-5.2-core-api/AMQPQueueException.php new file mode 100644 index 0000000..cf741a1 --- /dev/null +++ b/res/php-5.2-core-api/AMQPQueueException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQP.php b/res/php-5.3-core-api/AMQP.php new file mode 100644 index 0000000..86f7739 --- /dev/null +++ b/res/php-5.3-core-api/AMQP.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQPChannel.php b/res/php-5.3-core-api/AMQPChannel.php new file mode 100644 index 0000000..5c40d5d --- /dev/null +++ b/res/php-5.3-core-api/AMQPChannel.php @@ -0,0 +1,179 @@ + \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQPChannelException.php b/res/php-5.3-core-api/AMQPChannelException.php new file mode 100644 index 0000000..db57c96 --- /dev/null +++ b/res/php-5.3-core-api/AMQPChannelException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQPConnection.php b/res/php-5.3-core-api/AMQPConnection.php new file mode 100644 index 0000000..2f1c776 --- /dev/null +++ b/res/php-5.3-core-api/AMQPConnection.php @@ -0,0 +1,290 @@ + amqp.host The host to connect too. Note: Max 1024 characters. + * 'port' => amqp.port Port on the host. + * 'vhost' => amqp.vhost The virtual host on the host. Note: Max 128 characters. + * 'login' => amqp.login The login name to use. Note: Max 128 characters. + * 'password' => amqp.password Password. Note: Max 128 characters. + * 'read_timeout' => Timeout in for income activity. Note: 0 or greater seconds. May be fractional. + * 'write_timeout' => Timeout in for outcome activity. Note: 0 or greater seconds. May be fractional. + * 'connect_timeout' => Connection timeout. Note: 0 or greater seconds. May be fractional. + * ) + * + * @param array $credentials Optional array of credential information for + * connecting to the AMQP broker. + */ + public function __construct(array $credentials = array()) + { + } + + /** + * Closes the connection with the AMQP broker. + * + * This method will close an open connection with the AMQP broker. + * + * @return boolean true if connection was successfully closed, false otherwise. + */ + public function disconnect() + { + } + + /** + * Get the configured host. + * + * @return string The configured hostname of the broker + */ + public function getHost() + { + } + + /** + * Get the configured login. + * + * @return string The configured login as a string. + */ + public function getLogin() + { + } + + /** + * Get the configured password. + * + * @return string The configured password as a string. + */ + public function getPassword() + { + } + + /** + * Get the configured port. + * + * @return int The configured port as an integer. + */ + public function getPort() + { + } + + /** + * Get the configured vhost. + * + * @return string The configured virtual host as a string. + */ + public function getVhost() + { + } + + /** + * Check whether the connection to the AMQP broker is still valid. + * + * It does so by checking the return status of the last connect-command. + * + * @return boolean True if connected, false otherwise. + */ + public function isConnected() + { + } + + /** + * Establish a persistent connection with the AMQP broker. + * + * This method will initiate a connection with the AMQP broker + * or reuse an existing one if present. + * + * @throws AMQPConnectionException + * @return boolean TRUE on success or throws an exception on failure. + */ + public function pconnect() + { + } + + /** + * Closes a persistent connection with the AMQP broker. + * + * This method will close an open persistent connection with the AMQP + * broker. + * + * @return boolean true if connection was found and closed, + * false if no persistent connection with this host, + * port, vhost and login could be found, + */ + public function pdisconnect() + { + } + + /** + * Close any open connections and initiate a new one with the AMQP broker. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function reconnect() + { + } + + /** + * Set the hostname used to connect to the AMQP broker. + * + * @param string $host The hostname of the AMQP broker. + * + * @throws AMQPConnectionException If host is longer then 1024 characters. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setHost($host) + { + } + + /** + * Set the login string used to connect to the AMQP broker. + * + * @param string $login The login string used to authenticate + * with the AMQP broker. + * + * @throws AMQPConnectionException If login is longer then 32 characters. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setLogin($login) + { + } + + /** + * Set the password string used to connect to the AMQP broker. + * + * @param string $password The password string used to authenticate + * with the AMQP broker. + * + * @throws AMQPConnectionException If password is longer then 32characters. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setPassword($password) + { + } + + /** + * Set the port used to connect to the AMQP broker. + * + * @param integer $port The port used to connect to the AMQP broker. + * + * @throws AMQPConnectionException If port is longer not between + * 1 and 65535. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setPort($port) + { + } + + /** + * Sets the virtual host to which to connect on the AMQP broker. + * + * @param string $vhost The virtual host to use on the AMQP + * broker. + * + * @throws AMQPConnectionException If host is longer then 32 characters. + * + * @return boolean true on success or false on failure. + */ + public function setVhost($vhost) + { + } + + /** + * Sets the interval of time to wait for income activity from AMQP broker + * + * @deprecated use AMQPConnection::setReadTimout($timeout) instead + * + * @param int $timeout + * + * @return bool + */ + public function setTimeout($timeout) + { + } + + /** + * Get the configured interval of time to wait for income activity + * from AMQP broker + * + * @deprecated use AMQPConnection::getReadTimout() instead + * + * @return float + */ + public function getTimeout() + { + } + + /** + * Sets the interval of time to wait for income activity from AMQP broker + * + * @param int $timeout + * + * @return bool + */ + public function setReadTimeout($timeout) + { + } + + /** + * Get the configured interval of time to wait for income activity + * from AMQP broker + * + * @return float + */ + public function getReadTimeout() + { + } + + + /** + * Sets the interval of time to wait for outcome activity to AMQP broker + * + * @param int $timeout + * + * @return bool + */ + public function setWriteTimeout($timeout) + { + } + + /** + * Get the configured interval of time to wait for outcome activity + * to AMQP broker + * + * @return float + */ + public function getWriteTimeout() + { + } +} + +// End of AMQPConnection from php-amqp v.1.4.0beta2 +?> \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQPConnectionException.php b/res/php-5.3-core-api/AMQPConnectionException.php new file mode 100644 index 0000000..b950421 --- /dev/null +++ b/res/php-5.3-core-api/AMQPConnectionException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQPEnvelope.php b/res/php-5.3-core-api/AMQPEnvelope.php new file mode 100644 index 0000000..1c5fa40 --- /dev/null +++ b/res/php-5.3-core-api/AMQPEnvelope.php @@ -0,0 +1,194 @@ + \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQPException.php b/res/php-5.3-core-api/AMQPException.php new file mode 100644 index 0000000..5e9017a --- /dev/null +++ b/res/php-5.3-core-api/AMQPException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQPExchange.php b/res/php-5.3-core-api/AMQPExchange.php new file mode 100644 index 0000000..8dc5c3d --- /dev/null +++ b/res/php-5.3-core-api/AMQPExchange.php @@ -0,0 +1,240 @@ + \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQPExchangeException.php b/res/php-5.3-core-api/AMQPExchangeException.php new file mode 100644 index 0000000..8612618 --- /dev/null +++ b/res/php-5.3-core-api/AMQPExchangeException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQPQueue.php b/res/php-5.3-core-api/AMQPQueue.php new file mode 100644 index 0000000..1637e77 --- /dev/null +++ b/res/php-5.3-core-api/AMQPQueue.php @@ -0,0 +1,354 @@ + \ No newline at end of file diff --git a/res/php-5.3-core-api/AMQPQueueException.php b/res/php-5.3-core-api/AMQPQueueException.php new file mode 100644 index 0000000..cf741a1 --- /dev/null +++ b/res/php-5.3-core-api/AMQPQueueException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQP.php b/res/php-5.4-core-api/AMQP.php new file mode 100644 index 0000000..86f7739 --- /dev/null +++ b/res/php-5.4-core-api/AMQP.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQPChannel.php b/res/php-5.4-core-api/AMQPChannel.php new file mode 100644 index 0000000..5c40d5d --- /dev/null +++ b/res/php-5.4-core-api/AMQPChannel.php @@ -0,0 +1,179 @@ + \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQPChannelException.php b/res/php-5.4-core-api/AMQPChannelException.php new file mode 100644 index 0000000..db57c96 --- /dev/null +++ b/res/php-5.4-core-api/AMQPChannelException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQPConnection.php b/res/php-5.4-core-api/AMQPConnection.php new file mode 100644 index 0000000..2f1c776 --- /dev/null +++ b/res/php-5.4-core-api/AMQPConnection.php @@ -0,0 +1,290 @@ + amqp.host The host to connect too. Note: Max 1024 characters. + * 'port' => amqp.port Port on the host. + * 'vhost' => amqp.vhost The virtual host on the host. Note: Max 128 characters. + * 'login' => amqp.login The login name to use. Note: Max 128 characters. + * 'password' => amqp.password Password. Note: Max 128 characters. + * 'read_timeout' => Timeout in for income activity. Note: 0 or greater seconds. May be fractional. + * 'write_timeout' => Timeout in for outcome activity. Note: 0 or greater seconds. May be fractional. + * 'connect_timeout' => Connection timeout. Note: 0 or greater seconds. May be fractional. + * ) + * + * @param array $credentials Optional array of credential information for + * connecting to the AMQP broker. + */ + public function __construct(array $credentials = array()) + { + } + + /** + * Closes the connection with the AMQP broker. + * + * This method will close an open connection with the AMQP broker. + * + * @return boolean true if connection was successfully closed, false otherwise. + */ + public function disconnect() + { + } + + /** + * Get the configured host. + * + * @return string The configured hostname of the broker + */ + public function getHost() + { + } + + /** + * Get the configured login. + * + * @return string The configured login as a string. + */ + public function getLogin() + { + } + + /** + * Get the configured password. + * + * @return string The configured password as a string. + */ + public function getPassword() + { + } + + /** + * Get the configured port. + * + * @return int The configured port as an integer. + */ + public function getPort() + { + } + + /** + * Get the configured vhost. + * + * @return string The configured virtual host as a string. + */ + public function getVhost() + { + } + + /** + * Check whether the connection to the AMQP broker is still valid. + * + * It does so by checking the return status of the last connect-command. + * + * @return boolean True if connected, false otherwise. + */ + public function isConnected() + { + } + + /** + * Establish a persistent connection with the AMQP broker. + * + * This method will initiate a connection with the AMQP broker + * or reuse an existing one if present. + * + * @throws AMQPConnectionException + * @return boolean TRUE on success or throws an exception on failure. + */ + public function pconnect() + { + } + + /** + * Closes a persistent connection with the AMQP broker. + * + * This method will close an open persistent connection with the AMQP + * broker. + * + * @return boolean true if connection was found and closed, + * false if no persistent connection with this host, + * port, vhost and login could be found, + */ + public function pdisconnect() + { + } + + /** + * Close any open connections and initiate a new one with the AMQP broker. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function reconnect() + { + } + + /** + * Set the hostname used to connect to the AMQP broker. + * + * @param string $host The hostname of the AMQP broker. + * + * @throws AMQPConnectionException If host is longer then 1024 characters. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setHost($host) + { + } + + /** + * Set the login string used to connect to the AMQP broker. + * + * @param string $login The login string used to authenticate + * with the AMQP broker. + * + * @throws AMQPConnectionException If login is longer then 32 characters. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setLogin($login) + { + } + + /** + * Set the password string used to connect to the AMQP broker. + * + * @param string $password The password string used to authenticate + * with the AMQP broker. + * + * @throws AMQPConnectionException If password is longer then 32characters. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setPassword($password) + { + } + + /** + * Set the port used to connect to the AMQP broker. + * + * @param integer $port The port used to connect to the AMQP broker. + * + * @throws AMQPConnectionException If port is longer not between + * 1 and 65535. + * + * @return boolean TRUE on success or FALSE on failure. + */ + public function setPort($port) + { + } + + /** + * Sets the virtual host to which to connect on the AMQP broker. + * + * @param string $vhost The virtual host to use on the AMQP + * broker. + * + * @throws AMQPConnectionException If host is longer then 32 characters. + * + * @return boolean true on success or false on failure. + */ + public function setVhost($vhost) + { + } + + /** + * Sets the interval of time to wait for income activity from AMQP broker + * + * @deprecated use AMQPConnection::setReadTimout($timeout) instead + * + * @param int $timeout + * + * @return bool + */ + public function setTimeout($timeout) + { + } + + /** + * Get the configured interval of time to wait for income activity + * from AMQP broker + * + * @deprecated use AMQPConnection::getReadTimout() instead + * + * @return float + */ + public function getTimeout() + { + } + + /** + * Sets the interval of time to wait for income activity from AMQP broker + * + * @param int $timeout + * + * @return bool + */ + public function setReadTimeout($timeout) + { + } + + /** + * Get the configured interval of time to wait for income activity + * from AMQP broker + * + * @return float + */ + public function getReadTimeout() + { + } + + + /** + * Sets the interval of time to wait for outcome activity to AMQP broker + * + * @param int $timeout + * + * @return bool + */ + public function setWriteTimeout($timeout) + { + } + + /** + * Get the configured interval of time to wait for outcome activity + * to AMQP broker + * + * @return float + */ + public function getWriteTimeout() + { + } +} + +// End of AMQPConnection from php-amqp v.1.4.0beta2 +?> \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQPConnectionException.php b/res/php-5.4-core-api/AMQPConnectionException.php new file mode 100644 index 0000000..b950421 --- /dev/null +++ b/res/php-5.4-core-api/AMQPConnectionException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQPEnvelope.php b/res/php-5.4-core-api/AMQPEnvelope.php new file mode 100644 index 0000000..1c5fa40 --- /dev/null +++ b/res/php-5.4-core-api/AMQPEnvelope.php @@ -0,0 +1,194 @@ + \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQPException.php b/res/php-5.4-core-api/AMQPException.php new file mode 100644 index 0000000..5e9017a --- /dev/null +++ b/res/php-5.4-core-api/AMQPException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQPExchange.php b/res/php-5.4-core-api/AMQPExchange.php new file mode 100644 index 0000000..8dc5c3d --- /dev/null +++ b/res/php-5.4-core-api/AMQPExchange.php @@ -0,0 +1,240 @@ + \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQPExchangeException.php b/res/php-5.4-core-api/AMQPExchangeException.php new file mode 100644 index 0000000..8612618 --- /dev/null +++ b/res/php-5.4-core-api/AMQPExchangeException.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQPQueue.php b/res/php-5.4-core-api/AMQPQueue.php new file mode 100644 index 0000000..1637e77 --- /dev/null +++ b/res/php-5.4-core-api/AMQPQueue.php @@ -0,0 +1,354 @@ + \ No newline at end of file diff --git a/res/php-5.4-core-api/AMQPQueueException.php b/res/php-5.4-core-api/AMQPQueueException.php new file mode 100644 index 0000000..cf741a1 --- /dev/null +++ b/res/php-5.4-core-api/AMQPQueueException.php @@ -0,0 +1,14 @@ + \ No newline at end of file From 7f2d612b1e63093e099d0b0c7bf7ca10bde9a9b3 Mon Sep 17 00:00:00 2001 From: siad007 Date: Sat, 29 Mar 2014 21:54:40 +0100 Subject: [PATCH 46/62] added stubs for uploadprogress --- res/php-5.2-core-api/uploadprogress.php | 12 ++++++++++++ res/php-5.3-core-api/uploadprogress.php | 12 ++++++++++++ res/php-5.4-core-api/uploadprogress.php | 12 ++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 res/php-5.2-core-api/uploadprogress.php create mode 100644 res/php-5.3-core-api/uploadprogress.php create mode 100644 res/php-5.4-core-api/uploadprogress.php diff --git a/res/php-5.2-core-api/uploadprogress.php b/res/php-5.2-core-api/uploadprogress.php new file mode 100644 index 0000000..23d860e --- /dev/null +++ b/res/php-5.2-core-api/uploadprogress.php @@ -0,0 +1,12 @@ + diff --git a/res/php-5.3-core-api/uploadprogress.php b/res/php-5.3-core-api/uploadprogress.php new file mode 100644 index 0000000..23d860e --- /dev/null +++ b/res/php-5.3-core-api/uploadprogress.php @@ -0,0 +1,12 @@ + diff --git a/res/php-5.4-core-api/uploadprogress.php b/res/php-5.4-core-api/uploadprogress.php new file mode 100644 index 0000000..23d860e --- /dev/null +++ b/res/php-5.4-core-api/uploadprogress.php @@ -0,0 +1,12 @@ + From 1a868010877035b313059e3ca11867d3549f4c48 Mon Sep 17 00:00:00 2001 From: siad007 Date: Sat, 29 Mar 2014 23:41:41 +0100 Subject: [PATCH 47/62] added AOP-PHP stub --- res/php-5.3-core-api/aop.php | 108 +++++++++++++++++++++++++++++++++++ res/php-5.4-core-api/aop.php | 108 +++++++++++++++++++++++++++++++++++ 2 files changed, 216 insertions(+) create mode 100644 res/php-5.3-core-api/aop.php create mode 100644 res/php-5.4-core-api/aop.php diff --git a/res/php-5.3-core-api/aop.php b/res/php-5.3-core-api/aop.php new file mode 100644 index 0000000..8fa7627 --- /dev/null +++ b/res/php-5.3-core-api/aop.php @@ -0,0 +1,108 @@ + diff --git a/res/php-5.4-core-api/aop.php b/res/php-5.4-core-api/aop.php new file mode 100644 index 0000000..8fa7627 --- /dev/null +++ b/res/php-5.4-core-api/aop.php @@ -0,0 +1,108 @@ + From dfe8135b1729a583a60e9c099529daa03d9a7297 Mon Sep 17 00:00:00 2001 From: siad007 Date: Sat, 29 Mar 2014 23:56:04 +0100 Subject: [PATCH 48/62] added ext-twig stub --- res/php-5.2-core-api/twig.php | 17 +++++++++++++++++ res/php-5.3-core-api/twig.php | 17 +++++++++++++++++ res/php-5.4-core-api/twig.php | 17 +++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 res/php-5.2-core-api/twig.php create mode 100644 res/php-5.3-core-api/twig.php create mode 100644 res/php-5.4-core-api/twig.php diff --git a/res/php-5.2-core-api/twig.php b/res/php-5.2-core-api/twig.php new file mode 100644 index 0000000..6c17f9a --- /dev/null +++ b/res/php-5.2-core-api/twig.php @@ -0,0 +1,17 @@ + diff --git a/res/php-5.3-core-api/twig.php b/res/php-5.3-core-api/twig.php new file mode 100644 index 0000000..6c17f9a --- /dev/null +++ b/res/php-5.3-core-api/twig.php @@ -0,0 +1,17 @@ + diff --git a/res/php-5.4-core-api/twig.php b/res/php-5.4-core-api/twig.php new file mode 100644 index 0000000..6c17f9a --- /dev/null +++ b/res/php-5.4-core-api/twig.php @@ -0,0 +1,17 @@ + From 67166a187331212827dac2f1b691eb8257eebb0b Mon Sep 17 00:00:00 2001 From: siad007 Date: Sun, 30 Mar 2014 00:18:05 +0100 Subject: [PATCH 49/62] added stubs for xslcache --- res/php-5.2-core-api/xslcache.php | 58 +++++++++++++++++++++++++++++++ res/php-5.3-core-api/xslcache.php | 58 +++++++++++++++++++++++++++++++ res/php-5.4-core-api/xslcache.php | 58 +++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 res/php-5.2-core-api/xslcache.php create mode 100644 res/php-5.3-core-api/xslcache.php create mode 100644 res/php-5.4-core-api/xslcache.php diff --git a/res/php-5.2-core-api/xslcache.php b/res/php-5.2-core-api/xslcache.php new file mode 100644 index 0000000..6c13744 --- /dev/null +++ b/res/php-5.2-core-api/xslcache.php @@ -0,0 +1,58 @@ + diff --git a/res/php-5.3-core-api/xslcache.php b/res/php-5.3-core-api/xslcache.php new file mode 100644 index 0000000..6c13744 --- /dev/null +++ b/res/php-5.3-core-api/xslcache.php @@ -0,0 +1,58 @@ + diff --git a/res/php-5.4-core-api/xslcache.php b/res/php-5.4-core-api/xslcache.php new file mode 100644 index 0000000..6c13744 --- /dev/null +++ b/res/php-5.4-core-api/xslcache.php @@ -0,0 +1,58 @@ + From 653dae9099b7c982970f556aa314429ff454e342 Mon Sep 17 00:00:00 2001 From: siad007 Date: Sun, 30 Mar 2014 01:54:11 +0100 Subject: [PATCH 50/62] added mongo stubs --- res/php-5.2-core-api/mongo.php | 4397 ++++++++++++++++++++++++++++++++ res/php-5.3-core-api/mongo.php | 4397 ++++++++++++++++++++++++++++++++ res/php-5.4-core-api/mongo.php | 4397 ++++++++++++++++++++++++++++++++ 3 files changed, 13191 insertions(+) create mode 100644 res/php-5.2-core-api/mongo.php create mode 100644 res/php-5.3-core-api/mongo.php create mode 100644 res/php-5.4-core-api/mongo.php diff --git a/res/php-5.2-core-api/mongo.php b/res/php-5.2-core-api/mongo.php new file mode 100644 index 0000000..b19dc53 --- /dev/null +++ b/res/php-5.2-core-api/mongo.php @@ -0,0 +1,4397 @@ + + * The database name. + *

    + * @return MongoDB a new db object. + */ + public function __get ($dbname) {} + + /** + * Gets a database + * @link http://www.php.net/manual/en/mongoclient.selectdb.php + * @param name string

    + * The database name. + *

    + * @return MongoDB a new database object. + */ + public function selectDB ($name) {} + + /** + * Gets a database collection + * @link http://www.php.net/manual/en/mongoclient.selectcollection.php + * @param db string

    + * The database name. + *

    + * @param collection string

    + * The collection name. + *

    + * @return MongoCollection a new collection object. + */ + public function selectCollection ($db, $collection) {} + + /** + * Get the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Drops a database [deprecated] + * @link http://www.php.net/manual/en/mongoclient.dropdb.php + * @param db mixed

    + * The database to drop. Can be a MongoDB object or the name of the database. + *

    + * @return array the database response. + */ + public function dropDB ($db) {} + + /** + * Lists all of the databases available. + * @link http://www.php.net/manual/en/mongoclient.listdbs.php + * @return array an associative array containing three fields. The first field is + * databases, which in turn contains an array. Each element + * of the array is an associative array corresponding to a database, giving th + * database's name, size, and if it's empty. The other two fields are + * totalSize (in bytes) and ok, which is 1 + * if this method ran successfully. + */ + public function listDBs () {} + + /** + * Updates status for all associated hosts + * @link http://www.php.net/manual/en/mongoclient.gethosts.php + * @return array an array of information about the hosts in the set. Includes each + * host's hostname, its health (1 is healthy), its state (1 is primary, 2 is + * secondary, 0 is anything else), the amount of time it took to ping the + * server, and when the last ping occurred. For example, on a three-member + * replica set, it might look something like: + */ + public function getHosts () {} + + /** + * Closes this connection + * @link http://www.php.net/manual/en/mongoclient.close.php + * @param connection boolean|string[optional]

    + * If connection is not given, or false then connection that would be + * selected for writes would be closed. In a single-node configuration, + * that is then the whole connection, but if you are connected to a + * replica set, close() will only close the + * connection to the primary server. + *

    + *

    + * If connection is true then all connections as known by the connection + * manager will be closed. This can include connections that are not + * referenced in the connection string used to create the object that + * you are calling close on. + *

    + *

    + * If connection is a string argument, then it will only close the + * connection identified by this hash. Hashes are identifiers for a + * connection and can be obtained by calling + * MongoClient::getConnections. + *

    + * @return bool if the connection was successfully closed. + */ + public function close ($connection = null) {} + + /** + * Kills a specific cursor on the server + * @link http://www.php.net/manual/en/mongoclient.killcursor.php + * @param server_hash string

    + * The server hash that has the cursor. This can be obtained through + * MongoCursor::info. + *

    + * @param id int|MongoInt64

    + * The ID of the cursor to kill. You can either supply an int + * containing the 64 bit cursor ID, or an object of the + * MongoInt64 class. The latter is necessary on 32 + * bit platforms (and Windows). + *

    + * @return bool true if the method attempted to kill a cursor, and false if + * there was something wrong with the arguments (such as a wrong + * server_hash). The return status does not + * reflect where the cursor was actually killed as the server does + * not provide that information. + */ + public static function killCursor ($server_hash, $id) {} + +} + +/** @jms-builtin */ +class Mongo extends MongoClient { + const DEFAULT_HOST = "localhost"; + const DEFAULT_PORT = 27017; + const VERSION = "1.5.0RC1"; + const RP_PRIMARY = "primary"; + const RP_PRIMARY_PREFERRED = "primaryPreferred"; + const RP_SECONDARY = "secondary"; + const RP_SECONDARY_PREFERRED = "secondaryPreferred"; + const RP_NEAREST = "nearest"; + + public $connected; + public $status; + protected $server; + protected $persistent; + + + /** + * The __construct purpose + * @link http://www.php.net/manual/en/mongo.construct.php + * @param server[optional] + * @param options[optional] + */ + public function __construct ($serverarray , $options) {} + + /** + * Connects with a database server + * @link http://www.php.net/manual/en/mongo.connectutil.php + * @return bool If the connection was successful. + */ + protected function connectUtil () {} + + /** + * Get slaveOkay setting for this connection + * @link http://www.php.net/manual/en/mongo.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this connection + * @link http://www.php.net/manual/en/mongo.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoClient instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + public function lastError () {} + + public function prevError () {} + + public function resetError () {} + + public function forceError () {} + + /** + * Returns the address being used by this for slaveOkay reads + * @link http://www.php.net/manual/en/mongo.getslave.php + * @return string The address of the secondary this connection is using for reads. + *

    + *

    + * This returns &null; if this is not connected to a replica set or not yet + * initialized. + */ + public function getSlave () {} + + /** + * Choose a new secondary for slaveOkay reads + * @link http://www.php.net/manual/en/mongo.switchslave.php + * @return string The address of the secondary this connection is using for reads. This may be + * the same as the previous address as addresses are randomly chosen. It may + * return only one address if only one secondary (or only the primary) is + * available. + *

    + *

    + * For example, if we had a three member replica set with a primary, secondary, + * and arbiter this method would always return the address of the secondary. + * If the secondary became unavailable, this method would always return the + * address of the primary. If the primary also became unavailable, this method + * would throw an exception, as an arbiter cannot handle reads. + */ + public function switchSlave () {} + + /** + * Set the size for future connection pools. + * @link http://www.php.net/manual/en/mongo.setpoolsize.php + * @param size int

    + * The max number of connections future pools will be able to create. + * Negative numbers mean that the pool will spawn an infinite number of + * connections. + *

    + * @return bool the former value of pool size. + */ + public static function setPoolSize ($size) {} + + /** + * Get pool size for connection pools + * @link http://www.php.net/manual/en/mongo.getpoolsize.php + * @return int the current pool size. + */ + public static function getPoolSize () {} + + /** + * Returns information about all connection pools. + * @link http://www.php.net/manual/en/mongo.pooldebug.php + * @return array Each connection pool has an identifier, which starts with the host. For each + * pool, this function shows the following fields: + * in use + *

    + * The number of connections currently being used by + * MongoClient instances. + *

    + * in pool + *

    + * The number of connections currently in the pool (not being used). + *

    + * remaining + *

    + * The number of connections that could be created by this pool. For + * example, suppose a pool had 5 connections remaining and 3 connections in + * the pool. We could create 8 new instances of + * MongoClient before we exhausted this pool + * (assuming no instances of MongoClient went out of + * scope, returning their connections to the pool). + *

    + *

    + * A negative number means that this pool will spawn unlimited connections. + *

    + *

    + * Before a pool is created, you can change the max number of connections by + * calling Mongo::setPoolSize. Once a pool is showing + * up in the output of this function, its size cannot be changed. + *

    + * timeout + *

    + * The socket timeout for connections in this pool. This is how long + * connections in this pool will attempt to connect to a server before + * giving up. + *

    + */ + public static function poolDebug () {} + + /** + * Return info about all open connections + * @link http://www.php.net/manual/en/mongoclient.getconnections.php + * @return array An array of open connections. + */ + public static function getConnections () {} + + /** + * Connects to a database server + * @link http://www.php.net/manual/en/mongoclient.connect.php + * @return bool If the connection was successful. + */ + public function connect () {} + + /** + * String representation of this connection + * @link http://www.php.net/manual/en/mongoclient.tostring.php + * @return string hostname and port for this connection. + */ + public function __toString () {} + + /** + * Gets a database + * @link http://www.php.net/manual/en/mongoclient.get.php + * @param dbname string

    + * The database name. + *

    + * @return MongoDB a new db object. + */ + public function __get ($dbname) {} + + /** + * Gets a database + * @link http://www.php.net/manual/en/mongoclient.selectdb.php + * @param name string

    + * The database name. + *

    + * @return MongoDB a new database object. + */ + public function selectDB ($name) {} + + /** + * Gets a database collection + * @link http://www.php.net/manual/en/mongoclient.selectcollection.php + * @param db string

    + * The database name. + *

    + * @param collection string

    + * The collection name. + *

    + * @return MongoCollection a new collection object. + */ + public function selectCollection ($db, $collection) {} + + /** + * Get the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Drops a database [deprecated] + * @link http://www.php.net/manual/en/mongoclient.dropdb.php + * @param db mixed

    + * The database to drop. Can be a MongoDB object or the name of the database. + *

    + * @return array the database response. + */ + public function dropDB ($db) {} + + /** + * Lists all of the databases available. + * @link http://www.php.net/manual/en/mongoclient.listdbs.php + * @return array an associative array containing three fields. The first field is + * databases, which in turn contains an array. Each element + * of the array is an associative array corresponding to a database, giving th + * database's name, size, and if it's empty. The other two fields are + * totalSize (in bytes) and ok, which is 1 + * if this method ran successfully. + */ + public function listDBs () {} + + /** + * Updates status for all associated hosts + * @link http://www.php.net/manual/en/mongoclient.gethosts.php + * @return array an array of information about the hosts in the set. Includes each + * host's hostname, its health (1 is healthy), its state (1 is primary, 2 is + * secondary, 0 is anything else), the amount of time it took to ping the + * server, and when the last ping occurred. For example, on a three-member + * replica set, it might look something like: + */ + public function getHosts () {} + + /** + * Closes this connection + * @link http://www.php.net/manual/en/mongoclient.close.php + * @param connection boolean|string[optional]

    + * If connection is not given, or false then connection that would be + * selected for writes would be closed. In a single-node configuration, + * that is then the whole connection, but if you are connected to a + * replica set, close() will only close the + * connection to the primary server. + *

    + *

    + * If connection is true then all connections as known by the connection + * manager will be closed. This can include connections that are not + * referenced in the connection string used to create the object that + * you are calling close on. + *

    + *

    + * If connection is a string argument, then it will only close the + * connection identified by this hash. Hashes are identifiers for a + * connection and can be obtained by calling + * MongoClient::getConnections. + *

    + * @return bool if the connection was successfully closed. + */ + public function close ($connection = null) {} + + /** + * Kills a specific cursor on the server + * @link http://www.php.net/manual/en/mongoclient.killcursor.php + * @param server_hash string

    + * The server hash that has the cursor. This can be obtained through + * MongoCursor::info. + *

    + * @param id int|MongoInt64

    + * The ID of the cursor to kill. You can either supply an int + * containing the 64 bit cursor ID, or an object of the + * MongoInt64 class. The latter is necessary on 32 + * bit platforms (and Windows). + *

    + * @return bool true if the method attempted to kill a cursor, and false if + * there was something wrong with the arguments (such as a wrong + * server_hash). The return status does not + * reflect where the cursor was actually killed as the server does + * not provide that information. + */ + public static function killCursor ($server_hash, $id) {} + +} + +/** @jms-builtin */ +class MongoDB { + const PROFILING_OFF = 0; + const PROFILING_SLOW = 1; + const PROFILING_ON = 2; + + public $w; + public $wtimeout; + + + /** + * Creates a new database + * @link http://www.php.net/manual/en/mongodb.construct.php + * @param connection MongoClient + * @param database_name + */ + public function __construct (MongoClient $connection, $database_name) {} + + /** + * The name of this database + * @link http://www.php.net/manual/en/mongodb.--tostring.php + * @return string this database's name. + */ + public function __toString () {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongodb.get.php + * @param name string

    + * The name of the collection. + *

    + * @return MongoCollection the collection. + */ + public function __get ($name) {} + + /** + * Fetches toolkit for dealing with files stored in this database + * @link http://www.php.net/manual/en/mongodb.getgridfs.php + * @param prefix string[optional]

    + * The prefix for the files and chunks collections. + *

    + * @return MongoGridFS a new gridfs object for this database. + */ + public function getGridFS ($prefix = null) {} + + /** + * Get slaveOkay setting for this database + * @link http://www.php.net/manual/en/mongodb.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this database + * @link http://www.php.net/manual/en/mongodb.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoDB instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + /** + * Get the read preference for this database + * @link http://www.php.net/manual/en/mongodb.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this database + * @link http://www.php.net/manual/en/mongodb.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Get the write concern for this database + * @link http://www.php.net/manual/en/mongodb.getwriteconcern.php + * @return array + */ + public function getWriteConcern () {} + + /** + * Set the write concern for this database + * @link http://www.php.net/manual/en/mongodb.setwriteconcern.php + * @param w mixed + * @param wtimeout int[optional] + * @return bool + */ + public function setWriteConcern ($w, $wtimeout = null) {} + + /** + * Gets this database's profiling level + * @link http://www.php.net/manual/en/mongodb.getprofilinglevel.php + * @return int the profiling level. + */ + public function getProfilingLevel () {} + + /** + * Sets this database's profiling level + * @link http://www.php.net/manual/en/mongodb.setprofilinglevel.php + * @param level int

    + * Profiling level. + *

    + * @return int the previous profiling level. + */ + public function setProfilingLevel ($level) {} + + /** + * Drops this database + * @link http://www.php.net/manual/en/mongodb.drop.php + * @return array the database response. + */ + public function drop () {} + + /** + * Repairs and compacts this database + * @link http://www.php.net/manual/en/mongodb.repair.php + * @param preserve_cloned_files bool[optional]

    + * If cloned files should be kept if the repair fails. + *

    + * @param backup_original_files bool[optional]

    + * If original files should be backed up. + *

    + * @return array db response. + */ + public function repair ($preserve_cloned_files = null, $backup_original_files = null) {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongodb.selectcollection.php + * @param name string

    + * The collection name. + *

    + * @return MongoCollection a new collection object. + */ + public function selectCollection ($name) {} + + /** + * Creates a collection + * @link http://www.php.net/manual/en/mongodb.createcollection.php + * @param name string

    + * The name of the collection. + *

    + * @param options array[optional]

    + * An array containing options for the collections. Each option is its own + * element in the options array, with the option name listed below being + * the key of the element. The supported options depend on the MongoDB + * server version. At the moment, the following options are supported: + *

    + *

    + * capped + *

    + * If the collection should be a fixed size. + *

    + * @return MongoCollection a collection object representing the new collection. + */ + public function createCollection ($name, array $options = null) {} + + /** + * Drops a collection [deprecated] + * @link http://www.php.net/manual/en/mongodb.dropcollection.php + * @param coll mixed

    + * MongoCollection or name of collection to drop. + *

    + * @return array the database response. + */ + public function dropCollection ($coll) {} + + /** + * Gets an array of all MongoCollections for this database + * @link http://www.php.net/manual/en/mongodb.listcollections.php + * @param includeSystemCollections bool[optional]

    + * Include system collections. + *

    + * @return array an array of MongoCollection objects. + */ + public function listCollections ($includeSystemCollections = null) {} + + /** + * Get all collections from this database + * @link http://www.php.net/manual/en/mongodb.getcollectionnames.php + * @param includeSystemCollections bool[optional]

    + * Include system collections. + *

    + * @return array the names of the all the collections in the database as an array. + */ + public function getCollectionNames ($includeSystemCollections = null) {} + + /** + * Creates a database reference + * @link http://www.php.net/manual/en/mongodb.createdbref.php + * @param collection string

    + * The collection to which the database reference will point. + *

    + * @param document_or_id mixed

    + * If an array or object is given, its _id field will be + * used as the reference ID. If a MongoId or scalar + * is given, it will be used as the reference ID. + *

    + * @return array a database reference array. + *

    + *

    + * If an array without an _id field was provided as the + * document_or_id parameter, &null; will be returned. + */ + public function createDBRef ($collection, $document_or_id) {} + + /** + * Fetches the document pointed to by a database reference + * @link http://www.php.net/manual/en/mongodb.getdbref.php + * @param ref array

    + * A database reference. + *

    + * @return array the document pointed to by the reference. + */ + public function getDBRef (array $ref) {} + + /** + * Runs JavaScript code on the database server. + * @link http://www.php.net/manual/en/mongodb.execute.php + * @param code mixed

    + * MongoCode or string to execute. + *

    + * @param args array[optional]

    + * Arguments to be passed to code. + *

    + * @return array the result of the evaluation. + */ + public function execute ($code, array $args = null) {} + + /** + * Execute a database command + * @link http://www.php.net/manual/en/mongodb.command.php + * @param command array

    + * The query to send. + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.timeout; + *

    + * @return array database response. Every database response is always maximum one + * document, which means that the result of a database command can never + * exceed 16MB. The resulting document's structure depends on the command, but + * most results will have the ok field to indicate success + * or failure and results containing an array of each of + * the resulting documents. + */ + public function command (array $command, array $options = null) {} + + /** + * Check if there was an error on the most recent db operation performed + * @link http://www.php.net/manual/en/mongodb.lasterror.php + * @return array the error, if there was one. + */ + public function lastError () {} + + /** + * Checks for the last error thrown during a database operation + * @link http://www.php.net/manual/en/mongodb.preverror.php + * @return array the error and the number of operations ago it occurred. + */ + public function prevError () {} + + /** + * Clears any flagged errors on the database + * @link http://www.php.net/manual/en/mongodb.reseterror.php + * @return array the database response. + */ + public function resetError () {} + + /** + * Creates a database error + * @link http://www.php.net/manual/en/mongodb.forceerror.php + * @return bool the database response. + */ + public function forceError () {} + + /** + * Log in to this database + * @link http://www.php.net/manual/en/mongodb.authenticate.php + * @param username string

    + * The username. + *

    + * @param password string

    + * The password (in plaintext). + *

    + * @return array database response. If the login was successful, it will return + * 1); + * ?> + * ]]> + * If something went wrong, it will return + * 0, "errmsg" => "auth fails"); + * ?> + * ]]> + * ("auth fails" could be another message, depending on database version and what + * when wrong). + */ + public function authenticate ($username, $password) {} + +} + +/** @jms-builtin */ +class MongoCollection { + const ASCENDING = 1; + const DESCENDING = -1; + + public $w; + public $wtimeout; + + + /** + * Creates a new collection + * @link http://www.php.net/manual/en/mongocollection.construct.php + * @param database MongoDB + * @param collection_name + */ + public function __construct (MongoDB $database, $collection_name) {} + + /** + * String representation of this collection + * @link http://www.php.net/manual/en/mongocollection.--tostring.php + * @return string the full name of this collection. + */ + public function __toString () {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongocollection.get.php + * @param name string

    + * The next string in the collection name. + *

    + * @return MongoCollection the collection. + */ + public function __get ($name) {} + + /** + * Returns this collection's name + * @link http://www.php.net/manual/en/mongocollection.getname.php + * @return string the name of this collection. + */ + public function getName () {} + + /** + * Get slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoCollection + * instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + /** + * Get the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Get the write concern for this collection + * @link http://www.php.net/manual/en/mongocollection.getwriteconcern.php + * @return array + */ + public function getWriteConcern () {} + + /** + * Set the write concern for this database + * @link http://www.php.net/manual/en/mongocollection.setwriteconcern.php + * @param w mixed + * @param wtimeout int[optional] + * @return bool + */ + public function setWriteConcern ($w, $wtimeout = null) {} + + /** + * Drops this collection + * @link http://www.php.net/manual/en/mongocollection.drop.php + * @return array the database response. + */ + public function drop () {} + + /** + * Validates this collection + * @link http://www.php.net/manual/en/mongocollection.validate.php + * @param scan_data bool[optional]

    + * Only validate indices, not the base collection. + *

    + * @return array the database's evaluation of this object. + */ + public function validate ($scan_data = null) {} + + /** + * Inserts a document into the collection + * @link http://www.php.net/manual/en/mongocollection.insert.php + * @param a array|object

    + * An array or object. If an object is used, it may not have protected or + * private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. This special behavior does not mean that the + * parameter is passed by reference. + *

    + * @param options array[optional]

    + * Options for the insert. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return bool|array an array containing the status of the insertion if the + * "w" option is set. Otherwise, returns true if the + * inserted array is not empty (a MongoException will be + * thrown if the inserted array is empty). + *

    + *

    + * If an array is returned, the following keys may be present: + * ok + *

    + * This should almost always be 1 (unless last_error itself failed). + *

    + * err + *

    + * If this field is non-null, an error occurred on the previous operation. + * If this field is set, it will be a string describing the error that + * occurred. + *

    + * code + *

    + * If a database error occurred, the relevant error code will be passed + * back to the client. + *

    + * errmsg + *

    + * This field is set if something goes wrong with a database command. It + * is coupled with ok being 0. For example, if + * w is set and times out, errmsg will be set to "timed + * out waiting for slaves" and ok will be 0. If this + * field is set, it will be a string describing the error that occurred. + *

    + * n + *

    + * If the last operation was an update, upsert, or a remove, the number + * of documents affected will be returned. For insert operations, this value + * is always 0. + *

    + * wtimeout + *

    + * If the previous option timed out waiting for replication. + *

    + * waited + *

    + * How long the operation waited before timing out. + *

    + * wtime + *

    + * If w was set and the operation succeeded, how long it took to + * replicate to w servers. + *

    + * upserted + *

    + * If an upsert occurred, this field will contain the new record's + * _id field. For upserts, either this field or + * updatedExisting will be present (unless an error + * occurred). + *

    + * updatedExisting + *

    + * If an upsert updated an existing element, this field will be true. For + * upserts, either this field or upserted will be present (unless an error + * occurred). + *

    + */ + public function insert ($a, array $options = null) {} + + /** + * Inserts multiple documents into this collection + * @link http://www.php.net/manual/en/mongocollection.batchinsert.php + * @param a array

    + * An array of arrays or objects. If any objects are used, they may not have + * protected or private properties. + *

    + *

    + * If the documents to insert do not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the inserts. + *

    + * "continueOnError" + *

    + *

    + * Boolean, defaults to false. If set, the database will not stop + * processing a bulk insert if one fails (eg due to duplicate IDs). + * This makes bulk insert behave similarly to a series of single + * inserts, except that calling MongoDB::lastError + * will have an error set if any insert fails, not just the last one. + * If multiple errors occur, only the most recent will be reported by + * MongoDB::lastError. + *

    + *

    + * Please note that continueOnError affects errors + * on the database side only. If you try to insert a document that has + * errors (for example it contains a key with an empty name), then the + * document is not even transferred to the database as the driver + * detects this error and bails out. + * continueOnError has no effect on errors detected + * in the documents by the driver. + *

    + * @return mixed If the w parameter is set to acknowledge the write, + * returns an associative array with the status of the inserts ("ok") and any + * error that may have occurred ("err"). Otherwise, returns true if the + * batch insert was successfully sent, false otherwise. + */ + public function batchInsert (array $a, array $options = null) {} + + /** + * Update records based on a given criteria + * @link http://www.php.net/manual/en/mongocollection.update.php + * @param criteria array

    + * Description of the objects to update. + *

    + * @param new_object array

    + * The object with which to update the matching records. + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + *

    + * "upsert" + *

    + *

    + * If no document matches $criteria, a new + * document will be inserted. + *

    + *

    + * If a new document would be inserted and + * $new_object contains atomic modifiers + * (i.e. $ operators), those operations will be + * applied to the $criteria parameter to create + * the new document. If $new_object does not + * contain atomic modifiers, it will be used as-is for the inserted + * document. See the upsert examples below for more information. + *

    + * @return bool|array an array containing the status of the update if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function update (array $criteria, array $new_object, array $options = null) {} + + /** + * Remove records from this collection + * @link http://www.php.net/manual/en/mongocollection.remove.php + * @param criteria array[optional]

    + * Description of records to remove. + *

    + * @param options array[optional]

    + * Options for remove. + * &mongo.writes.parameters.writeconcern; + *

    + * "justOne" + *

    + *

    + * Remove at most one record matching this criteria. + *

    + * @return bool|array an array containing the status of the removal if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function remove (array $criteria = null, array $options = null) {} + + /** + * Queries this collection, returning a MongoCursor for the result set + * @link http://www.php.net/manual/en/mongocollection.find.php + * @param query array[optional]

    + * The fields for which to search. MongoDB's query language is quite + * extensive. The PHP driver will in almost all cases pass the query + * straight through to the server, so reading the MongoDB core docs on + * find is a good idea. + *

    + *

    + * Please make sure that for all special query operators (starting with + * $) you use single quotes so that PHP doesn't try to + * replace "$exists" with the value of the variable + * $exists. + *

    + * @param fields array[optional]

    + * Fields of the results to return. The array is in the format + * array('fieldname' => true, 'fieldname2' => true). + * The _id field is always returned. + *

    + * @return MongoCursor a cursor for the search results. + */ + public function find (array $query = null, array $fields = null) {} + + /** + * Queries this collection, returning a single element + * @link http://www.php.net/manual/en/mongocollection.findone.php + * @param query array[optional]

    + * The fields for which to search. MongoDB's query language is quite + * extensive. The PHP driver will in almost all cases pass the query + * straight through to the server, so reading the MongoDB core docs on + * find is a good idea. + *

    + *

    + * Please make sure that for all special query operaters (starting with + * $) you use single quotes so that PHP doesn't try to + * replace "$exists" with the value of the variable + * $exists. + *

    + * @param fields array[optional]

    + * Fields of the results to return. The array is in the format + * array('fieldname' => true, 'fieldname2' => true). + * The _id field is always returned. + *

    + * @return array record matching the search or &null;. + */ + public function findOne (array $query = null, array $fields = null) {} + + /** + * Update a document and return it + * @link http://www.php.net/manual/en/mongocollection.findandmodify.php + * @param query array

    + * The query criteria to search for. + *

    + * @param update array[optional]

    + * The update criteria. + *

    + * @param fields array[optional]

    + * Optionally only return these fields. + *

    + * @param options array[optional]

    + * An array of options to apply, such as remove the match document from the + * DB and return it. + * + * Option + * &Description; + * + * + * sort array + * + * Determines which document the operation will modify if the + * query selects multiple documents. findAndModify will modify the + * first document in the sort order specified by this argument. + * + * + * + * remove boolean + * + * Optional if update field exists. When true, removes the selected + * document. The default is false. + * + * + * + * update array + * + * Optional if remove field exists. + * Performs an update of the selected document. + * + * + * + * new boolean + * + * Optional. When true, returns the modified document rather than the + * original. The findAndModify method ignores the new option for + * remove operations. The default is false. + * + * + * + * upsert boolean + * + * Optional. Used in conjunction with the update field. When true, the + * findAndModify command creates a new document if the query returns + * no documents. The default is false. In MongoDB 2.2, the + * findAndModify command returns &null; when upsert is true. + * + * + * + * + * + * + * + *

    + * @return array the original document, or the modified document when + * new is set. + */ + public function findAndModify (array $query, array $update = null, array $fields = null, array $options = null) {} + + /** + * Execute a database command and retrieve results through a cursor + * @link http://www.php.net/manual/en/mongocollection.commandcursor.php + * @param command array

    + * The command query to send. + *

    + *

    + * It is possible to configure how many initial documents the server + * should return with the first result set. This configuration is made as + * part of the command query. The default initial batch size is + * 101. You can change it by adding the + * cursor key in the following way to the command: + *

    + * commandCursor( [ + * "aggregate" => "collectionName", + * "pipeline" => [ + * ... + * ], + * "cursor" => [ "batchSize" => 4 ], + * ] ); + * ]]> + *

    + * If you do not set the initial + * batchSize option, then the PHP driver will implicitly + * add this for you with a value of 101 + *

    + *

    + * This setting does only configure the first batch size. To configure the + * size of future batches, please use the + * MongoCommandCursor::batchSize method on the + * returned MongoCommandCursor object. + *

    + * @return MongoCommandCursor a MongoCommandCursor object. Because this + * implements the Iterator interface you can + * iterate over each of the results as returned by the command query. The + * MongoCommandCursor also implements the + * MongoCursorInterface interface which adds the + * MongoCommandCursor::batchSize, + * MongoCommandCursor::dead, + * MongoCommandCursor::info methods. + */ + public function commandCursor (array $command) {} + + /** + * Creates an index on the given field(s) + * @link http://www.php.net/manual/en/mongocollection.createindex.php + * @param keys array

    + * An array of fields by which to sort the index on. Each element in the + * array has as key the field name, and as value either + * 1 for ascending sort, -1 for + * descending sort, or any of the index plugins (currently, + * "text", "2d", or + * "2dsphere""). + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation. The array + * contains whether the operation worked ("ok"), the amount + * of indexes before and after the operation + * ("numIndexesBefore" and + * "numIndexesAfter") and whether the collection that the + * index belongs to has been created + * ("createdCollectionAutomatically"). + *

    + *

    + * With MongoDB 2.4 and earlier, a status document is only returned if the + * "w" option is set to 1—either through + * the connection string, or with . If + * "w" is not set to 1, it returns + * true. The fields in the status document are different, except for the + * "ok" field which signals whether the index creation + * worked. + */ + public function createIndex (array $keys, array $options = null) {} + + /** + * Creates an index on the given field(s), or does nothing if the index + already exists + * @link http://www.php.net/manual/en/mongocollection.ensureindex.php + * @param key_keys string|array + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function ensureIndex ($key_keys, array $options = null) {} + + /** + * Deletes an index from this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindex.php + * @param keys string|array

    + * Field or fields from which to delete the index. + *

    + * @return array the database response. + */ + public function deleteIndex ($keys) {} + + /** + * Delete all indices for this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindexes.php + * @return array the database response. + */ + public function deleteIndexes () {} + + /** + * Returns information about indexes on this collection + * @link http://www.php.net/manual/en/mongocollection.getindexinfo.php + * @return array This function returns an array in which each element describes an index. + * Elements will contain the values name for the name of + * the index, ns for the namespace (a combination of the + * database and collection name), and key for a list of all + * fields in the index and their ordering. Additional values may be present for + * special indexes, such as unique or + * sparse. + */ + public function getIndexInfo () {} + + /** + * Counts the number of documents in this collection + * @link http://www.php.net/manual/en/mongocollection.count.php + * @param query array[optional]

    + * Associative array or object with fields to match. + *

    + * @param limit int[optional]

    + * Specifies an upper limit to the number returned. + *

    + * @param skip int[optional]

    + * Specifies a number of results to skip before starting the count. + *

    + * @return int the number of documents matching the query. + */ + public function count (array $query = null, $limit = null, $skip = null) {} + + /** + * Saves a document to this collection + * @link http://www.php.net/manual/en/mongocollection.save.php + * @param a array|object

    + * Array or object to save. If an object is used, it may not have protected + * or private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the save. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return mixed If w was set, returns an array containing the status of the save. + * Otherwise, returns a boolean representing if the array was not empty (an empty array will not + * be inserted). + */ + public function save ($a, array $options = null) {} + + /** + * Creates a database reference + * @link http://www.php.net/manual/en/mongocollection.createdbref.php + * @param document_or_id mixed

    + * If an array or object is given, its _id field will be + * used as the reference ID. If a MongoId or scalar + * is given, it will be used as the reference ID. + *

    + * @return array a database reference array. + *

    + *

    + * If an array without an _id field was provided as the + * document_or_id parameter, &null; will be returned. + */ + public function createDBRef ($document_or_id) {} + + /** + * Fetches the document pointed to by a database reference + * @link http://www.php.net/manual/en/mongocollection.getdbref.php + * @param ref array

    + * A database reference. + *

    + * @return array the database document pointed to by the reference. + */ + public function getDBRef (array $ref) {} + + /** + * Converts keys specifying an index to its identifying string + * @link http://www.php.net/manual/en/mongocollection.toindexstring.php + * @param keys mixed

    + * Field or fields to convert to the identifying string + *

    + * @return string a string that describes the index. + */ + protected static function toIndexString ($keys) {} + + /** + * Performs an operation similar to SQL's GROUP BY command + * @link http://www.php.net/manual/en/mongocollection.group.php + * @param keys mixed

    + * Fields to group by. If an array or non-code object is passed, it will be + * the key used to group results. + *

    + *

    1.0.4+: If keys is an instance of + * MongoCode, keys will be treated as + * a function that returns the key to group by (see the "Passing a + * keys function" example below). + *

    + * @param initial array

    + * Initial value of the aggregation counter object. + *

    + * @param reduce MongoCode

    + * A function that takes two arguments (the current document and the + * aggregation to this point) and does the aggregation. + *

    + * @param options array[optional]

    + * Optional parameters to the group command. Valid options include: + *

    + *

    + * "condition" + *

    + *

    + * Criteria for including a document in the aggregation. + *

    + * @return array an array containing the result. + */ + public function group ($keys, array $initial, MongoCode $reduce, array $options = null) {} + + /** + * Retrieve a list of distinct values for the given key across a collection. + * @link http://www.php.net/manual/en/mongocollection.distinct.php + * @param key string

    + * The key to use. + *

    + * @param query array[optional]

    + * An optional query parameters + *

    + * @return array an array of distinct values, &return.falseforfailure; + */ + public function distinct ($key, array $query = null) {} + + /** + * Perform an aggregation using the aggregation framework + * @link http://www.php.net/manual/en/mongocollection.aggregate.php + * @param pipeline array

    + * An array of pipeline operators. + *

    + * @param options array[optional]

    + * Array of command arguments, such as allowDiskUse, explain or cursor. + *

    + * @return array The result of the aggregation as an array. The ok will + * be set to 1 on success, 0 on failure. + */ + public function aggregate (array $pipeline, array $options = null) {} + +} + +interface MongoCursorInterface extends Iterator, Traversable { + + /** + * @param number + */ + abstract public function batchSize ($number) {} + + abstract public function info () {} + + abstract public function dead () {} + + abstract public function current () {} + + abstract public function next () {} + + abstract public function key () {} + + abstract public function valid () {} + + abstract public function rewind () {} + +} + +/** @jms-builtin */ +class MongoCursor implements MongoCursorInterface, Traversable, Iterator { + public static $slaveOkay; + public static $timeout; + + + /** + * Create a new cursor + * @link http://www.php.net/manual/en/mongocursor.construct.php + * @param connection MongoClient + * @param database_and_collection_name + * @param query[optional] + * @param array_of_fields_OR_object[optional] + */ + public function __construct (MongoClient $connection, $database_and_collection_name, $query, $array_of_fields_OR_object) {} + + /** + * Checks if there are any more elements in this cursor + * @link http://www.php.net/manual/en/mongocursor.hasnext.php + * @return bool if there is another element. + */ + public function hasNext () {} + + /** + * Return the next object to which this cursor points, and advance the cursor + * @link http://www.php.net/manual/en/mongocursor.getnext.php + * @return array the next object. + */ + public function getNext () {} + + /** + * Limits the number of results returned + * @link http://www.php.net/manual/en/mongocursor.limit.php + * @param num int

    + * The number of results to return. + *

    + * @return MongoCursor this cursor. + */ + public function limit ($num) {} + + /** + * Limits the number of elements returned in one batch. + * @link http://www.php.net/manual/en/mongocursor.batchsize.php + * @param batchSize int

    + * The number of results to return per batch. Each batch requires a + * round-trip to the server. + *

    + *

    + * If batchSize is 2 or + * more, it represents the size of each batch of objects retrieved. + * It can be adjusted to optimize performance and limit data transfer. + *

    + *

    + * If batchSize is 1 or negative, it + * will limit of number returned documents to the absolute value of batchSize, + * and the cursor will be closed. For example if + * batchSize is -10, then the server will return a maximum + * of 10 documents and as many as can fit in 4MB, then close the cursor. + *

    + *

    + * A batchSize of 1 is special, and + * means the same as -1, i.e. a value of + * 1 makes the cursor only capable of returning + * one document. + *

    + *

    + * Note that this feature is different from + * MongoCursor::limit in that documents must fit within a + * maximum size, and it removes the need to send a request to close the cursor + * server-side. The batch size can be changed even after a cursor is iterated, + * in which case the setting will apply on the next batch retrieval. + *

    + *

    + * This cannot override MongoDB's limit on the amount of data it will return to + * the client (i.e., if you set batch size to 1,000,000,000, MongoDB will still + * only return 4-16MB of results per batch). + *

    + *

    + * To ensure consistent behavior, the rules of + * MongoCursor::batchSize and + * MongoCursor::limit behave a + * little complex but work "as expected". The rules are: hard limits override + * soft limits with preference given to MongoCursor::limit + * over MongoCursor::batchSize. After that, whichever is + * set and lower than the other will take precedence. See below. + * section for some examples. + *

    + * @return MongoCursor this cursor. + */ + public function batchSize ($batchSize) {} + + /** + * Skips a number of results + * @link http://www.php.net/manual/en/mongocursor.skip.php + * @param num int

    + * The number of results to skip. + *

    + * @return MongoCursor this cursor. + */ + public function skip ($num) {} + + /** + * Sets the fields for a query + * @link http://www.php.net/manual/en/mongocursor.fields.php + * @param f array

    + * Fields to return (or not return). + *

    + * @return MongoCursor this cursor. + */ + public function fields (array $f) {} + + /** + * @param ms + */ + public function maxTimeMS ($ms) {} + + /** + * Adds a top-level key/value pair to a query + * @link http://www.php.net/manual/en/mongocursor.addoption.php + * @param key string

    + * Fieldname to add. + *

    + * @param value mixed

    + * Value to add. + *

    + * @return MongoCursor this cursor. + */ + public function addOption ($key, $value) {} + + /** + * Use snapshot mode for the query + * @link http://www.php.net/manual/en/mongocursor.snapshot.php + * @return MongoCursor this cursor. + */ + public function snapshot () {} + + /** + * Sorts the results by given fields + * @link http://www.php.net/manual/en/mongocursor.sort.php + * @param fields array

    + * An array of fields by which to sort. Each element in the array has as + * key the field name, and as value either 1 for + * ascending sort, or -1 for descending sort. + *

    + *

    + * Each result is first sorted on the first field in the array, then (if + * it exists) on the second field in the array, etc. This means that the + * order of the fields in the fields array is + * important. See also the examples section. + *

    + * @return MongoCursor the same cursor that this method was called on. + */ + public function sort (array $fields) {} + + /** + * Gives the database a hint about the query + * @link http://www.php.net/manual/en/mongocursor.hint.php + * @param index mixed

    + * Index to use for the query. If a string is passed, it should correspond + * to an index name. If an array or object is passed, it should correspond + * to the specification used to create the index (i.e. the first argument + * to MongoCollection::ensureIndex). + *

    + * @return MongoCursor this cursor. + */ + public function hint ($index) {} + + /** + * Return an explanation of the query, often useful for optimization and debugging + * @link http://www.php.net/manual/en/mongocursor.explain.php + * @return array an explanation of the query. + */ + public function explain () {} + + /** + * Sets arbitrary flags in case there is no method available the specific flag + * @link http://www.php.net/manual/en/mongocursor.setflag.php + * @param flag int

    + * Which flag to set. You can not set flag 6 (EXHAUST) as the driver does + * not know how to handle them. You will get a warning if you try to use + * this flag. For available flags, please refer to the wire protocol + * documentation. + *

    + * @param set bool[optional]

    + * Whether the flag should be set (true) or unset (false). + *

    + * @return MongoCursor this cursor. + */ + public function setFlag ($flag, $set = null) {} + + /** + * Sets whether this query can be done on a secondary [deprecated] + * @link http://www.php.net/manual/en/mongocursor.slaveokay.php + * @param okay bool[optional]

    + * If it is okay to query the secondary. + *

    + * @return MongoCursor this cursor. + */ + public function slaveOkay ($okay = null) {} + + /** + * Sets whether this cursor will be left open after fetching the last results + * @link http://www.php.net/manual/en/mongocursor.tailable.php + * @param tail bool[optional]

    + * If the cursor should be tailable. + *

    + * @return MongoCursor this cursor. + */ + public function tailable ($tail = null) {} + + /** + * Sets whether this cursor will timeout + * @link http://www.php.net/manual/en/mongocursor.immortal.php + * @param liveForever bool[optional]

    + * If the cursor should be immortal. + *

    + * @return MongoCursor this cursor. + */ + public function immortal ($liveForever = null) {} + + /** + * Sets whether this cursor will wait for a while for a tailable cursor to return more data + * @link http://www.php.net/manual/en/mongocursor.awaitdata.php + * @param wait bool[optional]

    + * If the cursor should wait for more data to become available. + *

    + * @return MongoCursor this cursor. + */ + public function awaitData ($wait = null) {} + + /** + * If this query should fetch partial results from mongos if a shard is down + * @link http://www.php.net/manual/en/mongocursor.partial.php + * @param okay bool[optional]

    + * If receiving partial results is okay. + *

    + * @return MongoCursor this cursor. + */ + public function partial ($okay = null) {} + + /** + * Get the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return MongoCursor this cursor. + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Sets a client-side timeout for this query + * @link http://www.php.net/manual/en/mongocursor.timeout.php + * @param ms int

    + * The number of milliseconds for the cursor to wait for a response. Use + * -1 to wait forever. By default, the cursor will wait + * MongoCursor::$timeout milliseconds. + *

    + * @return MongoCursor This cursor. + */ + public function timeout ($ms) {} + + /** + * Execute the query. + * @link http://www.php.net/manual/en/mongocursor.doquery.php + * @return void &null;. + */ + protected function doQuery () {} + + /** + * Gets the query, fields, limit, and skip for this cursor + * @link http://www.php.net/manual/en/mongocursor.info.php + * @return array the namespace, limit, skip, query, and fields for this cursor. + */ + public function info () {} + + /** + * Checks if there are documents that have not been sent yet from the database for this cursor + * @link http://www.php.net/manual/en/mongocursor.dead.php + * @return bool if there are more results that have not been sent to the client, yet. + */ + public function dead () {} + + /** + * Returns the current element + * @link http://www.php.net/manual/en/mongocursor.current.php + * @return array The current result as an associative array. + */ + public function current () {} + + /** + * Returns the current result's _id + * @link http://www.php.net/manual/en/mongocursor.key.php + * @return string The current result's _id as a string. + */ + public function key () {} + + /** + * Advances the cursor to the next result + * @link http://www.php.net/manual/en/mongocursor.next.php + * @return void &null;. + */ + public function next () {} + + /** + * Returns the cursor to the beginning of the result set + * @link http://www.php.net/manual/en/mongocursor.rewind.php + * @return void &null;. + */ + public function rewind () {} + + /** + * Checks if the cursor is reading a valid result. + * @link http://www.php.net/manual/en/mongocursor.valid.php + * @return bool If the current result is not null. + */ + public function valid () {} + + /** + * Clears the cursor + * @link http://www.php.net/manual/en/mongocursor.reset.php + * @return void &null;. + */ + public function reset () {} + + /** + * Counts the number of results for this query + * @link http://www.php.net/manual/en/mongocursor.count.php + * @param foundOnly bool[optional]

    + * Send cursor limit and skip information to the count function, if applicable. + *

    + * @return int The number of documents returned by this cursor's query. + */ + public function count ($foundOnly = null) {} + +} + +/** @jms-builtin */ +class MongoCommandCursor implements MongoCursorInterface, Traversable, Iterator { + + /** + * Create a new command cursor + * @link http://www.php.net/manual/en/mongocommandcursor.construct.php + * @param connection MongoClient + * @param database_and_collection_name + * @param query[optional] + * @param array_of_fields_OR_object[optional] + */ + public function __construct (MongoClient $connection, $database_and_collection_name, $query, $array_of_fields_OR_object) {} + + /** + * Limits the number of elements returned in one batch. + * @link http://www.php.net/manual/en/mongocommandcursor.batchsize.php + * @param batchSize int

    + * The number of results to return per batch. Each batch requires a + * round-trip to the server. + *

    + *

    + * This cannot override MongoDB's limit on the amount of data it will return to + * the client (i.e., if you set batch size to 1,000,000,000, MongoDB will still + * only return 4-16MB of results per batch). + *

    + * @return MongoCommandCursor this cursor. + */ + public function batchSize ($batchSize) {} + + /** + * Gets the query, fields, limit, and skip for this cursor + * @link http://www.php.net/manual/en/mongocommandcursor.info.php + * @return array the namespace, limit, skip, query, fields, connection and iteration + * information for this cursor. + */ + public function info () {} + + /** + * Checks if there are documents that have not been sent yet from the database for this cursor + * @link http://www.php.net/manual/en/mongocommandcursor.dead.php + * @return bool if there are more results that have not been sent to the client, yet. + */ + public function dead () {} + + /** + * Returns the current element + * @link http://www.php.net/manual/en/mongocommandcursor.current.php + * @return array The current result as an associative array. + */ + public function current () {} + + /** + * Returns the current result's _id + * @link http://www.php.net/manual/en/mongocommandcursor.key.php + * @return string The current result's _id as a string. + */ + public function key () {} + + /** + * Advances the cursor to the next result + * @link http://www.php.net/manual/en/mongocommandcursor.next.php + * @return void &null;. + */ + public function next () {} + + /** + * Executes the command and resets the cursor to the start of the result set + * @link http://www.php.net/manual/en/mongocommandcursor.rewind.php + * @return array The raw server result document. + */ + public function rewind () {} + + /** + * Fetches a new result item, and returns whether it could + * @link http://www.php.net/manual/en/mongocommandcursor.valid.php + * @return bool true if a next item could be returned, and false otherwise. + */ + public function valid () {} + + public function reset () {} + +} + +/** @jms-builtin */ +class MongoGridFS extends MongoCollection { + const ASCENDING = 1; + const DESCENDING = -1; + + public $w; + public $wtimeout; + public $chunks; + protected $filesName; + protected $chunksName; + + + /** + * Creates new file collections + * @link http://www.php.net/manual/en/mongogridfs.construct.php + */ + public function __construct () {} + + /** + * Drops the files and chunks collections + * @link http://www.php.net/manual/en/mongogridfs.drop.php + * @return array The database response. + */ + public function drop () {} + + /** + * Queries for files + * @link http://www.php.net/manual/en/mongogridfs.find.php + * @param query array[optional]

    + * The query. + *

    + * @param fields array[optional]

    + * Fields to return. + *

    + * @return MongoGridFSCursor A MongoGridFSCursor. + */ + public function find (array $query = null, array $fields = null) {} + + /** + * Stores a file in the database + * @link http://www.php.net/manual/en/mongogridfs.storefile.php + * @param filename string

    + * Name of the file to store. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + * @param options array[optional]

    + * Options for the store. + * &mongo.writes.parameters.writeconcern; + *

    + * @return mixed + */ + public function storeFile ($filename, array $metadata = null, array $options = null) {} + + /** + * Stores a string of bytes in the database + * @link http://www.php.net/manual/en/mongogridfs.storebytes.php + * @param bytes string

    + * String of bytes to store. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + * @param options array[optional]

    + * Options for the store. + * &mongo.writes.parameters.writeconcern; + *

    + * @return mixed + */ + public function storeBytes ($bytes, array $metadata = null, array $options = null) {} + + /** + * Returns a single file matching the criteria + * @link http://www.php.net/manual/en/mongogridfs.findone.php + * @param query mixed[optional]

    + * The filename or criteria for which to search. + *

    + * @param fields mixed[optional] + * @return MongoGridFSFile a MongoGridFSFile or &null;. + */ + public function findOne ($query = null, $fields = null) {} + + /** + * Removes files from the collections + * @link http://www.php.net/manual/en/mongogridfs.remove.php + * @param criteria array[optional] + * @param options array[optional]

    + * Options for the remove. Valid options are: + *

    + * &mongo.writes.parameters.writeconcern; + * @return bool if the removal was successfully sent to the database. + */ + public function remove (array $criteria = null, array $options = null) {} + + /** + * Stores an uploaded file in the database + * @link http://www.php.net/manual/en/mongogridfs.storeupload.php + * @param name string

    + * The name of the uploaded file to store. This should correspond to the + * file field's name attribute in the HTML form. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + *

    + * The filename index will be populated with the + * filename used. + *

    + * @return mixed + */ + public function storeUpload ($name, array $metadata = null) {} + + /** + * Delete a file from the database + * @link http://www.php.net/manual/en/mongogridfs.delete.php + * @param id mixed

    + * _id of the file to remove. + *

    + * @return bool if the remove was successfully sent to the database. + */ + public function delete ($id) {} + + /** + * Retrieve a file from the database + * @link http://www.php.net/manual/en/mongogridfs.get.php + * @param id mixed

    + * _id of the file to find. + *

    + * @return MongoGridFSFile the file, if found, or &null;. + */ + public function get ($id) {} + + /** + * Stores a file in the database + * @link http://www.php.net/manual/en/mongogridfs.put.php + * @param filename string

    + * Name of the file to store. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + * @return mixed + */ + public function put ($filename, array $metadata = null) {} + + /** + * String representation of this collection + * @link http://www.php.net/manual/en/mongocollection.--tostring.php + * @return string the full name of this collection. + */ + public function __toString () {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongocollection.get.php + * @param name string

    + * The next string in the collection name. + *

    + * @return MongoCollection the collection. + */ + public function __get ($name) {} + + /** + * Returns this collection's name + * @link http://www.php.net/manual/en/mongocollection.getname.php + * @return string the name of this collection. + */ + public function getName () {} + + /** + * Get slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoCollection + * instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + /** + * Get the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Get the write concern for this collection + * @link http://www.php.net/manual/en/mongocollection.getwriteconcern.php + * @return array + */ + public function getWriteConcern () {} + + /** + * Set the write concern for this database + * @link http://www.php.net/manual/en/mongocollection.setwriteconcern.php + * @param w mixed + * @param wtimeout int[optional] + * @return bool + */ + public function setWriteConcern ($w, $wtimeout = null) {} + + /** + * Validates this collection + * @link http://www.php.net/manual/en/mongocollection.validate.php + * @param scan_data bool[optional]

    + * Only validate indices, not the base collection. + *

    + * @return array the database's evaluation of this object. + */ + public function validate ($scan_data = null) {} + + /** + * Inserts a document into the collection + * @link http://www.php.net/manual/en/mongocollection.insert.php + * @param a array|object

    + * An array or object. If an object is used, it may not have protected or + * private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. This special behavior does not mean that the + * parameter is passed by reference. + *

    + * @param options array[optional]

    + * Options for the insert. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return bool|array an array containing the status of the insertion if the + * "w" option is set. Otherwise, returns true if the + * inserted array is not empty (a MongoException will be + * thrown if the inserted array is empty). + *

    + *

    + * If an array is returned, the following keys may be present: + * ok + *

    + * This should almost always be 1 (unless last_error itself failed). + *

    + * err + *

    + * If this field is non-null, an error occurred on the previous operation. + * If this field is set, it will be a string describing the error that + * occurred. + *

    + * code + *

    + * If a database error occurred, the relevant error code will be passed + * back to the client. + *

    + * errmsg + *

    + * This field is set if something goes wrong with a database command. It + * is coupled with ok being 0. For example, if + * w is set and times out, errmsg will be set to "timed + * out waiting for slaves" and ok will be 0. If this + * field is set, it will be a string describing the error that occurred. + *

    + * n + *

    + * If the last operation was an update, upsert, or a remove, the number + * of documents affected will be returned. For insert operations, this value + * is always 0. + *

    + * wtimeout + *

    + * If the previous option timed out waiting for replication. + *

    + * waited + *

    + * How long the operation waited before timing out. + *

    + * wtime + *

    + * If w was set and the operation succeeded, how long it took to + * replicate to w servers. + *

    + * upserted + *

    + * If an upsert occurred, this field will contain the new record's + * _id field. For upserts, either this field or + * updatedExisting will be present (unless an error + * occurred). + *

    + * updatedExisting + *

    + * If an upsert updated an existing element, this field will be true. For + * upserts, either this field or upserted will be present (unless an error + * occurred). + *

    + */ + public function insert ($a, array $options = null) {} + + /** + * Inserts multiple documents into this collection + * @link http://www.php.net/manual/en/mongocollection.batchinsert.php + * @param a array

    + * An array of arrays or objects. If any objects are used, they may not have + * protected or private properties. + *

    + *

    + * If the documents to insert do not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the inserts. + *

    + * "continueOnError" + *

    + *

    + * Boolean, defaults to false. If set, the database will not stop + * processing a bulk insert if one fails (eg due to duplicate IDs). + * This makes bulk insert behave similarly to a series of single + * inserts, except that calling MongoDB::lastError + * will have an error set if any insert fails, not just the last one. + * If multiple errors occur, only the most recent will be reported by + * MongoDB::lastError. + *

    + *

    + * Please note that continueOnError affects errors + * on the database side only. If you try to insert a document that has + * errors (for example it contains a key with an empty name), then the + * document is not even transferred to the database as the driver + * detects this error and bails out. + * continueOnError has no effect on errors detected + * in the documents by the driver. + *

    + * @return mixed If the w parameter is set to acknowledge the write, + * returns an associative array with the status of the inserts ("ok") and any + * error that may have occurred ("err"). Otherwise, returns true if the + * batch insert was successfully sent, false otherwise. + */ + public function batchInsert (array $a, array $options = null) {} + + /** + * Update records based on a given criteria + * @link http://www.php.net/manual/en/mongocollection.update.php + * @param criteria array

    + * Description of the objects to update. + *

    + * @param new_object array

    + * The object with which to update the matching records. + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + *

    + * "upsert" + *

    + *

    + * If no document matches $criteria, a new + * document will be inserted. + *

    + *

    + * If a new document would be inserted and + * $new_object contains atomic modifiers + * (i.e. $ operators), those operations will be + * applied to the $criteria parameter to create + * the new document. If $new_object does not + * contain atomic modifiers, it will be used as-is for the inserted + * document. See the upsert examples below for more information. + *

    + * @return bool|array an array containing the status of the update if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function update (array $criteria, array $new_object, array $options = null) {} + + /** + * Update a document and return it + * @link http://www.php.net/manual/en/mongocollection.findandmodify.php + * @param query array

    + * The query criteria to search for. + *

    + * @param update array[optional]

    + * The update criteria. + *

    + * @param fields array[optional]

    + * Optionally only return these fields. + *

    + * @param options array[optional]

    + * An array of options to apply, such as remove the match document from the + * DB and return it. + * + * Option + * &Description; + * + * + * sort array + * + * Determines which document the operation will modify if the + * query selects multiple documents. findAndModify will modify the + * first document in the sort order specified by this argument. + * + * + * + * remove boolean + * + * Optional if update field exists. When true, removes the selected + * document. The default is false. + * + * + * + * update array + * + * Optional if remove field exists. + * Performs an update of the selected document. + * + * + * + * new boolean + * + * Optional. When true, returns the modified document rather than the + * original. The findAndModify method ignores the new option for + * remove operations. The default is false. + * + * + * + * upsert boolean + * + * Optional. Used in conjunction with the update field. When true, the + * findAndModify command creates a new document if the query returns + * no documents. The default is false. In MongoDB 2.2, the + * findAndModify command returns &null; when upsert is true. + * + * + * + * + * + * + * + *

    + * @return array the original document, or the modified document when + * new is set. + */ + public function findAndModify (array $query, array $update = null, array $fields = null, array $options = null) {} + + /** + * Execute a database command and retrieve results through a cursor + * @link http://www.php.net/manual/en/mongocollection.commandcursor.php + * @param command array

    + * The command query to send. + *

    + *

    + * It is possible to configure how many initial documents the server + * should return with the first result set. This configuration is made as + * part of the command query. The default initial batch size is + * 101. You can change it by adding the + * cursor key in the following way to the command: + *

    + * commandCursor( [ + * "aggregate" => "collectionName", + * "pipeline" => [ + * ... + * ], + * "cursor" => [ "batchSize" => 4 ], + * ] ); + * ]]> + *

    + * If you do not set the initial + * batchSize option, then the PHP driver will implicitly + * add this for you with a value of 101 + *

    + *

    + * This setting does only configure the first batch size. To configure the + * size of future batches, please use the + * MongoCommandCursor::batchSize method on the + * returned MongoCommandCursor object. + *

    + * @return MongoCommandCursor a MongoCommandCursor object. Because this + * implements the Iterator interface you can + * iterate over each of the results as returned by the command query. The + * MongoCommandCursor also implements the + * MongoCursorInterface interface which adds the + * MongoCommandCursor::batchSize, + * MongoCommandCursor::dead, + * MongoCommandCursor::info methods. + */ + public function commandCursor (array $command) {} + + /** + * Creates an index on the given field(s) + * @link http://www.php.net/manual/en/mongocollection.createindex.php + * @param keys array

    + * An array of fields by which to sort the index on. Each element in the + * array has as key the field name, and as value either + * 1 for ascending sort, -1 for + * descending sort, or any of the index plugins (currently, + * "text", "2d", or + * "2dsphere""). + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation. The array + * contains whether the operation worked ("ok"), the amount + * of indexes before and after the operation + * ("numIndexesBefore" and + * "numIndexesAfter") and whether the collection that the + * index belongs to has been created + * ("createdCollectionAutomatically"). + *

    + *

    + * With MongoDB 2.4 and earlier, a status document is only returned if the + * "w" option is set to 1—either through + * the connection string, or with . If + * "w" is not set to 1, it returns + * true. The fields in the status document are different, except for the + * "ok" field which signals whether the index creation + * worked. + */ + public function createIndex (array $keys, array $options = null) {} + + /** + * Creates an index on the given field(s), or does nothing if the index + already exists + * @link http://www.php.net/manual/en/mongocollection.ensureindex.php + * @param key_keys string|array + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function ensureIndex ($key_keys, array $options = null) {} + + /** + * Deletes an index from this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindex.php + * @param keys string|array

    + * Field or fields from which to delete the index. + *

    + * @return array the database response. + */ + public function deleteIndex ($keys) {} + + /** + * Delete all indices for this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindexes.php + * @return array the database response. + */ + public function deleteIndexes () {} + + /** + * Returns information about indexes on this collection + * @link http://www.php.net/manual/en/mongocollection.getindexinfo.php + * @return array This function returns an array in which each element describes an index. + * Elements will contain the values name for the name of + * the index, ns for the namespace (a combination of the + * database and collection name), and key for a list of all + * fields in the index and their ordering. Additional values may be present for + * special indexes, such as unique or + * sparse. + */ + public function getIndexInfo () {} + + /** + * Counts the number of documents in this collection + * @link http://www.php.net/manual/en/mongocollection.count.php + * @param query array[optional]

    + * Associative array or object with fields to match. + *

    + * @param limit int[optional]

    + * Specifies an upper limit to the number returned. + *

    + * @param skip int[optional]

    + * Specifies a number of results to skip before starting the count. + *

    + * @return int the number of documents matching the query. + */ + public function count (array $query = null, $limit = null, $skip = null) {} + + /** + * Saves a document to this collection + * @link http://www.php.net/manual/en/mongocollection.save.php + * @param a array|object

    + * Array or object to save. If an object is used, it may not have protected + * or private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the save. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return mixed If w was set, returns an array containing the status of the save. + * Otherwise, returns a boolean representing if the array was not empty (an empty array will not + * be inserted). + */ + public function save ($a, array $options = null) {} + + /** + * Creates a database reference + * @link http://www.php.net/manual/en/mongocollection.createdbref.php + * @param document_or_id mixed

    + * If an array or object is given, its _id field will be + * used as the reference ID. If a MongoId or scalar + * is given, it will be used as the reference ID. + *

    + * @return array a database reference array. + *

    + *

    + * If an array without an _id field was provided as the + * document_or_id parameter, &null; will be returned. + */ + public function createDBRef ($document_or_id) {} + + /** + * Fetches the document pointed to by a database reference + * @link http://www.php.net/manual/en/mongocollection.getdbref.php + * @param ref array

    + * A database reference. + *

    + * @return array the database document pointed to by the reference. + */ + public function getDBRef (array $ref) {} + + /** + * Converts keys specifying an index to its identifying string + * @link http://www.php.net/manual/en/mongocollection.toindexstring.php + * @param keys mixed

    + * Field or fields to convert to the identifying string + *

    + * @return string a string that describes the index. + */ + protected static function toIndexString ($keys) {} + + /** + * Performs an operation similar to SQL's GROUP BY command + * @link http://www.php.net/manual/en/mongocollection.group.php + * @param keys mixed

    + * Fields to group by. If an array or non-code object is passed, it will be + * the key used to group results. + *

    + *

    1.0.4+: If keys is an instance of + * MongoCode, keys will be treated as + * a function that returns the key to group by (see the "Passing a + * keys function" example below). + *

    + * @param initial array

    + * Initial value of the aggregation counter object. + *

    + * @param reduce MongoCode

    + * A function that takes two arguments (the current document and the + * aggregation to this point) and does the aggregation. + *

    + * @param options array[optional]

    + * Optional parameters to the group command. Valid options include: + *

    + *

    + * "condition" + *

    + *

    + * Criteria for including a document in the aggregation. + *

    + * @return array an array containing the result. + */ + public function group ($keys, array $initial, MongoCode $reduce, array $options = null) {} + + /** + * Retrieve a list of distinct values for the given key across a collection. + * @link http://www.php.net/manual/en/mongocollection.distinct.php + * @param key string

    + * The key to use. + *

    + * @param query array[optional]

    + * An optional query parameters + *

    + * @return array an array of distinct values, &return.falseforfailure; + */ + public function distinct ($key, array $query = null) {} + + /** + * Perform an aggregation using the aggregation framework + * @link http://www.php.net/manual/en/mongocollection.aggregate.php + * @param pipeline array

    + * An array of pipeline operators. + *

    + * @param options array[optional]

    + * Array of command arguments, such as allowDiskUse, explain or cursor. + *

    + * @return array The result of the aggregation as an array. The ok will + * be set to 1 on success, 0 on failure. + */ + public function aggregate (array $pipeline, array $options = null) {} + +} + +/** @jms-builtin */ +class MongoGridFSFile { + public $file; + protected $gridfs; + + + /** + * Create a new GridFS file + * @link http://www.php.net/manual/en/mongogridfsfile.construct.php + */ + public function __construct () {} + + /** + * Returns this file's filename + * @link http://www.php.net/manual/en/mongogridfsfile.getfilename.php + * @return string the filename. + */ + public function getFilename () {} + + /** + * Returns this file's size + * @link http://www.php.net/manual/en/mongogridfsfile.getsize.php + * @return int this file's size + */ + public function getSize () {} + + /** + * Writes this file to the filesystem + * @link http://www.php.net/manual/en/mongogridfsfile.write.php + * @param filename string[optional]

    + * The location to which to write the file. If none is given, + * the stored filename will be used. + *

    + * @return int the number of bytes written. + */ + public function write ($filename = null) {} + + /** + * Returns this file's contents as a string of bytes + * @link http://www.php.net/manual/en/mongogridfsfile.getbytes.php + * @return string a string of the bytes in the file. + */ + public function getBytes () {} + + /** + * Returns a resource that can be used to read the stored file + * @link http://www.php.net/manual/en/mongogridfsfile.getresource.php + * @return stream a resource that can be used to read the file with + */ + public function getResource () {} + +} + +/** @jms-builtin */ +class MongoGridFSCursor extends MongoCursor implements Iterator, Traversable, MongoCursorInterface { + public static $slaveOkay; + public static $timeout; + protected $gridfs; + + + /** + * Create a new cursor + * @link http://www.php.net/manual/en/mongogridfscursor.construct.php + */ + public function __construct () {} + + /** + * Return the next file to which this cursor points, and advance the cursor + * @link http://www.php.net/manual/en/mongogridfscursor.getnext.php + * @return MongoGridFSFile the next file. + */ + public function getNext () {} + + /** + * Returns the current file + * @link http://www.php.net/manual/en/mongogridfscursor.current.php + * @return MongoGridFSFile The current file. + */ + public function current () {} + + /** + * Checks if there are any more elements in this cursor + * @link http://www.php.net/manual/en/mongocursor.hasnext.php + * @return bool if there is another element. + */ + public function hasNext () {} + + /** + * Limits the number of results returned + * @link http://www.php.net/manual/en/mongocursor.limit.php + * @param num int

    + * The number of results to return. + *

    + * @return MongoCursor this cursor. + */ + public function limit ($num) {} + + /** + * Limits the number of elements returned in one batch. + * @link http://www.php.net/manual/en/mongocursor.batchsize.php + * @param batchSize int

    + * The number of results to return per batch. Each batch requires a + * round-trip to the server. + *

    + *

    + * If batchSize is 2 or + * more, it represents the size of each batch of objects retrieved. + * It can be adjusted to optimize performance and limit data transfer. + *

    + *

    + * If batchSize is 1 or negative, it + * will limit of number returned documents to the absolute value of batchSize, + * and the cursor will be closed. For example if + * batchSize is -10, then the server will return a maximum + * of 10 documents and as many as can fit in 4MB, then close the cursor. + *

    + *

    + * A batchSize of 1 is special, and + * means the same as -1, i.e. a value of + * 1 makes the cursor only capable of returning + * one document. + *

    + *

    + * Note that this feature is different from + * MongoCursor::limit in that documents must fit within a + * maximum size, and it removes the need to send a request to close the cursor + * server-side. The batch size can be changed even after a cursor is iterated, + * in which case the setting will apply on the next batch retrieval. + *

    + *

    + * This cannot override MongoDB's limit on the amount of data it will return to + * the client (i.e., if you set batch size to 1,000,000,000, MongoDB will still + * only return 4-16MB of results per batch). + *

    + *

    + * To ensure consistent behavior, the rules of + * MongoCursor::batchSize and + * MongoCursor::limit behave a + * little complex but work "as expected". The rules are: hard limits override + * soft limits with preference given to MongoCursor::limit + * over MongoCursor::batchSize. After that, whichever is + * set and lower than the other will take precedence. See below. + * section for some examples. + *

    + * @return MongoCursor this cursor. + */ + public function batchSize ($batchSize) {} + + /** + * Skips a number of results + * @link http://www.php.net/manual/en/mongocursor.skip.php + * @param num int

    + * The number of results to skip. + *

    + * @return MongoCursor this cursor. + */ + public function skip ($num) {} + + /** + * Sets the fields for a query + * @link http://www.php.net/manual/en/mongocursor.fields.php + * @param f array

    + * Fields to return (or not return). + *

    + * @return MongoCursor this cursor. + */ + public function fields (array $f) {} + + /** + * @param ms + */ + public function maxTimeMS ($ms) {} + + /** + * Adds a top-level key/value pair to a query + * @link http://www.php.net/manual/en/mongocursor.addoption.php + * @param key string

    + * Fieldname to add. + *

    + * @param value mixed

    + * Value to add. + *

    + * @return MongoCursor this cursor. + */ + public function addOption ($key, $value) {} + + /** + * Use snapshot mode for the query + * @link http://www.php.net/manual/en/mongocursor.snapshot.php + * @return MongoCursor this cursor. + */ + public function snapshot () {} + + /** + * Sorts the results by given fields + * @link http://www.php.net/manual/en/mongocursor.sort.php + * @param fields array

    + * An array of fields by which to sort. Each element in the array has as + * key the field name, and as value either 1 for + * ascending sort, or -1 for descending sort. + *

    + *

    + * Each result is first sorted on the first field in the array, then (if + * it exists) on the second field in the array, etc. This means that the + * order of the fields in the fields array is + * important. See also the examples section. + *

    + * @return MongoCursor the same cursor that this method was called on. + */ + public function sort (array $fields) {} + + /** + * Gives the database a hint about the query + * @link http://www.php.net/manual/en/mongocursor.hint.php + * @param index mixed

    + * Index to use for the query. If a string is passed, it should correspond + * to an index name. If an array or object is passed, it should correspond + * to the specification used to create the index (i.e. the first argument + * to MongoCollection::ensureIndex). + *

    + * @return MongoCursor this cursor. + */ + public function hint ($index) {} + + /** + * Return an explanation of the query, often useful for optimization and debugging + * @link http://www.php.net/manual/en/mongocursor.explain.php + * @return array an explanation of the query. + */ + public function explain () {} + + /** + * Sets arbitrary flags in case there is no method available the specific flag + * @link http://www.php.net/manual/en/mongocursor.setflag.php + * @param flag int

    + * Which flag to set. You can not set flag 6 (EXHAUST) as the driver does + * not know how to handle them. You will get a warning if you try to use + * this flag. For available flags, please refer to the wire protocol + * documentation. + *

    + * @param set bool[optional]

    + * Whether the flag should be set (true) or unset (false). + *

    + * @return MongoCursor this cursor. + */ + public function setFlag ($flag, $set = null) {} + + /** + * Sets whether this query can be done on a secondary [deprecated] + * @link http://www.php.net/manual/en/mongocursor.slaveokay.php + * @param okay bool[optional]

    + * If it is okay to query the secondary. + *

    + * @return MongoCursor this cursor. + */ + public function slaveOkay ($okay = null) {} + + /** + * Sets whether this cursor will be left open after fetching the last results + * @link http://www.php.net/manual/en/mongocursor.tailable.php + * @param tail bool[optional]

    + * If the cursor should be tailable. + *

    + * @return MongoCursor this cursor. + */ + public function tailable ($tail = null) {} + + /** + * Sets whether this cursor will timeout + * @link http://www.php.net/manual/en/mongocursor.immortal.php + * @param liveForever bool[optional]

    + * If the cursor should be immortal. + *

    + * @return MongoCursor this cursor. + */ + public function immortal ($liveForever = null) {} + + /** + * Sets whether this cursor will wait for a while for a tailable cursor to return more data + * @link http://www.php.net/manual/en/mongocursor.awaitdata.php + * @param wait bool[optional]

    + * If the cursor should wait for more data to become available. + *

    + * @return MongoCursor this cursor. + */ + public function awaitData ($wait = null) {} + + /** + * If this query should fetch partial results from mongos if a shard is down + * @link http://www.php.net/manual/en/mongocursor.partial.php + * @param okay bool[optional]

    + * If receiving partial results is okay. + *

    + * @return MongoCursor this cursor. + */ + public function partial ($okay = null) {} + + /** + * Get the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return MongoCursor this cursor. + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Sets a client-side timeout for this query + * @link http://www.php.net/manual/en/mongocursor.timeout.php + * @param ms int

    + * The number of milliseconds for the cursor to wait for a response. Use + * -1 to wait forever. By default, the cursor will wait + * MongoCursor::$timeout milliseconds. + *

    + * @return MongoCursor This cursor. + */ + public function timeout ($ms) {} + + /** + * Execute the query. + * @link http://www.php.net/manual/en/mongocursor.doquery.php + * @return void &null;. + */ + protected function doQuery () {} + + /** + * Gets the query, fields, limit, and skip for this cursor + * @link http://www.php.net/manual/en/mongocursor.info.php + * @return array the namespace, limit, skip, query, and fields for this cursor. + */ + public function info () {} + + /** + * Checks if there are documents that have not been sent yet from the database for this cursor + * @link http://www.php.net/manual/en/mongocursor.dead.php + * @return bool if there are more results that have not been sent to the client, yet. + */ + public function dead () {} + + /** + * Returns the current result's _id + * @link http://www.php.net/manual/en/mongocursor.key.php + * @return string The current result's _id as a string. + */ + public function key () {} + + /** + * Advances the cursor to the next result + * @link http://www.php.net/manual/en/mongocursor.next.php + * @return void &null;. + */ + public function next () {} + + /** + * Returns the cursor to the beginning of the result set + * @link http://www.php.net/manual/en/mongocursor.rewind.php + * @return void &null;. + */ + public function rewind () {} + + /** + * Checks if the cursor is reading a valid result. + * @link http://www.php.net/manual/en/mongocursor.valid.php + * @return bool If the current result is not null. + */ + public function valid () {} + + /** + * Clears the cursor + * @link http://www.php.net/manual/en/mongocursor.reset.php + * @return void &null;. + */ + public function reset () {} + + /** + * Counts the number of results for this query + * @link http://www.php.net/manual/en/mongocursor.count.php + * @param foundOnly bool[optional]

    + * Send cursor limit and skip information to the count function, if applicable. + *

    + * @return int The number of documents returned by this cursor's query. + */ + public function count ($foundOnly = null) {} + +} + +/** @jms-builtin */ +class MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.construct.php + * @param collection MongoCollection + * @param batch_type[optional] + * @param write_options[optional] + */ + protected function __construct (MongoCollection $collection, $batch_typearray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoInsertBatch extends MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongoinsertbatch.construct.php + * @param collection MongoCollection + * @param write_options[optional] + */ + public function __construct (MongoCollection $collectionarray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoUpdateBatch extends MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongoupdatebatch.construct.php + * @param collection MongoCollection + * @param write_options[optional] + */ + public function __construct (MongoCollection $collectionarray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoDeleteBatch extends MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongodeletebatch.construct.php + * @param collection MongoCollection + * @param write_options[optional] + */ + public function __construct (MongoCollection $collectionarray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoId { + public $id; + + + /** + * Creates a new id + * @link http://www.php.net/manual/en/mongoid.construct.php + */ + public function __construct () {} + + /** + * Returns a hexidecimal representation of this id + * @link http://www.php.net/manual/en/mongoid.tostring.php + * @return string This id. + */ + public function __toString () {} + + /** + * Create a dummy MongoId + * @link http://www.php.net/manual/en/mongoid.set-state.php + * @param props array

    + * Theoretically, an array of properties used to create the new id. + * However, as MongoId instances have no properties, this is not used. + *

    + * @return MongoId A new id with the value "000000000000000000000000". + */ + public static function __set_state (array $props) {} + + /** + * Gets the number of seconds since the epoch that this id was created + * @link http://www.php.net/manual/en/mongoid.gettimestamp.php + * @return int the number of seconds since the epoch that this id was created. There are only + * four bytes of timestamp stored, so MongoDate is a better choice + * for storing exact or wide-ranging times. + */ + public function getTimestamp () {} + + /** + * Gets the hostname being used for this machine's ids + * @link http://www.php.net/manual/en/mongoid.gethostname.php + * @return string the hostname. + */ + public static function getHostname () {} + + /** + * Gets the process ID + * @link http://www.php.net/manual/en/mongoid.getpid.php + * @return int the PID of the MongoId. + */ + public function getPID () {} + + /** + * Gets the incremented value to create this id + * @link http://www.php.net/manual/en/mongoid.getinc.php + * @return int the incremented value used to create this MongoId. + */ + public function getInc () {} + + /** + * Check if a value is a valid ObjectId + * @link http://www.php.net/manual/en/mongoid.isvalid.php + * @param value mixed

    + * The value to check for validity. + *

    + * @return bool true if value is a + * MongoId instance or a string consisting of exactly 24 + * hexadecimal characters; otherwise, false is returned. + */ + public static function isValid ($value) {} + +} + +/** @jms-builtin */ +class MongoCode { + public $code; + public $scope; + + + /** + * Creates a new code object + * @link http://www.php.net/manual/en/mongocode.construct.php + */ + public function __construct () {} + + /** + * Returns this code as a string + * @link http://www.php.net/manual/en/mongocode.tostring.php + * @return string This code, the scope is not returned. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoRegex { + public $regex; + public $flags; + + + /** + * Creates a new regular expression + * @link http://www.php.net/manual/en/mongoregex.construct.php + */ + public function __construct () {} + + /** + * A string representation of this regular expression + * @link http://www.php.net/manual/en/mongoregex.tostring.php + * @return string This regular expression in the form "/expr/flags". + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoDate { + public $sec; + public $usec; + + + /** + * Creates a new date. + * @link http://www.php.net/manual/en/mongodate.construct.php + */ + public function __construct () {} + + /** + * Returns a string representation of this date + * @link http://www.php.net/manual/en/mongodate.tostring.php + * @return string This date. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoBinData { + const GENERIC = 0; + const FUNC = 1; + const BYTE_ARRAY = 2; + const UUID = 3; + const UUID_RFC4122 = 4; + const MD5 = 5; + const CUSTOM = 128; + + public $bin; + public $type; + + + /** + * Creates a new binary data object. + * @link http://www.php.net/manual/en/mongobindata.construct.php + */ + public function __construct () {} + + /** + * The string representation of this binary data object. + * @link http://www.php.net/manual/en/mongobindata.tostring.php + * @return string the string "<Mongo Binary Data>". To access the contents of a + * MongoBinData, use the bin field. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoDBRef { + + /** + * Creates a new database reference + * @link http://www.php.net/manual/en/mongodbref.create.php + * @param collection string

    + * Collection name (without the database name). + *

    + * @param id mixed

    + * The _id field of the object to which to link. + *

    + * @param database string[optional]

    + * Database name. + *

    + * @return array the reference. + */ + public static function create ($collection, $id, $database = null) {} + + /** + * Checks if an array is a database reference + * @link http://www.php.net/manual/en/mongodbref.isref.php + * @param ref mixed

    + * Array or object to check. + *

    + * @return bool Returns true on success or false on failure. + */ + public static function isRef ($ref) {} + + /** + * Fetches the object pointed to by a reference + * @link http://www.php.net/manual/en/mongodbref.get.php + * @param db MongoDB

    + * Database to use. + *

    + * @param ref array

    + * Reference to fetch. + *

    + * @return array the document to which the reference refers or &null; if the document + * does not exist (the reference is broken). + */ + public static function get (MongoDB $db, array $ref) {} + +} + +/** @jms-builtin */ +class MongoException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoConnectionException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoCursorException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + private $host; + + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoCursorTimeoutException extends MongoCursorException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoGridFSException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoResultException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + public $document; + private $host; + + + /** + * Retrieve the full result document + * @link http://www.php.net/manual/en/mongoresultexception.getdocument.php + * @return array The full result document as an array, including partial data if available and + * additional keys. + */ + public function getDocument () {} + + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoWriteConcernException extends MongoCursorException { + protected $message; + protected $code; + protected $file; + protected $line; + private $document; + + + /** + * Get the error document + * @link http://www.php.net/manual/en/mongowriteconcernexception.getdocument.php + * @return array A MongoDB document, if available, as an array. + */ + public function getDocument () {} + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoDuplicateKeyException extends MongoWriteConcernException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * Get the error document + * @link http://www.php.net/manual/en/mongowriteconcernexception.getdocument.php + * @return array A MongoDB document, if available, as an array. + */ + public function getDocument () {} + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoExecutionTimeoutException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoProtocolException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoTimestamp { + public $sec; + public $inc; + + + /** + * Creates a new timestamp. + * @link http://www.php.net/manual/en/mongotimestamp.construct.php + */ + public function __construct () {} + + /** + * Returns a string representation of this timestamp + * @link http://www.php.net/manual/en/mongotimestamp.tostring.php + * @return string The seconds since epoch represented by this timestamp. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoInt32 { + public $value; + + + /** + * Creates a new 32-bit integer. + * @link http://www.php.net/manual/en/mongoint32.construct.php + */ + public function __construct () {} + + /** + * Returns the string representation of this 32-bit integer. + * @link http://www.php.net/manual/en/mongoint32.tostring.php + * @return string the string representation of this integer. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoInt64 { + public $value; + + + /** + * Creates a new 64-bit integer. + * @link http://www.php.net/manual/en/mongoint64.construct.php + */ + public function __construct () {} + + /** + * Returns the string representation of this 64-bit integer. + * @link http://www.php.net/manual/en/mongoint64.tostring.php + * @return string the string representation of this integer. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoLog { + const NONE = 0; + const WARNING = 1; + const INFO = 2; + const FINE = 4; + const RS = 1; + const POOL = 1; + const PARSE = 16; + const CON = 2; + const IO = 4; + const SERVER = 8; + const ALL = 31; + + private static $level; + private static $module; + private static $callback; + + + /** + * Sets logging level + * @link http://www.php.net/manual/en/mongolog.setlevel.php + * @param level int

    + * The levels you would like to log. + *

    + * @return void + */ + public static function setLevel ($level) {} + + /** + * Gets the log level + * @link http://www.php.net/manual/en/mongolog.getlevel.php + * @return int the current level. + */ + public static function getLevel () {} + + /** + * Sets driver functionality to log + * @link http://www.php.net/manual/en/mongolog.setmodule.php + * @param module int

    + * The module(s) you would like to log. + *

    + * @return void + */ + public static function setModule ($module) {} + + /** + * Gets the modules currently being logged + * @link http://www.php.net/manual/en/mongolog.getmodule.php + * @return int the modules currently being logged. + */ + public static function getModule () {} + + /** + * Set a callback function to be called on events + * @link http://www.php.net/manual/en/mongolog.setcallback.php + * @param log_function callable

    + * The function to be called on events. + *

    + *

    + * The function should have the following prototype + *

    + *

    + * log_function + * intmodule + * intlevel + * stringmessage + * module + * One of the MongoLog + * module constants. + * @return void Returns true on success or false on failure. + */ + public static function setCallback ($log_function) {} + + /** + * Retrieve the previously set callback function name + * @link http://www.php.net/manual/en/mongolog.getcallback.php + * @return void the callback function name, or false if not set yet. + */ + public static function getCallback () {} + +} + +/** @jms-builtin */ +class MongoPool { + + /** + * Returns information about all connection pools. + * @link http://www.php.net/manual/en/mongopool.info.php + * @return array Each connection pool has an identifier, which starts with the host. For each + * pool, this function shows the following fields: + * in use + *

    + * The number of connections currently being used by + * Mongo instances. + *

    + * in pool + *

    + * The number of connections currently in the pool (not being used). + *

    + * remaining + *

    + * The number of connections that could be created by this pool. For + * example, suppose a pool had 5 connections remaining and 3 connections in + * the pool. We could create 8 new instances of + * MongoClient before we exhausted this pool + * (assuming no instances of MongoClient went out of + * scope, returning their connections to the pool). + *

    + *

    + * A negative number means that this pool will spawn unlimited connections. + *

    + *

    + * Before a pool is created, you can change the max number of connections by + * calling Mongo::setPoolSize. Once a pool is showing + * up in the output of this function, its size cannot be changed. + *

    + * total + *

    + * The total number of connections allowed for this pool. This should be + * greater than or equal to "in use" + "in pool" (or -1). + *

    + * timeout + *

    + * The socket timeout for connections in this pool. This is how long + * connections in this pool will attempt to connect to a server before + * giving up. + *

    + * waiting + *

    + * If you have capped the pool size, workers requesting connections from + * the pool may block until other workers return their connections. This + * field shows how many milliseconds workers have blocked for connections to + * be released. If this number keeps increasing, you may want to use + * MongoPool::setSize to add more connections to your + * pool. + *

    + */ + public static function info () {} + + /** + * Set the size for future connection pools. + * @link http://www.php.net/manual/en/mongopool.setsize.php + * @param size int

    + * The max number of connections future pools will be able to create. + * Negative numbers mean that the pool will spawn an infinite number of + * connections. + *

    + * @return bool the former value of pool size. + */ + public static function setSize ($size) {} + + /** + * Get pool size for connection pools + * @link http://www.php.net/manual/en/mongopool.getsize.php + * @return int the current pool size. + */ + public static function getSize () {} + +} + +/** @jms-builtin */ +class MongoMaxKey { +} + +/** @jms-builtin */ +class MongoMinKey { +} + +/** + * Serializes a PHP variable into a BSON string + * @link http://www.php.net/manual/en/function.bson-encode.php + * @param anything mixed

    + * The variable to be serialized. + *

    + * @return string the serialized string. + * @jms-builtin + */ +function bson_encode ($anything) {} + +/** + * Deserializes a BSON object into a PHP array + * @link http://www.php.net/manual/en/function.bson-decode.php + * @param bson string

    + * The BSON to be deserialized. + *

    + * @return array the deserialized BSON object. + * @jms-builtin + */ +function bson_decode ($bson) {} + +define ('MONGO_STREAMS', 1); +define ('MONGO_SUPPORTS_STREAMS', 1); +define ('MONGO_SUPPORTS_SSL', 0); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_CR', 1); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_X509', 1); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_GSSAPI', 0); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_PLAIN', 0); +define ('MONGO_STREAM_NOTIFY_TYPE_IO_INIT', 100); +define ('MONGO_STREAM_NOTIFY_TYPE_LOG', 200); +define ('MONGO_STREAM_NOTIFY_IO_READ', 111); +define ('MONGO_STREAM_NOTIFY_IO_WRITE', 112); +define ('MONGO_STREAM_NOTIFY_IO_PROGRESS', 7); +define ('MONGO_STREAM_NOTIFY_IO_COMPLETED', 8); +define ('MONGO_STREAM_NOTIFY_LOG_INSERT', 211); +define ('MONGO_STREAM_NOTIFY_LOG_QUERY', 212); +define ('MONGO_STREAM_NOTIFY_LOG_UPDATE', 213); +define ('MONGO_STREAM_NOTIFY_LOG_DELETE', 214); +define ('MONGO_STREAM_NOTIFY_LOG_GETMORE', 215); +define ('MONGO_STREAM_NOTIFY_LOG_KILLCURSOR', 216); +define ('MONGO_STREAM_NOTIFY_LOG_BATCHINSERT', 217); +define ('MONGO_STREAM_NOTIFY_LOG_RESPONSE_HEADER', 218); +define ('MONGO_STREAM_NOTIFY_LOG_WRITE_REPLY', 219); +define ('MONGO_STREAM_NOTIFY_LOG_CMD_INSERT', 220); +define ('MONGO_STREAM_NOTIFY_LOG_CMD_UPDATE', 221); +define ('MONGO_STREAM_NOTIFY_LOG_CMD_DELETE', 222); +define ('MONGO_STREAM_NOTIFY_LOG_WRITE_BATCH', 223); + +// End of mongo v.1.5.0RC1 +?> diff --git a/res/php-5.3-core-api/mongo.php b/res/php-5.3-core-api/mongo.php new file mode 100644 index 0000000..b19dc53 --- /dev/null +++ b/res/php-5.3-core-api/mongo.php @@ -0,0 +1,4397 @@ + + * The database name. + *

    + * @return MongoDB a new db object. + */ + public function __get ($dbname) {} + + /** + * Gets a database + * @link http://www.php.net/manual/en/mongoclient.selectdb.php + * @param name string

    + * The database name. + *

    + * @return MongoDB a new database object. + */ + public function selectDB ($name) {} + + /** + * Gets a database collection + * @link http://www.php.net/manual/en/mongoclient.selectcollection.php + * @param db string

    + * The database name. + *

    + * @param collection string

    + * The collection name. + *

    + * @return MongoCollection a new collection object. + */ + public function selectCollection ($db, $collection) {} + + /** + * Get the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Drops a database [deprecated] + * @link http://www.php.net/manual/en/mongoclient.dropdb.php + * @param db mixed

    + * The database to drop. Can be a MongoDB object or the name of the database. + *

    + * @return array the database response. + */ + public function dropDB ($db) {} + + /** + * Lists all of the databases available. + * @link http://www.php.net/manual/en/mongoclient.listdbs.php + * @return array an associative array containing three fields. The first field is + * databases, which in turn contains an array. Each element + * of the array is an associative array corresponding to a database, giving th + * database's name, size, and if it's empty. The other two fields are + * totalSize (in bytes) and ok, which is 1 + * if this method ran successfully. + */ + public function listDBs () {} + + /** + * Updates status for all associated hosts + * @link http://www.php.net/manual/en/mongoclient.gethosts.php + * @return array an array of information about the hosts in the set. Includes each + * host's hostname, its health (1 is healthy), its state (1 is primary, 2 is + * secondary, 0 is anything else), the amount of time it took to ping the + * server, and when the last ping occurred. For example, on a three-member + * replica set, it might look something like: + */ + public function getHosts () {} + + /** + * Closes this connection + * @link http://www.php.net/manual/en/mongoclient.close.php + * @param connection boolean|string[optional]

    + * If connection is not given, or false then connection that would be + * selected for writes would be closed. In a single-node configuration, + * that is then the whole connection, but if you are connected to a + * replica set, close() will only close the + * connection to the primary server. + *

    + *

    + * If connection is true then all connections as known by the connection + * manager will be closed. This can include connections that are not + * referenced in the connection string used to create the object that + * you are calling close on. + *

    + *

    + * If connection is a string argument, then it will only close the + * connection identified by this hash. Hashes are identifiers for a + * connection and can be obtained by calling + * MongoClient::getConnections. + *

    + * @return bool if the connection was successfully closed. + */ + public function close ($connection = null) {} + + /** + * Kills a specific cursor on the server + * @link http://www.php.net/manual/en/mongoclient.killcursor.php + * @param server_hash string

    + * The server hash that has the cursor. This can be obtained through + * MongoCursor::info. + *

    + * @param id int|MongoInt64

    + * The ID of the cursor to kill. You can either supply an int + * containing the 64 bit cursor ID, or an object of the + * MongoInt64 class. The latter is necessary on 32 + * bit platforms (and Windows). + *

    + * @return bool true if the method attempted to kill a cursor, and false if + * there was something wrong with the arguments (such as a wrong + * server_hash). The return status does not + * reflect where the cursor was actually killed as the server does + * not provide that information. + */ + public static function killCursor ($server_hash, $id) {} + +} + +/** @jms-builtin */ +class Mongo extends MongoClient { + const DEFAULT_HOST = "localhost"; + const DEFAULT_PORT = 27017; + const VERSION = "1.5.0RC1"; + const RP_PRIMARY = "primary"; + const RP_PRIMARY_PREFERRED = "primaryPreferred"; + const RP_SECONDARY = "secondary"; + const RP_SECONDARY_PREFERRED = "secondaryPreferred"; + const RP_NEAREST = "nearest"; + + public $connected; + public $status; + protected $server; + protected $persistent; + + + /** + * The __construct purpose + * @link http://www.php.net/manual/en/mongo.construct.php + * @param server[optional] + * @param options[optional] + */ + public function __construct ($serverarray , $options) {} + + /** + * Connects with a database server + * @link http://www.php.net/manual/en/mongo.connectutil.php + * @return bool If the connection was successful. + */ + protected function connectUtil () {} + + /** + * Get slaveOkay setting for this connection + * @link http://www.php.net/manual/en/mongo.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this connection + * @link http://www.php.net/manual/en/mongo.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoClient instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + public function lastError () {} + + public function prevError () {} + + public function resetError () {} + + public function forceError () {} + + /** + * Returns the address being used by this for slaveOkay reads + * @link http://www.php.net/manual/en/mongo.getslave.php + * @return string The address of the secondary this connection is using for reads. + *

    + *

    + * This returns &null; if this is not connected to a replica set or not yet + * initialized. + */ + public function getSlave () {} + + /** + * Choose a new secondary for slaveOkay reads + * @link http://www.php.net/manual/en/mongo.switchslave.php + * @return string The address of the secondary this connection is using for reads. This may be + * the same as the previous address as addresses are randomly chosen. It may + * return only one address if only one secondary (or only the primary) is + * available. + *

    + *

    + * For example, if we had a three member replica set with a primary, secondary, + * and arbiter this method would always return the address of the secondary. + * If the secondary became unavailable, this method would always return the + * address of the primary. If the primary also became unavailable, this method + * would throw an exception, as an arbiter cannot handle reads. + */ + public function switchSlave () {} + + /** + * Set the size for future connection pools. + * @link http://www.php.net/manual/en/mongo.setpoolsize.php + * @param size int

    + * The max number of connections future pools will be able to create. + * Negative numbers mean that the pool will spawn an infinite number of + * connections. + *

    + * @return bool the former value of pool size. + */ + public static function setPoolSize ($size) {} + + /** + * Get pool size for connection pools + * @link http://www.php.net/manual/en/mongo.getpoolsize.php + * @return int the current pool size. + */ + public static function getPoolSize () {} + + /** + * Returns information about all connection pools. + * @link http://www.php.net/manual/en/mongo.pooldebug.php + * @return array Each connection pool has an identifier, which starts with the host. For each + * pool, this function shows the following fields: + * in use + *

    + * The number of connections currently being used by + * MongoClient instances. + *

    + * in pool + *

    + * The number of connections currently in the pool (not being used). + *

    + * remaining + *

    + * The number of connections that could be created by this pool. For + * example, suppose a pool had 5 connections remaining and 3 connections in + * the pool. We could create 8 new instances of + * MongoClient before we exhausted this pool + * (assuming no instances of MongoClient went out of + * scope, returning their connections to the pool). + *

    + *

    + * A negative number means that this pool will spawn unlimited connections. + *

    + *

    + * Before a pool is created, you can change the max number of connections by + * calling Mongo::setPoolSize. Once a pool is showing + * up in the output of this function, its size cannot be changed. + *

    + * timeout + *

    + * The socket timeout for connections in this pool. This is how long + * connections in this pool will attempt to connect to a server before + * giving up. + *

    + */ + public static function poolDebug () {} + + /** + * Return info about all open connections + * @link http://www.php.net/manual/en/mongoclient.getconnections.php + * @return array An array of open connections. + */ + public static function getConnections () {} + + /** + * Connects to a database server + * @link http://www.php.net/manual/en/mongoclient.connect.php + * @return bool If the connection was successful. + */ + public function connect () {} + + /** + * String representation of this connection + * @link http://www.php.net/manual/en/mongoclient.tostring.php + * @return string hostname and port for this connection. + */ + public function __toString () {} + + /** + * Gets a database + * @link http://www.php.net/manual/en/mongoclient.get.php + * @param dbname string

    + * The database name. + *

    + * @return MongoDB a new db object. + */ + public function __get ($dbname) {} + + /** + * Gets a database + * @link http://www.php.net/manual/en/mongoclient.selectdb.php + * @param name string

    + * The database name. + *

    + * @return MongoDB a new database object. + */ + public function selectDB ($name) {} + + /** + * Gets a database collection + * @link http://www.php.net/manual/en/mongoclient.selectcollection.php + * @param db string

    + * The database name. + *

    + * @param collection string

    + * The collection name. + *

    + * @return MongoCollection a new collection object. + */ + public function selectCollection ($db, $collection) {} + + /** + * Get the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Drops a database [deprecated] + * @link http://www.php.net/manual/en/mongoclient.dropdb.php + * @param db mixed

    + * The database to drop. Can be a MongoDB object or the name of the database. + *

    + * @return array the database response. + */ + public function dropDB ($db) {} + + /** + * Lists all of the databases available. + * @link http://www.php.net/manual/en/mongoclient.listdbs.php + * @return array an associative array containing three fields. The first field is + * databases, which in turn contains an array. Each element + * of the array is an associative array corresponding to a database, giving th + * database's name, size, and if it's empty. The other two fields are + * totalSize (in bytes) and ok, which is 1 + * if this method ran successfully. + */ + public function listDBs () {} + + /** + * Updates status for all associated hosts + * @link http://www.php.net/manual/en/mongoclient.gethosts.php + * @return array an array of information about the hosts in the set. Includes each + * host's hostname, its health (1 is healthy), its state (1 is primary, 2 is + * secondary, 0 is anything else), the amount of time it took to ping the + * server, and when the last ping occurred. For example, on a three-member + * replica set, it might look something like: + */ + public function getHosts () {} + + /** + * Closes this connection + * @link http://www.php.net/manual/en/mongoclient.close.php + * @param connection boolean|string[optional]

    + * If connection is not given, or false then connection that would be + * selected for writes would be closed. In a single-node configuration, + * that is then the whole connection, but if you are connected to a + * replica set, close() will only close the + * connection to the primary server. + *

    + *

    + * If connection is true then all connections as known by the connection + * manager will be closed. This can include connections that are not + * referenced in the connection string used to create the object that + * you are calling close on. + *

    + *

    + * If connection is a string argument, then it will only close the + * connection identified by this hash. Hashes are identifiers for a + * connection and can be obtained by calling + * MongoClient::getConnections. + *

    + * @return bool if the connection was successfully closed. + */ + public function close ($connection = null) {} + + /** + * Kills a specific cursor on the server + * @link http://www.php.net/manual/en/mongoclient.killcursor.php + * @param server_hash string

    + * The server hash that has the cursor. This can be obtained through + * MongoCursor::info. + *

    + * @param id int|MongoInt64

    + * The ID of the cursor to kill. You can either supply an int + * containing the 64 bit cursor ID, or an object of the + * MongoInt64 class. The latter is necessary on 32 + * bit platforms (and Windows). + *

    + * @return bool true if the method attempted to kill a cursor, and false if + * there was something wrong with the arguments (such as a wrong + * server_hash). The return status does not + * reflect where the cursor was actually killed as the server does + * not provide that information. + */ + public static function killCursor ($server_hash, $id) {} + +} + +/** @jms-builtin */ +class MongoDB { + const PROFILING_OFF = 0; + const PROFILING_SLOW = 1; + const PROFILING_ON = 2; + + public $w; + public $wtimeout; + + + /** + * Creates a new database + * @link http://www.php.net/manual/en/mongodb.construct.php + * @param connection MongoClient + * @param database_name + */ + public function __construct (MongoClient $connection, $database_name) {} + + /** + * The name of this database + * @link http://www.php.net/manual/en/mongodb.--tostring.php + * @return string this database's name. + */ + public function __toString () {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongodb.get.php + * @param name string

    + * The name of the collection. + *

    + * @return MongoCollection the collection. + */ + public function __get ($name) {} + + /** + * Fetches toolkit for dealing with files stored in this database + * @link http://www.php.net/manual/en/mongodb.getgridfs.php + * @param prefix string[optional]

    + * The prefix for the files and chunks collections. + *

    + * @return MongoGridFS a new gridfs object for this database. + */ + public function getGridFS ($prefix = null) {} + + /** + * Get slaveOkay setting for this database + * @link http://www.php.net/manual/en/mongodb.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this database + * @link http://www.php.net/manual/en/mongodb.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoDB instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + /** + * Get the read preference for this database + * @link http://www.php.net/manual/en/mongodb.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this database + * @link http://www.php.net/manual/en/mongodb.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Get the write concern for this database + * @link http://www.php.net/manual/en/mongodb.getwriteconcern.php + * @return array + */ + public function getWriteConcern () {} + + /** + * Set the write concern for this database + * @link http://www.php.net/manual/en/mongodb.setwriteconcern.php + * @param w mixed + * @param wtimeout int[optional] + * @return bool + */ + public function setWriteConcern ($w, $wtimeout = null) {} + + /** + * Gets this database's profiling level + * @link http://www.php.net/manual/en/mongodb.getprofilinglevel.php + * @return int the profiling level. + */ + public function getProfilingLevel () {} + + /** + * Sets this database's profiling level + * @link http://www.php.net/manual/en/mongodb.setprofilinglevel.php + * @param level int

    + * Profiling level. + *

    + * @return int the previous profiling level. + */ + public function setProfilingLevel ($level) {} + + /** + * Drops this database + * @link http://www.php.net/manual/en/mongodb.drop.php + * @return array the database response. + */ + public function drop () {} + + /** + * Repairs and compacts this database + * @link http://www.php.net/manual/en/mongodb.repair.php + * @param preserve_cloned_files bool[optional]

    + * If cloned files should be kept if the repair fails. + *

    + * @param backup_original_files bool[optional]

    + * If original files should be backed up. + *

    + * @return array db response. + */ + public function repair ($preserve_cloned_files = null, $backup_original_files = null) {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongodb.selectcollection.php + * @param name string

    + * The collection name. + *

    + * @return MongoCollection a new collection object. + */ + public function selectCollection ($name) {} + + /** + * Creates a collection + * @link http://www.php.net/manual/en/mongodb.createcollection.php + * @param name string

    + * The name of the collection. + *

    + * @param options array[optional]

    + * An array containing options for the collections. Each option is its own + * element in the options array, with the option name listed below being + * the key of the element. The supported options depend on the MongoDB + * server version. At the moment, the following options are supported: + *

    + *

    + * capped + *

    + * If the collection should be a fixed size. + *

    + * @return MongoCollection a collection object representing the new collection. + */ + public function createCollection ($name, array $options = null) {} + + /** + * Drops a collection [deprecated] + * @link http://www.php.net/manual/en/mongodb.dropcollection.php + * @param coll mixed

    + * MongoCollection or name of collection to drop. + *

    + * @return array the database response. + */ + public function dropCollection ($coll) {} + + /** + * Gets an array of all MongoCollections for this database + * @link http://www.php.net/manual/en/mongodb.listcollections.php + * @param includeSystemCollections bool[optional]

    + * Include system collections. + *

    + * @return array an array of MongoCollection objects. + */ + public function listCollections ($includeSystemCollections = null) {} + + /** + * Get all collections from this database + * @link http://www.php.net/manual/en/mongodb.getcollectionnames.php + * @param includeSystemCollections bool[optional]

    + * Include system collections. + *

    + * @return array the names of the all the collections in the database as an array. + */ + public function getCollectionNames ($includeSystemCollections = null) {} + + /** + * Creates a database reference + * @link http://www.php.net/manual/en/mongodb.createdbref.php + * @param collection string

    + * The collection to which the database reference will point. + *

    + * @param document_or_id mixed

    + * If an array or object is given, its _id field will be + * used as the reference ID. If a MongoId or scalar + * is given, it will be used as the reference ID. + *

    + * @return array a database reference array. + *

    + *

    + * If an array without an _id field was provided as the + * document_or_id parameter, &null; will be returned. + */ + public function createDBRef ($collection, $document_or_id) {} + + /** + * Fetches the document pointed to by a database reference + * @link http://www.php.net/manual/en/mongodb.getdbref.php + * @param ref array

    + * A database reference. + *

    + * @return array the document pointed to by the reference. + */ + public function getDBRef (array $ref) {} + + /** + * Runs JavaScript code on the database server. + * @link http://www.php.net/manual/en/mongodb.execute.php + * @param code mixed

    + * MongoCode or string to execute. + *

    + * @param args array[optional]

    + * Arguments to be passed to code. + *

    + * @return array the result of the evaluation. + */ + public function execute ($code, array $args = null) {} + + /** + * Execute a database command + * @link http://www.php.net/manual/en/mongodb.command.php + * @param command array

    + * The query to send. + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.timeout; + *

    + * @return array database response. Every database response is always maximum one + * document, which means that the result of a database command can never + * exceed 16MB. The resulting document's structure depends on the command, but + * most results will have the ok field to indicate success + * or failure and results containing an array of each of + * the resulting documents. + */ + public function command (array $command, array $options = null) {} + + /** + * Check if there was an error on the most recent db operation performed + * @link http://www.php.net/manual/en/mongodb.lasterror.php + * @return array the error, if there was one. + */ + public function lastError () {} + + /** + * Checks for the last error thrown during a database operation + * @link http://www.php.net/manual/en/mongodb.preverror.php + * @return array the error and the number of operations ago it occurred. + */ + public function prevError () {} + + /** + * Clears any flagged errors on the database + * @link http://www.php.net/manual/en/mongodb.reseterror.php + * @return array the database response. + */ + public function resetError () {} + + /** + * Creates a database error + * @link http://www.php.net/manual/en/mongodb.forceerror.php + * @return bool the database response. + */ + public function forceError () {} + + /** + * Log in to this database + * @link http://www.php.net/manual/en/mongodb.authenticate.php + * @param username string

    + * The username. + *

    + * @param password string

    + * The password (in plaintext). + *

    + * @return array database response. If the login was successful, it will return + * 1); + * ?> + * ]]> + * If something went wrong, it will return + * 0, "errmsg" => "auth fails"); + * ?> + * ]]> + * ("auth fails" could be another message, depending on database version and what + * when wrong). + */ + public function authenticate ($username, $password) {} + +} + +/** @jms-builtin */ +class MongoCollection { + const ASCENDING = 1; + const DESCENDING = -1; + + public $w; + public $wtimeout; + + + /** + * Creates a new collection + * @link http://www.php.net/manual/en/mongocollection.construct.php + * @param database MongoDB + * @param collection_name + */ + public function __construct (MongoDB $database, $collection_name) {} + + /** + * String representation of this collection + * @link http://www.php.net/manual/en/mongocollection.--tostring.php + * @return string the full name of this collection. + */ + public function __toString () {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongocollection.get.php + * @param name string

    + * The next string in the collection name. + *

    + * @return MongoCollection the collection. + */ + public function __get ($name) {} + + /** + * Returns this collection's name + * @link http://www.php.net/manual/en/mongocollection.getname.php + * @return string the name of this collection. + */ + public function getName () {} + + /** + * Get slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoCollection + * instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + /** + * Get the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Get the write concern for this collection + * @link http://www.php.net/manual/en/mongocollection.getwriteconcern.php + * @return array + */ + public function getWriteConcern () {} + + /** + * Set the write concern for this database + * @link http://www.php.net/manual/en/mongocollection.setwriteconcern.php + * @param w mixed + * @param wtimeout int[optional] + * @return bool + */ + public function setWriteConcern ($w, $wtimeout = null) {} + + /** + * Drops this collection + * @link http://www.php.net/manual/en/mongocollection.drop.php + * @return array the database response. + */ + public function drop () {} + + /** + * Validates this collection + * @link http://www.php.net/manual/en/mongocollection.validate.php + * @param scan_data bool[optional]

    + * Only validate indices, not the base collection. + *

    + * @return array the database's evaluation of this object. + */ + public function validate ($scan_data = null) {} + + /** + * Inserts a document into the collection + * @link http://www.php.net/manual/en/mongocollection.insert.php + * @param a array|object

    + * An array or object. If an object is used, it may not have protected or + * private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. This special behavior does not mean that the + * parameter is passed by reference. + *

    + * @param options array[optional]

    + * Options for the insert. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return bool|array an array containing the status of the insertion if the + * "w" option is set. Otherwise, returns true if the + * inserted array is not empty (a MongoException will be + * thrown if the inserted array is empty). + *

    + *

    + * If an array is returned, the following keys may be present: + * ok + *

    + * This should almost always be 1 (unless last_error itself failed). + *

    + * err + *

    + * If this field is non-null, an error occurred on the previous operation. + * If this field is set, it will be a string describing the error that + * occurred. + *

    + * code + *

    + * If a database error occurred, the relevant error code will be passed + * back to the client. + *

    + * errmsg + *

    + * This field is set if something goes wrong with a database command. It + * is coupled with ok being 0. For example, if + * w is set and times out, errmsg will be set to "timed + * out waiting for slaves" and ok will be 0. If this + * field is set, it will be a string describing the error that occurred. + *

    + * n + *

    + * If the last operation was an update, upsert, or a remove, the number + * of documents affected will be returned. For insert operations, this value + * is always 0. + *

    + * wtimeout + *

    + * If the previous option timed out waiting for replication. + *

    + * waited + *

    + * How long the operation waited before timing out. + *

    + * wtime + *

    + * If w was set and the operation succeeded, how long it took to + * replicate to w servers. + *

    + * upserted + *

    + * If an upsert occurred, this field will contain the new record's + * _id field. For upserts, either this field or + * updatedExisting will be present (unless an error + * occurred). + *

    + * updatedExisting + *

    + * If an upsert updated an existing element, this field will be true. For + * upserts, either this field or upserted will be present (unless an error + * occurred). + *

    + */ + public function insert ($a, array $options = null) {} + + /** + * Inserts multiple documents into this collection + * @link http://www.php.net/manual/en/mongocollection.batchinsert.php + * @param a array

    + * An array of arrays or objects. If any objects are used, they may not have + * protected or private properties. + *

    + *

    + * If the documents to insert do not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the inserts. + *

    + * "continueOnError" + *

    + *

    + * Boolean, defaults to false. If set, the database will not stop + * processing a bulk insert if one fails (eg due to duplicate IDs). + * This makes bulk insert behave similarly to a series of single + * inserts, except that calling MongoDB::lastError + * will have an error set if any insert fails, not just the last one. + * If multiple errors occur, only the most recent will be reported by + * MongoDB::lastError. + *

    + *

    + * Please note that continueOnError affects errors + * on the database side only. If you try to insert a document that has + * errors (for example it contains a key with an empty name), then the + * document is not even transferred to the database as the driver + * detects this error and bails out. + * continueOnError has no effect on errors detected + * in the documents by the driver. + *

    + * @return mixed If the w parameter is set to acknowledge the write, + * returns an associative array with the status of the inserts ("ok") and any + * error that may have occurred ("err"). Otherwise, returns true if the + * batch insert was successfully sent, false otherwise. + */ + public function batchInsert (array $a, array $options = null) {} + + /** + * Update records based on a given criteria + * @link http://www.php.net/manual/en/mongocollection.update.php + * @param criteria array

    + * Description of the objects to update. + *

    + * @param new_object array

    + * The object with which to update the matching records. + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + *

    + * "upsert" + *

    + *

    + * If no document matches $criteria, a new + * document will be inserted. + *

    + *

    + * If a new document would be inserted and + * $new_object contains atomic modifiers + * (i.e. $ operators), those operations will be + * applied to the $criteria parameter to create + * the new document. If $new_object does not + * contain atomic modifiers, it will be used as-is for the inserted + * document. See the upsert examples below for more information. + *

    + * @return bool|array an array containing the status of the update if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function update (array $criteria, array $new_object, array $options = null) {} + + /** + * Remove records from this collection + * @link http://www.php.net/manual/en/mongocollection.remove.php + * @param criteria array[optional]

    + * Description of records to remove. + *

    + * @param options array[optional]

    + * Options for remove. + * &mongo.writes.parameters.writeconcern; + *

    + * "justOne" + *

    + *

    + * Remove at most one record matching this criteria. + *

    + * @return bool|array an array containing the status of the removal if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function remove (array $criteria = null, array $options = null) {} + + /** + * Queries this collection, returning a MongoCursor for the result set + * @link http://www.php.net/manual/en/mongocollection.find.php + * @param query array[optional]

    + * The fields for which to search. MongoDB's query language is quite + * extensive. The PHP driver will in almost all cases pass the query + * straight through to the server, so reading the MongoDB core docs on + * find is a good idea. + *

    + *

    + * Please make sure that for all special query operators (starting with + * $) you use single quotes so that PHP doesn't try to + * replace "$exists" with the value of the variable + * $exists. + *

    + * @param fields array[optional]

    + * Fields of the results to return. The array is in the format + * array('fieldname' => true, 'fieldname2' => true). + * The _id field is always returned. + *

    + * @return MongoCursor a cursor for the search results. + */ + public function find (array $query = null, array $fields = null) {} + + /** + * Queries this collection, returning a single element + * @link http://www.php.net/manual/en/mongocollection.findone.php + * @param query array[optional]

    + * The fields for which to search. MongoDB's query language is quite + * extensive. The PHP driver will in almost all cases pass the query + * straight through to the server, so reading the MongoDB core docs on + * find is a good idea. + *

    + *

    + * Please make sure that for all special query operaters (starting with + * $) you use single quotes so that PHP doesn't try to + * replace "$exists" with the value of the variable + * $exists. + *

    + * @param fields array[optional]

    + * Fields of the results to return. The array is in the format + * array('fieldname' => true, 'fieldname2' => true). + * The _id field is always returned. + *

    + * @return array record matching the search or &null;. + */ + public function findOne (array $query = null, array $fields = null) {} + + /** + * Update a document and return it + * @link http://www.php.net/manual/en/mongocollection.findandmodify.php + * @param query array

    + * The query criteria to search for. + *

    + * @param update array[optional]

    + * The update criteria. + *

    + * @param fields array[optional]

    + * Optionally only return these fields. + *

    + * @param options array[optional]

    + * An array of options to apply, such as remove the match document from the + * DB and return it. + * + * Option + * &Description; + * + * + * sort array + * + * Determines which document the operation will modify if the + * query selects multiple documents. findAndModify will modify the + * first document in the sort order specified by this argument. + * + * + * + * remove boolean + * + * Optional if update field exists. When true, removes the selected + * document. The default is false. + * + * + * + * update array + * + * Optional if remove field exists. + * Performs an update of the selected document. + * + * + * + * new boolean + * + * Optional. When true, returns the modified document rather than the + * original. The findAndModify method ignores the new option for + * remove operations. The default is false. + * + * + * + * upsert boolean + * + * Optional. Used in conjunction with the update field. When true, the + * findAndModify command creates a new document if the query returns + * no documents. The default is false. In MongoDB 2.2, the + * findAndModify command returns &null; when upsert is true. + * + * + * + * + * + * + * + *

    + * @return array the original document, or the modified document when + * new is set. + */ + public function findAndModify (array $query, array $update = null, array $fields = null, array $options = null) {} + + /** + * Execute a database command and retrieve results through a cursor + * @link http://www.php.net/manual/en/mongocollection.commandcursor.php + * @param command array

    + * The command query to send. + *

    + *

    + * It is possible to configure how many initial documents the server + * should return with the first result set. This configuration is made as + * part of the command query. The default initial batch size is + * 101. You can change it by adding the + * cursor key in the following way to the command: + *

    + * commandCursor( [ + * "aggregate" => "collectionName", + * "pipeline" => [ + * ... + * ], + * "cursor" => [ "batchSize" => 4 ], + * ] ); + * ]]> + *

    + * If you do not set the initial + * batchSize option, then the PHP driver will implicitly + * add this for you with a value of 101 + *

    + *

    + * This setting does only configure the first batch size. To configure the + * size of future batches, please use the + * MongoCommandCursor::batchSize method on the + * returned MongoCommandCursor object. + *

    + * @return MongoCommandCursor a MongoCommandCursor object. Because this + * implements the Iterator interface you can + * iterate over each of the results as returned by the command query. The + * MongoCommandCursor also implements the + * MongoCursorInterface interface which adds the + * MongoCommandCursor::batchSize, + * MongoCommandCursor::dead, + * MongoCommandCursor::info methods. + */ + public function commandCursor (array $command) {} + + /** + * Creates an index on the given field(s) + * @link http://www.php.net/manual/en/mongocollection.createindex.php + * @param keys array

    + * An array of fields by which to sort the index on. Each element in the + * array has as key the field name, and as value either + * 1 for ascending sort, -1 for + * descending sort, or any of the index plugins (currently, + * "text", "2d", or + * "2dsphere""). + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation. The array + * contains whether the operation worked ("ok"), the amount + * of indexes before and after the operation + * ("numIndexesBefore" and + * "numIndexesAfter") and whether the collection that the + * index belongs to has been created + * ("createdCollectionAutomatically"). + *

    + *

    + * With MongoDB 2.4 and earlier, a status document is only returned if the + * "w" option is set to 1—either through + * the connection string, or with . If + * "w" is not set to 1, it returns + * true. The fields in the status document are different, except for the + * "ok" field which signals whether the index creation + * worked. + */ + public function createIndex (array $keys, array $options = null) {} + + /** + * Creates an index on the given field(s), or does nothing if the index + already exists + * @link http://www.php.net/manual/en/mongocollection.ensureindex.php + * @param key_keys string|array + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function ensureIndex ($key_keys, array $options = null) {} + + /** + * Deletes an index from this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindex.php + * @param keys string|array

    + * Field or fields from which to delete the index. + *

    + * @return array the database response. + */ + public function deleteIndex ($keys) {} + + /** + * Delete all indices for this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindexes.php + * @return array the database response. + */ + public function deleteIndexes () {} + + /** + * Returns information about indexes on this collection + * @link http://www.php.net/manual/en/mongocollection.getindexinfo.php + * @return array This function returns an array in which each element describes an index. + * Elements will contain the values name for the name of + * the index, ns for the namespace (a combination of the + * database and collection name), and key for a list of all + * fields in the index and their ordering. Additional values may be present for + * special indexes, such as unique or + * sparse. + */ + public function getIndexInfo () {} + + /** + * Counts the number of documents in this collection + * @link http://www.php.net/manual/en/mongocollection.count.php + * @param query array[optional]

    + * Associative array or object with fields to match. + *

    + * @param limit int[optional]

    + * Specifies an upper limit to the number returned. + *

    + * @param skip int[optional]

    + * Specifies a number of results to skip before starting the count. + *

    + * @return int the number of documents matching the query. + */ + public function count (array $query = null, $limit = null, $skip = null) {} + + /** + * Saves a document to this collection + * @link http://www.php.net/manual/en/mongocollection.save.php + * @param a array|object

    + * Array or object to save. If an object is used, it may not have protected + * or private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the save. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return mixed If w was set, returns an array containing the status of the save. + * Otherwise, returns a boolean representing if the array was not empty (an empty array will not + * be inserted). + */ + public function save ($a, array $options = null) {} + + /** + * Creates a database reference + * @link http://www.php.net/manual/en/mongocollection.createdbref.php + * @param document_or_id mixed

    + * If an array or object is given, its _id field will be + * used as the reference ID. If a MongoId or scalar + * is given, it will be used as the reference ID. + *

    + * @return array a database reference array. + *

    + *

    + * If an array without an _id field was provided as the + * document_or_id parameter, &null; will be returned. + */ + public function createDBRef ($document_or_id) {} + + /** + * Fetches the document pointed to by a database reference + * @link http://www.php.net/manual/en/mongocollection.getdbref.php + * @param ref array

    + * A database reference. + *

    + * @return array the database document pointed to by the reference. + */ + public function getDBRef (array $ref) {} + + /** + * Converts keys specifying an index to its identifying string + * @link http://www.php.net/manual/en/mongocollection.toindexstring.php + * @param keys mixed

    + * Field or fields to convert to the identifying string + *

    + * @return string a string that describes the index. + */ + protected static function toIndexString ($keys) {} + + /** + * Performs an operation similar to SQL's GROUP BY command + * @link http://www.php.net/manual/en/mongocollection.group.php + * @param keys mixed

    + * Fields to group by. If an array or non-code object is passed, it will be + * the key used to group results. + *

    + *

    1.0.4+: If keys is an instance of + * MongoCode, keys will be treated as + * a function that returns the key to group by (see the "Passing a + * keys function" example below). + *

    + * @param initial array

    + * Initial value of the aggregation counter object. + *

    + * @param reduce MongoCode

    + * A function that takes two arguments (the current document and the + * aggregation to this point) and does the aggregation. + *

    + * @param options array[optional]

    + * Optional parameters to the group command. Valid options include: + *

    + *

    + * "condition" + *

    + *

    + * Criteria for including a document in the aggregation. + *

    + * @return array an array containing the result. + */ + public function group ($keys, array $initial, MongoCode $reduce, array $options = null) {} + + /** + * Retrieve a list of distinct values for the given key across a collection. + * @link http://www.php.net/manual/en/mongocollection.distinct.php + * @param key string

    + * The key to use. + *

    + * @param query array[optional]

    + * An optional query parameters + *

    + * @return array an array of distinct values, &return.falseforfailure; + */ + public function distinct ($key, array $query = null) {} + + /** + * Perform an aggregation using the aggregation framework + * @link http://www.php.net/manual/en/mongocollection.aggregate.php + * @param pipeline array

    + * An array of pipeline operators. + *

    + * @param options array[optional]

    + * Array of command arguments, such as allowDiskUse, explain or cursor. + *

    + * @return array The result of the aggregation as an array. The ok will + * be set to 1 on success, 0 on failure. + */ + public function aggregate (array $pipeline, array $options = null) {} + +} + +interface MongoCursorInterface extends Iterator, Traversable { + + /** + * @param number + */ + abstract public function batchSize ($number) {} + + abstract public function info () {} + + abstract public function dead () {} + + abstract public function current () {} + + abstract public function next () {} + + abstract public function key () {} + + abstract public function valid () {} + + abstract public function rewind () {} + +} + +/** @jms-builtin */ +class MongoCursor implements MongoCursorInterface, Traversable, Iterator { + public static $slaveOkay; + public static $timeout; + + + /** + * Create a new cursor + * @link http://www.php.net/manual/en/mongocursor.construct.php + * @param connection MongoClient + * @param database_and_collection_name + * @param query[optional] + * @param array_of_fields_OR_object[optional] + */ + public function __construct (MongoClient $connection, $database_and_collection_name, $query, $array_of_fields_OR_object) {} + + /** + * Checks if there are any more elements in this cursor + * @link http://www.php.net/manual/en/mongocursor.hasnext.php + * @return bool if there is another element. + */ + public function hasNext () {} + + /** + * Return the next object to which this cursor points, and advance the cursor + * @link http://www.php.net/manual/en/mongocursor.getnext.php + * @return array the next object. + */ + public function getNext () {} + + /** + * Limits the number of results returned + * @link http://www.php.net/manual/en/mongocursor.limit.php + * @param num int

    + * The number of results to return. + *

    + * @return MongoCursor this cursor. + */ + public function limit ($num) {} + + /** + * Limits the number of elements returned in one batch. + * @link http://www.php.net/manual/en/mongocursor.batchsize.php + * @param batchSize int

    + * The number of results to return per batch. Each batch requires a + * round-trip to the server. + *

    + *

    + * If batchSize is 2 or + * more, it represents the size of each batch of objects retrieved. + * It can be adjusted to optimize performance and limit data transfer. + *

    + *

    + * If batchSize is 1 or negative, it + * will limit of number returned documents to the absolute value of batchSize, + * and the cursor will be closed. For example if + * batchSize is -10, then the server will return a maximum + * of 10 documents and as many as can fit in 4MB, then close the cursor. + *

    + *

    + * A batchSize of 1 is special, and + * means the same as -1, i.e. a value of + * 1 makes the cursor only capable of returning + * one document. + *

    + *

    + * Note that this feature is different from + * MongoCursor::limit in that documents must fit within a + * maximum size, and it removes the need to send a request to close the cursor + * server-side. The batch size can be changed even after a cursor is iterated, + * in which case the setting will apply on the next batch retrieval. + *

    + *

    + * This cannot override MongoDB's limit on the amount of data it will return to + * the client (i.e., if you set batch size to 1,000,000,000, MongoDB will still + * only return 4-16MB of results per batch). + *

    + *

    + * To ensure consistent behavior, the rules of + * MongoCursor::batchSize and + * MongoCursor::limit behave a + * little complex but work "as expected". The rules are: hard limits override + * soft limits with preference given to MongoCursor::limit + * over MongoCursor::batchSize. After that, whichever is + * set and lower than the other will take precedence. See below. + * section for some examples. + *

    + * @return MongoCursor this cursor. + */ + public function batchSize ($batchSize) {} + + /** + * Skips a number of results + * @link http://www.php.net/manual/en/mongocursor.skip.php + * @param num int

    + * The number of results to skip. + *

    + * @return MongoCursor this cursor. + */ + public function skip ($num) {} + + /** + * Sets the fields for a query + * @link http://www.php.net/manual/en/mongocursor.fields.php + * @param f array

    + * Fields to return (or not return). + *

    + * @return MongoCursor this cursor. + */ + public function fields (array $f) {} + + /** + * @param ms + */ + public function maxTimeMS ($ms) {} + + /** + * Adds a top-level key/value pair to a query + * @link http://www.php.net/manual/en/mongocursor.addoption.php + * @param key string

    + * Fieldname to add. + *

    + * @param value mixed

    + * Value to add. + *

    + * @return MongoCursor this cursor. + */ + public function addOption ($key, $value) {} + + /** + * Use snapshot mode for the query + * @link http://www.php.net/manual/en/mongocursor.snapshot.php + * @return MongoCursor this cursor. + */ + public function snapshot () {} + + /** + * Sorts the results by given fields + * @link http://www.php.net/manual/en/mongocursor.sort.php + * @param fields array

    + * An array of fields by which to sort. Each element in the array has as + * key the field name, and as value either 1 for + * ascending sort, or -1 for descending sort. + *

    + *

    + * Each result is first sorted on the first field in the array, then (if + * it exists) on the second field in the array, etc. This means that the + * order of the fields in the fields array is + * important. See also the examples section. + *

    + * @return MongoCursor the same cursor that this method was called on. + */ + public function sort (array $fields) {} + + /** + * Gives the database a hint about the query + * @link http://www.php.net/manual/en/mongocursor.hint.php + * @param index mixed

    + * Index to use for the query. If a string is passed, it should correspond + * to an index name. If an array or object is passed, it should correspond + * to the specification used to create the index (i.e. the first argument + * to MongoCollection::ensureIndex). + *

    + * @return MongoCursor this cursor. + */ + public function hint ($index) {} + + /** + * Return an explanation of the query, often useful for optimization and debugging + * @link http://www.php.net/manual/en/mongocursor.explain.php + * @return array an explanation of the query. + */ + public function explain () {} + + /** + * Sets arbitrary flags in case there is no method available the specific flag + * @link http://www.php.net/manual/en/mongocursor.setflag.php + * @param flag int

    + * Which flag to set. You can not set flag 6 (EXHAUST) as the driver does + * not know how to handle them. You will get a warning if you try to use + * this flag. For available flags, please refer to the wire protocol + * documentation. + *

    + * @param set bool[optional]

    + * Whether the flag should be set (true) or unset (false). + *

    + * @return MongoCursor this cursor. + */ + public function setFlag ($flag, $set = null) {} + + /** + * Sets whether this query can be done on a secondary [deprecated] + * @link http://www.php.net/manual/en/mongocursor.slaveokay.php + * @param okay bool[optional]

    + * If it is okay to query the secondary. + *

    + * @return MongoCursor this cursor. + */ + public function slaveOkay ($okay = null) {} + + /** + * Sets whether this cursor will be left open after fetching the last results + * @link http://www.php.net/manual/en/mongocursor.tailable.php + * @param tail bool[optional]

    + * If the cursor should be tailable. + *

    + * @return MongoCursor this cursor. + */ + public function tailable ($tail = null) {} + + /** + * Sets whether this cursor will timeout + * @link http://www.php.net/manual/en/mongocursor.immortal.php + * @param liveForever bool[optional]

    + * If the cursor should be immortal. + *

    + * @return MongoCursor this cursor. + */ + public function immortal ($liveForever = null) {} + + /** + * Sets whether this cursor will wait for a while for a tailable cursor to return more data + * @link http://www.php.net/manual/en/mongocursor.awaitdata.php + * @param wait bool[optional]

    + * If the cursor should wait for more data to become available. + *

    + * @return MongoCursor this cursor. + */ + public function awaitData ($wait = null) {} + + /** + * If this query should fetch partial results from mongos if a shard is down + * @link http://www.php.net/manual/en/mongocursor.partial.php + * @param okay bool[optional]

    + * If receiving partial results is okay. + *

    + * @return MongoCursor this cursor. + */ + public function partial ($okay = null) {} + + /** + * Get the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return MongoCursor this cursor. + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Sets a client-side timeout for this query + * @link http://www.php.net/manual/en/mongocursor.timeout.php + * @param ms int

    + * The number of milliseconds for the cursor to wait for a response. Use + * -1 to wait forever. By default, the cursor will wait + * MongoCursor::$timeout milliseconds. + *

    + * @return MongoCursor This cursor. + */ + public function timeout ($ms) {} + + /** + * Execute the query. + * @link http://www.php.net/manual/en/mongocursor.doquery.php + * @return void &null;. + */ + protected function doQuery () {} + + /** + * Gets the query, fields, limit, and skip for this cursor + * @link http://www.php.net/manual/en/mongocursor.info.php + * @return array the namespace, limit, skip, query, and fields for this cursor. + */ + public function info () {} + + /** + * Checks if there are documents that have not been sent yet from the database for this cursor + * @link http://www.php.net/manual/en/mongocursor.dead.php + * @return bool if there are more results that have not been sent to the client, yet. + */ + public function dead () {} + + /** + * Returns the current element + * @link http://www.php.net/manual/en/mongocursor.current.php + * @return array The current result as an associative array. + */ + public function current () {} + + /** + * Returns the current result's _id + * @link http://www.php.net/manual/en/mongocursor.key.php + * @return string The current result's _id as a string. + */ + public function key () {} + + /** + * Advances the cursor to the next result + * @link http://www.php.net/manual/en/mongocursor.next.php + * @return void &null;. + */ + public function next () {} + + /** + * Returns the cursor to the beginning of the result set + * @link http://www.php.net/manual/en/mongocursor.rewind.php + * @return void &null;. + */ + public function rewind () {} + + /** + * Checks if the cursor is reading a valid result. + * @link http://www.php.net/manual/en/mongocursor.valid.php + * @return bool If the current result is not null. + */ + public function valid () {} + + /** + * Clears the cursor + * @link http://www.php.net/manual/en/mongocursor.reset.php + * @return void &null;. + */ + public function reset () {} + + /** + * Counts the number of results for this query + * @link http://www.php.net/manual/en/mongocursor.count.php + * @param foundOnly bool[optional]

    + * Send cursor limit and skip information to the count function, if applicable. + *

    + * @return int The number of documents returned by this cursor's query. + */ + public function count ($foundOnly = null) {} + +} + +/** @jms-builtin */ +class MongoCommandCursor implements MongoCursorInterface, Traversable, Iterator { + + /** + * Create a new command cursor + * @link http://www.php.net/manual/en/mongocommandcursor.construct.php + * @param connection MongoClient + * @param database_and_collection_name + * @param query[optional] + * @param array_of_fields_OR_object[optional] + */ + public function __construct (MongoClient $connection, $database_and_collection_name, $query, $array_of_fields_OR_object) {} + + /** + * Limits the number of elements returned in one batch. + * @link http://www.php.net/manual/en/mongocommandcursor.batchsize.php + * @param batchSize int

    + * The number of results to return per batch. Each batch requires a + * round-trip to the server. + *

    + *

    + * This cannot override MongoDB's limit on the amount of data it will return to + * the client (i.e., if you set batch size to 1,000,000,000, MongoDB will still + * only return 4-16MB of results per batch). + *

    + * @return MongoCommandCursor this cursor. + */ + public function batchSize ($batchSize) {} + + /** + * Gets the query, fields, limit, and skip for this cursor + * @link http://www.php.net/manual/en/mongocommandcursor.info.php + * @return array the namespace, limit, skip, query, fields, connection and iteration + * information for this cursor. + */ + public function info () {} + + /** + * Checks if there are documents that have not been sent yet from the database for this cursor + * @link http://www.php.net/manual/en/mongocommandcursor.dead.php + * @return bool if there are more results that have not been sent to the client, yet. + */ + public function dead () {} + + /** + * Returns the current element + * @link http://www.php.net/manual/en/mongocommandcursor.current.php + * @return array The current result as an associative array. + */ + public function current () {} + + /** + * Returns the current result's _id + * @link http://www.php.net/manual/en/mongocommandcursor.key.php + * @return string The current result's _id as a string. + */ + public function key () {} + + /** + * Advances the cursor to the next result + * @link http://www.php.net/manual/en/mongocommandcursor.next.php + * @return void &null;. + */ + public function next () {} + + /** + * Executes the command and resets the cursor to the start of the result set + * @link http://www.php.net/manual/en/mongocommandcursor.rewind.php + * @return array The raw server result document. + */ + public function rewind () {} + + /** + * Fetches a new result item, and returns whether it could + * @link http://www.php.net/manual/en/mongocommandcursor.valid.php + * @return bool true if a next item could be returned, and false otherwise. + */ + public function valid () {} + + public function reset () {} + +} + +/** @jms-builtin */ +class MongoGridFS extends MongoCollection { + const ASCENDING = 1; + const DESCENDING = -1; + + public $w; + public $wtimeout; + public $chunks; + protected $filesName; + protected $chunksName; + + + /** + * Creates new file collections + * @link http://www.php.net/manual/en/mongogridfs.construct.php + */ + public function __construct () {} + + /** + * Drops the files and chunks collections + * @link http://www.php.net/manual/en/mongogridfs.drop.php + * @return array The database response. + */ + public function drop () {} + + /** + * Queries for files + * @link http://www.php.net/manual/en/mongogridfs.find.php + * @param query array[optional]

    + * The query. + *

    + * @param fields array[optional]

    + * Fields to return. + *

    + * @return MongoGridFSCursor A MongoGridFSCursor. + */ + public function find (array $query = null, array $fields = null) {} + + /** + * Stores a file in the database + * @link http://www.php.net/manual/en/mongogridfs.storefile.php + * @param filename string

    + * Name of the file to store. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + * @param options array[optional]

    + * Options for the store. + * &mongo.writes.parameters.writeconcern; + *

    + * @return mixed + */ + public function storeFile ($filename, array $metadata = null, array $options = null) {} + + /** + * Stores a string of bytes in the database + * @link http://www.php.net/manual/en/mongogridfs.storebytes.php + * @param bytes string

    + * String of bytes to store. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + * @param options array[optional]

    + * Options for the store. + * &mongo.writes.parameters.writeconcern; + *

    + * @return mixed + */ + public function storeBytes ($bytes, array $metadata = null, array $options = null) {} + + /** + * Returns a single file matching the criteria + * @link http://www.php.net/manual/en/mongogridfs.findone.php + * @param query mixed[optional]

    + * The filename or criteria for which to search. + *

    + * @param fields mixed[optional] + * @return MongoGridFSFile a MongoGridFSFile or &null;. + */ + public function findOne ($query = null, $fields = null) {} + + /** + * Removes files from the collections + * @link http://www.php.net/manual/en/mongogridfs.remove.php + * @param criteria array[optional] + * @param options array[optional]

    + * Options for the remove. Valid options are: + *

    + * &mongo.writes.parameters.writeconcern; + * @return bool if the removal was successfully sent to the database. + */ + public function remove (array $criteria = null, array $options = null) {} + + /** + * Stores an uploaded file in the database + * @link http://www.php.net/manual/en/mongogridfs.storeupload.php + * @param name string

    + * The name of the uploaded file to store. This should correspond to the + * file field's name attribute in the HTML form. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + *

    + * The filename index will be populated with the + * filename used. + *

    + * @return mixed + */ + public function storeUpload ($name, array $metadata = null) {} + + /** + * Delete a file from the database + * @link http://www.php.net/manual/en/mongogridfs.delete.php + * @param id mixed

    + * _id of the file to remove. + *

    + * @return bool if the remove was successfully sent to the database. + */ + public function delete ($id) {} + + /** + * Retrieve a file from the database + * @link http://www.php.net/manual/en/mongogridfs.get.php + * @param id mixed

    + * _id of the file to find. + *

    + * @return MongoGridFSFile the file, if found, or &null;. + */ + public function get ($id) {} + + /** + * Stores a file in the database + * @link http://www.php.net/manual/en/mongogridfs.put.php + * @param filename string

    + * Name of the file to store. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + * @return mixed + */ + public function put ($filename, array $metadata = null) {} + + /** + * String representation of this collection + * @link http://www.php.net/manual/en/mongocollection.--tostring.php + * @return string the full name of this collection. + */ + public function __toString () {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongocollection.get.php + * @param name string

    + * The next string in the collection name. + *

    + * @return MongoCollection the collection. + */ + public function __get ($name) {} + + /** + * Returns this collection's name + * @link http://www.php.net/manual/en/mongocollection.getname.php + * @return string the name of this collection. + */ + public function getName () {} + + /** + * Get slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoCollection + * instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + /** + * Get the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Get the write concern for this collection + * @link http://www.php.net/manual/en/mongocollection.getwriteconcern.php + * @return array + */ + public function getWriteConcern () {} + + /** + * Set the write concern for this database + * @link http://www.php.net/manual/en/mongocollection.setwriteconcern.php + * @param w mixed + * @param wtimeout int[optional] + * @return bool + */ + public function setWriteConcern ($w, $wtimeout = null) {} + + /** + * Validates this collection + * @link http://www.php.net/manual/en/mongocollection.validate.php + * @param scan_data bool[optional]

    + * Only validate indices, not the base collection. + *

    + * @return array the database's evaluation of this object. + */ + public function validate ($scan_data = null) {} + + /** + * Inserts a document into the collection + * @link http://www.php.net/manual/en/mongocollection.insert.php + * @param a array|object

    + * An array or object. If an object is used, it may not have protected or + * private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. This special behavior does not mean that the + * parameter is passed by reference. + *

    + * @param options array[optional]

    + * Options for the insert. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return bool|array an array containing the status of the insertion if the + * "w" option is set. Otherwise, returns true if the + * inserted array is not empty (a MongoException will be + * thrown if the inserted array is empty). + *

    + *

    + * If an array is returned, the following keys may be present: + * ok + *

    + * This should almost always be 1 (unless last_error itself failed). + *

    + * err + *

    + * If this field is non-null, an error occurred on the previous operation. + * If this field is set, it will be a string describing the error that + * occurred. + *

    + * code + *

    + * If a database error occurred, the relevant error code will be passed + * back to the client. + *

    + * errmsg + *

    + * This field is set if something goes wrong with a database command. It + * is coupled with ok being 0. For example, if + * w is set and times out, errmsg will be set to "timed + * out waiting for slaves" and ok will be 0. If this + * field is set, it will be a string describing the error that occurred. + *

    + * n + *

    + * If the last operation was an update, upsert, or a remove, the number + * of documents affected will be returned. For insert operations, this value + * is always 0. + *

    + * wtimeout + *

    + * If the previous option timed out waiting for replication. + *

    + * waited + *

    + * How long the operation waited before timing out. + *

    + * wtime + *

    + * If w was set and the operation succeeded, how long it took to + * replicate to w servers. + *

    + * upserted + *

    + * If an upsert occurred, this field will contain the new record's + * _id field. For upserts, either this field or + * updatedExisting will be present (unless an error + * occurred). + *

    + * updatedExisting + *

    + * If an upsert updated an existing element, this field will be true. For + * upserts, either this field or upserted will be present (unless an error + * occurred). + *

    + */ + public function insert ($a, array $options = null) {} + + /** + * Inserts multiple documents into this collection + * @link http://www.php.net/manual/en/mongocollection.batchinsert.php + * @param a array

    + * An array of arrays or objects. If any objects are used, they may not have + * protected or private properties. + *

    + *

    + * If the documents to insert do not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the inserts. + *

    + * "continueOnError" + *

    + *

    + * Boolean, defaults to false. If set, the database will not stop + * processing a bulk insert if one fails (eg due to duplicate IDs). + * This makes bulk insert behave similarly to a series of single + * inserts, except that calling MongoDB::lastError + * will have an error set if any insert fails, not just the last one. + * If multiple errors occur, only the most recent will be reported by + * MongoDB::lastError. + *

    + *

    + * Please note that continueOnError affects errors + * on the database side only. If you try to insert a document that has + * errors (for example it contains a key with an empty name), then the + * document is not even transferred to the database as the driver + * detects this error and bails out. + * continueOnError has no effect on errors detected + * in the documents by the driver. + *

    + * @return mixed If the w parameter is set to acknowledge the write, + * returns an associative array with the status of the inserts ("ok") and any + * error that may have occurred ("err"). Otherwise, returns true if the + * batch insert was successfully sent, false otherwise. + */ + public function batchInsert (array $a, array $options = null) {} + + /** + * Update records based on a given criteria + * @link http://www.php.net/manual/en/mongocollection.update.php + * @param criteria array

    + * Description of the objects to update. + *

    + * @param new_object array

    + * The object with which to update the matching records. + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + *

    + * "upsert" + *

    + *

    + * If no document matches $criteria, a new + * document will be inserted. + *

    + *

    + * If a new document would be inserted and + * $new_object contains atomic modifiers + * (i.e. $ operators), those operations will be + * applied to the $criteria parameter to create + * the new document. If $new_object does not + * contain atomic modifiers, it will be used as-is for the inserted + * document. See the upsert examples below for more information. + *

    + * @return bool|array an array containing the status of the update if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function update (array $criteria, array $new_object, array $options = null) {} + + /** + * Update a document and return it + * @link http://www.php.net/manual/en/mongocollection.findandmodify.php + * @param query array

    + * The query criteria to search for. + *

    + * @param update array[optional]

    + * The update criteria. + *

    + * @param fields array[optional]

    + * Optionally only return these fields. + *

    + * @param options array[optional]

    + * An array of options to apply, such as remove the match document from the + * DB and return it. + * + * Option + * &Description; + * + * + * sort array + * + * Determines which document the operation will modify if the + * query selects multiple documents. findAndModify will modify the + * first document in the sort order specified by this argument. + * + * + * + * remove boolean + * + * Optional if update field exists. When true, removes the selected + * document. The default is false. + * + * + * + * update array + * + * Optional if remove field exists. + * Performs an update of the selected document. + * + * + * + * new boolean + * + * Optional. When true, returns the modified document rather than the + * original. The findAndModify method ignores the new option for + * remove operations. The default is false. + * + * + * + * upsert boolean + * + * Optional. Used in conjunction with the update field. When true, the + * findAndModify command creates a new document if the query returns + * no documents. The default is false. In MongoDB 2.2, the + * findAndModify command returns &null; when upsert is true. + * + * + * + * + * + * + * + *

    + * @return array the original document, or the modified document when + * new is set. + */ + public function findAndModify (array $query, array $update = null, array $fields = null, array $options = null) {} + + /** + * Execute a database command and retrieve results through a cursor + * @link http://www.php.net/manual/en/mongocollection.commandcursor.php + * @param command array

    + * The command query to send. + *

    + *

    + * It is possible to configure how many initial documents the server + * should return with the first result set. This configuration is made as + * part of the command query. The default initial batch size is + * 101. You can change it by adding the + * cursor key in the following way to the command: + *

    + * commandCursor( [ + * "aggregate" => "collectionName", + * "pipeline" => [ + * ... + * ], + * "cursor" => [ "batchSize" => 4 ], + * ] ); + * ]]> + *

    + * If you do not set the initial + * batchSize option, then the PHP driver will implicitly + * add this for you with a value of 101 + *

    + *

    + * This setting does only configure the first batch size. To configure the + * size of future batches, please use the + * MongoCommandCursor::batchSize method on the + * returned MongoCommandCursor object. + *

    + * @return MongoCommandCursor a MongoCommandCursor object. Because this + * implements the Iterator interface you can + * iterate over each of the results as returned by the command query. The + * MongoCommandCursor also implements the + * MongoCursorInterface interface which adds the + * MongoCommandCursor::batchSize, + * MongoCommandCursor::dead, + * MongoCommandCursor::info methods. + */ + public function commandCursor (array $command) {} + + /** + * Creates an index on the given field(s) + * @link http://www.php.net/manual/en/mongocollection.createindex.php + * @param keys array

    + * An array of fields by which to sort the index on. Each element in the + * array has as key the field name, and as value either + * 1 for ascending sort, -1 for + * descending sort, or any of the index plugins (currently, + * "text", "2d", or + * "2dsphere""). + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation. The array + * contains whether the operation worked ("ok"), the amount + * of indexes before and after the operation + * ("numIndexesBefore" and + * "numIndexesAfter") and whether the collection that the + * index belongs to has been created + * ("createdCollectionAutomatically"). + *

    + *

    + * With MongoDB 2.4 and earlier, a status document is only returned if the + * "w" option is set to 1—either through + * the connection string, or with . If + * "w" is not set to 1, it returns + * true. The fields in the status document are different, except for the + * "ok" field which signals whether the index creation + * worked. + */ + public function createIndex (array $keys, array $options = null) {} + + /** + * Creates an index on the given field(s), or does nothing if the index + already exists + * @link http://www.php.net/manual/en/mongocollection.ensureindex.php + * @param key_keys string|array + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function ensureIndex ($key_keys, array $options = null) {} + + /** + * Deletes an index from this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindex.php + * @param keys string|array

    + * Field or fields from which to delete the index. + *

    + * @return array the database response. + */ + public function deleteIndex ($keys) {} + + /** + * Delete all indices for this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindexes.php + * @return array the database response. + */ + public function deleteIndexes () {} + + /** + * Returns information about indexes on this collection + * @link http://www.php.net/manual/en/mongocollection.getindexinfo.php + * @return array This function returns an array in which each element describes an index. + * Elements will contain the values name for the name of + * the index, ns for the namespace (a combination of the + * database and collection name), and key for a list of all + * fields in the index and their ordering. Additional values may be present for + * special indexes, such as unique or + * sparse. + */ + public function getIndexInfo () {} + + /** + * Counts the number of documents in this collection + * @link http://www.php.net/manual/en/mongocollection.count.php + * @param query array[optional]

    + * Associative array or object with fields to match. + *

    + * @param limit int[optional]

    + * Specifies an upper limit to the number returned. + *

    + * @param skip int[optional]

    + * Specifies a number of results to skip before starting the count. + *

    + * @return int the number of documents matching the query. + */ + public function count (array $query = null, $limit = null, $skip = null) {} + + /** + * Saves a document to this collection + * @link http://www.php.net/manual/en/mongocollection.save.php + * @param a array|object

    + * Array or object to save. If an object is used, it may not have protected + * or private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the save. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return mixed If w was set, returns an array containing the status of the save. + * Otherwise, returns a boolean representing if the array was not empty (an empty array will not + * be inserted). + */ + public function save ($a, array $options = null) {} + + /** + * Creates a database reference + * @link http://www.php.net/manual/en/mongocollection.createdbref.php + * @param document_or_id mixed

    + * If an array or object is given, its _id field will be + * used as the reference ID. If a MongoId or scalar + * is given, it will be used as the reference ID. + *

    + * @return array a database reference array. + *

    + *

    + * If an array without an _id field was provided as the + * document_or_id parameter, &null; will be returned. + */ + public function createDBRef ($document_or_id) {} + + /** + * Fetches the document pointed to by a database reference + * @link http://www.php.net/manual/en/mongocollection.getdbref.php + * @param ref array

    + * A database reference. + *

    + * @return array the database document pointed to by the reference. + */ + public function getDBRef (array $ref) {} + + /** + * Converts keys specifying an index to its identifying string + * @link http://www.php.net/manual/en/mongocollection.toindexstring.php + * @param keys mixed

    + * Field or fields to convert to the identifying string + *

    + * @return string a string that describes the index. + */ + protected static function toIndexString ($keys) {} + + /** + * Performs an operation similar to SQL's GROUP BY command + * @link http://www.php.net/manual/en/mongocollection.group.php + * @param keys mixed

    + * Fields to group by. If an array or non-code object is passed, it will be + * the key used to group results. + *

    + *

    1.0.4+: If keys is an instance of + * MongoCode, keys will be treated as + * a function that returns the key to group by (see the "Passing a + * keys function" example below). + *

    + * @param initial array

    + * Initial value of the aggregation counter object. + *

    + * @param reduce MongoCode

    + * A function that takes two arguments (the current document and the + * aggregation to this point) and does the aggregation. + *

    + * @param options array[optional]

    + * Optional parameters to the group command. Valid options include: + *

    + *

    + * "condition" + *

    + *

    + * Criteria for including a document in the aggregation. + *

    + * @return array an array containing the result. + */ + public function group ($keys, array $initial, MongoCode $reduce, array $options = null) {} + + /** + * Retrieve a list of distinct values for the given key across a collection. + * @link http://www.php.net/manual/en/mongocollection.distinct.php + * @param key string

    + * The key to use. + *

    + * @param query array[optional]

    + * An optional query parameters + *

    + * @return array an array of distinct values, &return.falseforfailure; + */ + public function distinct ($key, array $query = null) {} + + /** + * Perform an aggregation using the aggregation framework + * @link http://www.php.net/manual/en/mongocollection.aggregate.php + * @param pipeline array

    + * An array of pipeline operators. + *

    + * @param options array[optional]

    + * Array of command arguments, such as allowDiskUse, explain or cursor. + *

    + * @return array The result of the aggregation as an array. The ok will + * be set to 1 on success, 0 on failure. + */ + public function aggregate (array $pipeline, array $options = null) {} + +} + +/** @jms-builtin */ +class MongoGridFSFile { + public $file; + protected $gridfs; + + + /** + * Create a new GridFS file + * @link http://www.php.net/manual/en/mongogridfsfile.construct.php + */ + public function __construct () {} + + /** + * Returns this file's filename + * @link http://www.php.net/manual/en/mongogridfsfile.getfilename.php + * @return string the filename. + */ + public function getFilename () {} + + /** + * Returns this file's size + * @link http://www.php.net/manual/en/mongogridfsfile.getsize.php + * @return int this file's size + */ + public function getSize () {} + + /** + * Writes this file to the filesystem + * @link http://www.php.net/manual/en/mongogridfsfile.write.php + * @param filename string[optional]

    + * The location to which to write the file. If none is given, + * the stored filename will be used. + *

    + * @return int the number of bytes written. + */ + public function write ($filename = null) {} + + /** + * Returns this file's contents as a string of bytes + * @link http://www.php.net/manual/en/mongogridfsfile.getbytes.php + * @return string a string of the bytes in the file. + */ + public function getBytes () {} + + /** + * Returns a resource that can be used to read the stored file + * @link http://www.php.net/manual/en/mongogridfsfile.getresource.php + * @return stream a resource that can be used to read the file with + */ + public function getResource () {} + +} + +/** @jms-builtin */ +class MongoGridFSCursor extends MongoCursor implements Iterator, Traversable, MongoCursorInterface { + public static $slaveOkay; + public static $timeout; + protected $gridfs; + + + /** + * Create a new cursor + * @link http://www.php.net/manual/en/mongogridfscursor.construct.php + */ + public function __construct () {} + + /** + * Return the next file to which this cursor points, and advance the cursor + * @link http://www.php.net/manual/en/mongogridfscursor.getnext.php + * @return MongoGridFSFile the next file. + */ + public function getNext () {} + + /** + * Returns the current file + * @link http://www.php.net/manual/en/mongogridfscursor.current.php + * @return MongoGridFSFile The current file. + */ + public function current () {} + + /** + * Checks if there are any more elements in this cursor + * @link http://www.php.net/manual/en/mongocursor.hasnext.php + * @return bool if there is another element. + */ + public function hasNext () {} + + /** + * Limits the number of results returned + * @link http://www.php.net/manual/en/mongocursor.limit.php + * @param num int

    + * The number of results to return. + *

    + * @return MongoCursor this cursor. + */ + public function limit ($num) {} + + /** + * Limits the number of elements returned in one batch. + * @link http://www.php.net/manual/en/mongocursor.batchsize.php + * @param batchSize int

    + * The number of results to return per batch. Each batch requires a + * round-trip to the server. + *

    + *

    + * If batchSize is 2 or + * more, it represents the size of each batch of objects retrieved. + * It can be adjusted to optimize performance and limit data transfer. + *

    + *

    + * If batchSize is 1 or negative, it + * will limit of number returned documents to the absolute value of batchSize, + * and the cursor will be closed. For example if + * batchSize is -10, then the server will return a maximum + * of 10 documents and as many as can fit in 4MB, then close the cursor. + *

    + *

    + * A batchSize of 1 is special, and + * means the same as -1, i.e. a value of + * 1 makes the cursor only capable of returning + * one document. + *

    + *

    + * Note that this feature is different from + * MongoCursor::limit in that documents must fit within a + * maximum size, and it removes the need to send a request to close the cursor + * server-side. The batch size can be changed even after a cursor is iterated, + * in which case the setting will apply on the next batch retrieval. + *

    + *

    + * This cannot override MongoDB's limit on the amount of data it will return to + * the client (i.e., if you set batch size to 1,000,000,000, MongoDB will still + * only return 4-16MB of results per batch). + *

    + *

    + * To ensure consistent behavior, the rules of + * MongoCursor::batchSize and + * MongoCursor::limit behave a + * little complex but work "as expected". The rules are: hard limits override + * soft limits with preference given to MongoCursor::limit + * over MongoCursor::batchSize. After that, whichever is + * set and lower than the other will take precedence. See below. + * section for some examples. + *

    + * @return MongoCursor this cursor. + */ + public function batchSize ($batchSize) {} + + /** + * Skips a number of results + * @link http://www.php.net/manual/en/mongocursor.skip.php + * @param num int

    + * The number of results to skip. + *

    + * @return MongoCursor this cursor. + */ + public function skip ($num) {} + + /** + * Sets the fields for a query + * @link http://www.php.net/manual/en/mongocursor.fields.php + * @param f array

    + * Fields to return (or not return). + *

    + * @return MongoCursor this cursor. + */ + public function fields (array $f) {} + + /** + * @param ms + */ + public function maxTimeMS ($ms) {} + + /** + * Adds a top-level key/value pair to a query + * @link http://www.php.net/manual/en/mongocursor.addoption.php + * @param key string

    + * Fieldname to add. + *

    + * @param value mixed

    + * Value to add. + *

    + * @return MongoCursor this cursor. + */ + public function addOption ($key, $value) {} + + /** + * Use snapshot mode for the query + * @link http://www.php.net/manual/en/mongocursor.snapshot.php + * @return MongoCursor this cursor. + */ + public function snapshot () {} + + /** + * Sorts the results by given fields + * @link http://www.php.net/manual/en/mongocursor.sort.php + * @param fields array

    + * An array of fields by which to sort. Each element in the array has as + * key the field name, and as value either 1 for + * ascending sort, or -1 for descending sort. + *

    + *

    + * Each result is first sorted on the first field in the array, then (if + * it exists) on the second field in the array, etc. This means that the + * order of the fields in the fields array is + * important. See also the examples section. + *

    + * @return MongoCursor the same cursor that this method was called on. + */ + public function sort (array $fields) {} + + /** + * Gives the database a hint about the query + * @link http://www.php.net/manual/en/mongocursor.hint.php + * @param index mixed

    + * Index to use for the query. If a string is passed, it should correspond + * to an index name. If an array or object is passed, it should correspond + * to the specification used to create the index (i.e. the first argument + * to MongoCollection::ensureIndex). + *

    + * @return MongoCursor this cursor. + */ + public function hint ($index) {} + + /** + * Return an explanation of the query, often useful for optimization and debugging + * @link http://www.php.net/manual/en/mongocursor.explain.php + * @return array an explanation of the query. + */ + public function explain () {} + + /** + * Sets arbitrary flags in case there is no method available the specific flag + * @link http://www.php.net/manual/en/mongocursor.setflag.php + * @param flag int

    + * Which flag to set. You can not set flag 6 (EXHAUST) as the driver does + * not know how to handle them. You will get a warning if you try to use + * this flag. For available flags, please refer to the wire protocol + * documentation. + *

    + * @param set bool[optional]

    + * Whether the flag should be set (true) or unset (false). + *

    + * @return MongoCursor this cursor. + */ + public function setFlag ($flag, $set = null) {} + + /** + * Sets whether this query can be done on a secondary [deprecated] + * @link http://www.php.net/manual/en/mongocursor.slaveokay.php + * @param okay bool[optional]

    + * If it is okay to query the secondary. + *

    + * @return MongoCursor this cursor. + */ + public function slaveOkay ($okay = null) {} + + /** + * Sets whether this cursor will be left open after fetching the last results + * @link http://www.php.net/manual/en/mongocursor.tailable.php + * @param tail bool[optional]

    + * If the cursor should be tailable. + *

    + * @return MongoCursor this cursor. + */ + public function tailable ($tail = null) {} + + /** + * Sets whether this cursor will timeout + * @link http://www.php.net/manual/en/mongocursor.immortal.php + * @param liveForever bool[optional]

    + * If the cursor should be immortal. + *

    + * @return MongoCursor this cursor. + */ + public function immortal ($liveForever = null) {} + + /** + * Sets whether this cursor will wait for a while for a tailable cursor to return more data + * @link http://www.php.net/manual/en/mongocursor.awaitdata.php + * @param wait bool[optional]

    + * If the cursor should wait for more data to become available. + *

    + * @return MongoCursor this cursor. + */ + public function awaitData ($wait = null) {} + + /** + * If this query should fetch partial results from mongos if a shard is down + * @link http://www.php.net/manual/en/mongocursor.partial.php + * @param okay bool[optional]

    + * If receiving partial results is okay. + *

    + * @return MongoCursor this cursor. + */ + public function partial ($okay = null) {} + + /** + * Get the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return MongoCursor this cursor. + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Sets a client-side timeout for this query + * @link http://www.php.net/manual/en/mongocursor.timeout.php + * @param ms int

    + * The number of milliseconds for the cursor to wait for a response. Use + * -1 to wait forever. By default, the cursor will wait + * MongoCursor::$timeout milliseconds. + *

    + * @return MongoCursor This cursor. + */ + public function timeout ($ms) {} + + /** + * Execute the query. + * @link http://www.php.net/manual/en/mongocursor.doquery.php + * @return void &null;. + */ + protected function doQuery () {} + + /** + * Gets the query, fields, limit, and skip for this cursor + * @link http://www.php.net/manual/en/mongocursor.info.php + * @return array the namespace, limit, skip, query, and fields for this cursor. + */ + public function info () {} + + /** + * Checks if there are documents that have not been sent yet from the database for this cursor + * @link http://www.php.net/manual/en/mongocursor.dead.php + * @return bool if there are more results that have not been sent to the client, yet. + */ + public function dead () {} + + /** + * Returns the current result's _id + * @link http://www.php.net/manual/en/mongocursor.key.php + * @return string The current result's _id as a string. + */ + public function key () {} + + /** + * Advances the cursor to the next result + * @link http://www.php.net/manual/en/mongocursor.next.php + * @return void &null;. + */ + public function next () {} + + /** + * Returns the cursor to the beginning of the result set + * @link http://www.php.net/manual/en/mongocursor.rewind.php + * @return void &null;. + */ + public function rewind () {} + + /** + * Checks if the cursor is reading a valid result. + * @link http://www.php.net/manual/en/mongocursor.valid.php + * @return bool If the current result is not null. + */ + public function valid () {} + + /** + * Clears the cursor + * @link http://www.php.net/manual/en/mongocursor.reset.php + * @return void &null;. + */ + public function reset () {} + + /** + * Counts the number of results for this query + * @link http://www.php.net/manual/en/mongocursor.count.php + * @param foundOnly bool[optional]

    + * Send cursor limit and skip information to the count function, if applicable. + *

    + * @return int The number of documents returned by this cursor's query. + */ + public function count ($foundOnly = null) {} + +} + +/** @jms-builtin */ +class MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.construct.php + * @param collection MongoCollection + * @param batch_type[optional] + * @param write_options[optional] + */ + protected function __construct (MongoCollection $collection, $batch_typearray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoInsertBatch extends MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongoinsertbatch.construct.php + * @param collection MongoCollection + * @param write_options[optional] + */ + public function __construct (MongoCollection $collectionarray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoUpdateBatch extends MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongoupdatebatch.construct.php + * @param collection MongoCollection + * @param write_options[optional] + */ + public function __construct (MongoCollection $collectionarray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoDeleteBatch extends MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongodeletebatch.construct.php + * @param collection MongoCollection + * @param write_options[optional] + */ + public function __construct (MongoCollection $collectionarray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoId { + public $id; + + + /** + * Creates a new id + * @link http://www.php.net/manual/en/mongoid.construct.php + */ + public function __construct () {} + + /** + * Returns a hexidecimal representation of this id + * @link http://www.php.net/manual/en/mongoid.tostring.php + * @return string This id. + */ + public function __toString () {} + + /** + * Create a dummy MongoId + * @link http://www.php.net/manual/en/mongoid.set-state.php + * @param props array

    + * Theoretically, an array of properties used to create the new id. + * However, as MongoId instances have no properties, this is not used. + *

    + * @return MongoId A new id with the value "000000000000000000000000". + */ + public static function __set_state (array $props) {} + + /** + * Gets the number of seconds since the epoch that this id was created + * @link http://www.php.net/manual/en/mongoid.gettimestamp.php + * @return int the number of seconds since the epoch that this id was created. There are only + * four bytes of timestamp stored, so MongoDate is a better choice + * for storing exact or wide-ranging times. + */ + public function getTimestamp () {} + + /** + * Gets the hostname being used for this machine's ids + * @link http://www.php.net/manual/en/mongoid.gethostname.php + * @return string the hostname. + */ + public static function getHostname () {} + + /** + * Gets the process ID + * @link http://www.php.net/manual/en/mongoid.getpid.php + * @return int the PID of the MongoId. + */ + public function getPID () {} + + /** + * Gets the incremented value to create this id + * @link http://www.php.net/manual/en/mongoid.getinc.php + * @return int the incremented value used to create this MongoId. + */ + public function getInc () {} + + /** + * Check if a value is a valid ObjectId + * @link http://www.php.net/manual/en/mongoid.isvalid.php + * @param value mixed

    + * The value to check for validity. + *

    + * @return bool true if value is a + * MongoId instance or a string consisting of exactly 24 + * hexadecimal characters; otherwise, false is returned. + */ + public static function isValid ($value) {} + +} + +/** @jms-builtin */ +class MongoCode { + public $code; + public $scope; + + + /** + * Creates a new code object + * @link http://www.php.net/manual/en/mongocode.construct.php + */ + public function __construct () {} + + /** + * Returns this code as a string + * @link http://www.php.net/manual/en/mongocode.tostring.php + * @return string This code, the scope is not returned. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoRegex { + public $regex; + public $flags; + + + /** + * Creates a new regular expression + * @link http://www.php.net/manual/en/mongoregex.construct.php + */ + public function __construct () {} + + /** + * A string representation of this regular expression + * @link http://www.php.net/manual/en/mongoregex.tostring.php + * @return string This regular expression in the form "/expr/flags". + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoDate { + public $sec; + public $usec; + + + /** + * Creates a new date. + * @link http://www.php.net/manual/en/mongodate.construct.php + */ + public function __construct () {} + + /** + * Returns a string representation of this date + * @link http://www.php.net/manual/en/mongodate.tostring.php + * @return string This date. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoBinData { + const GENERIC = 0; + const FUNC = 1; + const BYTE_ARRAY = 2; + const UUID = 3; + const UUID_RFC4122 = 4; + const MD5 = 5; + const CUSTOM = 128; + + public $bin; + public $type; + + + /** + * Creates a new binary data object. + * @link http://www.php.net/manual/en/mongobindata.construct.php + */ + public function __construct () {} + + /** + * The string representation of this binary data object. + * @link http://www.php.net/manual/en/mongobindata.tostring.php + * @return string the string "<Mongo Binary Data>". To access the contents of a + * MongoBinData, use the bin field. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoDBRef { + + /** + * Creates a new database reference + * @link http://www.php.net/manual/en/mongodbref.create.php + * @param collection string

    + * Collection name (without the database name). + *

    + * @param id mixed

    + * The _id field of the object to which to link. + *

    + * @param database string[optional]

    + * Database name. + *

    + * @return array the reference. + */ + public static function create ($collection, $id, $database = null) {} + + /** + * Checks if an array is a database reference + * @link http://www.php.net/manual/en/mongodbref.isref.php + * @param ref mixed

    + * Array or object to check. + *

    + * @return bool Returns true on success or false on failure. + */ + public static function isRef ($ref) {} + + /** + * Fetches the object pointed to by a reference + * @link http://www.php.net/manual/en/mongodbref.get.php + * @param db MongoDB

    + * Database to use. + *

    + * @param ref array

    + * Reference to fetch. + *

    + * @return array the document to which the reference refers or &null; if the document + * does not exist (the reference is broken). + */ + public static function get (MongoDB $db, array $ref) {} + +} + +/** @jms-builtin */ +class MongoException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoConnectionException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoCursorException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + private $host; + + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoCursorTimeoutException extends MongoCursorException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoGridFSException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoResultException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + public $document; + private $host; + + + /** + * Retrieve the full result document + * @link http://www.php.net/manual/en/mongoresultexception.getdocument.php + * @return array The full result document as an array, including partial data if available and + * additional keys. + */ + public function getDocument () {} + + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoWriteConcernException extends MongoCursorException { + protected $message; + protected $code; + protected $file; + protected $line; + private $document; + + + /** + * Get the error document + * @link http://www.php.net/manual/en/mongowriteconcernexception.getdocument.php + * @return array A MongoDB document, if available, as an array. + */ + public function getDocument () {} + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoDuplicateKeyException extends MongoWriteConcernException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * Get the error document + * @link http://www.php.net/manual/en/mongowriteconcernexception.getdocument.php + * @return array A MongoDB document, if available, as an array. + */ + public function getDocument () {} + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoExecutionTimeoutException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoProtocolException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoTimestamp { + public $sec; + public $inc; + + + /** + * Creates a new timestamp. + * @link http://www.php.net/manual/en/mongotimestamp.construct.php + */ + public function __construct () {} + + /** + * Returns a string representation of this timestamp + * @link http://www.php.net/manual/en/mongotimestamp.tostring.php + * @return string The seconds since epoch represented by this timestamp. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoInt32 { + public $value; + + + /** + * Creates a new 32-bit integer. + * @link http://www.php.net/manual/en/mongoint32.construct.php + */ + public function __construct () {} + + /** + * Returns the string representation of this 32-bit integer. + * @link http://www.php.net/manual/en/mongoint32.tostring.php + * @return string the string representation of this integer. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoInt64 { + public $value; + + + /** + * Creates a new 64-bit integer. + * @link http://www.php.net/manual/en/mongoint64.construct.php + */ + public function __construct () {} + + /** + * Returns the string representation of this 64-bit integer. + * @link http://www.php.net/manual/en/mongoint64.tostring.php + * @return string the string representation of this integer. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoLog { + const NONE = 0; + const WARNING = 1; + const INFO = 2; + const FINE = 4; + const RS = 1; + const POOL = 1; + const PARSE = 16; + const CON = 2; + const IO = 4; + const SERVER = 8; + const ALL = 31; + + private static $level; + private static $module; + private static $callback; + + + /** + * Sets logging level + * @link http://www.php.net/manual/en/mongolog.setlevel.php + * @param level int

    + * The levels you would like to log. + *

    + * @return void + */ + public static function setLevel ($level) {} + + /** + * Gets the log level + * @link http://www.php.net/manual/en/mongolog.getlevel.php + * @return int the current level. + */ + public static function getLevel () {} + + /** + * Sets driver functionality to log + * @link http://www.php.net/manual/en/mongolog.setmodule.php + * @param module int

    + * The module(s) you would like to log. + *

    + * @return void + */ + public static function setModule ($module) {} + + /** + * Gets the modules currently being logged + * @link http://www.php.net/manual/en/mongolog.getmodule.php + * @return int the modules currently being logged. + */ + public static function getModule () {} + + /** + * Set a callback function to be called on events + * @link http://www.php.net/manual/en/mongolog.setcallback.php + * @param log_function callable

    + * The function to be called on events. + *

    + *

    + * The function should have the following prototype + *

    + *

    + * log_function + * intmodule + * intlevel + * stringmessage + * module + * One of the MongoLog + * module constants. + * @return void Returns true on success or false on failure. + */ + public static function setCallback ($log_function) {} + + /** + * Retrieve the previously set callback function name + * @link http://www.php.net/manual/en/mongolog.getcallback.php + * @return void the callback function name, or false if not set yet. + */ + public static function getCallback () {} + +} + +/** @jms-builtin */ +class MongoPool { + + /** + * Returns information about all connection pools. + * @link http://www.php.net/manual/en/mongopool.info.php + * @return array Each connection pool has an identifier, which starts with the host. For each + * pool, this function shows the following fields: + * in use + *

    + * The number of connections currently being used by + * Mongo instances. + *

    + * in pool + *

    + * The number of connections currently in the pool (not being used). + *

    + * remaining + *

    + * The number of connections that could be created by this pool. For + * example, suppose a pool had 5 connections remaining and 3 connections in + * the pool. We could create 8 new instances of + * MongoClient before we exhausted this pool + * (assuming no instances of MongoClient went out of + * scope, returning their connections to the pool). + *

    + *

    + * A negative number means that this pool will spawn unlimited connections. + *

    + *

    + * Before a pool is created, you can change the max number of connections by + * calling Mongo::setPoolSize. Once a pool is showing + * up in the output of this function, its size cannot be changed. + *

    + * total + *

    + * The total number of connections allowed for this pool. This should be + * greater than or equal to "in use" + "in pool" (or -1). + *

    + * timeout + *

    + * The socket timeout for connections in this pool. This is how long + * connections in this pool will attempt to connect to a server before + * giving up. + *

    + * waiting + *

    + * If you have capped the pool size, workers requesting connections from + * the pool may block until other workers return their connections. This + * field shows how many milliseconds workers have blocked for connections to + * be released. If this number keeps increasing, you may want to use + * MongoPool::setSize to add more connections to your + * pool. + *

    + */ + public static function info () {} + + /** + * Set the size for future connection pools. + * @link http://www.php.net/manual/en/mongopool.setsize.php + * @param size int

    + * The max number of connections future pools will be able to create. + * Negative numbers mean that the pool will spawn an infinite number of + * connections. + *

    + * @return bool the former value of pool size. + */ + public static function setSize ($size) {} + + /** + * Get pool size for connection pools + * @link http://www.php.net/manual/en/mongopool.getsize.php + * @return int the current pool size. + */ + public static function getSize () {} + +} + +/** @jms-builtin */ +class MongoMaxKey { +} + +/** @jms-builtin */ +class MongoMinKey { +} + +/** + * Serializes a PHP variable into a BSON string + * @link http://www.php.net/manual/en/function.bson-encode.php + * @param anything mixed

    + * The variable to be serialized. + *

    + * @return string the serialized string. + * @jms-builtin + */ +function bson_encode ($anything) {} + +/** + * Deserializes a BSON object into a PHP array + * @link http://www.php.net/manual/en/function.bson-decode.php + * @param bson string

    + * The BSON to be deserialized. + *

    + * @return array the deserialized BSON object. + * @jms-builtin + */ +function bson_decode ($bson) {} + +define ('MONGO_STREAMS', 1); +define ('MONGO_SUPPORTS_STREAMS', 1); +define ('MONGO_SUPPORTS_SSL', 0); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_CR', 1); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_X509', 1); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_GSSAPI', 0); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_PLAIN', 0); +define ('MONGO_STREAM_NOTIFY_TYPE_IO_INIT', 100); +define ('MONGO_STREAM_NOTIFY_TYPE_LOG', 200); +define ('MONGO_STREAM_NOTIFY_IO_READ', 111); +define ('MONGO_STREAM_NOTIFY_IO_WRITE', 112); +define ('MONGO_STREAM_NOTIFY_IO_PROGRESS', 7); +define ('MONGO_STREAM_NOTIFY_IO_COMPLETED', 8); +define ('MONGO_STREAM_NOTIFY_LOG_INSERT', 211); +define ('MONGO_STREAM_NOTIFY_LOG_QUERY', 212); +define ('MONGO_STREAM_NOTIFY_LOG_UPDATE', 213); +define ('MONGO_STREAM_NOTIFY_LOG_DELETE', 214); +define ('MONGO_STREAM_NOTIFY_LOG_GETMORE', 215); +define ('MONGO_STREAM_NOTIFY_LOG_KILLCURSOR', 216); +define ('MONGO_STREAM_NOTIFY_LOG_BATCHINSERT', 217); +define ('MONGO_STREAM_NOTIFY_LOG_RESPONSE_HEADER', 218); +define ('MONGO_STREAM_NOTIFY_LOG_WRITE_REPLY', 219); +define ('MONGO_STREAM_NOTIFY_LOG_CMD_INSERT', 220); +define ('MONGO_STREAM_NOTIFY_LOG_CMD_UPDATE', 221); +define ('MONGO_STREAM_NOTIFY_LOG_CMD_DELETE', 222); +define ('MONGO_STREAM_NOTIFY_LOG_WRITE_BATCH', 223); + +// End of mongo v.1.5.0RC1 +?> diff --git a/res/php-5.4-core-api/mongo.php b/res/php-5.4-core-api/mongo.php new file mode 100644 index 0000000..b19dc53 --- /dev/null +++ b/res/php-5.4-core-api/mongo.php @@ -0,0 +1,4397 @@ + + * The database name. + *

    + * @return MongoDB a new db object. + */ + public function __get ($dbname) {} + + /** + * Gets a database + * @link http://www.php.net/manual/en/mongoclient.selectdb.php + * @param name string

    + * The database name. + *

    + * @return MongoDB a new database object. + */ + public function selectDB ($name) {} + + /** + * Gets a database collection + * @link http://www.php.net/manual/en/mongoclient.selectcollection.php + * @param db string

    + * The database name. + *

    + * @param collection string

    + * The collection name. + *

    + * @return MongoCollection a new collection object. + */ + public function selectCollection ($db, $collection) {} + + /** + * Get the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Drops a database [deprecated] + * @link http://www.php.net/manual/en/mongoclient.dropdb.php + * @param db mixed

    + * The database to drop. Can be a MongoDB object or the name of the database. + *

    + * @return array the database response. + */ + public function dropDB ($db) {} + + /** + * Lists all of the databases available. + * @link http://www.php.net/manual/en/mongoclient.listdbs.php + * @return array an associative array containing three fields. The first field is + * databases, which in turn contains an array. Each element + * of the array is an associative array corresponding to a database, giving th + * database's name, size, and if it's empty. The other two fields are + * totalSize (in bytes) and ok, which is 1 + * if this method ran successfully. + */ + public function listDBs () {} + + /** + * Updates status for all associated hosts + * @link http://www.php.net/manual/en/mongoclient.gethosts.php + * @return array an array of information about the hosts in the set. Includes each + * host's hostname, its health (1 is healthy), its state (1 is primary, 2 is + * secondary, 0 is anything else), the amount of time it took to ping the + * server, and when the last ping occurred. For example, on a three-member + * replica set, it might look something like: + */ + public function getHosts () {} + + /** + * Closes this connection + * @link http://www.php.net/manual/en/mongoclient.close.php + * @param connection boolean|string[optional]

    + * If connection is not given, or false then connection that would be + * selected for writes would be closed. In a single-node configuration, + * that is then the whole connection, but if you are connected to a + * replica set, close() will only close the + * connection to the primary server. + *

    + *

    + * If connection is true then all connections as known by the connection + * manager will be closed. This can include connections that are not + * referenced in the connection string used to create the object that + * you are calling close on. + *

    + *

    + * If connection is a string argument, then it will only close the + * connection identified by this hash. Hashes are identifiers for a + * connection and can be obtained by calling + * MongoClient::getConnections. + *

    + * @return bool if the connection was successfully closed. + */ + public function close ($connection = null) {} + + /** + * Kills a specific cursor on the server + * @link http://www.php.net/manual/en/mongoclient.killcursor.php + * @param server_hash string

    + * The server hash that has the cursor. This can be obtained through + * MongoCursor::info. + *

    + * @param id int|MongoInt64

    + * The ID of the cursor to kill. You can either supply an int + * containing the 64 bit cursor ID, or an object of the + * MongoInt64 class. The latter is necessary on 32 + * bit platforms (and Windows). + *

    + * @return bool true if the method attempted to kill a cursor, and false if + * there was something wrong with the arguments (such as a wrong + * server_hash). The return status does not + * reflect where the cursor was actually killed as the server does + * not provide that information. + */ + public static function killCursor ($server_hash, $id) {} + +} + +/** @jms-builtin */ +class Mongo extends MongoClient { + const DEFAULT_HOST = "localhost"; + const DEFAULT_PORT = 27017; + const VERSION = "1.5.0RC1"; + const RP_PRIMARY = "primary"; + const RP_PRIMARY_PREFERRED = "primaryPreferred"; + const RP_SECONDARY = "secondary"; + const RP_SECONDARY_PREFERRED = "secondaryPreferred"; + const RP_NEAREST = "nearest"; + + public $connected; + public $status; + protected $server; + protected $persistent; + + + /** + * The __construct purpose + * @link http://www.php.net/manual/en/mongo.construct.php + * @param server[optional] + * @param options[optional] + */ + public function __construct ($serverarray , $options) {} + + /** + * Connects with a database server + * @link http://www.php.net/manual/en/mongo.connectutil.php + * @return bool If the connection was successful. + */ + protected function connectUtil () {} + + /** + * Get slaveOkay setting for this connection + * @link http://www.php.net/manual/en/mongo.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this connection + * @link http://www.php.net/manual/en/mongo.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoClient instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + public function lastError () {} + + public function prevError () {} + + public function resetError () {} + + public function forceError () {} + + /** + * Returns the address being used by this for slaveOkay reads + * @link http://www.php.net/manual/en/mongo.getslave.php + * @return string The address of the secondary this connection is using for reads. + *

    + *

    + * This returns &null; if this is not connected to a replica set or not yet + * initialized. + */ + public function getSlave () {} + + /** + * Choose a new secondary for slaveOkay reads + * @link http://www.php.net/manual/en/mongo.switchslave.php + * @return string The address of the secondary this connection is using for reads. This may be + * the same as the previous address as addresses are randomly chosen. It may + * return only one address if only one secondary (or only the primary) is + * available. + *

    + *

    + * For example, if we had a three member replica set with a primary, secondary, + * and arbiter this method would always return the address of the secondary. + * If the secondary became unavailable, this method would always return the + * address of the primary. If the primary also became unavailable, this method + * would throw an exception, as an arbiter cannot handle reads. + */ + public function switchSlave () {} + + /** + * Set the size for future connection pools. + * @link http://www.php.net/manual/en/mongo.setpoolsize.php + * @param size int

    + * The max number of connections future pools will be able to create. + * Negative numbers mean that the pool will spawn an infinite number of + * connections. + *

    + * @return bool the former value of pool size. + */ + public static function setPoolSize ($size) {} + + /** + * Get pool size for connection pools + * @link http://www.php.net/manual/en/mongo.getpoolsize.php + * @return int the current pool size. + */ + public static function getPoolSize () {} + + /** + * Returns information about all connection pools. + * @link http://www.php.net/manual/en/mongo.pooldebug.php + * @return array Each connection pool has an identifier, which starts with the host. For each + * pool, this function shows the following fields: + * in use + *

    + * The number of connections currently being used by + * MongoClient instances. + *

    + * in pool + *

    + * The number of connections currently in the pool (not being used). + *

    + * remaining + *

    + * The number of connections that could be created by this pool. For + * example, suppose a pool had 5 connections remaining and 3 connections in + * the pool. We could create 8 new instances of + * MongoClient before we exhausted this pool + * (assuming no instances of MongoClient went out of + * scope, returning their connections to the pool). + *

    + *

    + * A negative number means that this pool will spawn unlimited connections. + *

    + *

    + * Before a pool is created, you can change the max number of connections by + * calling Mongo::setPoolSize. Once a pool is showing + * up in the output of this function, its size cannot be changed. + *

    + * timeout + *

    + * The socket timeout for connections in this pool. This is how long + * connections in this pool will attempt to connect to a server before + * giving up. + *

    + */ + public static function poolDebug () {} + + /** + * Return info about all open connections + * @link http://www.php.net/manual/en/mongoclient.getconnections.php + * @return array An array of open connections. + */ + public static function getConnections () {} + + /** + * Connects to a database server + * @link http://www.php.net/manual/en/mongoclient.connect.php + * @return bool If the connection was successful. + */ + public function connect () {} + + /** + * String representation of this connection + * @link http://www.php.net/manual/en/mongoclient.tostring.php + * @return string hostname and port for this connection. + */ + public function __toString () {} + + /** + * Gets a database + * @link http://www.php.net/manual/en/mongoclient.get.php + * @param dbname string

    + * The database name. + *

    + * @return MongoDB a new db object. + */ + public function __get ($dbname) {} + + /** + * Gets a database + * @link http://www.php.net/manual/en/mongoclient.selectdb.php + * @param name string

    + * The database name. + *

    + * @return MongoDB a new database object. + */ + public function selectDB ($name) {} + + /** + * Gets a database collection + * @link http://www.php.net/manual/en/mongoclient.selectcollection.php + * @param db string

    + * The database name. + *

    + * @param collection string

    + * The collection name. + *

    + * @return MongoCollection a new collection object. + */ + public function selectCollection ($db, $collection) {} + + /** + * Get the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this connection + * @link http://www.php.net/manual/en/mongoclient.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Drops a database [deprecated] + * @link http://www.php.net/manual/en/mongoclient.dropdb.php + * @param db mixed

    + * The database to drop. Can be a MongoDB object or the name of the database. + *

    + * @return array the database response. + */ + public function dropDB ($db) {} + + /** + * Lists all of the databases available. + * @link http://www.php.net/manual/en/mongoclient.listdbs.php + * @return array an associative array containing three fields. The first field is + * databases, which in turn contains an array. Each element + * of the array is an associative array corresponding to a database, giving th + * database's name, size, and if it's empty. The other two fields are + * totalSize (in bytes) and ok, which is 1 + * if this method ran successfully. + */ + public function listDBs () {} + + /** + * Updates status for all associated hosts + * @link http://www.php.net/manual/en/mongoclient.gethosts.php + * @return array an array of information about the hosts in the set. Includes each + * host's hostname, its health (1 is healthy), its state (1 is primary, 2 is + * secondary, 0 is anything else), the amount of time it took to ping the + * server, and when the last ping occurred. For example, on a three-member + * replica set, it might look something like: + */ + public function getHosts () {} + + /** + * Closes this connection + * @link http://www.php.net/manual/en/mongoclient.close.php + * @param connection boolean|string[optional]

    + * If connection is not given, or false then connection that would be + * selected for writes would be closed. In a single-node configuration, + * that is then the whole connection, but if you are connected to a + * replica set, close() will only close the + * connection to the primary server. + *

    + *

    + * If connection is true then all connections as known by the connection + * manager will be closed. This can include connections that are not + * referenced in the connection string used to create the object that + * you are calling close on. + *

    + *

    + * If connection is a string argument, then it will only close the + * connection identified by this hash. Hashes are identifiers for a + * connection and can be obtained by calling + * MongoClient::getConnections. + *

    + * @return bool if the connection was successfully closed. + */ + public function close ($connection = null) {} + + /** + * Kills a specific cursor on the server + * @link http://www.php.net/manual/en/mongoclient.killcursor.php + * @param server_hash string

    + * The server hash that has the cursor. This can be obtained through + * MongoCursor::info. + *

    + * @param id int|MongoInt64

    + * The ID of the cursor to kill. You can either supply an int + * containing the 64 bit cursor ID, or an object of the + * MongoInt64 class. The latter is necessary on 32 + * bit platforms (and Windows). + *

    + * @return bool true if the method attempted to kill a cursor, and false if + * there was something wrong with the arguments (such as a wrong + * server_hash). The return status does not + * reflect where the cursor was actually killed as the server does + * not provide that information. + */ + public static function killCursor ($server_hash, $id) {} + +} + +/** @jms-builtin */ +class MongoDB { + const PROFILING_OFF = 0; + const PROFILING_SLOW = 1; + const PROFILING_ON = 2; + + public $w; + public $wtimeout; + + + /** + * Creates a new database + * @link http://www.php.net/manual/en/mongodb.construct.php + * @param connection MongoClient + * @param database_name + */ + public function __construct (MongoClient $connection, $database_name) {} + + /** + * The name of this database + * @link http://www.php.net/manual/en/mongodb.--tostring.php + * @return string this database's name. + */ + public function __toString () {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongodb.get.php + * @param name string

    + * The name of the collection. + *

    + * @return MongoCollection the collection. + */ + public function __get ($name) {} + + /** + * Fetches toolkit for dealing with files stored in this database + * @link http://www.php.net/manual/en/mongodb.getgridfs.php + * @param prefix string[optional]

    + * The prefix for the files and chunks collections. + *

    + * @return MongoGridFS a new gridfs object for this database. + */ + public function getGridFS ($prefix = null) {} + + /** + * Get slaveOkay setting for this database + * @link http://www.php.net/manual/en/mongodb.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this database + * @link http://www.php.net/manual/en/mongodb.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoDB instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + /** + * Get the read preference for this database + * @link http://www.php.net/manual/en/mongodb.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this database + * @link http://www.php.net/manual/en/mongodb.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Get the write concern for this database + * @link http://www.php.net/manual/en/mongodb.getwriteconcern.php + * @return array + */ + public function getWriteConcern () {} + + /** + * Set the write concern for this database + * @link http://www.php.net/manual/en/mongodb.setwriteconcern.php + * @param w mixed + * @param wtimeout int[optional] + * @return bool + */ + public function setWriteConcern ($w, $wtimeout = null) {} + + /** + * Gets this database's profiling level + * @link http://www.php.net/manual/en/mongodb.getprofilinglevel.php + * @return int the profiling level. + */ + public function getProfilingLevel () {} + + /** + * Sets this database's profiling level + * @link http://www.php.net/manual/en/mongodb.setprofilinglevel.php + * @param level int

    + * Profiling level. + *

    + * @return int the previous profiling level. + */ + public function setProfilingLevel ($level) {} + + /** + * Drops this database + * @link http://www.php.net/manual/en/mongodb.drop.php + * @return array the database response. + */ + public function drop () {} + + /** + * Repairs and compacts this database + * @link http://www.php.net/manual/en/mongodb.repair.php + * @param preserve_cloned_files bool[optional]

    + * If cloned files should be kept if the repair fails. + *

    + * @param backup_original_files bool[optional]

    + * If original files should be backed up. + *

    + * @return array db response. + */ + public function repair ($preserve_cloned_files = null, $backup_original_files = null) {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongodb.selectcollection.php + * @param name string

    + * The collection name. + *

    + * @return MongoCollection a new collection object. + */ + public function selectCollection ($name) {} + + /** + * Creates a collection + * @link http://www.php.net/manual/en/mongodb.createcollection.php + * @param name string

    + * The name of the collection. + *

    + * @param options array[optional]

    + * An array containing options for the collections. Each option is its own + * element in the options array, with the option name listed below being + * the key of the element. The supported options depend on the MongoDB + * server version. At the moment, the following options are supported: + *

    + *

    + * capped + *

    + * If the collection should be a fixed size. + *

    + * @return MongoCollection a collection object representing the new collection. + */ + public function createCollection ($name, array $options = null) {} + + /** + * Drops a collection [deprecated] + * @link http://www.php.net/manual/en/mongodb.dropcollection.php + * @param coll mixed

    + * MongoCollection or name of collection to drop. + *

    + * @return array the database response. + */ + public function dropCollection ($coll) {} + + /** + * Gets an array of all MongoCollections for this database + * @link http://www.php.net/manual/en/mongodb.listcollections.php + * @param includeSystemCollections bool[optional]

    + * Include system collections. + *

    + * @return array an array of MongoCollection objects. + */ + public function listCollections ($includeSystemCollections = null) {} + + /** + * Get all collections from this database + * @link http://www.php.net/manual/en/mongodb.getcollectionnames.php + * @param includeSystemCollections bool[optional]

    + * Include system collections. + *

    + * @return array the names of the all the collections in the database as an array. + */ + public function getCollectionNames ($includeSystemCollections = null) {} + + /** + * Creates a database reference + * @link http://www.php.net/manual/en/mongodb.createdbref.php + * @param collection string

    + * The collection to which the database reference will point. + *

    + * @param document_or_id mixed

    + * If an array or object is given, its _id field will be + * used as the reference ID. If a MongoId or scalar + * is given, it will be used as the reference ID. + *

    + * @return array a database reference array. + *

    + *

    + * If an array without an _id field was provided as the + * document_or_id parameter, &null; will be returned. + */ + public function createDBRef ($collection, $document_or_id) {} + + /** + * Fetches the document pointed to by a database reference + * @link http://www.php.net/manual/en/mongodb.getdbref.php + * @param ref array

    + * A database reference. + *

    + * @return array the document pointed to by the reference. + */ + public function getDBRef (array $ref) {} + + /** + * Runs JavaScript code on the database server. + * @link http://www.php.net/manual/en/mongodb.execute.php + * @param code mixed

    + * MongoCode or string to execute. + *

    + * @param args array[optional]

    + * Arguments to be passed to code. + *

    + * @return array the result of the evaluation. + */ + public function execute ($code, array $args = null) {} + + /** + * Execute a database command + * @link http://www.php.net/manual/en/mongodb.command.php + * @param command array

    + * The query to send. + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.timeout; + *

    + * @return array database response. Every database response is always maximum one + * document, which means that the result of a database command can never + * exceed 16MB. The resulting document's structure depends on the command, but + * most results will have the ok field to indicate success + * or failure and results containing an array of each of + * the resulting documents. + */ + public function command (array $command, array $options = null) {} + + /** + * Check if there was an error on the most recent db operation performed + * @link http://www.php.net/manual/en/mongodb.lasterror.php + * @return array the error, if there was one. + */ + public function lastError () {} + + /** + * Checks for the last error thrown during a database operation + * @link http://www.php.net/manual/en/mongodb.preverror.php + * @return array the error and the number of operations ago it occurred. + */ + public function prevError () {} + + /** + * Clears any flagged errors on the database + * @link http://www.php.net/manual/en/mongodb.reseterror.php + * @return array the database response. + */ + public function resetError () {} + + /** + * Creates a database error + * @link http://www.php.net/manual/en/mongodb.forceerror.php + * @return bool the database response. + */ + public function forceError () {} + + /** + * Log in to this database + * @link http://www.php.net/manual/en/mongodb.authenticate.php + * @param username string

    + * The username. + *

    + * @param password string

    + * The password (in plaintext). + *

    + * @return array database response. If the login was successful, it will return + * 1); + * ?> + * ]]> + * If something went wrong, it will return + * 0, "errmsg" => "auth fails"); + * ?> + * ]]> + * ("auth fails" could be another message, depending on database version and what + * when wrong). + */ + public function authenticate ($username, $password) {} + +} + +/** @jms-builtin */ +class MongoCollection { + const ASCENDING = 1; + const DESCENDING = -1; + + public $w; + public $wtimeout; + + + /** + * Creates a new collection + * @link http://www.php.net/manual/en/mongocollection.construct.php + * @param database MongoDB + * @param collection_name + */ + public function __construct (MongoDB $database, $collection_name) {} + + /** + * String representation of this collection + * @link http://www.php.net/manual/en/mongocollection.--tostring.php + * @return string the full name of this collection. + */ + public function __toString () {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongocollection.get.php + * @param name string

    + * The next string in the collection name. + *

    + * @return MongoCollection the collection. + */ + public function __get ($name) {} + + /** + * Returns this collection's name + * @link http://www.php.net/manual/en/mongocollection.getname.php + * @return string the name of this collection. + */ + public function getName () {} + + /** + * Get slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoCollection + * instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + /** + * Get the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Get the write concern for this collection + * @link http://www.php.net/manual/en/mongocollection.getwriteconcern.php + * @return array + */ + public function getWriteConcern () {} + + /** + * Set the write concern for this database + * @link http://www.php.net/manual/en/mongocollection.setwriteconcern.php + * @param w mixed + * @param wtimeout int[optional] + * @return bool + */ + public function setWriteConcern ($w, $wtimeout = null) {} + + /** + * Drops this collection + * @link http://www.php.net/manual/en/mongocollection.drop.php + * @return array the database response. + */ + public function drop () {} + + /** + * Validates this collection + * @link http://www.php.net/manual/en/mongocollection.validate.php + * @param scan_data bool[optional]

    + * Only validate indices, not the base collection. + *

    + * @return array the database's evaluation of this object. + */ + public function validate ($scan_data = null) {} + + /** + * Inserts a document into the collection + * @link http://www.php.net/manual/en/mongocollection.insert.php + * @param a array|object

    + * An array or object. If an object is used, it may not have protected or + * private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. This special behavior does not mean that the + * parameter is passed by reference. + *

    + * @param options array[optional]

    + * Options for the insert. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return bool|array an array containing the status of the insertion if the + * "w" option is set. Otherwise, returns true if the + * inserted array is not empty (a MongoException will be + * thrown if the inserted array is empty). + *

    + *

    + * If an array is returned, the following keys may be present: + * ok + *

    + * This should almost always be 1 (unless last_error itself failed). + *

    + * err + *

    + * If this field is non-null, an error occurred on the previous operation. + * If this field is set, it will be a string describing the error that + * occurred. + *

    + * code + *

    + * If a database error occurred, the relevant error code will be passed + * back to the client. + *

    + * errmsg + *

    + * This field is set if something goes wrong with a database command. It + * is coupled with ok being 0. For example, if + * w is set and times out, errmsg will be set to "timed + * out waiting for slaves" and ok will be 0. If this + * field is set, it will be a string describing the error that occurred. + *

    + * n + *

    + * If the last operation was an update, upsert, or a remove, the number + * of documents affected will be returned. For insert operations, this value + * is always 0. + *

    + * wtimeout + *

    + * If the previous option timed out waiting for replication. + *

    + * waited + *

    + * How long the operation waited before timing out. + *

    + * wtime + *

    + * If w was set and the operation succeeded, how long it took to + * replicate to w servers. + *

    + * upserted + *

    + * If an upsert occurred, this field will contain the new record's + * _id field. For upserts, either this field or + * updatedExisting will be present (unless an error + * occurred). + *

    + * updatedExisting + *

    + * If an upsert updated an existing element, this field will be true. For + * upserts, either this field or upserted will be present (unless an error + * occurred). + *

    + */ + public function insert ($a, array $options = null) {} + + /** + * Inserts multiple documents into this collection + * @link http://www.php.net/manual/en/mongocollection.batchinsert.php + * @param a array

    + * An array of arrays or objects. If any objects are used, they may not have + * protected or private properties. + *

    + *

    + * If the documents to insert do not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the inserts. + *

    + * "continueOnError" + *

    + *

    + * Boolean, defaults to false. If set, the database will not stop + * processing a bulk insert if one fails (eg due to duplicate IDs). + * This makes bulk insert behave similarly to a series of single + * inserts, except that calling MongoDB::lastError + * will have an error set if any insert fails, not just the last one. + * If multiple errors occur, only the most recent will be reported by + * MongoDB::lastError. + *

    + *

    + * Please note that continueOnError affects errors + * on the database side only. If you try to insert a document that has + * errors (for example it contains a key with an empty name), then the + * document is not even transferred to the database as the driver + * detects this error and bails out. + * continueOnError has no effect on errors detected + * in the documents by the driver. + *

    + * @return mixed If the w parameter is set to acknowledge the write, + * returns an associative array with the status of the inserts ("ok") and any + * error that may have occurred ("err"). Otherwise, returns true if the + * batch insert was successfully sent, false otherwise. + */ + public function batchInsert (array $a, array $options = null) {} + + /** + * Update records based on a given criteria + * @link http://www.php.net/manual/en/mongocollection.update.php + * @param criteria array

    + * Description of the objects to update. + *

    + * @param new_object array

    + * The object with which to update the matching records. + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + *

    + * "upsert" + *

    + *

    + * If no document matches $criteria, a new + * document will be inserted. + *

    + *

    + * If a new document would be inserted and + * $new_object contains atomic modifiers + * (i.e. $ operators), those operations will be + * applied to the $criteria parameter to create + * the new document. If $new_object does not + * contain atomic modifiers, it will be used as-is for the inserted + * document. See the upsert examples below for more information. + *

    + * @return bool|array an array containing the status of the update if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function update (array $criteria, array $new_object, array $options = null) {} + + /** + * Remove records from this collection + * @link http://www.php.net/manual/en/mongocollection.remove.php + * @param criteria array[optional]

    + * Description of records to remove. + *

    + * @param options array[optional]

    + * Options for remove. + * &mongo.writes.parameters.writeconcern; + *

    + * "justOne" + *

    + *

    + * Remove at most one record matching this criteria. + *

    + * @return bool|array an array containing the status of the removal if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function remove (array $criteria = null, array $options = null) {} + + /** + * Queries this collection, returning a MongoCursor for the result set + * @link http://www.php.net/manual/en/mongocollection.find.php + * @param query array[optional]

    + * The fields for which to search. MongoDB's query language is quite + * extensive. The PHP driver will in almost all cases pass the query + * straight through to the server, so reading the MongoDB core docs on + * find is a good idea. + *

    + *

    + * Please make sure that for all special query operators (starting with + * $) you use single quotes so that PHP doesn't try to + * replace "$exists" with the value of the variable + * $exists. + *

    + * @param fields array[optional]

    + * Fields of the results to return. The array is in the format + * array('fieldname' => true, 'fieldname2' => true). + * The _id field is always returned. + *

    + * @return MongoCursor a cursor for the search results. + */ + public function find (array $query = null, array $fields = null) {} + + /** + * Queries this collection, returning a single element + * @link http://www.php.net/manual/en/mongocollection.findone.php + * @param query array[optional]

    + * The fields for which to search. MongoDB's query language is quite + * extensive. The PHP driver will in almost all cases pass the query + * straight through to the server, so reading the MongoDB core docs on + * find is a good idea. + *

    + *

    + * Please make sure that for all special query operaters (starting with + * $) you use single quotes so that PHP doesn't try to + * replace "$exists" with the value of the variable + * $exists. + *

    + * @param fields array[optional]

    + * Fields of the results to return. The array is in the format + * array('fieldname' => true, 'fieldname2' => true). + * The _id field is always returned. + *

    + * @return array record matching the search or &null;. + */ + public function findOne (array $query = null, array $fields = null) {} + + /** + * Update a document and return it + * @link http://www.php.net/manual/en/mongocollection.findandmodify.php + * @param query array

    + * The query criteria to search for. + *

    + * @param update array[optional]

    + * The update criteria. + *

    + * @param fields array[optional]

    + * Optionally only return these fields. + *

    + * @param options array[optional]

    + * An array of options to apply, such as remove the match document from the + * DB and return it. + * + * Option + * &Description; + * + * + * sort array + * + * Determines which document the operation will modify if the + * query selects multiple documents. findAndModify will modify the + * first document in the sort order specified by this argument. + * + * + * + * remove boolean + * + * Optional if update field exists. When true, removes the selected + * document. The default is false. + * + * + * + * update array + * + * Optional if remove field exists. + * Performs an update of the selected document. + * + * + * + * new boolean + * + * Optional. When true, returns the modified document rather than the + * original. The findAndModify method ignores the new option for + * remove operations. The default is false. + * + * + * + * upsert boolean + * + * Optional. Used in conjunction with the update field. When true, the + * findAndModify command creates a new document if the query returns + * no documents. The default is false. In MongoDB 2.2, the + * findAndModify command returns &null; when upsert is true. + * + * + * + * + * + * + * + *

    + * @return array the original document, or the modified document when + * new is set. + */ + public function findAndModify (array $query, array $update = null, array $fields = null, array $options = null) {} + + /** + * Execute a database command and retrieve results through a cursor + * @link http://www.php.net/manual/en/mongocollection.commandcursor.php + * @param command array

    + * The command query to send. + *

    + *

    + * It is possible to configure how many initial documents the server + * should return with the first result set. This configuration is made as + * part of the command query. The default initial batch size is + * 101. You can change it by adding the + * cursor key in the following way to the command: + *

    + * commandCursor( [ + * "aggregate" => "collectionName", + * "pipeline" => [ + * ... + * ], + * "cursor" => [ "batchSize" => 4 ], + * ] ); + * ]]> + *

    + * If you do not set the initial + * batchSize option, then the PHP driver will implicitly + * add this for you with a value of 101 + *

    + *

    + * This setting does only configure the first batch size. To configure the + * size of future batches, please use the + * MongoCommandCursor::batchSize method on the + * returned MongoCommandCursor object. + *

    + * @return MongoCommandCursor a MongoCommandCursor object. Because this + * implements the Iterator interface you can + * iterate over each of the results as returned by the command query. The + * MongoCommandCursor also implements the + * MongoCursorInterface interface which adds the + * MongoCommandCursor::batchSize, + * MongoCommandCursor::dead, + * MongoCommandCursor::info methods. + */ + public function commandCursor (array $command) {} + + /** + * Creates an index on the given field(s) + * @link http://www.php.net/manual/en/mongocollection.createindex.php + * @param keys array

    + * An array of fields by which to sort the index on. Each element in the + * array has as key the field name, and as value either + * 1 for ascending sort, -1 for + * descending sort, or any of the index plugins (currently, + * "text", "2d", or + * "2dsphere""). + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation. The array + * contains whether the operation worked ("ok"), the amount + * of indexes before and after the operation + * ("numIndexesBefore" and + * "numIndexesAfter") and whether the collection that the + * index belongs to has been created + * ("createdCollectionAutomatically"). + *

    + *

    + * With MongoDB 2.4 and earlier, a status document is only returned if the + * "w" option is set to 1—either through + * the connection string, or with . If + * "w" is not set to 1, it returns + * true. The fields in the status document are different, except for the + * "ok" field which signals whether the index creation + * worked. + */ + public function createIndex (array $keys, array $options = null) {} + + /** + * Creates an index on the given field(s), or does nothing if the index + already exists + * @link http://www.php.net/manual/en/mongocollection.ensureindex.php + * @param key_keys string|array + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function ensureIndex ($key_keys, array $options = null) {} + + /** + * Deletes an index from this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindex.php + * @param keys string|array

    + * Field or fields from which to delete the index. + *

    + * @return array the database response. + */ + public function deleteIndex ($keys) {} + + /** + * Delete all indices for this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindexes.php + * @return array the database response. + */ + public function deleteIndexes () {} + + /** + * Returns information about indexes on this collection + * @link http://www.php.net/manual/en/mongocollection.getindexinfo.php + * @return array This function returns an array in which each element describes an index. + * Elements will contain the values name for the name of + * the index, ns for the namespace (a combination of the + * database and collection name), and key for a list of all + * fields in the index and their ordering. Additional values may be present for + * special indexes, such as unique or + * sparse. + */ + public function getIndexInfo () {} + + /** + * Counts the number of documents in this collection + * @link http://www.php.net/manual/en/mongocollection.count.php + * @param query array[optional]

    + * Associative array or object with fields to match. + *

    + * @param limit int[optional]

    + * Specifies an upper limit to the number returned. + *

    + * @param skip int[optional]

    + * Specifies a number of results to skip before starting the count. + *

    + * @return int the number of documents matching the query. + */ + public function count (array $query = null, $limit = null, $skip = null) {} + + /** + * Saves a document to this collection + * @link http://www.php.net/manual/en/mongocollection.save.php + * @param a array|object

    + * Array or object to save. If an object is used, it may not have protected + * or private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the save. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return mixed If w was set, returns an array containing the status of the save. + * Otherwise, returns a boolean representing if the array was not empty (an empty array will not + * be inserted). + */ + public function save ($a, array $options = null) {} + + /** + * Creates a database reference + * @link http://www.php.net/manual/en/mongocollection.createdbref.php + * @param document_or_id mixed

    + * If an array or object is given, its _id field will be + * used as the reference ID. If a MongoId or scalar + * is given, it will be used as the reference ID. + *

    + * @return array a database reference array. + *

    + *

    + * If an array without an _id field was provided as the + * document_or_id parameter, &null; will be returned. + */ + public function createDBRef ($document_or_id) {} + + /** + * Fetches the document pointed to by a database reference + * @link http://www.php.net/manual/en/mongocollection.getdbref.php + * @param ref array

    + * A database reference. + *

    + * @return array the database document pointed to by the reference. + */ + public function getDBRef (array $ref) {} + + /** + * Converts keys specifying an index to its identifying string + * @link http://www.php.net/manual/en/mongocollection.toindexstring.php + * @param keys mixed

    + * Field or fields to convert to the identifying string + *

    + * @return string a string that describes the index. + */ + protected static function toIndexString ($keys) {} + + /** + * Performs an operation similar to SQL's GROUP BY command + * @link http://www.php.net/manual/en/mongocollection.group.php + * @param keys mixed

    + * Fields to group by. If an array or non-code object is passed, it will be + * the key used to group results. + *

    + *

    1.0.4+: If keys is an instance of + * MongoCode, keys will be treated as + * a function that returns the key to group by (see the "Passing a + * keys function" example below). + *

    + * @param initial array

    + * Initial value of the aggregation counter object. + *

    + * @param reduce MongoCode

    + * A function that takes two arguments (the current document and the + * aggregation to this point) and does the aggregation. + *

    + * @param options array[optional]

    + * Optional parameters to the group command. Valid options include: + *

    + *

    + * "condition" + *

    + *

    + * Criteria for including a document in the aggregation. + *

    + * @return array an array containing the result. + */ + public function group ($keys, array $initial, MongoCode $reduce, array $options = null) {} + + /** + * Retrieve a list of distinct values for the given key across a collection. + * @link http://www.php.net/manual/en/mongocollection.distinct.php + * @param key string

    + * The key to use. + *

    + * @param query array[optional]

    + * An optional query parameters + *

    + * @return array an array of distinct values, &return.falseforfailure; + */ + public function distinct ($key, array $query = null) {} + + /** + * Perform an aggregation using the aggregation framework + * @link http://www.php.net/manual/en/mongocollection.aggregate.php + * @param pipeline array

    + * An array of pipeline operators. + *

    + * @param options array[optional]

    + * Array of command arguments, such as allowDiskUse, explain or cursor. + *

    + * @return array The result of the aggregation as an array. The ok will + * be set to 1 on success, 0 on failure. + */ + public function aggregate (array $pipeline, array $options = null) {} + +} + +interface MongoCursorInterface extends Iterator, Traversable { + + /** + * @param number + */ + abstract public function batchSize ($number) {} + + abstract public function info () {} + + abstract public function dead () {} + + abstract public function current () {} + + abstract public function next () {} + + abstract public function key () {} + + abstract public function valid () {} + + abstract public function rewind () {} + +} + +/** @jms-builtin */ +class MongoCursor implements MongoCursorInterface, Traversable, Iterator { + public static $slaveOkay; + public static $timeout; + + + /** + * Create a new cursor + * @link http://www.php.net/manual/en/mongocursor.construct.php + * @param connection MongoClient + * @param database_and_collection_name + * @param query[optional] + * @param array_of_fields_OR_object[optional] + */ + public function __construct (MongoClient $connection, $database_and_collection_name, $query, $array_of_fields_OR_object) {} + + /** + * Checks if there are any more elements in this cursor + * @link http://www.php.net/manual/en/mongocursor.hasnext.php + * @return bool if there is another element. + */ + public function hasNext () {} + + /** + * Return the next object to which this cursor points, and advance the cursor + * @link http://www.php.net/manual/en/mongocursor.getnext.php + * @return array the next object. + */ + public function getNext () {} + + /** + * Limits the number of results returned + * @link http://www.php.net/manual/en/mongocursor.limit.php + * @param num int

    + * The number of results to return. + *

    + * @return MongoCursor this cursor. + */ + public function limit ($num) {} + + /** + * Limits the number of elements returned in one batch. + * @link http://www.php.net/manual/en/mongocursor.batchsize.php + * @param batchSize int

    + * The number of results to return per batch. Each batch requires a + * round-trip to the server. + *

    + *

    + * If batchSize is 2 or + * more, it represents the size of each batch of objects retrieved. + * It can be adjusted to optimize performance and limit data transfer. + *

    + *

    + * If batchSize is 1 or negative, it + * will limit of number returned documents to the absolute value of batchSize, + * and the cursor will be closed. For example if + * batchSize is -10, then the server will return a maximum + * of 10 documents and as many as can fit in 4MB, then close the cursor. + *

    + *

    + * A batchSize of 1 is special, and + * means the same as -1, i.e. a value of + * 1 makes the cursor only capable of returning + * one document. + *

    + *

    + * Note that this feature is different from + * MongoCursor::limit in that documents must fit within a + * maximum size, and it removes the need to send a request to close the cursor + * server-side. The batch size can be changed even after a cursor is iterated, + * in which case the setting will apply on the next batch retrieval. + *

    + *

    + * This cannot override MongoDB's limit on the amount of data it will return to + * the client (i.e., if you set batch size to 1,000,000,000, MongoDB will still + * only return 4-16MB of results per batch). + *

    + *

    + * To ensure consistent behavior, the rules of + * MongoCursor::batchSize and + * MongoCursor::limit behave a + * little complex but work "as expected". The rules are: hard limits override + * soft limits with preference given to MongoCursor::limit + * over MongoCursor::batchSize. After that, whichever is + * set and lower than the other will take precedence. See below. + * section for some examples. + *

    + * @return MongoCursor this cursor. + */ + public function batchSize ($batchSize) {} + + /** + * Skips a number of results + * @link http://www.php.net/manual/en/mongocursor.skip.php + * @param num int

    + * The number of results to skip. + *

    + * @return MongoCursor this cursor. + */ + public function skip ($num) {} + + /** + * Sets the fields for a query + * @link http://www.php.net/manual/en/mongocursor.fields.php + * @param f array

    + * Fields to return (or not return). + *

    + * @return MongoCursor this cursor. + */ + public function fields (array $f) {} + + /** + * @param ms + */ + public function maxTimeMS ($ms) {} + + /** + * Adds a top-level key/value pair to a query + * @link http://www.php.net/manual/en/mongocursor.addoption.php + * @param key string

    + * Fieldname to add. + *

    + * @param value mixed

    + * Value to add. + *

    + * @return MongoCursor this cursor. + */ + public function addOption ($key, $value) {} + + /** + * Use snapshot mode for the query + * @link http://www.php.net/manual/en/mongocursor.snapshot.php + * @return MongoCursor this cursor. + */ + public function snapshot () {} + + /** + * Sorts the results by given fields + * @link http://www.php.net/manual/en/mongocursor.sort.php + * @param fields array

    + * An array of fields by which to sort. Each element in the array has as + * key the field name, and as value either 1 for + * ascending sort, or -1 for descending sort. + *

    + *

    + * Each result is first sorted on the first field in the array, then (if + * it exists) on the second field in the array, etc. This means that the + * order of the fields in the fields array is + * important. See also the examples section. + *

    + * @return MongoCursor the same cursor that this method was called on. + */ + public function sort (array $fields) {} + + /** + * Gives the database a hint about the query + * @link http://www.php.net/manual/en/mongocursor.hint.php + * @param index mixed

    + * Index to use for the query. If a string is passed, it should correspond + * to an index name. If an array or object is passed, it should correspond + * to the specification used to create the index (i.e. the first argument + * to MongoCollection::ensureIndex). + *

    + * @return MongoCursor this cursor. + */ + public function hint ($index) {} + + /** + * Return an explanation of the query, often useful for optimization and debugging + * @link http://www.php.net/manual/en/mongocursor.explain.php + * @return array an explanation of the query. + */ + public function explain () {} + + /** + * Sets arbitrary flags in case there is no method available the specific flag + * @link http://www.php.net/manual/en/mongocursor.setflag.php + * @param flag int

    + * Which flag to set. You can not set flag 6 (EXHAUST) as the driver does + * not know how to handle them. You will get a warning if you try to use + * this flag. For available flags, please refer to the wire protocol + * documentation. + *

    + * @param set bool[optional]

    + * Whether the flag should be set (true) or unset (false). + *

    + * @return MongoCursor this cursor. + */ + public function setFlag ($flag, $set = null) {} + + /** + * Sets whether this query can be done on a secondary [deprecated] + * @link http://www.php.net/manual/en/mongocursor.slaveokay.php + * @param okay bool[optional]

    + * If it is okay to query the secondary. + *

    + * @return MongoCursor this cursor. + */ + public function slaveOkay ($okay = null) {} + + /** + * Sets whether this cursor will be left open after fetching the last results + * @link http://www.php.net/manual/en/mongocursor.tailable.php + * @param tail bool[optional]

    + * If the cursor should be tailable. + *

    + * @return MongoCursor this cursor. + */ + public function tailable ($tail = null) {} + + /** + * Sets whether this cursor will timeout + * @link http://www.php.net/manual/en/mongocursor.immortal.php + * @param liveForever bool[optional]

    + * If the cursor should be immortal. + *

    + * @return MongoCursor this cursor. + */ + public function immortal ($liveForever = null) {} + + /** + * Sets whether this cursor will wait for a while for a tailable cursor to return more data + * @link http://www.php.net/manual/en/mongocursor.awaitdata.php + * @param wait bool[optional]

    + * If the cursor should wait for more data to become available. + *

    + * @return MongoCursor this cursor. + */ + public function awaitData ($wait = null) {} + + /** + * If this query should fetch partial results from mongos if a shard is down + * @link http://www.php.net/manual/en/mongocursor.partial.php + * @param okay bool[optional]

    + * If receiving partial results is okay. + *

    + * @return MongoCursor this cursor. + */ + public function partial ($okay = null) {} + + /** + * Get the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return MongoCursor this cursor. + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Sets a client-side timeout for this query + * @link http://www.php.net/manual/en/mongocursor.timeout.php + * @param ms int

    + * The number of milliseconds for the cursor to wait for a response. Use + * -1 to wait forever. By default, the cursor will wait + * MongoCursor::$timeout milliseconds. + *

    + * @return MongoCursor This cursor. + */ + public function timeout ($ms) {} + + /** + * Execute the query. + * @link http://www.php.net/manual/en/mongocursor.doquery.php + * @return void &null;. + */ + protected function doQuery () {} + + /** + * Gets the query, fields, limit, and skip for this cursor + * @link http://www.php.net/manual/en/mongocursor.info.php + * @return array the namespace, limit, skip, query, and fields for this cursor. + */ + public function info () {} + + /** + * Checks if there are documents that have not been sent yet from the database for this cursor + * @link http://www.php.net/manual/en/mongocursor.dead.php + * @return bool if there are more results that have not been sent to the client, yet. + */ + public function dead () {} + + /** + * Returns the current element + * @link http://www.php.net/manual/en/mongocursor.current.php + * @return array The current result as an associative array. + */ + public function current () {} + + /** + * Returns the current result's _id + * @link http://www.php.net/manual/en/mongocursor.key.php + * @return string The current result's _id as a string. + */ + public function key () {} + + /** + * Advances the cursor to the next result + * @link http://www.php.net/manual/en/mongocursor.next.php + * @return void &null;. + */ + public function next () {} + + /** + * Returns the cursor to the beginning of the result set + * @link http://www.php.net/manual/en/mongocursor.rewind.php + * @return void &null;. + */ + public function rewind () {} + + /** + * Checks if the cursor is reading a valid result. + * @link http://www.php.net/manual/en/mongocursor.valid.php + * @return bool If the current result is not null. + */ + public function valid () {} + + /** + * Clears the cursor + * @link http://www.php.net/manual/en/mongocursor.reset.php + * @return void &null;. + */ + public function reset () {} + + /** + * Counts the number of results for this query + * @link http://www.php.net/manual/en/mongocursor.count.php + * @param foundOnly bool[optional]

    + * Send cursor limit and skip information to the count function, if applicable. + *

    + * @return int The number of documents returned by this cursor's query. + */ + public function count ($foundOnly = null) {} + +} + +/** @jms-builtin */ +class MongoCommandCursor implements MongoCursorInterface, Traversable, Iterator { + + /** + * Create a new command cursor + * @link http://www.php.net/manual/en/mongocommandcursor.construct.php + * @param connection MongoClient + * @param database_and_collection_name + * @param query[optional] + * @param array_of_fields_OR_object[optional] + */ + public function __construct (MongoClient $connection, $database_and_collection_name, $query, $array_of_fields_OR_object) {} + + /** + * Limits the number of elements returned in one batch. + * @link http://www.php.net/manual/en/mongocommandcursor.batchsize.php + * @param batchSize int

    + * The number of results to return per batch. Each batch requires a + * round-trip to the server. + *

    + *

    + * This cannot override MongoDB's limit on the amount of data it will return to + * the client (i.e., if you set batch size to 1,000,000,000, MongoDB will still + * only return 4-16MB of results per batch). + *

    + * @return MongoCommandCursor this cursor. + */ + public function batchSize ($batchSize) {} + + /** + * Gets the query, fields, limit, and skip for this cursor + * @link http://www.php.net/manual/en/mongocommandcursor.info.php + * @return array the namespace, limit, skip, query, fields, connection and iteration + * information for this cursor. + */ + public function info () {} + + /** + * Checks if there are documents that have not been sent yet from the database for this cursor + * @link http://www.php.net/manual/en/mongocommandcursor.dead.php + * @return bool if there are more results that have not been sent to the client, yet. + */ + public function dead () {} + + /** + * Returns the current element + * @link http://www.php.net/manual/en/mongocommandcursor.current.php + * @return array The current result as an associative array. + */ + public function current () {} + + /** + * Returns the current result's _id + * @link http://www.php.net/manual/en/mongocommandcursor.key.php + * @return string The current result's _id as a string. + */ + public function key () {} + + /** + * Advances the cursor to the next result + * @link http://www.php.net/manual/en/mongocommandcursor.next.php + * @return void &null;. + */ + public function next () {} + + /** + * Executes the command and resets the cursor to the start of the result set + * @link http://www.php.net/manual/en/mongocommandcursor.rewind.php + * @return array The raw server result document. + */ + public function rewind () {} + + /** + * Fetches a new result item, and returns whether it could + * @link http://www.php.net/manual/en/mongocommandcursor.valid.php + * @return bool true if a next item could be returned, and false otherwise. + */ + public function valid () {} + + public function reset () {} + +} + +/** @jms-builtin */ +class MongoGridFS extends MongoCollection { + const ASCENDING = 1; + const DESCENDING = -1; + + public $w; + public $wtimeout; + public $chunks; + protected $filesName; + protected $chunksName; + + + /** + * Creates new file collections + * @link http://www.php.net/manual/en/mongogridfs.construct.php + */ + public function __construct () {} + + /** + * Drops the files and chunks collections + * @link http://www.php.net/manual/en/mongogridfs.drop.php + * @return array The database response. + */ + public function drop () {} + + /** + * Queries for files + * @link http://www.php.net/manual/en/mongogridfs.find.php + * @param query array[optional]

    + * The query. + *

    + * @param fields array[optional]

    + * Fields to return. + *

    + * @return MongoGridFSCursor A MongoGridFSCursor. + */ + public function find (array $query = null, array $fields = null) {} + + /** + * Stores a file in the database + * @link http://www.php.net/manual/en/mongogridfs.storefile.php + * @param filename string

    + * Name of the file to store. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + * @param options array[optional]

    + * Options for the store. + * &mongo.writes.parameters.writeconcern; + *

    + * @return mixed + */ + public function storeFile ($filename, array $metadata = null, array $options = null) {} + + /** + * Stores a string of bytes in the database + * @link http://www.php.net/manual/en/mongogridfs.storebytes.php + * @param bytes string

    + * String of bytes to store. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + * @param options array[optional]

    + * Options for the store. + * &mongo.writes.parameters.writeconcern; + *

    + * @return mixed + */ + public function storeBytes ($bytes, array $metadata = null, array $options = null) {} + + /** + * Returns a single file matching the criteria + * @link http://www.php.net/manual/en/mongogridfs.findone.php + * @param query mixed[optional]

    + * The filename or criteria for which to search. + *

    + * @param fields mixed[optional] + * @return MongoGridFSFile a MongoGridFSFile or &null;. + */ + public function findOne ($query = null, $fields = null) {} + + /** + * Removes files from the collections + * @link http://www.php.net/manual/en/mongogridfs.remove.php + * @param criteria array[optional] + * @param options array[optional]

    + * Options for the remove. Valid options are: + *

    + * &mongo.writes.parameters.writeconcern; + * @return bool if the removal was successfully sent to the database. + */ + public function remove (array $criteria = null, array $options = null) {} + + /** + * Stores an uploaded file in the database + * @link http://www.php.net/manual/en/mongogridfs.storeupload.php + * @param name string

    + * The name of the uploaded file to store. This should correspond to the + * file field's name attribute in the HTML form. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + *

    + * The filename index will be populated with the + * filename used. + *

    + * @return mixed + */ + public function storeUpload ($name, array $metadata = null) {} + + /** + * Delete a file from the database + * @link http://www.php.net/manual/en/mongogridfs.delete.php + * @param id mixed

    + * _id of the file to remove. + *

    + * @return bool if the remove was successfully sent to the database. + */ + public function delete ($id) {} + + /** + * Retrieve a file from the database + * @link http://www.php.net/manual/en/mongogridfs.get.php + * @param id mixed

    + * _id of the file to find. + *

    + * @return MongoGridFSFile the file, if found, or &null;. + */ + public function get ($id) {} + + /** + * Stores a file in the database + * @link http://www.php.net/manual/en/mongogridfs.put.php + * @param filename string

    + * Name of the file to store. + *

    + * @param metadata array[optional]

    + * Other metadata fields to include in the file document. + *

    + * &mongo.gridfs.store.metadata.note; + * @return mixed + */ + public function put ($filename, array $metadata = null) {} + + /** + * String representation of this collection + * @link http://www.php.net/manual/en/mongocollection.--tostring.php + * @return string the full name of this collection. + */ + public function __toString () {} + + /** + * Gets a collection + * @link http://www.php.net/manual/en/mongocollection.get.php + * @param name string

    + * The next string in the collection name. + *

    + * @return MongoCollection the collection. + */ + public function __get ($name) {} + + /** + * Returns this collection's name + * @link http://www.php.net/manual/en/mongocollection.getname.php + * @return string the name of this collection. + */ + public function getName () {} + + /** + * Get slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.getslaveokay.php + * @return bool the value of slaveOkay for this instance. + */ + public function getSlaveOkay () {} + + /** + * Change slaveOkay setting for this collection + * @link http://www.php.net/manual/en/mongocollection.setslaveokay.php + * @param ok bool[optional]

    + * If reads should be sent to secondary members of a replica set for all + * possible queries using this MongoCollection + * instance. + *

    + * @return bool the former value of slaveOkay for this instance. + */ + public function setSlaveOkay ($ok = null) {} + + /** + * Get the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this collection + * @link http://www.php.net/manual/en/mongocollection.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return bool + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Get the write concern for this collection + * @link http://www.php.net/manual/en/mongocollection.getwriteconcern.php + * @return array + */ + public function getWriteConcern () {} + + /** + * Set the write concern for this database + * @link http://www.php.net/manual/en/mongocollection.setwriteconcern.php + * @param w mixed + * @param wtimeout int[optional] + * @return bool + */ + public function setWriteConcern ($w, $wtimeout = null) {} + + /** + * Validates this collection + * @link http://www.php.net/manual/en/mongocollection.validate.php + * @param scan_data bool[optional]

    + * Only validate indices, not the base collection. + *

    + * @return array the database's evaluation of this object. + */ + public function validate ($scan_data = null) {} + + /** + * Inserts a document into the collection + * @link http://www.php.net/manual/en/mongocollection.insert.php + * @param a array|object

    + * An array or object. If an object is used, it may not have protected or + * private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. This special behavior does not mean that the + * parameter is passed by reference. + *

    + * @param options array[optional]

    + * Options for the insert. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return bool|array an array containing the status of the insertion if the + * "w" option is set. Otherwise, returns true if the + * inserted array is not empty (a MongoException will be + * thrown if the inserted array is empty). + *

    + *

    + * If an array is returned, the following keys may be present: + * ok + *

    + * This should almost always be 1 (unless last_error itself failed). + *

    + * err + *

    + * If this field is non-null, an error occurred on the previous operation. + * If this field is set, it will be a string describing the error that + * occurred. + *

    + * code + *

    + * If a database error occurred, the relevant error code will be passed + * back to the client. + *

    + * errmsg + *

    + * This field is set if something goes wrong with a database command. It + * is coupled with ok being 0. For example, if + * w is set and times out, errmsg will be set to "timed + * out waiting for slaves" and ok will be 0. If this + * field is set, it will be a string describing the error that occurred. + *

    + * n + *

    + * If the last operation was an update, upsert, or a remove, the number + * of documents affected will be returned. For insert operations, this value + * is always 0. + *

    + * wtimeout + *

    + * If the previous option timed out waiting for replication. + *

    + * waited + *

    + * How long the operation waited before timing out. + *

    + * wtime + *

    + * If w was set and the operation succeeded, how long it took to + * replicate to w servers. + *

    + * upserted + *

    + * If an upsert occurred, this field will contain the new record's + * _id field. For upserts, either this field or + * updatedExisting will be present (unless an error + * occurred). + *

    + * updatedExisting + *

    + * If an upsert updated an existing element, this field will be true. For + * upserts, either this field or upserted will be present (unless an error + * occurred). + *

    + */ + public function insert ($a, array $options = null) {} + + /** + * Inserts multiple documents into this collection + * @link http://www.php.net/manual/en/mongocollection.batchinsert.php + * @param a array

    + * An array of arrays or objects. If any objects are used, they may not have + * protected or private properties. + *

    + *

    + * If the documents to insert do not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the inserts. + *

    + * "continueOnError" + *

    + *

    + * Boolean, defaults to false. If set, the database will not stop + * processing a bulk insert if one fails (eg due to duplicate IDs). + * This makes bulk insert behave similarly to a series of single + * inserts, except that calling MongoDB::lastError + * will have an error set if any insert fails, not just the last one. + * If multiple errors occur, only the most recent will be reported by + * MongoDB::lastError. + *

    + *

    + * Please note that continueOnError affects errors + * on the database side only. If you try to insert a document that has + * errors (for example it contains a key with an empty name), then the + * document is not even transferred to the database as the driver + * detects this error and bails out. + * continueOnError has no effect on errors detected + * in the documents by the driver. + *

    + * @return mixed If the w parameter is set to acknowledge the write, + * returns an associative array with the status of the inserts ("ok") and any + * error that may have occurred ("err"). Otherwise, returns true if the + * batch insert was successfully sent, false otherwise. + */ + public function batchInsert (array $a, array $options = null) {} + + /** + * Update records based on a given criteria + * @link http://www.php.net/manual/en/mongocollection.update.php + * @param criteria array

    + * Description of the objects to update. + *

    + * @param new_object array

    + * The object with which to update the matching records. + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + *

    + * "upsert" + *

    + *

    + * If no document matches $criteria, a new + * document will be inserted. + *

    + *

    + * If a new document would be inserted and + * $new_object contains atomic modifiers + * (i.e. $ operators), those operations will be + * applied to the $criteria parameter to create + * the new document. If $new_object does not + * contain atomic modifiers, it will be used as-is for the inserted + * document. See the upsert examples below for more information. + *

    + * @return bool|array an array containing the status of the update if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function update (array $criteria, array $new_object, array $options = null) {} + + /** + * Update a document and return it + * @link http://www.php.net/manual/en/mongocollection.findandmodify.php + * @param query array

    + * The query criteria to search for. + *

    + * @param update array[optional]

    + * The update criteria. + *

    + * @param fields array[optional]

    + * Optionally only return these fields. + *

    + * @param options array[optional]

    + * An array of options to apply, such as remove the match document from the + * DB and return it. + * + * Option + * &Description; + * + * + * sort array + * + * Determines which document the operation will modify if the + * query selects multiple documents. findAndModify will modify the + * first document in the sort order specified by this argument. + * + * + * + * remove boolean + * + * Optional if update field exists. When true, removes the selected + * document. The default is false. + * + * + * + * update array + * + * Optional if remove field exists. + * Performs an update of the selected document. + * + * + * + * new boolean + * + * Optional. When true, returns the modified document rather than the + * original. The findAndModify method ignores the new option for + * remove operations. The default is false. + * + * + * + * upsert boolean + * + * Optional. Used in conjunction with the update field. When true, the + * findAndModify command creates a new document if the query returns + * no documents. The default is false. In MongoDB 2.2, the + * findAndModify command returns &null; when upsert is true. + * + * + * + * + * + * + * + *

    + * @return array the original document, or the modified document when + * new is set. + */ + public function findAndModify (array $query, array $update = null, array $fields = null, array $options = null) {} + + /** + * Execute a database command and retrieve results through a cursor + * @link http://www.php.net/manual/en/mongocollection.commandcursor.php + * @param command array

    + * The command query to send. + *

    + *

    + * It is possible to configure how many initial documents the server + * should return with the first result set. This configuration is made as + * part of the command query. The default initial batch size is + * 101. You can change it by adding the + * cursor key in the following way to the command: + *

    + * commandCursor( [ + * "aggregate" => "collectionName", + * "pipeline" => [ + * ... + * ], + * "cursor" => [ "batchSize" => 4 ], + * ] ); + * ]]> + *

    + * If you do not set the initial + * batchSize option, then the PHP driver will implicitly + * add this for you with a value of 101 + *

    + *

    + * This setting does only configure the first batch size. To configure the + * size of future batches, please use the + * MongoCommandCursor::batchSize method on the + * returned MongoCommandCursor object. + *

    + * @return MongoCommandCursor a MongoCommandCursor object. Because this + * implements the Iterator interface you can + * iterate over each of the results as returned by the command query. The + * MongoCommandCursor also implements the + * MongoCursorInterface interface which adds the + * MongoCommandCursor::batchSize, + * MongoCommandCursor::dead, + * MongoCommandCursor::info methods. + */ + public function commandCursor (array $command) {} + + /** + * Creates an index on the given field(s) + * @link http://www.php.net/manual/en/mongocollection.createindex.php + * @param keys array

    + * An array of fields by which to sort the index on. Each element in the + * array has as key the field name, and as value either + * 1 for ascending sort, -1 for + * descending sort, or any of the index plugins (currently, + * "text", "2d", or + * "2dsphere""). + *

    + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation. The array + * contains whether the operation worked ("ok"), the amount + * of indexes before and after the operation + * ("numIndexesBefore" and + * "numIndexesAfter") and whether the collection that the + * index belongs to has been created + * ("createdCollectionAutomatically"). + *

    + *

    + * With MongoDB 2.4 and earlier, a status document is only returned if the + * "w" option is set to 1—either through + * the connection string, or with . If + * "w" is not set to 1, it returns + * true. The fields in the status document are different, except for the + * "ok" field which signals whether the index creation + * worked. + */ + public function createIndex (array $keys, array $options = null) {} + + /** + * Creates an index on the given field(s), or does nothing if the index + already exists + * @link http://www.php.net/manual/en/mongocollection.ensureindex.php + * @param key_keys string|array + * @param options array[optional]

    + * This parameter is an associative array of the form + * array("optionname" => <boolean>, ...). Currently + * supported options are: + * &mongo.writes.parameters.writeconcern; + *

    + * "unique" + *

    + *

    + * Create a unique index. + *

    + *

    + * A unique index cannot be created on a field if multiple existing + * documents do not contain the field. The field is effectively &null; + * for these documents and thus already non-unique. Sparse indexing may + * be used to overcome this, since it will prevent documents without the + * field from being indexed. + *

    + * @return bool an array containing the status of the index creation if the + * "w" option is set. Otherwise, returns true. + *

    + *

    + * Fields in the status array are described in the documentation for + * MongoCollection::insert. + */ + public function ensureIndex ($key_keys, array $options = null) {} + + /** + * Deletes an index from this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindex.php + * @param keys string|array

    + * Field or fields from which to delete the index. + *

    + * @return array the database response. + */ + public function deleteIndex ($keys) {} + + /** + * Delete all indices for this collection + * @link http://www.php.net/manual/en/mongocollection.deleteindexes.php + * @return array the database response. + */ + public function deleteIndexes () {} + + /** + * Returns information about indexes on this collection + * @link http://www.php.net/manual/en/mongocollection.getindexinfo.php + * @return array This function returns an array in which each element describes an index. + * Elements will contain the values name for the name of + * the index, ns for the namespace (a combination of the + * database and collection name), and key for a list of all + * fields in the index and their ordering. Additional values may be present for + * special indexes, such as unique or + * sparse. + */ + public function getIndexInfo () {} + + /** + * Counts the number of documents in this collection + * @link http://www.php.net/manual/en/mongocollection.count.php + * @param query array[optional]

    + * Associative array or object with fields to match. + *

    + * @param limit int[optional]

    + * Specifies an upper limit to the number returned. + *

    + * @param skip int[optional]

    + * Specifies a number of results to skip before starting the count. + *

    + * @return int the number of documents matching the query. + */ + public function count (array $query = null, $limit = null, $skip = null) {} + + /** + * Saves a document to this collection + * @link http://www.php.net/manual/en/mongocollection.save.php + * @param a array|object

    + * Array or object to save. If an object is used, it may not have protected + * or private properties. + *

    + *

    + * If the parameter does not have an _id key or + * property, a new MongoId instance will be created + * and assigned to it. See MongoCollection::insert for + * additional information on this behavior. + *

    + * @param options array[optional]

    + * Options for the save. + * &mongo.writes.parameters.fsync; + * &mongo.writes.parameters.journal; + * &mongo.writes.parameters.sockettimeoutms; + * &mongo.writes.parameters.writeconcern; + * &mongo.writes.parameters.writeconcerntimeout; + * &mongo.writes.parameters.writeconcerntimeoutms; + * &mongo.writes.parameters.safe; + * &mongo.writes.parameters.timeout; + *

    + * @return mixed If w was set, returns an array containing the status of the save. + * Otherwise, returns a boolean representing if the array was not empty (an empty array will not + * be inserted). + */ + public function save ($a, array $options = null) {} + + /** + * Creates a database reference + * @link http://www.php.net/manual/en/mongocollection.createdbref.php + * @param document_or_id mixed

    + * If an array or object is given, its _id field will be + * used as the reference ID. If a MongoId or scalar + * is given, it will be used as the reference ID. + *

    + * @return array a database reference array. + *

    + *

    + * If an array without an _id field was provided as the + * document_or_id parameter, &null; will be returned. + */ + public function createDBRef ($document_or_id) {} + + /** + * Fetches the document pointed to by a database reference + * @link http://www.php.net/manual/en/mongocollection.getdbref.php + * @param ref array

    + * A database reference. + *

    + * @return array the database document pointed to by the reference. + */ + public function getDBRef (array $ref) {} + + /** + * Converts keys specifying an index to its identifying string + * @link http://www.php.net/manual/en/mongocollection.toindexstring.php + * @param keys mixed

    + * Field or fields to convert to the identifying string + *

    + * @return string a string that describes the index. + */ + protected static function toIndexString ($keys) {} + + /** + * Performs an operation similar to SQL's GROUP BY command + * @link http://www.php.net/manual/en/mongocollection.group.php + * @param keys mixed

    + * Fields to group by. If an array or non-code object is passed, it will be + * the key used to group results. + *

    + *

    1.0.4+: If keys is an instance of + * MongoCode, keys will be treated as + * a function that returns the key to group by (see the "Passing a + * keys function" example below). + *

    + * @param initial array

    + * Initial value of the aggregation counter object. + *

    + * @param reduce MongoCode

    + * A function that takes two arguments (the current document and the + * aggregation to this point) and does the aggregation. + *

    + * @param options array[optional]

    + * Optional parameters to the group command. Valid options include: + *

    + *

    + * "condition" + *

    + *

    + * Criteria for including a document in the aggregation. + *

    + * @return array an array containing the result. + */ + public function group ($keys, array $initial, MongoCode $reduce, array $options = null) {} + + /** + * Retrieve a list of distinct values for the given key across a collection. + * @link http://www.php.net/manual/en/mongocollection.distinct.php + * @param key string

    + * The key to use. + *

    + * @param query array[optional]

    + * An optional query parameters + *

    + * @return array an array of distinct values, &return.falseforfailure; + */ + public function distinct ($key, array $query = null) {} + + /** + * Perform an aggregation using the aggregation framework + * @link http://www.php.net/manual/en/mongocollection.aggregate.php + * @param pipeline array

    + * An array of pipeline operators. + *

    + * @param options array[optional]

    + * Array of command arguments, such as allowDiskUse, explain or cursor. + *

    + * @return array The result of the aggregation as an array. The ok will + * be set to 1 on success, 0 on failure. + */ + public function aggregate (array $pipeline, array $options = null) {} + +} + +/** @jms-builtin */ +class MongoGridFSFile { + public $file; + protected $gridfs; + + + /** + * Create a new GridFS file + * @link http://www.php.net/manual/en/mongogridfsfile.construct.php + */ + public function __construct () {} + + /** + * Returns this file's filename + * @link http://www.php.net/manual/en/mongogridfsfile.getfilename.php + * @return string the filename. + */ + public function getFilename () {} + + /** + * Returns this file's size + * @link http://www.php.net/manual/en/mongogridfsfile.getsize.php + * @return int this file's size + */ + public function getSize () {} + + /** + * Writes this file to the filesystem + * @link http://www.php.net/manual/en/mongogridfsfile.write.php + * @param filename string[optional]

    + * The location to which to write the file. If none is given, + * the stored filename will be used. + *

    + * @return int the number of bytes written. + */ + public function write ($filename = null) {} + + /** + * Returns this file's contents as a string of bytes + * @link http://www.php.net/manual/en/mongogridfsfile.getbytes.php + * @return string a string of the bytes in the file. + */ + public function getBytes () {} + + /** + * Returns a resource that can be used to read the stored file + * @link http://www.php.net/manual/en/mongogridfsfile.getresource.php + * @return stream a resource that can be used to read the file with + */ + public function getResource () {} + +} + +/** @jms-builtin */ +class MongoGridFSCursor extends MongoCursor implements Iterator, Traversable, MongoCursorInterface { + public static $slaveOkay; + public static $timeout; + protected $gridfs; + + + /** + * Create a new cursor + * @link http://www.php.net/manual/en/mongogridfscursor.construct.php + */ + public function __construct () {} + + /** + * Return the next file to which this cursor points, and advance the cursor + * @link http://www.php.net/manual/en/mongogridfscursor.getnext.php + * @return MongoGridFSFile the next file. + */ + public function getNext () {} + + /** + * Returns the current file + * @link http://www.php.net/manual/en/mongogridfscursor.current.php + * @return MongoGridFSFile The current file. + */ + public function current () {} + + /** + * Checks if there are any more elements in this cursor + * @link http://www.php.net/manual/en/mongocursor.hasnext.php + * @return bool if there is another element. + */ + public function hasNext () {} + + /** + * Limits the number of results returned + * @link http://www.php.net/manual/en/mongocursor.limit.php + * @param num int

    + * The number of results to return. + *

    + * @return MongoCursor this cursor. + */ + public function limit ($num) {} + + /** + * Limits the number of elements returned in one batch. + * @link http://www.php.net/manual/en/mongocursor.batchsize.php + * @param batchSize int

    + * The number of results to return per batch. Each batch requires a + * round-trip to the server. + *

    + *

    + * If batchSize is 2 or + * more, it represents the size of each batch of objects retrieved. + * It can be adjusted to optimize performance and limit data transfer. + *

    + *

    + * If batchSize is 1 or negative, it + * will limit of number returned documents to the absolute value of batchSize, + * and the cursor will be closed. For example if + * batchSize is -10, then the server will return a maximum + * of 10 documents and as many as can fit in 4MB, then close the cursor. + *

    + *

    + * A batchSize of 1 is special, and + * means the same as -1, i.e. a value of + * 1 makes the cursor only capable of returning + * one document. + *

    + *

    + * Note that this feature is different from + * MongoCursor::limit in that documents must fit within a + * maximum size, and it removes the need to send a request to close the cursor + * server-side. The batch size can be changed even after a cursor is iterated, + * in which case the setting will apply on the next batch retrieval. + *

    + *

    + * This cannot override MongoDB's limit on the amount of data it will return to + * the client (i.e., if you set batch size to 1,000,000,000, MongoDB will still + * only return 4-16MB of results per batch). + *

    + *

    + * To ensure consistent behavior, the rules of + * MongoCursor::batchSize and + * MongoCursor::limit behave a + * little complex but work "as expected". The rules are: hard limits override + * soft limits with preference given to MongoCursor::limit + * over MongoCursor::batchSize. After that, whichever is + * set and lower than the other will take precedence. See below. + * section for some examples. + *

    + * @return MongoCursor this cursor. + */ + public function batchSize ($batchSize) {} + + /** + * Skips a number of results + * @link http://www.php.net/manual/en/mongocursor.skip.php + * @param num int

    + * The number of results to skip. + *

    + * @return MongoCursor this cursor. + */ + public function skip ($num) {} + + /** + * Sets the fields for a query + * @link http://www.php.net/manual/en/mongocursor.fields.php + * @param f array

    + * Fields to return (or not return). + *

    + * @return MongoCursor this cursor. + */ + public function fields (array $f) {} + + /** + * @param ms + */ + public function maxTimeMS ($ms) {} + + /** + * Adds a top-level key/value pair to a query + * @link http://www.php.net/manual/en/mongocursor.addoption.php + * @param key string

    + * Fieldname to add. + *

    + * @param value mixed

    + * Value to add. + *

    + * @return MongoCursor this cursor. + */ + public function addOption ($key, $value) {} + + /** + * Use snapshot mode for the query + * @link http://www.php.net/manual/en/mongocursor.snapshot.php + * @return MongoCursor this cursor. + */ + public function snapshot () {} + + /** + * Sorts the results by given fields + * @link http://www.php.net/manual/en/mongocursor.sort.php + * @param fields array

    + * An array of fields by which to sort. Each element in the array has as + * key the field name, and as value either 1 for + * ascending sort, or -1 for descending sort. + *

    + *

    + * Each result is first sorted on the first field in the array, then (if + * it exists) on the second field in the array, etc. This means that the + * order of the fields in the fields array is + * important. See also the examples section. + *

    + * @return MongoCursor the same cursor that this method was called on. + */ + public function sort (array $fields) {} + + /** + * Gives the database a hint about the query + * @link http://www.php.net/manual/en/mongocursor.hint.php + * @param index mixed

    + * Index to use for the query. If a string is passed, it should correspond + * to an index name. If an array or object is passed, it should correspond + * to the specification used to create the index (i.e. the first argument + * to MongoCollection::ensureIndex). + *

    + * @return MongoCursor this cursor. + */ + public function hint ($index) {} + + /** + * Return an explanation of the query, often useful for optimization and debugging + * @link http://www.php.net/manual/en/mongocursor.explain.php + * @return array an explanation of the query. + */ + public function explain () {} + + /** + * Sets arbitrary flags in case there is no method available the specific flag + * @link http://www.php.net/manual/en/mongocursor.setflag.php + * @param flag int

    + * Which flag to set. You can not set flag 6 (EXHAUST) as the driver does + * not know how to handle them. You will get a warning if you try to use + * this flag. For available flags, please refer to the wire protocol + * documentation. + *

    + * @param set bool[optional]

    + * Whether the flag should be set (true) or unset (false). + *

    + * @return MongoCursor this cursor. + */ + public function setFlag ($flag, $set = null) {} + + /** + * Sets whether this query can be done on a secondary [deprecated] + * @link http://www.php.net/manual/en/mongocursor.slaveokay.php + * @param okay bool[optional]

    + * If it is okay to query the secondary. + *

    + * @return MongoCursor this cursor. + */ + public function slaveOkay ($okay = null) {} + + /** + * Sets whether this cursor will be left open after fetching the last results + * @link http://www.php.net/manual/en/mongocursor.tailable.php + * @param tail bool[optional]

    + * If the cursor should be tailable. + *

    + * @return MongoCursor this cursor. + */ + public function tailable ($tail = null) {} + + /** + * Sets whether this cursor will timeout + * @link http://www.php.net/manual/en/mongocursor.immortal.php + * @param liveForever bool[optional]

    + * If the cursor should be immortal. + *

    + * @return MongoCursor this cursor. + */ + public function immortal ($liveForever = null) {} + + /** + * Sets whether this cursor will wait for a while for a tailable cursor to return more data + * @link http://www.php.net/manual/en/mongocursor.awaitdata.php + * @param wait bool[optional]

    + * If the cursor should wait for more data to become available. + *

    + * @return MongoCursor this cursor. + */ + public function awaitData ($wait = null) {} + + /** + * If this query should fetch partial results from mongos if a shard is down + * @link http://www.php.net/manual/en/mongocursor.partial.php + * @param okay bool[optional]

    + * If receiving partial results is okay. + *

    + * @return MongoCursor this cursor. + */ + public function partial ($okay = null) {} + + /** + * Get the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.getreadpreference.php + * @return array + */ + public function getReadPreference () {} + + /** + * Set the read preference for this query + * @link http://www.php.net/manual/en/mongocursor.setreadpreference.php + * @param read_preference string + * @param tags array[optional] + * @return MongoCursor this cursor. + */ + public function setReadPreference ($read_preference, array $tags = null) {} + + /** + * Sets a client-side timeout for this query + * @link http://www.php.net/manual/en/mongocursor.timeout.php + * @param ms int

    + * The number of milliseconds for the cursor to wait for a response. Use + * -1 to wait forever. By default, the cursor will wait + * MongoCursor::$timeout milliseconds. + *

    + * @return MongoCursor This cursor. + */ + public function timeout ($ms) {} + + /** + * Execute the query. + * @link http://www.php.net/manual/en/mongocursor.doquery.php + * @return void &null;. + */ + protected function doQuery () {} + + /** + * Gets the query, fields, limit, and skip for this cursor + * @link http://www.php.net/manual/en/mongocursor.info.php + * @return array the namespace, limit, skip, query, and fields for this cursor. + */ + public function info () {} + + /** + * Checks if there are documents that have not been sent yet from the database for this cursor + * @link http://www.php.net/manual/en/mongocursor.dead.php + * @return bool if there are more results that have not been sent to the client, yet. + */ + public function dead () {} + + /** + * Returns the current result's _id + * @link http://www.php.net/manual/en/mongocursor.key.php + * @return string The current result's _id as a string. + */ + public function key () {} + + /** + * Advances the cursor to the next result + * @link http://www.php.net/manual/en/mongocursor.next.php + * @return void &null;. + */ + public function next () {} + + /** + * Returns the cursor to the beginning of the result set + * @link http://www.php.net/manual/en/mongocursor.rewind.php + * @return void &null;. + */ + public function rewind () {} + + /** + * Checks if the cursor is reading a valid result. + * @link http://www.php.net/manual/en/mongocursor.valid.php + * @return bool If the current result is not null. + */ + public function valid () {} + + /** + * Clears the cursor + * @link http://www.php.net/manual/en/mongocursor.reset.php + * @return void &null;. + */ + public function reset () {} + + /** + * Counts the number of results for this query + * @link http://www.php.net/manual/en/mongocursor.count.php + * @param foundOnly bool[optional]

    + * Send cursor limit and skip information to the count function, if applicable. + *

    + * @return int The number of documents returned by this cursor's query. + */ + public function count ($foundOnly = null) {} + +} + +/** @jms-builtin */ +class MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.construct.php + * @param collection MongoCollection + * @param batch_type[optional] + * @param write_options[optional] + */ + protected function __construct (MongoCollection $collection, $batch_typearray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoInsertBatch extends MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongoinsertbatch.construct.php + * @param collection MongoCollection + * @param write_options[optional] + */ + public function __construct (MongoCollection $collectionarray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoUpdateBatch extends MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongoupdatebatch.construct.php + * @param collection MongoCollection + * @param write_options[optional] + */ + public function __construct (MongoCollection $collectionarray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoDeleteBatch extends MongoWriteBatch { + + /** + * Description + * @link http://www.php.net/manual/en/mongodeletebatch.construct.php + * @param collection MongoCollection + * @param write_options[optional] + */ + public function __construct (MongoCollection $collectionarray , $write_options) {} + + /** + * Adds an CRUD operation to a batch + * @link http://www.php.net/manual/en/mongowritebatch.add.php + * @param item array

    + * + * When current batch is + * Argument expectation + * + * + * MongoWriteBatch::COMMAND_INSERT + * The document to add + * + * + * MongoWriteBatch::COMMAND_UPDATE + * + * Raw update operation. Required keys are: array("q" => array("criteria"), "u" => array("new data")) + * Optionally with the "multi" and "upsert" keys as boolean values + * + * + * + * MongoWriteBatch::COMMAND_DELETE + * + * Raw delete operation. Required keys are: array("q" => array("criteria"), "limit" => 1) + * + * + *

    + * @return bool true on success, throws exception on failure. + */ + public function add (array $item) {} + + /** + * Description + * @link http://www.php.net/manual/en/mongowritebatch.execute.php + * @param write_options array

    + * See MongoWriteBatch::__construct. + *

    + * @return array an array containing statistical information for the full batch. + * If the batch had to be split into multiple batches, the return value will aggregate + * the values from individual batches and return only the totals. + *

    + *

    + * If the batch was empty, an array containing only the 'ok' field is returned (as true) although + * nothing will be shipped over the wire (NOOP). + *

    + *

    + * + * Array key + * Value meaning + * Returned for batch type + * + * + * nInserted + * Number of inserted documents + * MongoWriteBatch::COMMAND_INSERT batch + * + * + * nMatched + * Number of documents matching the query criteria + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nModified + * Number of documents actually needed to be modied + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nUpserted + * Number of upserted documents + * MongoWriteBatch::COMMAND_UPDATE batch + * + * + * nRemoved + * Number of documents removed + * MongoWriteBatch::COMMAND_DELETE batch + * + * + * ok + * Command success indicator + * All + * + */ + final public function execute (array $write_options) {} + +} + +/** @jms-builtin */ +class MongoId { + public $id; + + + /** + * Creates a new id + * @link http://www.php.net/manual/en/mongoid.construct.php + */ + public function __construct () {} + + /** + * Returns a hexidecimal representation of this id + * @link http://www.php.net/manual/en/mongoid.tostring.php + * @return string This id. + */ + public function __toString () {} + + /** + * Create a dummy MongoId + * @link http://www.php.net/manual/en/mongoid.set-state.php + * @param props array

    + * Theoretically, an array of properties used to create the new id. + * However, as MongoId instances have no properties, this is not used. + *

    + * @return MongoId A new id with the value "000000000000000000000000". + */ + public static function __set_state (array $props) {} + + /** + * Gets the number of seconds since the epoch that this id was created + * @link http://www.php.net/manual/en/mongoid.gettimestamp.php + * @return int the number of seconds since the epoch that this id was created. There are only + * four bytes of timestamp stored, so MongoDate is a better choice + * for storing exact or wide-ranging times. + */ + public function getTimestamp () {} + + /** + * Gets the hostname being used for this machine's ids + * @link http://www.php.net/manual/en/mongoid.gethostname.php + * @return string the hostname. + */ + public static function getHostname () {} + + /** + * Gets the process ID + * @link http://www.php.net/manual/en/mongoid.getpid.php + * @return int the PID of the MongoId. + */ + public function getPID () {} + + /** + * Gets the incremented value to create this id + * @link http://www.php.net/manual/en/mongoid.getinc.php + * @return int the incremented value used to create this MongoId. + */ + public function getInc () {} + + /** + * Check if a value is a valid ObjectId + * @link http://www.php.net/manual/en/mongoid.isvalid.php + * @param value mixed

    + * The value to check for validity. + *

    + * @return bool true if value is a + * MongoId instance or a string consisting of exactly 24 + * hexadecimal characters; otherwise, false is returned. + */ + public static function isValid ($value) {} + +} + +/** @jms-builtin */ +class MongoCode { + public $code; + public $scope; + + + /** + * Creates a new code object + * @link http://www.php.net/manual/en/mongocode.construct.php + */ + public function __construct () {} + + /** + * Returns this code as a string + * @link http://www.php.net/manual/en/mongocode.tostring.php + * @return string This code, the scope is not returned. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoRegex { + public $regex; + public $flags; + + + /** + * Creates a new regular expression + * @link http://www.php.net/manual/en/mongoregex.construct.php + */ + public function __construct () {} + + /** + * A string representation of this regular expression + * @link http://www.php.net/manual/en/mongoregex.tostring.php + * @return string This regular expression in the form "/expr/flags". + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoDate { + public $sec; + public $usec; + + + /** + * Creates a new date. + * @link http://www.php.net/manual/en/mongodate.construct.php + */ + public function __construct () {} + + /** + * Returns a string representation of this date + * @link http://www.php.net/manual/en/mongodate.tostring.php + * @return string This date. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoBinData { + const GENERIC = 0; + const FUNC = 1; + const BYTE_ARRAY = 2; + const UUID = 3; + const UUID_RFC4122 = 4; + const MD5 = 5; + const CUSTOM = 128; + + public $bin; + public $type; + + + /** + * Creates a new binary data object. + * @link http://www.php.net/manual/en/mongobindata.construct.php + */ + public function __construct () {} + + /** + * The string representation of this binary data object. + * @link http://www.php.net/manual/en/mongobindata.tostring.php + * @return string the string "<Mongo Binary Data>". To access the contents of a + * MongoBinData, use the bin field. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoDBRef { + + /** + * Creates a new database reference + * @link http://www.php.net/manual/en/mongodbref.create.php + * @param collection string

    + * Collection name (without the database name). + *

    + * @param id mixed

    + * The _id field of the object to which to link. + *

    + * @param database string[optional]

    + * Database name. + *

    + * @return array the reference. + */ + public static function create ($collection, $id, $database = null) {} + + /** + * Checks if an array is a database reference + * @link http://www.php.net/manual/en/mongodbref.isref.php + * @param ref mixed

    + * Array or object to check. + *

    + * @return bool Returns true on success or false on failure. + */ + public static function isRef ($ref) {} + + /** + * Fetches the object pointed to by a reference + * @link http://www.php.net/manual/en/mongodbref.get.php + * @param db MongoDB

    + * Database to use. + *

    + * @param ref array

    + * Reference to fetch. + *

    + * @return array the document to which the reference refers or &null; if the document + * does not exist (the reference is broken). + */ + public static function get (MongoDB $db, array $ref) {} + +} + +/** @jms-builtin */ +class MongoException extends Exception { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoConnectionException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoCursorException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + private $host; + + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoCursorTimeoutException extends MongoCursorException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoGridFSException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoResultException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + public $document; + private $host; + + + /** + * Retrieve the full result document + * @link http://www.php.net/manual/en/mongoresultexception.getdocument.php + * @return array The full result document as an array, including partial data if available and + * additional keys. + */ + public function getDocument () {} + + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoWriteConcernException extends MongoCursorException { + protected $message; + protected $code; + protected $file; + protected $line; + private $document; + + + /** + * Get the error document + * @link http://www.php.net/manual/en/mongowriteconcernexception.getdocument.php + * @return array A MongoDB document, if available, as an array. + */ + public function getDocument () {} + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoDuplicateKeyException extends MongoWriteConcernException { + protected $message; + protected $code; + protected $file; + protected $line; + + + /** + * Get the error document + * @link http://www.php.net/manual/en/mongowriteconcernexception.getdocument.php + * @return array A MongoDB document, if available, as an array. + */ + public function getDocument () {} + + /** + * The hostname of the server that encountered the error + * @link http://www.php.net/manual/en/mongocursorexception.gethost.php + * @return string the hostname, or NULL if the hostname is unknown. + */ + public function getHost () {} + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoExecutionTimeoutException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoProtocolException extends MongoException { + protected $message; + protected $code; + protected $file; + protected $line; + + + final private function __clone () {} + + /** + * @param message[optional] + * @param code[optional] + * @param previous[optional] + */ + public function __construct ($message, $code, $previous) {} + + final public function getMessage () {} + + final public function getCode () {} + + final public function getFile () {} + + final public function getLine () {} + + final public function getTrace () {} + + final public function getPrevious () {} + + final public function getTraceAsString () {} + + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoTimestamp { + public $sec; + public $inc; + + + /** + * Creates a new timestamp. + * @link http://www.php.net/manual/en/mongotimestamp.construct.php + */ + public function __construct () {} + + /** + * Returns a string representation of this timestamp + * @link http://www.php.net/manual/en/mongotimestamp.tostring.php + * @return string The seconds since epoch represented by this timestamp. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoInt32 { + public $value; + + + /** + * Creates a new 32-bit integer. + * @link http://www.php.net/manual/en/mongoint32.construct.php + */ + public function __construct () {} + + /** + * Returns the string representation of this 32-bit integer. + * @link http://www.php.net/manual/en/mongoint32.tostring.php + * @return string the string representation of this integer. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoInt64 { + public $value; + + + /** + * Creates a new 64-bit integer. + * @link http://www.php.net/manual/en/mongoint64.construct.php + */ + public function __construct () {} + + /** + * Returns the string representation of this 64-bit integer. + * @link http://www.php.net/manual/en/mongoint64.tostring.php + * @return string the string representation of this integer. + */ + public function __toString () {} + +} + +/** @jms-builtin */ +class MongoLog { + const NONE = 0; + const WARNING = 1; + const INFO = 2; + const FINE = 4; + const RS = 1; + const POOL = 1; + const PARSE = 16; + const CON = 2; + const IO = 4; + const SERVER = 8; + const ALL = 31; + + private static $level; + private static $module; + private static $callback; + + + /** + * Sets logging level + * @link http://www.php.net/manual/en/mongolog.setlevel.php + * @param level int

    + * The levels you would like to log. + *

    + * @return void + */ + public static function setLevel ($level) {} + + /** + * Gets the log level + * @link http://www.php.net/manual/en/mongolog.getlevel.php + * @return int the current level. + */ + public static function getLevel () {} + + /** + * Sets driver functionality to log + * @link http://www.php.net/manual/en/mongolog.setmodule.php + * @param module int

    + * The module(s) you would like to log. + *

    + * @return void + */ + public static function setModule ($module) {} + + /** + * Gets the modules currently being logged + * @link http://www.php.net/manual/en/mongolog.getmodule.php + * @return int the modules currently being logged. + */ + public static function getModule () {} + + /** + * Set a callback function to be called on events + * @link http://www.php.net/manual/en/mongolog.setcallback.php + * @param log_function callable

    + * The function to be called on events. + *

    + *

    + * The function should have the following prototype + *

    + *

    + * log_function + * intmodule + * intlevel + * stringmessage + * module + * One of the MongoLog + * module constants. + * @return void Returns true on success or false on failure. + */ + public static function setCallback ($log_function) {} + + /** + * Retrieve the previously set callback function name + * @link http://www.php.net/manual/en/mongolog.getcallback.php + * @return void the callback function name, or false if not set yet. + */ + public static function getCallback () {} + +} + +/** @jms-builtin */ +class MongoPool { + + /** + * Returns information about all connection pools. + * @link http://www.php.net/manual/en/mongopool.info.php + * @return array Each connection pool has an identifier, which starts with the host. For each + * pool, this function shows the following fields: + * in use + *

    + * The number of connections currently being used by + * Mongo instances. + *

    + * in pool + *

    + * The number of connections currently in the pool (not being used). + *

    + * remaining + *

    + * The number of connections that could be created by this pool. For + * example, suppose a pool had 5 connections remaining and 3 connections in + * the pool. We could create 8 new instances of + * MongoClient before we exhausted this pool + * (assuming no instances of MongoClient went out of + * scope, returning their connections to the pool). + *

    + *

    + * A negative number means that this pool will spawn unlimited connections. + *

    + *

    + * Before a pool is created, you can change the max number of connections by + * calling Mongo::setPoolSize. Once a pool is showing + * up in the output of this function, its size cannot be changed. + *

    + * total + *

    + * The total number of connections allowed for this pool. This should be + * greater than or equal to "in use" + "in pool" (or -1). + *

    + * timeout + *

    + * The socket timeout for connections in this pool. This is how long + * connections in this pool will attempt to connect to a server before + * giving up. + *

    + * waiting + *

    + * If you have capped the pool size, workers requesting connections from + * the pool may block until other workers return their connections. This + * field shows how many milliseconds workers have blocked for connections to + * be released. If this number keeps increasing, you may want to use + * MongoPool::setSize to add more connections to your + * pool. + *

    + */ + public static function info () {} + + /** + * Set the size for future connection pools. + * @link http://www.php.net/manual/en/mongopool.setsize.php + * @param size int

    + * The max number of connections future pools will be able to create. + * Negative numbers mean that the pool will spawn an infinite number of + * connections. + *

    + * @return bool the former value of pool size. + */ + public static function setSize ($size) {} + + /** + * Get pool size for connection pools + * @link http://www.php.net/manual/en/mongopool.getsize.php + * @return int the current pool size. + */ + public static function getSize () {} + +} + +/** @jms-builtin */ +class MongoMaxKey { +} + +/** @jms-builtin */ +class MongoMinKey { +} + +/** + * Serializes a PHP variable into a BSON string + * @link http://www.php.net/manual/en/function.bson-encode.php + * @param anything mixed

    + * The variable to be serialized. + *

    + * @return string the serialized string. + * @jms-builtin + */ +function bson_encode ($anything) {} + +/** + * Deserializes a BSON object into a PHP array + * @link http://www.php.net/manual/en/function.bson-decode.php + * @param bson string

    + * The BSON to be deserialized. + *

    + * @return array the deserialized BSON object. + * @jms-builtin + */ +function bson_decode ($bson) {} + +define ('MONGO_STREAMS', 1); +define ('MONGO_SUPPORTS_STREAMS', 1); +define ('MONGO_SUPPORTS_SSL', 0); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_CR', 1); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_X509', 1); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_GSSAPI', 0); +define ('MONGO_SUPPORTS_AUTH_MECHANISM_PLAIN', 0); +define ('MONGO_STREAM_NOTIFY_TYPE_IO_INIT', 100); +define ('MONGO_STREAM_NOTIFY_TYPE_LOG', 200); +define ('MONGO_STREAM_NOTIFY_IO_READ', 111); +define ('MONGO_STREAM_NOTIFY_IO_WRITE', 112); +define ('MONGO_STREAM_NOTIFY_IO_PROGRESS', 7); +define ('MONGO_STREAM_NOTIFY_IO_COMPLETED', 8); +define ('MONGO_STREAM_NOTIFY_LOG_INSERT', 211); +define ('MONGO_STREAM_NOTIFY_LOG_QUERY', 212); +define ('MONGO_STREAM_NOTIFY_LOG_UPDATE', 213); +define ('MONGO_STREAM_NOTIFY_LOG_DELETE', 214); +define ('MONGO_STREAM_NOTIFY_LOG_GETMORE', 215); +define ('MONGO_STREAM_NOTIFY_LOG_KILLCURSOR', 216); +define ('MONGO_STREAM_NOTIFY_LOG_BATCHINSERT', 217); +define ('MONGO_STREAM_NOTIFY_LOG_RESPONSE_HEADER', 218); +define ('MONGO_STREAM_NOTIFY_LOG_WRITE_REPLY', 219); +define ('MONGO_STREAM_NOTIFY_LOG_CMD_INSERT', 220); +define ('MONGO_STREAM_NOTIFY_LOG_CMD_UPDATE', 221); +define ('MONGO_STREAM_NOTIFY_LOG_CMD_DELETE', 222); +define ('MONGO_STREAM_NOTIFY_LOG_WRITE_BATCH', 223); + +// End of mongo v.1.5.0RC1 +?> From 887956454362b05f25a6c440925a299483c5122a Mon Sep 17 00:00:00 2001 From: siad007 Date: Sun, 30 Mar 2014 03:35:42 +0200 Subject: [PATCH 51/62] added pthreads stubs --- res/php-5.3-core-api/pthreads.php | 648 ++++++++++++++++++++++++++++++ res/php-5.4-core-api/pthreads.php | 648 ++++++++++++++++++++++++++++++ 2 files changed, 1296 insertions(+) create mode 100644 res/php-5.3-core-api/pthreads.php create mode 100644 res/php-5.4-core-api/pthreads.php diff --git a/res/php-5.3-core-api/pthreads.php b/res/php-5.3-core-api/pthreads.php new file mode 100644 index 0000000..113eb5d --- /dev/null +++ b/res/php-5.3-core-api/pthreads.php @@ -0,0 +1,648 @@ + + * @version 2.0.0 + */ + +/** + * The default inheritance mask used when starting Threads and Workers + */ +define('PTHREADS_INHERIT_ALL', 0x111111); + +/** + * Nothing will be inherited by the new context + */ +define('PTHREADS_INHERIT_NONE', 0); + +/** + * Determines whether the ini entries are inherited by the new context + */ +define('PTHREADS_INHERIT_INI', 0x1); + +/** + * Determines whether the constants are inherited by the new context + */ +define('PTHREADS_INHERIT_CONSTANTS', 0x10); + +/** + * Determines whether the class table is inherited by the new context + */ +define('PTHREADS_INHERIT_CLASSES', 0x100); + +/** + * Determines whether the function table is inherited by the new context + */ +define('PTHREADS_INHERIT_FUNCTIONS', 0x100); + +/** + * Determines whether the included_files table is inherited by the new context + */ +define('PTHREADS_INHERIT_INCLUDES', 0x10000); + +/** + * Determines whether the comments are inherited by the new context + */ +define('PTHREADS_INHERIT_COMMENTS', 0x100000); + +/** + * Allow output headers from the threads + */ +define('PTHREADS_ALLOW_HEADERS', 0x1000000); + +/** + * Allow global inheritance for new threads + */ +define('PTHREADS_ALLOW_GLOBALS', 0x10000000); + +/** + * Threaded class + * + * Threaded objects form the basis of pthreads ability to execute user code asynchronously; + * they expose and include synchronization methods and various useful interfaces. + * + * Threaded objects, most importantly, provide implicit safety for the programmer; + * all operations on the object scope are safe. + * + * @link http://www.php.net/manual/en/class.threaded.php + * @since 2.0.0 + * @jms-builtin + */ +class Threaded implements Traversable, Countable, ArrayAccess +{ + /** + * Fetches a chunk of the objects properties table of the given size + * + * @param int $size The number of items to fetch + * + * @link http://www.php.net/manual/en/threaded.chunk.php + * @return array An array of items from the objects member table + */ + public function chunk($size) {} + + /** + * {@inheritdoc} + */ + public function count() {} + + /** + * Retrieves terminal error information from the referenced object + * + * @link http://www.php.net/manual/en/threaded.getterminationinfo.php + * @return array|bool array containing the termination conditions of the referenced object + */ + public function getTerminationInfo() {} + + /** + * Tell if the referenced object is executing + * + * @link http://www.php.net/manual/en/threaded.isrunning.php + * @return bool A boolean indication of state + */ + public function isRunning() {} + + /** + * Tell if the referenced object exited, suffered fatal errors, or threw uncaught exceptions during execution + * + * @link http://www.php.net/manual/en/threaded.isterminated.php + * @return bool A boolean indication of state + */ + public function isTerminated() {} + + /** + * Tell if the referenced object is waiting for notification + * + * @link http://www.php.net/manual/en/threaded.iswaiting.php + * @return bool A boolean indication of state + */ + public function isWaiting() {} + + /** + * Lock the referenced objects property table + * + * @link http://www.php.net/manual/en/threaded.lock.php + * @return bool A boolean indication of state + */ + public function lock() {} + + /** + * Merges data into the current object + * + * @param mixed $from The data to merge + * @param bool $overwrite Overwrite existing keys flag, by default true + * + * @link http://www.php.net/manual/en/threaded.merge.php + * @return bool A boolean indication of success + */ + public function merge($from, $overwrite = true) {} + + /** + * Send notification to the referenced object + * + * @link http://www.php.net/manual/en/threaded.notify.php + * @return bool A boolean indication of success + */ + public function notify() {} + + /** + * {@inheritdoc} + */ + public function offsetGet($offset) {} + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $value) {} + + /** + * {@inheritdoc} + */ + public function offsetExists($offset) {} + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset) {} + + /** + * Pops an item from the objects property table + * + * @link http://www.php.net/manual/en/threaded.pop.php + * @return mixed The last item from the objects properties table + */ + public function pop() {} + + /** + * The programmer should always implement the run method for objects that are intended for execution. + * + * @link http://www.php.net/manual/en/threaded.run.php + * @return void The methods return value, if used, will be ignored + */ + public function run() {} + + /** + * Shifts an item from the objects properties table + * + * @link http://www.php.net/manual/en/threaded.shift.php + * @return mixed The first item from the objects properties table + */ + public function shift() {} + + /** + * Executes the block while retaining the synchronization lock for the current context. + * + * @param \Closure $function The block of code to execute + * @param mixed $args... Variable length list of arguments to use as function arguments to the block + * + * @link http://www.php.net/manual/en/threaded.synchronized.php + * @return mixed The return value from the block + */ + public function synchronized(\Closure $function, $args = null) {} + + /** + * Unlock the referenced objects storage for the calling context + * + * @link http://www.php.net/manual/en/threaded.unlock.php + * @return bool A boolean indication of success + */ + public function unlock() {} + + /** + * Waits for notification from the Stackable + * + * @param int $timeout An optional timeout in microseconds + * + * @link http://www.php.net/manual/en/threaded.wait.php + * @return bool A boolean indication of success + */ + public function wait($timeout) {} +} + +/** + * Basic thread implementation + * + * An implementation of a Thread should extend this declaration, implementing the run method. + * When the start method of that object is called, the run method code will be executed in separate Thread. + * + * @link http://www.php.net/manual/en/class.thread.php + * @jms-builtin + */ +class Thread extends Threaded +{ + + /** + * Detaches a thread + * + * @return bool A boolean indication of success + */ + public function detach() {} + + /** + * Will return the identity of the Thread that created the referenced Thread + * + * @link http://www.php.net/manual/en/thread.getcreatorid.php + * @return int A numeric identity + */ + public function getCreatorId() {} + + /** + * Will return the instance of currently executing thread + * + * @return static + */ + public static function getCurrentThread() {} + + /** + * Will return the identity of the currently executing thread + * + * @link http://www.php.net/manual/en/thread.getcurrentthreadid.php + * @return int + */ + public static function getCurrentThreadId() {} + + /** + * Will return the identity of the referenced Thread + * + * @link http://www.php.net/manual/en/thread.getthreadid.php + * @return int + */ + public function getThreadId() {} + + /** + * Tell if the referenced Thread has been joined by another context + * + * @link http://www.php.net/manual/en/thread.isjoined.php + * @return bool A boolean indication of state + */ + public function isJoined() {} + + /** + * Tell if the referenced Thread has been started + * + * @link http://www.php.net/manual/en/thread.isstarted.php + * @return bool A boolean indication of state + */ + public function isStarted() {} + + /** + * Causes the calling context to wait for the referenced Thread to finish executing + * + * @link http://www.php.net/manual/en/thread.join.php + * @return bool A boolean indication of state + */ + public function join() {} + + /** + * Kills the referenced thread, dangerously ! + * + * @link http://www.php.net/manual/en/thread.kill.php + */ + public function kill() {} + + /** + * Will start a new Thread to execute the implemented run method + * + * @param int $options An optional mask of inheritance constants, by default PTHREADS_INHERIT_ALL + * + * @link http://www.php.net/manual/en/thread.start.php + * @return bool A boolean indication of success + */ + public function start($options = PTHREADS_INHERIT_ALL) {} + + /** + * Will execute the Callable in the global scope + * + * @param Callable $block The code to execute + * @param ... $args Variable length list of arguments to pass to the Callable upon execution + * @link http://www.php.net/manual/en/thread.start.php + * @return bool A boolean indication of success + */ + public static function globally(Callable $block [, $args]) {} +} + +/** + * Worker + * + * Worker Threads have a persistent context, as such should be used over Threads in most cases. + * + * When a Worker is started, the run method will be executed, but the Thread will not leave until one + * of the following conditions are met: + * - the Worker goes out of scope (no more references remain) + * - the programmer calls shutdown + * - the script dies + * This means the programmer can reuse the context throughout execution; placing objects on the stack of + * the Worker will cause the Worker to execute the stacked objects run method. + * + * @link http://www.php.net/manual/en/class.worker.php + * @jms-builtin + */ +class Worker extends Thread +{ + + /** + * Returns the number of threaded tasks waiting to be executed by the referenced Worker + * + * @link http://www.php.net/manual/en/worker.getstacked.php + * @return int An integral value + */ + public function getStacked() {} + + /** + * Tell if the referenced Worker has been shutdown + * + * @link http://www.php.net/manual/en/worker.isshutdown.php + * @return bool A boolean indication of state + */ + public function isShutdown() {} + + /** + * Tell if a Worker is executing threaded tasks + * + * @link http://www.php.net/manual/en/worker.isworking.php + * @return bool A boolean indication of state + */ + public function isWorking() {} + + /** + * Shuts down the Worker after executing all the threaded tasks previously stacked + * + * @link http://www.php.net/manual/en/worker.shutdown.php + * @return bool A boolean indication of success + */ + public function shutdown() {} + + /** + * Appends the referenced object to the stack of the referenced Worker + * + * @param Threaded $work Threaded object to be executed by the referenced Worker + * + * @link http://www.php.net/manual/en/worker.stack.php + * @return int The new length of the stack + */ + public function stack(Threaded &$work) {} + + /** + * Removes the referenced object ( or all objects if parameter is null ) from stack of the referenced Worker + * + * @param Threaded $work Threaded object previously stacked onto Worker + * + * @link http://www.php.net/manual/en/worker.unstack.php + * @return int The new length of the stack + */ + public function unstack(Threaded &$work = null) {} +} + +/** + * Mutex class + * + * The static methods contained in the Mutex class provide direct access to Posix Mutex functionality. + * + * @link http://www.php.net/manual/en/class.mutex.php + * @jms-builtin + */ +class Mutex +{ + + /** + * Create, and optionally lock a new Mutex for the caller + * + * @param bool $lock Setting lock to true will lock the Mutex for the caller before returning the handle + * + * @link http://www.php.net/manual/en/mutex.create.php + * @return int A newly created and optionally locked Mutex handle + */ + final public static function create($lock = false) {} + + /** + * Destroy mutex + * + * Destroying Mutex handles must be carried out explicitly by the programmer when they are + * finished with the Mutex handle. + * + * @param int $mutex A handle returned by a previous call to Mutex::create(). + * + * @link http://www.php.net/manual/en/mutex.destroy.php + * @return bool A boolean indication of success + */ + final public static function destroy($mutex) {} + + /** + * Attempt to lock the Mutex for the caller. + * + * An attempt to lock a Mutex owned (locked) by another Thread will result in blocking. + * + * @param int $mutex A handle returned by a previous call to Mutex::create(). + * + * @link http://www.php.net/manual/en/mutex.lock.php + * @return bool A boolean indication of success + */ + final public static function lock($mutex) {} + + /** + * Attempt to lock the Mutex for the caller without blocking if the Mutex is owned (locked) by another Thread. + * + * @param int $mutex A handle returned by a previous call to Mutex::create(). + * + * @link http://www.php.net/manual/en/mutex.trylock.php + * @return bool A boolean indication of success + */ + final public static function trylock($mutex) {} + + /** + * Release mutex + * + * Attempts to unlock the Mutex for the caller, optionally destroying the Mutex handle. + * The calling thread should own the Mutex at the time of the call. + * + * @param int $mutex A handle returned by a previous call to Mutex::create(). + * @param bool $destroy When true pthreads will destroy the Mutex after a successful unlock. + * + * @link http://www.php.net/manual/en/mutex.unlock.php + * @return bool A boolean indication of success + */ + final public static function unlock($mutex, $destroy = false) {} +} + +/** + * Condition class + * + * The static methods contained in the Cond class provide direct access to Posix Condition Variables. + * + * @link http://www.php.net/manual/en/class.cond.php + * @jms-builtin + */ +class Cond +{ + /** + * Broadcast to all Threads blocking on a call to Cond::wait(). + * + * @param int $condition A handle to a Condition Variable returned by a previous call to Cond::create() + * + * @link http://www.php.net/manual/en/cond.broadcast.php + * @return bool A boolean indication of success + */ + final public static function broadcast($condition) {} + + /** + * Creates a new Condition Variable for the caller. + * + * @link http://www.php.net/manual/en/cond.create.php + * @return int A handle to a Condition Variable + */ + final public static function create() {} + + /** + * Destroy a condition + * + * Destroying Condition Variable handles must be carried out explicitly by the programmer when they are + * finished with the Condition Variable. + * No Threads should be blocking on a call to Cond::wait() when the call to Cond::destroy() takes place. + * + * @param int $condition A handle to a Condition Variable returned by a previous call to Cond::create() + * + * @link http://www.php.net/manual/en/cond.destroy.php + * @return bool A boolean indication of success + */ + final public static function destroy($condition) {} + + /** + * Signal a Condition + * + * @param int $condition A handle to a Condition Variable returned by a previous call to Cond::create() + * + * @link http://www.php.net/manual/en/cond.signal.php + * @return bool A boolean indication of success + */ + final public static function signal($condition) {} + + /** + * Wait for a signal on a Condition Variable, optionally specifying a timeout to limit waiting time. + * + * @param int $condition A handle to a Condition Variable returned by a previous call to Cond::create() + * @param int $mutex A handle returned by a previous call to Mutex::create() and owned (locked) by the caller. + * @param int $timeout An optional timeout, in microseconds + * + * @return bool A boolean indication of success + */ + final public static function wait($condition, $mutex, $timeout = null) {} +} + +/** + * Pool class + * + * A Pool is a container for, and controller of, a number of Worker threads, the number of threads can be adjusted + * during execution, additionally the Pool provides an easy mechanism to maintain and collect references in the + * proper way. + * + * @link http://www.php.net/manual/en/class.pool.php + * @jms-builtin + */ +class Pool +{ + /** + * The maximum number of Worker threads allowed in this Pool + * + * @var integer + */ + protected $size; + + /** + * The name of the Worker class for this Pool + * + * @var string + */ + protected $class; + + /** + * The array of Worker threads for this Pool + * + * @var array|Worker[] + */ + protected $workers; + + /** + * The array of Stackables submitted to this Pool for execution + * + * @var array|Threaded[] + */ + protected $work; + + /** + * The constructor arguments to be passed by this Pool to new Workers upon construction + * + * @var array + */ + protected $ctor; + + /** + * The numeric identifier for the last Worker used by this Pool + * + * @var integer + */ + protected $last; + + /** + * Construct a new Pool of Workers + * + * @param integer $size The maximum number of Workers this Pool can create + * @param string $class The class for new Workers + * @param array $ctor An array of arguments to be passed to new Workers + * + * @link http://www.php.net/manual/en/pool.__construct.php + */ + public function __construct($size, $class, array $ctor = array()) {} + + /** + * Shuts down all Workers, and collect all Stackables, finally destroys the Pool + * + * @link http://www.php.net/manual/en/pool.__destruct.php + */ + public function __destruct() {} + + /** + * Collect references to completed tasks + * + * Allows the Pool to collect references determined to be garbage by the given collector + * + * @param callable $collector + * + * @link http://www.php.net/manual/en/pool.collect.php + */ + public function collect(callable $collector) {} + + /** + * Resize the Pool + * + * @param integer $size The maximum number of Workers this Pool can create + * + * @link http://www.php.net/manual/en/pool.resize.php + */ + public function resize($size) {} + + /** + * Shutdown all Workers in this Pool + * + * @link http://www.php.net/manual/en/pool.shutdown.php + */ + public function shutdown() {} + + /** + * Submit the task to the next Worker in the Pool + * + * @param Threaded $task The task for execution + * + * @return int the identifier of the Worker executing the object + */ + public function submit(Threaded $task) {} + + /** + * Submit the task to the specific Worker in the Pool + * + * @param int $worker The worker for execution + * @param Threaded $task The task for execution + * + * @return int the identifier of the Worker that accepted the object + */ + public function submitTo($worker, Threaded $task) {} +} diff --git a/res/php-5.4-core-api/pthreads.php b/res/php-5.4-core-api/pthreads.php new file mode 100644 index 0000000..113eb5d --- /dev/null +++ b/res/php-5.4-core-api/pthreads.php @@ -0,0 +1,648 @@ + + * @version 2.0.0 + */ + +/** + * The default inheritance mask used when starting Threads and Workers + */ +define('PTHREADS_INHERIT_ALL', 0x111111); + +/** + * Nothing will be inherited by the new context + */ +define('PTHREADS_INHERIT_NONE', 0); + +/** + * Determines whether the ini entries are inherited by the new context + */ +define('PTHREADS_INHERIT_INI', 0x1); + +/** + * Determines whether the constants are inherited by the new context + */ +define('PTHREADS_INHERIT_CONSTANTS', 0x10); + +/** + * Determines whether the class table is inherited by the new context + */ +define('PTHREADS_INHERIT_CLASSES', 0x100); + +/** + * Determines whether the function table is inherited by the new context + */ +define('PTHREADS_INHERIT_FUNCTIONS', 0x100); + +/** + * Determines whether the included_files table is inherited by the new context + */ +define('PTHREADS_INHERIT_INCLUDES', 0x10000); + +/** + * Determines whether the comments are inherited by the new context + */ +define('PTHREADS_INHERIT_COMMENTS', 0x100000); + +/** + * Allow output headers from the threads + */ +define('PTHREADS_ALLOW_HEADERS', 0x1000000); + +/** + * Allow global inheritance for new threads + */ +define('PTHREADS_ALLOW_GLOBALS', 0x10000000); + +/** + * Threaded class + * + * Threaded objects form the basis of pthreads ability to execute user code asynchronously; + * they expose and include synchronization methods and various useful interfaces. + * + * Threaded objects, most importantly, provide implicit safety for the programmer; + * all operations on the object scope are safe. + * + * @link http://www.php.net/manual/en/class.threaded.php + * @since 2.0.0 + * @jms-builtin + */ +class Threaded implements Traversable, Countable, ArrayAccess +{ + /** + * Fetches a chunk of the objects properties table of the given size + * + * @param int $size The number of items to fetch + * + * @link http://www.php.net/manual/en/threaded.chunk.php + * @return array An array of items from the objects member table + */ + public function chunk($size) {} + + /** + * {@inheritdoc} + */ + public function count() {} + + /** + * Retrieves terminal error information from the referenced object + * + * @link http://www.php.net/manual/en/threaded.getterminationinfo.php + * @return array|bool array containing the termination conditions of the referenced object + */ + public function getTerminationInfo() {} + + /** + * Tell if the referenced object is executing + * + * @link http://www.php.net/manual/en/threaded.isrunning.php + * @return bool A boolean indication of state + */ + public function isRunning() {} + + /** + * Tell if the referenced object exited, suffered fatal errors, or threw uncaught exceptions during execution + * + * @link http://www.php.net/manual/en/threaded.isterminated.php + * @return bool A boolean indication of state + */ + public function isTerminated() {} + + /** + * Tell if the referenced object is waiting for notification + * + * @link http://www.php.net/manual/en/threaded.iswaiting.php + * @return bool A boolean indication of state + */ + public function isWaiting() {} + + /** + * Lock the referenced objects property table + * + * @link http://www.php.net/manual/en/threaded.lock.php + * @return bool A boolean indication of state + */ + public function lock() {} + + /** + * Merges data into the current object + * + * @param mixed $from The data to merge + * @param bool $overwrite Overwrite existing keys flag, by default true + * + * @link http://www.php.net/manual/en/threaded.merge.php + * @return bool A boolean indication of success + */ + public function merge($from, $overwrite = true) {} + + /** + * Send notification to the referenced object + * + * @link http://www.php.net/manual/en/threaded.notify.php + * @return bool A boolean indication of success + */ + public function notify() {} + + /** + * {@inheritdoc} + */ + public function offsetGet($offset) {} + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $value) {} + + /** + * {@inheritdoc} + */ + public function offsetExists($offset) {} + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset) {} + + /** + * Pops an item from the objects property table + * + * @link http://www.php.net/manual/en/threaded.pop.php + * @return mixed The last item from the objects properties table + */ + public function pop() {} + + /** + * The programmer should always implement the run method for objects that are intended for execution. + * + * @link http://www.php.net/manual/en/threaded.run.php + * @return void The methods return value, if used, will be ignored + */ + public function run() {} + + /** + * Shifts an item from the objects properties table + * + * @link http://www.php.net/manual/en/threaded.shift.php + * @return mixed The first item from the objects properties table + */ + public function shift() {} + + /** + * Executes the block while retaining the synchronization lock for the current context. + * + * @param \Closure $function The block of code to execute + * @param mixed $args... Variable length list of arguments to use as function arguments to the block + * + * @link http://www.php.net/manual/en/threaded.synchronized.php + * @return mixed The return value from the block + */ + public function synchronized(\Closure $function, $args = null) {} + + /** + * Unlock the referenced objects storage for the calling context + * + * @link http://www.php.net/manual/en/threaded.unlock.php + * @return bool A boolean indication of success + */ + public function unlock() {} + + /** + * Waits for notification from the Stackable + * + * @param int $timeout An optional timeout in microseconds + * + * @link http://www.php.net/manual/en/threaded.wait.php + * @return bool A boolean indication of success + */ + public function wait($timeout) {} +} + +/** + * Basic thread implementation + * + * An implementation of a Thread should extend this declaration, implementing the run method. + * When the start method of that object is called, the run method code will be executed in separate Thread. + * + * @link http://www.php.net/manual/en/class.thread.php + * @jms-builtin + */ +class Thread extends Threaded +{ + + /** + * Detaches a thread + * + * @return bool A boolean indication of success + */ + public function detach() {} + + /** + * Will return the identity of the Thread that created the referenced Thread + * + * @link http://www.php.net/manual/en/thread.getcreatorid.php + * @return int A numeric identity + */ + public function getCreatorId() {} + + /** + * Will return the instance of currently executing thread + * + * @return static + */ + public static function getCurrentThread() {} + + /** + * Will return the identity of the currently executing thread + * + * @link http://www.php.net/manual/en/thread.getcurrentthreadid.php + * @return int + */ + public static function getCurrentThreadId() {} + + /** + * Will return the identity of the referenced Thread + * + * @link http://www.php.net/manual/en/thread.getthreadid.php + * @return int + */ + public function getThreadId() {} + + /** + * Tell if the referenced Thread has been joined by another context + * + * @link http://www.php.net/manual/en/thread.isjoined.php + * @return bool A boolean indication of state + */ + public function isJoined() {} + + /** + * Tell if the referenced Thread has been started + * + * @link http://www.php.net/manual/en/thread.isstarted.php + * @return bool A boolean indication of state + */ + public function isStarted() {} + + /** + * Causes the calling context to wait for the referenced Thread to finish executing + * + * @link http://www.php.net/manual/en/thread.join.php + * @return bool A boolean indication of state + */ + public function join() {} + + /** + * Kills the referenced thread, dangerously ! + * + * @link http://www.php.net/manual/en/thread.kill.php + */ + public function kill() {} + + /** + * Will start a new Thread to execute the implemented run method + * + * @param int $options An optional mask of inheritance constants, by default PTHREADS_INHERIT_ALL + * + * @link http://www.php.net/manual/en/thread.start.php + * @return bool A boolean indication of success + */ + public function start($options = PTHREADS_INHERIT_ALL) {} + + /** + * Will execute the Callable in the global scope + * + * @param Callable $block The code to execute + * @param ... $args Variable length list of arguments to pass to the Callable upon execution + * @link http://www.php.net/manual/en/thread.start.php + * @return bool A boolean indication of success + */ + public static function globally(Callable $block [, $args]) {} +} + +/** + * Worker + * + * Worker Threads have a persistent context, as such should be used over Threads in most cases. + * + * When a Worker is started, the run method will be executed, but the Thread will not leave until one + * of the following conditions are met: + * - the Worker goes out of scope (no more references remain) + * - the programmer calls shutdown + * - the script dies + * This means the programmer can reuse the context throughout execution; placing objects on the stack of + * the Worker will cause the Worker to execute the stacked objects run method. + * + * @link http://www.php.net/manual/en/class.worker.php + * @jms-builtin + */ +class Worker extends Thread +{ + + /** + * Returns the number of threaded tasks waiting to be executed by the referenced Worker + * + * @link http://www.php.net/manual/en/worker.getstacked.php + * @return int An integral value + */ + public function getStacked() {} + + /** + * Tell if the referenced Worker has been shutdown + * + * @link http://www.php.net/manual/en/worker.isshutdown.php + * @return bool A boolean indication of state + */ + public function isShutdown() {} + + /** + * Tell if a Worker is executing threaded tasks + * + * @link http://www.php.net/manual/en/worker.isworking.php + * @return bool A boolean indication of state + */ + public function isWorking() {} + + /** + * Shuts down the Worker after executing all the threaded tasks previously stacked + * + * @link http://www.php.net/manual/en/worker.shutdown.php + * @return bool A boolean indication of success + */ + public function shutdown() {} + + /** + * Appends the referenced object to the stack of the referenced Worker + * + * @param Threaded $work Threaded object to be executed by the referenced Worker + * + * @link http://www.php.net/manual/en/worker.stack.php + * @return int The new length of the stack + */ + public function stack(Threaded &$work) {} + + /** + * Removes the referenced object ( or all objects if parameter is null ) from stack of the referenced Worker + * + * @param Threaded $work Threaded object previously stacked onto Worker + * + * @link http://www.php.net/manual/en/worker.unstack.php + * @return int The new length of the stack + */ + public function unstack(Threaded &$work = null) {} +} + +/** + * Mutex class + * + * The static methods contained in the Mutex class provide direct access to Posix Mutex functionality. + * + * @link http://www.php.net/manual/en/class.mutex.php + * @jms-builtin + */ +class Mutex +{ + + /** + * Create, and optionally lock a new Mutex for the caller + * + * @param bool $lock Setting lock to true will lock the Mutex for the caller before returning the handle + * + * @link http://www.php.net/manual/en/mutex.create.php + * @return int A newly created and optionally locked Mutex handle + */ + final public static function create($lock = false) {} + + /** + * Destroy mutex + * + * Destroying Mutex handles must be carried out explicitly by the programmer when they are + * finished with the Mutex handle. + * + * @param int $mutex A handle returned by a previous call to Mutex::create(). + * + * @link http://www.php.net/manual/en/mutex.destroy.php + * @return bool A boolean indication of success + */ + final public static function destroy($mutex) {} + + /** + * Attempt to lock the Mutex for the caller. + * + * An attempt to lock a Mutex owned (locked) by another Thread will result in blocking. + * + * @param int $mutex A handle returned by a previous call to Mutex::create(). + * + * @link http://www.php.net/manual/en/mutex.lock.php + * @return bool A boolean indication of success + */ + final public static function lock($mutex) {} + + /** + * Attempt to lock the Mutex for the caller without blocking if the Mutex is owned (locked) by another Thread. + * + * @param int $mutex A handle returned by a previous call to Mutex::create(). + * + * @link http://www.php.net/manual/en/mutex.trylock.php + * @return bool A boolean indication of success + */ + final public static function trylock($mutex) {} + + /** + * Release mutex + * + * Attempts to unlock the Mutex for the caller, optionally destroying the Mutex handle. + * The calling thread should own the Mutex at the time of the call. + * + * @param int $mutex A handle returned by a previous call to Mutex::create(). + * @param bool $destroy When true pthreads will destroy the Mutex after a successful unlock. + * + * @link http://www.php.net/manual/en/mutex.unlock.php + * @return bool A boolean indication of success + */ + final public static function unlock($mutex, $destroy = false) {} +} + +/** + * Condition class + * + * The static methods contained in the Cond class provide direct access to Posix Condition Variables. + * + * @link http://www.php.net/manual/en/class.cond.php + * @jms-builtin + */ +class Cond +{ + /** + * Broadcast to all Threads blocking on a call to Cond::wait(). + * + * @param int $condition A handle to a Condition Variable returned by a previous call to Cond::create() + * + * @link http://www.php.net/manual/en/cond.broadcast.php + * @return bool A boolean indication of success + */ + final public static function broadcast($condition) {} + + /** + * Creates a new Condition Variable for the caller. + * + * @link http://www.php.net/manual/en/cond.create.php + * @return int A handle to a Condition Variable + */ + final public static function create() {} + + /** + * Destroy a condition + * + * Destroying Condition Variable handles must be carried out explicitly by the programmer when they are + * finished with the Condition Variable. + * No Threads should be blocking on a call to Cond::wait() when the call to Cond::destroy() takes place. + * + * @param int $condition A handle to a Condition Variable returned by a previous call to Cond::create() + * + * @link http://www.php.net/manual/en/cond.destroy.php + * @return bool A boolean indication of success + */ + final public static function destroy($condition) {} + + /** + * Signal a Condition + * + * @param int $condition A handle to a Condition Variable returned by a previous call to Cond::create() + * + * @link http://www.php.net/manual/en/cond.signal.php + * @return bool A boolean indication of success + */ + final public static function signal($condition) {} + + /** + * Wait for a signal on a Condition Variable, optionally specifying a timeout to limit waiting time. + * + * @param int $condition A handle to a Condition Variable returned by a previous call to Cond::create() + * @param int $mutex A handle returned by a previous call to Mutex::create() and owned (locked) by the caller. + * @param int $timeout An optional timeout, in microseconds + * + * @return bool A boolean indication of success + */ + final public static function wait($condition, $mutex, $timeout = null) {} +} + +/** + * Pool class + * + * A Pool is a container for, and controller of, a number of Worker threads, the number of threads can be adjusted + * during execution, additionally the Pool provides an easy mechanism to maintain and collect references in the + * proper way. + * + * @link http://www.php.net/manual/en/class.pool.php + * @jms-builtin + */ +class Pool +{ + /** + * The maximum number of Worker threads allowed in this Pool + * + * @var integer + */ + protected $size; + + /** + * The name of the Worker class for this Pool + * + * @var string + */ + protected $class; + + /** + * The array of Worker threads for this Pool + * + * @var array|Worker[] + */ + protected $workers; + + /** + * The array of Stackables submitted to this Pool for execution + * + * @var array|Threaded[] + */ + protected $work; + + /** + * The constructor arguments to be passed by this Pool to new Workers upon construction + * + * @var array + */ + protected $ctor; + + /** + * The numeric identifier for the last Worker used by this Pool + * + * @var integer + */ + protected $last; + + /** + * Construct a new Pool of Workers + * + * @param integer $size The maximum number of Workers this Pool can create + * @param string $class The class for new Workers + * @param array $ctor An array of arguments to be passed to new Workers + * + * @link http://www.php.net/manual/en/pool.__construct.php + */ + public function __construct($size, $class, array $ctor = array()) {} + + /** + * Shuts down all Workers, and collect all Stackables, finally destroys the Pool + * + * @link http://www.php.net/manual/en/pool.__destruct.php + */ + public function __destruct() {} + + /** + * Collect references to completed tasks + * + * Allows the Pool to collect references determined to be garbage by the given collector + * + * @param callable $collector + * + * @link http://www.php.net/manual/en/pool.collect.php + */ + public function collect(callable $collector) {} + + /** + * Resize the Pool + * + * @param integer $size The maximum number of Workers this Pool can create + * + * @link http://www.php.net/manual/en/pool.resize.php + */ + public function resize($size) {} + + /** + * Shutdown all Workers in this Pool + * + * @link http://www.php.net/manual/en/pool.shutdown.php + */ + public function shutdown() {} + + /** + * Submit the task to the next Worker in the Pool + * + * @param Threaded $task The task for execution + * + * @return int the identifier of the Worker executing the object + */ + public function submit(Threaded $task) {} + + /** + * Submit the task to the specific Worker in the Pool + * + * @param int $worker The worker for execution + * @param Threaded $task The task for execution + * + * @return int the identifier of the Worker that accepted the object + */ + public function submitTo($worker, Threaded $task) {} +} From 0355aca48d085f4187b09250d8b37d670ef36c13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Fri, 30 May 2014 11:06:54 +0200 Subject: [PATCH 52/62] Add more annnotations to mysqli functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michal ÄŒihaÅ™ --- res/php-5.4-core-api/mysqli.php | 271 ++++++++++++++++++++------------ 1 file changed, 170 insertions(+), 101 deletions(-) diff --git a/res/php-5.4-core-api/mysqli.php b/res/php-5.4-core-api/mysqli.php index 780b48f..db1ff65 100644 --- a/res/php-5.4-core-api/mysqli.php +++ b/res/php-5.4-core-api/mysqli.php @@ -1405,41 +1405,47 @@ public function store_result (mysqli_stmt $stmt) {} } /** - * @param $link + * @param $link mysqli + * @return int * @jms-builtin */ function mysqli_affected_rows ($link) {} /** - * @param $link - * @param $mode + * @param $link mysqli + * @param $mode bool + * @return bool * @jms-builtin */ function mysqli_autocommit ($link, $mode) {} /** - * @param $link - * @param $user - * @param $password - * @param $database + * @param $link mysqli + * @param $user string + * @param $password string + * @param $database string + * @return bool * @jms-builtin */ function mysqli_change_user ($link, $user, $password, $database) {} /** - * @param $link + * @param $link mysqli + * @return string * @jms-builtin */ function mysqli_character_set_name ($link) {} /** - * @param $link + * @param $link mysqli + * @return bool * @jms-builtin */ function mysqli_close ($link) {} /** - * @param $link + * @param $link mysqli + * @return bool * @jms-builtin */ function mysqli_commit ($link) {} @@ -1454,55 +1460,69 @@ function mysqli_commit ($link) {} * @param $database [optional] * @param $port [optional] * @param $socket [optional] + * @return mysqli * @jms-builtin */ -function mysqli_connect ($host, $user, $password, $database, $port, $socket) {} +function mysqli_connect ($host, $user, $password, $database, $port, $socket) {} -/** @jms-builtin */ -function mysqli_connect_errno () {} +/** + * @return int + * @jms-builtin + */ +function mysqli_connect_errno () {} -/** @jms-builtin */ +/** + * @return string + * @jms-builtin + */ function mysqli_connect_error () {} /** - * @param $result - * @param $offset + * @param $result object + * @param $offset int + * @return bool * @jms-builtin */ function mysqli_data_seek ($result, $offset) {} /** - * @param $link + * @param $link mysqli + * @return bool * @jms-builtin */ function mysqli_dump_debug_info ($link) {} /** - * @param $debug_options + * @param $message string + * @return bool * @jms-builtin */ -function mysqli_debug ($debug_options) {} +function mysqli_debug ($message) {} /** - * @param $link + * @param $link mysqli + * @return int * @jms-builtin */ function mysqli_errno ($link) {} /** - * @param $link + * @param $link mysqli + * @return string * @jms-builtin */ function mysqli_error ($link) {} /** - * @param $link + * @param $link mysqli + * @return array * @jms-builtin */ function mysqli_error_list ($link) {} /** * @param $stmt + * @retrun bool * @jms-builtin */ function mysqli_stmt_execute ($stmt) {} @@ -1512,218 +1532,254 @@ function mysqli_stmt_execute ($stmt) {} * Alias for mysqli_stmt_execute * @link http://php.net/manual/en/function.mysqli-execute.php * @param $stmt + * @retrun bool * @jms-builtin */ function mysqli_execute ($stmt) {} /** - * @param $result + * @param $result mysqli_result + * @return object * @jms-builtin */ function mysqli_fetch_field ($result) {} /** - * @param $result + * @param $result mysqli_result + * @return array * @jms-builtin */ function mysqli_fetch_fields ($result) {} /** - * @param $result - * @param $field_nr + * @param $result mysqli_result + * @param $field_nr int + * @return object * @jms-builtin */ function mysqli_fetch_field_direct ($result, $field_nr) {} /** - * @param $result + * @param $result mysqli_result + * @return array * @jms-builtin */ function mysqli_fetch_lengths ($result) {} /** - * @param $result + * @param $result mysqli_result * @param $result_type [optional] + * @return array * @jms-builtin */ function mysqli_fetch_array ($result, $result_type) {} /** - * @param $result + * @param $result mysqli_result + * @return array * @jms-builtin */ function mysqli_fetch_assoc ($result) {} /** - * @param $result + * @param $result mysqli_result * @param $class_name [optional] * @param $params [optional] + * @return object * @jms-builtin */ function mysqli_fetch_object ($result, $class_namearray , $params) {} /** - * @param $result + * @param $result mysqli_result + * @return mixed * @jms-builtin */ function mysqli_fetch_row ($result) {} /** - * @param $link + * @param $link mysqli + * @return int * @jms-builtin */ function mysqli_field_count ($link) {} /** - * @param $result - * @param $field_nr + * @param $result mysqli_result + * @param $field_nr int + * @return bool * @jms-builtin */ function mysqli_field_seek ($result, $field_nr) {} /** - * @param $result + * @param $result mysqli_result + * @return int * @jms-builtin */ function mysqli_field_tell ($result) {} /** - * @param $result + * @param $result mysqli_result + * @return bool * @jms-builtin */ function mysqli_free_result ($result) {} /** - * @param $link + * @param $link mysqli + * @return object * @jms-builtin */ function mysqli_get_charset ($link) {} /** - * @param $link + * @param $link mysqli + * @return string * @jms-builtin */ function mysqli_get_client_info ($link) {} /** - * @param $link + * @param $link mysqli + * @return int * @jms-builtin */ function mysqli_get_client_version ($link) {} /** - * @param $link + * @param $link mysqli * @jms-builtin */ function mysqli_get_host_info ($link) {} /** - * @param $link + * @param $link mysqli + * @return string * @jms-builtin */ function mysqli_get_proto_info ($link) {} /** - * @param $link + * @param $link mysqli + * @return string * @jms-builtin */ function mysqli_get_server_info ($link) {} /** - * @param $link + * @param $link mysqli + * @return int * @jms-builtin */ function mysqli_get_server_version ($link) {} /** - * @param $link + * @param $link mysqli + * @return mysqli_warning * @jms-builtin */ -function mysqli_get_warnings ($link) {} +function mysqli_get_warnings ($link) {} -/** @jms-builtin */ +/** + * @return mysql + * @jms-builtin + */ function mysqli_init () {} /** - * @param $link + * @param $link mysqli + * @return string * @jms-builtin */ function mysqli_info ($link) {} /** - * @param $link + * @param $link mysqli + * @return int * @jms-builtin */ function mysqli_insert_id ($link) {} /** - * @param $link - * @param $connection_id + * @param $link mysqli + * @param $connection_id int + * @return bool * @jms-builtin */ function mysqli_kill ($link, $connection_id) {} /** - * @param $link + * @param $link mysqli + * @return void * @jms-builtin */ function mysqli_set_local_infile_default ($link) {} /** - * @param $link - * @param $read_callback + * @param $link mysqli + * @param $read_callback callable + * @return bool * @jms-builtin */ function mysqli_set_local_infile_handler ($link, $read_callback) {} /** - * @param $link + * @param $link mysqli + * @return bool * @jms-builtin */ function mysqli_more_results ($link) {} /** - * @param $link - * @param $query + * @param $link mysqli + * @param $query string + * @return bool * @jms-builtin */ function mysqli_multi_query ($link, $query) {} /** - * @param $link + * @param $link mysqli + * @return bool * @jms-builtin */ function mysqli_next_result ($link) {} /** - * @param $result + * @param $result mysqli_result + * @return int * @jms-builtin */ function mysqli_num_fields ($result) {} /** - * @param $result + * @param $result mysqli_result + * @return int * @jms-builtin */ function mysqli_num_rows ($result) {} /** - * @param $link - * @param $option - * @param $value + * @param $link mysqli + * @param $option int + * @param $value mixed + * @return bool * @jms-builtin */ function mysqli_options ($link, $option, $value) {} /** - * @param $link + * @param $link mysqli + * @return bool * @jms-builtin */ function mysqli_ping ($link) {} /** - * @param $link - * @param $query + * @param $link mysqli + * @param $query string + * @param mysql_stmt * @jms-builtin */ function mysqli_prepare ($link, $query) {} @@ -1770,55 +1826,62 @@ function mysqli_prepare ($link, $query) {} function mysqli_report ($flags) {} /** - * @param $link - * @param $query + * @param $link mysqli + * @param $query string + * @return mixed * @jms-builtin */ function mysqli_query ($link, $query) {} /** - * @param $link - * @param $host [optional] - * @param $user [optional] - * @param $password [optional] - * @param $database [optional] - * @param $port [optional] - * @param $socket [optional] - * @param $flags [optional] + * @param $link mysqli + * @param $host [optional] string + * @param $user [optional] string + * @param $password [optional] string + * @param $database [optional] string + * @param $port [optional] int + * @param $socket [optional] string + * @param $flags [optional] int + * @return bool * @jms-builtin */ function mysqli_real_connect ($link, $host, $user, $password, $database, $port, $socket, $flags) {} /** - * @param $link - * @param $string_to_escape + * @param $link mysqli + * @param $string_to_escape string + * @return string * @jms-builtin */ function mysqli_real_escape_string ($link, $string_to_escape) {} /** - * @param $link - * @param $query + * @param $link mysqli + * @param $query string + * @return bool * @jms-builtin */ function mysqli_real_query ($link, $query) {} /** - * @param $link + * @param $link mysqli + * @return bool * @jms-builtin */ function mysqli_rollback ($link) {} /** - * @param $link - * @param $database + * @param $link mysqli + * @param $database string + * @return bool * @jms-builtin */ function mysqli_select_db ($link, $database) {} /** - * @param $link - * @param $charset + * @param $link mysqli + * @param $charset string + * @return bool * @jms-builtin */ function mysqli_set_charset ($link, $charset) {} @@ -1913,7 +1976,7 @@ function mysqli_stmt_free_result ($stmt) {} function mysqli_stmt_get_warnings ($stmt) {} /** - * @param $link + * @param $link mysqli * @jms-builtin */ function mysqli_stmt_init ($link) {} @@ -1976,57 +2039,62 @@ function mysqli_stmt_store_result ($stmt) {} function mysqli_stmt_sqlstate ($stmt) {} /** - * @param $link + * @param $link mysqli + * @return string * @jms-builtin */ function mysqli_sqlstate ($link) {} /** - * @param $link - * @param $key - * @param $cert - * @param $certificate_authority - * @param $certificate_authority_path - * @param $cipher + * @param $link mysqli + * @param $key string + * @param $cert string + * @param $certificate_authority string + * @param $certificate_authority_path string + * @param $cipher string + * @return bool * @jms-builtin */ function mysqli_ssl_set ($link, $key, $cert, $certificate_authority, $certificate_authority_path, $cipher) {} /** - * @param $link + * @param $link mysqli + * @return string * @jms-builtin */ function mysqli_stat ($link) {} /** - * @param $link + * @param $link mysqli + * @return mysqli_result * @jms-builtin */ function mysqli_store_result ($link) {} /** - * @param $link + * @param $link mysqli + * @return int * @jms-builtin */ -function mysqli_thread_id ($link) {} +function mysqli_thread_id ($link) {} /** @jms-builtin */ function mysqli_thread_safe () {} /** - * @param $link + * @param $link mysqli * @jms-builtin */ function mysqli_use_result ($link) {} /** - * @param $link + * @param $link mysqli * @jms-builtin */ function mysqli_warning_count ($link) {} /** - * @param $link + * @param $link mysqli * @param $options * @jms-builtin */ @@ -2036,8 +2104,9 @@ function mysqli_refresh ($link, $options) {} * (PHP 5)
    * Alias of mysqli_real_escape_string * @link http://php.net/manual/en/function.mysqli-escape-string.php - * @param $link - * @param $query + * @param $link mysqli + * @param $query string + * @return string * @jms-builtin */ function mysqli_escape_string ($link, $query) {} From 5a528afaf3c2c56574019e20fc83980bd37450f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Fri, 30 May 2014 11:12:04 +0200 Subject: [PATCH 53/62] Update PHP 5.3 definitions as well MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michal ÄŒihaÅ™ --- res/php-5.3-core-api/mysqli.php | 441 +++++++++++++++++++++++++++----- 1 file changed, 380 insertions(+), 61 deletions(-) diff --git a/res/php-5.3-core-api/mysqli.php b/res/php-5.3-core-api/mysqli.php index 6985f5e..6aaa229 100644 --- a/res/php-5.3-core-api/mysqli.php +++ b/res/php-5.3-core-api/mysqli.php @@ -1157,117 +1157,379 @@ public function store_result () {} } -function mysqli_affected_rows () {} +/** + * @param $link mysqli + * @return int + * @jms-builtin + */ +function mysqli_affected_rows ($link) {} -function mysqli_autocommit () {} +/** + * @param $link mysqli + * @param $mode bool + * @return bool + * @jms-builtin + */ +function mysqli_autocommit ($link, $mode) {} -function mysqli_change_user () {} +/** + * @param $link mysqli + * @param $user string + * @param $password string + * @param $database string + * @return bool + * @jms-builtin + */ +function mysqli_change_user ($link, $user, $password, $database) {} -function mysqli_character_set_name () {} +/** + * @param $link mysqli + * @return string + * @jms-builtin + */ +function mysqli_character_set_name ($link) {} -function mysqli_close () {} +/** + * @param $link mysqli + * @return bool + * @jms-builtin + */ +function mysqli_close ($link) {} -function mysqli_commit () {} +/** + * @param $link mysqli + * @return bool + * @jms-builtin + */ +function mysqli_commit ($link) {} /** - * &Alias; mysqli::__construct - * @link http://www.php.net/manual/en/function.mysqli-connect.php - * + * (PHP 5)
    + * Alias of mysqli::__construct + * @link http://php.net/manual/en/function.mysqli-connect.php + * @param $host [optional] + * @param $user [optional] + * @param $password [optional] + * @param $database [optional] + * @param $port [optional] + * @param $socket [optional] + * @return mysqli * @jms-builtin */ -function mysqli_connect () {} +function mysqli_connect ($host, $user, $password, $database, $port, $socket) {} +/** + * @return int + * @jms-builtin + */ function mysqli_connect_errno () {} +/** + * @return string + * @jms-builtin + */ function mysqli_connect_error () {} -function mysqli_data_seek () {} +/** + * @param $result object + * @param $offset int + * @return bool + * @jms-builtin + */ +function mysqli_data_seek ($result, $offset) {} -function mysqli_dump_debug_info () {} +/** + * @param $link mysqli + * @return bool + * @jms-builtin + */ +function mysqli_dump_debug_info ($link) {} -function mysqli_debug () {} +/** + * @param $message string + * @return bool + * @jms-builtin + */ +function mysqli_debug ($message) {} -function mysqli_errno () {} +/** + * @param $link mysqli + * @return int + * @jms-builtin + */ +function mysqli_errno ($link) {} -function mysqli_error () {} +/** + * @param $link mysqli + * @return string + * @jms-builtin + */ +function mysqli_error ($link) {} -function mysqli_stmt_execute () {} /** - * Alias for mysqli_stmt_execute - * @link http://www.php.net/manual/en/function.mysqli-execute.php - * + * @param $stmt + * @retrun bool * @jms-builtin */ -function mysqli_execute () {} +function mysqli_stmt_execute ($stmt) {} -function mysqli_fetch_field () {} +/** + * (PHP 5)
    + * Alias for mysqli_stmt_execute + * @link http://php.net/manual/en/function.mysqli-execute.php + * @param $stmt + * @retrun bool + * @jms-builtin + */ +function mysqli_execute ($stmt) {} -function mysqli_fetch_fields () {} +/** + * @param $result mysqli_result + * @return object + * @jms-builtin + */ +function mysqli_fetch_field ($result) {} -function mysqli_fetch_field_direct () {} +/** + * @param $result mysqli_result + * @return array + * @jms-builtin + */ +function mysqli_fetch_fields ($result) {} -function mysqli_fetch_lengths () {} +/** + * @param $result mysqli_result + * @param $field_nr int + * @return object + * @jms-builtin + */ +function mysqli_fetch_field_direct ($result, $field_nr) {} -function mysqli_fetch_array () {} +/** + * @param $result mysqli_result + * @return array + * @jms-builtin + */ +function mysqli_fetch_lengths ($result) {} -function mysqli_fetch_assoc () {} +/** + * @param $result mysqli_result + * @param $result_type [optional] + * @return array + * @jms-builtin + */ +function mysqli_fetch_array ($result, $result_type) {} -function mysqli_fetch_object () {} +/** + * @param $result mysqli_result + * @return array + * @jms-builtin + */ +function mysqli_fetch_assoc ($result) {} -function mysqli_fetch_row () {} +/** + * @param $result mysqli_result + * @param $class_name [optional] + * @param $params [optional] + * @return object + * @jms-builtin + */ +function mysqli_fetch_object ($result, $class_namearray , $params) {} -function mysqli_field_count () {} +/** + * @param $result mysqli_result + * @return mixed + * @jms-builtin + */ +function mysqli_fetch_row ($result) {} -function mysqli_field_seek () {} +/** + * @param $link mysqli + * @return int + * @jms-builtin + */ +function mysqli_field_count ($link) {} -function mysqli_field_tell () {} +/** + * @param $result mysqli_result + * @param $field_nr int + * @return bool + * @jms-builtin + */ +function mysqli_field_seek ($result, $field_nr) {} -function mysqli_free_result () {} +/** + * @param $result mysqli_result + * @return int + * @jms-builtin + */ +function mysqli_field_tell ($result) {} -function mysqli_get_charset () {} +/** + * @param $result mysqli_result + * @return bool + * @jms-builtin + */ +function mysqli_free_result ($result) {} + +/** + * @param $link mysqli + * @return object + * @jms-builtin + */ +function mysqli_get_charset ($link) {} -function mysqli_get_client_info () {} +/** + * @param $link mysqli + * @return string + * @jms-builtin + */ +function mysqli_get_client_info ($link) {} -function mysqli_get_client_version () {} +/** + * @param $link mysqli + * @return int + * @jms-builtin + */ +function mysqli_get_client_version ($link) {} -function mysqli_get_host_info () {} +/** + * @param $link mysqli + * @jms-builtin + */ +function mysqli_get_host_info ($link) {} -function mysqli_get_proto_info () {} +/** + * @param $link mysqli + * @return string + * @jms-builtin + */ +function mysqli_get_proto_info ($link) {} -function mysqli_get_server_info () {} +/** + * @param $link mysqli + * @return string + * @jms-builtin + */ +function mysqli_get_server_info ($link) {} -function mysqli_get_server_version () {} +/** + * @param $link mysqli + * @return int + * @jms-builtin + */ +function mysqli_get_server_version ($link) {} -function mysqli_get_warnings () {} +/** + * @param $link mysqli + * @return mysqli_warning + * @jms-builtin + */ +function mysqli_get_warnings ($link) {} +/** + * @return mysql + * @jms-builtin + */ function mysqli_init () {} -function mysqli_info () {} +/** + * @param $link mysqli + * @return string + * @jms-builtin + */ +function mysqli_info ($link) {} -function mysqli_insert_id () {} +/** + * @param $link mysqli + * @return int + * @jms-builtin + */ +function mysqli_insert_id ($link) {} -function mysqli_kill () {} +/** + * @param $link mysqli + * @param $connection_id int + * @return bool + * @jms-builtin + */ +function mysqli_kill ($link, $connection_id) {} -function mysqli_set_local_infile_default () {} +/** + * @param $link mysqli + * @return void + * @jms-builtin + */ +function mysqli_set_local_infile_default ($link) {} -function mysqli_set_local_infile_handler () {} +/** + * @param $link mysqli + * @param $read_callback callable + * @return bool + * @jms-builtin + */ +function mysqli_set_local_infile_handler ($link, $read_callback) {} -function mysqli_more_results () {} +/** + * @param $link mysqli + * @return bool + * @jms-builtin + */ +function mysqli_more_results ($link) {} -function mysqli_multi_query () {} +/** + * @param $link mysqli + * @param $query string + * @return bool + * @jms-builtin + */ +function mysqli_multi_query ($link, $query) {} -function mysqli_next_result () {} +/** + * @param $link mysqli + * @return bool + * @jms-builtin + */ +function mysqli_next_result ($link) {} -function mysqli_num_fields () {} +/** + * @param $result mysqli_result + * @return int + * @jms-builtin + */ +function mysqli_num_fields ($result) {} -function mysqli_num_rows () {} +/** + * @param $result mysqli_result + * @return int + * @jms-builtin + */ +function mysqli_num_rows ($result) {} -function mysqli_options () {} +/** + * @param $link mysqli + * @param $option int + * @param $value mixed + * @return bool + * @jms-builtin + */ +function mysqli_options ($link, $option, $value) {} -function mysqli_ping () {} +/** + * @param $link mysqli + * @return bool + * @jms-builtin + */ +function mysqli_ping ($link) {} -function mysqli_prepare () {} +/** + * @param $link mysqli + * @param $query string + * @param mysql_stmt + * @jms-builtin + */ +function mysqli_prepare ($link, $query) {} /** * Enables or disables internal report functions @@ -1307,18 +1569,65 @@ function mysqli_prepare () {} */ function mysqli_report ($flags) {} -function mysqli_query () {} +/** + * @param $link mysqli + * @param $query string + * @return mixed + * @jms-builtin + */ +function mysqli_query ($link, $query) {} -function mysqli_real_connect () {} +/** + * @param $link mysqli + * @param $host [optional] string + * @param $user [optional] string + * @param $password [optional] string + * @param $database [optional] string + * @param $port [optional] int + * @param $socket [optional] string + * @param $flags [optional] int + * @return bool + * @jms-builtin + */ +function mysqli_real_connect ($link, $host, $user, $password, $database, $port, $socket, $flags) {} -function mysqli_real_escape_string () {} +/** + * @param $link mysqli + * @param $string_to_escape string + * @return string + * @jms-builtin + */ +function mysqli_real_escape_string ($link, $string_to_escape) {} -function mysqli_real_query () {} +/** + * @param $link mysqli + * @param $query string + * @return bool + * @jms-builtin + */ +function mysqli_real_query ($link, $query) {} -function mysqli_rollback () {} +/** + * @param $link mysqli + * @return bool + * @jms-builtin + */ +function mysqli_rollback ($link) {} -function mysqli_select_db () {} +/** + * @param $link mysqli + * @param $database string + * @return bool + * @jms-builtin + */ +function mysqli_select_db ($link, $database) {} +/** + * @param $link mysqli + * @param $charset string + * @return bool + * @jms-builtin + */ function mysqli_set_charset () {} function mysqli_stmt_attr_get () {} @@ -1384,9 +1693,19 @@ function mysqli_stmt_sqlstate () {} function mysqli_stmt_store_result () {} -function mysqli_store_result () {} +/** + * @param $link mysqli + * @return mysqli_result + * @jms-builtin + */ +function mysqli_store_result ($link) {} -function mysqli_thread_id () {} +/** + * @param $link mysqli + * @return int + * @jms-builtin + */ +function mysqli_thread_id ($link) {} function mysqli_thread_safe () {} From 36b9414941e5d0c3272acf0dc90b7915471e8bec Mon Sep 17 00:00:00 2001 From: Ivan Lanin Date: Sat, 31 May 2014 07:41:09 +0700 Subject: [PATCH 54/62] Patch for #190: The property numFiles does not exist in \ZipArchive --- res/php-5.2-core-api/zip.php | 38 ++++++++++++++++++++++++++++++++++-- res/php-5.3-core-api/zip.php | 38 ++++++++++++++++++++++++++++++++++-- res/php-5.4-core-api/zip.php | 34 ++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 4 deletions(-) diff --git a/res/php-5.2-core-api/zip.php b/res/php-5.2-core-api/zip.php index 45a4db8..ba2be1e 100644 --- a/res/php-5.2-core-api/zip.php +++ b/res/php-5.2-core-api/zip.php @@ -48,6 +48,40 @@ class ZipArchive { const ER_REMOVE = 22; const ER_DELETED = 23; + /** + * Status of the Zip Archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.status + * @var int + */ + public $status; + + /** + * System status of the Zip Archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.statussys + * @var int + */ + public $statusSys + + /** + * Number of files in archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.numfiles + * @var int + */ + public $numFiles + + /** + * File name in the file system + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.filename + * @var string + */ + public $filename + + /** + * Comment for the archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.comment + * @var string + */ + public $comment /** * Open a ZIP file archive @@ -434,7 +468,7 @@ function zip_open ($filename) {} * @param zip resource

    * A ZIP file previously opened with zip_open. *

    - * @return void + * @return void * * @jms-builtin */ @@ -503,7 +537,7 @@ function zip_entry_close ($zip_entry) {} * A directory entry returned by zip_read. *

    * @param length int[optional]

    - * The number of bytes to return. If not specified, this function will + * The number of bytes to return. If not specified, this function will * attempt to read 1024 bytes. *

    *

    diff --git a/res/php-5.3-core-api/zip.php b/res/php-5.3-core-api/zip.php index 6b3f0e7..a323f96 100644 --- a/res/php-5.3-core-api/zip.php +++ b/res/php-5.3-core-api/zip.php @@ -48,6 +48,40 @@ class ZipArchive { const ER_REMOVE = 22; const ER_DELETED = 23; + /** + * Status of the Zip Archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.status + * @var int + */ + public $status; + + /** + * System status of the Zip Archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.statussys + * @var int + */ + public $statusSys + + /** + * Number of files in archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.numfiles + * @var int + */ + public $numFiles + + /** + * File name in the file system + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.filename + * @var string + */ + public $filename + + /** + * Comment for the archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.comment + * @var string + */ + public $comment /** * Open a ZIP file archive @@ -438,7 +472,7 @@ function zip_open ($filename) {} * @param zip resource

    * A ZIP file previously opened with zip_open. *

    - * @return void + * @return void * * @jms-builtin */ @@ -507,7 +541,7 @@ function zip_entry_close ($zip_entry) {} * A directory entry returned by zip_read. *

    * @param length int[optional]

    - * The number of bytes to return. If not specified, this function will + * The number of bytes to return. If not specified, this function will * attempt to read 1024 bytes. *

    *

    diff --git a/res/php-5.4-core-api/zip.php b/res/php-5.4-core-api/zip.php index 789d635..fe5bd44 100644 --- a/res/php-5.4-core-api/zip.php +++ b/res/php-5.4-core-api/zip.php @@ -58,6 +58,40 @@ class ZipArchive { const ER_REMOVE = 22; const ER_DELETED = 23; + /** + * Status of the Zip Archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.status + * @var int + */ + public $status; + + /** + * System status of the Zip Archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.statussys + * @var int + */ + public $statusSys + + /** + * Number of files in archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.numfiles + * @var int + */ + public $numFiles + + /** + * File name in the file system + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.filename + * @var string + */ + public $filename + + /** + * Comment for the archive + * @link http://www.php.net/manual/en/class.ziparchive.php#ziparchive.props.comment + * @var string + */ + public $comment /** * (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
    From bd869d3d28d0bde58cd39936815e183017cbf114 Mon Sep 17 00:00:00 2001 From: Sander Bol Date: Wed, 11 Jun 2014 12:42:31 +0200 Subject: [PATCH 55/62] Update PDO.php Solves #254 - added inTransaction to the PHP 5.3 stub. Copied from the PHP 5.4 stub. Added a note based on the documentation to indicate that in PHP 5.3 this method did not conform to the documented behaviour (returned int instead of bool). --- res/php-5.3-core-api/PDO.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/res/php-5.3-core-api/PDO.php b/res/php-5.3-core-api/PDO.php index 1badfbe..592a7b1 100644 --- a/res/php-5.3-core-api/PDO.php +++ b/res/php-5.3-core-api/PDO.php @@ -182,6 +182,15 @@ public function commit () {} */ public function rollBack () {} + /** + * (PHP 5 >= 5.3.3, Bundled pdo_pgsql)
    + * Checks if inside a transaction + * @link http://php.net/manual/en/pdo.intransaction.php + * @return bool TRUE if a transaction is currently active, and FALSE if not. + * @note Documentation says bool, but actually returns int 1 / 0 according to http://www.php.net/manual/en/pdo.intransaction.php#108361 + */ + + public function inTransaction () {} /** * Set an attribute * @link http://www.php.net/manual/en/pdo.setattribute.php From 5be6409bd669e2747aadadf662bf101fabfd461b Mon Sep 17 00:00:00 2001 From: Sander Bol Date: Wed, 11 Jun 2014 21:26:52 +0200 Subject: [PATCH 56/62] Update PDO.php Fixed whitespace issue. --- res/php-5.3-core-api/PDO.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/php-5.3-core-api/PDO.php b/res/php-5.3-core-api/PDO.php index 592a7b1..cd508a1 100644 --- a/res/php-5.3-core-api/PDO.php +++ b/res/php-5.3-core-api/PDO.php @@ -189,8 +189,8 @@ public function rollBack () {} * @return bool TRUE if a transaction is currently active, and FALSE if not. * @note Documentation says bool, but actually returns int 1 / 0 according to http://www.php.net/manual/en/pdo.intransaction.php#108361 */ - public function inTransaction () {} + /** * Set an attribute * @link http://www.php.net/manual/en/pdo.setattribute.php From 2caca796d7ce12756ac2b3be6e9b95a98e6cc376 Mon Sep 17 00:00:00 2001 From: Sander Bol Date: Wed, 11 Jun 2014 21:43:15 +0200 Subject: [PATCH 57/62] Update standard.php Fix for #248 dir() returns a Directory, not a string --- res/php-5.3-core-api/standard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/php-5.3-core-api/standard.php b/res/php-5.3-core-api/standard.php index be24acf..34cd139 100644 --- a/res/php-5.3-core-api/standard.php +++ b/res/php-5.3-core-api/standard.php @@ -8144,7 +8144,7 @@ function readdir ($dir_handle = null) {} * @link http://www.php.net/manual/en/class.dir.php * @param directory * @param context[optional] - * @return string + * @return Directory * * @jms-builtin */ From 9be49f443766203ceb94f5aadf26e617002beadc Mon Sep 17 00:00:00 2001 From: Sander Bol Date: Wed, 11 Jun 2014 21:54:06 +0200 Subject: [PATCH 58/62] Update standard.php Also updating PHP 5.2 core --- res/php-5.2-core-api/standard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/php-5.2-core-api/standard.php b/res/php-5.2-core-api/standard.php index dbc9e98..94977da 100644 --- a/res/php-5.2-core-api/standard.php +++ b/res/php-5.2-core-api/standard.php @@ -8205,7 +8205,7 @@ function readdir ($dir_handle = null) {} * @link http://www.php.net/manual/en/class.dir.php * @param directory * @param context[optional] - * @return string + * @return Directory * * @jms-builtin */ From f6ac4f6f43491a5d85e81529e8dadaa0484fbe17 Mon Sep 17 00:00:00 2001 From: Sander Bol Date: Wed, 11 Jun 2014 22:02:36 +0200 Subject: [PATCH 59/62] Fix #247 - 2nd param for dir() is optional Defaulting the stream context parameter to null, to indicate it is optional. Johannes, is this the right way to go about this? I'm considering the comment you made on https://bugs.php.net/bug.php?id=50798 explaining that PHP handles default parameter values differently for internal functions, and am unsure how otherwise to indicate the optionality for internal functions :/ --- res/php-5.3-core-api/standard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/php-5.3-core-api/standard.php b/res/php-5.3-core-api/standard.php index be24acf..0964b93 100644 --- a/res/php-5.3-core-api/standard.php +++ b/res/php-5.3-core-api/standard.php @@ -8148,7 +8148,7 @@ function readdir ($dir_handle = null) {} * * @jms-builtin */ -function dir ($directory, $context) {} +function dir ($directory, $context = null) {} /** * List files and directories inside the specified path From 660c428329c576dc875a4c4b575e33221d000048 Mon Sep 17 00:00:00 2001 From: Sander Bol Date: Thu, 12 Jun 2014 06:48:08 +0200 Subject: [PATCH 60/62] Applied to 5.2 as well --- res/php-5.2-core-api/standard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/php-5.2-core-api/standard.php b/res/php-5.2-core-api/standard.php index dbc9e98..0a216ac 100644 --- a/res/php-5.2-core-api/standard.php +++ b/res/php-5.2-core-api/standard.php @@ -8209,7 +8209,7 @@ function readdir ($dir_handle = null) {} * * @jms-builtin */ -function dir ($directory, $context) {} +function dir ($directory, $context = null) {} /** * List files and directories inside the specified path From e6baba021d1ebd0cfbe68f2885ac845d1cecaf51 Mon Sep 17 00:00:00 2001 From: Peter Maselkowski Date: Thu, 9 Oct 2014 11:55:31 +0200 Subject: [PATCH 61/62] Wrong stub for the MongoDate constructor #354 --- res/php-5.2-core-api/mongo.php | 4 ++-- res/php-5.3-core-api/mongo.php | 4 ++-- res/php-5.4-core-api/mongo.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/res/php-5.2-core-api/mongo.php b/res/php-5.2-core-api/mongo.php index b19dc53..1872e5d 100644 --- a/res/php-5.2-core-api/mongo.php +++ b/res/php-5.2-core-api/mongo.php @@ -3601,7 +3601,7 @@ class MongoRegex { * Creates a new regular expression * @link http://www.php.net/manual/en/mongoregex.construct.php */ - public function __construct () {} + public function __construct ($regex) {} /** * A string representation of this regular expression @@ -3622,7 +3622,7 @@ class MongoDate { * Creates a new date. * @link http://www.php.net/manual/en/mongodate.construct.php */ - public function __construct () {} + public function __construct ($sec = 'time()', $usec = 0) {} /** * Returns a string representation of this date diff --git a/res/php-5.3-core-api/mongo.php b/res/php-5.3-core-api/mongo.php index b19dc53..1872e5d 100644 --- a/res/php-5.3-core-api/mongo.php +++ b/res/php-5.3-core-api/mongo.php @@ -3601,7 +3601,7 @@ class MongoRegex { * Creates a new regular expression * @link http://www.php.net/manual/en/mongoregex.construct.php */ - public function __construct () {} + public function __construct ($regex) {} /** * A string representation of this regular expression @@ -3622,7 +3622,7 @@ class MongoDate { * Creates a new date. * @link http://www.php.net/manual/en/mongodate.construct.php */ - public function __construct () {} + public function __construct ($sec = 'time()', $usec = 0) {} /** * Returns a string representation of this date diff --git a/res/php-5.4-core-api/mongo.php b/res/php-5.4-core-api/mongo.php index b19dc53..1872e5d 100644 --- a/res/php-5.4-core-api/mongo.php +++ b/res/php-5.4-core-api/mongo.php @@ -3601,7 +3601,7 @@ class MongoRegex { * Creates a new regular expression * @link http://www.php.net/manual/en/mongoregex.construct.php */ - public function __construct () {} + public function __construct ($regex) {} /** * A string representation of this regular expression @@ -3622,7 +3622,7 @@ class MongoDate { * Creates a new date. * @link http://www.php.net/manual/en/mongodate.construct.php */ - public function __construct () {} + public function __construct ($sec = 'time()', $usec = 0) {} /** * Returns a string representation of this date From 0d3c532dd6e1d50fee644c11b5bb31be579f7421 Mon Sep 17 00:00:00 2001 From: Vasil Rangelov Date: Sun, 28 Dec 2014 23:23:18 +0200 Subject: [PATCH 62/62] Added stubs for XMLReader properties and comments for constants; Also, made the PHP 5.4 a copy over to the old versions (since there are literally 0 changes API wise). --- res/php-5.2-core-api/xmlreader.php | 371 ++++++++++++++++++++++------- res/php-5.3-core-api/xmlreader.php | 371 ++++++++++++++++++++++------- res/php-5.4-core-api/xmlreader.php | 167 +++++++++++++ 3 files changed, 739 insertions(+), 170 deletions(-) diff --git a/res/php-5.2-core-api/xmlreader.php b/res/php-5.2-core-api/xmlreader.php index 4852696..f68164a 100644 --- a/res/php-5.2-core-api/xmlreader.php +++ b/res/php-5.2-core-api/xmlreader.php @@ -2,283 +2,484 @@ // Start of xmlreader v.0.1 -/** @jms-builtin */ +/** + * The XMLReader extension is an XML Pull parser. The reader acts as a + * cursor going forward on the document stream and stopping at each node + * on the way. + * @link http://php.net/manual/en/class.xmlreader.php + * @jms-builtin + */ class XMLReader { + + /** + * No node type + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.none + */ const NONE = 0; + /** + * Start element + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.element + */ const ELEMENT = 1; + /** + * Attribute node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.attribute + */ const ATTRIBUTE = 2; + /** + * Attribute node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.text + */ const TEXT = 3; + /** + * CDATA node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.cdata + */ const CDATA = 4; + /** + * Entity Reference node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.entity-ref + */ const ENTITY_REF = 5; + /** + * Entity Declaration node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.entity + */ const ENTITY = 6; + /** + * Processing Instruction node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.pi + */ const PI = 7; + /** + * Comment node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.comment + */ const COMMENT = 8; + /** + * Document node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.doc + */ const DOC = 9; + /** + * Document Type node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.doc-type + */ const DOC_TYPE = 10; + /** + * Document Fragment node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.doc-fragment + */ const DOC_FRAGMENT = 11; + /** + * Notation node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.notation + */ const NOTATION = 12; + /** + * Whitespace node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.whitespace + */ const WHITESPACE = 13; + /** + * Significant Whitespace node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.significant-whitespace + */ const SIGNIFICANT_WHITESPACE = 14; + /** + * End Element + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.end-element + */ const END_ELEMENT = 15; + /** + * End Entity + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.end-entity + */ const END_ENTITY = 16; + /** + * XML Declaration node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.xml-declaration + */ const XML_DECLARATION = 17; + /** + * Load DTD but do not validate + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.loaddtd + */ const LOADDTD = 1; + /** + * Load DTD and default attributes but do not validate + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.defaultattrs + */ const DEFAULTATTRS = 2; + /** + * Load DTD and validate while parsing + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.validate + */ const VALIDATE = 3; + /** + * Substitute entities and expand references + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.subst-entities + */ const SUBST_ENTITIES = 4; + /** + * @var int The number of attributes on the node + */ + public $attributeCount; + /** + * @var string The base URI of the node + */ + public $baseURI; + /** + * @var int Depth of the node in the tree, starting at 0 + */ + public $depth; + /** + * @var bool Indicates if node has attributes + */ + public $hasAttributes; + /** + * @var bool Indicates if node has a text value + */ + public $hasValue; + /** + * @var bool Indicates if attribute is defaulted from DTD + */ + public $isDefault; + /** + * @var bool Indicates if node is an empty element tag + */ + public $isEmptyElement; + /** + * @var string The local name of the node + */ + public $localName; + /** + * @var string The qualified name of the node + */ + public $name; + /** + * @var string The URI of the namespace associated with the node + */ + public $namespaceURI; + /** + * @var int The node type for the node + */ + public $nodeType; + /** + * @var string The prefix of the namespace associated with the node + */ + public $prefix; + /** + * @var string The text value of the node + */ + public $value; + /** + * @var string The xml:lang scope which the node resides + */ + public $xmlLang; /** + * (PHP 5 >= 5.1.2)
    * Close the XMLReader input - * @link http://www.php.net/manual/en/xmlreader.close.php - * @return bool Returns true on success or false on failure. + * @link http://php.net/manual/en/xmlreader.close.php + * @return bool TRUE on success or FALSE on failure. */ public function close () {} /** + * (PHP 5 >= 5.1.2)
    * Get the value of a named attribute - * @link http://www.php.net/manual/en/xmlreader.getattribute.php - * @param name string

    + * @link http://php.net/manual/en/xmlreader.getattribute.php + * @param string $name

    * The name of the attribute. *

    - * @return string The value of the attribute, or an empty string if no attribute with the - * given name is found or not positioned of element. + * @return string The value of the attribute, or NULL if no attribute with the given + * name is found or not positioned on an element node. */ public function getAttribute ($name) {} /** + * (PHP 5 >= 5.1.2)
    * Get the value of an attribute by index - * @link http://www.php.net/manual/en/xmlreader.getattributeno.php - * @param index int

    + * @link http://php.net/manual/en/xmlreader.getattributeno.php + * @param int $index

    * The position of the attribute. *

    - * @return string The value of the attribute, or an empty string if no attribute exists - * at index or not positioned of element. + * @return string The value of the attribute, or an empty string if no attribute exists + * at index or not positioned of element. */ public function getAttributeNo ($index) {} /** + * (PHP 5 >= 5.1.2)
    * Get the value of an attribute by localname and URI - * @link http://www.php.net/manual/en/xmlreader.getattributens.php - * @param localName string

    + * @link http://php.net/manual/en/xmlreader.getattributens.php + * @param string $localName

    * The local name. *

    - * @param namespaceURI string

    + * @param string $namespaceURI

    * The namespace URI. *

    * @return string The value of the attribute, or an empty string if no attribute with the - * given localName and - * namespaceURI is found or not positioned of element. + * given localName and + * namespaceURI is found or not positioned of element. */ public function getAttributeNs ($localName, $namespaceURI) {} /** + * (PHP 5 >= 5.1.2)
    * Indicates if specified property has been set - * @link http://www.php.net/manual/en/xmlreader.getparserproperty.php - * @param property int

    - * One of the parser option + * @link http://php.net/manual/en/xmlreader.getparserproperty.php + * @param int $property

    + * One of the parser option * constants. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function getParserProperty ($property) {} /** + * (PHP 5 >= 5.1.2)
    * Indicates if the parsed document is valid - * @link http://www.php.net/manual/en/xmlreader.isvalid.php - * @return bool Returns true on success or false on failure. + * @link http://php.net/manual/en/xmlreader.isvalid.php + * @return bool TRUE on success or FALSE on failure. */ public function isValid () {} /** + * (PHP 5 >= 5.1.2)
    * Lookup namespace for a prefix - * @link http://www.php.net/manual/en/xmlreader.lookupnamespace.php - * @param prefix string

    + * @link http://php.net/manual/en/xmlreader.lookupnamespace.php + * @param string $prefix

    * String containing the prefix. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function lookupNamespace ($prefix) {} /** + * (PHP 5 >= 5.1.2)
    * Move cursor to an attribute by index - * @link http://www.php.net/manual/en/xmlreader.movetoattributeno.php - * @param index int

    + * @link http://php.net/manual/en/xmlreader.movetoattributeno.php + * @param int $index

    * The position of the attribute. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function moveToAttributeNo ($index) {} /** + * (PHP 5 >= 5.1.2)
    * Move cursor to a named attribute - * @link http://www.php.net/manual/en/xmlreader.movetoattribute.php - * @param name string

    + * @link http://php.net/manual/en/xmlreader.movetoattribute.php + * @param string $name

    * The name of the attribute. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function moveToAttribute ($name) {} /** + * (PHP 5 >= 5.1.2)
    * Move cursor to a named attribute - * @link http://www.php.net/manual/en/xmlreader.movetoattributens.php - * @param localName string

    + * @link http://php.net/manual/en/xmlreader.movetoattributens.php + * @param string $localName

    * The local name. *

    - * @param namespaceURI string

    + * @param string $namespaceURI

    * The namespace URI. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function moveToAttributeNs ($localName, $namespaceURI) {} /** + * (PHP 5 >= 5.1.2)
    * Position cursor on the parent Element of current Attribute - * @link http://www.php.net/manual/en/xmlreader.movetoelement.php - * @return bool true if successful and false if it fails or not positioned on + * @link http://php.net/manual/en/xmlreader.movetoelement.php + * @return bool TRUE if successful and FALSE if it fails or not positioned on * Attribute when this method is called. */ public function moveToElement () {} /** + * (PHP 5 >= 5.1.2)
    * Position cursor on the first Attribute - * @link http://www.php.net/manual/en/xmlreader.movetofirstattribute.php - * @return bool Returns true on success or false on failure. + * @link http://php.net/manual/en/xmlreader.movetofirstattribute.php + * @return bool TRUE on success or FALSE on failure. */ public function moveToFirstAttribute () {} /** + * (PHP 5 >= 5.1.2)
    * Position cursor on the next Attribute - * @link http://www.php.net/manual/en/xmlreader.movetonextattribute.php - * @return bool Returns true on success or false on failure. + * @link http://php.net/manual/en/xmlreader.movetonextattribute.php + * @return bool TRUE on success or FALSE on failure. */ public function moveToNextAttribute () {} /** + * (PHP 5 >= 5.1.2)
    * Set the URI containing the XML to parse - * @link http://www.php.net/manual/en/xmlreader.open.php - * @param URI string

    + * @link http://php.net/manual/en/xmlreader.open.php + * @param string $URI

    * URI pointing to the document. *

    - * @param encoding string[optional]

    - * The document encoding or &null;. + * @param string $encoding [optional]

    + * The document encoding or NULL. *

    - * @param options int[optional]

    - * A bitmask of the LIBXML_* + * @param int $options [optional]

    + * A bitmask of the LIBXML_* * constants. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. If called statically, returns an + * XMLReader or FALSE on failure. */ - public function open ($URI, $encoding = null, $options = null) {} + public function open ($URI, $encoding = null, $options = 0) {} /** + * (PHP 5 >= 5.1.2)
    * Move to next node in document - * @link http://www.php.net/manual/en/xmlreader.read.php - * @return bool Returns true on success or false on failure. + * @link http://php.net/manual/en/xmlreader.read.php + * @return bool TRUE on success or FALSE on failure. */ public function read () {} /** + * (PHP 5 >= 5.1.2)
    * Move cursor to next node skipping all subtrees - * @link http://www.php.net/manual/en/xmlreader.next.php - * @param localname string[optional]

    + * @link http://php.net/manual/en/xmlreader.next.php + * @param string $localname [optional]

    * The name of the next node to move to. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function next ($localname = null) {} /** + * (PHP 5 >= 5.2.0)
    * Retrieve XML from current node - * @link http://www.php.net/manual/en/xmlreader.readinnerxml.php + * @link http://php.net/manual/en/xmlreader.readinnerxml.php * @return string the contents of the current node as a string. Empty string on failure. */ public function readInnerXml () {} /** + * (PHP 5 >= 5.2.0)
    * Retrieve XML from current node, including it self - * @link http://www.php.net/manual/en/xmlreader.readouterxml.php + * @link http://php.net/manual/en/xmlreader.readouterxml.php * @return string the contents of current node, including itself, as a string. Empty string on failure. */ public function readOuterXml () {} /** - * Reads the contents of the current node as an string - * @link http://www.php.net/manual/en/xmlreader.readstring.php + * (PHP 5 >= 5.2.0)
    + * Reads the contents of the current node as a string + * @link http://php.net/manual/en/xmlreader.readstring.php * @return string the content of the current node as a string. Empty string on * failure. */ public function readString () {} /** + * (PHP 5 >= 5.2.0)
    * Validate document against XSD - * @link http://www.php.net/manual/en/xmlreader.setschema.php - * @param filename string

    + * @link http://php.net/manual/en/xmlreader.setschema.php + * @param string $filename

    * The filename of the XSD schema. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function setSchema ($filename) {} /** - * Set or Unset parser options - * @link http://www.php.net/manual/en/xmlreader.setparserproperty.php - * @param property int

    - * One of the parser option + * (PHP 5 >= 5.1.2)
    + * Set parser options + * @link http://php.net/manual/en/xmlreader.setparserproperty.php + * @param int $property

    + * One of the parser option * constants. *

    - * @param value bool

    - * If set to true the option will be enabled otherwise will + * @param bool $value

    + * If set to TRUE the option will be enabled otherwise will * be disabled. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function setParserProperty ($property, $value) {} /** + * (PHP 5 >= 5.2.0)
    * Set the filename or URI for a RelaxNG Schema - * @link http://www.php.net/manual/en/xmlreader.setrelaxngschema.php - * @param filename string

    + * @link http://php.net/manual/en/xmlreader.setrelaxngschema.php + * @param string $filename

    * filename or URI pointing to a RelaxNG Schema. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function setRelaxNGSchema ($filename) {} /** + * (PHP 5 >= 5.1.2)
    * Set the data containing a RelaxNG Schema - * @link http://www.php.net/manual/en/xmlreader.setrelaxngschemasource.php - * @param source string

    + * @link http://php.net/manual/en/xmlreader.setrelaxngschemasource.php + * @param string $source

    * String containing the RelaxNG Schema. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function setRelaxNGSchemaSource ($source) {} /** + * (PHP 5 >= 5.1.2)
    * Set the data containing the XML to parse - * @link http://www.php.net/manual/en/xmlreader.xml.php - * @param source string

    + * @link http://php.net/manual/en/xmlreader.xml.php + * @param string $source

    * String containing the XML to be parsed. *

    - * @param encoding string[optional]

    - * The document encoding or &null;. + * @param string $encoding [optional]

    + * The document encoding or NULL. *

    - * @param options int[optional]

    - * A bitmask of the LIBXML_* + * @param int $options [optional]

    + * A bitmask of the LIBXML_* * constants. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. If called statically, returns an + * XMLReader or FALSE on failure. */ - public function XML ($source, $encoding = null, $options = null) {} + public function XML ($source, $encoding = null, $options = 0) {} /** + * (PHP 5 >= 5.1.2)
    * Returns a copy of the current node as a DOM object - * @link http://www.php.net/manual/en/xmlreader.expand.php - * @return DOMNode The resulting DOMNode or false on error. + * @link http://php.net/manual/en/xmlreader.expand.php + * @param DOMNode $basenode [optional] + * @return DOMNode The resulting DOMNode or FALSE on error. */ - public function expand () {} + public function expand (DOMNode $basenode = null) {} } // End of xmlreader v.0.1 diff --git a/res/php-5.3-core-api/xmlreader.php b/res/php-5.3-core-api/xmlreader.php index 4852696..f68164a 100644 --- a/res/php-5.3-core-api/xmlreader.php +++ b/res/php-5.3-core-api/xmlreader.php @@ -2,283 +2,484 @@ // Start of xmlreader v.0.1 -/** @jms-builtin */ +/** + * The XMLReader extension is an XML Pull parser. The reader acts as a + * cursor going forward on the document stream and stopping at each node + * on the way. + * @link http://php.net/manual/en/class.xmlreader.php + * @jms-builtin + */ class XMLReader { + + /** + * No node type + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.none + */ const NONE = 0; + /** + * Start element + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.element + */ const ELEMENT = 1; + /** + * Attribute node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.attribute + */ const ATTRIBUTE = 2; + /** + * Attribute node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.text + */ const TEXT = 3; + /** + * CDATA node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.cdata + */ const CDATA = 4; + /** + * Entity Reference node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.entity-ref + */ const ENTITY_REF = 5; + /** + * Entity Declaration node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.entity + */ const ENTITY = 6; + /** + * Processing Instruction node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.pi + */ const PI = 7; + /** + * Comment node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.comment + */ const COMMENT = 8; + /** + * Document node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.doc + */ const DOC = 9; + /** + * Document Type node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.doc-type + */ const DOC_TYPE = 10; + /** + * Document Fragment node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.doc-fragment + */ const DOC_FRAGMENT = 11; + /** + * Notation node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.notation + */ const NOTATION = 12; + /** + * Whitespace node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.whitespace + */ const WHITESPACE = 13; + /** + * Significant Whitespace node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.significant-whitespace + */ const SIGNIFICANT_WHITESPACE = 14; + /** + * End Element + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.end-element + */ const END_ELEMENT = 15; + /** + * End Entity + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.end-entity + */ const END_ENTITY = 16; + /** + * XML Declaration node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.xml-declaration + */ const XML_DECLARATION = 17; + /** + * Load DTD but do not validate + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.loaddtd + */ const LOADDTD = 1; + /** + * Load DTD and default attributes but do not validate + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.defaultattrs + */ const DEFAULTATTRS = 2; + /** + * Load DTD and validate while parsing + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.validate + */ const VALIDATE = 3; + /** + * Substitute entities and expand references + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.subst-entities + */ const SUBST_ENTITIES = 4; + /** + * @var int The number of attributes on the node + */ + public $attributeCount; + /** + * @var string The base URI of the node + */ + public $baseURI; + /** + * @var int Depth of the node in the tree, starting at 0 + */ + public $depth; + /** + * @var bool Indicates if node has attributes + */ + public $hasAttributes; + /** + * @var bool Indicates if node has a text value + */ + public $hasValue; + /** + * @var bool Indicates if attribute is defaulted from DTD + */ + public $isDefault; + /** + * @var bool Indicates if node is an empty element tag + */ + public $isEmptyElement; + /** + * @var string The local name of the node + */ + public $localName; + /** + * @var string The qualified name of the node + */ + public $name; + /** + * @var string The URI of the namespace associated with the node + */ + public $namespaceURI; + /** + * @var int The node type for the node + */ + public $nodeType; + /** + * @var string The prefix of the namespace associated with the node + */ + public $prefix; + /** + * @var string The text value of the node + */ + public $value; + /** + * @var string The xml:lang scope which the node resides + */ + public $xmlLang; /** + * (PHP 5 >= 5.1.2)
    * Close the XMLReader input - * @link http://www.php.net/manual/en/xmlreader.close.php - * @return bool Returns true on success or false on failure. + * @link http://php.net/manual/en/xmlreader.close.php + * @return bool TRUE on success or FALSE on failure. */ public function close () {} /** + * (PHP 5 >= 5.1.2)
    * Get the value of a named attribute - * @link http://www.php.net/manual/en/xmlreader.getattribute.php - * @param name string

    + * @link http://php.net/manual/en/xmlreader.getattribute.php + * @param string $name

    * The name of the attribute. *

    - * @return string The value of the attribute, or an empty string if no attribute with the - * given name is found or not positioned of element. + * @return string The value of the attribute, or NULL if no attribute with the given + * name is found or not positioned on an element node. */ public function getAttribute ($name) {} /** + * (PHP 5 >= 5.1.2)
    * Get the value of an attribute by index - * @link http://www.php.net/manual/en/xmlreader.getattributeno.php - * @param index int

    + * @link http://php.net/manual/en/xmlreader.getattributeno.php + * @param int $index

    * The position of the attribute. *

    - * @return string The value of the attribute, or an empty string if no attribute exists - * at index or not positioned of element. + * @return string The value of the attribute, or an empty string if no attribute exists + * at index or not positioned of element. */ public function getAttributeNo ($index) {} /** + * (PHP 5 >= 5.1.2)
    * Get the value of an attribute by localname and URI - * @link http://www.php.net/manual/en/xmlreader.getattributens.php - * @param localName string

    + * @link http://php.net/manual/en/xmlreader.getattributens.php + * @param string $localName

    * The local name. *

    - * @param namespaceURI string

    + * @param string $namespaceURI

    * The namespace URI. *

    * @return string The value of the attribute, or an empty string if no attribute with the - * given localName and - * namespaceURI is found or not positioned of element. + * given localName and + * namespaceURI is found or not positioned of element. */ public function getAttributeNs ($localName, $namespaceURI) {} /** + * (PHP 5 >= 5.1.2)
    * Indicates if specified property has been set - * @link http://www.php.net/manual/en/xmlreader.getparserproperty.php - * @param property int

    - * One of the parser option + * @link http://php.net/manual/en/xmlreader.getparserproperty.php + * @param int $property

    + * One of the parser option * constants. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function getParserProperty ($property) {} /** + * (PHP 5 >= 5.1.2)
    * Indicates if the parsed document is valid - * @link http://www.php.net/manual/en/xmlreader.isvalid.php - * @return bool Returns true on success or false on failure. + * @link http://php.net/manual/en/xmlreader.isvalid.php + * @return bool TRUE on success or FALSE on failure. */ public function isValid () {} /** + * (PHP 5 >= 5.1.2)
    * Lookup namespace for a prefix - * @link http://www.php.net/manual/en/xmlreader.lookupnamespace.php - * @param prefix string

    + * @link http://php.net/manual/en/xmlreader.lookupnamespace.php + * @param string $prefix

    * String containing the prefix. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function lookupNamespace ($prefix) {} /** + * (PHP 5 >= 5.1.2)
    * Move cursor to an attribute by index - * @link http://www.php.net/manual/en/xmlreader.movetoattributeno.php - * @param index int

    + * @link http://php.net/manual/en/xmlreader.movetoattributeno.php + * @param int $index

    * The position of the attribute. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function moveToAttributeNo ($index) {} /** + * (PHP 5 >= 5.1.2)
    * Move cursor to a named attribute - * @link http://www.php.net/manual/en/xmlreader.movetoattribute.php - * @param name string

    + * @link http://php.net/manual/en/xmlreader.movetoattribute.php + * @param string $name

    * The name of the attribute. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function moveToAttribute ($name) {} /** + * (PHP 5 >= 5.1.2)
    * Move cursor to a named attribute - * @link http://www.php.net/manual/en/xmlreader.movetoattributens.php - * @param localName string

    + * @link http://php.net/manual/en/xmlreader.movetoattributens.php + * @param string $localName

    * The local name. *

    - * @param namespaceURI string

    + * @param string $namespaceURI

    * The namespace URI. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function moveToAttributeNs ($localName, $namespaceURI) {} /** + * (PHP 5 >= 5.1.2)
    * Position cursor on the parent Element of current Attribute - * @link http://www.php.net/manual/en/xmlreader.movetoelement.php - * @return bool true if successful and false if it fails or not positioned on + * @link http://php.net/manual/en/xmlreader.movetoelement.php + * @return bool TRUE if successful and FALSE if it fails or not positioned on * Attribute when this method is called. */ public function moveToElement () {} /** + * (PHP 5 >= 5.1.2)
    * Position cursor on the first Attribute - * @link http://www.php.net/manual/en/xmlreader.movetofirstattribute.php - * @return bool Returns true on success or false on failure. + * @link http://php.net/manual/en/xmlreader.movetofirstattribute.php + * @return bool TRUE on success or FALSE on failure. */ public function moveToFirstAttribute () {} /** + * (PHP 5 >= 5.1.2)
    * Position cursor on the next Attribute - * @link http://www.php.net/manual/en/xmlreader.movetonextattribute.php - * @return bool Returns true on success or false on failure. + * @link http://php.net/manual/en/xmlreader.movetonextattribute.php + * @return bool TRUE on success or FALSE on failure. */ public function moveToNextAttribute () {} /** + * (PHP 5 >= 5.1.2)
    * Set the URI containing the XML to parse - * @link http://www.php.net/manual/en/xmlreader.open.php - * @param URI string

    + * @link http://php.net/manual/en/xmlreader.open.php + * @param string $URI

    * URI pointing to the document. *

    - * @param encoding string[optional]

    - * The document encoding or &null;. + * @param string $encoding [optional]

    + * The document encoding or NULL. *

    - * @param options int[optional]

    - * A bitmask of the LIBXML_* + * @param int $options [optional]

    + * A bitmask of the LIBXML_* * constants. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. If called statically, returns an + * XMLReader or FALSE on failure. */ - public function open ($URI, $encoding = null, $options = null) {} + public function open ($URI, $encoding = null, $options = 0) {} /** + * (PHP 5 >= 5.1.2)
    * Move to next node in document - * @link http://www.php.net/manual/en/xmlreader.read.php - * @return bool Returns true on success or false on failure. + * @link http://php.net/manual/en/xmlreader.read.php + * @return bool TRUE on success or FALSE on failure. */ public function read () {} /** + * (PHP 5 >= 5.1.2)
    * Move cursor to next node skipping all subtrees - * @link http://www.php.net/manual/en/xmlreader.next.php - * @param localname string[optional]

    + * @link http://php.net/manual/en/xmlreader.next.php + * @param string $localname [optional]

    * The name of the next node to move to. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function next ($localname = null) {} /** + * (PHP 5 >= 5.2.0)
    * Retrieve XML from current node - * @link http://www.php.net/manual/en/xmlreader.readinnerxml.php + * @link http://php.net/manual/en/xmlreader.readinnerxml.php * @return string the contents of the current node as a string. Empty string on failure. */ public function readInnerXml () {} /** + * (PHP 5 >= 5.2.0)
    * Retrieve XML from current node, including it self - * @link http://www.php.net/manual/en/xmlreader.readouterxml.php + * @link http://php.net/manual/en/xmlreader.readouterxml.php * @return string the contents of current node, including itself, as a string. Empty string on failure. */ public function readOuterXml () {} /** - * Reads the contents of the current node as an string - * @link http://www.php.net/manual/en/xmlreader.readstring.php + * (PHP 5 >= 5.2.0)
    + * Reads the contents of the current node as a string + * @link http://php.net/manual/en/xmlreader.readstring.php * @return string the content of the current node as a string. Empty string on * failure. */ public function readString () {} /** + * (PHP 5 >= 5.2.0)
    * Validate document against XSD - * @link http://www.php.net/manual/en/xmlreader.setschema.php - * @param filename string

    + * @link http://php.net/manual/en/xmlreader.setschema.php + * @param string $filename

    * The filename of the XSD schema. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function setSchema ($filename) {} /** - * Set or Unset parser options - * @link http://www.php.net/manual/en/xmlreader.setparserproperty.php - * @param property int

    - * One of the parser option + * (PHP 5 >= 5.1.2)
    + * Set parser options + * @link http://php.net/manual/en/xmlreader.setparserproperty.php + * @param int $property

    + * One of the parser option * constants. *

    - * @param value bool

    - * If set to true the option will be enabled otherwise will + * @param bool $value

    + * If set to TRUE the option will be enabled otherwise will * be disabled. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function setParserProperty ($property, $value) {} /** + * (PHP 5 >= 5.2.0)
    * Set the filename or URI for a RelaxNG Schema - * @link http://www.php.net/manual/en/xmlreader.setrelaxngschema.php - * @param filename string

    + * @link http://php.net/manual/en/xmlreader.setrelaxngschema.php + * @param string $filename

    * filename or URI pointing to a RelaxNG Schema. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function setRelaxNGSchema ($filename) {} /** + * (PHP 5 >= 5.1.2)
    * Set the data containing a RelaxNG Schema - * @link http://www.php.net/manual/en/xmlreader.setrelaxngschemasource.php - * @param source string

    + * @link http://php.net/manual/en/xmlreader.setrelaxngschemasource.php + * @param string $source

    * String containing the RelaxNG Schema. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. */ public function setRelaxNGSchemaSource ($source) {} /** + * (PHP 5 >= 5.1.2)
    * Set the data containing the XML to parse - * @link http://www.php.net/manual/en/xmlreader.xml.php - * @param source string

    + * @link http://php.net/manual/en/xmlreader.xml.php + * @param string $source

    * String containing the XML to be parsed. *

    - * @param encoding string[optional]

    - * The document encoding or &null;. + * @param string $encoding [optional]

    + * The document encoding or NULL. *

    - * @param options int[optional]

    - * A bitmask of the LIBXML_* + * @param int $options [optional]

    + * A bitmask of the LIBXML_* * constants. *

    - * @return bool Returns true on success or false on failure. + * @return bool TRUE on success or FALSE on failure. If called statically, returns an + * XMLReader or FALSE on failure. */ - public function XML ($source, $encoding = null, $options = null) {} + public function XML ($source, $encoding = null, $options = 0) {} /** + * (PHP 5 >= 5.1.2)
    * Returns a copy of the current node as a DOM object - * @link http://www.php.net/manual/en/xmlreader.expand.php - * @return DOMNode The resulting DOMNode or false on error. + * @link http://php.net/manual/en/xmlreader.expand.php + * @param DOMNode $basenode [optional] + * @return DOMNode The resulting DOMNode or FALSE on error. */ - public function expand () {} + public function expand (DOMNode $basenode = null) {} } // End of xmlreader v.0.1 diff --git a/res/php-5.4-core-api/xmlreader.php b/res/php-5.4-core-api/xmlreader.php index 2eb4f48..f68164a 100644 --- a/res/php-5.4-core-api/xmlreader.php +++ b/res/php-5.4-core-api/xmlreader.php @@ -10,29 +10,196 @@ * @jms-builtin */ class XMLReader { + + /** + * No node type + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.none + */ const NONE = 0; + /** + * Start element + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.element + */ const ELEMENT = 1; + /** + * Attribute node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.attribute + */ const ATTRIBUTE = 2; + /** + * Attribute node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.text + */ const TEXT = 3; + /** + * CDATA node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.cdata + */ const CDATA = 4; + /** + * Entity Reference node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.entity-ref + */ const ENTITY_REF = 5; + /** + * Entity Declaration node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.entity + */ const ENTITY = 6; + /** + * Processing Instruction node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.pi + */ const PI = 7; + /** + * Comment node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.comment + */ const COMMENT = 8; + /** + * Document node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.doc + */ const DOC = 9; + /** + * Document Type node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.doc-type + */ const DOC_TYPE = 10; + /** + * Document Fragment node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.doc-fragment + */ const DOC_FRAGMENT = 11; + /** + * Notation node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.notation + */ const NOTATION = 12; + /** + * Whitespace node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.whitespace + */ const WHITESPACE = 13; + /** + * Significant Whitespace node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.significant-whitespace + */ const SIGNIFICANT_WHITESPACE = 14; + /** + * End Element + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.end-element + */ const END_ELEMENT = 15; + /** + * End Entity + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.end-entity + */ const END_ENTITY = 16; + /** + * XML Declaration node + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.xml-declaration + */ const XML_DECLARATION = 17; + /** + * Load DTD but do not validate + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.loaddtd + */ const LOADDTD = 1; + /** + * Load DTD and default attributes but do not validate + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.defaultattrs + */ const DEFAULTATTRS = 2; + /** + * Load DTD and validate while parsing + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.validate + */ const VALIDATE = 3; + /** + * Substitute entities and expand references + * + * @link http://php.net/manual/en/class.xmlreader.php#xmlreader.constants.subst-entities + */ const SUBST_ENTITIES = 4; + /** + * @var int The number of attributes on the node + */ + public $attributeCount; + /** + * @var string The base URI of the node + */ + public $baseURI; + /** + * @var int Depth of the node in the tree, starting at 0 + */ + public $depth; + /** + * @var bool Indicates if node has attributes + */ + public $hasAttributes; + /** + * @var bool Indicates if node has a text value + */ + public $hasValue; + /** + * @var bool Indicates if attribute is defaulted from DTD + */ + public $isDefault; + /** + * @var bool Indicates if node is an empty element tag + */ + public $isEmptyElement; + /** + * @var string The local name of the node + */ + public $localName; + /** + * @var string The qualified name of the node + */ + public $name; + /** + * @var string The URI of the namespace associated with the node + */ + public $namespaceURI; + /** + * @var int The node type for the node + */ + public $nodeType; + /** + * @var string The prefix of the namespace associated with the node + */ + public $prefix; + /** + * @var string The text value of the node + */ + public $value; + /** + * @var string The xml:lang scope which the node resides + */ + public $xmlLang; /** * (PHP 5 >= 5.1.2)

    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